From 4cbcee8bc0f5aa48d1897e62b20e3e15f8e7c09a Mon Sep 17 00:00:00 2001 From: Ben Guidarelli Date: Mon, 13 May 2024 13:01:48 -0400 Subject: [PATCH 01/50] Add Solana (#17) * solana: init * solana: fix solana version * solana: add anchor-spl * solana: setup SwapLayer testing and initialize * add .gitmodules * solana: more setup * solana: fix Makefile * solana: remove copied ts files and add common dependency * solana: add swap message serde * solana: add swap-layer-messages; fix Anchor.toml * solana: split uniswap and trader joe * solana: update submodule * solana: add gas dropoff scaffolding (WIP) * solana: add sdk v2 beta packages * universal: add messages * solana: fix broken test; fix format * universal: fmt * solana: handle self redeem relay type for USDC * solana: account fetcher WIP * solana: more test validator set up * solana: add gas dropoff test * solana: add direct redeem mode instruction for USDC * solana: add peer registration and check in redeem instructions * solana: add relay parameters to peer registration * solana: test whirlpool via jupiter * update sdk version, set tsconfig to use nodenext resolution Set module to esnext and resolution to bundler * solana: decodeSharedAccountsRouteIxData * return deserialized data * solana: jup v6 cpi WIP * solana: use preparedFill key as seed in complete token account * solana: fix .gitignore * solana: reorganize; skip swap test * solana: update relay parameters * solana: fork mainnet * solana: add relayer fee calculations * universal: add anchor feature * universal: remove default * solana: add outbound usdc instruction (untested) * solana: uptick submodule * universal/rs: uptick deps * universal/rs: remove default * solana: uptick to anchor 0.30.0 * solana: add outbound usdc happy path tests * solana: remove test * add CI (#4) * submodule: test commit * fix Makefiles * solana: fix lint * add workflow * more workflow * fix Makefiles again * fix workflow * solana: fix Makefile * universal: fix clippy * sync submodule --------- Co-authored-by: A5 Pickle * SDK: Minimal changes to make ts build (#5) * minimal changes to get ts to build * set noEmit to true for anchor tests * set core bridge pid to mainnet * provide path to workspace package.json * submodule? * solana: add ability to skip module build (#7) Co-authored-by: A5 Pickle * solana: add admin instructions (#6) * solana: add admin instructions * solana: add admin tests * solana: fix formatting * solana: address feedback --------- Co-authored-by: gator-boi * solana: implement relayer fees in typescript (#8) Co-authored-by: gator-boi * solana: fix submodule commit and format ts (#9) * solana: make anchor-build-idl * sync submodule (branch: solana/redeemable-fast-fill) * solana/ts: fix format and imports * solana/ts: fix test --------- Co-authored-by: A5 Pickle * solana: add negative tests (#12) * solana: add negative tests for outbound usdc transfers * solana: add more tests --------- Co-authored-by: gator-boi * solana: add `ConsumeSwapLayerFill` composite (#11) * solana: add `ConsumeSwapLayerFill` composite * solana: fix Makefile * solana: move to utils * solana: fix complete swap; remove usdc from direct * solana: add direct constraint * fix submodule commit * solana: clean up --------- Co-authored-by: A5 Pickle * solana: add negative tests for complete transfer direct (#13) Co-authored-by: gator-boi * SDK: Install and use Liquidity Layer SDK from packed distribution (#10) * use packed ll packages * fixup * update submodule * update submodule and sdk version (#14) * solana: message layout + some complete swap (#15) * solana: swap works * solana/ts: clean up quote fetcher * solana/ts: remove console.log * solana/ts: fix merge conflicts * solana: remove --------- Co-authored-by: A5 Pickle * bump hash for submodule dep * rm merge conflict text from src file --------- Co-authored-by: A5 Pickle Co-authored-by: gator-boi Co-authored-by: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Co-authored-by: Reptile <43194093+gator-boi@users.noreply.github.com> --- .github/workflows/solana.yml | 68 + .github/workflows/universal-rs.yml | 70 + .gitignore | 3 + .gitmodules | 4 + Makefile | 25 + evm/package-lock.json | 12848 -------------- evm/package.json | 40 - evm/ts-sdk/package-lock.json | 481 - evm/ts-sdk/package.json | 8 +- lib/example-liquidity-layer | 1 + package-lock.json | 14154 ++++++++++++++++ package.json | 34 + solana/.gitignore | 8 + solana/.prettierignore | 8 + solana/.prettierrc.json | 15 + solana/Anchor.toml | 245 + solana/Cargo.lock | 2857 ++++ solana/Cargo.toml | 81 + solana/Makefile | 77 + solana/a.json | 131 + solana/b.json | 131 + solana/migrations/deploy.ts | 12 + solana/package.json | 50 + solana/programs/swap-layer/Cargo.toml | 48 + solana/programs/swap-layer/Xargo.toml | 2 + .../programs/swap-layer/src/composite/mod.rs | 406 + solana/programs/swap-layer/src/error.rs | 60 + solana/programs/swap-layer/src/lib.rs | 125 + .../src/processor/admin/initialize.rs | 129 + .../swap-layer/src/processor/admin/mod.rs | 11 + .../ownership_transfer_request/cancel.rs | 18 + .../ownership_transfer_request/confirm.rs | 32 + .../admin/ownership_transfer_request/mod.rs | 8 + .../ownership_transfer_request/submit.rs | 28 + .../src/processor/admin/peer/add.rs | 39 + .../src/processor/admin/peer/mod.rs | 27 + .../src/processor/admin/peer/update.rs | 22 + .../admin/update/fee_recipient_token.rs | 31 + .../src/processor/admin/update/fee_updater.rs | 25 + .../src/processor/admin/update/mod.rs | 11 + .../processor/admin/update/owner_assistant.rs | 28 + .../admin/update/relay_parameters.rs | 40 + .../swap-layer/src/processor/complete/mod.rs | 5 + .../src/processor/complete/other/direct.rs | 343 + .../src/processor/complete/other/mod.rs | 2 + .../src/processor/complete/usdc/direct.rs | 65 + .../src/processor/complete/usdc/mod.rs | 5 + .../src/processor/complete/usdc/relay.rs | 184 + .../swap-layer/src/processor/initiate/mod.rs | 2 + .../swap-layer/src/processor/initiate/usdc.rs | 148 + .../programs/swap-layer/src/processor/mod.rs | 8 + .../swap-layer/src/state/custodian.rs | 74 + solana/programs/swap-layer/src/state/mod.rs | 5 + solana/programs/swap-layer/src/state/peer.rs | 44 + .../swap-layer/src/utils/gas_dropoff.rs | 5 + .../src/utils/jupiter_v6/cpi/mod.rs | 2 + .../jupiter_v6/cpi/shared_accounts_route.rs | 111 + .../swap-layer/src/utils/jupiter_v6/mod.rs | 70 + .../src/utils/jupiter_v6/types/mod.rs | 92 + solana/programs/swap-layer/src/utils/mod.rs | 28 + .../swap-layer/src/utils/relay_parameters.rs | 33 + .../swap-layer/src/utils/relayer_fees.rs | 345 + .../swap-layer/src/utils/token_router/mod.rs | 25 + solana/ts/scripts/testJupV6QuoteFlip.ts | 107 + .../ts/scripts/testJupV6QuoteFlipWhirlpool.ts | 106 + solana/ts/scripts/testJupV6Serde.ts | 23 + solana/ts/scripts/testJupiterQuote.ts | 68 + solana/ts/src/common/index.ts | 1 + solana/ts/src/common/layouts.ts | 10 + solana/ts/src/jupiterV6/index.ts | 103 + solana/ts/src/jupiterV6/layouts.ts | 104 + solana/ts/src/swapLayer/index.ts | 586 + solana/ts/src/swapLayer/messages/index.ts | 1 + solana/ts/src/swapLayer/messages/layouts.ts | 148 + solana/ts/src/swapLayer/relayerFees.ts | 126 + solana/ts/src/swapLayer/state/Custodian.ts | 23 + solana/ts/src/swapLayer/state/Peer.ts | 36 + solana/ts/src/swapLayer/state/index.ts | 2 + solana/ts/src/swapLayer/utils.ts | 12 + solana/ts/src/types/whirlpool.ts | 5019 ++++++ solana/ts/tests/00__messages.ts | 132 + solana/ts/tests/01__swapLayer.ts | 2463 +++ solana/ts/tests/10__jupiterTest.ts | 790 + .../jupiter/jupiter_custody_owner.json | 14 + .../tests/accounts/jupiter/jupiter_lut1.json | 14 + .../jupiter/jupiter_usdc_custody_token.json | 14 + .../jupiter/jupiter_usdt_custody_token.json | 14 + .../ethereum_token_router_endpoint.json | 14 + .../local_custody_token_ethereum.json | 14 + .../local_token_router_endpoint.json | 14 + .../matching_engine_custodian.json | 14 + .../matching_engine_mint_recipient.json | 14 + .../ts/tests/accounts/payer_usdc_token.json | 14 + .../ts/tests/accounts/payer_usdt_token.json | 14 + .../token_router/token_router_custodian.json | 14 + .../token_router_mint_recipient.json | 14 + solana/ts/tests/accounts/usdc_mint.json | 14 + solana/ts/tests/accounts/usdt_mint.json | 14 + .../whirlpool/whirlpool_usdc_usdt_pool.json | 14 + .../whirlpool_usdc_usdt_tick_array_0.json | 14 + .../whirlpool_usdc_usdt_tick_array_1a.json | 14 + .../whirlpool_usdc_usdt_tick_array_1b.json | 14 + .../whirlpool_usdc_usdt_tick_array_2a.json | 14 + .../whirlpool_usdc_usdt_tick_array_2b.json | 14 + .../whirlpool_usdc_usdt_tick_array__0.json | 14 + .../whirlpool_usdc_usdt_tick_array__1.json | 14 + .../whirlpool_usdc_usdt_tick_array__2.json | 14 + .../whirlpool_usdc_usdt_tick_array__3.json | 14 + .../whirlpool_usdc_usdt_tick_array__4.json | 14 + .../whirlpool/whirlpool_usdc_vault.json | 14 + .../whirlpool/whirlpool_usdt_vault.json | 14 + solana/ts/tests/helpers/consts.ts | 21 + solana/ts/tests/helpers/index.ts | 2 + solana/ts/tests/helpers/utils.ts | 40 + .../whirlpool_usdc_to_usdt.json | 131 + .../whirlpool_usdt_to_usdc.json | 131 + ...bhqdSsrWUVTgqhPsLrfEdChBK17vgFM7TxjxQ.json | 1 + solana/tsconfig.anchor-test.json | 11 + solana/tsconfig.json | 11 + universal/rs/.gitignore | 2 + universal/rs/Cargo.toml | 52 + universal/rs/messages/Cargo.toml | 27 + universal/rs/messages/src/lib.rs | 5 + universal/rs/messages/src/messages/mod.rs | 202 + universal/rs/messages/src/types/mod.rs | 104 + universal/rs/messages/src/types/output.rs | 116 + .../messages/src/types/swap_type/evm/mod.rs | 5 + .../src/types/swap_type/evm/trader_joe.rs | 128 + .../src/types/swap_type/evm/uniswap_v3.rs | 95 + .../rs/messages/src/types/swap_type/mod.rs | 80 + .../src/types/swap_type/solana/jupiter_v6.rs | 87 + .../src/types/swap_type/solana/mod.rs | 2 + universal/rs/messages/src/types/uint.rs | 398 + 133 files changed, 32567 insertions(+), 13373 deletions(-) create mode 100644 .github/workflows/solana.yml create mode 100644 .github/workflows/universal-rs.yml create mode 100644 .gitignore create mode 100644 .gitmodules create mode 100644 Makefile delete mode 100644 evm/package-lock.json delete mode 100644 evm/package.json delete mode 100644 evm/ts-sdk/package-lock.json create mode 160000 lib/example-liquidity-layer create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 solana/.gitignore create mode 100644 solana/.prettierignore create mode 100644 solana/.prettierrc.json create mode 100644 solana/Anchor.toml create mode 100644 solana/Cargo.lock create mode 100644 solana/Cargo.toml create mode 100644 solana/Makefile create mode 100644 solana/a.json create mode 100644 solana/b.json create mode 100644 solana/migrations/deploy.ts create mode 100644 solana/package.json create mode 100644 solana/programs/swap-layer/Cargo.toml create mode 100644 solana/programs/swap-layer/Xargo.toml create mode 100644 solana/programs/swap-layer/src/composite/mod.rs create mode 100644 solana/programs/swap-layer/src/error.rs create mode 100644 solana/programs/swap-layer/src/lib.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/initialize.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/mod.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/cancel.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/confirm.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/mod.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/submit.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/peer/add.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/peer/mod.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/peer/update.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/update/fee_recipient_token.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/update/fee_updater.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/update/mod.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/update/owner_assistant.rs create mode 100644 solana/programs/swap-layer/src/processor/admin/update/relay_parameters.rs create mode 100644 solana/programs/swap-layer/src/processor/complete/mod.rs create mode 100644 solana/programs/swap-layer/src/processor/complete/other/direct.rs create mode 100644 solana/programs/swap-layer/src/processor/complete/other/mod.rs create mode 100644 solana/programs/swap-layer/src/processor/complete/usdc/direct.rs create mode 100644 solana/programs/swap-layer/src/processor/complete/usdc/mod.rs create mode 100644 solana/programs/swap-layer/src/processor/complete/usdc/relay.rs create mode 100644 solana/programs/swap-layer/src/processor/initiate/mod.rs create mode 100644 solana/programs/swap-layer/src/processor/initiate/usdc.rs create mode 100644 solana/programs/swap-layer/src/processor/mod.rs create mode 100644 solana/programs/swap-layer/src/state/custodian.rs create mode 100644 solana/programs/swap-layer/src/state/mod.rs create mode 100644 solana/programs/swap-layer/src/state/peer.rs create mode 100644 solana/programs/swap-layer/src/utils/gas_dropoff.rs create mode 100644 solana/programs/swap-layer/src/utils/jupiter_v6/cpi/mod.rs create mode 100644 solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs create mode 100644 solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs create mode 100644 solana/programs/swap-layer/src/utils/jupiter_v6/types/mod.rs create mode 100644 solana/programs/swap-layer/src/utils/mod.rs create mode 100644 solana/programs/swap-layer/src/utils/relay_parameters.rs create mode 100644 solana/programs/swap-layer/src/utils/relayer_fees.rs create mode 100644 solana/programs/swap-layer/src/utils/token_router/mod.rs create mode 100644 solana/ts/scripts/testJupV6QuoteFlip.ts create mode 100644 solana/ts/scripts/testJupV6QuoteFlipWhirlpool.ts create mode 100644 solana/ts/scripts/testJupV6Serde.ts create mode 100644 solana/ts/scripts/testJupiterQuote.ts create mode 100644 solana/ts/src/common/index.ts create mode 100644 solana/ts/src/common/layouts.ts create mode 100644 solana/ts/src/jupiterV6/index.ts create mode 100644 solana/ts/src/jupiterV6/layouts.ts create mode 100644 solana/ts/src/swapLayer/index.ts create mode 100644 solana/ts/src/swapLayer/messages/index.ts create mode 100644 solana/ts/src/swapLayer/messages/layouts.ts create mode 100644 solana/ts/src/swapLayer/relayerFees.ts create mode 100644 solana/ts/src/swapLayer/state/Custodian.ts create mode 100644 solana/ts/src/swapLayer/state/Peer.ts create mode 100644 solana/ts/src/swapLayer/state/index.ts create mode 100644 solana/ts/src/swapLayer/utils.ts create mode 100644 solana/ts/src/types/whirlpool.ts create mode 100644 solana/ts/tests/00__messages.ts create mode 100644 solana/ts/tests/01__swapLayer.ts create mode 100644 solana/ts/tests/10__jupiterTest.ts create mode 100644 solana/ts/tests/accounts/jupiter/jupiter_custody_owner.json create mode 100644 solana/ts/tests/accounts/jupiter/jupiter_lut1.json create mode 100644 solana/ts/tests/accounts/jupiter/jupiter_usdc_custody_token.json create mode 100644 solana/ts/tests/accounts/jupiter/jupiter_usdt_custody_token.json create mode 100644 solana/ts/tests/accounts/matching_engine/ethereum_token_router_endpoint.json create mode 100644 solana/ts/tests/accounts/matching_engine/local_custody_token_ethereum.json create mode 100644 solana/ts/tests/accounts/matching_engine/local_token_router_endpoint.json create mode 100644 solana/ts/tests/accounts/matching_engine/matching_engine_custodian.json create mode 100644 solana/ts/tests/accounts/matching_engine/matching_engine_mint_recipient.json create mode 100644 solana/ts/tests/accounts/payer_usdc_token.json create mode 100644 solana/ts/tests/accounts/payer_usdt_token.json create mode 100644 solana/ts/tests/accounts/token_router/token_router_custodian.json create mode 100644 solana/ts/tests/accounts/token_router/token_router_mint_recipient.json create mode 100644 solana/ts/tests/accounts/usdc_mint.json create mode 100644 solana/ts/tests/accounts/usdt_mint.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_pool.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_0.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1a.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1b.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2a.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2b.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__0.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__1.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__2.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__3.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__4.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_vault.json create mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdt_vault.json create mode 100644 solana/ts/tests/helpers/consts.ts create mode 100644 solana/ts/tests/helpers/index.ts create mode 100644 solana/ts/tests/helpers/utils.ts create mode 100644 solana/ts/tests/jupiterV6SwapResponses/whirlpool_usdc_to_usdt.json create mode 100644 solana/ts/tests/jupiterV6SwapResponses/whirlpool_usdt_to_usdc.json create mode 100644 solana/ts/tests/keys/pFCBP4bhqdSsrWUVTgqhPsLrfEdChBK17vgFM7TxjxQ.json create mode 100644 solana/tsconfig.anchor-test.json create mode 100644 solana/tsconfig.json create mode 100644 universal/rs/.gitignore create mode 100644 universal/rs/Cargo.toml create mode 100644 universal/rs/messages/Cargo.toml create mode 100644 universal/rs/messages/src/lib.rs create mode 100644 universal/rs/messages/src/messages/mod.rs create mode 100644 universal/rs/messages/src/types/mod.rs create mode 100644 universal/rs/messages/src/types/output.rs create mode 100644 universal/rs/messages/src/types/swap_type/evm/mod.rs create mode 100644 universal/rs/messages/src/types/swap_type/evm/trader_joe.rs create mode 100644 universal/rs/messages/src/types/swap_type/evm/uniswap_v3.rs create mode 100644 universal/rs/messages/src/types/swap_type/mod.rs create mode 100644 universal/rs/messages/src/types/swap_type/solana/jupiter_v6.rs create mode 100644 universal/rs/messages/src/types/swap_type/solana/mod.rs create mode 100644 universal/rs/messages/src/types/uint.rs diff --git a/.github/workflows/solana.yml b/.github/workflows/solana.yml new file mode 100644 index 00000000..a8facb96 --- /dev/null +++ b/.github/workflows/solana.yml @@ -0,0 +1,68 @@ +name: solana +on: + push: + branches: + - main + - solana/integration + pull_request: null + +env: + RUSTC_VERSION: 1.75.0 +jobs: + cancel-previous-runs: + runs-on: ubuntu-latest + steps: + - name: Cancel Previous Runs + uses: styfle/cancel-workflow-action@0.9.1 + with: + access_token: ${{ github.token }} + make-cargo-test-all: + name: make cargo-test-all + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Install toolchain + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ env.RUSTC_VERSION }} + components: clippy, rustfmt + - name: make cargo-test-all + run: make cargo-test-all + working-directory: ./solana + make-lint: + name: make lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Install toolchain + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ env.RUSTC_VERSION }} + components: clippy, rustfmt + - name: make lint + run: make lint + working-directory: ./solana + make-anchor-test: + name: make anchor-test + runs-on: ubuntu-latest + # Anchor Docker image: https://www.anchor-lang.com/docs/verifiable-builds#images + # container: backpackapp/build:v0.30.0 + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: metadaoproject/setup-anchor@v2 + with: + node-version: "20.11.0" + solana-cli-version: "1.18.11" + anchor-version: "0.30.0" + - name: Set default Rust toolchain + run: rustup default stable + working-directory: ./solana + - name: make anchor-test + run: make anchor-test + working-directory: ./solana diff --git a/.github/workflows/universal-rs.yml b/.github/workflows/universal-rs.yml new file mode 100644 index 00000000..5d191caf --- /dev/null +++ b/.github/workflows/universal-rs.yml @@ -0,0 +1,70 @@ +name: universal-rs + +on: + push: + branches: [main] + pull_request: + +env: + CARGO_TERM_COLOR: always + +jobs: + test: + name: test ${{ matrix.rust }} + runs-on: ubuntu-latest + timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + rust: ["stable", "beta", "nightly", "1.75"] # MSRV + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ matrix.rust }} + - uses: Swatinem/rust-cache@v2 + - name: test + run: cd universal/rs && cargo test --workspace --all-features + + clippy: + name: clippy + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: dtolnay/rust-toolchain@clippy + - run: cd universal/rs && cargo clippy --workspace --all-targets --all-features + env: + RUSTFLAGS: -Dwarnings + + docs: + name: docs + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: dtolnay/rust-toolchain@nightly + with: + components: rust-docs + - run: cd universal/rs && cargo doc --workspace --no-deps --document-private-items + env: + RUSTDOCFLAGS: "--cfg docsrs -D warnings" + + fmt: + name: fmt + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v3 + with: + submodules: recursive + - uses: dtolnay/rust-toolchain@nightly + with: + components: rustfmt + - run: cd universal/rs && cargo fmt --all --check \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..f882c7aa --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.vscode +node_modules +dist \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..19853a9b --- /dev/null +++ b/.gitmodules @@ -0,0 +1,4 @@ +[submodule "lib/example-liquidity-layer"] + path = lib/example-liquidity-layer + url = https://github.com/wormhole-foundation/example-liquidity-layer.git + branch = main diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..f2a49439 --- /dev/null +++ b/Makefile @@ -0,0 +1,25 @@ +.PHONY: clean +clean: + $(MAKE) fast-transfer-clean + rm -rf node_modules + +.PHONY: fast-transfer-sync +fast-transfer-sync: + git submodule update --init + git submodule sync --recursive + +.PHONY: fast-transfer-clean +fast-transfer-clean: fast-transfer-sync + cd lib/example-liquidity-layer/solana && $(MAKE) clean + +.PHONY: fast-transfer-setup +fast-transfer-setup: fast-transfer-sync + cd lib/example-liquidity-layer/solana && $(MAKE) anchor-test-setup + +.PHONY: fast-transfer-sdk +fast-transfer-sdk: fast-transfer-setup + cd lib/example-liquidity-layer && npm ci && npm run build --workspace solana && npm pack --workspace solana + +node_modules: fast-transfer-sdk + npm update @wormhole-foundation/example-liquidity-layer-solana + npm ci diff --git a/evm/package-lock.json b/evm/package-lock.json deleted file mode 100644 index e5737df8..00000000 --- a/evm/package-lock.json +++ /dev/null @@ -1,12848 +0,0 @@ -{ - "name": "@xlabs.xyz/swap-layer", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@xlabs.xyz/swap-layer", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@certusone/wormhole-sdk": "^0.10.3", - "@openzeppelin/contracts": "^4.9.3", - "@typechain/ethers-v5": "^11.1.1", - "@wormhole-foundation/connect-sdk": "^0.4.0-beta.0", - "@wormhole-foundation/connect-sdk-evm": "^0.4.0-beta.0", - "@wormhole-foundation/relayer-engine": "github:wormhole-foundation/relayer-engine#e3c510048ef8c900769461040440b689a18d9e0d", - "@xlabs/wh-swap-layer-ts-sdk": "file:ts-sdk", - "dotenv": "^16.3.1", - "ts-node": "^10.9.1", - "tsx": "^4.7.0", - "typechain": "^8.1.1", - "typescript": "^5.2.2" - } - }, - "node_modules/@adraffy/ens-normalize": { - "version": "1.10.0", - "license": "MIT" - }, - "node_modules/@apollo/client": { - "version": "3.8.3", - "license": "MIT", - "optional": true, - "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "@wry/context": "^0.7.3", - "@wry/equality": "^0.5.6", - "@wry/trie": "^0.4.3", - "graphql-tag": "^2.12.6", - "hoist-non-react-statics": "^3.3.2", - "optimism": "^0.17.5", - "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.22.15", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bull-board/api": { - "version": "5.11.0", - "license": "MIT", - "dependencies": { - "redis-info": "^3.0.8" - }, - "peerDependencies": { - "@bull-board/ui": "5.11.0" - } - }, - "node_modules/@bull-board/koa": { - "version": "5.11.0", - "license": "MIT", - "dependencies": { - "@bull-board/api": "5.11.0", - "@bull-board/ui": "5.11.0", - "ejs": "^3.1.7", - "koa": "^2.13.1", - "koa-mount": "^4.0.0", - "koa-router": "^10.0.0", - "koa-static": "^5.0.0", - "koa-views": "^7.0.1" - } - }, - "node_modules/@bull-board/ui": { - "version": "5.11.0", - "license": "MIT", - "dependencies": { - "@bull-board/api": "5.11.0" - } - }, - "node_modules/@certusone/wormhole-sdk": { - "version": "0.10.8", - "license": "Apache-2.0", - "dependencies": { - "@certusone/wormhole-sdk-proto-web": "0.0.7", - "@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.7", - "license": "Apache-2.0", - "dependencies": { - "@improbable-eng/grpc-web": "^0.15.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.5.6" - } - }, - "node_modules/@certusone/wormhole-sdk-wasm": { - "version": "0.0.1", - "license": "Apache-2.0", - "dependencies": { - "@types/long": "^4.0.2", - "@types/node": "^18.0.3" - } - }, - "node_modules/@certusone/wormhole-sdk-wasm/node_modules/@types/node": { - "version": "18.17.17", - "license": "MIT" - }, - "node_modules/@certusone/wormhole-sdk/node_modules/bech32": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@certusone/wormhole-spydk": { - "version": "0.0.1", - "license": "Apache-2.0", - "dependencies": { - "@grpc/grpc-js": "^1.4.4", - "protobufjs": "^6.11.2" - } - }, - "node_modules/@certusone/wormhole-spydk/node_modules/protobufjs": { - "version": "6.11.4", - "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/@classic-terra/terra.proto": { - "version": "1.1.0", - "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/@classic-terra/terra.proto/node_modules/@improbable-eng/grpc-web": { - "version": "0.14.1", - "license": "Apache-2.0", - "dependencies": { - "browser-headers": "^0.4.1" - }, - "peerDependencies": { - "google-protobuf": "^3.14.0" - } - }, - "node_modules/@classic-terra/terra.proto/node_modules/protobufjs": { - "version": "6.11.4", - "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/@colors/colors": { - "version": "1.6.0", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@confio/ics23": { - "version": "0.6.8", - "license": "Apache-2.0", - "dependencies": { - "@noble/hashes": "^1.0.0", - "protobufjs": "^6.8.8" - } - }, - "node_modules/@confio/ics23/node_modules/protobufjs": { - "version": "6.11.4", - "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/@coral-xyz/borsh": { - "version": "0.2.6", - "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/@cosmjs/amino": { - "version": "0.30.1", - "license": "Apache-2.0", - "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/cosmwasm-stargate": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/amino": "^0.29.5", - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/proto-signing": "^0.29.5", - "@cosmjs/stargate": "^0.29.5", - "@cosmjs/tendermint-rpc": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0", - "pako": "^2.0.2" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/amino": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/crypto": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers": "^0.7.6" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/encoding": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/json-rpc": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/stream": "^0.29.5", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/math": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "bn.js": "^5.2.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/proto-signing": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/amino": "^0.29.5", - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/socket": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/stream": "^0.29.5", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/stargate": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/proto-signing": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/tendermint-rpc": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0", - "protobufjs": "~6.11.3", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/stream": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/tendermint-rpc": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/json-rpc": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/socket": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "axios": "^0.21.2", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/utils": { - "version": "0.29.5", - "license": "Apache-2.0" - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/axios": { - "version": "0.21.4", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/cosmjs-types": { - "version": "0.5.2", - "license": "Apache-2.0", - "dependencies": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/protobufjs": { - "version": "6.11.4", - "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/@cosmjs/crypto": { - "version": "0.30.1", - "license": "Apache-2.0", - "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", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "node_modules/@cosmjs/json-rpc": { - "version": "0.30.1", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@cosmjs/stream": "^0.30.1", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/math": { - "version": "0.30.1", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bn.js": "^5.2.0" - } - }, - "node_modules/@cosmjs/proto-signing": { - "version": "0.30.1", - "license": "Apache-2.0", - "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", - "license": "Apache-2.0", - "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", - "license": "Apache-2.0", - "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/stargate/node_modules/protobufjs": { - "version": "6.11.4", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "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/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/@cosmjs/stream": { - "version": "0.30.1", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/tendermint-rpc": { - "version": "0.30.1", - "license": "Apache-2.0", - "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", - "license": "MIT", - "optional": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@cosmjs/utils": { - "version": "0.30.1", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "license": "MIT", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@datastructures-js/queue": { - "version": "4.2.3", - "license": "MIT" - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.19.11", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@ethereumjs/common": { - "version": "2.6.5", - "license": "MIT", - "optional": true, - "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethereumjs/tx": { - "version": "3.5.2", - "license": "MPL-2.0", - "optional": true, - "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "node_modules/@ethersproject/abi": { - "version": "5.7.0", - "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/abstract-provider": { - "version": "5.7.0", - "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/abstract-signer": { - "version": "5.7.0", - "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/address": { - "version": "5.7.0", - "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/base64": { - "version": "5.7.0", - "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/basex": { - "version": "5.7.0", - "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/bignumber": { - "version": "5.7.0", - "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/bytes": { - "version": "5.7.0", - "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/constants": { - "version": "5.7.0", - "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": { - "version": "5.7.0", - "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/hash": { - "version": "5.7.0", - "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/hdnode": { - "version": "5.7.0", - "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/json-wallets": { - "version": "5.7.0", - "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/keccak256": { - "version": "5.7.0", - "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.7.0", - "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/networks": { - "version": "5.7.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", - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "node_modules/@ethersproject/pbkdf2": { - "version": "5.7.0", - "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/properties": { - "version": "5.7.0", - "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": { - "version": "5.7.2", - "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/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/random": { - "version": "5.7.0", - "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/rlp": { - "version": "5.7.0", - "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/sha2": { - "version": "5.7.0", - "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/signing-key": { - "version": "5.7.0", - "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/solidity": { - "version": "5.7.0", - "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/strings": { - "version": "5.7.0", - "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/transactions": { - "version": "5.7.0", - "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/units": { - "version": "5.7.0", - "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/wallet": { - "version": "5.7.0", - "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/web": { - "version": "5.7.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", - "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/wordlists": { - "version": "5.7.0", - "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/@graphql-typed-document-node/core": { - "version": "3.2.0", - "license": "MIT", - "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/@grpc/grpc-js": { - "version": "1.9.13", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.10", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@grpc/proto-loader/node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@grpc/proto-loader/node_modules/long": { - "version": "5.2.3", - "license": "Apache-2.0" - }, - "node_modules/@grpc/proto-loader/node_modules/yargs": { - "version": "17.7.2", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@grpc/proto-loader/node_modules/yargs-parser": { - "version": "21.1.1", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/@improbable-eng/grpc-web": { - "version": "0.15.0", - "license": "Apache-2.0", - "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", - "license": "Apache-2.0", - "peerDependencies": { - "@improbable-eng/grpc-web": ">=0.13.0" - } - }, - "node_modules/@injectivelabs/core-proto-ts": { - "version": "0.0.14", - "license": "MIT", - "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/exceptions": { - "version": "1.12.1", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "@injectivelabs/ts-types": "^1.12.1", - "http-status-codes": "^2.2.0", - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" - } - }, - "node_modules/@injectivelabs/exceptions/dist": { - "extraneous": true - }, - "node_modules/@injectivelabs/grpc-web": { - "version": "0.0.1", - "license": "Apache-2.0", - "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", - "license": "Apache-2.0", - "optional": true, - "peerDependencies": { - "@injectivelabs/grpc-web": ">=0.0.1" - } - }, - "node_modules/@injectivelabs/grpc-web-react-native-transport": { - "version": "0.0.2", - "license": "Apache-2.0", - "optional": true, - "peerDependencies": { - "@injectivelabs/grpc-web": ">=0.0.1" - } - }, - "node_modules/@injectivelabs/indexer-proto-ts": { - "version": "1.10.8-rc.4", - "license": "MIT", - "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": { - "version": "1.0.9", - "license": "MIT", - "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/networks": { - "version": "1.10.12", - "hasInstallScript": true, - "license": "Apache-2.0", - "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/networks/dist": { - "extraneous": true - }, - "node_modules/@injectivelabs/sdk-ts": { - "version": "1.10.72", - "hasInstallScript": true, - "license": "Apache-2.0", - "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/dist": { - "extraneous": true - }, - "node_modules/@injectivelabs/sdk-ts/node_modules/axios": { - "version": "0.27.2", - "license": "MIT", - "optional": true, - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "node_modules/@injectivelabs/sdk-ts/node_modules/bech32": { - "version": "2.0.0", - "license": "MIT", - "optional": true - }, - "node_modules/@injectivelabs/test-utils": { - "version": "1.12.1", - "hasInstallScript": true, - "license": "Apache-2.0", - "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/dist": { - "extraneous": true - }, - "node_modules/@injectivelabs/test-utils/node_modules/axios": { - "version": "0.21.4", - "license": "MIT", - "optional": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@injectivelabs/token-metadata": { - "version": "1.12.1", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@injectivelabs/exceptions": "^1.12.1", - "@injectivelabs/networks": "^1.12.1", - "@injectivelabs/ts-types": "^1.12.1", - "@injectivelabs/utils": "^1.12.1", - "@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/dist": { - "extraneous": true - }, - "node_modules/@injectivelabs/token-metadata/node_modules/@injectivelabs/networks": { - "version": "1.12.1", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@injectivelabs/exceptions": "^1.12.1", - "@injectivelabs/ts-types": "^1.12.1", - "@injectivelabs/utils": "^1.12.1", - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" - } - }, - "node_modules/@injectivelabs/token-metadata/node_modules/@injectivelabs/networks/dist": { - "extraneous": true - }, - "node_modules/@injectivelabs/token-metadata/node_modules/@injectivelabs/utils": { - "version": "1.12.1", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "@injectivelabs/exceptions": "^1.12.1", - "@injectivelabs/ts-types": "^1.12.1", - "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/@injectivelabs/utils/dist": { - "extraneous": true - }, - "node_modules/@injectivelabs/token-metadata/node_modules/axios": { - "version": "0.21.4", - "license": "MIT", - "optional": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@injectivelabs/ts-types": { - "version": "1.12.1", - "hasInstallScript": true, - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" - } - }, - "node_modules/@injectivelabs/ts-types/dist": { - "extraneous": true - }, - "node_modules/@injectivelabs/utils": { - "version": "1.10.12", - "hasInstallScript": true, - "license": "Apache-2.0", - "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/dist": { - "extraneous": true - }, - "node_modules/@injectivelabs/utils/node_modules/axios": { - "version": "0.21.4", - "license": "MIT", - "optional": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@ioredis/commands": { - "version": "1.2.0", - "license": "MIT" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@keplr-wallet/types": { - "version": "0.11.64", - "license": "Apache-2.0", - "dependencies": { - "axios": "^0.27.2", - "long": "^4.0.0" - } - }, - "node_modules/@keplr-wallet/types/node_modules/axios": { - "version": "0.27.2", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "node_modules/@metamask/eth-sig-util": { - "version": "4.0.1", - "license": "ISC", - "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", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@metamask/eth-sig-util/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT", - "optional": true - }, - "node_modules/@metamask/eth-sig-util/node_modules/ethereumjs-util": { - "version": "6.2.1", - "license": "MPL-2.0", - "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/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.2", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@mysten/bcs": { - "version": "0.7.1", - "license": "Apache-2.0", - "dependencies": { - "bs58": "^5.0.0" - } - }, - "node_modules/@mysten/bcs/node_modules/base-x": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/@mysten/bcs/node_modules/bs58": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/@mysten/sui.js": { - "version": "0.32.2", - "license": "Apache-2.0", - "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/@noble/curves": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@noble/hashes": { - "version": "1.3.2", - "license": "MIT", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@one-ini/wasm": { - "version": "0.1.1", - "license": "MIT" - }, - "node_modules/@openzeppelin/contracts": { - "version": "4.9.3", - "license": "MIT" - }, - "node_modules/@osmonauts/helpers": { - "version": "0.6.0", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@babel/runtime": "^7.18.9", - "@cosmjs/amino": "0.28.13", - "@cosmjs/crypto": "0.28.13", - "@cosmjs/proto-signing": "0.28.13", - "@cosmjs/stargate": "0.28.13", - "cosmjs-types": "0.5.1", - "long": "^5.2.0", - "protobufjs": "^6.11.3" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/amino": { - "version": "0.28.13", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/crypto": "0.28.13", - "@cosmjs/encoding": "0.28.13", - "@cosmjs/math": "0.28.13", - "@cosmjs/utils": "0.28.13" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/crypto": { - "version": "0.28.13", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/encoding": "0.28.13", - "@cosmjs/math": "0.28.13", - "@cosmjs/utils": "0.28.13", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.3", - "libsodium-wrappers": "^0.7.6" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/encoding": { - "version": "0.28.13", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/json-rpc": { - "version": "0.28.13", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/stream": "0.28.13", - "xstream": "^11.14.0" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/math": { - "version": "0.28.13", - "license": "Apache-2.0", - "dependencies": { - "bn.js": "^5.2.0" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/proto-signing": { - "version": "0.28.13", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/amino": "0.28.13", - "@cosmjs/crypto": "0.28.13", - "@cosmjs/encoding": "0.28.13", - "@cosmjs/math": "0.28.13", - "@cosmjs/utils": "0.28.13", - "cosmjs-types": "^0.4.0", - "long": "^4.0.0" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/proto-signing/node_modules/cosmjs-types": { - "version": "0.4.1", - "license": "Apache-2.0", - "dependencies": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/proto-signing/node_modules/long": { - "version": "4.0.0", - "license": "Apache-2.0" - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/socket": { - "version": "0.28.13", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/stream": "0.28.13", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/stargate": { - "version": "0.28.13", - "license": "Apache-2.0", - "dependencies": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "0.28.13", - "@cosmjs/encoding": "0.28.13", - "@cosmjs/math": "0.28.13", - "@cosmjs/proto-signing": "0.28.13", - "@cosmjs/stream": "0.28.13", - "@cosmjs/tendermint-rpc": "0.28.13", - "@cosmjs/utils": "0.28.13", - "cosmjs-types": "^0.4.0", - "long": "^4.0.0", - "protobufjs": "~6.11.3", - "xstream": "^11.14.0" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/stargate/node_modules/cosmjs-types": { - "version": "0.4.1", - "license": "Apache-2.0", - "dependencies": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/stargate/node_modules/long": { - "version": "4.0.0", - "license": "Apache-2.0" - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/stream": { - "version": "0.28.13", - "license": "Apache-2.0", - "dependencies": { - "xstream": "^11.14.0" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/tendermint-rpc": { - "version": "0.28.13", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/crypto": "0.28.13", - "@cosmjs/encoding": "0.28.13", - "@cosmjs/json-rpc": "0.28.13", - "@cosmjs/math": "0.28.13", - "@cosmjs/socket": "0.28.13", - "@cosmjs/stream": "0.28.13", - "@cosmjs/utils": "0.28.13", - "axios": "^0.21.2", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, - "node_modules/@osmonauts/helpers/node_modules/@cosmjs/utils": { - "version": "0.28.13", - "license": "Apache-2.0" - }, - "node_modules/@osmonauts/helpers/node_modules/axios": { - "version": "0.21.4", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@osmonauts/helpers/node_modules/cosmjs-types": { - "version": "0.5.1", - "license": "Apache-2.0", - "dependencies": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "node_modules/@osmonauts/helpers/node_modules/cosmjs-types/node_modules/long": { - "version": "4.0.0", - "license": "Apache-2.0" - }, - "node_modules/@osmonauts/helpers/node_modules/long": { - "version": "5.2.3", - "license": "Apache-2.0" - }, - "node_modules/@osmonauts/helpers/node_modules/protobufjs": { - "version": "6.11.4", - "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/@osmonauts/helpers/node_modules/protobufjs/node_modules/long": { - "version": "4.0.0", - "license": "Apache-2.0" - }, - "node_modules/@osmonauts/lcd": { - "version": "0.8.0", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@babel/runtime": "^7.19.0", - "axios": "0.27.2" - } - }, - "node_modules/@osmonauts/lcd/node_modules/axios": { - "version": "0.27.2", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@project-serum/anchor": { - "version": "0.25.0", - "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", - "license": "MIT" - }, - "node_modules/@project-serum/borsh": { - "version": "0.2.5", - "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", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.0", - "license": "BSD-3-Clause" - }, - "node_modules/@scure/base": { - "version": "1.1.3", - "license": "MIT", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/bip32": { - "version": "1.3.2", - "license": "MIT", - "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/bip39": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@sei-js/core": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "@cosmjs/amino": "0.29.5", - "@cosmjs/cosmwasm-stargate": "0.29.5", - "@cosmjs/crypto": "0.29.5", - "@cosmjs/encoding": "0.29.5", - "@cosmjs/json-rpc": "0.29.5", - "@cosmjs/math": "0.29.5", - "@cosmjs/proto-signing": "0.29.5", - "@cosmjs/stargate": "0.29.5", - "@cosmjs/tendermint-rpc": "0.29.5", - "@cosmjs/utils": "0.29.5", - "@ethersproject/keccak256": "^5.7.0", - "@keplr-wallet/types": "^0.11.41", - "@sei-js/proto": "1.3.0", - "crypto-js": "^4.1.1", - "readonly-date": "^1.0.0", - "sha.js": "^2.4.11", - "xstream": "^11.14.0" - } - }, - "node_modules/@sei-js/core/node_modules/@cosmjs/amino": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5" - } - }, - "node_modules/@sei-js/core/node_modules/@cosmjs/crypto": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers": "^0.7.6" - } - }, - "node_modules/@sei-js/core/node_modules/@cosmjs/encoding": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "node_modules/@sei-js/core/node_modules/@cosmjs/json-rpc": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/stream": "^0.29.5", - "xstream": "^11.14.0" - } - }, - "node_modules/@sei-js/core/node_modules/@cosmjs/math": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "bn.js": "^5.2.0" - } - }, - "node_modules/@sei-js/core/node_modules/@cosmjs/proto-signing": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/amino": "^0.29.5", - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0" - } - }, - "node_modules/@sei-js/core/node_modules/@cosmjs/socket": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/stream": "^0.29.5", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" - } - }, - "node_modules/@sei-js/core/node_modules/@cosmjs/stargate": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/proto-signing": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/tendermint-rpc": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0", - "protobufjs": "~6.11.3", - "xstream": "^11.14.0" - } - }, - "node_modules/@sei-js/core/node_modules/@cosmjs/stream": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "xstream": "^11.14.0" - } - }, - "node_modules/@sei-js/core/node_modules/@cosmjs/tendermint-rpc": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/json-rpc": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/socket": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "axios": "^0.21.2", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, - "node_modules/@sei-js/core/node_modules/@cosmjs/utils": { - "version": "0.29.5", - "license": "Apache-2.0" - }, - "node_modules/@sei-js/core/node_modules/axios": { - "version": "0.21.4", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@sei-js/core/node_modules/cosmjs-types": { - "version": "0.5.2", - "license": "Apache-2.0", - "dependencies": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "node_modules/@sei-js/core/node_modules/protobufjs": { - "version": "6.11.4", - "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/@sei-js/proto": { - "version": "1.3.0", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@babel/runtime": "^7.18.9", - "@cosmjs/amino": "0.29.5", - "@cosmjs/encoding": "0.29.5", - "@cosmjs/proto-signing": "0.29.5", - "@cosmjs/stargate": "0.29.5", - "@cosmjs/tendermint-rpc": "0.29.5", - "@osmonauts/helpers": "^0.6.0", - "@osmonauts/lcd": "^0.8.0", - "protobufjs": "^6.11.2" - } - }, - "node_modules/@sei-js/proto/node_modules/@cosmjs/amino": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5" - } - }, - "node_modules/@sei-js/proto/node_modules/@cosmjs/crypto": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers": "^0.7.6" - } - }, - "node_modules/@sei-js/proto/node_modules/@cosmjs/encoding": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "node_modules/@sei-js/proto/node_modules/@cosmjs/json-rpc": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/stream": "^0.29.5", - "xstream": "^11.14.0" - } - }, - "node_modules/@sei-js/proto/node_modules/@cosmjs/math": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "bn.js": "^5.2.0" - } - }, - "node_modules/@sei-js/proto/node_modules/@cosmjs/proto-signing": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/amino": "^0.29.5", - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0" - } - }, - "node_modules/@sei-js/proto/node_modules/@cosmjs/socket": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/stream": "^0.29.5", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" - } - }, - "node_modules/@sei-js/proto/node_modules/@cosmjs/stargate": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/proto-signing": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/tendermint-rpc": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0", - "protobufjs": "~6.11.3", - "xstream": "^11.14.0" - } - }, - "node_modules/@sei-js/proto/node_modules/@cosmjs/stream": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "xstream": "^11.14.0" - } - }, - "node_modules/@sei-js/proto/node_modules/@cosmjs/tendermint-rpc": { - "version": "0.29.5", - "license": "Apache-2.0", - "dependencies": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/json-rpc": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/socket": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "axios": "^0.21.2", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, - "node_modules/@sei-js/proto/node_modules/@cosmjs/utils": { - "version": "0.29.5", - "license": "Apache-2.0" - }, - "node_modules/@sei-js/proto/node_modules/axios": { - "version": "0.21.4", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@sei-js/proto/node_modules/cosmjs-types": { - "version": "0.5.2", - "license": "Apache-2.0", - "dependencies": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "node_modules/@sei-js/proto/node_modules/protobufjs": { - "version": "6.11.4", - "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/@solana/buffer-layout": { - "version": "4.0.1", - "license": "MIT", - "dependencies": { - "buffer": "~6.0.3" - }, - "engines": { - "node": ">=5.10" - } - }, - "node_modules/@solana/buffer-layout-utils": { - "version": "0.2.0", - "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.8", - "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.78.5", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.22.6", - "@noble/curves": "^1.0.0", - "@noble/hashes": "^1.3.1", - "@solana/buffer-layout": "^4.0.0", - "agentkeepalive": "^4.3.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.6.12", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" - } - }, - "node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "license": "MIT" - }, - "node_modules/@suchipi/femver": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/@terra-money/legacy.proto": { - "name": "@terra-money/terra.proto", - "version": "0.1.7", - "license": "Apache-2.0", - "dependencies": { - "google-protobuf": "^3.17.3", - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "node_modules/@terra-money/legacy.proto/node_modules/protobufjs": { - "version": "6.11.4", - "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/@terra-money/terra.js": { - "version": "3.1.9", - "license": "MIT", - "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", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "node_modules/@terra-money/terra.js/node_modules/bech32": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@terra-money/terra.js/node_modules/ws": { - "version": "7.5.9", - "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/@terra-money/terra.proto": { - "version": "2.1.0", - "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", - "license": "Apache-2.0", - "dependencies": { - "browser-headers": "^0.4.1" - }, - "peerDependencies": { - "google-protobuf": "^3.14.0" - } - }, - "node_modules/@terra-money/terra.proto/node_modules/protobufjs": { - "version": "6.11.4", - "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/@tsconfig/node10": { - "version": "1.0.9", - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "license": "MIT" - }, - "node_modules/@typechain/ethers-v5": { - "version": "11.1.1", - "license": "MIT", - "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.3.1", - "typescript": ">=4.3.0" - } - }, - "node_modules/@types/bn.js": { - "version": "5.1.1", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.36", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/lodash": { - "version": "4.14.198", - "license": "MIT", - "optional": true - }, - "node_modules/@types/lodash.values": { - "version": "4.3.7", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/lodash": "*" - } - }, - "node_modules/@types/long": { - "version": "4.0.2", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.6.2", - "license": "MIT" - }, - "node_modules/@types/pbkdf2": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/prettier": { - "version": "2.7.3", - "license": "MIT" - }, - "node_modules/@types/secp256k1": { - "version": "4.0.3", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "license": "MIT" - }, - "node_modules/@types/ws": { - "version": "7.4.7", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@wormhole-foundation/connect-sdk": { - "version": "0.4.0-beta.0", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/connect-sdk/-/connect-sdk-0.4.0-beta.0.tgz", - "integrity": "sha512-WHpJK1wVtB7nkpkUIqFQCxF22Ujz9/5e+EhADdJqb+8jMm0oPndN8cyKI4HvtTcfMq0PP/hhvUxD963XZGybeQ==", - "dependencies": { - "@wormhole-foundation/sdk-base": "^0.4.0-beta.0", - "@wormhole-foundation/sdk-definitions": "^0.4.0-beta.0", - "axios": "^1.4.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/connect-sdk-evm": { - "version": "0.4.0-beta.0", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/connect-sdk-evm/-/connect-sdk-evm-0.4.0-beta.0.tgz", - "integrity": "sha512-aVA1aJtrMPPQRD0sRv6m9GmonMAvFXSrQzVAQX+D6kVwzhHU/qiwedsPbM2SzJSFVvmdarAF0A2/wnh21GkS/A==", - "dependencies": { - "@typechain/ethers-v6": "^0.4.0", - "@wormhole-foundation/connect-sdk": "^0.4.0-beta.0", - "ethers": "^6.5.1", - "typechain": "^8.2.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/connect-sdk-evm/node_modules/@typechain/ethers-v6": { - "version": "0.4.3", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - }, - "peerDependencies": { - "ethers": "6.x", - "typechain": "^8.3.1", - "typescript": ">=4.7.0" - } - }, - "node_modules/@wormhole-foundation/connect-sdk-evm/node_modules/@types/node": { - "version": "18.15.13", - "license": "MIT" - }, - "node_modules/@wormhole-foundation/connect-sdk-evm/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "license": "MIT" - }, - "node_modules/@wormhole-foundation/connect-sdk-evm/node_modules/ethers": { - "version": "6.9.2", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "license": "MIT", - "dependencies": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@wormhole-foundation/connect-sdk-evm/node_modules/tslib": { - "version": "2.4.0", - "license": "0BSD" - }, - "node_modules/@wormhole-foundation/connect-sdk-evm/node_modules/ws": { - "version": "8.5.0", - "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/@wormhole-foundation/connect-sdk/node_modules/axios": { - "version": "1.6.5", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/@wormhole-foundation/relayer-engine": { - "version": "0.3.2", - "resolved": "git+ssh://git@github.com/wormhole-foundation/relayer-engine.git#e3c510048ef8c900769461040440b689a18d9e0d", - "integrity": "sha512-ITRYriw1VY48OjpibPytGuuFhUhgCoeSn+clUuMa0+hs6nSs3TrWEap7TFw2KTxr7+7dld4ZRPpIzA9Ocr8mMA==", - "license": "Apache-2.0", - "dependencies": { - "@bull-board/api": "^5.8.1", - "@bull-board/koa": "^5.8.1", - "@certusone/wormhole-sdk": "^0.10.5", - "@certusone/wormhole-spydk": "^0.0.1", - "@datastructures-js/queue": "^4.2.3", - "@improbable-eng/grpc-web-node-http-transport": "^0.15.0", - "@mysten/sui.js": "^0.32.2", - "@sei-js/core": "^1.3.4", - "@xlabs-xyz/wallet-monitor": "0.2.16", - "bech32": "^2.0.0", - "bullmq": "^3.15.8", - "ethers": "^5.7.2", - "generic-pool": "^3.9.0", - "ioredis": "^5.3.2", - "koa": "^2.14.1", - "lru-cache": "^9.1.2", - "prom-client": "^14.2.0", - "winston": "^3.10.0" - } - }, - "node_modules/@wormhole-foundation/relayer-engine/node_modules/bech32": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@wormhole-foundation/sdk-base": { - "version": "0.4.0-beta.0", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.4.0-beta.0.tgz", - "integrity": "sha512-+b6+5Sf30n0meC1rtdoAz5TB7mfXtYG81xAKlfeVZzl0GOYpchgGaEcWEPgOjKxPtT9eM1lo2q7KnV9zl8mgDQ==", - "dependencies": { - "@scure/base": "^1.1.3" - } - }, - "node_modules/@wormhole-foundation/sdk-connect": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.6.7.tgz", - "integrity": "sha512-yLKxLAWUl+J/98A+BNKuqyOu0iv2TXlbbiYLTJO7iUZSB5g3dFt36UJIz4Mfvrt1TnLJbD+7Sv6t2MwIDdO3Jg==", - "dependencies": { - "@wormhole-foundation/sdk-base": "0.6.7", - "@wormhole-foundation/sdk-definitions": "0.6.7", - "axios": "^1.4.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/sdk-connect/node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@wormhole-foundation/sdk-connect/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@wormhole-foundation/sdk-connect/node_modules/@wormhole-foundation/sdk-base": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.6.7.tgz", - "integrity": "sha512-lXN7tm5O8L8nfqXD1Fhn61rTR9WjZ9khRU3tOE3b8AqjX9OxIL9/ou5BmMGaJex8AFAUgnX86pNkEEvu9Tb3hQ==", - "dependencies": { - "@scure/base": "^1.1.3" - } - }, - "node_modules/@wormhole-foundation/sdk-connect/node_modules/@wormhole-foundation/sdk-definitions": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.6.7.tgz", - "integrity": "sha512-6uyfKuTHIXni4rEwoJDNW2Ahm7tABmG+Mae181TX3K4mfVznkC3YufEBlNJyt071B/RD7JJi7WZUVZ1ROG8Aow==", - "dependencies": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "0.6.7" - } - }, - "node_modules/@wormhole-foundation/sdk-connect/node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/@wormhole-foundation/sdk-definitions": { - "version": "0.4.0-beta.0", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.4.0-beta.0.tgz", - "integrity": "sha512-LY7/H2diYqz8R7QoMochtRB9O+RUaww2Radxb89Q5ghO0mq42tHxrrwjlfqA/Rsa8YMWRJPv2rEEdeFDfzM4kQ==", - "dependencies": { - "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "^0.4.0-beta.0" - } - }, - "node_modules/@wormhole-foundation/sdk-evm": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.6.7.tgz", - "integrity": "sha512-coQO1HaL4/GJxQ26FsgmMHY6X1iMZgHSXnCXGPmlchs5hMWraYLsxMTQ1goFSAIWQi0ALaR7tkdDDzN5y0liRw==", - "dependencies": { - "@wormhole-foundation/sdk-connect": "0.6.7", - "ethers": "^6.5.1" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" - }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/ethers": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", - "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "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/@wry/context": { - "version": "0.7.3", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@wry/equality": { - "version": "0.5.6", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@wry/trie": { - "version": "0.4.3", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@xlabs-xyz/wallet-monitor": { - "version": "0.2.16", - "license": "MIT", - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@mysten/sui.js": "^0.32.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.74.0", - "bluebird": "^3.7.2", - "bs58": "^5.0.0", - "ethers": "^5.7.0", - "google-protobuf": "^3.21.2", - "koa": "^2.14.1", - "koa-router": "^12.0.0", - "nice-grpc": "^2.1.4", - "prom-client": "^14.2.0", - "ts-node": "^10.9.1", - "ts-proto": "^1.147.3", - "winston": "^3.8.2", - "zod": "^3.21.4" - } - }, - "node_modules/@xlabs-xyz/wallet-monitor/node_modules/base-x": { - "version": "4.0.0", - "license": "MIT" - }, - "node_modules/@xlabs-xyz/wallet-monitor/node_modules/bs58": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "base-x": "^4.0.0" - } - }, - "node_modules/@xlabs-xyz/wallet-monitor/node_modules/http-errors": { - "version": "2.0.0", - "license": "MIT", - "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/@xlabs-xyz/wallet-monitor/node_modules/koa-router": { - "version": "12.0.1", - "license": "MIT", - "dependencies": { - "debug": "^4.3.4", - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.2.1" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/@xlabs-xyz/wallet-monitor/node_modules/statuses": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@xlabs/wh-swap-layer-ts-sdk": { - "resolved": "ts-sdk", - "link": true - }, - "node_modules/@xpla/xpla.js": { - "version": "0.2.3", - "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", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.8" - } - }, - "node_modules/@xpla/xpla.js/node_modules/bech32": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/@xpla/xpla.js/node_modules/ws": { - "version": "7.5.9", - "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/abbrev": { - "version": "2.0.0", - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/abort-controller-x": { - "version": "0.4.3", - "license": "MIT" - }, - "node_modules/accepts": { - "version": "1.3.8", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.10.0", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/aes-js": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/agentkeepalive": { - "version": "4.5.0", - "license": "MIT", - "dependencies": { - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/algo-msgpack-with-bigint": { - "version": "2.1.1", - "license": "ISC", - "engines": { - "node": ">= 10" - } - }, - "node_modules/algosdk": { - "version": "2.5.0", - "license": "MIT", - "dependencies": { - "algo-msgpack-with-bigint": "^2.1.1", - "buffer": "^6.0.3", - "cross-fetch": "^4.0.0", - "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": ">=16.0.0" - } - }, - "node_modules/algosdk/node_modules/cross-fetch": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/any-promise": { - "version": "1.3.0", - "license": "MIT" - }, - "node_modules/aptos": { - "version": "1.5.0", - "license": "Apache-2.0", - "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/@noble/hashes": { - "version": "1.1.3", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT" - }, - "node_modules/aptos/node_modules/@scure/bip39": { - "version": "1.1.0", - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "@noble/hashes": "~1.1.1", - "@scure/base": "~1.1.0" - } - }, - "node_modules/aptos/node_modules/axios": { - "version": "0.27.2", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "license": "MIT" - }, - "node_modules/array-back": { - "version": "3.1.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/async": { - "version": "3.2.5", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/axios": { - "version": "0.24.0", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.4" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/base-x": { - "version": "3.0.9", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/base64-js": { - "version": "1.5.1", - "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": "1.1.4", - "license": "MIT" - }, - "node_modules/big-integer": { - "version": "1.6.36", - "license": "Unlicense", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/bigint-buffer": { - "version": "1.1.5", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "bindings": "^1.3.0" - }, - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/bignumber.js": { - "version": "9.1.2", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/binary-parser": { - "version": "2.2.1", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/bindings": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, - "node_modules/bintrees": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/bip32": { - "version": "2.0.6", - "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", - "license": "MIT" - }, - "node_modules/bip39": { - "version": "3.1.0", - "license": "ISC", - "dependencies": { - "@noble/hashes": "^1.2.0" - } - }, - "node_modules/bip66": { - "version": "1.1.5", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/blakejs": { - "version": "1.2.1", - "license": "MIT" - }, - "node_modules/bluebird": { - "version": "3.7.2", - "license": "MIT" - }, - "node_modules/bn.js": { - "version": "5.2.1", - "license": "MIT" - }, - "node_modules/borsh": { - "version": "0.7.0", - "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", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/brorand": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/browser-headers": { - "version": "0.4.1", - "license": "Apache-2.0" - }, - "node_modules/browserify-aes": { - "version": "1.2.0", - "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", - "license": "MIT", - "dependencies": { - "base-x": "^3.0.2" - } - }, - "node_modules/bs58check": { - "version": "2.1.2", - "license": "MIT", - "dependencies": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "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-layout": { - "version": "1.2.2", - "license": "MIT", - "engines": { - "node": ">=4.5" - } - }, - "node_modules/buffer-xor": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/bufferutil": { - "version": "4.0.7", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/bullmq": { - "version": "3.15.8", - "license": "MIT", - "dependencies": { - "cron-parser": "^4.6.0", - "glob": "^8.0.3", - "ioredis": "^5.3.2", - "lodash": "^4.17.21", - "msgpackr": "^1.6.2", - "semver": "^7.3.7", - "tslib": "^2.0.0", - "uuid": "^9.0.0" - } - }, - "node_modules/bullmq/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/bullmq/node_modules/glob": { - "version": "8.1.0", - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/bullmq/node_modules/minimatch": { - "version": "5.1.6", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/bullmq/node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/cache-content-type": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/capability": { - "version": "0.2.5", - "license": "MIT" - }, - "node_modules/case-anything": { - "version": "2.1.13", - "license": "MIT", - "engines": { - "node": ">=12.13" - }, - "funding": { - "url": "https://github.com/sponsors/mesqueeb" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "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/cipher-base": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "license": "ISC", - "optional": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/color": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/colorspace": { - "version": "1.1.4", - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/command-line-args": { - "version": "5.2.1", - "license": "MIT", - "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", - "license": "MIT", - "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/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/array-back": { - "version": "4.0.2", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/command-line-usage/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/command-line-usage/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT" - }, - "node_modules/command-line-usage/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/command-line-usage/node_modules/typical": { - "version": "5.2.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/commander": { - "version": "2.20.3", - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/condense-newlines": { - "version": "0.2.1", - "license": "MIT", - "dependencies": { - "extend-shallow": "^2.0.1", - "is-whitespace": "^0.3.0", - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/config-chain": { - "version": "1.1.13", - "license": "MIT", - "dependencies": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "node_modules/consolidate": { - "version": "0.16.0", - "license": "MIT", - "dependencies": { - "bluebird": "^3.7.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookies": { - "version": "0.9.1", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/copyfiles": { - "version": "2.4.1", - "license": "MIT", - "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/core-util-is": { - "version": "1.0.3", - "license": "MIT", - "optional": true - }, - "node_modules/cosmjs-types": { - "version": "0.7.2", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "node_modules/cosmjs-types/node_modules/protobufjs": { - "version": "6.11.4", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "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/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "license": "Apache-2.0", - "optional": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/create-hash": { - "version": "1.2.0", - "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", - "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", - "license": "MIT" - }, - "node_modules/cron-parser": { - "version": "4.9.0", - "license": "MIT", - "dependencies": { - "luxon": "^3.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/cross-fetch": { - "version": "3.1.8", - "license": "MIT", - "dependencies": { - "node-fetch": "^2.6.12" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypto-addr-codec": { - "version": "0.1.8", - "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", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/crypto-js": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.3.4", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.4.3", - "license": "MIT" - }, - "node_modules/deep-equal": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/deep-extend": { - "version": "0.6.0", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.0", - "license": "MIT", - "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", - "license": "MIT", - "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", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/delegates": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/denque": { - "version": "2.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-libc": { - "version": "1.0.3", - "license": "Apache-2.0", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dotenv": { - "version": "16.3.1", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/motdotla/dotenv?sponsor=1" - } - }, - "node_modules/dprint-node": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "detect-libc": "^1.0.3" - } - }, - "node_modules/drbg.js": { - "version": "1.0.1", - "license": "MIT", - "optional": true, - "dependencies": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "license": "MIT" - }, - "node_modules/eccrypto": { - "version": "1.1.6", - "hasInstallScript": true, - "license": "CC0-1.0", - "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", - "license": "MIT", - "optional": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/eccrypto/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT", - "optional": true - }, - "node_modules/eccrypto/node_modules/secp256k1": { - "version": "3.7.1", - "hasInstallScript": true, - "license": "MIT", - "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/editorconfig": { - "version": "1.0.4", - "license": "MIT", - "dependencies": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "9.0.1", - "semver": "^7.5.3" - }, - "bin": { - "editorconfig": "bin/editorconfig" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/editorconfig/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/editorconfig/node_modules/commander": { - "version": "10.0.1", - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/editorconfig/node_modules/minimatch": { - "version": "9.0.1", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.9", - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/elliptic": { - "version": "6.5.4", - "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", - "license": "MIT" - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "license": "MIT" - }, - "node_modules/enabled": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/error-polyfill": { - "version": "0.1.3", - "license": "MIT", - "dependencies": { - "capability": "^0.2.5", - "o3": "^1.0.3", - "u3": "^0.1.1" - } - }, - "node_modules/es6-promise": { - "version": "4.2.8", - "license": "MIT" - }, - "node_modules/es6-promisify": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "es6-promise": "^4.0.3" - } - }, - "node_modules/esbuild": { - "version": "0.19.11", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" - } - }, - "node_modules/escalade": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "1.0.5", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/eth-crypto": { - "version": "2.6.0", - "license": "MIT", - "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/@babel/runtime": { - "version": "7.20.13", - "license": "MIT", - "optional": true, - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/eth-crypto/node_modules/node-addon-api": { - "version": "5.1.0", - "license": "MIT", - "optional": true - }, - "node_modules/eth-crypto/node_modules/regenerator-runtime": { - "version": "0.13.11", - "license": "MIT", - "optional": true - }, - "node_modules/eth-crypto/node_modules/secp256k1": { - "version": "5.0.0", - "hasInstallScript": true, - "license": "MIT", - "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", - "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", - "license": "MIT", - "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", - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/ethereumjs-abi/node_modules/bn.js": { - "version": "4.12.0", - "license": "MIT", - "optional": true - }, - "node_modules/ethereumjs-abi/node_modules/ethereumjs-util": { - "version": "6.2.1", - "license": "MPL-2.0", - "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", - "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", - "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/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/ethjs-util": { - "version": "0.1.6", - "license": "MIT", - "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", - "license": "MIT" - }, - "node_modules/evp_bytestokey": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/extend-shallow": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eyes": { - "version": "0.1.8", - "engines": { - "node": "> 0.1.90" - } - }, - "node_modules/fast-stable-stringify": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/fecha": { - "version": "4.2.3", - "license": "MIT" - }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/filelist": { - "version": "1.0.4", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/filelist/node_modules/minimatch": { - "version": "5.1.6", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/find-replace": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "array-back": "^3.0.1" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/fn.name": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fs-extra": { - "version": "7.0.1", - "license": "MIT", - "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", - "license": "ISC" - }, - "node_modules/function-bind": { - "version": "1.1.1", - "license": "MIT" - }, - "node_modules/generic-pool": { - "version": "3.9.0", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-paths": { - "version": "0.0.7", - "license": "MIT", - "dependencies": { - "pify": "^4.0.1" - }, - "engines": { - "node": ">=6.4" - } - }, - "node_modules/get-tsconfig": { - "version": "4.7.2", - "license": "MIT", - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/glob": { - "version": "7.1.7", - "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/globalthis": { - "version": "1.0.3", - "license": "MIT", - "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", - "license": "(BSD-3-Clause AND Apache-2.0)" - }, - "node_modules/gopd": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "node_modules/graphql": { - "version": "16.8.0", - "license": "MIT", - "optional": true, - "engines": { - "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" - } - }, - "node_modules/graphql-tag": { - "version": "2.12.6", - "license": "MIT", - "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": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hash-base": { - "version": "3.1.0", - "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", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "node_modules/hi-base32": { - "version": "0.5.1", - "license": "MIT" - }, - "node_modules/hmac-drbg": { - "version": "1.0.1", - "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", - "license": "BSD-3-Clause", - "optional": true, - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/http-assert": { - "version": "1.5.0", - "license": "MIT", - "dependencies": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors": { - "version": "1.8.1", - "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/http-errors/node_modules/depd": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/http-status-codes": { - "version": "2.2.0", - "license": "MIT", - "optional": true - }, - "node_modules/humanize-ms": { - "version": "1.2.1", - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "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", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "license": "ISC" - }, - "node_modules/interpret": { - "version": "1.4.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/ioredis": { - "version": "5.3.2", - "license": "MIT", - "dependencies": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "license": "MIT" - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "license": "MIT" - }, - "node_modules/is-core-module": { - "version": "2.13.0", - "license": "MIT", - "optional": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extendable": { - "version": "0.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-function": { - "version": "1.0.10", - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-hex-prefixed": { - "version": "1.0.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-whitespace": { - "version": "0.3.0", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isarray": { - "version": "0.0.1", - "license": "MIT", - "optional": true - }, - "node_modules/isexe": { - "version": "2.0.0", - "license": "ISC" - }, - "node_modules/isomorphic-ws": { - "version": "4.0.1", - "license": "MIT", - "peerDependencies": { - "ws": "*" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jake": { - "version": "10.8.7", - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jayson": { - "version": "4.1.0", - "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", - "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", - "license": "MIT" - }, - "node_modules/js-base64": { - "version": "3.7.5", - "license": "BSD-3-Clause" - }, - "node_modules/js-beautify": { - "version": "1.14.11", - "license": "MIT", - "dependencies": { - "config-chain": "^1.1.13", - "editorconfig": "^1.0.3", - "glob": "^10.3.3", - "nopt": "^7.2.0" - }, - "bin": { - "css-beautify": "js/bin/css-beautify.js", - "html-beautify": "js/bin/html-beautify.js", - "js-beautify": "js/bin/js-beautify.js" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/js-beautify/node_modules/brace-expansion": { - "version": "2.0.1", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/js-beautify/node_modules/glob": { - "version": "10.3.10", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-beautify/node_modules/minimatch": { - "version": "9.0.3", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/js-sha256": { - "version": "0.9.0", - "license": "MIT" - }, - "node_modules/js-sha3": { - "version": "0.8.0", - "license": "MIT" - }, - "node_modules/js-sha512": { - "version": "0.8.0", - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT", - "optional": true - }, - "node_modules/jscrypto": { - "version": "1.0.3", - "license": "MIT", - "bin": { - "jscrypto": "bin/cli.js" - } - }, - "node_modules/json-bigint": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "bignumber.js": "^9.0.0" - } - }, - "node_modules/json-stringify-safe": { - "version": "5.0.1", - "license": "ISC" - }, - "node_modules/jsonfile": { - "version": "4.0.0", - "license": "MIT", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "license": "MIT" - }, - "node_modules/jsonschema": { - "version": "1.4.1", - "license": "MIT", - "optional": true, - "engines": { - "node": "*" - } - }, - "node_modules/JSONStream": { - "version": "1.3.5", - "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.3", - "hasInstallScript": true, - "license": "MIT", - "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", - "license": "MIT", - "optional": true, - "dependencies": { - "bn.js": "^5.2.0", - "buffer": "^6.0.3", - "keccak": "^3.0.2" - } - }, - "node_modules/keygrip": { - "version": "1.1.0", - "license": "MIT", - "dependencies": { - "tsscmp": "1.0.6" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/kind-of": { - "version": "3.2.2", - "license": "MIT", - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/koa": { - "version": "2.15.0", - "license": "MIT", - "dependencies": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - }, - "engines": { - "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" - } - }, - "node_modules/koa-compose": { - "version": "4.1.0", - "license": "MIT" - }, - "node_modules/koa-convert": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/koa-mount": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "debug": "^4.0.1", - "koa-compose": "^4.1.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-router": { - "version": "10.1.1", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.1.0" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/koa-send": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/koa-static": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "engines": { - "node": ">= 7.6.0" - } - }, - "node_modules/koa-static/node_modules/debug": { - "version": "3.2.7", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/koa-views": { - "version": "7.0.2", - "license": "MIT", - "dependencies": { - "consolidate": "^0.16.0", - "debug": "^4.1.0", - "get-paths": "0.0.7", - "koa-send": "^5.0.0", - "mz": "^2.4.0", - "pretty": "^2.0.0", - "resolve-path": "^1.4.0" - }, - "peerDependencies": { - "@types/koa": "^2.13.1" - }, - "peerDependenciesMeta": { - "@types/koa": { - "optional": true - } - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "license": "MIT" - }, - "node_modules/libsodium": { - "version": "0.7.13", - "license": "ISC" - }, - "node_modules/libsodium-wrappers": { - "version": "0.7.13", - "license": "ISC", - "dependencies": { - "libsodium": "^0.7.13" - } - }, - "node_modules/link-module-alias": { - "version": "1.2.0", - "license": "MIT", - "optional": true, - "dependencies": { - "chalk": "^2.4.1" - }, - "bin": { - "link-module-alias": "index.js" - }, - "engines": { - "node": "> 8.0.0" - } - }, - "node_modules/link-module-alias/node_modules/ansi-styles": { - "version": "3.2.1", - "license": "MIT", - "optional": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/link-module-alias/node_modules/chalk": { - "version": "2.4.2", - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/link-module-alias/node_modules/color-convert": { - "version": "1.9.3", - "license": "MIT", - "optional": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/link-module-alias/node_modules/color-name": { - "version": "1.1.3", - "license": "MIT", - "optional": true - }, - "node_modules/link-module-alias/node_modules/has-flag": { - "version": "3.0.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/link-module-alias/node_modules/supports-color": { - "version": "5.5.0", - "license": "MIT", - "optional": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "license": "MIT" - }, - "node_modules/lodash.values": { - "version": "4.3.0", - "license": "MIT", - "optional": true - }, - "node_modules/logform": { - "version": "2.6.0", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/long": { - "version": "4.0.0", - "license": "Apache-2.0" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "optional": true, - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lower-case": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/lru-cache": { - "version": "9.1.2", - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/luxon": { - "version": "3.4.4", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "license": "ISC" - }, - "node_modules/map-obj": { - "version": "4.3.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/md5.js": { - "version": "1.3.5", - "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", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimalistic-assert": { - "version": "1.0.1", - "license": "ISC" - }, - "node_modules/minimalistic-crypto-utils": { - "version": "1.0.1", - "license": "MIT" - }, - "node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "license": "MIT", - "optional": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.0.4", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp": { - "version": "1.0.4", - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "license": "MIT" - }, - "node_modules/msgpackr": { - "version": "1.10.1", - "license": "MIT", - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.2", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.0.7" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2" - } - }, - "node_modules/mustache": { - "version": "4.2.0", - "license": "MIT", - "bin": { - "mustache": "bin/mustache" - } - }, - "node_modules/mz": { - "version": "2.7.0", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nan": { - "version": "2.14.0", - "license": "MIT" - }, - "node_modules/near-api-js": { - "version": "1.1.0", - "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/negotiator": { - "version": "0.6.3", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/nice-grpc": { - "version": "2.1.7", - "license": "MIT", - "dependencies": { - "@grpc/grpc-js": "^1.9.5", - "abort-controller-x": "^0.4.0", - "nice-grpc-common": "^2.0.2" - } - }, - "node_modules/nice-grpc-common": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "ts-error": "^1.0.6" - } - }, - "node_modules/no-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node_modules/node-addon-api": { - "version": "2.0.2", - "license": "MIT" - }, - "node_modules/node-fetch": { - "version": "2.7.0", - "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.6.1", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.0.7", - "license": "MIT", - "optional": true, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/noms": { - "version": "0.0.0", - "license": "ISC", - "optional": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - } - }, - "node_modules/noms/node_modules/readable-stream": { - "version": "1.0.34", - "license": "MIT", - "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", - "license": "MIT", - "optional": true - }, - "node_modules/nopt": { - "version": "7.2.0", - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/o3": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "capability": "^0.2.5" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/only": { - "version": "0.0.2" - }, - "node_modules/optimism": { - "version": "0.17.5", - "license": "MIT", - "optional": true, - "dependencies": { - "@wry/context": "^0.7.0", - "@wry/trie": "^0.4.3", - "tslib": "^2.3.0" - } - }, - "node_modules/pako": { - "version": "2.1.0", - "license": "(MIT AND Zlib)" - }, - "node_modules/parseurl": { - "version": "1.3.3", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "license": "MIT", - "optional": true - }, - "node_modules/path-scurry": { - "version": "1.10.1", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-to-regexp": { - "version": "6.2.1", - "license": "MIT" - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "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/pify": { - "version": "4.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/prettier": { - "version": "2.8.8", - "license": "MIT", - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "condense-newlines": "^0.2.1", - "extend-shallow": "^2.0.1", - "js-beautify": "^1.6.12" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "license": "MIT", - "optional": true - }, - "node_modules/prom-client": { - "version": "14.2.0", - "license": "Apache-2.0", - "dependencies": { - "tdigest": "^0.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "license": "MIT", - "optional": true, - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/proto-list": { - "version": "1.2.4", - "license": "ISC" - }, - "node_modules/protobufjs": { - "version": "7.2.5", - "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/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/protobufjs/node_modules/long": { - "version": "5.2.3", - "license": "Apache-2.0" - }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/randombytes": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "license": "MIT", - "optional": true - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readonly-date": { - "version": "1.0.0", - "license": "Apache-2.0" - }, - "node_modules/rechoir": { - "version": "0.6.2", - "optional": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-info": { - "version": "3.1.0", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.11" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "license": "MIT", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/reduce-flatten": { - "version": "2.0.0", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.0", - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.6", - "license": "MIT", - "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/resolve-path": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/resolve-path/node_modules/depd": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/http-errors": { - "version": "1.6.3", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/resolve-path/node_modules/inherits": { - "version": "2.0.3", - "license": "ISC" - }, - "node_modules/resolve-path/node_modules/setprototypeof": { - "version": "1.1.0", - "license": "ISC" - }, - "node_modules/resolve-pkg-maps": { - "version": "1.0.0", - "license": "MIT", - "funding": { - "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" - } - }, - "node_modules/response-iterator": { - "version": "0.2.6", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "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", - "license": "MIT", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/ripemd160-min": { - "version": "0.0.6", - "engines": { - "node": ">=8" - } - }, - "node_modules/rlp": { - "version": "2.2.7", - "license": "MPL-2.0", - "dependencies": { - "bn.js": "^5.2.0" - }, - "bin": { - "rlp": "bin/rlp" - } - }, - "node_modules/rpc-websockets": { - "version": "7.6.0", - "license": "LGPL-3.0-only", - "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.14.1", - "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", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "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/safe-stable-stringify": { - "version": "2.4.3", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/scrypt-js": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/secp256k1": { - "version": "4.0.3", - "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/semver": { - "version": "7.5.4", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/setimmediate": { - "version": "1.0.5", - "license": "MIT" - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.11", - "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", - "license": "MIT", - "dependencies": { - "buffer": "6.0.3" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shelljs": { - "version": "0.8.5", - "license": "BSD-3-Clause", - "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", - "license": "MIT", - "optional": true, - "dependencies": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" - }, - "bin": { - "shx": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/snake-case": { - "version": "3.0.4", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/snakecase-keys": { - "version": "5.4.6", - "license": "MIT", - "optional": true, - "dependencies": { - "map-obj": "^4.1.0", - "snake-case": "^3.0.4", - "type-fest": "^2.5.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "license": "MIT" - }, - "node_modules/statuses": { - "version": "1.5.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/store2": { - "version": "2.14.2", - "license": "(MIT OR GPL-3.0)", - "optional": true - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-format": { - "version": "2.0.0", - "license": "WTFPL OR MIT" - }, - "node_modules/string-width": { - "version": "4.2.3", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "license": "MIT", - "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", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-hex-prefix": { - "version": "1.0.0", - "license": "MIT", - "optional": true, - "dependencies": { - "is-hex-prefixed": "1.0.0" - }, - "engines": { - "node": ">=6.5.0", - "npm": ">=3" - } - }, - "node_modules/superstruct": { - "version": "1.0.3", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-observable": { - "version": "4.0.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/table-layout": { - "version": "1.0.2", - "license": "MIT", - "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", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/table-layout/node_modules/typical": { - "version": "5.2.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/tdigest": { - "version": "0.1.2", - "license": "MIT", - "dependencies": { - "bintrees": "1.0.2" - } - }, - "node_modules/text-encoding-utf-8": { - "version": "1.0.2" - }, - "node_modules/text-hex": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/through": { - "version": "2.3.8", - "license": "MIT" - }, - "node_modules/through2": { - "version": "2.0.5", - "license": "MIT", - "optional": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "license": "MIT", - "optional": true - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "license": "MIT", - "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", - "license": "MIT", - "optional": true - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "license": "MIT", - "optional": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/tiny-secp256k1": { - "version": "1.1.6", - "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", - "license": "MIT" - }, - "node_modules/tmp": { - "version": "0.2.1", - "license": "MIT", - "dependencies": { - "rimraf": "^3.0.0" - }, - "engines": { - "node": ">=8.17.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/toml": { - "version": "3.0.0", - "license": "MIT" - }, - "node_modules/tr46": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ts-command-line-args": { - "version": "2.5.1", - "license": "ISC", - "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-error": { - "version": "1.0.6", - "license": "MIT" - }, - "node_modules/ts-essentials": { - "version": "7.0.3", - "license": "MIT", - "peerDependencies": { - "typescript": ">=3.7.0" - } - }, - "node_modules/ts-invariant": { - "version": "0.10.3", - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "license": "MIT", - "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-poet": { - "version": "6.6.0", - "license": "Apache-2.0", - "dependencies": { - "dprint-node": "^1.0.7" - } - }, - "node_modules/ts-proto": { - "version": "1.166.2", - "license": "ISC", - "dependencies": { - "case-anything": "^2.1.13", - "protobufjs": "^7.2.4", - "ts-poet": "^6.5.0", - "ts-proto-descriptors": "1.15.0" - }, - "bin": { - "protoc-gen-ts_proto": "protoc-gen-ts_proto" - } - }, - "node_modules/ts-proto-descriptors": { - "version": "1.15.0", - "license": "ISC", - "dependencies": { - "long": "^5.2.3", - "protobufjs": "^7.2.4" - } - }, - "node_modules/ts-proto-descriptors/node_modules/long": { - "version": "5.2.3", - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.6.2", - "license": "0BSD" - }, - "node_modules/tsscmp": { - "version": "1.0.6", - "license": "MIT", - "engines": { - "node": ">=0.6.x" - } - }, - "node_modules/tsx": { - "version": "4.7.0", - "license": "MIT", - "dependencies": { - "esbuild": "~0.19.10", - "get-tsconfig": "^4.7.2" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, - "node_modules/tweetnacl": { - "version": "1.0.3", - "license": "Unlicense" - }, - "node_modules/tweetnacl-util": { - "version": "0.15.1", - "license": "Unlicense", - "optional": true - }, - "node_modules/type-fest": { - "version": "2.19.0", - "license": "(MIT OR CC0-1.0)", - "optional": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typechain": { - "version": "8.3.1", - "license": "MIT", - "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/typeforce": { - "version": "1.18.0", - "license": "MIT" - }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/typical": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/u3": { - "version": "0.1.1", - "license": "MIT" - }, - "node_modules/universalify": { - "version": "0.1.2", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/untildify": { - "version": "4.0.0", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/utf-8-validate": { - "version": "5.0.10", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-gyp-build": "^4.3.0" - }, - "engines": { - "node": ">=6.14.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "8.3.2", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/vlq": { - "version": "2.0.4", - "license": "MIT" - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "license": "BSD-2-Clause" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "license": "MIT", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wif": { - "version": "2.0.6", - "license": "MIT", - "dependencies": { - "bs58check": "<3.0.0" - } - }, - "node_modules/winston": { - "version": "3.11.0", - "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.6.0", - "license": "MIT", - "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/wordwrapjs": { - "version": "4.0.1", - "license": "MIT", - "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", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "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/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "license": "MIT", - "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", - "license": "ISC" - }, - "node_modules/ws": { - "version": "7.4.6", - "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", - "license": "MIT", - "dependencies": { - "globalthis": "^1.0.1", - "symbol-observable": "^2.0.3" - } - }, - "node_modules/xstream/node_modules/symbol-observable": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "license": "ISC" - }, - "node_modules/yargs": { - "version": "16.2.0", - "license": "MIT", - "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/yargs-parser": { - "version": "20.2.9", - "license": "ISC", - "optional": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/ylru": { - "version": "1.3.2", - "license": "MIT", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/zen-observable": { - "version": "0.8.15", - "license": "MIT", - "optional": true - }, - "node_modules/zen-observable-ts": { - "version": "1.2.5", - "license": "MIT", - "optional": true, - "dependencies": { - "zen-observable": "0.8.15" - } - }, - "node_modules/zod": { - "version": "3.22.4", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "ts-sdk": { - "name": "@xlabs/wh-swap-layer-ts-sdk", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@wormhole-foundation/sdk-base": "^0.6.7", - "@wormhole-foundation/sdk-definitions": "^0.6.7", - "@wormhole-foundation/sdk-evm": "^0.6.7", - "typescript": "^5.4.5" - } - }, - "ts-sdk/node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "ts-sdk/node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "ts-sdk/node_modules/@wormhole-foundation/sdk-base": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.6.7.tgz", - "integrity": "sha512-lXN7tm5O8L8nfqXD1Fhn61rTR9WjZ9khRU3tOE3b8AqjX9OxIL9/ou5BmMGaJex8AFAUgnX86pNkEEvu9Tb3hQ==", - "dependencies": { - "@scure/base": "^1.1.3" - } - }, - "ts-sdk/node_modules/@wormhole-foundation/sdk-definitions": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.6.7.tgz", - "integrity": "sha512-6uyfKuTHIXni4rEwoJDNW2Ahm7tABmG+Mae181TX3K4mfVznkC3YufEBlNJyt071B/RD7JJi7WZUVZ1ROG8Aow==", - "dependencies": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "0.6.7" - } - } - }, - "dependencies": { - "@adraffy/ens-normalize": { - "version": "1.10.0" - }, - "@apollo/client": { - "version": "3.8.3", - "optional": true, - "requires": { - "@graphql-typed-document-node/core": "^3.1.1", - "@wry/context": "^0.7.3", - "@wry/equality": "^0.5.6", - "@wry/trie": "^0.4.3", - "graphql-tag": "^2.12.6", - "hoist-non-react-statics": "^3.3.2", - "optimism": "^0.17.5", - "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": { - "version": "7.22.15", - "requires": { - "regenerator-runtime": "^0.14.0" - } - }, - "@bull-board/api": { - "version": "5.11.0", - "requires": { - "redis-info": "^3.0.8" - } - }, - "@bull-board/koa": { - "version": "5.11.0", - "requires": { - "@bull-board/api": "5.11.0", - "@bull-board/ui": "5.11.0", - "ejs": "^3.1.7", - "koa": "^2.13.1", - "koa-mount": "^4.0.0", - "koa-router": "^10.0.0", - "koa-static": "^5.0.0", - "koa-views": "^7.0.1" - } - }, - "@bull-board/ui": { - "version": "5.11.0", - "requires": { - "@bull-board/api": "5.11.0" - } - }, - "@certusone/wormhole-sdk": { - "version": "0.10.8", - "requires": { - "@certusone/wormhole-sdk-proto-web": "0.0.7", - "@certusone/wormhole-sdk-wasm": "^0.0.1", - "@coral-xyz/borsh": "0.2.6", - "@injectivelabs/networks": "1.10.12", - "@injectivelabs/sdk-ts": "1.10.72", - "@injectivelabs/utils": "1.10.12", - "@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" - }, - "dependencies": { - "bech32": { - "version": "2.0.0" - } - } - }, - "@certusone/wormhole-sdk-proto-web": { - "version": "0.0.7", - "requires": { - "@improbable-eng/grpc-web": "^0.15.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.5.6" - } - }, - "@certusone/wormhole-sdk-wasm": { - "version": "0.0.1", - "requires": { - "@types/long": "^4.0.2", - "@types/node": "^18.0.3" - }, - "dependencies": { - "@types/node": { - "version": "18.17.17" - } - } - }, - "@certusone/wormhole-spydk": { - "version": "0.0.1", - "requires": { - "@grpc/grpc-js": "^1.4.4", - "protobufjs": "^6.11.2" - }, - "dependencies": { - "protobufjs": { - "version": "6.11.4", - "requires": { - "@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" - } - } - } - }, - "@classic-terra/terra.proto": { - "version": "1.1.0", - "requires": { - "@improbable-eng/grpc-web": "^0.14.1", - "google-protobuf": "^3.17.3", - "long": "^4.0.0", - "protobufjs": "~6.11.2" - }, - "dependencies": { - "@improbable-eng/grpc-web": { - "version": "0.14.1", - "requires": { - "browser-headers": "^0.4.1" - } - }, - "protobufjs": { - "version": "6.11.4", - "requires": { - "@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" - } - } - } - }, - "@colors/colors": { - "version": "1.6.0" - }, - "@confio/ics23": { - "version": "0.6.8", - "requires": { - "@noble/hashes": "^1.0.0", - "protobufjs": "^6.8.8" - }, - "dependencies": { - "protobufjs": { - "version": "6.11.4", - "requires": { - "@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" - } - } - } - }, - "@coral-xyz/borsh": { - "version": "0.2.6", - "requires": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - } - }, - "@cosmjs/amino": { - "version": "0.30.1", - "optional": true, - "requires": { - "@cosmjs/crypto": "^0.30.1", - "@cosmjs/encoding": "^0.30.1", - "@cosmjs/math": "^0.30.1", - "@cosmjs/utils": "^0.30.1" - } - }, - "@cosmjs/cosmwasm-stargate": { - "version": "0.29.5", - "requires": { - "@cosmjs/amino": "^0.29.5", - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/proto-signing": "^0.29.5", - "@cosmjs/stargate": "^0.29.5", - "@cosmjs/tendermint-rpc": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0", - "pako": "^2.0.2" - }, - "dependencies": { - "@cosmjs/amino": { - "version": "0.29.5", - "requires": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5" - } - }, - "@cosmjs/crypto": { - "version": "0.29.5", - "requires": { - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers": "^0.7.6" - } - }, - "@cosmjs/encoding": { - "version": "0.29.5", - "requires": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "@cosmjs/json-rpc": { - "version": "0.29.5", - "requires": { - "@cosmjs/stream": "^0.29.5", - "xstream": "^11.14.0" - } - }, - "@cosmjs/math": { - "version": "0.29.5", - "requires": { - "bn.js": "^5.2.0" - } - }, - "@cosmjs/proto-signing": { - "version": "0.29.5", - "requires": { - "@cosmjs/amino": "^0.29.5", - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0" - } - }, - "@cosmjs/socket": { - "version": "0.29.5", - "requires": { - "@cosmjs/stream": "^0.29.5", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" - } - }, - "@cosmjs/stargate": { - "version": "0.29.5", - "requires": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/proto-signing": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/tendermint-rpc": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0", - "protobufjs": "~6.11.3", - "xstream": "^11.14.0" - } - }, - "@cosmjs/stream": { - "version": "0.29.5", - "requires": { - "xstream": "^11.14.0" - } - }, - "@cosmjs/tendermint-rpc": { - "version": "0.29.5", - "requires": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/json-rpc": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/socket": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "axios": "^0.21.2", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, - "@cosmjs/utils": { - "version": "0.29.5" - }, - "axios": { - "version": "0.21.4", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "cosmjs-types": { - "version": "0.5.2", - "requires": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "protobufjs": { - "version": "6.11.4", - "requires": { - "@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" - } - } - } - }, - "@cosmjs/crypto": { - "version": "0.30.1", - "optional": true, - "requires": { - "@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" - } - }, - "@cosmjs/encoding": { - "version": "0.30.1", - "optional": true, - "requires": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "@cosmjs/json-rpc": { - "version": "0.30.1", - "optional": true, - "requires": { - "@cosmjs/stream": "^0.30.1", - "xstream": "^11.14.0" - } - }, - "@cosmjs/math": { - "version": "0.30.1", - "optional": true, - "requires": { - "bn.js": "^5.2.0" - } - }, - "@cosmjs/proto-signing": { - "version": "0.30.1", - "optional": true, - "requires": { - "@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" - } - }, - "@cosmjs/socket": { - "version": "0.30.1", - "optional": true, - "requires": { - "@cosmjs/stream": "^0.30.1", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" - } - }, - "@cosmjs/stargate": { - "version": "0.30.1", - "optional": true, - "requires": { - "@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" - }, - "dependencies": { - "protobufjs": { - "version": "6.11.4", - "optional": true, - "requires": { - "@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" - } - } - } - }, - "@cosmjs/stream": { - "version": "0.30.1", - "optional": true, - "requires": { - "xstream": "^11.14.0" - } - }, - "@cosmjs/tendermint-rpc": { - "version": "0.30.1", - "optional": true, - "requires": { - "@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" - }, - "dependencies": { - "axios": { - "version": "0.21.4", - "optional": true, - "requires": { - "follow-redirects": "^1.14.0" - } - } - } - }, - "@cosmjs/utils": { - "version": "0.30.1", - "optional": true - }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, - "@dabh/diagnostics": { - "version": "2.0.3", - "requires": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "@datastructures-js/queue": { - "version": "4.2.3" - }, - "@esbuild/linux-x64": { - "version": "0.19.11", - "optional": true - }, - "@ethereumjs/common": { - "version": "2.6.5", - "optional": true, - "requires": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" - } - }, - "@ethereumjs/tx": { - "version": "3.5.2", - "optional": true, - "requires": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" - } - }, - "@ethersproject/abi": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@ethersproject/bytes": "^5.7.0" - } - }, - "@ethersproject/basex": { - "version": "5.7.0", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "@ethersproject/bignumber": { - "version": "5.7.0", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "@ethersproject/bytes": { - "version": "5.7.0", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/constants": { - "version": "5.7.0", - "requires": { - "@ethersproject/bignumber": "^5.7.0" - } - }, - "@ethersproject/contracts": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "@ethersproject/logger": { - "version": "5.7.0" - }, - "@ethersproject/networks": { - "version": "5.7.1", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/pbkdf2": { - "version": "5.7.0", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "@ethersproject/properties": { - "version": "5.7.0", - "requires": { - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/providers": { - "version": "5.7.2", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/rlp": { - "version": "5.7.0", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/sha2": { - "version": "5.7.0", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "@ethersproject/signing-key": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/transactions": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "@ethersproject/wallet": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "5.7.1", - "requires": { - "@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": { - "version": "5.7.0", - "requires": { - "@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": { - "version": "3.2.0", - "optional": true, - "requires": {} - }, - "@grpc/grpc-js": { - "version": "1.9.13", - "requires": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - } - }, - "@grpc/proto-loader": { - "version": "0.7.10", - "requires": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.4", - "yargs": "^17.7.2" - }, - "dependencies": { - "cliui": { - "version": "8.0.1", - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - } - }, - "long": { - "version": "5.2.3" - }, - "yargs": { - "version": "17.7.2", - "requires": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - } - }, - "yargs-parser": { - "version": "21.1.1" - } - } - }, - "@improbable-eng/grpc-web": { - "version": "0.15.0", - "requires": { - "browser-headers": "^0.4.1" - } - }, - "@improbable-eng/grpc-web-node-http-transport": { - "version": "0.15.0", - "requires": {} - }, - "@injectivelabs/core-proto-ts": { - "version": "0.0.14", - "optional": true, - "requires": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" - } - }, - "@injectivelabs/exceptions": { - "version": "1.12.1", - "optional": true, - "requires": { - "@injectivelabs/grpc-web": "^0.0.1", - "@injectivelabs/ts-types": "^1.12.1", - "http-status-codes": "^2.2.0", - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" - } - }, - "@injectivelabs/grpc-web": { - "version": "0.0.1", - "optional": true, - "requires": { - "browser-headers": "^0.4.1" - } - }, - "@injectivelabs/grpc-web-node-http-transport": { - "version": "0.0.2", - "optional": true, - "requires": {} - }, - "@injectivelabs/grpc-web-react-native-transport": { - "version": "0.0.2", - "optional": true, - "requires": {} - }, - "@injectivelabs/indexer-proto-ts": { - "version": "1.10.8-rc.4", - "optional": true, - "requires": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" - } - }, - "@injectivelabs/mito-proto-ts": { - "version": "1.0.9", - "optional": true, - "requires": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" - } - }, - "@injectivelabs/networks": { - "version": "1.10.12", - "optional": true, - "requires": { - "@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" - } - }, - "@injectivelabs/sdk-ts": { - "version": "1.10.72", - "optional": true, - "requires": { - "@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" - }, - "dependencies": { - "axios": { - "version": "0.27.2", - "optional": true, - "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "bech32": { - "version": "2.0.0", - "optional": true - } - } - }, - "@injectivelabs/test-utils": { - "version": "1.12.1", - "optional": true, - "requires": { - "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" - }, - "dependencies": { - "axios": { - "version": "0.21.4", - "optional": true, - "requires": { - "follow-redirects": "^1.14.0" - } - } - } - }, - "@injectivelabs/token-metadata": { - "version": "1.12.1", - "optional": true, - "requires": { - "@injectivelabs/exceptions": "^1.12.1", - "@injectivelabs/networks": "^1.12.1", - "@injectivelabs/ts-types": "^1.12.1", - "@injectivelabs/utils": "^1.12.1", - "@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" - }, - "dependencies": { - "@injectivelabs/networks": { - "version": "1.12.1", - "optional": true, - "requires": { - "@injectivelabs/exceptions": "^1.12.1", - "@injectivelabs/ts-types": "^1.12.1", - "@injectivelabs/utils": "^1.12.1", - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" - } - }, - "@injectivelabs/utils": { - "version": "1.12.1", - "optional": true, - "requires": { - "@injectivelabs/exceptions": "^1.12.1", - "@injectivelabs/ts-types": "^1.12.1", - "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" - } - }, - "axios": { - "version": "0.21.4", - "optional": true, - "requires": { - "follow-redirects": "^1.14.0" - } - } - } - }, - "@injectivelabs/ts-types": { - "version": "1.12.1", - "optional": true, - "requires": { - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" - } - }, - "@injectivelabs/utils": { - "version": "1.10.12", - "optional": true, - "requires": { - "@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" - }, - "dependencies": { - "axios": { - "version": "0.21.4", - "optional": true, - "requires": { - "follow-redirects": "^1.14.0" - } - } - } - }, - "@ioredis/commands": { - "version": "1.2.0" - }, - "@isaacs/cliui": { - "version": "8.0.2", - "requires": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "6.0.1" - }, - "ansi-styles": { - "version": "6.2.1" - }, - "emoji-regex": { - "version": "9.2.2" - }, - "string-width": { - "version": "5.1.2", - "requires": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - } - }, - "strip-ansi": { - "version": "7.1.0", - "requires": { - "ansi-regex": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "8.1.0", - "requires": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - } - } - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1" - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15" - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@keplr-wallet/types": { - "version": "0.11.64", - "requires": { - "axios": "^0.27.2", - "long": "^4.0.0" - }, - "dependencies": { - "axios": { - "version": "0.27.2", - "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - } - } - }, - "@metamask/eth-sig-util": { - "version": "4.0.1", - "optional": true, - "requires": { - "ethereumjs-abi": "^0.6.8", - "ethereumjs-util": "^6.2.1", - "ethjs-util": "^0.1.6", - "tweetnacl": "^1.0.3", - "tweetnacl-util": "^0.15.1" - }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "4.12.0", - "optional": true - }, - "ethereumjs-util": { - "version": "6.2.1", - "optional": true, - "requires": { - "@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" - } - } - } - }, - "@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.2", - "optional": true - }, - "@mysten/bcs": { - "version": "0.7.1", - "requires": { - "bs58": "^5.0.0" - }, - "dependencies": { - "base-x": { - "version": "4.0.0" - }, - "bs58": { - "version": "5.0.0", - "requires": { - "base-x": "^4.0.0" - } - } - } - }, - "@mysten/sui.js": { - "version": "0.32.2", - "requires": { - "@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" - } - }, - "@noble/curves": { - "version": "1.2.0", - "requires": { - "@noble/hashes": "1.3.2" - } - }, - "@noble/hashes": { - "version": "1.3.2" - }, - "@one-ini/wasm": { - "version": "0.1.1" - }, - "@openzeppelin/contracts": { - "version": "4.9.3" - }, - "@osmonauts/helpers": { - "version": "0.6.0", - "requires": { - "@babel/runtime": "^7.18.9", - "@cosmjs/amino": "0.28.13", - "@cosmjs/crypto": "0.28.13", - "@cosmjs/proto-signing": "0.28.13", - "@cosmjs/stargate": "0.28.13", - "cosmjs-types": "0.5.1", - "long": "^5.2.0", - "protobufjs": "^6.11.3" - }, - "dependencies": { - "@cosmjs/amino": { - "version": "0.28.13", - "requires": { - "@cosmjs/crypto": "0.28.13", - "@cosmjs/encoding": "0.28.13", - "@cosmjs/math": "0.28.13", - "@cosmjs/utils": "0.28.13" - } - }, - "@cosmjs/crypto": { - "version": "0.28.13", - "requires": { - "@cosmjs/encoding": "0.28.13", - "@cosmjs/math": "0.28.13", - "@cosmjs/utils": "0.28.13", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.3", - "libsodium-wrappers": "^0.7.6" - } - }, - "@cosmjs/encoding": { - "version": "0.28.13", - "requires": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "@cosmjs/json-rpc": { - "version": "0.28.13", - "requires": { - "@cosmjs/stream": "0.28.13", - "xstream": "^11.14.0" - } - }, - "@cosmjs/math": { - "version": "0.28.13", - "requires": { - "bn.js": "^5.2.0" - } - }, - "@cosmjs/proto-signing": { - "version": "0.28.13", - "requires": { - "@cosmjs/amino": "0.28.13", - "@cosmjs/crypto": "0.28.13", - "@cosmjs/encoding": "0.28.13", - "@cosmjs/math": "0.28.13", - "@cosmjs/utils": "0.28.13", - "cosmjs-types": "^0.4.0", - "long": "^4.0.0" - }, - "dependencies": { - "cosmjs-types": { - "version": "0.4.1", - "requires": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "long": { - "version": "4.0.0" - } - } - }, - "@cosmjs/socket": { - "version": "0.28.13", - "requires": { - "@cosmjs/stream": "0.28.13", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" - } - }, - "@cosmjs/stargate": { - "version": "0.28.13", - "requires": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "0.28.13", - "@cosmjs/encoding": "0.28.13", - "@cosmjs/math": "0.28.13", - "@cosmjs/proto-signing": "0.28.13", - "@cosmjs/stream": "0.28.13", - "@cosmjs/tendermint-rpc": "0.28.13", - "@cosmjs/utils": "0.28.13", - "cosmjs-types": "^0.4.0", - "long": "^4.0.0", - "protobufjs": "~6.11.3", - "xstream": "^11.14.0" - }, - "dependencies": { - "cosmjs-types": { - "version": "0.4.1", - "requires": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "long": { - "version": "4.0.0" - } - } - }, - "@cosmjs/stream": { - "version": "0.28.13", - "requires": { - "xstream": "^11.14.0" - } - }, - "@cosmjs/tendermint-rpc": { - "version": "0.28.13", - "requires": { - "@cosmjs/crypto": "0.28.13", - "@cosmjs/encoding": "0.28.13", - "@cosmjs/json-rpc": "0.28.13", - "@cosmjs/math": "0.28.13", - "@cosmjs/socket": "0.28.13", - "@cosmjs/stream": "0.28.13", - "@cosmjs/utils": "0.28.13", - "axios": "^0.21.2", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, - "@cosmjs/utils": { - "version": "0.28.13" - }, - "axios": { - "version": "0.21.4", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "cosmjs-types": { - "version": "0.5.1", - "requires": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - }, - "dependencies": { - "long": { - "version": "4.0.0" - } - } - }, - "long": { - "version": "5.2.3" - }, - "protobufjs": { - "version": "6.11.4", - "requires": { - "@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" - }, - "dependencies": { - "long": { - "version": "4.0.0" - } - } - } - } - }, - "@osmonauts/lcd": { - "version": "0.8.0", - "requires": { - "@babel/runtime": "^7.19.0", - "axios": "0.27.2" - }, - "dependencies": { - "axios": { - "version": "0.27.2", - "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - } - } - }, - "@pkgjs/parseargs": { - "version": "0.11.0", - "optional": true - }, - "@project-serum/anchor": { - "version": "0.25.0", - "requires": { - "@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" - }, - "dependencies": { - "superstruct": { - "version": "0.15.5" - } - } - }, - "@project-serum/borsh": { - "version": "0.2.5", - "requires": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - } - }, - "@protobufjs/aspromise": { - "version": "1.1.2" - }, - "@protobufjs/base64": { - "version": "1.1.2" - }, - "@protobufjs/codegen": { - "version": "2.0.4" - }, - "@protobufjs/eventemitter": { - "version": "1.1.0" - }, - "@protobufjs/fetch": { - "version": "1.1.0", - "requires": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "@protobufjs/float": { - "version": "1.0.2" - }, - "@protobufjs/inquire": { - "version": "1.1.0" - }, - "@protobufjs/path": { - "version": "1.1.2" - }, - "@protobufjs/pool": { - "version": "1.1.0" - }, - "@protobufjs/utf8": { - "version": "1.1.0" - }, - "@scure/base": { - "version": "1.1.3" - }, - "@scure/bip32": { - "version": "1.3.2", - "requires": { - "@noble/curves": "~1.2.0", - "@noble/hashes": "~1.3.2", - "@scure/base": "~1.1.2" - } - }, - "@scure/bip39": { - "version": "1.2.1", - "requires": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - } - }, - "@sei-js/core": { - "version": "1.5.0", - "requires": { - "@cosmjs/amino": "0.29.5", - "@cosmjs/cosmwasm-stargate": "0.29.5", - "@cosmjs/crypto": "0.29.5", - "@cosmjs/encoding": "0.29.5", - "@cosmjs/json-rpc": "0.29.5", - "@cosmjs/math": "0.29.5", - "@cosmjs/proto-signing": "0.29.5", - "@cosmjs/stargate": "0.29.5", - "@cosmjs/tendermint-rpc": "0.29.5", - "@cosmjs/utils": "0.29.5", - "@ethersproject/keccak256": "^5.7.0", - "@keplr-wallet/types": "^0.11.41", - "@sei-js/proto": "1.3.0", - "crypto-js": "^4.1.1", - "readonly-date": "^1.0.0", - "sha.js": "^2.4.11", - "xstream": "^11.14.0" - }, - "dependencies": { - "@cosmjs/amino": { - "version": "0.29.5", - "requires": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5" - } - }, - "@cosmjs/crypto": { - "version": "0.29.5", - "requires": { - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers": "^0.7.6" - } - }, - "@cosmjs/encoding": { - "version": "0.29.5", - "requires": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "@cosmjs/json-rpc": { - "version": "0.29.5", - "requires": { - "@cosmjs/stream": "^0.29.5", - "xstream": "^11.14.0" - } - }, - "@cosmjs/math": { - "version": "0.29.5", - "requires": { - "bn.js": "^5.2.0" - } - }, - "@cosmjs/proto-signing": { - "version": "0.29.5", - "requires": { - "@cosmjs/amino": "^0.29.5", - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0" - } - }, - "@cosmjs/socket": { - "version": "0.29.5", - "requires": { - "@cosmjs/stream": "^0.29.5", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" - } - }, - "@cosmjs/stargate": { - "version": "0.29.5", - "requires": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/proto-signing": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/tendermint-rpc": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0", - "protobufjs": "~6.11.3", - "xstream": "^11.14.0" - } - }, - "@cosmjs/stream": { - "version": "0.29.5", - "requires": { - "xstream": "^11.14.0" - } - }, - "@cosmjs/tendermint-rpc": { - "version": "0.29.5", - "requires": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/json-rpc": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/socket": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "axios": "^0.21.2", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, - "@cosmjs/utils": { - "version": "0.29.5" - }, - "axios": { - "version": "0.21.4", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "cosmjs-types": { - "version": "0.5.2", - "requires": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "protobufjs": { - "version": "6.11.4", - "requires": { - "@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" - } - } - } - }, - "@sei-js/proto": { - "version": "1.3.0", - "requires": { - "@babel/runtime": "^7.18.9", - "@cosmjs/amino": "0.29.5", - "@cosmjs/encoding": "0.29.5", - "@cosmjs/proto-signing": "0.29.5", - "@cosmjs/stargate": "0.29.5", - "@cosmjs/tendermint-rpc": "0.29.5", - "@osmonauts/helpers": "^0.6.0", - "@osmonauts/lcd": "^0.8.0", - "protobufjs": "^6.11.2" - }, - "dependencies": { - "@cosmjs/amino": { - "version": "0.29.5", - "requires": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5" - } - }, - "@cosmjs/crypto": { - "version": "0.29.5", - "requires": { - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers": "^0.7.6" - } - }, - "@cosmjs/encoding": { - "version": "0.29.5", - "requires": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "@cosmjs/json-rpc": { - "version": "0.29.5", - "requires": { - "@cosmjs/stream": "^0.29.5", - "xstream": "^11.14.0" - } - }, - "@cosmjs/math": { - "version": "0.29.5", - "requires": { - "bn.js": "^5.2.0" - } - }, - "@cosmjs/proto-signing": { - "version": "0.29.5", - "requires": { - "@cosmjs/amino": "^0.29.5", - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0" - } - }, - "@cosmjs/socket": { - "version": "0.29.5", - "requires": { - "@cosmjs/stream": "^0.29.5", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" - } - }, - "@cosmjs/stargate": { - "version": "0.29.5", - "requires": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/proto-signing": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/tendermint-rpc": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "cosmjs-types": "^0.5.2", - "long": "^4.0.0", - "protobufjs": "~6.11.3", - "xstream": "^11.14.0" - } - }, - "@cosmjs/stream": { - "version": "0.29.5", - "requires": { - "xstream": "^11.14.0" - } - }, - "@cosmjs/tendermint-rpc": { - "version": "0.29.5", - "requires": { - "@cosmjs/crypto": "^0.29.5", - "@cosmjs/encoding": "^0.29.5", - "@cosmjs/json-rpc": "^0.29.5", - "@cosmjs/math": "^0.29.5", - "@cosmjs/socket": "^0.29.5", - "@cosmjs/stream": "^0.29.5", - "@cosmjs/utils": "^0.29.5", - "axios": "^0.21.2", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, - "@cosmjs/utils": { - "version": "0.29.5" - }, - "axios": { - "version": "0.21.4", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "cosmjs-types": { - "version": "0.5.2", - "requires": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - } - }, - "protobufjs": { - "version": "6.11.4", - "requires": { - "@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" - } - } - } - }, - "@solana/buffer-layout": { - "version": "4.0.1", - "requires": { - "buffer": "~6.0.3" - } - }, - "@solana/buffer-layout-utils": { - "version": "0.2.0", - "requires": { - "@solana/buffer-layout": "^4.0.0", - "@solana/web3.js": "^1.32.0", - "bigint-buffer": "^1.1.5", - "bignumber.js": "^9.0.1" - } - }, - "@solana/spl-token": { - "version": "0.3.8", - "requires": { - "@solana/buffer-layout": "^4.0.0", - "@solana/buffer-layout-utils": "^0.2.0", - "buffer": "^6.0.3" - } - }, - "@solana/web3.js": { - "version": "1.78.5", - "requires": { - "@babel/runtime": "^7.22.6", - "@noble/curves": "^1.0.0", - "@noble/hashes": "^1.3.1", - "@solana/buffer-layout": "^4.0.0", - "agentkeepalive": "^4.3.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.6.12", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" - }, - "dependencies": { - "superstruct": { - "version": "0.14.2" - } - } - }, - "@suchipi/femver": { - "version": "1.0.0" - }, - "@terra-money/legacy.proto": { - "version": "npm:@terra-money/terra.proto@0.1.7", - "requires": { - "google-protobuf": "^3.17.3", - "long": "^4.0.0", - "protobufjs": "~6.11.2" - }, - "dependencies": { - "protobufjs": { - "version": "6.11.4", - "requires": { - "@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" - } - } - } - }, - "@terra-money/terra.js": { - "version": "3.1.9", - "requires": { - "@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" - }, - "dependencies": { - "axios": { - "version": "0.27.2", - "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "bech32": { - "version": "2.0.0" - }, - "ws": { - "version": "7.5.9", - "requires": {} - } - } - }, - "@terra-money/terra.proto": { - "version": "2.1.0", - "requires": { - "@improbable-eng/grpc-web": "^0.14.1", - "google-protobuf": "^3.17.3", - "long": "^4.0.0", - "protobufjs": "~6.11.2" - }, - "dependencies": { - "@improbable-eng/grpc-web": { - "version": "0.14.1", - "requires": { - "browser-headers": "^0.4.1" - } - }, - "protobufjs": { - "version": "6.11.4", - "requires": { - "@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" - } - } - } - }, - "@tsconfig/node10": { - "version": "1.0.9" - }, - "@tsconfig/node12": { - "version": "1.0.11" - }, - "@tsconfig/node14": { - "version": "1.0.3" - }, - "@tsconfig/node16": { - "version": "1.0.4" - }, - "@typechain/ethers-v5": { - "version": "11.1.1", - "requires": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - } - }, - "@types/bn.js": { - "version": "5.1.1", - "requires": { - "@types/node": "*" - } - }, - "@types/connect": { - "version": "3.4.36", - "requires": { - "@types/node": "*" - } - }, - "@types/lodash": { - "version": "4.14.198", - "optional": true - }, - "@types/lodash.values": { - "version": "4.3.7", - "optional": true, - "requires": { - "@types/lodash": "*" - } - }, - "@types/long": { - "version": "4.0.2" - }, - "@types/node": { - "version": "20.6.2" - }, - "@types/pbkdf2": { - "version": "3.1.0", - "requires": { - "@types/node": "*" - } - }, - "@types/prettier": { - "version": "2.7.3" - }, - "@types/secp256k1": { - "version": "4.0.3", - "requires": { - "@types/node": "*" - } - }, - "@types/triple-beam": { - "version": "1.3.5" - }, - "@types/ws": { - "version": "7.4.7", - "requires": { - "@types/node": "*" - } - }, - "@wormhole-foundation/connect-sdk": { - "version": "0.4.0-beta.0", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/connect-sdk/-/connect-sdk-0.4.0-beta.0.tgz", - "integrity": "sha512-WHpJK1wVtB7nkpkUIqFQCxF22Ujz9/5e+EhADdJqb+8jMm0oPndN8cyKI4HvtTcfMq0PP/hhvUxD963XZGybeQ==", - "requires": { - "@wormhole-foundation/sdk-base": "^0.4.0-beta.0", - "@wormhole-foundation/sdk-definitions": "^0.4.0-beta.0", - "axios": "^1.4.0" - }, - "dependencies": { - "axios": { - "version": "1.6.5", - "requires": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - } - } - }, - "@wormhole-foundation/connect-sdk-evm": { - "version": "0.4.0-beta.0", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/connect-sdk-evm/-/connect-sdk-evm-0.4.0-beta.0.tgz", - "integrity": "sha512-aVA1aJtrMPPQRD0sRv6m9GmonMAvFXSrQzVAQX+D6kVwzhHU/qiwedsPbM2SzJSFVvmdarAF0A2/wnh21GkS/A==", - "requires": { - "@typechain/ethers-v6": "^0.4.0", - "@wormhole-foundation/connect-sdk": "^0.4.0-beta.0", - "ethers": "^6.5.1", - "typechain": "^8.2.0" - }, - "dependencies": { - "@typechain/ethers-v6": { - "version": "0.4.3", - "requires": { - "lodash": "^4.17.15", - "ts-essentials": "^7.0.1" - } - }, - "@types/node": { - "version": "18.15.13" - }, - "aes-js": { - "version": "4.0.0-beta.5" - }, - "ethers": { - "version": "6.9.2", - "requires": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - } - }, - "tslib": { - "version": "2.4.0" - }, - "ws": { - "version": "8.5.0", - "requires": {} - } - } - }, - "@wormhole-foundation/relayer-engine": { - "version": "git+ssh://git@github.com/wormhole-foundation/relayer-engine.git#e3c510048ef8c900769461040440b689a18d9e0d", - "integrity": "sha512-ITRYriw1VY48OjpibPytGuuFhUhgCoeSn+clUuMa0+hs6nSs3TrWEap7TFw2KTxr7+7dld4ZRPpIzA9Ocr8mMA==", - "from": "@wormhole-foundation/relayer-engine@github:wormhole-foundation/relayer-engine#e3c510048ef8c900769461040440b689a18d9e0d", - "requires": { - "@bull-board/api": "^5.8.1", - "@bull-board/koa": "^5.8.1", - "@certusone/wormhole-sdk": "^0.10.5", - "@certusone/wormhole-spydk": "^0.0.1", - "@datastructures-js/queue": "^4.2.3", - "@improbable-eng/grpc-web-node-http-transport": "^0.15.0", - "@mysten/sui.js": "^0.32.2", - "@sei-js/core": "^1.3.4", - "@xlabs-xyz/wallet-monitor": "0.2.16", - "bech32": "^2.0.0", - "bullmq": "^3.15.8", - "ethers": "^5.7.2", - "generic-pool": "^3.9.0", - "ioredis": "^5.3.2", - "koa": "^2.14.1", - "lru-cache": "^9.1.2", - "prom-client": "^14.2.0", - "winston": "^3.10.0" - }, - "dependencies": { - "bech32": { - "version": "2.0.0" - } - } - }, - "@wormhole-foundation/sdk-base": { - "version": "0.4.0-beta.0", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.4.0-beta.0.tgz", - "integrity": "sha512-+b6+5Sf30n0meC1rtdoAz5TB7mfXtYG81xAKlfeVZzl0GOYpchgGaEcWEPgOjKxPtT9eM1lo2q7KnV9zl8mgDQ==", - "requires": { - "@scure/base": "^1.1.3" - } - }, - "@wormhole-foundation/sdk-connect": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.6.7.tgz", - "integrity": "sha512-yLKxLAWUl+J/98A+BNKuqyOu0iv2TXlbbiYLTJO7iUZSB5g3dFt36UJIz4Mfvrt1TnLJbD+7Sv6t2MwIDdO3Jg==", - "requires": { - "@wormhole-foundation/sdk-base": "0.6.7", - "@wormhole-foundation/sdk-definitions": "0.6.7", - "axios": "^1.4.0" - }, - "dependencies": { - "@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", - "requires": { - "@noble/hashes": "1.4.0" - } - }, - "@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==" - }, - "@wormhole-foundation/sdk-base": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.6.7.tgz", - "integrity": "sha512-lXN7tm5O8L8nfqXD1Fhn61rTR9WjZ9khRU3tOE3b8AqjX9OxIL9/ou5BmMGaJex8AFAUgnX86pNkEEvu9Tb3hQ==", - "requires": { - "@scure/base": "^1.1.3" - } - }, - "@wormhole-foundation/sdk-definitions": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.6.7.tgz", - "integrity": "sha512-6uyfKuTHIXni4rEwoJDNW2Ahm7tABmG+Mae181TX3K4mfVznkC3YufEBlNJyt071B/RD7JJi7WZUVZ1ROG8Aow==", - "requires": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "0.6.7" - } - }, - "axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "requires": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - } - } - }, - "@wormhole-foundation/sdk-definitions": { - "version": "0.4.0-beta.0", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.4.0-beta.0.tgz", - "integrity": "sha512-LY7/H2diYqz8R7QoMochtRB9O+RUaww2Radxb89Q5ghO0mq42tHxrrwjlfqA/Rsa8YMWRJPv2rEEdeFDfzM4kQ==", - "requires": { - "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "^0.4.0-beta.0" - } - }, - "@wormhole-foundation/sdk-evm": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.6.7.tgz", - "integrity": "sha512-coQO1HaL4/GJxQ26FsgmMHY6X1iMZgHSXnCXGPmlchs5hMWraYLsxMTQ1goFSAIWQi0ALaR7tkdDDzN5y0liRw==", - "requires": { - "@wormhole-foundation/sdk-connect": "0.6.7", - "ethers": "^6.5.1" - }, - "dependencies": { - "@adraffy/ens-normalize": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", - "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" - }, - "@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "ethers": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", - "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", - "requires": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - } - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "requires": {} - } - } - }, - "@wry/context": { - "version": "0.7.3", - "optional": true, - "requires": { - "tslib": "^2.3.0" - } - }, - "@wry/equality": { - "version": "0.5.6", - "optional": true, - "requires": { - "tslib": "^2.3.0" - } - }, - "@wry/trie": { - "version": "0.4.3", - "optional": true, - "requires": { - "tslib": "^2.3.0" - } - }, - "@xlabs-xyz/wallet-monitor": { - "version": "0.2.16", - "requires": { - "@ethersproject/bignumber": "^5.7.0", - "@mysten/sui.js": "^0.32.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.74.0", - "bluebird": "^3.7.2", - "bs58": "^5.0.0", - "ethers": "^5.7.0", - "google-protobuf": "^3.21.2", - "koa": "^2.14.1", - "koa-router": "^12.0.0", - "nice-grpc": "^2.1.4", - "prom-client": "^14.2.0", - "ts-node": "^10.9.1", - "ts-proto": "^1.147.3", - "winston": "^3.8.2", - "zod": "^3.21.4" - }, - "dependencies": { - "base-x": { - "version": "4.0.0" - }, - "bs58": { - "version": "5.0.0", - "requires": { - "base-x": "^4.0.0" - } - }, - "http-errors": { - "version": "2.0.0", - "requires": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - } - }, - "koa-router": { - "version": "12.0.1", - "requires": { - "debug": "^4.3.4", - "http-errors": "^2.0.0", - "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.2.1" - } - }, - "statuses": { - "version": "2.0.1" - } - } - }, - "@xlabs/wh-swap-layer-ts-sdk": { - "version": "file:ts-sdk", - "requires": { - "@wormhole-foundation/sdk-base": "^0.6.7", - "@wormhole-foundation/sdk-definitions": "^0.6.7", - "@wormhole-foundation/sdk-evm": "^0.6.7", - "typescript": "^5.4.5" - }, - "dependencies": { - "@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", - "requires": { - "@noble/hashes": "1.4.0" - } - }, - "@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==" - }, - "@wormhole-foundation/sdk-base": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.6.7.tgz", - "integrity": "sha512-lXN7tm5O8L8nfqXD1Fhn61rTR9WjZ9khRU3tOE3b8AqjX9OxIL9/ou5BmMGaJex8AFAUgnX86pNkEEvu9Tb3hQ==", - "requires": { - "@scure/base": "^1.1.3" - } - }, - "@wormhole-foundation/sdk-definitions": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.6.7.tgz", - "integrity": "sha512-6uyfKuTHIXni4rEwoJDNW2Ahm7tABmG+Mae181TX3K4mfVznkC3YufEBlNJyt071B/RD7JJi7WZUVZ1ROG8Aow==", - "requires": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "0.6.7" - } - } - } - }, - "@xpla/xpla.js": { - "version": "0.2.3", - "requires": { - "@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" - }, - "dependencies": { - "axios": { - "version": "0.26.1", - "requires": { - "follow-redirects": "^1.14.8" - } - }, - "bech32": { - "version": "2.0.0" - }, - "ws": { - "version": "7.5.9", - "requires": {} - } - } - }, - "abbrev": { - "version": "2.0.0" - }, - "abort-controller-x": { - "version": "0.4.3" - }, - "accepts": { - "version": "1.3.8", - "requires": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - } - }, - "acorn": { - "version": "8.10.0" - }, - "acorn-walk": { - "version": "8.2.0" - }, - "aes-js": { - "version": "3.0.0" - }, - "agentkeepalive": { - "version": "4.5.0", - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "algo-msgpack-with-bigint": { - "version": "2.1.1" - }, - "algosdk": { - "version": "2.5.0", - "requires": { - "algo-msgpack-with-bigint": "^2.1.1", - "buffer": "^6.0.3", - "cross-fetch": "^4.0.0", - "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" - }, - "dependencies": { - "cross-fetch": { - "version": "4.0.0", - "requires": { - "node-fetch": "^2.6.12" - } - } - } - }, - "ansi-regex": { - "version": "5.0.1" - }, - "ansi-styles": { - "version": "4.3.0", - "requires": { - "color-convert": "^2.0.1" - } - }, - "any-promise": { - "version": "1.3.0" - }, - "aptos": { - "version": "1.5.0", - "requires": { - "@noble/hashes": "1.1.3", - "@scure/bip39": "1.1.0", - "axios": "0.27.2", - "form-data": "4.0.0", - "tweetnacl": "1.0.3" - }, - "dependencies": { - "@noble/hashes": { - "version": "1.1.3" - }, - "@scure/bip39": { - "version": "1.1.0", - "requires": { - "@noble/hashes": "~1.1.1", - "@scure/base": "~1.1.0" - } - }, - "axios": { - "version": "0.27.2", - "requires": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - } - } - }, - "arg": { - "version": "4.1.3" - }, - "array-back": { - "version": "3.1.0" - }, - "async": { - "version": "3.2.5" - }, - "asynckit": { - "version": "0.4.0" - }, - "axios": { - "version": "0.24.0", - "requires": { - "follow-redirects": "^1.14.4" - } - }, - "balanced-match": { - "version": "1.0.2" - }, - "base-x": { - "version": "3.0.9", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "base64-js": { - "version": "1.5.1" - }, - "bech32": { - "version": "1.1.4" - }, - "big-integer": { - "version": "1.6.36" - }, - "bigint-buffer": { - "version": "1.1.5", - "requires": { - "bindings": "^1.3.0" - } - }, - "bignumber.js": { - "version": "9.1.2" - }, - "binary-parser": { - "version": "2.2.1" - }, - "bindings": { - "version": "1.5.0", - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "bintrees": { - "version": "1.0.2" - }, - "bip32": { - "version": "2.0.6", - "requires": { - "@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" - }, - "dependencies": { - "@types/node": { - "version": "10.12.18" - } - } - }, - "bip39": { - "version": "3.1.0", - "requires": { - "@noble/hashes": "^1.2.0" - } - }, - "bip66": { - "version": "1.1.5", - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "blakejs": { - "version": "1.2.1" - }, - "bluebird": { - "version": "3.7.2" - }, - "bn.js": { - "version": "5.2.1" - }, - "borsh": { - "version": "0.7.0", - "requires": { - "bn.js": "^5.2.0", - "bs58": "^4.0.0", - "text-encoding-utf-8": "^1.0.2" - } - }, - "brace-expansion": { - "version": "1.1.11", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "brorand": { - "version": "1.1.0" - }, - "browser-headers": { - "version": "0.4.1" - }, - "browserify-aes": { - "version": "1.2.0", - "requires": { - "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": { - "version": "4.0.1", - "requires": { - "base-x": "^3.0.2" - } - }, - "bs58check": { - "version": "2.1.2", - "requires": { - "bs58": "^4.0.0", - "create-hash": "^1.1.0", - "safe-buffer": "^5.1.2" - } - }, - "buffer": { - "version": "6.0.3", - "requires": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "buffer-layout": { - "version": "1.2.2" - }, - "buffer-xor": { - "version": "1.0.3" - }, - "bufferutil": { - "version": "4.0.7", - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "bullmq": { - "version": "3.15.8", - "requires": { - "cron-parser": "^4.6.0", - "glob": "^8.0.3", - "ioredis": "^5.3.2", - "lodash": "^4.17.21", - "msgpackr": "^1.6.2", - "semver": "^7.3.7", - "tslib": "^2.0.0", - "uuid": "^9.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "8.1.0", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - } - }, - "minimatch": { - "version": "5.1.6", - "requires": { - "brace-expansion": "^2.0.1" - } - }, - "uuid": { - "version": "9.0.1" - } - } - }, - "cache-content-type": { - "version": "1.0.1", - "requires": { - "mime-types": "^2.1.18", - "ylru": "^1.2.0" - } - }, - "camelcase": { - "version": "5.3.1" - }, - "capability": { - "version": "0.2.5" - }, - "case-anything": { - "version": "2.1.13" - }, - "chalk": { - "version": "4.1.2", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "cliui": { - "version": "7.0.4", - "optional": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "cluster-key-slot": { - "version": "1.1.2" - }, - "co": { - "version": "4.6.0" - }, - "color": { - "version": "3.2.1", - "requires": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3" - } - } - }, - "color-convert": { - "version": "2.0.1", - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4" - }, - "color-string": { - "version": "1.9.1", - "requires": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "colorspace": { - "version": "1.1.4", - "requires": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "combined-stream": { - "version": "1.0.8", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "command-line-args": { - "version": "5.2.1", - "requires": { - "array-back": "^3.1.0", - "find-replace": "^3.0.0", - "lodash.camelcase": "^4.3.0", - "typical": "^4.0.0" - } - }, - "command-line-usage": { - "version": "6.1.3", - "requires": { - "array-back": "^4.0.2", - "chalk": "^2.4.2", - "table-layout": "^1.0.2", - "typical": "^5.2.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "requires": { - "color-convert": "^1.9.0" - } - }, - "array-back": { - "version": "4.0.2" - }, - "chalk": { - "version": "2.4.2", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3" - }, - "has-flag": { - "version": "3.0.0" - }, - "supports-color": { - "version": "5.5.0", - "requires": { - "has-flag": "^3.0.0" - } - }, - "typical": { - "version": "5.2.0" - } - } - }, - "commander": { - "version": "2.20.3" - }, - "concat-map": { - "version": "0.0.1" - }, - "condense-newlines": { - "version": "0.2.1", - "requires": { - "extend-shallow": "^2.0.1", - "is-whitespace": "^0.3.0", - "kind-of": "^3.0.2" - } - }, - "config-chain": { - "version": "1.1.13", - "requires": { - "ini": "^1.3.4", - "proto-list": "~1.2.1" - } - }, - "consolidate": { - "version": "0.16.0", - "requires": { - "bluebird": "^3.7.2" - } - }, - "content-disposition": { - "version": "0.5.4", - "requires": { - "safe-buffer": "5.2.1" - } - }, - "content-type": { - "version": "1.0.5" - }, - "cookies": { - "version": "0.9.1", - "requires": { - "depd": "~2.0.0", - "keygrip": "~1.1.0" - } - }, - "copyfiles": { - "version": "2.4.1", - "optional": true, - "requires": { - "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": { - "version": "1.0.3", - "optional": true - }, - "cosmjs-types": { - "version": "0.7.2", - "optional": true, - "requires": { - "long": "^4.0.0", - "protobufjs": "~6.11.2" - }, - "dependencies": { - "protobufjs": { - "version": "6.11.4", - "optional": true, - "requires": { - "@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" - } - } - } - }, - "crc-32": { - "version": "1.2.2", - "optional": true - }, - "create-hash": { - "version": "1.2.0", - "requires": { - "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": { - "version": "1.1.7", - "requires": { - "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": { - "version": "1.1.1" - }, - "cron-parser": { - "version": "4.9.0", - "requires": { - "luxon": "^3.2.1" - } - }, - "cross-fetch": { - "version": "3.1.8", - "requires": { - "node-fetch": "^2.6.12" - } - }, - "cross-spawn": { - "version": "7.0.3", - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-addr-codec": { - "version": "0.1.8", - "requires": { - "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": { - "version": "1.3.0" - }, - "crypto-js": { - "version": "4.2.0" - }, - "debug": { - "version": "4.3.4", - "requires": { - "ms": "2.1.2" - } - }, - "decimal.js": { - "version": "10.4.3" - }, - "deep-equal": { - "version": "1.0.1" - }, - "deep-extend": { - "version": "0.6.0" - }, - "define-data-property": { - "version": "1.1.0", - "requires": { - "get-intrinsic": "^1.2.1", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.0" - } - }, - "define-properties": { - "version": "1.2.1", - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "delay": { - "version": "5.0.0" - }, - "delayed-stream": { - "version": "1.0.0" - }, - "delegates": { - "version": "1.0.0" - }, - "denque": { - "version": "2.1.0" - }, - "depd": { - "version": "2.0.0" - }, - "destroy": { - "version": "1.2.0" - }, - "detect-libc": { - "version": "1.0.3" - }, - "diff": { - "version": "4.0.2" - }, - "dot-case": { - "version": "3.0.4", - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "dotenv": { - "version": "16.3.1" - }, - "dprint-node": { - "version": "1.0.8", - "requires": { - "detect-libc": "^1.0.3" - } - }, - "drbg.js": { - "version": "1.0.1", - "optional": true, - "requires": { - "browserify-aes": "^1.0.6", - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4" - } - }, - "eastasianwidth": { - "version": "0.2.0" - }, - "eccrypto": { - "version": "1.1.6", - "optional": true, - "requires": { - "acorn": "7.1.1", - "elliptic": "6.5.4", - "es6-promise": "4.2.8", - "nan": "2.14.0", - "secp256k1": "3.7.1" - }, - "dependencies": { - "acorn": { - "version": "7.1.1", - "optional": true - }, - "bn.js": { - "version": "4.12.0", - "optional": true - }, - "secp256k1": { - "version": "3.7.1", - "optional": true, - "requires": { - "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" - } - } - } - }, - "editorconfig": { - "version": "1.0.4", - "requires": { - "@one-ini/wasm": "0.1.1", - "commander": "^10.0.0", - "minimatch": "9.0.1", - "semver": "^7.5.3" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "commander": { - "version": "10.0.1" - }, - "minimatch": { - "version": "9.0.1", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "ee-first": { - "version": "1.1.1" - }, - "ejs": { - "version": "3.1.9", - "requires": { - "jake": "^10.8.5" - } - }, - "elliptic": { - "version": "6.5.4", - "requires": { - "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" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0" - } - } - }, - "emoji-regex": { - "version": "8.0.0" - }, - "enabled": { - "version": "2.0.0" - }, - "encodeurl": { - "version": "1.0.2" - }, - "error-polyfill": { - "version": "0.1.3", - "requires": { - "capability": "^0.2.5", - "o3": "^1.0.3", - "u3": "^0.1.1" - } - }, - "es6-promise": { - "version": "4.2.8" - }, - "es6-promisify": { - "version": "5.0.0", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "esbuild": { - "version": "0.19.11", - "requires": { - "@esbuild/aix-ppc64": "0.19.11", - "@esbuild/android-arm": "0.19.11", - "@esbuild/android-arm64": "0.19.11", - "@esbuild/android-x64": "0.19.11", - "@esbuild/darwin-arm64": "0.19.11", - "@esbuild/darwin-x64": "0.19.11", - "@esbuild/freebsd-arm64": "0.19.11", - "@esbuild/freebsd-x64": "0.19.11", - "@esbuild/linux-arm": "0.19.11", - "@esbuild/linux-arm64": "0.19.11", - "@esbuild/linux-ia32": "0.19.11", - "@esbuild/linux-loong64": "0.19.11", - "@esbuild/linux-mips64el": "0.19.11", - "@esbuild/linux-ppc64": "0.19.11", - "@esbuild/linux-riscv64": "0.19.11", - "@esbuild/linux-s390x": "0.19.11", - "@esbuild/linux-x64": "0.19.11", - "@esbuild/netbsd-x64": "0.19.11", - "@esbuild/openbsd-x64": "0.19.11", - "@esbuild/sunos-x64": "0.19.11", - "@esbuild/win32-arm64": "0.19.11", - "@esbuild/win32-ia32": "0.19.11", - "@esbuild/win32-x64": "0.19.11" - } - }, - "escalade": { - "version": "3.1.1" - }, - "escape-html": { - "version": "1.0.3" - }, - "escape-string-regexp": { - "version": "1.0.5" - }, - "eth-crypto": { - "version": "2.6.0", - "optional": true, - "requires": { - "@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" - }, - "dependencies": { - "@babel/runtime": { - "version": "7.20.13", - "optional": true, - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "node-addon-api": { - "version": "5.1.0", - "optional": true - }, - "regenerator-runtime": { - "version": "0.13.11", - "optional": true - }, - "secp256k1": { - "version": "5.0.0", - "optional": true, - "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^5.0.0", - "node-gyp-build": "^4.2.0" - } - } - } - }, - "ethereum-cryptography": { - "version": "0.1.3", - "requires": { - "@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": { - "version": "0.6.8", - "optional": true, - "requires": { - "bn.js": "^4.11.8", - "ethereumjs-util": "^6.0.0" - }, - "dependencies": { - "@types/bn.js": { - "version": "4.11.6", - "optional": true, - "requires": { - "@types/node": "*" - } - }, - "bn.js": { - "version": "4.12.0", - "optional": true - }, - "ethereumjs-util": { - "version": "6.2.1", - "optional": true, - "requires": { - "@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": { - "version": "7.1.5", - "requires": { - "@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": { - "version": "5.7.2", - "requires": { - "@ethersproject/abi": "5.7.0", - "@ethersproject/abstract-provider": "5.7.0", - "@ethersproject/abstract-signer": "5.7.0", - "@ethersproject/address": "5.7.0", - "@ethersproject/base64": "5.7.0", - "@ethersproject/basex": "5.7.0", - "@ethersproject/bignumber": "5.7.0", - "@ethersproject/bytes": "5.7.0", - "@ethersproject/constants": "5.7.0", - "@ethersproject/contracts": "5.7.0", - "@ethersproject/hash": "5.7.0", - "@ethersproject/hdnode": "5.7.0", - "@ethersproject/json-wallets": "5.7.0", - "@ethersproject/keccak256": "5.7.0", - "@ethersproject/logger": "5.7.0", - "@ethersproject/networks": "5.7.1", - "@ethersproject/pbkdf2": "5.7.0", - "@ethersproject/properties": "5.7.0", - "@ethersproject/providers": "5.7.2", - "@ethersproject/random": "5.7.0", - "@ethersproject/rlp": "5.7.0", - "@ethersproject/sha2": "5.7.0", - "@ethersproject/signing-key": "5.7.0", - "@ethersproject/solidity": "5.7.0", - "@ethersproject/strings": "5.7.0", - "@ethersproject/transactions": "5.7.0", - "@ethersproject/units": "5.7.0", - "@ethersproject/wallet": "5.7.0", - "@ethersproject/web": "5.7.1", - "@ethersproject/wordlists": "5.7.0" - } - }, - "ethjs-util": { - "version": "0.1.6", - "optional": true, - "requires": { - "is-hex-prefixed": "1.0.0", - "strip-hex-prefix": "1.0.0" - } - }, - "eventemitter3": { - "version": "4.0.7" - }, - "evp_bytestokey": { - "version": "1.0.3", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "requires": { - "is-extendable": "^0.1.0" - } - }, - "eyes": { - "version": "0.1.8" - }, - "fast-stable-stringify": { - "version": "1.0.0" - }, - "fecha": { - "version": "4.2.3" - }, - "file-uri-to-path": { - "version": "1.0.0" - }, - "filelist": { - "version": "1.0.4", - "requires": { - "minimatch": "^5.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.6", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "find-replace": { - "version": "3.0.0", - "requires": { - "array-back": "^3.0.1" - } - }, - "fn.name": { - "version": "1.1.0" - }, - "follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" - }, - "foreground-child": { - "version": "3.1.1", - "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - } - }, - "form-data": { - "version": "4.0.0", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "fresh": { - "version": "0.5.2" - }, - "fs-extra": { - "version": "7.0.1", - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "fs.realpath": { - "version": "1.0.0" - }, - "function-bind": { - "version": "1.1.1" - }, - "generic-pool": { - "version": "3.9.0" - }, - "get-caller-file": { - "version": "2.0.5" - }, - "get-intrinsic": { - "version": "1.2.1", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" - } - }, - "get-paths": { - "version": "0.0.7", - "requires": { - "pify": "^4.0.1" - } - }, - "get-tsconfig": { - "version": "4.7.2", - "requires": { - "resolve-pkg-maps": "^1.0.0" - } - }, - "glob": { - "version": "7.1.7", - "requires": { - "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": { - "version": "1.0.3", - "requires": { - "define-properties": "^1.1.3" - } - }, - "google-protobuf": { - "version": "3.21.2" - }, - "gopd": { - "version": "1.0.1", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.11" - }, - "graphql": { - "version": "16.8.0", - "optional": true - }, - "graphql-tag": { - "version": "2.12.6", - "optional": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "has": { - "version": "1.0.3", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0" - }, - "has-property-descriptors": { - "version": "1.0.0", - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1" - }, - "has-symbols": { - "version": "1.0.3" - }, - "has-tostringtag": { - "version": "1.0.0", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "hash-base": { - "version": "3.1.0", - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - } - }, - "hash.js": { - "version": "1.1.7", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hi-base32": { - "version": "0.5.1" - }, - "hmac-drbg": { - "version": "1.0.1", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "hoist-non-react-statics": { - "version": "3.3.2", - "optional": true, - "requires": { - "react-is": "^16.7.0" - } - }, - "http-assert": { - "version": "1.5.0", - "requires": { - "deep-equal": "~1.0.1", - "http-errors": "~1.8.0" - } - }, - "http-errors": { - "version": "1.8.1", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2" - } - } - }, - "http-status-codes": { - "version": "2.2.0", - "optional": true - }, - "humanize-ms": { - "version": "1.2.1", - "requires": { - "ms": "^2.0.0" - } - }, - "ieee754": { - "version": "1.2.1" - }, - "inflight": { - "version": "1.0.6", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4" - }, - "ini": { - "version": "1.3.8" - }, - "interpret": { - "version": "1.4.0", - "optional": true - }, - "ioredis": { - "version": "5.3.2", - "requires": { - "@ioredis/commands": "^1.1.1", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - } - }, - "is-arrayish": { - "version": "0.3.2" - }, - "is-buffer": { - "version": "1.1.6" - }, - "is-core-module": { - "version": "2.13.0", - "optional": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-extendable": { - "version": "0.1.1" - }, - "is-fullwidth-code-point": { - "version": "3.0.0" - }, - "is-generator-function": { - "version": "1.0.10", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-hex-prefixed": { - "version": "1.0.0", - "optional": true - }, - "is-stream": { - "version": "2.0.1" - }, - "is-whitespace": { - "version": "0.3.0" - }, - "isarray": { - "version": "0.0.1", - "optional": true - }, - "isexe": { - "version": "2.0.0" - }, - "isomorphic-ws": { - "version": "4.0.1", - "requires": {} - }, - "jackspeak": { - "version": "2.3.6", - "requires": { - "@isaacs/cliui": "^8.0.2", - "@pkgjs/parseargs": "^0.11.0" - } - }, - "jake": { - "version": "10.8.7", - "requires": { - "async": "^3.2.3", - "chalk": "^4.0.2", - "filelist": "^1.0.4", - "minimatch": "^3.1.2" - } - }, - "jayson": { - "version": "4.1.0", - "requires": { - "@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" - }, - "dependencies": { - "@types/node": { - "version": "12.20.55" - } - } - }, - "js-base64": { - "version": "3.7.5" - }, - "js-beautify": { - "version": "1.14.11", - "requires": { - "config-chain": "^1.1.13", - "editorconfig": "^1.0.3", - "glob": "^10.3.3", - "nopt": "^7.2.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "glob": { - "version": "10.3.10", - "requires": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" - } - }, - "minimatch": { - "version": "9.0.3", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "js-sha256": { - "version": "0.9.0" - }, - "js-sha3": { - "version": "0.8.0" - }, - "js-sha512": { - "version": "0.8.0" - }, - "js-tokens": { - "version": "4.0.0", - "optional": true - }, - "jscrypto": { - "version": "1.0.3" - }, - "json-bigint": { - "version": "1.0.0", - "requires": { - "bignumber.js": "^9.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1" - }, - "jsonfile": { - "version": "4.0.0", - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "jsonparse": { - "version": "1.3.1" - }, - "jsonschema": { - "version": "1.4.1", - "optional": true - }, - "JSONStream": { - "version": "1.3.5", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "keccak": { - "version": "3.0.3", - "requires": { - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0", - "readable-stream": "^3.6.0" - } - }, - "keccak256": { - "version": "1.0.6", - "optional": true, - "requires": { - "bn.js": "^5.2.0", - "buffer": "^6.0.3", - "keccak": "^3.0.2" - } - }, - "keygrip": { - "version": "1.1.0", - "requires": { - "tsscmp": "1.0.6" - } - }, - "kind-of": { - "version": "3.2.2", - "requires": { - "is-buffer": "^1.1.5" - } - }, - "koa": { - "version": "2.15.0", - "requires": { - "accepts": "^1.3.5", - "cache-content-type": "^1.0.0", - "content-disposition": "~0.5.2", - "content-type": "^1.0.4", - "cookies": "~0.9.0", - "debug": "^4.3.2", - "delegates": "^1.0.0", - "depd": "^2.0.0", - "destroy": "^1.0.4", - "encodeurl": "^1.0.2", - "escape-html": "^1.0.3", - "fresh": "~0.5.2", - "http-assert": "^1.3.0", - "http-errors": "^1.6.3", - "is-generator-function": "^1.0.7", - "koa-compose": "^4.1.0", - "koa-convert": "^2.0.0", - "on-finished": "^2.3.0", - "only": "~0.0.2", - "parseurl": "^1.3.2", - "statuses": "^1.5.0", - "type-is": "^1.6.16", - "vary": "^1.1.2" - } - }, - "koa-compose": { - "version": "4.1.0" - }, - "koa-convert": { - "version": "2.0.0", - "requires": { - "co": "^4.6.0", - "koa-compose": "^4.1.0" - } - }, - "koa-mount": { - "version": "4.0.0", - "requires": { - "debug": "^4.0.1", - "koa-compose": "^4.1.0" - } - }, - "koa-router": { - "version": "10.1.1", - "requires": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "koa-compose": "^4.1.0", - "methods": "^1.1.2", - "path-to-regexp": "^6.1.0" - } - }, - "koa-send": { - "version": "5.0.1", - "requires": { - "debug": "^4.1.1", - "http-errors": "^1.7.3", - "resolve-path": "^1.4.0" - } - }, - "koa-static": { - "version": "5.0.0", - "requires": { - "debug": "^3.1.0", - "koa-send": "^5.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "koa-views": { - "version": "7.0.2", - "requires": { - "consolidate": "^0.16.0", - "debug": "^4.1.0", - "get-paths": "0.0.7", - "koa-send": "^5.0.0", - "mz": "^2.4.0", - "pretty": "^2.0.0", - "resolve-path": "^1.4.0" - } - }, - "kuler": { - "version": "2.0.0" - }, - "libsodium": { - "version": "0.7.13" - }, - "libsodium-wrappers": { - "version": "0.7.13", - "requires": { - "libsodium": "^0.7.13" - } - }, - "link-module-alias": { - "version": "1.2.0", - "optional": true, - "requires": { - "chalk": "^2.4.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "optional": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "optional": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "optional": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "optional": true - }, - "has-flag": { - "version": "3.0.0", - "optional": true - }, - "supports-color": { - "version": "5.5.0", - "optional": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "lodash": { - "version": "4.17.21" - }, - "lodash.camelcase": { - "version": "4.3.0" - }, - "lodash.defaults": { - "version": "4.2.0" - }, - "lodash.isarguments": { - "version": "3.1.0" - }, - "lodash.values": { - "version": "4.3.0", - "optional": true - }, - "logform": { - "version": "2.6.0", - "requires": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - } - }, - "long": { - "version": "4.0.0" - }, - "loose-envify": { - "version": "1.4.0", - "optional": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, - "lower-case": { - "version": "2.0.2", - "requires": { - "tslib": "^2.0.3" - } - }, - "lru-cache": { - "version": "9.1.2" - }, - "luxon": { - "version": "3.4.4" - }, - "make-error": { - "version": "1.3.6" - }, - "map-obj": { - "version": "4.3.0", - "optional": true - }, - "md5.js": { - "version": "1.3.5", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "media-typer": { - "version": "0.3.0" - }, - "methods": { - "version": "1.1.2" - }, - "mime-db": { - "version": "1.52.0" - }, - "mime-types": { - "version": "2.1.35", - "requires": { - "mime-db": "1.52.0" - } - }, - "minimalistic-assert": { - "version": "1.0.1" - }, - "minimalistic-crypto-utils": { - "version": "1.0.1" - }, - "minimatch": { - "version": "3.1.2", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "optional": true - }, - "minipass": { - "version": "7.0.4" - }, - "mkdirp": { - "version": "1.0.4" - }, - "ms": { - "version": "2.1.2" - }, - "msgpackr": { - "version": "1.10.1", - "requires": { - "msgpackr-extract": "^3.0.2" - } - }, - "msgpackr-extract": { - "version": "3.0.2", - "optional": true, - "requires": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.2", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.2", - "node-gyp-build-optional-packages": "5.0.7" - } - }, - "mustache": { - "version": "4.2.0" - }, - "mz": { - "version": "2.7.0", - "requires": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "nan": { - "version": "2.14.0" - }, - "near-api-js": { - "version": "1.1.0", - "requires": { - "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": { - "version": "0.6.3" - }, - "nice-grpc": { - "version": "2.1.7", - "requires": { - "@grpc/grpc-js": "^1.9.5", - "abort-controller-x": "^0.4.0", - "nice-grpc-common": "^2.0.2" - } - }, - "nice-grpc-common": { - "version": "2.0.2", - "requires": { - "ts-error": "^1.0.6" - } - }, - "no-case": { - "version": "3.0.4", - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, - "node-addon-api": { - "version": "2.0.2" - }, - "node-fetch": { - "version": "2.7.0", - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "node-gyp-build": { - "version": "4.6.1" - }, - "node-gyp-build-optional-packages": { - "version": "5.0.7", - "optional": true - }, - "noms": { - "version": "0.0.0", - "optional": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "~1.0.31" - }, - "dependencies": { - "readable-stream": { - "version": "1.0.34", - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "optional": true - } - } - }, - "nopt": { - "version": "7.2.0", - "requires": { - "abbrev": "^2.0.0" - } - }, - "o3": { - "version": "1.0.3", - "requires": { - "capability": "^0.2.5" - } - }, - "object-assign": { - "version": "4.1.1" - }, - "object-keys": { - "version": "1.1.1" - }, - "on-finished": { - "version": "2.4.1", - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "requires": { - "wrappy": "1" - } - }, - "one-time": { - "version": "1.0.0", - "requires": { - "fn.name": "1.x.x" - } - }, - "only": { - "version": "0.0.2" - }, - "optimism": { - "version": "0.17.5", - "optional": true, - "requires": { - "@wry/context": "^0.7.0", - "@wry/trie": "^0.4.3", - "tslib": "^2.3.0" - } - }, - "pako": { - "version": "2.1.0" - }, - "parseurl": { - "version": "1.3.3" - }, - "path-is-absolute": { - "version": "1.0.1" - }, - "path-key": { - "version": "3.1.1" - }, - "path-parse": { - "version": "1.0.7", - "optional": true - }, - "path-scurry": { - "version": "1.10.1", - "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - } - }, - "path-to-regexp": { - "version": "6.2.1" - }, - "pbkdf2": { - "version": "3.1.2", - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, - "pify": { - "version": "4.0.1" - }, - "prettier": { - "version": "2.8.8" - }, - "pretty": { - "version": "2.0.0", - "requires": { - "condense-newlines": "^0.2.1", - "extend-shallow": "^2.0.1", - "js-beautify": "^1.6.12" - } - }, - "process-nextick-args": { - "version": "2.0.1", - "optional": true - }, - "prom-client": { - "version": "14.2.0", - "requires": { - "tdigest": "^0.1.1" - } - }, - "prop-types": { - "version": "15.8.1", - "optional": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "proto-list": { - "version": "1.2.4" - }, - "protobufjs": { - "version": "7.2.5", - "requires": { - "@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" - }, - "dependencies": { - "long": { - "version": "5.2.3" - } - } - }, - "proxy-from-env": { - "version": "1.1.0" - }, - "randombytes": { - "version": "2.1.0", - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "react-is": { - "version": "16.13.1", - "optional": true - }, - "readable-stream": { - "version": "3.6.2", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readonly-date": { - "version": "1.0.0" - }, - "rechoir": { - "version": "0.6.2", - "optional": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "redis-errors": { - "version": "1.2.0" - }, - "redis-info": { - "version": "3.1.0", - "requires": { - "lodash": "^4.17.11" - } - }, - "redis-parser": { - "version": "3.0.0", - "requires": { - "redis-errors": "^1.0.0" - } - }, - "reduce-flatten": { - "version": "2.0.0" - }, - "regenerator-runtime": { - "version": "0.14.0" - }, - "require-directory": { - "version": "2.1.1" - }, - "resolve": { - "version": "1.22.6", - "optional": true, - "requires": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-path": { - "version": "1.4.0", - "requires": { - "http-errors": "~1.6.2", - "path-is-absolute": "1.0.1" - }, - "dependencies": { - "depd": { - "version": "1.1.2" - }, - "http-errors": { - "version": "1.6.3", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" - } - }, - "inherits": { - "version": "2.0.3" - }, - "setprototypeof": { - "version": "1.1.0" - } - } - }, - "resolve-pkg-maps": { - "version": "1.0.0" - }, - "response-iterator": { - "version": "0.2.6", - "optional": true - }, - "rimraf": { - "version": "3.0.2", - "requires": { - "glob": "^7.1.3" - } - }, - "ripemd160": { - "version": "2.0.2", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "ripemd160-min": { - "version": "0.0.6" - }, - "rlp": { - "version": "2.2.7", - "requires": { - "bn.js": "^5.2.0" - } - }, - "rpc-websockets": { - "version": "7.6.0", - "requires": { - "@babel/runtime": "^7.17.2", - "bufferutil": "^4.0.1", - "eventemitter3": "^4.0.7", - "utf-8-validate": "^5.0.2", - "uuid": "^8.3.2", - "ws": "^8.5.0" - }, - "dependencies": { - "ws": { - "version": "8.14.1", - "requires": {} - } - } - }, - "rxjs": { - "version": "7.8.1", - "requires": { - "tslib": "^2.1.0" - } - }, - "safe-buffer": { - "version": "5.2.1" - }, - "safe-stable-stringify": { - "version": "2.4.3" - }, - "scrypt-js": { - "version": "3.0.1" - }, - "secp256k1": { - "version": "4.0.3", - "requires": { - "elliptic": "^6.5.4", - "node-addon-api": "^2.0.0", - "node-gyp-build": "^4.2.0" - } - }, - "semver": { - "version": "7.5.4", - "requires": { - "lru-cache": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "requires": { - "yallist": "^4.0.0" - } - } - } - }, - "setimmediate": { - "version": "1.0.5" - }, - "setprototypeof": { - "version": "1.2.0" - }, - "sha.js": { - "version": "2.4.11", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "sha3": { - "version": "2.1.4", - "requires": { - "buffer": "6.0.3" - } - }, - "shebang-command": { - "version": "2.0.0", - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0" - }, - "shelljs": { - "version": "0.8.5", - "optional": true, - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "shx": { - "version": "0.3.4", - "optional": true, - "requires": { - "minimist": "^1.2.3", - "shelljs": "^0.8.5" - } - }, - "signal-exit": { - "version": "4.1.0" - }, - "simple-swizzle": { - "version": "0.2.2", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "snake-case": { - "version": "3.0.4", - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "snakecase-keys": { - "version": "5.4.6", - "optional": true, - "requires": { - "map-obj": "^4.1.0", - "snake-case": "^3.0.4", - "type-fest": "^2.5.2" - } - }, - "stack-trace": { - "version": "0.0.10" - }, - "standard-as-callback": { - "version": "2.1.0" - }, - "statuses": { - "version": "1.5.0" - }, - "store2": { - "version": "2.14.2", - "optional": true - }, - "string_decoder": { - "version": "1.3.0", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-format": { - "version": "2.0.0" - }, - "string-width": { - "version": "4.2.3", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "string-width-cjs": { - "version": "npm:string-width@4.2.3", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "strip-ansi": { - "version": "6.0.1", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-ansi-cjs": { - "version": "npm:strip-ansi@6.0.1", - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-hex-prefix": { - "version": "1.0.0", - "optional": true, - "requires": { - "is-hex-prefixed": "1.0.0" - } - }, - "superstruct": { - "version": "1.0.3" - }, - "supports-color": { - "version": "7.2.0", - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "optional": true - }, - "symbol-observable": { - "version": "4.0.0", - "optional": true - }, - "table-layout": { - "version": "1.0.2", - "requires": { - "array-back": "^4.0.1", - "deep-extend": "~0.6.0", - "typical": "^5.2.0", - "wordwrapjs": "^4.0.0" - }, - "dependencies": { - "array-back": { - "version": "4.0.2" - }, - "typical": { - "version": "5.2.0" - } - } - }, - "tdigest": { - "version": "0.1.2", - "requires": { - "bintrees": "1.0.2" - } - }, - "text-encoding-utf-8": { - "version": "1.0.2" - }, - "text-hex": { - "version": "1.0.0" - }, - "thenify": { - "version": "3.3.1", - "requires": { - "any-promise": "^1.0.0" - } - }, - "thenify-all": { - "version": "1.6.0", - "requires": { - "thenify": ">= 3.1.0 < 4" - } - }, - "through": { - "version": "2.3.8" - }, - "through2": { - "version": "2.0.5", - "optional": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "optional": true - }, - "readable-stream": { - "version": "2.3.8", - "optional": true, - "requires": { - "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" - } - }, - "safe-buffer": { - "version": "5.1.2", - "optional": true - }, - "string_decoder": { - "version": "1.1.1", - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tiny-secp256k1": { - "version": "1.1.6", - "requires": { - "bindings": "^1.3.0", - "bn.js": "^4.11.8", - "create-hmac": "^1.1.7", - "elliptic": "^6.4.0", - "nan": "^2.13.2" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0" - } - } - }, - "tmp": { - "version": "0.2.1", - "requires": { - "rimraf": "^3.0.0" - } - }, - "toidentifier": { - "version": "1.0.1" - }, - "toml": { - "version": "3.0.0" - }, - "tr46": { - "version": "0.0.3" - }, - "triple-beam": { - "version": "1.4.1" - }, - "ts-command-line-args": { - "version": "2.5.1", - "requires": { - "chalk": "^4.1.0", - "command-line-args": "^5.1.1", - "command-line-usage": "^6.1.0", - "string-format": "^2.0.0" - } - }, - "ts-error": { - "version": "1.0.6" - }, - "ts-essentials": { - "version": "7.0.3", - "requires": {} - }, - "ts-invariant": { - "version": "0.10.3", - "optional": true, - "requires": { - "tslib": "^2.1.0" - } - }, - "ts-node": { - "version": "10.9.1", - "requires": { - "@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" - } - }, - "ts-poet": { - "version": "6.6.0", - "requires": { - "dprint-node": "^1.0.7" - } - }, - "ts-proto": { - "version": "1.166.2", - "requires": { - "case-anything": "^2.1.13", - "protobufjs": "^7.2.4", - "ts-poet": "^6.5.0", - "ts-proto-descriptors": "1.15.0" - } - }, - "ts-proto-descriptors": { - "version": "1.15.0", - "requires": { - "long": "^5.2.3", - "protobufjs": "^7.2.4" - }, - "dependencies": { - "long": { - "version": "5.2.3" - } - } - }, - "tslib": { - "version": "2.6.2" - }, - "tsscmp": { - "version": "1.0.6" - }, - "tsx": { - "version": "4.7.0", - "requires": { - "esbuild": "~0.19.10", - "fsevents": "~2.3.3", - "get-tsconfig": "^4.7.2" - } - }, - "tweetnacl": { - "version": "1.0.3" - }, - "tweetnacl-util": { - "version": "0.15.1", - "optional": true - }, - "type-fest": { - "version": "2.19.0", - "optional": true - }, - "type-is": { - "version": "1.6.18", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "typechain": { - "version": "8.3.1", - "requires": { - "@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": { - "version": "1.18.0" - }, - "typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==" - }, - "typical": { - "version": "4.0.0" - }, - "u3": { - "version": "0.1.1" - }, - "universalify": { - "version": "0.1.2" - }, - "untildify": { - "version": "4.0.0", - "optional": true - }, - "utf-8-validate": { - "version": "5.0.10", - "requires": { - "node-gyp-build": "^4.3.0" - } - }, - "util-deprecate": { - "version": "1.0.2" - }, - "uuid": { - "version": "8.3.2" - }, - "v8-compile-cache-lib": { - "version": "3.0.1" - }, - "vary": { - "version": "1.1.2" - }, - "vlq": { - "version": "2.0.4" - }, - "webidl-conversions": { - "version": "3.0.1" - }, - "whatwg-url": { - "version": "5.0.0", - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "which": { - "version": "2.0.2", - "requires": { - "isexe": "^2.0.0" - } - }, - "wif": { - "version": "2.0.6", - "requires": { - "bs58check": "<3.0.0" - } - }, - "winston": { - "version": "3.11.0", - "requires": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - } - }, - "winston-transport": { - "version": "4.6.0", - "requires": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - } - }, - "wordwrapjs": { - "version": "4.0.1", - "requires": { - "reduce-flatten": "^2.0.0", - "typical": "^5.2.0" - }, - "dependencies": { - "typical": { - "version": "5.2.0" - } - } - }, - "wrap-ansi": { - "version": "7.0.0", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrap-ansi-cjs": { - "version": "npm:wrap-ansi@7.0.0", - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - }, - "wrappy": { - "version": "1.0.2" - }, - "ws": { - "version": "7.4.6", - "requires": {} - }, - "xstream": { - "version": "11.14.0", - "requires": { - "globalthis": "^1.0.1", - "symbol-observable": "^2.0.3" - }, - "dependencies": { - "symbol-observable": { - "version": "2.0.3" - } - } - }, - "xtend": { - "version": "4.0.2", - "optional": true - }, - "y18n": { - "version": "5.0.8" - }, - "yallist": { - "version": "4.0.0" - }, - "yargs": { - "version": "16.2.0", - "optional": true, - "requires": { - "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" - } - }, - "yargs-parser": { - "version": "20.2.9", - "optional": true - }, - "ylru": { - "version": "1.3.2" - }, - "yn": { - "version": "3.1.1" - }, - "zen-observable": { - "version": "0.8.15", - "optional": true - }, - "zen-observable-ts": { - "version": "1.2.5", - "optional": true, - "requires": { - "zen-observable": "0.8.15" - } - }, - "zod": { - "version": "3.22.4" - } - } -} diff --git a/evm/package.json b/evm/package.json deleted file mode 100644 index 6a6bdb22..00000000 --- a/evm/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "@xlabs.xyz/swap-layer", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "startLocalBaseSepolia": "anvil --fork-url https://sepolia.base.org --port 8546", - "startLocalArbitrumSepolia": "anvil --fork-url https://public.stackup.sh/api/v1/node/arbitrum-sepolia --port 8547", - "startLocalFuji": "anvil --fork-url https://api.avax-test.network/ext/bc/C/rpc --port 8548", - "deployLocalTestnet": "ENV=localTestnet sh ./ts-scripts/shell/deploySwapLayer.sh", - "configureLocalTestnet": "ENV=localTestnet sh ./ts-scripts/shell/configureSwapLayer.sh", - "updateFeesLocalTestnet": "ENV=localTestnet sh ./ts-scripts/shell/updateFeesSwapLayer.sh", - "runAllLocalTestnet": "ENV=localTestnet sh ./ts-scripts/shell/fullDeployAndConfigure.sh", - "runAllTestnet": "ENV=testnet sh ./ts-scripts/shell/fullDeployAndConfigure.sh", - "testRegularSendTestnet": "ENV=testnet sh ./ts-scripts/shell/testRegularSend.sh", - "testRegularSendLocal": "ENV=localTestnet sh ./ts-scripts/shell/testRegularSend.sh", - "testFastSendTestnet": "ENV=testnet sh ./ts-scripts/shell/testFastSend.sh", - "deployTestnet": "ENV=testnet sh ./ts-scripts/shell/deploySwapLayer.sh", - "configureTestnet": "ENV=testnet sh ./ts-scripts/shell/configureSwapLayer.sh", - "spy:testnet": "docker run --platform=linux/amd64 -p 7073:7073 --entrypoint /guardiand ghcr.io/wormhole-foundation/guardiand:latest spy --nodeKey /node.key --spyRPC \"[::]:7073\" --network /wormhole/testnet/2/1 --bootstrap /dns4/wormhole-testnet-v2-bootstrap.certus.one/udp/8999/quic/p2p/12D3KooWAkB9ynDur1Jtoa97LBUp8RXdhzS5uHgAfdTquJbrbN7i", - "spy:mainnet": "docker run --platform=linux/amd64 -p 7073:7073 --entrypoint /guardiand ghcr.io/wormhole-foundation/guardiand:latest spy --nodeKey /node.key --spyRPC \"[::]:7073\" --network /wormhole/mainnet/2 --bootstrap /dns4/wormhole-mainnet-v2-bootstrap.certus.one/udp/8999/quic/p2p/12D3KooWQp644DK27fd3d4Km3jr7gHiuJJ5ZGmy8hH4py7fP4FP7,/dns4/wormhole-v2-mainnet-bootstrap.xlabs.xyz/udp/8999/quic/p2p/12D3KooWNQ9tVrcb64tw6bNs2CaNrUGPM7yRrKvBBheQ5yCyPHKC", - "build": "make build && npx typechain --target=ethers-v5 --out-dir=./ethers-contracts `find ./out/ -name \"*.json\"` --show-stack-traces" - }, - "author": "", - "license": "ISC", - "dependencies": { - "@certusone/wormhole-sdk": "^0.10.3", - "@openzeppelin/contracts": "^4.9.3", - "@typechain/ethers-v5": "^11.1.1", - "@wormhole-foundation/connect-sdk": "^0.4.0-beta.0", - "@wormhole-foundation/connect-sdk-evm": "^0.4.0-beta.0", - "@wormhole-foundation/relayer-engine": "github:wormhole-foundation/relayer-engine#e3c510048ef8c900769461040440b689a18d9e0d", - "@xlabs/wh-swap-layer-ts-sdk": "file:ts-sdk", - "dotenv": "^16.3.1", - "ts-node": "^10.9.1", - "tsx": "^4.7.0", - "typechain": "^8.1.1", - "typescript": "^5.2.2" - } -} diff --git a/evm/ts-sdk/package-lock.json b/evm/ts-sdk/package-lock.json deleted file mode 100644 index 366ded44..00000000 --- a/evm/ts-sdk/package-lock.json +++ /dev/null @@ -1,481 +0,0 @@ -{ - "name": "@xlabs/wh-swap-layer-ts-sdk", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "@xlabs/wh-swap-layer-ts-sdk", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@wormhole-foundation/sdk-base": "^0.6.7", - "@wormhole-foundation/sdk-definitions": "^0.6.7", - "@wormhole-foundation/sdk-evm": "^0.6.7", - "typescript": "^5.4.5" - } - }, - "node_modules/@adraffy/ens-normalize": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" - }, - "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/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@scure/base": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", - "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==", - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "node_modules/@wormhole-foundation/sdk-base": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.6.7.tgz", - "integrity": "sha512-lXN7tm5O8L8nfqXD1Fhn61rTR9WjZ9khRU3tOE3b8AqjX9OxIL9/ou5BmMGaJex8AFAUgnX86pNkEEvu9Tb3hQ==", - "dependencies": { - "@scure/base": "^1.1.3" - } - }, - "node_modules/@wormhole-foundation/sdk-connect": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.6.7.tgz", - "integrity": "sha512-yLKxLAWUl+J/98A+BNKuqyOu0iv2TXlbbiYLTJO7iUZSB5g3dFt36UJIz4Mfvrt1TnLJbD+7Sv6t2MwIDdO3Jg==", - "dependencies": { - "@wormhole-foundation/sdk-base": "0.6.7", - "@wormhole-foundation/sdk-definitions": "0.6.7", - "axios": "^1.4.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/sdk-definitions": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.6.7.tgz", - "integrity": "sha512-6uyfKuTHIXni4rEwoJDNW2Ahm7tABmG+Mae181TX3K4mfVznkC3YufEBlNJyt071B/RD7JJi7WZUVZ1ROG8Aow==", - "dependencies": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "0.6.7" - } - }, - "node_modules/@wormhole-foundation/sdk-definitions/node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", - "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@wormhole-foundation/sdk-evm": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.6.7.tgz", - "integrity": "sha512-coQO1HaL4/GJxQ26FsgmMHY6X1iMZgHSXnCXGPmlchs5hMWraYLsxMTQ1goFSAIWQi0ALaR7tkdDDzN5y0liRw==", - "dependencies": { - "@wormhole-foundation/sdk-connect": "0.6.7", - "ethers": "^6.5.1" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "node_modules/axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", - "dependencies": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "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==", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ethers": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.9.2.tgz", - "integrity": "sha512-YpkrtILnMQz5jSEsJQRTpduaGT/CXuLnUIuOYzHA0v/7c8IX91m2J48wSKjzGL5L9J/Us3tLoUdb+OwE3U+FFQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/ethers/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/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "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==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "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==", - "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==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "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==" - }, - "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "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 - } - } - } - }, - "dependencies": { - "@adraffy/ens-normalize": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.0.tgz", - "integrity": "sha512-nA9XHtlAkYfJxY7bce8DcN7eKxWWCWkU+1GR9d+U6MbNpfwQp8TI7vqOsBsMcHoT4mBu2kypKoSKnghEzOOq5Q==" - }, - "@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", - "requires": { - "@noble/hashes": "1.3.2" - }, - "dependencies": { - "@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" - } - } - }, - "@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==" - }, - "@scure/base": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.5.tgz", - "integrity": "sha512-Brj9FiG2W1MRQSTB212YVPRrcbjkv48FoZi/u4l/zds/ieRrqsh7aUf6CLwkAq61oKXr/ZlTzlY66gLIj3TFTQ==" - }, - "@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "@wormhole-foundation/sdk-base": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.6.7.tgz", - "integrity": "sha512-lXN7tm5O8L8nfqXD1Fhn61rTR9WjZ9khRU3tOE3b8AqjX9OxIL9/ou5BmMGaJex8AFAUgnX86pNkEEvu9Tb3hQ==", - "requires": { - "@scure/base": "^1.1.3" - } - }, - "@wormhole-foundation/sdk-connect": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.6.7.tgz", - "integrity": "sha512-yLKxLAWUl+J/98A+BNKuqyOu0iv2TXlbbiYLTJO7iUZSB5g3dFt36UJIz4Mfvrt1TnLJbD+7Sv6t2MwIDdO3Jg==", - "requires": { - "@wormhole-foundation/sdk-base": "0.6.7", - "@wormhole-foundation/sdk-definitions": "0.6.7", - "axios": "^1.4.0" - } - }, - "@wormhole-foundation/sdk-definitions": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.6.7.tgz", - "integrity": "sha512-6uyfKuTHIXni4rEwoJDNW2Ahm7tABmG+Mae181TX3K4mfVznkC3YufEBlNJyt071B/RD7JJi7WZUVZ1ROG8Aow==", - "requires": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "0.6.7" - }, - "dependencies": { - "@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", - "requires": { - "@noble/hashes": "1.4.0" - } - } - } - }, - "@wormhole-foundation/sdk-evm": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.6.7.tgz", - "integrity": "sha512-coQO1HaL4/GJxQ26FsgmMHY6X1iMZgHSXnCXGPmlchs5hMWraYLsxMTQ1goFSAIWQi0ALaR7tkdDDzN5y0liRw==", - "requires": { - "@wormhole-foundation/sdk-connect": "0.6.7", - "ethers": "^6.5.1" - } - }, - "aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" - }, - "axios": { - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz", - "integrity": "sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==", - "requires": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" - }, - "ethers": { - "version": "6.9.2", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.9.2.tgz", - "integrity": "sha512-YpkrtILnMQz5jSEsJQRTpduaGT/CXuLnUIuOYzHA0v/7c8IX91m2J48wSKjzGL5L9J/Us3tLoUdb+OwE3U+FFQ==", - "requires": { - "@adraffy/ens-normalize": "1.10.0", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "dependencies": { - "@noble/hashes": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.2.tgz", - "integrity": "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==" - } - } - }, - "follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==" - }, - "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==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "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==", - "requires": { - "mime-db": "1.52.0" - } - }, - "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==" - }, - "tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==" - }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "requires": {} - } - } -} diff --git a/evm/ts-sdk/package.json b/evm/ts-sdk/package.json index b88a9fe8..83664eb3 100644 --- a/evm/ts-sdk/package.json +++ b/evm/ts-sdk/package.json @@ -1,5 +1,5 @@ { - "name": "@xlabs/wh-swap-layer-ts-sdk", + "name": "@wormhole-foundation/swap-layer-evm", "version": "1.0.0", "description": "", "main": "lib/cjs/index.js", @@ -10,9 +10,9 @@ "author": "", "license": "ISC", "dependencies": { - "@wormhole-foundation/sdk-base": "^0.6.7", - "@wormhole-foundation/sdk-definitions": "^0.6.7", - "@wormhole-foundation/sdk-evm": "^0.6.7", + "@wormhole-foundation/sdk-base": "^0.6.8", + "@wormhole-foundation/sdk-definitions": "^0.6.8", + "@wormhole-foundation/sdk-evm": "^0.6.8", "typescript": "^5.4.5" } } diff --git a/lib/example-liquidity-layer b/lib/example-liquidity-layer new file mode 160000 index 00000000..d369fbf0 --- /dev/null +++ b/lib/example-liquidity-layer @@ -0,0 +1 @@ +Subproject commit d369fbf0c616da9bfdbdedd5b026f2b3382a3fa1 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..da093fba --- /dev/null +++ b/package-lock.json @@ -0,0 +1,14154 @@ +{ + "name": "@wormhole-foundation/swap-layer", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@wormhole-foundation/swap-layer", + "version": "0.0.1", + "workspaces": [ + "evm/ts-sdk", + "solana" + ], + "dependencies": { + "@wormhole-foundation/sdk": "^0.6.8" + }, + "devDependencies": { + "@types/chai": "^4.3.5", + "@types/jest": "^29.5.12", + "@types/node": "^20.4.1", + "chai": "^4.3.7", + "chai-as-promised": "^7.1.1", + "jest": "^29.7.0", + "prettier": "^3.0.3", + "ts-jest": "^29.1.2", + "ts-node": "^10.9.1", + "typescript": "5.4.5" + } + }, + "evm/ts-sdk": { + "name": "@wormhole-foundation/swap-layer-evm", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "@wormhole-foundation/sdk-base": "^0.6.8", + "@wormhole-foundation/sdk-definitions": "^0.6.8", + "@wormhole-foundation/sdk-evm": "^0.6.8", + "typescript": "^5.4.5" + } + }, + "node_modules/@0no-co/graphql.web": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.7.tgz", + "integrity": "sha512-E3Qku4mTzdrlwVWGPxklDnME5ANrEGetvYw4i2GCRlppWXXE4QD66j7pwb8HelZwS6LnqEChhrSOGCXpbiu6MQ==", + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "graphql": { + "optional": true + } + } + }, + "node_modules/@0no-co/graphqlsp": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.12.2.tgz", + "integrity": "sha512-bUYuwoHuvlTIZZpt2l0furjcNMpd80T5JB4YzmOdcv+wlndHpRWeFwgnGH7qgyy986oGKxgomS0oBXjxmEMtYg==", + "dependencies": { + "@gql.tada/internal": "^0.3.0", + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "node-fetch": "^2.0.0" + }, + "peerDependencies": { + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "typescript": "^5.0.0" + } + }, + "node_modules/@0no-co/graphqlsp/node_modules/@gql.tada/internal": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-0.3.3.tgz", + "integrity": "sha512-lBOiN0c/Fx5eY5KGwkzB5+6asUv9IAoD6f5rZjN8r9h4hvSk4V5Kuuu6EfKixF6h5/o/xDRgA/BU3355udnK3g==", + "dependencies": { + "@0no-co/graphql.web": "^1.0.5" + }, + "peerDependencies": { + "graphql": "^16.8.1", + "typescript": "^5.0.0" + } + }, + "node_modules/@adraffy/ens-normalize": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", + "integrity": "sha512-96Z2IP3mYmF1Xg2cDm8f1gWGf/HUVedQ3FMifV4kG/PQ4yEP51xDtRAEfhVNt5f/uzpNkZHwWQuUcu6D6K+Ekw==" + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@apollo/client": { + "version": "3.10.3", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.10.3.tgz", + "integrity": "sha512-4EIgZnFmRO1laWv3NCxlVIxcvimG63djuAXvyXhpQH3wkNMv9SykrasKRN08+z+cn/fVisBOLmkSRdyNyP9f4A==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@wry/caches": "^1.0.0", + "@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", + "rehackt": "^0.1.0", + "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": "^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/@aptos-labs/aptos-client": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@aptos-labs/aptos-client/-/aptos-client-0.1.0.tgz", + "integrity": "sha512-q3s6pPq8H2buGp+tPuIRInWsYOuhSEwuNJPwd2YnsiID3YSLihn2ug39ktDJAcSOprUcp7Nid8WK7hKqnUmSdA==", + "dependencies": { + "axios": "1.6.2", + "got": "^11.8.6" + }, + "engines": { + "node": ">=15.10.0" + } + }, + "node_modules/@aptos-labs/aptos-client/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/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.5.tgz", + "integrity": "sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.24.5", + "@babel/helpers": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.5.tgz", + "integrity": "sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.5.tgz", + "integrity": "sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.24.3", + "@babel/helper-simple-access": "^7.24.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/helper-validator-identifier": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.5.tgz", + "integrity": "sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.5.tgz", + "integrity": "sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.5.tgz", + "integrity": "sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.5.tgz", + "integrity": "sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.24.0", + "@babel/traverse": "^7.24.5", + "@babel/types": "^7.24.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", + "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", + "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", + "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", + "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/parser": "^7.24.0", + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.5.tgz", + "integrity": "sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.24.5", + "@babel/parser": "^7.24.5", + "@babel/types": "^7.24.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@certusone/wormhole-sdk": { + "version": "0.10.15", + "resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk/-/wormhole-sdk-0.10.15.tgz", + "integrity": "sha512-XECfrvdYjsGPZWyR1bqWCPOiRw7+6upszpSvAXjKIqEnTNXOCYRkt5ae8TVh5oZxPjpts2X3t4Oi9WGcEssHpQ==", + "dependencies": { + "@certusone/wormhole-sdk-proto-web": "0.0.7", + "@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.7", + "resolved": "https://registry.npmjs.org/@certusone/wormhole-sdk-proto-web/-/wormhole-sdk-proto-web-0.0.7.tgz", + "integrity": "sha512-GCe1/bcqMS0Mt+hsWp4SE4NLL59pWmK0lhQXO0oqAKl0G9AuuTdudySMDF/sLc7z5H2w34bSuSrIEKvPuuSC+w==", + "dependencies": { + "@improbable-eng/grpc-web": "^0.15.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.5.6" + } + }, + "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==", + "dependencies": { + "@types/long": "^4.0.2", + "@types/node": "^18.0.3" + } + }, + "node_modules/@certusone/wormhole-sdk-wasm/node_modules/@types/node": { + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@certusone/wormhole-sdk/node_modules/@solana/spl-token": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.11.tgz", + "integrity": "sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==", + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "@solana/spl-token-metadata": "^0.1.2", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.88.0" + } + }, + "node_modules/@certusone/wormhole-spydk": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@certusone/wormhole-spydk/-/wormhole-spydk-0.0.1.tgz", + "integrity": "sha512-iBQoY3UnmGoWHcbn0FypA6hKsANhdHKi03UN0GPoDAeMY12j8ly+7r462TfLl5f4hOJVQd3UZ2qviohEmdicmg==", + "dependencies": { + "@grpc/grpc-js": "^1.4.4", + "protobufjs": "^6.11.2" + } + }, + "node_modules/@certusone/wormhole-spydk/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "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/@classic-terra/terra.proto/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "engines": { + "node": ">=0.1.90" + } + }, + "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==", + "dependencies": { + "@noble/hashes": "^1.0.0", + "protobufjs": "^6.8.8" + } + }, + "node_modules/@confio/ics23/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/@coral-xyz/anchor": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.0.tgz", + "integrity": "sha512-qreDh5ztiRHVnCbJ+RS70NJ6aSTPBYDAgFeQ7Z5QvaT5DcDIhNyt4onOciVz2ieIE1XWePOJDDu9SbNvPGBkvQ==", + "dependencies": { + "@coral-xyz/borsh": "^0.30.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@coral-xyz/anchor/node_modules/@coral-xyz/borsh": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.0.tgz", + "integrity": "sha512-OrcV+7N10cChhgDRUxM4iEIuwxUHHs52XD85R8cFCUqE0vbLYrcoPPPs+VF6kZ9DhdJGVW2I6DHJOp5TykyZog==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "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/cosmwasm-stargate": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.32.3.tgz", + "integrity": "sha512-pqkt+QsLIPNMTRh9m+igJgIpzXXgn1BxmxfAb9zlC23kvsuzY/12un9M7iAdim1NwKXDFeYw46xC2YkprwQp+g==", + "dependencies": { + "@cosmjs/amino": "^0.32.3", + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/proto-signing": "^0.32.3", + "@cosmjs/stargate": "^0.32.3", + "@cosmjs/tendermint-rpc": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0", + "pako": "^2.0.2" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/amino": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", + "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", + "dependencies": { + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/crypto": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", + "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", + "dependencies": { + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", + "elliptic": "^6.5.4", + "libsodium-wrappers-sumo": "^0.7.11" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/encoding": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", + "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", + "dependencies": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/json-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", + "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", + "dependencies": { + "@cosmjs/stream": "^0.32.3", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/math": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", + "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", + "dependencies": { + "bn.js": "^5.2.0" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/proto-signing": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", + "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", + "dependencies": { + "@cosmjs/amino": "^0.32.3", + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/socket": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", + "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", + "dependencies": { + "@cosmjs/stream": "^0.32.3", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/stargate": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", + "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", + "dependencies": { + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/proto-signing": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/tendermint-rpc": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/stream": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", + "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", + "dependencies": { + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/tendermint-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", + "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", + "dependencies": { + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/json-rpc": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/socket": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "axios": "^1.6.0", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/utils": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", + "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "node_modules/@cosmjs/cosmwasm-stargate/node_modules/cosmjs-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", + "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" + }, + "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/stargate/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "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==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/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==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "dependencies": { + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@ensdomains/ens-validation": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ens-validation/-/ens-validation-0.1.0.tgz", + "integrity": "sha512-rbDh2K6GfqXvBcJUISaTTYEt3f079WA4ohTE5Lh4/8EaaPAk/9vk3EisMUQV2UVxeFIZQEEyRCIOmRTpqN0W7A==" + }, + "node_modules/@ensdomains/eth-ens-namehash": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@ensdomains/eth-ens-namehash/-/eth-ens-namehash-2.0.15.tgz", + "integrity": "sha512-JRDFP6+Hczb1E0/HhIg0PONgBYasfGfDheujmfxaZaAv/NAH4jE6Kf48WbqfRZdxt4IZI3jl3Ri7sZ1nP09lgw==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "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.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" + } + ], + "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/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" + } + ], + "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/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" + } + ], + "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/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" + } + ], + "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/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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0" + } + }, + "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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" + } + }, + "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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } + }, + "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" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "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" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.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" + } + ], + "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/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" + } + ], + "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/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" + } + ], + "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/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" + } + ], + "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/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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.0" + } + }, + "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" + } + ] + }, + "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" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" + } + }, + "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" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.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/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, + "node_modules/@ethersproject/providers/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==", + "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/@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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "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" + } + ], + "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/elliptic": { + "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" + } + }, + "node_modules/@ethersproject/signing-key/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==" + }, + "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" + } + ], + "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/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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "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" + } + ], + "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/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" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "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" + } + ], + "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/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" + } + ], + "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/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" + } + ], + "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/@gql.tada/cli-utils": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@gql.tada/cli-utils/-/cli-utils-1.3.4.tgz", + "integrity": "sha512-IHDJypDIIScs25pmsOrwlPy1MDnOwwzUKN+C9nLsQW0cW2c1S/L8K7FT9XUWH9qOjt7Q5K13GKWD3clfzlByuQ==", + "dependencies": { + "@0no-co/graphqlsp": "^1.12.1", + "@gql.tada/internal": "0.4.0", + "@vue/compiler-dom": "^3.4.23", + "@vue/language-core": "^2.0.0", + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "svelte2tsx": "^0.7.6" + }, + "peerDependencies": { + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "typescript": "^5.0.0" + } + }, + "node_modules/@gql.tada/internal": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-0.4.0.tgz", + "integrity": "sha512-VPJkuGcFu6dd6WPjhDK/FKcrCWtmSfb6KIFStSJc8yENLJeDkRBXm/H41lETPACHoP9N3WDh+VWgwuUAubcAVQ==", + "dependencies": { + "@0no-co/graphql.web": "^1.0.5" + }, + "peerDependencies": { + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "typescript": "^5.0.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==", + "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/@grpc/grpc-js": { + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.7.tgz", + "integrity": "sha512-ZMBVjSeDAz3tFSehyO6Pd08xZT1HfIwq3opbeM4cDlBh52gmwp0wVIPcQur53NN0ac68HMZ/7SF2rGRD5KmVmg==", + "dependencies": { + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" + }, + "engines": { + "node": ">=12.10.0" + } + }, + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@grpc/proto-loader/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/@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/@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/dmm-proto-ts": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/@injectivelabs/dmm-proto-ts/-/dmm-proto-ts-1.0.19.tgz", + "integrity": "sha512-2FCzCziy1RhzmnkAVIU+Asby/GXAVQqKt5/o1s52j0LJXfJMpiCrV6soLfnjTebj61T+1WvJBPFoZCCiVYBpcw==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@injectivelabs/exceptions": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/exceptions/-/exceptions-1.14.6.tgz", + "integrity": "sha512-A+URJwygeDjFPhulGMNVw70z738NtpIiCr0W8q4Kr4Ggg30i+AaVAjViYLm56pSMXXpomu9CYJ/sY6ijQn48IQ==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "@injectivelabs/ts-types": "^1.14.6", + "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==", + "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==", + "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==", + "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/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/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.4", + "resolved": "https://registry.npmjs.org/@injectivelabs/test-utils/-/test-utils-1.14.4.tgz", + "integrity": "sha512-M7UoB5CIVVN7BtdmU26GwZsWKp0BQg9qV5a+YvcdhlwlSIkvt3gKVKBMq/vKClCakOu2AjhCVGDMZVnagIBogg==", + "hasInstallScript": 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==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@injectivelabs/token-metadata": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/@injectivelabs/token-metadata/-/token-metadata-1.14.7.tgz", + "integrity": "sha512-RRRuyirzoThwQ5P8D3STH2YOavGsdnetQy6ZPQ8yA7VUavt00KBB26M92zSLbiUz5VrxhPHDCEEkuJVWx+xtmw==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/networks": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "@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.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", + "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" + } + }, + "node_modules/@injectivelabs/token-metadata/node_modules/@injectivelabs/utils": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", + "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "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==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@injectivelabs/ts-types": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/ts-types/-/ts-types-1.14.6.tgz", + "integrity": "sha512-/Ax5eCSfE9OhcyUc9wZk/LFKTYhIY9RJIaNT/n92rbHjXSfXRLSX+Bvk62vC9Ej+SEBPp77WYngtrePPA1HEgw==", + "hasInstallScript": 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/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/console/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/@jest/console/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/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==", + "dev": true + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/@jest/core/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/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==", + "dev": true + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/@jest/reporters/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/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==", + "dev": true + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/@jest/transform/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/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==", + "dev": true + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/@jest/types/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/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==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "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.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, + "node_modules/@jup-ag/api": { + "version": "6.0.20", + "resolved": "https://registry.npmjs.org/@jup-ag/api/-/api-6.0.20.tgz", + "integrity": "sha512-HaPWYpbcQiCkoq1fTKspFIismFI8Rw9ZzgC47PMNY+ZLN0IEDtSYcm3rVEyxO+E3StRxj9uKrNbok32SRCXWvQ==" + }, + "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==", + "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==", + "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==" + }, + "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==", + "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/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@noble/curves": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", + "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "dependencies": { + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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==", + "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/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "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==", + "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==" + }, + "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==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "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==", + "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==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "node_modules/@scure/base": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", + "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "dependencies": { + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "dependencies": { + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@solana/buffer-layout": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", + "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", + "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==", + "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/codecs": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.2.tgz", + "integrity": "sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-data-structures": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/codecs-strings": "2.0.0-preview.2", + "@solana/options": "2.0.0-preview.2" + } + }, + "node_modules/@solana/codecs-core": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz", + "integrity": "sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==", + "dependencies": { + "@solana/errors": "2.0.0-preview.2" + } + }, + "node_modules/@solana/codecs-data-structures": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz", + "integrity": "sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" + } + }, + "node_modules/@solana/codecs-numbers": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz", + "integrity": "sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" + } + }, + "node_modules/@solana/codecs-strings": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz", + "integrity": "sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22" + } + }, + "node_modules/@solana/errors": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.2.tgz", + "integrity": "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==", + "dependencies": { + "chalk": "^5.3.0", + "commander": "^12.0.0" + }, + "bin": { + "errors": "bin/cli.js" + } + }, + "node_modules/@solana/options": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz", + "integrity": "sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2" + } + }, + "node_modules/@solana/spl-token": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz", + "integrity": "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==", + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "@solana/spl-token-group": "^0.0.4", + "@solana/spl-token-metadata": "^0.1.4", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" + } + }, + "node_modules/@solana/spl-token-group": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.4.tgz", + "integrity": "sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==", + "dependencies": { + "@solana/codecs": "2.0.0-preview.2", + "@solana/spl-type-length-value": "0.1.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" + } + }, + "node_modules/@solana/spl-token-metadata": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz", + "integrity": "sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==", + "dependencies": { + "@solana/codecs": "2.0.0-preview.2", + "@solana/spl-type-length-value": "0.1.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" + } + }, + "node_modules/@solana/spl-type-length-value": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz", + "integrity": "sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==", + "dependencies": { + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@solana/web3.js": { + "version": "1.91.8", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.8.tgz", + "integrity": "sha512-USa6OS1jbh8zOapRJ/CBZImZ8Xb7AJjROZl5adql9TpOoBN9BUzyyouS5oPuZHft7S7eB8uJPuXWYjMi6BHgOw==", + "dependencies": { + "@babel/runtime": "^7.24.5", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.0", + "node-fetch": "^2.7.0", + "rpc-websockets": "^7.11.0", + "superstruct": "^0.14.2" + } + }, + "node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + }, + "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/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dependencies": { + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dependencies": { + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "node_modules/@terra-money/legacy.proto/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "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.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==", + "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==", + "dependencies": { + "browser-headers": "^0.4.1" + }, + "peerDependencies": { + "google-protobuf": "^3.14.0" + } + }, + "node_modules/@terra-money/terra.proto/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "dependencies": { + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" + } + }, + "node_modules/@types/chai": { + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "peer": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "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==", + "dev": true, + "optional": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/lodash": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", + "integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==" + }, + "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==", + "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==" + }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.12.11", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", + "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/secp256k1": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/@volar/language-core": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.2.tgz", + "integrity": "sha512-GuvEL4JdxbnLVhPLICncCGT+tVW4cIz9GxXNeDofNnJ4iNTKhr5suGVsA1GLOne9PbraSjn8PlLt+pvLxuRVeQ==", + "dependencies": { + "@volar/source-map": "2.2.2" + } + }, + "node_modules/@volar/source-map": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.2.tgz", + "integrity": "sha512-vUwvZuSW6iN4JI9QRinh9EjFasx1TUtnaWMKwgWx08xz1PyYuNkLlWlrZXBZ5GGBhML0u230M/7X+AHY2h9yKg==", + "dependencies": { + "muggle-string": "^0.4.0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", + "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", + "dependencies": { + "@babel/parser": "^7.24.4", + "@vue/shared": "3.4.27", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", + "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", + "dependencies": { + "@vue/compiler-core": "3.4.27", + "@vue/shared": "3.4.27" + } + }, + "node_modules/@vue/language-core": { + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.17.tgz", + "integrity": "sha512-tHw2J6G9yL4kn3jN5MftOHEq86Y6qnuohBQ1OHkJ73fAv3OYgwDI1cfX7ds0OEJEycOMG64BA3ql5bDgDa41zw==", + "dependencies": { + "@volar/language-core": "~2.2.2", + "@vue/compiler-dom": "^3.4.0", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/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==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/shared": { + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", + "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { + "version": "0.0.1", + "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", + "integrity": "sha512-wETcbDAJNPR5KWMwkfSncFk6wD8LbF5WCrr4UBLbGRnBW0DD/XgkzNQAqXYZRp88EY6xN5Rr/qZrc5mziq20BQ==", + "dependencies": { + "@certusone/wormhole-spydk": "^0.0.1", + "@coral-xyz/anchor": "^0.30.0", + "@solana/spl-token": "^0.4.6", + "@solana/spl-token-group": "^0.0.4", + "@solana/spl-token-metadata": "^0.1.4", + "@solana/web3.js": "^1.91.7", + "@types/node-fetch": "^2.6.11", + "@wormhole-foundation/sdk": "^0.6.8", + "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", + "dotenv": "^16.4.1", + "ethers": "^5.7.2", + "sha3": "^2.1.4", + "winston": "^3.13.0", + "yargs": "^17.7.2" + } + }, + "node_modules/@wormhole-foundation/sdk": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk/-/sdk-0.6.8.tgz", + "integrity": "sha512-ZWhm+Mm+jlgK8WGHD2Xpu8h4D2QSueFBk64SsHePWLn3VNy1Nuq1Lm8A6WcHZN2k1AZgITTgQEliEypt6GR4rg==", + "dependencies": { + "@wormhole-foundation/sdk-algorand": "0.6.8", + "@wormhole-foundation/sdk-algorand-core": "0.6.8", + "@wormhole-foundation/sdk-algorand-tokenbridge": "0.6.8", + "@wormhole-foundation/sdk-aptos": "0.6.8", + "@wormhole-foundation/sdk-aptos-core": "0.6.8", + "@wormhole-foundation/sdk-aptos-tokenbridge": "0.6.8", + "@wormhole-foundation/sdk-base": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm-core": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm-ibc": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm-tokenbridge": "0.6.8", + "@wormhole-foundation/sdk-definitions": "0.6.8", + "@wormhole-foundation/sdk-evm": "0.6.8", + "@wormhole-foundation/sdk-evm-cctp": "0.6.8", + "@wormhole-foundation/sdk-evm-core": "0.6.8", + "@wormhole-foundation/sdk-evm-portico": "0.6.8", + "@wormhole-foundation/sdk-evm-tokenbridge": "0.6.8", + "@wormhole-foundation/sdk-solana": "0.6.8", + "@wormhole-foundation/sdk-solana-cctp": "0.6.8", + "@wormhole-foundation/sdk-solana-core": "0.6.8", + "@wormhole-foundation/sdk-solana-tokenbridge": "0.6.8", + "@wormhole-foundation/sdk-sui": "0.6.8", + "@wormhole-foundation/sdk-sui-core": "0.6.8", + "@wormhole-foundation/sdk-sui-tokenbridge": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-algorand": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand/-/sdk-algorand-0.6.8.tgz", + "integrity": "sha512-yyIzFCgXRRDKZiIypMhtvsu4Phst3kRdoAW7hZQWUQZTwsIRh89bwRh3mAtogOmRHfToLgnzwihXlIEe0zq5pg==", + "dependencies": { + "@wormhole-foundation/sdk-connect": "0.6.8", + "algosdk": "2.7.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-algorand-core": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-core/-/sdk-algorand-core-0.6.8.tgz", + "integrity": "sha512-3Nv9jq0ndONCDvqqUq+5Z5IvxucP2vcmah9gVGz5OEcxtBfdeiW88qbmNk5uv1WT/CwLD+rDMCR8oSWKGX2cLA==", + "dependencies": { + "@wormhole-foundation/sdk-algorand": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-algorand-tokenbridge": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-tokenbridge/-/sdk-algorand-tokenbridge-0.6.8.tgz", + "integrity": "sha512-TFebQFpIqB6ONT3ZGQs2YGL9bTtSHaY3ha9L3FMI64ylv8bqe71WdX4GNxQEFwra6Xd6M5BIteTTZsAZXzeG/Q==", + "dependencies": { + "@wormhole-foundation/sdk-algorand": "0.6.8", + "@wormhole-foundation/sdk-algorand-core": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-aptos": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos/-/sdk-aptos-0.6.8.tgz", + "integrity": "sha512-TDjOk3GMZUV2YPiaLqLh9atM52ArW8EVjdCzQH2IlX5OHTwL0+9p8Navz568OK0y3CaDabBw+GDWordcSVNZ9w==", + "dependencies": { + "@wormhole-foundation/sdk-connect": "0.6.8", + "aptos": "1.21.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-aptos-core": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-core/-/sdk-aptos-core-0.6.8.tgz", + "integrity": "sha512-J9xWSUvdQEFlbcSSH7n5Pn5QnaKmEujVHFvdY8yMZKwdYfJ1ad7EAogSTo+7r2tO9YWMcIlGeJv21lyebDE3JA==", + "dependencies": { + "@wormhole-foundation/sdk-aptos": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-aptos-tokenbridge": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-tokenbridge/-/sdk-aptos-tokenbridge-0.6.8.tgz", + "integrity": "sha512-SGkMSCipcI4E1z4WSNELx3+8YHWO2rWJOCBqn/HM8WUZw/MaqhR7iKmefW55Urf7OyGSv+OPV3EhILVylzA2SQ==", + "dependencies": { + "@wormhole-foundation/sdk-aptos": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-aptos/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@wormhole-foundation/sdk-aptos/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/@wormhole-foundation/sdk-aptos/node_modules/aptos": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/aptos/-/aptos-1.21.0.tgz", + "integrity": "sha512-PRKjoFgL8tVEc9+oS7eJUv8GNxx8n3+0byH2+m7CP3raYOD6yFKOecuwjVMIJmgfpjp6xH0P0HDMGZAXmSyU0Q==", + "dependencies": { + "@aptos-labs/aptos-client": "^0.1.0", + "@noble/hashes": "1.3.3", + "@scure/bip39": "1.2.1", + "eventemitter3": "^5.0.1", + "form-data": "4.0.0", + "tweetnacl": "1.0.3" + }, + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-aptos/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/@wormhole-foundation/sdk-base": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.6.8.tgz", + "integrity": "sha512-8F6B9I60SEI2lQDAoPB6bB6NWLFso/hghfD/Zfxrrgu+LumwKIejgvsiOudVRjL2nvqUJJ/lIodgSBckpPW8Kg==", + "dependencies": { + "@scure/base": "^1.1.3" + } + }, + "node_modules/@wormhole-foundation/sdk-connect": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.6.8.tgz", + "integrity": "sha512-AqMg2L2oXj8fHutuXgQVaQ6Dr5XXxoOBucxA2tt+m/iXa1Xy59pY2zJYmLH2RlPFgLAikMUtq72cVwKz/SPSxQ==", + "dependencies": { + "@wormhole-foundation/sdk-base": "0.6.8", + "@wormhole-foundation/sdk-definitions": "0.6.8", + "axios": "^1.4.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-connect/node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm/-/sdk-cosmwasm-0.6.8.tgz", + "integrity": "sha512-FKna+WYOhUSrocKXoSOYmEXJhwjeGDXHz1ZdHvprKauocpku3VNJXB3kEPwMywfZsu52d1ca9v79vSsKM0iRBw==", + "dependencies": { + "@cosmjs/cosmwasm-stargate": "^0.32.0", + "@cosmjs/proto-signing": "^0.32.0", + "@cosmjs/stargate": "^0.32.0", + "@injectivelabs/sdk-ts": "^1.14.4", + "@wormhole-foundation/sdk-connect": "0.6.8", + "cosmjs-types": "^0.9.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-core/-/sdk-cosmwasm-core-0.6.8.tgz", + "integrity": "sha512-BprNt10TeZq1cV9Y3W2zzl2Nuioh4UAsU12lBczrw5j0d/zJ+ImDQL6R2d8FhV2iI0S+SEMbuhUYBOvnUgC2bg==", + "dependencies": { + "@cosmjs/cosmwasm-stargate": "^0.32.0", + "@cosmjs/stargate": "^0.32.0", + "@injectivelabs/sdk-ts": "^1.14.4", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/amino": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", + "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", + "dependencies": { + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/crypto": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", + "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", + "dependencies": { + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", + "elliptic": "^6.5.4", + "libsodium-wrappers-sumo": "^0.7.11" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/encoding": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", + "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", + "dependencies": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/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==" + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/json-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", + "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", + "dependencies": { + "@cosmjs/stream": "^0.32.3", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/math": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", + "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", + "dependencies": { + "bn.js": "^5.2.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/proto-signing": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", + "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", + "dependencies": { + "@cosmjs/amino": "^0.32.3", + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/socket": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", + "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", + "dependencies": { + "@cosmjs/stream": "^0.32.3", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/stargate": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", + "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", + "dependencies": { + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/proto-signing": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/tendermint-rpc": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/stream": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", + "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", + "dependencies": { + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/tendermint-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", + "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", + "dependencies": { + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/json-rpc": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/socket": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "axios": "^1.6.0", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/utils": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", + "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/core-proto-ts": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz", + "integrity": "sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/indexer-proto-ts": { + "version": "1.11.36", + "resolved": "https://registry.npmjs.org/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz", + "integrity": "sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/mito-proto-ts": { + "version": "1.0.62", + "resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz", + "integrity": "sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/networks": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", + "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/sdk-ts": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz", + "integrity": "sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg==", + "hasInstallScript": true, + "dependencies": { + "@apollo/client": "^3.5.8", + "@cosmjs/amino": "^0.32.2", + "@cosmjs/proto-signing": "^0.32.2", + "@cosmjs/stargate": "^0.32.2", + "@ensdomains/ens-validation": "^0.1.0", + "@ensdomains/eth-ens-namehash": "^2.0.15", + "@ethersproject/bytes": "^5.7.0", + "@injectivelabs/core-proto-ts": "^0.0.21", + "@injectivelabs/dmm-proto-ts": "1.0.19", + "@injectivelabs/exceptions": "^1.14.6", + "@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.11.36", + "@injectivelabs/mito-proto-ts": "1.0.62", + "@injectivelabs/networks": "^1.14.6", + "@injectivelabs/test-utils": "^1.14.3", + "@injectivelabs/token-metadata": "^1.14.7", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "@metamask/eth-sig-util": "^4.0.0", + "axios": "^0.27.2", + "bech32": "^2.0.0", + "bip39": "^3.0.4", + "cosmjs-types": "^0.9.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", + "secp256k1": "^4.0.3", + "shx": "^0.3.2", + "snakecase-keys": "^5.4.1" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/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==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/utils": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", + "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "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/@wormhole-foundation/sdk-cosmwasm-core/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==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/cosmjs-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", + "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-ibc/-/sdk-cosmwasm-ibc-0.6.8.tgz", + "integrity": "sha512-H6Z//N2HghUmBcbEcJAZ0+bUPV2OWsFWao+Cta8g5ucCS9w7v6pLIUYrfn6TcFFgZpwihGt4pokDniFoOJ8/Rg==", + "dependencies": { + "@cosmjs/cosmwasm-stargate": "^0.32.0", + "@cosmjs/stargate": "^0.32.0", + "@injectivelabs/sdk-ts": "^1.14.4", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm-core": "0.6.8", + "cosmjs-types": "^0.9.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/amino": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", + "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", + "dependencies": { + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/crypto": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", + "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", + "dependencies": { + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", + "elliptic": "^6.5.4", + "libsodium-wrappers-sumo": "^0.7.11" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/encoding": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", + "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", + "dependencies": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/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==" + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/json-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", + "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", + "dependencies": { + "@cosmjs/stream": "^0.32.3", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/math": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", + "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", + "dependencies": { + "bn.js": "^5.2.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/proto-signing": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", + "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", + "dependencies": { + "@cosmjs/amino": "^0.32.3", + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/socket": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", + "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", + "dependencies": { + "@cosmjs/stream": "^0.32.3", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/stargate": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", + "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", + "dependencies": { + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/proto-signing": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/tendermint-rpc": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/stream": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", + "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", + "dependencies": { + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/tendermint-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", + "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", + "dependencies": { + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/json-rpc": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/socket": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "axios": "^1.6.0", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/utils": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", + "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/core-proto-ts": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz", + "integrity": "sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/indexer-proto-ts": { + "version": "1.11.36", + "resolved": "https://registry.npmjs.org/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz", + "integrity": "sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/mito-proto-ts": { + "version": "1.0.62", + "resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz", + "integrity": "sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/networks": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", + "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/sdk-ts": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz", + "integrity": "sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg==", + "hasInstallScript": true, + "dependencies": { + "@apollo/client": "^3.5.8", + "@cosmjs/amino": "^0.32.2", + "@cosmjs/proto-signing": "^0.32.2", + "@cosmjs/stargate": "^0.32.2", + "@ensdomains/ens-validation": "^0.1.0", + "@ensdomains/eth-ens-namehash": "^2.0.15", + "@ethersproject/bytes": "^5.7.0", + "@injectivelabs/core-proto-ts": "^0.0.21", + "@injectivelabs/dmm-proto-ts": "1.0.19", + "@injectivelabs/exceptions": "^1.14.6", + "@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.11.36", + "@injectivelabs/mito-proto-ts": "1.0.62", + "@injectivelabs/networks": "^1.14.6", + "@injectivelabs/test-utils": "^1.14.3", + "@injectivelabs/token-metadata": "^1.14.7", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "@metamask/eth-sig-util": "^4.0.0", + "axios": "^0.27.2", + "bech32": "^2.0.0", + "bip39": "^3.0.4", + "cosmjs-types": "^0.9.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", + "secp256k1": "^4.0.3", + "shx": "^0.3.2", + "snakecase-keys": "^5.4.1" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/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==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/utils": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", + "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "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/@wormhole-foundation/sdk-cosmwasm-ibc/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==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/cosmjs-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", + "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-tokenbridge/-/sdk-cosmwasm-tokenbridge-0.6.8.tgz", + "integrity": "sha512-NpCWSYttzdudW4r76hv+42Ym5CzIl6oBTTpkaBBkNFTPjzVkCJap+8X3oV9YlLCFC0gh9C+5UEtS2bvU5HMm6w==", + "dependencies": { + "@cosmjs/cosmwasm-stargate": "^0.32.0", + "@injectivelabs/sdk-ts": "^1.14.4", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/amino": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", + "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", + "dependencies": { + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/crypto": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", + "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", + "dependencies": { + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", + "elliptic": "^6.5.4", + "libsodium-wrappers-sumo": "^0.7.11" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/encoding": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", + "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", + "dependencies": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/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==" + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/json-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", + "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", + "dependencies": { + "@cosmjs/stream": "^0.32.3", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/math": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", + "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", + "dependencies": { + "bn.js": "^5.2.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/proto-signing": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", + "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", + "dependencies": { + "@cosmjs/amino": "^0.32.3", + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/socket": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", + "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", + "dependencies": { + "@cosmjs/stream": "^0.32.3", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/stargate": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", + "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", + "dependencies": { + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/proto-signing": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/tendermint-rpc": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/stream": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", + "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", + "dependencies": { + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/tendermint-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", + "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", + "dependencies": { + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/json-rpc": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/socket": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "axios": "^1.6.0", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/tendermint-rpc/node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/utils": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", + "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/core-proto-ts": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz", + "integrity": "sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/indexer-proto-ts": { + "version": "1.11.36", + "resolved": "https://registry.npmjs.org/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz", + "integrity": "sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/mito-proto-ts": { + "version": "1.0.62", + "resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz", + "integrity": "sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/networks": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", + "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/sdk-ts": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz", + "integrity": "sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg==", + "hasInstallScript": true, + "dependencies": { + "@apollo/client": "^3.5.8", + "@cosmjs/amino": "^0.32.2", + "@cosmjs/proto-signing": "^0.32.2", + "@cosmjs/stargate": "^0.32.2", + "@ensdomains/ens-validation": "^0.1.0", + "@ensdomains/eth-ens-namehash": "^2.0.15", + "@ethersproject/bytes": "^5.7.0", + "@injectivelabs/core-proto-ts": "^0.0.21", + "@injectivelabs/dmm-proto-ts": "1.0.19", + "@injectivelabs/exceptions": "^1.14.6", + "@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.11.36", + "@injectivelabs/mito-proto-ts": "1.0.62", + "@injectivelabs/networks": "^1.14.6", + "@injectivelabs/test-utils": "^1.14.3", + "@injectivelabs/token-metadata": "^1.14.7", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "@metamask/eth-sig-util": "^4.0.0", + "axios": "^0.27.2", + "bech32": "^2.0.0", + "bip39": "^3.0.4", + "cosmjs-types": "^0.9.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", + "secp256k1": "^4.0.3", + "shx": "^0.3.2", + "snakecase-keys": "^5.4.1" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/utils": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", + "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "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/@wormhole-foundation/sdk-cosmwasm-tokenbridge/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==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/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/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/cosmjs-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", + "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/amino": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", + "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", + "dependencies": { + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/crypto": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", + "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", + "dependencies": { + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", + "elliptic": "^6.5.4", + "libsodium-wrappers-sumo": "^0.7.11" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/encoding": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", + "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", + "dependencies": { + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/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==" + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/json-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", + "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", + "dependencies": { + "@cosmjs/stream": "^0.32.3", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/math": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", + "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", + "dependencies": { + "bn.js": "^5.2.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/proto-signing": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", + "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", + "dependencies": { + "@cosmjs/amino": "^0.32.3", + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/socket": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", + "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", + "dependencies": { + "@cosmjs/stream": "^0.32.3", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/stargate": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", + "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", + "dependencies": { + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/proto-signing": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/tendermint-rpc": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/stream": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", + "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", + "dependencies": { + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/tendermint-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", + "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", + "dependencies": { + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/json-rpc": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/socket": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "axios": "^1.6.0", + "readonly-date": "^1.0.0", + "xstream": "^11.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/utils": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", + "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/core-proto-ts": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz", + "integrity": "sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/indexer-proto-ts": { + "version": "1.11.36", + "resolved": "https://registry.npmjs.org/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz", + "integrity": "sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/mito-proto-ts": { + "version": "1.0.62", + "resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz", + "integrity": "sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/networks": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", + "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/sdk-ts": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz", + "integrity": "sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg==", + "hasInstallScript": true, + "dependencies": { + "@apollo/client": "^3.5.8", + "@cosmjs/amino": "^0.32.2", + "@cosmjs/proto-signing": "^0.32.2", + "@cosmjs/stargate": "^0.32.2", + "@ensdomains/ens-validation": "^0.1.0", + "@ensdomains/eth-ens-namehash": "^2.0.15", + "@ethersproject/bytes": "^5.7.0", + "@injectivelabs/core-proto-ts": "^0.0.21", + "@injectivelabs/dmm-proto-ts": "1.0.19", + "@injectivelabs/exceptions": "^1.14.6", + "@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.11.36", + "@injectivelabs/mito-proto-ts": "1.0.62", + "@injectivelabs/networks": "^1.14.6", + "@injectivelabs/test-utils": "^1.14.3", + "@injectivelabs/token-metadata": "^1.14.7", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "@metamask/eth-sig-util": "^4.0.0", + "axios": "^0.27.2", + "bech32": "^2.0.0", + "bip39": "^3.0.4", + "cosmjs-types": "^0.9.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", + "secp256k1": "^4.0.3", + "shx": "^0.3.2", + "snakecase-keys": "^5.4.1" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/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==", + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/utils": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", + "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "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/@wormhole-foundation/sdk-cosmwasm/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==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/axios": { + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/cosmjs-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", + "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" + }, + "node_modules/@wormhole-foundation/sdk-definitions": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.6.8.tgz", + "integrity": "sha512-UcILpnIuZddhqDGcU3eXwpMobf9Q/GAVUTyeMbS34cvBN7kHaxLlsYBB5mzbvPo6X4PP23KKt9AjDbpHh+5B5g==", + "dependencies": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.1", + "@wormhole-foundation/sdk-base": "0.6.8" + } + }, + "node_modules/@wormhole-foundation/sdk-evm": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.6.8.tgz", + "integrity": "sha512-0ABqWo2Moh+V1yLEBY2/1yLbRkJzd7pp6dGIDO3D1NIhgeA9oYwBlDjd1bJ12JOxIJO4pvVGMz7wKiHKTzcfjA==", + "dependencies": { + "@wormhole-foundation/sdk-connect": "0.6.8", + "ethers": "^6.5.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-evm-cctp": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-cctp/-/sdk-evm-cctp-0.6.8.tgz", + "integrity": "sha512-ULxqMNMsClvhKZdnrwjarOxypyOvNa8NGewGKKG3ijC39XUOHmlJ+gl8jXrl9sUkl9Wy7ZHph6kVcwkwhFg0UA==", + "dependencies": { + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-evm": "0.6.8", + "ethers": "^6.5.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-evm-cctp/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/@wormhole-foundation/sdk-evm-cctp/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/@wormhole-foundation/sdk-evm-cctp/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/@wormhole-foundation/sdk-evm-cctp/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/@wormhole-foundation/sdk-evm-cctp/node_modules/ethers": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", + "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-evm-cctp/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@wormhole-foundation/sdk-evm-cctp/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "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/@wormhole-foundation/sdk-evm-core": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-core/-/sdk-evm-core-0.6.8.tgz", + "integrity": "sha512-9MuYn9hAL8VrF9+eOmRivcD1leI6pU9O6gkZZmlbmJRQiWkiOQwCFYJcB4LB0ykfCxBzo4NvphX0Fm1cB0RVtw==", + "dependencies": { + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-evm": "0.6.8", + "ethers": "^6.5.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-evm-core/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/@wormhole-foundation/sdk-evm-core/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/@wormhole-foundation/sdk-evm-core/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/@wormhole-foundation/sdk-evm-core/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/@wormhole-foundation/sdk-evm-core/node_modules/ethers": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", + "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-evm-core/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@wormhole-foundation/sdk-evm-core/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "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/@wormhole-foundation/sdk-evm-portico": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-portico/-/sdk-evm-portico-0.6.8.tgz", + "integrity": "sha512-GM9bT8EBIK+SCUJA6UMygn2Kpkmvb8IpCrjCZXz6PocXke2A04f9XJmCz0m2s/2UrQ3tlnCGkpzIcQwTL3nTLQ==", + "dependencies": { + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-evm": "0.6.8", + "@wormhole-foundation/sdk-evm-core": "0.6.8", + "@wormhole-foundation/sdk-evm-tokenbridge": "0.6.8", + "ethers": "^6.5.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-evm-portico/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/@wormhole-foundation/sdk-evm-portico/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/@wormhole-foundation/sdk-evm-portico/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/@wormhole-foundation/sdk-evm-portico/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/@wormhole-foundation/sdk-evm-portico/node_modules/ethers": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", + "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-evm-portico/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@wormhole-foundation/sdk-evm-portico/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "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/@wormhole-foundation/sdk-evm-tokenbridge": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-tokenbridge/-/sdk-evm-tokenbridge-0.6.8.tgz", + "integrity": "sha512-eRX6EuV1AB56/lIhAXCAgCORWjqKdnWqBSamyaorQCr9lvv43uKvhLLkv6aAMfFBvHGVf2izuspfTQUTqt7FYg==", + "dependencies": { + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-evm": "0.6.8", + "@wormhole-foundation/sdk-evm-core": "0.6.8", + "ethers": "^6.5.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/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/@wormhole-foundation/sdk-evm-tokenbridge/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/@wormhole-foundation/sdk-evm-tokenbridge/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/node_modules/ethers": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", + "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "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/@wormhole-foundation/sdk-evm/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/@wormhole-foundation/sdk-evm/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/@wormhole-foundation/sdk-evm/node_modules/@types/node": { + "version": "18.15.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", + "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + }, + "node_modules/@wormhole-foundation/sdk-evm/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/@wormhole-foundation/sdk-evm/node_modules/ethers": { + "version": "6.12.1", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", + "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-evm/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@wormhole-foundation/sdk-evm/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "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/@wormhole-foundation/sdk-solana": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.6.8.tgz", + "integrity": "sha512-spiBcyukLtoo+kcDLwcEmIH2nb+3VFRKY+mt1UC4uS7DCLkrRbJnKIfdQNEI9MgZSqXMwvwHQMqrIuXSOv7Kjw==", + "dependencies": { + "@coral-xyz/anchor": "0.29.0", + "@coral-xyz/borsh": "0.29.0", + "@solana/spl-token": "0.3.9", + "@solana/web3.js": "1.91.7", + "@wormhole-foundation/sdk-connect": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-cctp": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-cctp/-/sdk-solana-cctp-0.6.8.tgz", + "integrity": "sha512-QiA2Ad4/ui34f8XcSohCjQEzNVtSaSN8bIDLS4DwPtBvzwJyMuCu1vYzaR4fCUPjPRB8Hbt9trFPKBYCg9zyKQ==", + "dependencies": { + "@coral-xyz/anchor": "0.29.0", + "@solana/spl-token": "0.3.9", + "@solana/web3.js": "1.91.7", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-solana": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-cctp/node_modules/@coral-xyz/anchor": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", + "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", + "dependencies": { + "@coral-xyz/borsh": "^0.29.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-cctp/node_modules/@coral-xyz/borsh": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", + "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-cctp/node_modules/@solana/spl-token": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", + "integrity": "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA==", + "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/@wormhole-foundation/sdk-solana-cctp/node_modules/@solana/web3.js": { + "version": "1.91.7", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", + "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", + "dependencies": { + "@babel/runtime": "^7.23.4", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.3", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.0", + "node-fetch": "^2.7.0", + "rpc-websockets": "^7.5.1", + "superstruct": "^0.14.2" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-cctp/node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + }, + "node_modules/@wormhole-foundation/sdk-solana-core": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.6.8.tgz", + "integrity": "sha512-zhsgS1JHkKKUZ/+AhMNVIyKbtO1/t4464TlnLxYEe9aTBsNAF8qj+kwaDbHuBhK17vQbiaKqOVwXbYcSnbfvFQ==", + "dependencies": { + "@coral-xyz/anchor": "0.29.0", + "@coral-xyz/borsh": "0.29.0", + "@solana/web3.js": "1.91.7", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-solana": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@coral-xyz/anchor": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", + "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", + "dependencies": { + "@coral-xyz/borsh": "^0.29.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@coral-xyz/borsh": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", + "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@solana/web3.js": { + "version": "1.91.7", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", + "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", + "dependencies": { + "@babel/runtime": "^7.23.4", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.3", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.0", + "node-fetch": "^2.7.0", + "rpc-websockets": "^7.5.1", + "superstruct": "^0.14.2" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + }, + "node_modules/@wormhole-foundation/sdk-solana-tokenbridge": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-tokenbridge/-/sdk-solana-tokenbridge-0.6.8.tgz", + "integrity": "sha512-0CrPCQvp3Txi/75RoGEZ5qe6X5zPibmKM1xCP70Yx6fIc0+0XxOnZ5pjOCeRYO84s0QGkap4G3mvAtXv/5xU8w==", + "dependencies": { + "@coral-xyz/anchor": "0.29.0", + "@solana/spl-token": "0.3.9", + "@solana/web3.js": "1.91.7", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-solana": "0.6.8", + "@wormhole-foundation/sdk-solana-core": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-tokenbridge/node_modules/@coral-xyz/anchor": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", + "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", + "dependencies": { + "@coral-xyz/borsh": "^0.29.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-tokenbridge/node_modules/@coral-xyz/borsh": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", + "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-tokenbridge/node_modules/@solana/spl-token": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", + "integrity": "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA==", + "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/@wormhole-foundation/sdk-solana-tokenbridge/node_modules/@solana/web3.js": { + "version": "1.91.7", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", + "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", + "dependencies": { + "@babel/runtime": "^7.23.4", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.3", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.0", + "node-fetch": "^2.7.0", + "rpc-websockets": "^7.5.1", + "superstruct": "^0.14.2" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-tokenbridge/node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + }, + "node_modules/@wormhole-foundation/sdk-solana/node_modules/@coral-xyz/anchor": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", + "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", + "dependencies": { + "@coral-xyz/borsh": "^0.29.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@wormhole-foundation/sdk-solana/node_modules/@coral-xyz/borsh": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", + "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/@wormhole-foundation/sdk-solana/node_modules/@solana/spl-token": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", + "integrity": "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA==", + "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/@wormhole-foundation/sdk-solana/node_modules/@solana/web3.js": { + "version": "1.91.7", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", + "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", + "dependencies": { + "@babel/runtime": "^7.23.4", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.3", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.0", + "node-fetch": "^2.7.0", + "rpc-websockets": "^7.5.1", + "superstruct": "^0.14.2" + } + }, + "node_modules/@wormhole-foundation/sdk-solana/node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + }, + "node_modules/@wormhole-foundation/sdk-sui": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui/-/sdk-sui-0.6.8.tgz", + "integrity": "sha512-1klJjPCmRQyk/NI89tDhC6/IOIgtch8eTF/QYpCL2g6clsV5Cyojkeb8q0zsPtrPaFcZeRG7y2rPw/5J7k1MTA==", + "dependencies": { + "@mysten/sui.js": "^0.50.1", + "@wormhole-foundation/sdk-connect": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-sui-core": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui-core/-/sdk-sui-core-0.6.8.tgz", + "integrity": "sha512-RJCM6QhT9YM14ygEirIw/GtcMRR+cNg7LFbtrW65UiAV2uPf/iiuSf3SDUjbxkXqgAv9J6zPxFrftGTDKdAQ4Q==", + "dependencies": { + "@mysten/sui.js": "^0.50.1", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-sui": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-sui-core/node_modules/@mysten/bcs": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.11.1.tgz", + "integrity": "sha512-xP85isNSYUCHd3O/g+TmZYmg4wK6cU8q/n/MebkIGP4CYVJZz2wU/G24xIZ3wI+0iTop4dfgA5kYrg/DQKCUzA==", + "dependencies": { + "bs58": "^5.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-sui-core/node_modules/@mysten/sui.js": { + "version": "0.50.1", + "resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.50.1.tgz", + "integrity": "sha512-AY0wb4n6PMTRsDGygzrrTHUK/m5KwKZ4aQcN9cayiwsq2iIhfjGo7uuqMA7Y5UiqvLCoF+z7Ig14Q5qejQ/S/w==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.2.0", + "@mysten/bcs": "0.11.1", + "@noble/curves": "^1.1.0", + "@noble/hashes": "^1.3.1", + "@scure/bip32": "^1.3.1", + "@scure/bip39": "^1.2.1", + "@suchipi/femver": "^1.0.0", + "bech32": "^2.0.0", + "gql.tada": "^1.2.0", + "graphql": "^16.8.1", + "superstruct": "^1.0.3", + "tweetnacl": "^1.0.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-sui-core/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/@wormhole-foundation/sdk-sui-core/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/@wormhole-foundation/sdk-sui-core/node_modules/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-sui-tokenbridge": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui-tokenbridge/-/sdk-sui-tokenbridge-0.6.8.tgz", + "integrity": "sha512-BLpIfqJwOymnkumKP+KM3yjTEjlGgsPmcXY+E5+9eth63BJq5WDdl6vaqv+5abQ+56iLa3ARWb9jYSaR9gClcw==", + "dependencies": { + "@mysten/sui.js": "^0.50.1", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-sui": "0.6.8", + "@wormhole-foundation/sdk-sui-core": "0.6.8" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-sui-tokenbridge/node_modules/@mysten/bcs": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.11.1.tgz", + "integrity": "sha512-xP85isNSYUCHd3O/g+TmZYmg4wK6cU8q/n/MebkIGP4CYVJZz2wU/G24xIZ3wI+0iTop4dfgA5kYrg/DQKCUzA==", + "dependencies": { + "bs58": "^5.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-sui-tokenbridge/node_modules/@mysten/sui.js": { + "version": "0.50.1", + "resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.50.1.tgz", + "integrity": "sha512-AY0wb4n6PMTRsDGygzrrTHUK/m5KwKZ4aQcN9cayiwsq2iIhfjGo7uuqMA7Y5UiqvLCoF+z7Ig14Q5qejQ/S/w==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.2.0", + "@mysten/bcs": "0.11.1", + "@noble/curves": "^1.1.0", + "@noble/hashes": "^1.3.1", + "@scure/bip32": "^1.3.1", + "@scure/bip39": "^1.2.1", + "@suchipi/femver": "^1.0.0", + "bech32": "^2.0.0", + "gql.tada": "^1.2.0", + "graphql": "^16.8.1", + "superstruct": "^1.0.3", + "tweetnacl": "^1.0.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-sui-tokenbridge/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/@wormhole-foundation/sdk-sui-tokenbridge/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/@wormhole-foundation/sdk-sui-tokenbridge/node_modules/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-sui/node_modules/@mysten/bcs": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.11.1.tgz", + "integrity": "sha512-xP85isNSYUCHd3O/g+TmZYmg4wK6cU8q/n/MebkIGP4CYVJZz2wU/G24xIZ3wI+0iTop4dfgA5kYrg/DQKCUzA==", + "dependencies": { + "bs58": "^5.0.0" + } + }, + "node_modules/@wormhole-foundation/sdk-sui/node_modules/@mysten/sui.js": { + "version": "0.50.1", + "resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.50.1.tgz", + "integrity": "sha512-AY0wb4n6PMTRsDGygzrrTHUK/m5KwKZ4aQcN9cayiwsq2iIhfjGo7uuqMA7Y5UiqvLCoF+z7Ig14Q5qejQ/S/w==", + "dependencies": { + "@graphql-typed-document-node/core": "^3.2.0", + "@mysten/bcs": "0.11.1", + "@noble/curves": "^1.1.0", + "@noble/hashes": "^1.3.1", + "@scure/bip32": "^1.3.1", + "@scure/bip39": "^1.2.1", + "@suchipi/femver": "^1.0.0", + "bech32": "^2.0.0", + "gql.tada": "^1.2.0", + "graphql": "^16.8.1", + "superstruct": "^1.0.3", + "tweetnacl": "^1.0.3" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-sui/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/@wormhole-foundation/sdk-sui/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/@wormhole-foundation/sdk-sui/node_modules/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@wormhole-foundation/swap-layer-evm": { + "resolved": "evm/ts-sdk", + "link": true + }, + "node_modules/@wormhole-foundation/swap-layer-solana": { + "resolved": "solana", + "link": true + }, + "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==", + "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==", + "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==", + "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==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@xpla/xpla.js": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@xpla/xpla.js/-/xpla.js-0.2.3.tgz", + "integrity": "sha512-Tfk7hCGWXtwr08reY3Pi6dmzIqFbzri9jcyzJdfNmdo4cN0PMwpRJuZZcPmtxiIUnNef3AN1E/6nJUD5MKniuA==", + "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==", + "dependencies": { + "follow-redirects": "^1.14.8" + } + }, + "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/acorn-walk": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", + "dev": true, + "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==" + }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "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/anchor-0.29.0": { + "name": "@coral-xyz/anchor", + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", + "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", + "dependencies": { + "@coral-xyz/borsh": "^0.29.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/anchor-0.29.0/node_modules/@coral-xyz/borsh": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", + "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "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/@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/" + } + ] + }, + "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==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "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==", + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", + "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/axios": { + "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" + } + }, + "node_modules/axobject-query": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", + "dev": true, + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/babel-jest/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/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==", + "dev": true + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-istanbul/node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dev": true, + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", + "dev": true, + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.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==" + }, + "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==", + "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" + } + ] + }, + "node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, + "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==", + "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, + "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.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "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==", + "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==", + "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==" + }, + "node_modules/bip39": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", + "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "dependencies": { + "@noble/hashes": "^1.2.0" + } + }, + "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==" + }, + "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==" + }, + "node_modules/borsh": { + "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" + } + }, + "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==", + "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==", + "dev": true, + "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==" + }, + "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==" + }, + "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==", + "dev": true + }, + "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==", + "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/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", + "dev": true, + "dependencies": { + "fast-json-stable-stringify": "2.x" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bs58": { + "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" + } + }, + "node_modules/bs58check": { + "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" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dev": true, + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "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" + } + ], + "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==", + "dev": true + }, + "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==", + "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==" + }, + "node_modules/bufferutil": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", + "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, + "node_modules/cacheable-request": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001617", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", + "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/capability": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/capability/-/capability-0.2.5.tgz", + "integrity": "sha512-rsJZYVCgXd08sPqwmaIqjAd5SUTfonV0z/gDJ8D6cN8wQphky1kkAYEqQ+hmDxTw7UihvBfjUVUSY+DBEe44jg==" + }, + "node_modules/chai": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", + "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.0.8" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dependencies": { + "check-error": "^1.0.2" + }, + "peerDependencies": { + "chai": ">= 2.1.2 < 5" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "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/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz", + "integrity": "sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==", + "dev": true + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-response": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", + "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "dev": true, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" + } + }, + "node_modules/code-red/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/code-red/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", + "dev": true + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "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/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/color-string": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/colorspace": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", + "dependencies": { + "color": "^3.1.3", + "text-hex": "1.0.x" + } + }, + "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==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", + "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", + "engines": { + "node": ">=18" + } + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/copyfiles": { + "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" + }, + "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==", + "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==", + "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==" + }, + "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/cosmjs-types/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "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==", + "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==", + "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-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/create-jest/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/create-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/create-jest/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/create-jest/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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-addr-codec": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/crypto-addr-codec/-/crypto-addr-codec-0.1.8.tgz", + "integrity": "sha512-GqAK90iLLgP3FvhNmHbpT3wR6dEdaM8hZyZtLX29SPardh3OA13RFLHDR6sntGCgRWOfiHqW6sIyohpNqOtV/g==", + "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==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "peer": true, + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dedent": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", + "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/dedent-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", + "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==" + }, + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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==", + "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==", + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dot-case": { + "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" + } + }, + "node_modules/dotenv": { + "version": "16.4.5", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", + "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "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/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/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "optional": true, + "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/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/electron-to-chromium": { + "version": "1.4.762", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.762.tgz", + "integrity": "sha512-rrFvGweLxPwwSwJOjIopy3Vr+J3cIPtZzuc74bmlvmBIgQO3VYJDvVrlj94iKZ3ukXUH64Ex31hSfRTLqvjYJQ==", + "dev": true + }, + "node_modules/elliptic": { + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", + "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "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==" + }, + "node_modules/emittery": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "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/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "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==", + "dependencies": { + "capability": "^0.2.5", + "o3": "^1.0.3", + "u3": "^0.1.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "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==" + }, + "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==", + "dependencies": { + "es6-promise": "^4.0.3" + } + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "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/@babel/runtime": { + "version": "7.20.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", + "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "optional": true, + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "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/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==", + "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==", + "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==", + "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==", + "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==" + }, + "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==", + "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==", + "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/ethjs-util": { + "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" + }, + "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==" + }, + "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==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.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-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "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==" + }, + "node_modules/fastestsmallesttextencoderdecoder": { + "version": "1.0.22", + "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", + "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", + "peer": true + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dev": true, + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, + "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==" + }, + "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==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "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==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "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==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "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/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "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==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "engines": { + "node": "*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "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==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "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==" + }, + "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/got": { + "version": "11.8.6", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", + "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/gql.tada": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/gql.tada/-/gql.tada-1.7.0.tgz", + "integrity": "sha512-kOtyb949T1oqMCf3KTR9DYg0hWturvSlz0N2r2ePlAJVJ3fvuu07iP7SwSML0E8ltnSPLQDTvFBeaM8ZmJop9Q==", + "dependencies": { + "@0no-co/graphql.web": "^1.0.5", + "@gql.tada/cli-utils": "1.3.4", + "@gql.tada/internal": "0.4.0" + }, + "bin": { + "gql-tada": "bin/cli.js", + "gql.tada": "bin/cli.js" + }, + "peerDependencies": { + "typescript": "^5.0.0" + } + }, + "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==", + "dev": true + }, + "node_modules/graphql": { + "version": "16.8.1", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.8.1.tgz", + "integrity": "sha512-59LZHPdGZVh695Ud9lRzPBVTtlX9ZCV150Er2W43ro37wVof0ctenSaskPPjN7lVTIN8mSZt8PHUNKZuNQUuxw==", + "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==", + "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/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "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==", + "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==", + "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==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "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==", + "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==", + "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==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" + }, + "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==", + "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/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==", + "engines": { + "node": ">= 0.6" + } + }, + "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==" + }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.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" + } + ] + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dev": true, + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "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==", + "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==" + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "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==", + "dev": true, + "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==", + "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==", + "dev": true, + "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-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "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==", + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "peer": true, + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "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==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": 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==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/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==" + }, + "node_modules/jayson/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==" + }, + "node_modules/jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", + "dev": true, + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^1.0.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0", + "pretty-format": "^29.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-circus/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/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==", + "dev": true + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", + "dev": true, + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "create-jest": "^29.7.0", + "exit": "^0.1.2", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-cli/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-cli/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-cli/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==", + "dev": true + }, + "node_modules/jest-config": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-config/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/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==", + "dev": true + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-diff/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/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==", + "dev": true + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", + "dev": true, + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-each/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/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==", + "dev": true + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/graceful-fs": "^4.1.3", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-matcher-utils/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/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==", + "dev": true + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-message-util/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/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==", + "dev": true + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "dev": true, + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", + "dev": true, + "dependencies": { + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-resolve/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/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==", + "dev": true + }, + "node_modules/jest-runner": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", + "dev": true, + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", + "p-limit": "^3.1.0", + "source-map-support": "0.5.13" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runner/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-runner/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/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==", + "dev": true + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-runtime/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/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==", + "dev": true + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.11.6", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-jsx": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/types": "^7.3.3", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "natural-compare": "^1.4.0", + "pretty-format": "^29.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-snapshot/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/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==", + "dev": true + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-util/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/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==", + "dev": true + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-validate/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/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==", + "dev": true + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", + "dev": true, + "dependencies": { + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.13.1", + "jest-util": "^29.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher/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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/jest-watcher/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/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==", + "dev": true + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/js-base64": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.7.tgz", + "integrity": "sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "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==", + "bin": { + "jscrypto": "bin/cli.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "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==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=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" + ] + }, + "node_modules/jsonschema": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", + "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "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==", + "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==", + "dependencies": { + "bn.js": "^5.2.0", + "buffer": "^6.0.3", + "keccak": "^3.0.2" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-sumo": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.13.tgz", + "integrity": "sha512-zTGdLu4b9zSNLfovImpBCbdAA4xkpkZbMnSQjP8HShyOutnGjRHmSOKlsylh1okao6QhLiz7nG98EGn+04cZjQ==" + }, + "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/libsodium-wrappers-sumo": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.13.tgz", + "integrity": "sha512-lz4YdplzDRh6AhnLGF2Dj2IUj94xRN6Bh8T0HLNwzYGwPehQJX6c7iYVrFUPZ3QqxE0bqC+K0IIqqZJYWumwSQ==", + "dependencies": { + "libsodium-sumo": "^0.7.13" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "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==", + "dependencies": { + "chalk": "^2.4.1" + }, + "bin": { + "link-module-alias": "index.js" + }, + "engines": { + "node": "> 8.0.0" + } + }, + "node_modules/link-module-alias/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/link-module-alias/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/link-module-alias/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/link-module-alias/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/link-module-alias/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/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", + "peer": true + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "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.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "dev": true + }, + "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==" + }, + "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==", + "dev": true, + "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/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true, + "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/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/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==", + "dev": true + }, + "node_modules/logform": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", + "integrity": "sha512-1ulHeNPp6k/LD8H91o7VYFBng5i1BDE7HoKxVbZiGFidS1Rj65qcywLxX+pVfAPoQJEjRdvKcusKwOupHCVOVQ==", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "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==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "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==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "peer": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "dependencies": { + "tmpl": "1.0.5" + } + }, + "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==", + "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==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "peer": true + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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==", + "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==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "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==" + }, + "node_modules/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "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": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "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.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "node_modules/mocha/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==", + "dev": true + }, + "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==", + "dev": true, + "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.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "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/mocha/node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mocha/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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "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==", + "dev": 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/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" + }, + "node_modules/mustache": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", + "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", + "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==" + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "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==", + "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/no-case": { + "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_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==" + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "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.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/noms": { + "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" + } + }, + "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==", + "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==" + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/o3": { + "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" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + } + }, + "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==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "dependencies": { + "fn.name": "1.x.x" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optimism": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/optimism/-/optimism-0.18.0.tgz", + "integrity": "sha512-tGn8+REwLRNFnb9WmcY5IfpOqeX2kpaYJ1s6Ae3mn12AeydLkR3j+jSCmVQFoXqU8D41PAJ1RG1rCRNWmNZVmQ==", + "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==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "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==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, + "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==", + "dev": true, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "engines": { + "node": "*" + } + }, + "node_modules/pbkdf2": { + "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" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/periscopic/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true + }, + "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==" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dev": true, + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/protobufjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "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/protobufjs/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/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==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "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" + } + }, + "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==" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "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==", + "dev": true, + "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==" + }, + "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==", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/rehackt": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.1.0.tgz", + "integrity": "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==", + "peerDependencies": { + "@types/react": "*", + "react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + } + } + }, + "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==", + "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==", + "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/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", + "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dependencies": { + "lowercase-keys": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ripemd160": { + "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" + } + }, + "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==", + "dependencies": { + "bn.js": "^5.2.0" + }, + "bin": { + "rlp": "bin/rlp" + } + }, + "node_modules/rpc-websockets": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.11.0.tgz", + "integrity": "sha512-IkLYjayPv6Io8C/TdCL5gwgzd1hFz2vmBZrjMw/SPEXo51ETOhnzgS4Qy5GWi2JQN7HKHa66J3+2mv0fgNh/7w==", + "dependencies": { + "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.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "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" + } + ] + }, + "node_modules/safe-stable-stringify": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", + "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", + "engines": { + "node": ">=10" + } + }, + "node_modules/scrypt-js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" + }, + "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, + "dependencies": { + "elliptic": "^6.5.4", + "node-addon-api": "^2.0.0", + "node-gyp-build": "^4.2.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "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==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "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==", + "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==", + "dependencies": { + "buffer": "6.0.3" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "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" + }, + "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==", + "dependencies": { + "minimist": "^1.2.3", + "shelljs": "^0.8.5" + }, + "bin": { + "shx": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "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==", + "dependencies": { + "map-obj": "^4.1.0", + "snake-case": "^3.0.4", + "type-fest": "^3.12.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/snakecase-keys/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==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "engines": { + "node": "*" + } + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/store2": { + "version": "2.14.3", + "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz", + "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==" + }, + "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==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dev": true, + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==" + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "4.2.16", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.16.tgz", + "integrity": "sha512-mQwHpqHD2PmFcCyHaZ7XiTqposaLvJ75WpYcyY5/ce3qxbYtwQpZ+M7ZKP+2CG5U6kfnBZBpPLyofhlE6ROrnQ==", + "peer": true, + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/estree": "^1.0.1", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^4.0.0", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.4", + "periscopic": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svelte/node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "peer": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/svelte/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "peer": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/svelte2tsx": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.8.tgz", + "integrity": "sha512-ABK3RDFcy59AqAiU1N5Kxu1RnKrb1GDMrQjLgNgJfE8Q+coCKpjCAPtUVKQM2HnmuqeNWcT3NqfXbE+ZmN5Pow==", + "dependencies": { + "dedent-js": "^1.0.1", + "pascal-case": "^3.1.1" + }, + "peerDependencies": { + "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", + "typescript": "^4.9.4 || ^5.0.0" + } + }, + "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==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "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/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/through2": { + "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" + } + }, + "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==" + }, + "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==", + "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==" + }, + "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==", + "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, + "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==" + }, + "node_modules/tmp": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz", + "integrity": "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==", + "engines": { + "node": ">=14.14" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "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==", + "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==" + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.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==", + "dependencies": { + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-jest": { + "version": "29.1.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", + "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "dev": true, + "dependencies": { + "bs-logger": "0.x", + "fast-json-stable-stringify": "2.x", + "jest-util": "^29.0.0", + "json5": "^2.2.3", + "lodash.memoize": "4.x", + "make-error": "1.x", + "semver": "^7.5.3", + "yargs-parser": "^21.0.1" + }, + "bin": { + "ts-jest": "cli.js" + }, + "engines": { + "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/types": "^29.0.0", + "babel-jest": "^29.0.0", + "jest": "^29.0.0", + "typescript": ">=4.3 <6" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@jest/types": { + "optional": true + }, + "babel-jest": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/ts-jest/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ts-jest/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "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/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/ts-results": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ts-results/-/ts-results-3.3.0.tgz", + "integrity": "sha512-FWqxGX2NHp5oCyaMd96o2y2uMQmSu8Dey6kvyuFdRJ2AzfmWo3kWa4UsPlCGlfQ/qu03m09ZZtppMoY8EMHuiA==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "optional": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "optional": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/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==", + "dev": true, + "optional": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsx": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.9.3.tgz", + "integrity": "sha512-czVbetlILiyJZI5zGlj2kw9vFiSeyra9liPD4nG+Thh4pKTi0AmMEQ8zdV/L2xbIVKrIqif4sUNrsMAOksx9Zg==", + "dev": true, + "dependencies": { + "esbuild": "~0.20.2", + "get-tsconfig": "^4.7.3" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==" + }, + "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==" + }, + "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==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==" + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/u3": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/u3/-/u3-0.1.1.tgz", + "integrity": "sha512-+J5D5ir763y+Am/QY6hXNRlwljIeRMZMGs0cT6qqZVVzzT3X3nFPXVyPOFRMOR4kupB0T8JnCdpWdp6Q/iXn3w==" + }, + "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/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", + "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "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==" + }, + "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==", + "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==", + "dev": true + }, + "node_modules/v8-to-istanbul": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", + "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/vlq": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz", + "integrity": "sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==" + }, + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "dependencies": { + "makeerror": "1.0.12" + } + }, + "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==" + }, + "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==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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==", + "dependencies": { + "bs58check": "<3.0.0" + } + }, + "node_modules/winston": { + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.13.0.tgz", + "integrity": "sha512-rwidmA1w3SE4j0E5MuIufFhyJPBDG7Nu71RkZor1p2+qHvJSZ9GYDA81AyleQcZbh/+V6HjeBdfnTZJm9rSeQQ==", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.2", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.4.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.7.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.7.0.tgz", + "integrity": "sha512-ajBj65K5I7denzer2IYW6+2bNIVqLGDHqDw3Ow8Ohh+vdW+rv4MZ6eiDvHoKhfJFZ2auyN8byXieDDJ96ViONg==", + "dependencies": { + "logform": "^2.3.2", + "readable-stream": "^3.6.0", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "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/wrap-ansi/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==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/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==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/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==" + }, + "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==" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", + "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "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/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==", + "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==", + "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==", + "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==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "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==", + "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==", + "dev": true, + "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/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "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==", + "dev": true, + "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==" + }, + "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==", + "dependencies": { + "zen-observable": "0.8.15" + } + }, + "solana": { + "name": "@wormhole-foundation/swap-layer-solana", + "version": "1.0.0", + "dependencies": { + "@certusone/wormhole-sdk": "^0.10.10", + "@coral-xyz/anchor": "^0.30.0", + "@jup-ag/api": "^6.0.20-test", + "@solana/spl-token": "^0.4.3", + "@solana/web3.js": "^1.91.6", + "@types/node-fetch": "^2.6.11", + "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", + "@wormhole-foundation/sdk-base": "^0.6.8", + "@wormhole-foundation/sdk-definitions": "^0.6.8", + "@wormhole-foundation/sdk-evm": "0.6.8", + "@wormhole-foundation/sdk-solana": "^0.6.8", + "@wormhole-foundation/sdk-solana-core": "^0.6.8", + "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", + "chai-as-promised": "^7.1.1", + "ts-results": "^3.3.0", + "tsx": "^4.7.2" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "@types/node": "^20.12.7", + "@types/node-fetch": "^2.6.11", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "ts-results": "^3.3.0", + "tsx": "^4.7.2" + } + }, + "solana/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 00000000..1bc648e9 --- /dev/null +++ b/package.json @@ -0,0 +1,34 @@ +{ + "name": "@wormhole-foundation/swap-layer", + "version": "0.0.1", + "description": "", + "main": "index.js", + "type": "module", + "scripts": { + "build": "npm run build --workspaces --if-present", + "generate": "npm run generate --workspaces --if-present", + "test": "npm run test --workspaces --if-present" + }, + "dependencies": { + "@wormhole-foundation/sdk": "^0.6.8" + }, + "devDependencies": { + "typescript": "5.4.5", + "@types/chai": "^4.3.5", + "@types/jest": "^29.5.12", + "@types/node": "^20.4.1", + "prettier": "^3.0.3", + "jest": "^29.7.0", + "ts-jest": "^29.1.2", + "ts-node": "^10.9.1", + "chai": "^4.3.7", + "chai-as-promised": "^7.1.1" + }, + "keywords": [ + "wormhole" + ], + "workspaces": [ + "evm/ts-sdk", + "solana" + ] +} \ No newline at end of file diff --git a/solana/.gitignore b/solana/.gitignore new file mode 100644 index 00000000..23214334 --- /dev/null +++ b/solana/.gitignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +ts/tests/artifacts \ No newline at end of file diff --git a/solana/.prettierignore b/solana/.prettierignore new file mode 100644 index 00000000..c1a0b75f --- /dev/null +++ b/solana/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/solana/.prettierrc.json b/solana/.prettierrc.json new file mode 100644 index 00000000..b1db937c --- /dev/null +++ b/solana/.prettierrc.json @@ -0,0 +1,15 @@ +{ + "overrides": [ + { + "files": "*.ts", + "options": { + "printWidth": 100, + "tabWidth": 4, + "useTabs": false, + "singleQuote": false, + "trailingComma": "all", + "bracketSpacing": true + } + } + ] +} diff --git a/solana/Anchor.toml b/solana/Anchor.toml new file mode 100644 index 00000000..e78e9192 --- /dev/null +++ b/solana/Anchor.toml @@ -0,0 +1,245 @@ +[toolchain] +anchor_version = "0.30.0" # CLI +solana_version = "1.18.11" + +[features] +resolution = false +skip-lint = false + +[workspace] +members = [ + "programs/swap-layer" +] + +[programs.localnet] +swap_layer = "SwapLayer1111111111111111111111111111111111" + +[registry] +url = "https://api.apr.dev" + +[provider] +cluster = "Localnet" +wallet = "ts/tests/keys/pFCBP4bhqdSsrWUVTgqhPsLrfEdChBK17vgFM7TxjxQ.json" + +[scripts] +test = "npx ts-mocha -p ./tsconfig.anchor-test.json -t 1000000 --bail --exit ts/tests/[0-9]*.ts" + +[test] +startup_wait = 20000 + +[test.validator] +url = "https://api.mainnet-beta.solana.com" + +### At 160 ticks/s, 64 ticks per slot implies that leader rotation and voting will happen +### every 400 ms. A fast voting cadence ensures faster finality and convergence +ticks_per_slot = 16 + +### Wormhole Core Bridge Program +[[test.genesis]] +address = "worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth" +program = "ts/tests/artifacts/mainnet_core_bridge.so" + +### Circle Message Transmitter Program +[[test.genesis]] +address = "CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd" +program = "ts/tests/artifacts/mainnet_cctp_message_transmitter.so" + +### Circle Token Messenger Minter Program +[[test.genesis]] +address = "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3" +program = "ts/tests/artifacts/mainnet_cctp_token_messenger_minter.so" + +### USDC Mint +[[test.validator.account]] +address = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/usdc_mint.json" + +### Payer Token Account -- USDC +[[test.validator.account]] +address = "4tKtuvtQ4TzkkrkESnRpbfSXCEZPkZe3eL5tCFUdpxtf" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/usdc_payer_token.json" + +### Circle Token Messenger Minter PDA -- Token Messenger +[[test.validator.account]] +address = "Afgq3BHEfCE7d78D2XE9Bfyu2ieDqvE24xX8KDwreBms" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/token_messenger.json" + +### Circle Token Messenger Minter PDA -- Token Minter +[[test.validator.account]] +address = "DBD8hAwLDRQkTsu6EqviaYNGKPnsAMmQonxf7AH8ZcFY" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/token_minter.json" + +### Circle Token Messenger Minter PDA -- USDC Custody Token Account +[[test.validator.account]] +address = "FSxJ85FXVsXSr51SeWf9ciJWTcRnqKFSmBgRDeL3KyWw" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/usdc_custody_token.json" + +### Circle Token Messenger Minter PDA -- USDC Local Token +[[test.validator.account]] +address = "72bvEFk2Usi2uYc1SnaTNhBcQPc6tiJWXr9oKk7rkd4C" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/usdc_local_token.json" + +### Circle Token Messenger Minter PDA -- USDC Token Pair +[[test.validator.account]] +address = "8d1jdvvMFhJfxSzPXcDGtifcGMTvUxc2EpWFstbNzcTL" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/usdc_token_pair.json" + +### Circle Token Messenger Minter PDA -- Ethereum Remote Token Messenger +[[test.validator.account]] +address = "Hazwi3jFQtLKc2ughi7HFXPkpDeso7DQaMR9Ks4afh3j" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/ethereum_remote_token_messenger.json" + +### Circle Token Messenger Minter PDA -- Arbitrum Remote Token Messenger +[[test.validator.account]] +address = "REzxi9nX3Eqseha5fBiaJhTC6SFJx4qJhP83U4UCrtc" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/arbitrum_remote_token_messenger.json" + +### Circle Token Messenger Minter PDA -- Base Remote Token Messenger +[[test.validator.account]] +address = "BWyFzH6LsnmDAaDWbGsriQ9SiiKq1CF6pbH4Ye3kzSBV" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/misconfigured_remote_token_messenger.json" + +### Circle Message Transmitter PDA -- Message Transmitter Config +[[test.validator.account]] +address = "BWrwSWjbikT3H7qHAkUEbLmwDQoB4ZDJ4wcSEhSPTZCu" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/message_transmitter/message_transmitter_config.json" + +### Wormhole Core Bridge -- Config +[[test.validator.account]] +address = "2yVjuQwpsvdsrywzsJJVs9Ueh4zayyo5DYJbBNc3DDpn" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/core_bridge/config.json" + +### Wormhole Core Bridge -- Fee Collector +[[test.validator.account]] +address = "9bFNrXNb2WTx8fMHXCheaZqkLZ3YCCaiqTftHxeintHy" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/core_bridge/fee_collector.json" + +### Wormhole Core Bridge -- Guardian Set 0 +[[test.validator.account]] +address = "DS7qfSAgYsonPpKoAjcGhX9VFjXdGkiHjEDkTidf8H2P" +filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/core_bridge/guardian_set_0.json" + +### Localnet Matching Engine Program +[[test.genesis]] +address = "MatchingEngine11111111111111111111111111111" +program = "../lib/example-liquidity-layer/solana/target/deploy/matching_engine.so" + +### Localnet Matching Engine -- Custodian +[[test.validator.account]] +address = "8h2y1vLbZGtjuiULKf7aXTE43xDVepegFCpdsvyGfjna" +filename = "ts/tests/accounts/matching_engine/matching_engine_custodian.json" + +### Localnet Matching Engine - Ethereum Endpoint +[[test.validator.account]] +address = "BCyuV2SuRRfVBcCG82mtK9svwH9kTFtqGHdhLrfGJbzS" +filename = "ts/tests/accounts/matching_engine/ethereum_token_router_endpoint.json" + +### Localnet Matching Engine -- Local Endpoint +[[test.validator.account]] +address = "DM2XBh6idYEGffbmpXpZ8imvvqr3wiGWQSPDPi7DUhK6" +filename = "ts/tests/accounts/matching_engine/local_token_router_endpoint.json" + +### Localnet Matching Engine - Mint Recipient +[[test.validator.account]] +address = "35iwWKi7ebFyXNaqpswd1g9e9jrjvqWPV39nCQPaBbX1" +filename = "ts/tests/accounts/matching_engine/matching_engine_mint_recipient.json" + +### Localnet Matching Engine - Local Custody Token (Ethereum) +[[test.validator.account]] +address = "Gv92Ev9RGL5gDrJe4QW7UuFqhDPtowcWsDEK5TFuxEXk" +filename = "ts/tests/accounts/matching_engine/local_custody_token_ethereum.json" + +### Localnet Token Router Program +[[test.genesis]] +address = "TokenRouter11111111111111111111111111111111" +program = "../lib/example-liquidity-layer/solana/target/deploy/token_router.so" + +### Localnet Token Router -- Custodian +[[test.validator.account]] +address = "EfVKoFHtCktpNTk3NbayPpRNo8rR7prvcV4M9Mvxd6ko" +filename = "ts/tests/accounts/token_router/token_router_custodian.json" + +### Localnet Token Router - Mint Recipient +[[test.validator.account]] +address = "4TTRh2xhgbxnJC1y3EdcPC6MMYyLyasaQqkYDEgnaF8i" +filename = "ts/tests/accounts/token_router/token_router_mint_recipient.json" + +### Payer USDT Token Account +[[test.validator.account]] +address = "4MXG73DEVVRN9xiJavCkFVFtZdYBrKmD1hjxmTtNoZnA" +filename = "ts/tests/accounts/payer_usdt_token.json" + +### USDT Mint +[[test.validator.account]] +address = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB" +filename = "ts/tests/accounts/usdt_mint.json" + +### Jupiter V6 Program +[[test.genesis]] +address = "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4" +program = "ts/tests/artifacts/mainnet_jupiter_v6.so" + +### Whirlpool Program +[[test.genesis]] +address = "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc" +program = "ts/tests/artifacts/mainnet_whirlpool.so" + +### Jupiter V6 -- Custody Token Owner +[[test.validator.account]] +address = "BQ72nSv9f3PRyRKCBnHLVrerrv37CYTHm5h3s9VSGQDV" +filename = "ts/tests/accounts/jupiter/jupiter_custody_owner.json" + +### Jupiter V6 -- USDC Custody Token +[[test.validator.account]] +address = "7u7cD7NxcZEuzRCBaYo8uVpotRdqZwez47vvuwzCov43" +filename = "ts/tests/accounts/jupiter/jupiter_usdc_custody_token.json" + +### Jupiter V6 -- USDT Custody Token +[[test.validator.account]] +address = "6pXVFSACE5BND2C3ibGRWMG1fNtV7hfynWrfNKtCXhN3" +filename = "ts/tests/accounts/jupiter/jupiter_usdt_custody_token.json" + +### Jupiter V6 -- LUT #1 +[[test.validator.account]] +address = "GxS6FiQ3mNnAar9HGQ6mxP7t6FcwmHkU7peSeQDUHmpN" +filename = "ts/tests/accounts/jupiter/jupiter_lut1.json" + +### Whirlpool -- USDC-USDT Pool +[[test.validator.account]] +address = "4fuUiYxTQ6QCrdSq9ouBYcTM7bqSwYTSyLueGZLTy4T4" +filename = "ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_pool.json" + +### Whirlpool -- USDC-USDT Pool -- USDC Vault +[[test.validator.account]] +address = "4oY1eVHJrt7ywuFoQnAZwto4qcQip1QhYMAhD11PU4QL" +filename = "ts/tests/accounts/whirlpool/whirlpool_usdc_vault.json" + +### Whirlpool -- USDC-USDT Pool -- USDT Vault +[[test.validator.account]] +address = "4dSG9tKHZR4CAictyEnH9XuGZyKapodWXq5xyg7uFwE9" +filename = "ts/tests/accounts/whirlpool/whirlpool_usdt_vault.json" + +### Whirlpool -- USDC-USDT Pool Tick Array 0 +[[test.validator.account]] +address = "FqFkv2xNNCUyx1RYV61pGZ9AMzGfgcD8uXC9zCF5JKnR" +filename = "ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__0.json" + +### Whirlpool -- USDC-USDT Pool Tick Array 1 +[[test.validator.account]] +address = "8kZSTVuV7C4GD9ZVR4wDtRSXv1SvsSQPfqUbthueRNGV" +filename = "ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__1.json" + +### Whirlpool -- USDC-USDT Pool Tick Array 2 +[[test.validator.account]] +address = "2B48L1ACPvVb67UKeSMkUGdzrnhvNMm6pFt2nspGKxs4" +filename = "ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__2.json" + +### Whirlpool -- USDC-USDT Pool Tick Array 3 +[[test.validator.account]] +address = "A7sdy3NoAZp49cQNpreMGARAb9QJjYrrSyDALhThgk3D" +filename = "ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__3.json" + +### Whirlpool -- USDC-USDT Pool Tick Array 4 +[[test.validator.account]] +address = "9opqNK3dWUijw8VNLtvne4juCTq1qADaph29tZqkoZHa" +filename = "ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__4.json" \ No newline at end of file diff --git a/solana/Cargo.lock b/solana/Cargo.lock new file mode 100644 index 00000000..9b3cb1c0 --- /dev/null +++ b/solana/Cargo.lock @@ -0,0 +1,2857 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "aead" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +dependencies = [ + "generic-array", +] + +[[package]] +name = "aes" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", + "opaque-debug", +] + +[[package]] +name = "aes-gcm-siv" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" +dependencies = [ + "aead", + "aes", + "cipher", + "ctr", + "polyval", + "subtle", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.14", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "anchor-attribute-access-control" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd7368e171b3a317885dc08ec0f74eed9d0ad6c726cc819593aed81440dca926" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-account" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f527df85a8cba3f2bea04e46ed71b66e525ea378c7fec538aa205f4520b73e31" +dependencies = [ + "anchor-syn", + "bs58 0.5.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-constant" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb1dc1845cf8636c2e046a274ca074dabd3884ac8ed11cc4ed64b7e8ef5a318" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-error" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f382e41514c59a77ffa7bb1a47df9a0359564a749b6934485c742c11962e540" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-event" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "473a122aeed3f6b666438236338d2ef7833ee5fdc5688e1baa80185d61088a53" +dependencies = [ + "anchor-syn", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-attribute-program" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f88c7ffe2eb40aeac43ffd0d74a6671581158aedfaa0552330a2ef92fa5c889" +dependencies = [ + "anchor-lang-idl", + "anchor-syn", + "anyhow", + "bs58 0.5.1", + "heck", + "proc-macro2", + "quote", + "serde_json", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-accounts" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed9b97c99dcec135aae0ff908c14bcfcd3e78cfc16a0c6f245135038f0e6d390" +dependencies = [ + "anchor-syn", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-serde" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbece98f6ad9c37070edc0841326c9623a249346cd74f433e7cef69b14f7f31d" +dependencies = [ + "anchor-syn", + "borsh-derive-internal 0.10.3", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-derive-space" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8badbe2648bc99a85ee05a7a5f9512e5e2af8ffac71476a69350cb278057ac53" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "anchor-lang" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e41feb9c1cd9f4b0fad1c004fc8f289183f3ce27e9db38fa6e434470c716fb1e" +dependencies = [ + "anchor-attribute-access-control", + "anchor-attribute-account", + "anchor-attribute-constant", + "anchor-attribute-error", + "anchor-attribute-event", + "anchor-attribute-program", + "anchor-derive-accounts", + "anchor-derive-serde", + "anchor-derive-space", + "anchor-lang-idl", + "arrayref", + "base64 0.21.7", + "bincode", + "borsh 0.10.3", + "bytemuck", + "getrandom 0.2.14", + "solana-program", + "thiserror", +] + +[[package]] +name = "anchor-lang-idl" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b29da81eae478b1bb846749b06b8a2cb9c6f9ed26ca793b0c916793fdf36adab" +dependencies = [ + "anchor-syn", + "anyhow", + "regex", + "serde", + "serde_json", +] + +[[package]] +name = "anchor-spl" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dcee54a30b27ea8317ca647759b5d9701a8c7caaaa0c922c6d3c306a7278a7a" +dependencies = [ + "anchor-lang", + "spl-associated-token-account", + "spl-pod", + "spl-token", + "spl-token-2022", + "spl-token-group-interface", + "spl-token-metadata-interface", +] + +[[package]] +name = "anchor-syn" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac53f2378bc08e89e20c2b893c01986ffd34cfbc69a17e35bd6f754753e9fdad" +dependencies = [ + "anyhow", + "bs58 0.5.1", + "cargo_toml", + "heck", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2 0.10.8", + "syn 1.0.109", + "thiserror", +] + +[[package]] +name = "anyhow" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f538837af36e6f6a9be0faa67f9a314f8119e4e4b5867c6ab40ed60360142519" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-std", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", + "itertools", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm", + "ark-ff-macros", + "ark-serialize", + "ark-std", + "derivative", + "digest 0.10.7", + "itertools", + "num-bigint", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff", + "ark-serialize", + "ark-std", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive", + "ark-std", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "assert_matches" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80" + +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bincode" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +dependencies = [ + "serde", +] + +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "blake3" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "digest 0.10.7", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-padding" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" + +[[package]] +name = "borsh" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" +dependencies = [ + "borsh-derive 0.9.3", + "hashbrown 0.11.2", +] + +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive 0.10.3", + "hashbrown 0.13.2", +] + +[[package]] +name = "borsh" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe5b10e214954177fb1dc9fbd20a1a2608fe99e6c832033bdc7cea287a20d77" +dependencies = [ + "borsh-derive 1.5.0", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" +dependencies = [ + "borsh-derive-internal 0.9.3", + "borsh-schema-derive-internal 0.9.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal 0.10.3", + "borsh-schema-derive-internal 0.10.3", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a8646f94ab393e43e8b35a2558b1624bed28b97ee09c5d15456e3c9463f46d" +dependencies = [ + "once_cell", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.60", + "syn_derive", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bv" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +dependencies = [ + "feature-probe", + "serde", +] + +[[package]] +name = "bytemuck" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cargo_toml" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" +dependencies = [ + "serde", + "toml 0.8.12", +] + +[[package]] +name = "cc" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "065a29261d53ba54260972629f9ca6bffa69bac13cd1fed61420f7fa68b9f8bd" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "num-traits", +] + +[[package]] +name = "cipher" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +dependencies = [ + "generic-array", +] + +[[package]] +name = "console_error_panic_hook" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +dependencies = [ + "cfg-if", + "wasm-bindgen", +] + +[[package]] +name = "console_log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" +dependencies = [ + "log", + "web-sys", +] + +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "crypto-mac" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "ctr" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +dependencies = [ + "cipher", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "serde", + "subtle", + "zeroize", +] + +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.60", +] + +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "derivation-path" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-dalek-bip32" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" +dependencies = [ + "derivation-path", + "ed25519-dalek", + "hmac 0.12.1", + "sha2 0.10.8", +] + +[[package]] +name = "either" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" + +[[package]] +name = "env_logger" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" +dependencies = [ + "atty", + "humantime", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "feature-probe" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "serde", + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.11", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hmac" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" +dependencies = [ + "crypto-mac", + "digest 0.9.0", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "hmac-drbg" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" +dependencies = [ + "digest 0.9.0", + "generic-array", + "hmac 0.8.1", +] + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "im" +version = "15.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core 0.6.4", + "rand_xoshiro", + "rayon", + "serde", + "sized-chunks", + "typenum", + "version_check", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "hmac-drbg", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", + "typenum", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254", + "ark-ff", + "num-bigint", + "thiserror", +] + +[[package]] +name = "liquidity-layer-common-solana" +version = "0.0.0" +dependencies = [ + "anchor-lang", + "cfg-if", + "liquidity-layer-messages", + "solana-program", + "wormhole-cctp-solana", + "wormhole-solana-consts", +] + +[[package]] +name = "liquidity-layer-messages" +version = "0.0.0" +dependencies = [ + "wormhole-io", + "wormhole-raw-vaas", +] + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "matching-engine" +version = "0.0.0" +dependencies = [ + "anchor-lang", + "anchor-spl", + "cfg-if", + "hex", + "liquidity-layer-common-solana", + "ruint", + "solana-program", + "wormhole-solana-utils", +] + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "parking_lot" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pbkdf2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" +dependencies = [ + "crypto-mac", +] + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "polyval" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +dependencies = [ + "cfg-if", + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml 0.5.11", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.81" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "qstring" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.14", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "ruint" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77e1574d439643c8962edf612a888e7cc5581bcdf36cb64e6bc88466b03b2daa" +dependencies = [ + "ruint-macro", + "thiserror", +] + +[[package]] +name = "ruint-macro" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f86854cf50259291520509879a5c294c3c9a4c334e9ff65071c51e42ef1e2343" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" + +[[package]] +name = "serde" +version = "1.0.199" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c9f6e76df036c77cd94996771fb40db98187f096dd0b9af39c6c6e452ba966a" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_bytes" +version = "0.11.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_derive" +version = "1.0.199" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11bd257a6541e141e42ca6d24ae26f7714887b47e89aa739099104c7e4d3b7fc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "serde_json" +version = "1.0.116" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_with" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" +dependencies = [ + "serde", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.7", +] + +[[package]] +name = "sha3" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "keccak", + "opaque-debug", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest 0.10.7", + "keccak", +] + +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "solana-frozen-abi" +version = "1.18.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b8177685ab2bc8cc8b3bf63aa1eaa0580d5af850ecefac323ca1c2473085d77" +dependencies = [ + "block-buffer 0.10.4", + "bs58 0.4.0", + "bv", + "either", + "generic-array", + "im", + "lazy_static", + "log", + "memmap2", + "rustc_version", + "serde", + "serde_bytes", + "serde_derive", + "sha2 0.10.8", + "solana-frozen-abi-macro", + "subtle", + "thiserror", +] + +[[package]] +name = "solana-frozen-abi-macro" +version = "1.18.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a68241cad17b74c6034a68ba4890632d409a2c886e7bead9c1e1432befdb7c9" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.60", +] + +[[package]] +name = "solana-logger" +version = "1.18.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea560989ef67ba4a1a0fd62a248721f1aa5bac8fa5ede9ccf4fe9ee484ccadf" +dependencies = [ + "env_logger", + "lazy_static", + "log", +] + +[[package]] +name = "solana-program" +version = "1.18.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bddf573103c890b4ab8f9a6641d4f969d4148bce9a451c263f4a62afa949fae" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "base64 0.21.7", + "bincode", + "bitflags", + "blake3", + "borsh 0.10.3", + "borsh 0.9.3", + "borsh 1.5.0", + "bs58 0.4.0", + "bv", + "bytemuck", + "cc", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.2.14", + "itertools", + "js-sys", + "lazy_static", + "libc", + "libsecp256k1", + "light-poseidon", + "log", + "memoffset", + "num-bigint", + "num-derive", + "num-traits", + "parking_lot", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "sha2 0.10.8", + "sha3 0.10.8", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-sdk-macro", + "thiserror", + "tiny-bip39", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "solana-sdk" +version = "1.18.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08b24b06fa176209ddb2a2f8172a00b07e8a3b18229fbfc49f1eb3ce6ad11ff1" +dependencies = [ + "assert_matches", + "base64 0.21.7", + "bincode", + "bitflags", + "borsh 1.5.0", + "bs58 0.4.0", + "bytemuck", + "byteorder", + "chrono", + "derivation-path", + "digest 0.10.7", + "ed25519-dalek", + "ed25519-dalek-bip32", + "generic-array", + "hmac 0.12.1", + "itertools", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memmap2", + "num-derive", + "num-traits", + "num_enum", + "pbkdf2 0.11.0", + "qstring", + "qualifier_attr", + "rand 0.7.3", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "serde_json", + "serde_with", + "sha2 0.10.8", + "sha3 0.10.8", + "siphasher", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-logger", + "solana-program", + "solana-sdk-macro", + "thiserror", + "uriparse", + "wasm-bindgen", +] + +[[package]] +name = "solana-sdk-macro" +version = "1.18.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "869483c05f18d37d4d95a08d9e05e00a4f76a8c8349aeedeee9ba2d013cbacde" +dependencies = [ + "bs58 0.4.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.60", +] + +[[package]] +name = "solana-security-txt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" + +[[package]] +name = "solana-zk-token-sdk" +version = "1.18.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "459c27f7b954798677d8243aa53b8080cfb314ecfecbf8889a5a65c91ad11fee" +dependencies = [ + "aes-gcm-siv", + "base64 0.21.7", + "bincode", + "bytemuck", + "byteorder", + "curve25519-dalek", + "getrandom 0.1.16", + "itertools", + "lazy_static", + "merlin", + "num-derive", + "num-traits", + "rand 0.7.3", + "serde", + "serde_json", + "sha3 0.9.1", + "solana-program", + "solana-sdk", + "subtle", + "thiserror", + "zeroize", +] + +[[package]] +name = "spl-associated-token-account" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2e688554bac5838217ffd1fab7845c573ff106b6336bf7d290db7c98d5a8efd" +dependencies = [ + "assert_matches", + "borsh 1.5.0", + "num-derive", + "num-traits", + "solana-program", + "spl-token", + "spl-token-2022", + "thiserror", +] + +[[package]] +name = "spl-discriminator" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34d1814406e98b08c5cd02c1126f83fd407ad084adce0b05fda5730677822eac" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator-derive", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" +dependencies = [ + "quote", + "spl-discriminator-syn", + "syn 2.0.60", +] + +[[package]] +name = "spl-discriminator-syn" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.60", + "thiserror", +] + +[[package]] +name = "spl-memo" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58e9bae02de3405079a057fe244c867a08f92d48327d231fc60da831f94caf0a" +dependencies = [ + "solana-program", +] + +[[package]] +name = "spl-pod" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046ce669f48cf2eca1ec518916d8725596bfb655beb1c74374cf71dc6cb773c9" +dependencies = [ + "borsh 1.5.0", + "bytemuck", + "solana-program", + "solana-zk-token-sdk", + "spl-program-error", +] + +[[package]] +name = "spl-program-error" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49065093ea91f57b9b2bd81493ff705e2ad4e64507a07dbc02b085778e02770e" +dependencies = [ + "num-derive", + "num-traits", + "solana-program", + "spl-program-error-derive", + "thiserror", +] + +[[package]] +name = "spl-program-error-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.60", +] + +[[package]] +name = "spl-tlv-account-resolution" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cace91ba08984a41556efe49cbf2edca4db2f577b649da7827d3621161784bf8" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-token" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ae123223633a389f95d1da9d49c2d0a50d499e7060b9624626a69e536ad2a4" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-program", + "thiserror", +] + +[[package]] +name = "spl-token-2022" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5412f99ae7ee6e0afde00defaa354e6228e47e30c0e3adf553e2e01e6abb584" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-program", + "solana-security-txt", + "solana-zk-token-sdk", + "spl-memo", + "spl-pod", + "spl-token", + "spl-token-group-interface", + "spl-token-metadata-interface", + "spl-transfer-hook-interface", + "spl-type-length-value", + "thiserror", +] + +[[package]] +name = "spl-token-group-interface" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d419b5cfa3ee8e0f2386fd7e02a33b3ec8a7db4a9c7064a2ea24849dc4a273b6" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "spl-token-metadata-interface" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30179c47e93625680dabb620c6e7931bd12d62af390f447bc7beb4a3a9b5feee" +dependencies = [ + "borsh 1.5.0", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-type-length-value", +] + +[[package]] +name = "spl-transfer-hook-interface" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66a98359769cd988f7b35c02558daa56d496a7e3bd8626e61f90a7c757eedb9b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", + "spl-tlv-account-resolution", + "spl-type-length-value", +] + +[[package]] +name = "spl-type-length-value" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "422ce13429dbd41d2cee8a73931c05fda0b0c8ca156a8b0c19445642550bb61a" +dependencies = [ + "bytemuck", + "solana-program", + "spl-discriminator", + "spl-pod", + "spl-program-error", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "swap-layer" +version = "0.0.0" +dependencies = [ + "anchor-lang", + "anchor-spl", + "hex", + "hex-literal", + "liquidity-layer-common-solana", + "ruint", + "solana-program", + "swap-layer-messages", + "token-router", + "wormhole-solana-utils", +] + +[[package]] +name = "swap-layer-messages" +version = "0.0.0" +dependencies = [ + "anchor-lang", + "liquidity-layer-messages", + "ruint", + "wormhole-io", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "tiny-bip39" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" +dependencies = [ + "anyhow", + "hmac 0.8.1", + "once_cell", + "pbkdf2 0.4.0", + "rand 0.7.3", + "rustc-hash", + "sha2 0.9.9", + "thiserror", + "unicode-normalization", + "wasm-bindgen", + "zeroize", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "token-router" +version = "0.0.0" +dependencies = [ + "anchor-lang", + "anchor-spl", + "cfg-if", + "hex", + "liquidity-layer-common-solana", + "matching-engine", + "ruint", + "solana-program", + "wormhole-solana-utils", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.12", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.7", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "universal-hash" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +dependencies = [ + "generic-array", + "subtle", +] + +[[package]] +name = "uriparse" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" +dependencies = [ + "fnv", + "lazy_static", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.60", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14b9415ee827af173ebb3f15f9083df5a122eb93572ec28741fb153356ea2578" +dependencies = [ + "memchr", +] + +[[package]] +name = "wormhole-cctp-solana" +version = "0.3.0-alpha.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfda30ba64ddd6d94dca698d303cea0d8e17d0583aa78e2b6323aab74a810715" +dependencies = [ + "anchor-lang", + "anchor-spl", + "hex", + "ruint", + "solana-program", + "wormhole-io", + "wormhole-raw-vaas", + "wormhole-solana-consts", + "wormhole-solana-utils", + "wormhole-solana-vaas", +] + +[[package]] +name = "wormhole-io" +version = "0.3.0-alpha.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368a84e63dd54b08b1262f848221c356b17956d267c7f72fbcb374e12c373180" + +[[package]] +name = "wormhole-raw-vaas" +version = "0.3.0-alpha.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0e6f86cd1e555a969ffc6fa1f3306da9d45557d1bec91959474b70fcee8c8ac" + +[[package]] +name = "wormhole-solana-consts" +version = "0.3.0-alpha.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f5547b17820c264bc805be3408ff2d435f30995a5b3023ba6095f74d01ce74" +dependencies = [ + "cfg-if", + "solana-program", +] + +[[package]] +name = "wormhole-solana-utils" +version = "0.3.0-alpha.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5372a25072a8d82772ee912a949ff6ee182f7ea38a88d458b6ee23b0b32e5235" +dependencies = [ + "anchor-lang", + "solana-program", +] + +[[package]] +name = "wormhole-solana-vaas" +version = "0.3.0-alpha.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbd606eb259033e40b74e8501e1d4a90276a595582765a6fd49bbeec1ab3fbe1" +dependencies = [ + "anchor-lang", + "borsh 0.10.3", + "solana-program", + "wormhole-raw-vaas", + "wormhole-solana-consts", +] + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "zeroize" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.60", +] diff --git a/solana/Cargo.toml b/solana/Cargo.toml new file mode 100644 index 00000000..32b644af --- /dev/null +++ b/solana/Cargo.toml @@ -0,0 +1,81 @@ +[workspace] +members = [ + "programs/swap-layer" +] +resolver = "2" + +[workspace.package] +edition = "2021" +version = "0.0.0" +authors = ["Wormhole Contributors"] +license = "Apache-2.0" +homepage = "https://https://github.com/xlabs" +repository = "https://github.com/xlabs/swap-layer" + +[workspace.dependencies.common] +package = "liquidity-layer-common-solana" +path = "../lib/example-liquidity-layer/solana/modules/common" + +[workspace.dependencies.token-router] +path = "../lib/example-liquidity-layer/solana/programs/token-router" +features = ["cpi"] + +[workspace.dependencies.matching-engine] +path = "../lib/example-liquidity-layer/solana/programs/matching-engine" +features = ["no-entrypoint"] + +[workspace.dependencies.swap-layer-messages] +path = "../universal/rs/messages" + +[workspace.dependencies] +anchor-lang = "=0.30.0" +anchor-spl = "=0.30.0" +solana-program = "=1.18.11" +hex = "0.4.3" +ruint = "1.9.0" +cfg-if = "1.0" +hex-literal = "0.4.1" + +wormhole-raw-vaas = "0.3.0-alpha.0" +wormhole-solana-consts = "0.3.0-alpha.0" +wormhole-solana-utils = "0.3.0-alpha.0" +wormhole-cctp-solana = "0.3.0-alpha.0" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 + +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 + +[workspace.lints.clippy] +correctness = { level = "warn"} + +arithmetic_side_effects = "deny" +as_conversions = "deny" +cast_abs_to_unsigned = "deny" +cast_lossless= "deny" +cast_possible_truncation = "deny" +cast_possible_wrap = "deny" +cast_precision_loss = "deny" +cast_sign_loss = "deny" +eq_op = "deny" +expect_used = "deny" +float_cmp = "deny" +integer_division = "deny" +large_futures = "deny" +large_stack_arrays = "deny" +large_stack_frames = "deny" +lossy_float_literal = "deny" +manual_slice_size_calculation = "deny" +modulo_one = "deny" +out_of_bounds_indexing = "deny" +overflow_check_conditional = "deny" +panic = "deny" +recursive_format_impl = "deny" +todo = "deny" +unchecked_duration_subtraction = "deny" +unreachable = "deny" diff --git a/solana/Makefile b/solana/Makefile new file mode 100644 index 00000000..e21349b5 --- /dev/null +++ b/solana/Makefile @@ -0,0 +1,77 @@ +CLONED_PROGRAMS=\ + ts/tests/artifacts/mainnet_core_bridge.so \ + ts/tests/artifacts/mainnet_cctp_token_messenger_minter.so \ + ts/tests/artifacts/mainnet_cctp_message_transmitter.so \ + ts/tests/artifacts/mainnet_jupiter_v6.so \ + ts/tests/artifacts/mainnet_whirlpool.so + +.PHONY: all +all: check + +.PHONY: check +check: + cargo check --workspace --all-targets --all-features + +.PHONY: clean +clean: + anchor clean + rm -rf node_modules artifacts-mainnet artifacts-testnet artifacts-localnet ts/tests/artifacts + +.PHONY: fast-transfer-sync +fast-transfer-sync: + cd .. && $(MAKE) fast-transfer-sync + +../node_modules: + cd .. && $(MAKE) node_modules + +.PHONY: clippy +clippy: + cargo clippy --workspace --no-deps --all-targets --all-features -- -Dwarnings + +.PHONY: lint +lint: fast-transfer-sync + cargo fmt --check + $(MAKE) clippy + +.PHONY: cargo-test +cargo-test: fast-transfer-sync + cargo test --workspace --all-targets --features $(NETWORK) + +.PHONY: anchor-test +anchor-test: ../node_modules $(CLONED_PROGRAMS) +# Omitting since node_modules runs the same command +# ifndef SKIP_SUBMODULE_BUILD +# cd .. && $(MAKE) fast-transfer-setup +# endif + anchor test -- --features integration-test + +.PHONY: anchor-build-idl +anchor-build-idl: + anchor build -- --features localnet +#git diff --exit-code + +.PHONY: cargo-test-all +cargo-test-all: + NETWORK=localnet $(MAKE) cargo-test + NETWORK=testnet $(MAKE) cargo-test + +ts/tests/artifacts: + mkdir ts/tests/artifacts + +ts/tests/artifacts/mainnet_core_bridge.so: ts/tests/artifacts + solana program dump -u m worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth ts/tests/artifacts/mainnet_core_bridge.so + +ts/tests/artifacts/mainnet_cctp_token_messenger_minter.so: ts/tests/artifacts + solana program dump -u m CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3 ts/tests/artifacts/mainnet_cctp_token_messenger_minter.so + +ts/tests/artifacts/mainnet_cctp_message_transmitter.so: ts/tests/artifacts + solana program dump -u m CCTPmbSD7gX1bxKPAmg77w8oFzNFpaQiQUWD43TKaecd ts/tests/artifacts/mainnet_cctp_message_transmitter.so + +ts/tests/artifacts/mainnet_jupiter_v6.so: ts/tests/artifacts + solana program dump -u m JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4 ts/tests/artifacts/mainnet_jupiter_v6.so + +ts/tests/artifacts/mainnet_whirlpool.so: ts/tests/artifacts + solana program dump -u m whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc ts/tests/artifacts/mainnet_whirlpool.so + +../lib/example-liquidity-layer/solana/artifacts-localnet: + cd ../lib/example-liquidity-layer/solana && NETWORK=localnet $(MAKE) build diff --git a/solana/a.json b/solana/a.json new file mode 100644 index 00000000..a1b92795 --- /dev/null +++ b/solana/a.json @@ -0,0 +1,131 @@ +{ + "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "accounts": [ + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "GGztQqQ6pCPaJQnNpXBgELr5cs3WwDakRbh1iEMzjgSJ", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "21TrZtZnFU1rEvmiKTNSdZz7voe8kRZL7KX3pEGe7rS2", + "isSigner": true, + "isWritable": false + }, + { + "pubkey": "CyBqVej3Bq73UGdaYv2BMNLeRhfv2nkUSy2KA4Tc5WtE", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "DVCeozFGbe6ew3eWTnZByjHeYqTq1cvbrB7JJhkLxaRJ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "HkphEpUqnFBxBuCPEq5j1HA9L8EwmsmRT6UcFKziptM1", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "BGNHoqiqB4oM7caZvDUKqC2JMfjXA8MnxeeaGrHdJ5xP", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "GGztQqQ6pCPaJQnNpXBgELr5cs3WwDakRbh1iEMzjgSJ", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "4fuUiYxTQ6QCrdSq9ouBYcTM7bqSwYTSyLueGZLTy4T4", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "DVCeozFGbe6ew3eWTnZByjHeYqTq1cvbrB7JJhkLxaRJ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "4oY1eVHJrt7ywuFoQnAZwto4qcQip1QhYMAhD11PU4QL", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "HkphEpUqnFBxBuCPEq5j1HA9L8EwmsmRT6UcFKziptM1", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "4dSG9tKHZR4CAictyEnH9XuGZyKapodWXq5xyg7uFwE9", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "8kZSTVuV7C4GD9ZVR4wDtRSXv1SvsSQPfqUbthueRNGV", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "2B48L1ACPvVb67UKeSMkUGdzrnhvNMm6pFt2nspGKxs4", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "BMGfBaW69aUm6hRdmsfAcNEmAW59C2rWJ9EX7gWnrVN9", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "3NxDBWt55DZnEwwQ2bhQ3xWG8Jd18TdUXAG4Zdr7jDai", + "isSigner": false, + "isWritable": false + } + ], + "data": "wSCbM0HWnIEAAQAAABEBZAABAHQ7pAsAAACbnbOiCwAAADIAAA==" +} diff --git a/solana/b.json b/solana/b.json new file mode 100644 index 00000000..ca99a718 --- /dev/null +++ b/solana/b.json @@ -0,0 +1,131 @@ +{ + "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "accounts": [ + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "GGztQqQ6pCPaJQnNpXBgELr5cs3WwDakRbh1iEMzjgSJ", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "21TrZtZnFU1rEvmiKTNSdZz7voe8kRZL7KX3pEGe7rS2", + "isSigner": true, + "isWritable": false + }, + { + "pubkey": "BGNHoqiqB4oM7caZvDUKqC2JMfjXA8MnxeeaGrHdJ5xP", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "HkphEpUqnFBxBuCPEq5j1HA9L8EwmsmRT6UcFKziptM1", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "DVCeozFGbe6ew3eWTnZByjHeYqTq1cvbrB7JJhkLxaRJ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "CyBqVej3Bq73UGdaYv2BMNLeRhfv2nkUSy2KA4Tc5WtE", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "GGztQqQ6pCPaJQnNpXBgELr5cs3WwDakRbh1iEMzjgSJ", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "4fuUiYxTQ6QCrdSq9ouBYcTM7bqSwYTSyLueGZLTy4T4", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "DVCeozFGbe6ew3eWTnZByjHeYqTq1cvbrB7JJhkLxaRJ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "4oY1eVHJrt7ywuFoQnAZwto4qcQip1QhYMAhD11PU4QL", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "HkphEpUqnFBxBuCPEq5j1HA9L8EwmsmRT6UcFKziptM1", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "4dSG9tKHZR4CAictyEnH9XuGZyKapodWXq5xyg7uFwE9", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "8kZSTVuV7C4GD9ZVR4wDtRSXv1SvsSQPfqUbthueRNGV", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "FqFkv2xNNCUyx1RYV61pGZ9AMzGfgcD8uXC9zCF5JKnR", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "A7sdy3NoAZp49cQNpreMGARAb9QJjYrrSyDALhThgk3D", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "3NxDBWt55DZnEwwQ2bhQ3xWG8Jd18TdUXAG4Zdr7jDai", + "isSigner": false, + "isWritable": false + } + ], + "data": "wSCbM0HWnIEAAQAAABEAZAABAHQ7pAsAAAB29CSlCwAAADIAAA==" +} diff --git a/solana/migrations/deploy.ts b/solana/migrations/deploy.ts new file mode 100644 index 00000000..82fb175f --- /dev/null +++ b/solana/migrations/deploy.ts @@ -0,0 +1,12 @@ +// Migrations are an early feature. Currently, they're nothing more than this +// single deploy script that's invoked from the CLI, injecting a provider +// configured from the workspace's Anchor.toml. + +const anchor = require("@coral-xyz/anchor"); + +module.exports = async function (provider) { + // Configure client to use the provider. + anchor.setProvider(provider); + + // Add your deploy script here. +}; diff --git a/solana/package.json b/solana/package.json new file mode 100644 index 00000000..02a8b94a --- /dev/null +++ b/solana/package.json @@ -0,0 +1,50 @@ +{ + "name": "@wormhole-foundation/swap-layer-solana", + "version": "1.0.0", + "description": "", + "main": "lib/cjs/index.js", + "module": "lib/esm/index.js", + "files": [ + "dist/cjs", + "dist/esm" + ], + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check", + "test": "jest --config ./jest.config.ts --detectOpenHandles", + "build:cjs": "tsc -p tsconfig.cjs.json", + "build:esm": "tsc -p tsconfig.esm.json", + "build": "tsc -p tsconfig.json" + }, + "dependencies": { + "@certusone/wormhole-sdk": "^0.10.10", + "@coral-xyz/anchor": "^0.30.0", + "@jup-ag/api": "^6.0.20-test", + "@solana/spl-token": "^0.4.3", + "@solana/web3.js": "^1.91.6", + "@types/node-fetch": "^2.6.11", + "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", + "@wormhole-foundation/sdk-base": "^0.6.8", + "@wormhole-foundation/sdk-definitions": "^0.6.8", + "@wormhole-foundation/sdk-evm": "0.6.8", + "@wormhole-foundation/sdk-solana": "^0.6.8", + "@wormhole-foundation/sdk-solana-core": "^0.6.8", + "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", + "chai-as-promised": "^7.1.1", + "ts-results": "^3.3.0", + "tsx": "^4.7.2" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "@types/node": "^20.12.7", + "@types/node-fetch": "^2.6.11", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "ts-results": "^3.3.0", + "tsx": "^4.7.2" + } +} diff --git a/solana/programs/swap-layer/Cargo.toml b/solana/programs/swap-layer/Cargo.toml new file mode 100644 index 00000000..d1955bf8 --- /dev/null +++ b/solana/programs/swap-layer/Cargo.toml @@ -0,0 +1,48 @@ +[package] +name = "swap-layer" +description = "Created with Anchor" +edition.workspace = true +version.workspace = true +authors.workspace = true + +[lib] +crate-type = ["cdylib", "lib"] +name = "swap_layer" + +[features] +default = [] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +cpi = ["no-entrypoint"] +localnet = ["token-router/localnet"] +testnet = ["token-router/testnet"] +integration-test = ["localnet"] +idl-build = [ + "localnet", + "token-router/idl-build", + "swap-layer-messages/idl-build", + "anchor-lang/idl-build", + "anchor-spl/idl-build" +] + +[dependencies] +swap-layer-messages.workspace = true + +token-router.workspace = true +common.workspace = true + +wormhole-solana-utils.workspace = true + +anchor-lang = { workspace = true, features = ["init-if-needed"] } +anchor-spl.workspace = true +solana-program.workspace = true + +hex.workspace = true +ruint.workspace = true + +[dev-dependencies] +hex-literal.workspace = true + +[lints] +workspace = true diff --git a/solana/programs/swap-layer/Xargo.toml b/solana/programs/swap-layer/Xargo.toml new file mode 100644 index 00000000..475fb71e --- /dev/null +++ b/solana/programs/swap-layer/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs new file mode 100644 index 00000000..8a2440ac --- /dev/null +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -0,0 +1,406 @@ +use std::ops::Deref; + +use crate::{error::SwapLayerError, state::Custodian, state::Peer}; +use anchor_lang::prelude::*; +use anchor_spl::{associated_token, token}; +use common::{ + admin::utils::{ + assistant::{self, only_authorized}, + ownable::only_owner, + }, + wormhole_io::TypePrefixedPayload, + USDC_MINT, +}; +use swap_layer_messages::{ + messages::SwapMessageV1, + types::{OutputToken, SwapType}, +}; +use token_router::state::PreparedFill; + +#[derive(Accounts)] +pub struct Usdc<'info> { + /// CHECK: This address must equal [USDC_MINT](common::USDC_MINT). + #[account(address = USDC_MINT)] + pub mint: UncheckedAccount<'info>, +} + +impl<'info> Deref for Usdc<'info> { + type Target = UncheckedAccount<'info>; + + fn deref(&self) -> &Self::Target { + &self.mint + } +} + +#[derive(Accounts)] +pub struct CheckedCustodian<'info> { + #[account( + seeds = [Custodian::SEED_PREFIX], + bump = Custodian::BUMP, + )] + pub custodian: Account<'info, Custodian>, +} + +impl<'info> Deref for CheckedCustodian<'info> { + type Target = Account<'info, Custodian>; + + fn deref(&self) -> &Self::Target { + &self.custodian + } +} + +#[derive(Accounts)] +pub struct OwnerOnly<'info> { + #[account( + constraint = only_owner( + &custodian, + &owner, + error!(SwapLayerError::OwnerOnly) + )? + )] + pub owner: Signer<'info>, + + pub custodian: CheckedCustodian<'info>, +} + +#[derive(Accounts)] +pub struct OwnerOnlyMut<'info> { + #[account( + constraint = only_owner( + &custodian, + &owner, + error!(SwapLayerError::OwnerOnly) + )? + )] + pub owner: Signer<'info>, + + #[account( + mut, + seeds = [Custodian::SEED_PREFIX], + bump = Custodian::BUMP, + )] + pub custodian: Account<'info, Custodian>, +} + +#[derive(Accounts)] +pub struct Admin<'info> { + #[account( + constraint = assistant::only_authorized( + &custodian, + &owner_or_assistant, + error!(SwapLayerError::OwnerOrAssistantOnly) + )? + )] + pub owner_or_assistant: Signer<'info>, + + pub custodian: CheckedCustodian<'info>, +} + +#[derive(Accounts)] +pub struct AdminMut<'info> { + #[account( + constraint = only_authorized( + &custodian, + &owner_or_assistant, + error!(SwapLayerError::OwnerOrAssistantOnly) + )? + )] + pub owner_or_assistant: Signer<'info>, + + #[account( + mut, + seeds = [Custodian::SEED_PREFIX], + bump = Custodian::BUMP, + )] + pub custodian: Account<'info, Custodian>, +} + +#[derive(Accounts)] +pub struct FeeUpdater<'info> { + #[account( + constraint = { + require!( + fee_updater.key() == custodian.fee_updater.key() + || fee_updater.key() == custodian.owner.key() + || fee_updater.key() == custodian.owner_assistant.key(), + SwapLayerError::InvalidFeeUpdater + ); + + true + } + )] + pub fee_updater: Signer<'info>, + + pub custodian: CheckedCustodian<'info>, +} + +#[derive(Accounts)] +pub struct RegisteredPeer<'info> { + #[account( + seeds = [ + Peer::SEED_PREFIX, + &peer.chain.to_be_bytes() + ], + bump, + )] + peer: Box>, +} + +impl<'info> Deref for RegisteredPeer<'info> { + type Target = Account<'info, Peer>; + + fn deref(&self) -> &Self::Target { + &self.peer + } +} + +/// Prepared fill account with associated peer. +#[derive(Accounts)] +pub struct ConsumeSwapLayerFill<'info> { + pub custodian: CheckedCustodian<'info>, + + #[account( + mut, + constraint = { + let swap_msg = SwapMessageV1::read_slice(&fill.redeemer_message) + .map_err(|_| SwapLayerError::InvalidSwapMessage)?; + + require_eq!( + associated_peer.chain, + fill.source_chain, + SwapLayerError::InvalidPeer, + ); + + require!( + fill.order_sender == associated_peer.address, + SwapLayerError::InvalidPeer + ); + + true + } + )] + pub fill: Account<'info, PreparedFill>, + + /// Custody token account. This account will be closed at the end of this instruction. It just + /// acts as a conduit to allow this program to be the transfer initiator in the CCTP message. + /// + /// CHECK: Mutable. Seeds must be \["custody"\, source_chain.to_be_bytes()]. + #[account(mut)] + pub fill_custody_token: Box>, + + associated_peer: RegisteredPeer<'info>, + + /// CHECK: Recipient of lamports from closing the prepared_fill account. + #[account(mut)] + pub beneficiary: UncheckedAccount<'info>, + + pub token_router_program: Program<'info, token_router::program::TokenRouter>, +} + +impl<'info> ConsumeSwapLayerFill<'info> { + pub fn read_message_unchecked(&self) -> SwapMessageV1 { + SwapMessageV1::read_slice(&self.fill.redeemer_message).unwrap() + } + + // pub fn read_message_unchecked_boxed(&self) -> Box { + // SwapMessageV1::read_slice(&self.fill.redeemer_message) + // .map(Box::new) + // .unwrap() + // } + + pub fn prepared_fill_key(&self) -> Pubkey { + self.fill.key() + } + + pub fn consume_prepared_fill( + &self, + dst_token: AccountInfo<'info>, + token_program: AccountInfo<'info>, + ) -> Result { + let amount = self.fill_custody_token.amount; + + token_router::cpi::consume_prepared_fill(CpiContext::new_with_signer( + self.token_router_program.to_account_info(), + token_router::cpi::accounts::ConsumePreparedFill { + redeemer: self.custodian.to_account_info(), + beneficiary: self.beneficiary.to_account_info(), + prepared_fill: self.fill.to_account_info(), + dst_token, + prepared_custody_token: self.fill_custody_token.to_account_info(), + token_program, + }, + &[Custodian::SIGNER_SEEDS], + ))?; + + Ok(amount) + } +} + +impl<'info> Deref for ConsumeSwapLayerFill<'info> { + type Target = Account<'info, PreparedFill>; + + fn deref(&self) -> &Self::Target { + &self.fill + } +} + +#[derive(Accounts)] +pub struct CompleteSwap<'info> { + #[account(mut)] + payer: Signer<'info>, + + #[account( + constraint = { + let swap_msg = consume_swap_layer_fill.read_message_unchecked(); + + // Ensure that the output token is a swap token for Jupiter V6. + let (expected_dst_mint, swap) = match &swap_msg.output_token { + OutputToken::Gas(swap) => (token::spl_token::native_mint::id(), swap), + OutputToken::Other { address, swap } => (Pubkey::from(*address), swap), + _ => return err!(SwapLayerError::InvalidOutputToken), + }; + + require!( + matches!(swap.swap_type, SwapType::JupiterV6(_)), + SwapLayerError::InvalidSwapType, + ); + + // Verify the address matches the destination mint. + require_keys_eq!( + dst_mint.key(), + expected_dst_mint, + SwapLayerError::InvalidDestinationMint + ); + + // Check the deadline for the swap. There may not be a deadline check with the + // dex that this instruction composes with, so we will check it here. + // + // TODO: Do we accept deadline == 0? + require!( + swap.deadline == 0 + || Clock::get().unwrap().unix_timestamp <= i64::from(swap.deadline), + SwapLayerError::SwapPastDeadline, + ); + + // Just in case the encoded limit amount exceeds u64, we have nothing to do if + // this message were misconfigured. + u64::try_from(swap.limit_amount).map_err(|_| SwapLayerError::InvalidLimitAmount)?; + + true + } + )] + consume_swap_layer_fill: ConsumeSwapLayerFill<'info>, + + /// CHECK: Seeds must be \["swap-authority", prepared_fill.key()\]. + #[account( + seeds = [ + crate::SWAP_AUTHORITY_SEED_PREFIX, + consume_swap_layer_fill.key().as_ref(), + ], + bump, + )] + pub authority: UncheckedAccount<'info>, + + /// Temporary swap token account to receive USDC from the prepared fill. This account will be + /// closed at the end of this instruction. + #[account( + init_if_needed, + payer = payer, + associated_token::mint = src_mint, + associated_token::authority = authority + )] + pub src_swap_token: Box>, + + /// Temporary swap token account to receive destination mint after the swap. This account will + /// be closed at the end of this instruction. + #[account( + init_if_needed, + payer = payer, + associated_token::mint = dst_mint, + associated_token::authority = authority + )] + pub dst_swap_token: Box>, + + /// This account must be verified as the source mint for the swap. + pub src_mint: Box>, + + /// This account must be verified as the destination mint for the swap. + #[account(constraint = src_mint.key() != dst_mint.key() @ SwapLayerError::SameMint)] + pub dst_mint: Box>, + + pub token_program: Program<'info, token::Token>, + associated_token_program: Program<'info, associated_token::AssociatedToken>, + system_program: Program<'info, System>, +} + +impl<'info> CompleteSwap<'info> { + pub fn consume_prepared_fill(&mut self) -> Result { + // Consume prepared fill. + self.consume_swap_layer_fill.consume_prepared_fill( + self.src_swap_token.to_account_info(), + self.token_program.to_account_info(), + )?; + + // Because the source swap account is an ATA, someone could create this account and sent some + // arbitrary amount to it to disrupt the flow of this instruction. To be safe, we will reload + // the source swap token account to grab its amount. + self.src_swap_token.reload()?; + + Ok(self.src_swap_token.amount) + } + + pub fn close_swap_accounts(&self, bumps: &CompleteSwapBumps) -> Result<()> { + let prepared_key = self.prepared_fill_key(); + let swap_authority_seeds = &[ + crate::SWAP_AUTHORITY_SEED_PREFIX, + prepared_key.as_ref(), + &[bumps.authority], + ]; + + token::close_account(CpiContext::new_with_signer( + self.token_program.to_account_info(), + token::CloseAccount { + account: self.src_swap_token.to_account_info(), + destination: self.payer.to_account_info(), + authority: self.authority.to_account_info(), + }, + &[swap_authority_seeds], + ))?; + + token::close_account(CpiContext::new_with_signer( + self.token_program.to_account_info(), + token::CloseAccount { + account: self.dst_swap_token.to_account_info(), + destination: self.payer.to_account_info(), + authority: self.authority.to_account_info(), + }, + &[swap_authority_seeds], + )) + } +} + +impl<'info> Deref for CompleteSwap<'info> { + type Target = ConsumeSwapLayerFill<'info>; + + fn deref(&self) -> &Self::Target { + &self.consume_swap_layer_fill + } +} + +// fn require_jupiter_v6_output_swap(swap: &OutputSwap) -> Result<()> { +// // Check the deadline for the swap. There may not be a deadline check with the +// // dex that this instruction composes with, so we will check it here. +// // +// // TODO: Do we accept deadline == 0? +// require!( +// swap.deadline == 0 || Clock::get().unwrap().unix_timestamp <= i64::from(swap.deadline), +// SwapLayerError::SwapPastDeadline, +// ); + +// // Just in case the encoded limit amount exceeds u64, we have nothing to do if +// // this message were misconfigured. +// u64::try_from(swap.limit_amount).map_err(|_| SwapLayerError::InvalidLimitAmount)?; + +// // Done. +// Ok(()) +// } diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs new file mode 100644 index 00000000..8efda449 --- /dev/null +++ b/solana/programs/swap-layer/src/error.rs @@ -0,0 +1,60 @@ +#[anchor_lang::error_code] +pub enum SwapLayerError { + DummyError = 0x0, + AssistantZeroPubkey = 0x100, + FeeRecipientZeroPubkey = 0x101, + FeeUpdaterZeroPubkey = 0x102, + InvalidRedeemMode = 0x103, + InvalidOutputToken = 0x104, + InvalidRelayerFee = 0x105, + InvalidSwapMessage = 0x106, + InvalidRecipient = 0x107, + InvalidFeeUpdater = 0x108, + ChainNotAllowed = 0x109, + InvalidPeer = 0x10a, + InvalidGasDropoff = 0x10b, + RelayingDisabled = 0x10c, + InvalidExecutionParams = 0x10d, + UnsupportedExecutionParams = 0x10e, + GasConversionOverflow = 0x10f, + GasDropoffCalculationFailed = 0x110, + ExceedsMaxRelayingFee = 0x111, + InvalidPreparedOrder = 0x112, + InvalidFeeRecipient = 0x113, + + // EVM Execution Param errors + InvalidBaseFee = 0x200, + InvalidGasPrice = 0x201, + InvalidGasTokenPrice = 0x202, + InvalidUpdateThreshold = 0x203, + InvalidNativeTokenPrice = 0x204, + InvalidMargin = 0x205, + EvmGasCalculationFailed = 0x206, + + // Swap + SwapPastDeadline = 0x300, + InvalidLimitAmount = 0x302, + InvalidSwapType = 0x304, + + // Jupiter V6 + #[msg("Jupiter V6 Authority ID must be >= 0 and < 8")] + InvalidJupiterV6AuthorityId = 0x320, + SameMint = 0x322, + InvalidSwapAuthority = 0x330, + InvalidSourceSwapToken = 0x332, + InvalidDestinationSwapToken = 0x333, + InvalidSourceMint = 0x334, + InvalidDestinationMint = 0x335, + NotJupiterV6DirectRoute = 0x340, + JupiterV6DexProgramMismatch = 0x342, + InvalidJupiterV6QuotedOutAmount = 0x344, + SwapFailed = 0x346, + + // Ownership + NoTransferOwnershipRequest = 0x400, + NotPendingOwner = 0x401, + InvalidNewOwner = 0x402, + AlreadyOwner = 0x403, + OwnerOnly = 0x404, + OwnerOrAssistantOnly = 0x405, +} diff --git a/solana/programs/swap-layer/src/lib.rs b/solana/programs/swap-layer/src/lib.rs new file mode 100644 index 00000000..f66ce306 --- /dev/null +++ b/solana/programs/swap-layer/src/lib.rs @@ -0,0 +1,125 @@ +use anchor_lang::prelude::*; + +mod processor; +use processor::*; + +mod composite; + +mod error; + +pub mod state; + +pub mod utils; + +declare_id!("SwapLayer1111111111111111111111111111111111"); + +const CUSTODIAN_BUMP: u8 = 254; +const COMPLETE_TOKEN_SEED_PREFIX: &[u8] = b"complete"; +const SWAP_AUTHORITY_SEED_PREFIX: &[u8] = b"swap-authority"; +const MAX_BPS: u32 = 1_000_000; // 10,000.00 bps (100%) + +#[program] +pub mod swap_layer { + use super::*; + + pub fn initialize(ctx: Context) -> Result<()> { + processor::initialize(ctx) + } + + pub fn add_peer(ctx: Context, args: AddPeerArgs) -> Result<()> { + processor::add_peer(ctx, args) + } + + pub fn update_peer(ctx: Context, args: AddPeerArgs) -> Result<()> { + processor::update_peer(ctx, args) + } + + /// This instruction sets the `pending_owner` field in the `Custodian` account. This instruction + /// can only be called by the `owner`. The `pending_owner` address must be valid, meaning it + /// cannot be the zero address or the current owner. + /// # Arguments + /// + /// * `ctx` - `SubmitOwnershipTransferRequest` context. + pub fn submit_ownership_transfer_request( + ctx: Context, + ) -> Result<()> { + processor::submit_ownership_transfer_request(ctx) + } + + /// This instruction confirms the ownership transfer request and sets the new `owner` in the + /// `Custodian` account. This instruction can only be called by the `pending_owner`. The + /// `pending_owner` must be the same as the `pending_owner` in the `Custodian` account. + /// # Arguments + /// + /// * `ctx` - `ConfirmOwnershipTransferRequest` context. + pub fn confirm_ownership_transfer_request( + ctx: Context, + ) -> Result<()> { + processor::confirm_ownership_transfer_request(ctx) + } + + /// This instruction cancels an ownership transfer request by resetting the `pending_owner` field + /// in the `Custodian` account. This instruction can only be called by the `owner`. + /// # Arguments + /// + /// * `ctx` - `CancelOwnershipTransferRequest` context. + pub fn cancel_ownership_transfer_request( + ctx: Context, + ) -> Result<()> { + processor::cancel_ownership_transfer_request(ctx) + } + + /// This instruction is used to update the `fee_recipient` field in the `Custodian` account. This + /// instruction can only be called by the `owner`. + /// # Arguments + /// + /// * `ctx` - `UpdateFeeRecipient` context. + pub fn update_fee_recipient(ctx: Context) -> Result<()> { + processor::update_fee_recipient(ctx) + } + + /// This instruction is used to update the `owner_assistant` field in the `Custodian` account. This + /// instruction can only be called by the `owner`. + /// # Arguments + /// + /// * `ctx` - `UpdateOwnerAssistant` context. + pub fn update_owner_assistant(ctx: Context) -> Result<()> { + processor::update_owner_assistant(ctx) + } + + pub fn update_fee_updater(ctx: Context) -> Result<()> { + processor::update_fee_updater(ctx) + } + + pub fn update_relay_parameters( + ctx: Context, + args: UpdateRelayParametersArgs, + ) -> Result<()> { + processor::update_relay_parameters(ctx, args) + } + + pub fn complete_transfer_relay(ctx: Context) -> Result<()> { + processor::complete_transfer_relay(ctx) + } + + pub fn complete_transfer_direct(ctx: Context) -> Result<()> { + processor::complete_transfer_direct(ctx) + } + + pub fn initiate_transfer( + ctx: Context, + args: InitiateTransferArgs, + ) -> Result<()> { + processor::initiate_transfer(ctx, args) + } + + pub fn complete_swap_direct<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapDirect<'info>>, + ix_data: Vec, + ) -> Result<()> + where + 'c: 'info, + { + processor::complete_swap_direct(ctx, ix_data) + } +} diff --git a/solana/programs/swap-layer/src/processor/admin/initialize.rs b/solana/programs/swap-layer/src/processor/admin/initialize.rs new file mode 100644 index 00000000..a6c384e1 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/initialize.rs @@ -0,0 +1,129 @@ +use crate::{composite::*, error::SwapLayerError, state::Custodian}; +use anchor_lang::prelude::*; +use anchor_spl::token; +//use wormhole_solana_utils::cpi::bpf_loader_upgradeable::{self, BpfLoaderUpgradeable}; + +#[derive(Accounts)] +pub struct Initialize<'info> { + /// Owner of the program, who presumably deployed this program. + #[account(mut)] + owner: Signer<'info>, + + #[account( + init, + payer = owner, + space = 8 + Custodian::INIT_SPACE, + seeds = [Custodian::SEED_PREFIX], + bump, + )] + /// Sender Config account, which saves program data useful for other + /// instructions, specifically for outbound transfers. Also saves the payer + /// of the [`initialize`](crate::initialize) instruction as the program's + /// owner. + custodian: Account<'info, Custodian>, + + /// CHECK: This account must not be the zero pubkey. + #[account( + owner = Pubkey::default(), + constraint = { + owner_assistant.key() != Pubkey::default() + } @ SwapLayerError::AssistantZeroPubkey + )] + owner_assistant: UncheckedAccount<'info>, + + /// CHECK: This account must not be the zero pubkey. + #[account( + owner = Pubkey::default(), + constraint = ( + fee_recipient.key() != Pubkey::default() + ) @ SwapLayerError::FeeRecipientZeroPubkey + )] + fee_recipient: UncheckedAccount<'info>, + + #[account( + associated_token::mint = usdc, + associated_token::authority = fee_recipient, + )] + fee_recipient_token: Account<'info, token::TokenAccount>, + + /// CHECK: This account must not be the zero pubkey. + #[account( + owner = Pubkey::default(), + constraint = { + fee_updater.key() != Pubkey::default() + } @ SwapLayerError::FeeUpdaterZeroPubkey + )] + fee_updater: UncheckedAccount<'info>, + + usdc: Usdc<'info>, + + // #[account(address = common::USDC_MINT)] + // mint: Account<'info, token::Mint>, + /// We use the program data to make sure this owner is the upgrade authority (the true owner, + /// who deployed this program). + // #[account( + // mut, + // seeds = [crate::ID.as_ref()], + // bump, + // seeds::program = bpf_loader_upgradeable::id(), + // constraint = { + // program_data.upgrade_authority_address.is_some() + // } @ TokenRouterError::ImmutableProgram + // )] + // program_data: Account<'info, ProgramData>, + + /// CHECK: This program PDA will be the upgrade authority for the Token Router program. + // #[account(address = common::UPGRADE_MANAGER_AUTHORITY)] + // upgrade_manager_authority: UncheckedAccount<'info>, + + /// CHECK: This program must exist. + // #[account( + // executable, + // address = common::UPGRADE_MANAGER_PROGRAM_ID, + // )] + // upgrade_manager_program: UncheckedAccount<'info>, + + //bpf_loader_upgradeable_program: Program<'info, BpfLoaderUpgradeable>, + system_program: Program<'info, System>, + //token_program: Program<'info, token::Token>, + //associated_token_program: Program<'info, anchor_spl::associated_token::AssociatedToken>, +} + +pub fn initialize(ctx: Context) -> Result<()> { + let owner = ctx.accounts.owner.key(); + + // We need to check that the upgrade authority is the owner passed into the account context. + // #[cfg(not(feature = "integration-test"))] + // { + // require_keys_eq!( + // ctx.accounts.owner.key(), + // ctx.accounts.program_data.upgrade_authority_address.unwrap(), + // TokenRouterError::OwnerOnly + // ); + + // bpf_loader_upgradeable::set_upgrade_authority( + // CpiContext::new( + // ctx.accounts + // .bpf_loader_upgradeable_program + // .to_account_info(), + // bpf_loader_upgradeable::SetUpgradeAuthority { + // program_data: ctx.accounts.program_data.to_account_info(), + // current_authority: ctx.accounts.owner.to_account_info(), + // new_authority: Some(ctx.accounts.upgrade_manager_authority.to_account_info()), + // }, + // ), + // &crate::id(), + // )?; + // } + + ctx.accounts.custodian.set_inner(Custodian { + owner, + pending_owner: None, + owner_assistant: ctx.accounts.owner_assistant.key(), + fee_updater: ctx.accounts.fee_updater.key(), + fee_recipient_token: ctx.accounts.fee_recipient_token.key(), + }); + + // Done. + Ok(()) +} diff --git a/solana/programs/swap-layer/src/processor/admin/mod.rs b/solana/programs/swap-layer/src/processor/admin/mod.rs new file mode 100644 index 00000000..a2f8f8ec --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/mod.rs @@ -0,0 +1,11 @@ +mod initialize; +pub use initialize::*; + +mod peer; +pub use peer::*; + +mod ownership_transfer_request; +pub use ownership_transfer_request::*; + +mod update; +pub use update::*; diff --git a/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/cancel.rs b/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/cancel.rs new file mode 100644 index 00000000..37260546 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/cancel.rs @@ -0,0 +1,18 @@ +use crate::composite::*; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct CancelOwnershipTransferRequest<'info> { + admin: OwnerOnlyMut<'info>, +} + +pub fn cancel_ownership_transfer_request( + ctx: Context, +) -> Result<()> { + common::admin::utils::pending_owner::cancel_transfer_ownership( + &mut ctx.accounts.admin.custodian, + ); + + // Done. + Ok(()) +} diff --git a/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/confirm.rs b/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/confirm.rs new file mode 100644 index 00000000..8dded7af --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/confirm.rs @@ -0,0 +1,32 @@ +use crate::{error::SwapLayerError, state::Custodian}; +use anchor_lang::prelude::*; +use common::admin::utils::pending_owner; + +#[derive(Accounts)] +pub struct ConfirmOwnershipTransferRequest<'info> { + /// Must be the pending owner of the program set in the [`Custodian`] + /// account. + pending_owner: Signer<'info>, + + #[account( + mut, + seeds = [Custodian::SEED_PREFIX], + bump = Custodian::BUMP, + constraint = { + custodian.pending_owner.is_some() + } @ SwapLayerError::NoTransferOwnershipRequest, + constraint = { + pending_owner::only_pending_owner_unchecked(&custodian, &pending_owner.key()) + } @ SwapLayerError::NotPendingOwner, + )] + custodian: Account<'info, Custodian>, +} + +pub fn confirm_ownership_transfer_request( + ctx: Context, +) -> Result<()> { + pending_owner::accept_ownership_unchecked(&mut ctx.accounts.custodian); + + // Done. + Ok(()) +} diff --git a/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/mod.rs b/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/mod.rs new file mode 100644 index 00000000..c33a7ba7 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/mod.rs @@ -0,0 +1,8 @@ +mod cancel; +pub use cancel::*; + +mod confirm; +pub use confirm::*; + +mod submit; +pub use submit::*; diff --git a/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/submit.rs b/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/submit.rs new file mode 100644 index 00000000..d81f3d2d --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/ownership_transfer_request/submit.rs @@ -0,0 +1,28 @@ +use crate::{composite::*, error::SwapLayerError}; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct SubmitOwnershipTransferRequest<'info> { + admin: OwnerOnlyMut<'info>, + + /// New Owner. + /// + /// CHECK: Must be neither zero pubkey nor current owner. + #[account( + constraint = new_owner.key() != Pubkey::default() @ SwapLayerError::InvalidNewOwner, + constraint = new_owner.key() != admin.owner.key() @ SwapLayerError::AlreadyOwner + )] + new_owner: UncheckedAccount<'info>, +} + +pub fn submit_ownership_transfer_request( + ctx: Context, +) -> Result<()> { + common::admin::utils::pending_owner::transfer_ownership( + &mut ctx.accounts.admin.custodian, + &ctx.accounts.new_owner.key(), + ); + + // Done. + Ok(()) +} diff --git a/solana/programs/swap-layer/src/processor/admin/peer/add.rs b/solana/programs/swap-layer/src/processor/admin/peer/add.rs new file mode 100644 index 00000000..58cdf646 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/peer/add.rs @@ -0,0 +1,39 @@ +use crate::{ + composite::*, + state::{Peer, RelayParams}, +}; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +#[instruction(args: AddPeerArgs)] +pub struct AddPeer<'info> { + #[account(mut)] + payer: Signer<'info>, + + admin: Admin<'info>, + + #[account( + init, + payer = payer, + space = 8 + Peer::INIT_SPACE, + seeds = [ + Peer::SEED_PREFIX, + &args.chain.to_be_bytes() + ], + bump, + )] + peer: Account<'info, Peer>, + + system_program: Program<'info, System>, +} + +#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone)] +pub struct AddPeerArgs { + pub chain: u16, + pub address: [u8; 32], + pub relay_params: RelayParams, +} + +pub fn add_peer(ctx: Context, args: AddPeerArgs) -> Result<()> { + crate::handle_add_peer(&mut ctx.accounts.peer, args) +} diff --git a/solana/programs/swap-layer/src/processor/admin/peer/mod.rs b/solana/programs/swap-layer/src/processor/admin/peer/mod.rs new file mode 100644 index 00000000..7eb46e15 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/peer/mod.rs @@ -0,0 +1,27 @@ +mod add; +pub use add::*; + +mod update; +pub use update::*; + +use crate::utils::relay_parameters::verify_relay_params; +use crate::{error::SwapLayerError, state::Peer}; +use anchor_lang::prelude::*; +use common::wormhole_cctp_solana::wormhole::SOLANA_CHAIN; + +pub fn handle_add_peer(peer: &mut Account, args: AddPeerArgs) -> Result<()> { + require!( + args.chain != 0 && args.chain != SOLANA_CHAIN, + SwapLayerError::ChainNotAllowed + ); + require!(args.address != [0; 32], SwapLayerError::InvalidPeer); + + // Verify the relay parameters. + verify_relay_params(&args.relay_params)?; + + peer.chain = args.chain; + peer.address = args.address; + peer.relay_params = args.relay_params; + + Ok(()) +} diff --git a/solana/programs/swap-layer/src/processor/admin/peer/update.rs b/solana/programs/swap-layer/src/processor/admin/peer/update.rs new file mode 100644 index 00000000..1a300b07 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/peer/update.rs @@ -0,0 +1,22 @@ +use crate::{composite::*, state::Peer}; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +#[instruction(args: crate::AddPeerArgs)] +pub struct UpdatePeer<'info> { + admin: OwnerOnly<'info>, + + #[account( + mut, + seeds = [ + Peer::SEED_PREFIX, + &args.chain.to_be_bytes() + ], + bump, + )] + peer: Account<'info, Peer>, +} + +pub fn update_peer(ctx: Context, args: crate::AddPeerArgs) -> Result<()> { + crate::handle_add_peer(&mut ctx.accounts.peer, args) +} diff --git a/solana/programs/swap-layer/src/processor/admin/update/fee_recipient_token.rs b/solana/programs/swap-layer/src/processor/admin/update/fee_recipient_token.rs new file mode 100644 index 00000000..daba7a77 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/update/fee_recipient_token.rs @@ -0,0 +1,31 @@ +use crate::{composite::*, error::SwapLayerError}; +use anchor_lang::prelude::*; +use anchor_spl::token; + +#[derive(Accounts)] +pub struct UpdateFeeRecipient<'info> { + admin: AdminMut<'info>, + + #[account( + associated_token::mint = common::USDC_MINT, + associated_token::authority = new_fee_recipient, + )] + new_fee_recipient_token: Account<'info, token::TokenAccount>, + + /// New Fee Recipient. + /// + /// CHECK: Must not be zero pubkey. + #[account( + constraint = { + new_fee_recipient.key() != Pubkey::default() + } @ SwapLayerError::FeeRecipientZeroPubkey, + )] + new_fee_recipient: UncheckedAccount<'info>, +} + +pub fn update_fee_recipient(ctx: Context) -> Result<()> { + // Update the fee_recipient key. + ctx.accounts.admin.custodian.fee_recipient_token = ctx.accounts.new_fee_recipient_token.key(); + + Ok(()) +} diff --git a/solana/programs/swap-layer/src/processor/admin/update/fee_updater.rs b/solana/programs/swap-layer/src/processor/admin/update/fee_updater.rs new file mode 100644 index 00000000..78899280 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/update/fee_updater.rs @@ -0,0 +1,25 @@ +use crate::{composite::*, error::SwapLayerError}; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct UpdateFeeUpdater<'info> { + admin: AdminMut<'info>, + + /// New Fee Updater. + /// + /// CHECK: Must not be zero pubkey. + #[account( + constraint = { + new_fee_updater.key() != Pubkey::default() + } @ SwapLayerError::FeeUpdaterZeroPubkey, + )] + new_fee_updater: UncheckedAccount<'info>, +} + +pub fn update_fee_updater(ctx: Context) -> Result<()> { + let custodian = &mut ctx.accounts.admin.custodian; + custodian.fee_updater = ctx.accounts.new_fee_updater.key(); + + // Done. + Ok(()) +} diff --git a/solana/programs/swap-layer/src/processor/admin/update/mod.rs b/solana/programs/swap-layer/src/processor/admin/update/mod.rs new file mode 100644 index 00000000..faa93a49 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/update/mod.rs @@ -0,0 +1,11 @@ +mod fee_recipient_token; +pub use fee_recipient_token::*; + +mod owner_assistant; +pub use owner_assistant::*; + +mod fee_updater; +pub use fee_updater::*; + +mod relay_parameters; +pub use relay_parameters::*; diff --git a/solana/programs/swap-layer/src/processor/admin/update/owner_assistant.rs b/solana/programs/swap-layer/src/processor/admin/update/owner_assistant.rs new file mode 100644 index 00000000..81931ea5 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/update/owner_assistant.rs @@ -0,0 +1,28 @@ +use crate::{composite::*, error::SwapLayerError}; +use anchor_lang::prelude::*; +use common::admin::utils::assistant; + +#[derive(Accounts)] +pub struct UpdateOwnerAssistant<'info> { + admin: OwnerOnlyMut<'info>, + + /// New Assistant. + /// + /// CHECK: Must not be zero pubkey. + #[account( + constraint = { + new_owner_assistant.key() != Pubkey::default() + } @ SwapLayerError::AssistantZeroPubkey, + )] + new_owner_assistant: UncheckedAccount<'info>, +} + +pub fn update_owner_assistant(ctx: Context) -> Result<()> { + assistant::transfer_owner_assistant( + &mut ctx.accounts.admin.custodian, + &ctx.accounts.new_owner_assistant, + ); + + // Done. + Ok(()) +} diff --git a/solana/programs/swap-layer/src/processor/admin/update/relay_parameters.rs b/solana/programs/swap-layer/src/processor/admin/update/relay_parameters.rs new file mode 100644 index 00000000..76454168 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/admin/update/relay_parameters.rs @@ -0,0 +1,40 @@ +use crate::utils::relay_parameters::verify_relay_params; +use crate::{ + composite::*, + state::{Peer, RelayParams}, +}; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +#[instruction(args: UpdateRelayParametersArgs)] +pub struct UpdateRelayParameters<'info> { + fee_updater: FeeUpdater<'info>, + + #[account( + mut, + seeds = [ + Peer::SEED_PREFIX, + &args.chain.to_be_bytes() + ], + bump, + )] + peer: Account<'info, Peer>, +} + +#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone)] +pub struct UpdateRelayParametersArgs { + pub chain: u16, + pub relay_params: RelayParams, +} + +pub fn update_relay_parameters( + ctx: Context, + args: UpdateRelayParametersArgs, +) -> Result<()> { + verify_relay_params(&args.relay_params)?; + + let peer = &mut ctx.accounts.peer; + peer.relay_params = args.relay_params; + + Ok(()) +} diff --git a/solana/programs/swap-layer/src/processor/complete/mod.rs b/solana/programs/swap-layer/src/processor/complete/mod.rs new file mode 100644 index 00000000..2871918e --- /dev/null +++ b/solana/programs/swap-layer/src/processor/complete/mod.rs @@ -0,0 +1,5 @@ +mod other; +pub use other::*; + +mod usdc; +pub use usdc::*; diff --git a/solana/programs/swap-layer/src/processor/complete/other/direct.rs b/solana/programs/swap-layer/src/processor/complete/other/direct.rs new file mode 100644 index 00000000..a06aade4 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/complete/other/direct.rs @@ -0,0 +1,343 @@ +use crate::{ + composite::*, + error::SwapLayerError, + utils::{ + jupiter_v6::{self, cpi::SharedAccountsRouteArgs}, + AnchorInstructionData, + }, +}; +use anchor_lang::prelude::*; +use anchor_spl::token; +use swap_layer_messages::{ + messages::SwapMessageV1, + types::{JupiterV6SwapParameters, OutputSwap, OutputToken, RedeemMode, SwapType}, +}; + +#[derive(Accounts)] +pub struct CompleteSwapDirect<'info> { + #[account( + constraint = { + require_keys_eq!( + complete_swap.src_mint.key(), + common::USDC_MINT, + SwapLayerError::InvalidSourceMint + ); + + true + } + )] + complete_swap: CompleteSwap<'info>, + + #[account( + mut, + associated_token::mint = complete_swap.dst_mint, + associated_token::authority = recipient + )] + /// Recipient associated token account. The recipient authority check + /// is necessary to ensure that the recipient is the intended recipient + /// of the bridged tokens. Mutable. + recipient_token: Box>, + + /// CHECK: This account must be the owner of the recipient token account. The recipient token + /// account must be encoded in the prepared fill. + recipient: UncheckedAccount<'info>, +} + +pub fn complete_swap_direct<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapDirect<'info>>, + ix_data: Vec, +) -> Result<()> +where + 'c: 'info, +{ + let SwapMessageV1 { + recipient, + redeem_mode, + output_token, + } = ctx.accounts.complete_swap.read_message_unchecked(); + + require_keys_eq!( + ctx.accounts.recipient.key(), + Pubkey::from(recipient), + SwapLayerError::InvalidRecipient + ); + + match redeem_mode { + RedeemMode::Direct => match output_token { + OutputToken::Other { + address: _, + swap: + OutputSwap { + deadline: _, + limit_amount, + swap_type: SwapType::JupiterV6(swap_params), + }, + } => handle_complete_swap_direct_jupiter_v6( + ctx, + ix_data, + limit_amount.try_into().unwrap(), + swap_params, + ), + _ => err!(SwapLayerError::InvalidOutputToken), + }, + _ => err!(SwapLayerError::InvalidRedeemMode), + } +} + +pub fn handle_complete_swap_direct_jupiter_v6<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapDirect<'info>>, + ix_data: Vec, + limit_amount: u64, + swap_params: JupiterV6SwapParameters, +) -> Result<()> +where + 'c: 'info, +{ + // Consume prepared fill. + let in_amount = ctx.accounts.complete_swap.consume_prepared_fill()?; + + let swap_authority = &ctx.accounts.complete_swap.authority; + let src_swap_token = &ctx.accounts.complete_swap.src_swap_token; + + let prepared_fill_key = &ctx.accounts.complete_swap.prepared_fill_key(); + let swap_authority_seeds = &[ + crate::SWAP_AUTHORITY_SEED_PREFIX, + prepared_fill_key.as_ref(), + &[ctx.bumps.complete_swap.authority], + ]; + + { + // Handle Jupiter V6 swap. + let ix_data = &mut &ix_data[..]; + + // Peel off the instruction selector and check that it matches what we expect. + SharedAccountsRouteArgs::require_selector(ix_data)?; + + // Try taking remaining account infos as shared accounts route accounts. + let mut cpi_account_infos = ctx.remaining_accounts; + let CheckedSharedAccountsRoute { + token_program, + jupiter_v6_authority, + transfer_authority, + src_custody_token, + jupiter_v6_src_custody_token, + jupiter_v6_dst_custody_token, + dst_custody_token, + src_mint, + dst_mint, + platform_fee_none: _, + token_2022_program, + jupiter_v6_event_authority, + jupiter_v6_program, + } = CheckedSharedAccountsRoute::try_accounts( + &jupiter_v6::JUPITER_V6_PROGRAM_ID, + &mut cpi_account_infos, + ix_data, + &mut CheckedSharedAccountsRouteBumps { + jupiter_v6_authority: Default::default(), + }, + &mut Default::default(), + )?; + + // Deserialize Jupiter V6 shared accounts route args. + let mut jupiter_args = SharedAccountsRouteArgs::deserialize(ix_data)?; + + // Verify remaining accounts. + let dst_swap_token = &ctx.accounts.complete_swap.dst_swap_token; + { + require_keys_eq!( + transfer_authority.key(), + swap_authority.key(), + SwapLayerError::InvalidSwapAuthority + ); + require_keys_eq!( + src_custody_token.key(), + src_swap_token.key(), + SwapLayerError::InvalidSourceSwapToken + ); + require_keys_eq!( + dst_custody_token.key(), + dst_swap_token.key(), + SwapLayerError::InvalidDestinationSwapToken + ); + require_keys_eq!( + src_mint.key(), + common::USDC_MINT, + SwapLayerError::InvalidSourceMint + ); + require_keys_eq!( + dst_mint.key(), + ctx.accounts.complete_swap.dst_mint.key(), + SwapLayerError::InvalidDestinationMint + ); + } + + // Replace the in amount with the one found in the prepared custody token account. + msg!( + "Override in_amount: {}, quoted_out_amount: {}, slippage: {}", + jupiter_args.in_amount, + jupiter_args.quoted_out_amount, + jupiter_args.slippage_bps + ); + jupiter_args.in_amount = in_amount; + + // This is perverse, but we are performing a balance check after the swap to see if we get + // the desired amount. If we don't, revert. + jupiter_args.quoted_out_amount = limit_amount; + + // Configure 100% slippage (yikes). + jupiter_args.slippage_bps = 10000; + + // Peek into the head of remaining accounts. This account will be the dex program that Jupiter + // V6 interacts with. If the swap params specify a specific dex program, we need to ensure that + // the one passed into this instruction handler is that. + if let Some(dex_program_id) = swap_params.dex_program_id { + require_eq!( + jupiter_args.route_plan.len(), + 1, + SwapLayerError::NotJupiterV6DirectRoute + ); + require_keys_eq!( + cpi_account_infos[0].key(), + Pubkey::from(dex_program_id), + SwapLayerError::JupiterV6DexProgramMismatch + ); + } + + // Execute swap. + jupiter_v6::cpi::shared_accounts_route( + CpiContext::new_with_signer( + jupiter_v6_program.to_account_info(), + jupiter_v6::cpi::SharedAccountsRoute { + token_program: token_program.to_account_info(), + program_authority: jupiter_v6_authority.to_account_info(), + user_transfer_authority: swap_authority.to_account_info(), + source_token: src_swap_token.to_account_info(), + program_source_token: jupiter_v6_src_custody_token.to_account_info(), + program_destination_token: jupiter_v6_dst_custody_token.to_account_info(), + destination_account: dst_swap_token.to_account_info(), + source_mint: src_mint.to_account_info(), + destination_mint: dst_mint.to_account_info(), + platform_fee: Default::default(), + token_2022_program: token_2022_program.to_account_info().into(), + event_authority: jupiter_v6_event_authority.to_account_info(), + program: jupiter_v6_program.to_account_info(), + }, + &[swap_authority_seeds], + ) + .with_remaining_accounts(cpi_account_infos.to_vec()), + jupiter_args, + )?; + } + + // After the swap, we reload the destination token account to get the correct amount. + ctx.accounts.complete_swap.dst_swap_token.reload()?; + let dst_swap_token = &ctx.accounts.complete_swap.dst_swap_token; + + // Rarely do I use the gte macro, but this is a good use case for it. I want to display the + // amounts if the limit amount is not met. + require_gte!( + dst_swap_token.amount, + limit_amount, + SwapLayerError::SwapFailed + ); + + // Transfer destination tokens to recipient. + token::transfer( + CpiContext::new_with_signer( + ctx.accounts.complete_swap.token_program.to_account_info(), + token::Transfer { + from: dst_swap_token.to_account_info(), + to: ctx.accounts.recipient_token.to_account_info(), + authority: swap_authority.to_account_info(), + }, + &[swap_authority_seeds], + ), + dst_swap_token.amount, + )?; + + ctx.accounts + .complete_swap + .close_swap_accounts(&ctx.bumps.complete_swap) +} + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Jupiter V6 handling. +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +#[derive(Accounts)] +#[instruction(args: SharedAccountsRouteArgs)] +pub struct CheckedSharedAccountsRoute<'info> { + token_program: Program<'info, token::Token>, + + /// We can lean on Jupiter V6 CPI failing if this is not valid. But we are + /// being extra sure about the authority. Per Jupiter's documentation, there + /// are only 8 authorities. + /// + /// CHECK: Seeds must be \["authority", id\] (Jupiter V6 Program). + #[account( + seeds = [ + b"authority", + &[args.authority_id], + ], + bump, + seeds::program = jupiter_v6_program, + constraint = { + require!( + args.authority_id <= jupiter_v6::AUTHORITY_COUNT, + SwapLayerError::InvalidJupiterV6AuthorityId, + ); + + true + } + )] + jupiter_v6_authority: UncheckedAccount<'info>, + + /// CHECK: This account will be the Swap Layer's swap authority. + transfer_authority: UncheckedAccount<'info>, + + /// CHECK: This account will be the Swap Layer's source token account. + #[account(mut)] + src_custody_token: UncheckedAccount<'info>, + + #[account( + mut, + associated_token::mint = src_mint, + associated_token::authority = jupiter_v6_authority, + )] + jupiter_v6_src_custody_token: Box>, + + #[account( + mut, + associated_token::mint = dst_mint, + associated_token::authority = jupiter_v6_authority, + )] + jupiter_v6_dst_custody_token: Box>, + + /// CHECK: This account will be the Swap Layer's destination token account. + #[account(mut)] + dst_custody_token: UncheckedAccount<'info>, + + /// CHECK: This account must be the source mint for the swap. + src_mint: UncheckedAccount<'info>, + + /// CHECK: This account must be the destination mint for the swap. + dst_mint: UncheckedAccount<'info>, + + /// CHECK: This is an optional account, which we will enforce to be None (so it will be passed + /// in as the Jupiter V6 program ID) because Swap Layer will not collect platform fees. + #[account(address = jupiter_v6::JUPITER_V6_PROGRAM_ID)] + platform_fee_none: UncheckedAccount<'info>, + + /// CHECK: Token 2022 program is optional. + token_2022_program: UncheckedAccount<'info>, + + /// CHECK: Seeds must be \["__event_authority"\] (Jupiter V6 Program). + jupiter_v6_event_authority: UncheckedAccount<'info>, + + /// CHECK: Must equal Jupiter V6 Program ID. + #[account(address = jupiter_v6::JUPITER_V6_PROGRAM_ID)] + jupiter_v6_program: UncheckedAccount<'info>, +} diff --git a/solana/programs/swap-layer/src/processor/complete/other/mod.rs b/solana/programs/swap-layer/src/processor/complete/other/mod.rs new file mode 100644 index 00000000..6eab6471 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/complete/other/mod.rs @@ -0,0 +1,2 @@ +mod direct; +pub use direct::*; diff --git a/solana/programs/swap-layer/src/processor/complete/usdc/direct.rs b/solana/programs/swap-layer/src/processor/complete/usdc/direct.rs new file mode 100644 index 00000000..82e846c1 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/complete/usdc/direct.rs @@ -0,0 +1,65 @@ +use crate::{composite::*, error::SwapLayerError}; +use anchor_lang::prelude::*; +use anchor_spl::token; +use swap_layer_messages::types::{OutputToken, RedeemMode}; + +#[derive(Accounts)] +pub struct CompleteTransferDirect<'info> { + #[account( + constraint = { + let swap_msg = consume_swap_layer_fill.read_message_unchecked(); + + require_keys_eq!( + recipient.key(), + Pubkey::from(swap_msg.recipient), + SwapLayerError::InvalidRecipient + ); + + require!( + matches!( + swap_msg.output_token, + OutputToken::Usdc + ), + SwapLayerError::InvalidOutputToken + ); + + true + } + )] + consume_swap_layer_fill: ConsumeSwapLayerFill<'info>, + + #[account( + mut, + associated_token::mint = common::USDC_MINT, + associated_token::authority = recipient + )] + /// Recipient associated token account. The recipient authority check + /// is necessary to ensure that the recipient is the intended recipient + /// of the bridged tokens. Mutable. + recipient_token_account: Box>, + + /// CHECK: This account must be the owner of the recipient token account. The + /// recipient token account must be encoded in the prepared fill. + recipient: UncheckedAccount<'info>, + + token_program: Program<'info, token::Token>, +} + +pub fn complete_transfer_direct(ctx: Context) -> Result<()> { + match ctx + .accounts + .consume_swap_layer_fill + .read_message_unchecked() + .redeem_mode + { + RedeemMode::Direct => ctx + .accounts + .consume_swap_layer_fill + .consume_prepared_fill( + ctx.accounts.recipient_token_account.to_account_info(), + ctx.accounts.token_program.to_account_info(), + ) + .map(|_| ()), + _ => err!(SwapLayerError::InvalidRedeemMode), + } +} diff --git a/solana/programs/swap-layer/src/processor/complete/usdc/mod.rs b/solana/programs/swap-layer/src/processor/complete/usdc/mod.rs new file mode 100644 index 00000000..9f79f08c --- /dev/null +++ b/solana/programs/swap-layer/src/processor/complete/usdc/mod.rs @@ -0,0 +1,5 @@ +mod relay; +pub use relay::*; + +mod direct; +pub use direct::*; diff --git a/solana/programs/swap-layer/src/processor/complete/usdc/relay.rs b/solana/programs/swap-layer/src/processor/complete/usdc/relay.rs new file mode 100644 index 00000000..47f11c99 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/complete/usdc/relay.rs @@ -0,0 +1,184 @@ +use crate::{ + composite::*, + error::SwapLayerError, + state::Custodian, + utils::{self}, +}; +use anchor_lang::prelude::*; +use anchor_spl::token; +use swap_layer_messages::types::{OutputToken, RedeemMode}; + +#[derive(Accounts)] +pub struct CompleteTransferRelay<'info> { + #[account(mut)] + /// The payer of the transaction. This could either be the recipient or a relayer. + payer: Signer<'info>, + + #[account( + constraint = { + let swap_msg = consume_swap_layer_fill.read_message_unchecked(); + + require_keys_eq!( + recipient.key(), + Pubkey::from(swap_msg.recipient), + SwapLayerError::InvalidRecipient + ); + + require!( + matches!( + swap_msg.output_token, + OutputToken::Usdc + ), + SwapLayerError::InvalidOutputToken + ); + + true + } + )] + consume_swap_layer_fill: ConsumeSwapLayerFill<'info>, + + #[account( + init, + payer = payer, + seeds = [ + crate::COMPLETE_TOKEN_SEED_PREFIX, + consume_swap_layer_fill.key().as_ref(), + ], + bump, + token::mint = usdc, + token::authority = consume_swap_layer_fill.custodian + )] + complete_token_account: Account<'info, token::TokenAccount>, + + #[account( + mut, + associated_token::mint = usdc, + associated_token::authority = recipient + )] + /// Recipient associated token account. The recipient authority check + /// is necessary to ensure that the recipient is the intended recipient + /// of the bridged tokens. + recipient_token_account: Box>, + + /// CHECK: recipient may differ from payer if a relayer paid for this + /// transaction. This instruction verifies that the recipient key + /// passed in this context matches the intended recipient in the fill. + #[account(mut)] + recipient: UncheckedAccount<'info>, + + #[account( + mut, + address = consume_swap_layer_fill.custodian.fee_recipient_token, + )] + fee_recipient_token: Account<'info, token::TokenAccount>, + + usdc: Usdc<'info>, + + token_program: Program<'info, token::Token>, + system_program: Program<'info, System>, +} + +pub fn complete_transfer_relay(ctx: Context) -> Result<()> { + // Gas dropoff needs to be scaled by 1e3 to convert into lamports. + match ctx + .accounts + .consume_swap_layer_fill + .read_message_unchecked() + .redeem_mode + { + RedeemMode::Relay { + gas_dropoff, + relaying_fee, + } => handle_complete_transfer_relay( + ctx, + utils::gas_dropoff::denormalize_gas_dropoff(gas_dropoff), + relaying_fee.into(), + ), + _ => err!(SwapLayerError::InvalidRedeemMode), + } +} + +fn handle_complete_transfer_relay( + ctx: Context, + gas_dropoff: u64, + relaying_fee: u64, +) -> Result<()> { + let complete_token = &ctx.accounts.complete_token_account; + let token_program = &ctx.accounts.token_program; + + // CPI Call token router. + let fill_amount = ctx.accounts.consume_swap_layer_fill.consume_prepared_fill( + complete_token.to_account_info(), + token_program.to_account_info(), + )?; + + let custodian = &ctx.accounts.consume_swap_layer_fill.custodian; + let payer = &ctx.accounts.payer; + let recipient = &ctx.accounts.recipient; + + // If the payer is the recipient, just transfer the tokens to the recipient. + let user_amount = { + if payer.key() == recipient.key() { + fill_amount + } else { + if gas_dropoff > 0 { + anchor_lang::system_program::transfer( + CpiContext::new( + ctx.accounts.system_program.to_account_info(), + anchor_lang::system_program::Transfer { + from: payer.to_account_info(), + to: recipient.to_account_info(), + }, + ), + gas_dropoff, + )?; + } + + // Calculate the user amount. + fill_amount + .checked_sub(relaying_fee) + .ok_or(SwapLayerError::InvalidRelayerFee)? + } + }; + + // Transfer the tokens to the recipient. + anchor_spl::token::transfer( + CpiContext::new_with_signer( + token_program.to_account_info(), + anchor_spl::token::Transfer { + from: complete_token.to_account_info(), + to: ctx.accounts.recipient_token_account.to_account_info(), + authority: custodian.to_account_info(), + }, + &[Custodian::SIGNER_SEEDS], + ), + user_amount, + )?; + + // Transfer eligible USDC to the fee recipient. + if user_amount != fill_amount { + anchor_spl::token::transfer( + CpiContext::new_with_signer( + token_program.to_account_info(), + anchor_spl::token::Transfer { + from: complete_token.to_account_info(), + to: ctx.accounts.fee_recipient_token.to_account_info(), + authority: custodian.to_account_info(), + }, + &[Custodian::SIGNER_SEEDS], + ), + fill_amount.checked_sub(user_amount).unwrap(), + )?; + } + + // Finally close token account. + token::close_account(CpiContext::new_with_signer( + token_program.to_account_info(), + token::CloseAccount { + account: complete_token.to_account_info(), + destination: payer.to_account_info(), + authority: custodian.to_account_info(), + }, + &[Custodian::SIGNER_SEEDS], + )) +} diff --git a/solana/programs/swap-layer/src/processor/initiate/mod.rs b/solana/programs/swap-layer/src/processor/initiate/mod.rs new file mode 100644 index 00000000..cea54517 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/initiate/mod.rs @@ -0,0 +1,2 @@ +mod usdc; +pub use usdc::*; diff --git a/solana/programs/swap-layer/src/processor/initiate/usdc.rs b/solana/programs/swap-layer/src/processor/initiate/usdc.rs new file mode 100644 index 00000000..3635d451 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/initiate/usdc.rs @@ -0,0 +1,148 @@ +use crate::utils::gas_dropoff::denormalize_gas_dropoff; +use crate::utils::relayer_fees::calculate_relayer_fee; +use crate::{composite::*, error::SwapLayerError, state::Peer}; +use anchor_lang::prelude::borsh::BorshDeserialize; +use anchor_lang::prelude::*; +use anchor_spl::token; +use common::wormhole_io::TypePrefixedPayload; +use swap_layer_messages::messages::SwapMessageV1; +use swap_layer_messages::types::{OutputToken, RedeemMode, SwapType, Uint48}; + +#[derive(Accounts)] +#[instruction(args: InitiateTransferArgs)] +pub struct InitiateTransfer<'info> { + #[account(mut)] + /// The payer of the transaction. This could either be the recipient or a relayer. + payer: Signer<'info>, + + #[account( + mut, + associated_token::mint = usdc, + associated_token::authority = payer + )] + payer_token: Box>, + + usdc: Usdc<'info>, + + #[account( + seeds = [ + Peer::SEED_PREFIX, + &args.target_chain.to_be_bytes(), + ], + bump + )] + peer: Box>, + + /// CHECK: Token router config. + token_router_custodian: UncheckedAccount<'info>, + + #[account( + mut, + constraint = { + require!(*prepared_order.key != payer.key(), SwapLayerError::InvalidPreparedOrder); + + true + } + )] + prepared_order: Signer<'info>, + + #[account(mut)] + /// CHECK: + prepared_custody_token: UncheckedAccount<'info>, + + token_router_program: Program<'info, token_router::program::TokenRouter>, + token_program: Program<'info, token::Token>, + system_program: Program<'info, System>, +} + +#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)] +pub struct RelayOptions { + pub gas_dropoff: u32, + pub max_relayer_fee: u64, +} + +/// Arguments for [prepare_market_order]. +#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)] +pub struct InitiateTransferArgs { + /// Amount of tokens to transfer. + pub amount_in: u64, + + /// The Wormhole chain ID of the network to transfer tokens to. + pub target_chain: u16, + + pub relay_options: Option, + + pub recipient: [u8; 32], +} + +pub fn initiate_transfer(ctx: Context, args: InitiateTransferArgs) -> Result<()> { + require!(args.recipient != [0; 32], SwapLayerError::InvalidRecipient); + + // Save this, we will need to account for the relayer fee. + let mut transfer_amount = args.amount_in; + + let swap_message = if args.relay_options.is_some() { + let relay_options = args.relay_options.unwrap(); + + // Relaying fee must be less than the user-specific maximum. + let relaying_fee = calculate_relayer_fee( + &ctx.accounts.peer.relay_params, + denormalize_gas_dropoff(relay_options.gas_dropoff), + &SwapType::Invalid, + 0, // Swap count. + )?; + require!( + relaying_fee <= relay_options.max_relayer_fee, + SwapLayerError::ExceedsMaxRelayingFee + ); + + transfer_amount = transfer_amount.saturating_add(relaying_fee); + + SwapMessageV1 { + recipient: args.recipient, + redeem_mode: RedeemMode::Relay { + gas_dropoff: relay_options.gas_dropoff, + relaying_fee: Uint48::try_from(relaying_fee).unwrap(), + }, + output_token: OutputToken::Usdc, + } + } else { + SwapMessageV1 { + recipient: args.recipient, + redeem_mode: RedeemMode::Direct, + output_token: OutputToken::Usdc, + } + }; + + token_router::cpi::prepare_market_order( + CpiContext::new( + ctx.accounts.token_router_program.to_account_info(), + token_router::cpi::accounts::PrepareMarketOrder { + payer: ctx.accounts.payer.to_account_info(), + custodian: token_router::cpi::accounts::CheckedCustodian { + custodian: ctx.accounts.token_router_custodian.to_account_info(), + }, + program_transfer_authority: None, + sender: Some(ctx.accounts.payer.to_account_info()), + prepared_order: ctx.accounts.prepared_order.to_account_info(), + sender_token: ctx.accounts.payer_token.to_account_info(), + refund_token: ctx.accounts.payer_token.to_account_info(), + prepared_custody_token: ctx.accounts.prepared_custody_token.to_account_info(), + usdc: token_router::cpi::accounts::Usdc { + mint: ctx.accounts.usdc.to_account_info(), + }, + token_program: ctx.accounts.token_program.to_account_info(), + system_program: ctx.accounts.system_program.to_account_info(), + }, + ), + token_router::PrepareMarketOrderArgs { + amount_in: transfer_amount, + min_amount_out: None, + target_chain: args.target_chain, + redeemer: ctx.accounts.peer.address, + redeemer_message: swap_message.to_vec(), + }, + )?; + + Ok(()) +} diff --git a/solana/programs/swap-layer/src/processor/mod.rs b/solana/programs/swap-layer/src/processor/mod.rs new file mode 100644 index 00000000..f56c2285 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/mod.rs @@ -0,0 +1,8 @@ +mod admin; +pub use admin::*; + +mod complete; +pub use complete::*; + +mod initiate; +pub use initiate::*; diff --git a/solana/programs/swap-layer/src/state/custodian.rs b/solana/programs/swap-layer/src/state/custodian.rs new file mode 100644 index 00000000..408ccf8d --- /dev/null +++ b/solana/programs/swap-layer/src/state/custodian.rs @@ -0,0 +1,74 @@ +use anchor_lang::prelude::*; +use common::admin; + +#[account] +#[derive(Debug, InitSpace)] +pub struct Custodian { + /// Program's owner. + pub owner: Pubkey, + pub pending_owner: Option, + + /// Program's assistant. Can be used to update the relayer fee and swap rate. + pub owner_assistant: Pubkey, + + /// Program's fee updater. Can be used to update fee parameters and the like. + pub fee_updater: Pubkey, + + /// Program's fee recipient. Receives relayer fees in USDC. + pub fee_recipient_token: Pubkey, +} + +impl Custodian { + pub const SEED_PREFIX: &'static [u8] = b"custodian"; + pub const BUMP: u8 = crate::CUSTODIAN_BUMP; + pub const SIGNER_SEEDS: &'static [&'static [u8]] = &[Self::SEED_PREFIX, &[Self::BUMP]]; +} + +impl admin::Ownable for Custodian { + fn owner(&self) -> &Pubkey { + &self.owner + } + + fn owner_mut(&mut self) -> &mut Pubkey { + &mut self.owner + } +} + +impl admin::PendingOwner for Custodian { + fn pending_owner(&self) -> &Option { + &self.pending_owner + } + + fn pending_owner_mut(&mut self) -> &mut Option { + &mut self.pending_owner + } +} + +impl admin::OwnerAssistant for Custodian { + fn owner_assistant(&self) -> &Pubkey { + &self.owner_assistant + } + + fn owner_assistant_mut(&mut self) -> &mut Pubkey { + &mut self.owner_assistant + } +} + +#[cfg(test)] +mod test { + use solana_program::pubkey::Pubkey; + + use super::*; + + #[test] + fn test_bump() { + let (custodian, bump) = + Pubkey::find_program_address(&[Custodian::SEED_PREFIX], &crate::id()); + assert_eq!(Custodian::BUMP, bump, "bump mismatch"); + assert_eq!( + custodian, + Pubkey::create_program_address(Custodian::SIGNER_SEEDS, &crate::id()).unwrap(), + "custodian mismatch", + ); + } +} diff --git a/solana/programs/swap-layer/src/state/mod.rs b/solana/programs/swap-layer/src/state/mod.rs new file mode 100644 index 00000000..62e7d9e2 --- /dev/null +++ b/solana/programs/swap-layer/src/state/mod.rs @@ -0,0 +1,5 @@ +mod custodian; +pub use custodian::*; + +mod peer; +pub use peer::*; diff --git a/solana/programs/swap-layer/src/state/peer.rs b/solana/programs/swap-layer/src/state/peer.rs new file mode 100644 index 00000000..d8c5551a --- /dev/null +++ b/solana/programs/swap-layer/src/state/peer.rs @@ -0,0 +1,44 @@ +use anchor_lang::prelude::*; + +#[derive(Debug, Default, Clone, InitSpace, AnchorSerialize, AnchorDeserialize)] +pub enum ExecutionParams { + #[default] + None, + Evm { + // Wei/gas scaled by 1e6 (i.e. 1e3 = 1 gwei) + gas_price: u32, + // Margin for gas dropoff. This value is scaled 1e4 (e.g. 1000000 = 100.00%). + gas_price_margin: u32, + }, +} + +#[derive(Debug, Default, Clone, InitSpace, AnchorSerialize, AnchorDeserialize)] +pub struct RelayParams { + // Atomic usdc (i.e. 6 decimals -> 1e6 = 1 usdc), max=disabled + pub base_fee: u32, + // Atomic usdc/token (e.g. 1e9 = 1000 usdc/ether (or sol)) + pub native_token_price: u64, + // Specified in micro-ether (i.e. 1e6 = 1 ether && 1e6 = 1 sol). The receiving + // contract will scale the gas dropoff values based on the native decimals. + pub max_gas_dropoff: u32, + // Margin for gas dropoff. This value is scaled 1e4 (e.g. 1000000 = 100.00%). + pub gas_dropoff_margin: u32, + // Execution parameters specific to the target chain's execution environment. + pub execution_params: ExecutionParams, +} + +#[account] +#[derive(Default, InitSpace)] +/// Foreign Peer account data. +pub struct Peer { + /// Peer chain. Cannot equal `1` (Solana's Chain ID). + pub chain: u16, + /// Peer address. Cannot be zero address. + pub address: [u8; 32], + /// Relay parameters. + pub relay_params: RelayParams, +} + +impl Peer { + pub const SEED_PREFIX: &'static [u8] = b"peer"; +} diff --git a/solana/programs/swap-layer/src/utils/gas_dropoff.rs b/solana/programs/swap-layer/src/utils/gas_dropoff.rs new file mode 100644 index 00000000..e1207233 --- /dev/null +++ b/solana/programs/swap-layer/src/utils/gas_dropoff.rs @@ -0,0 +1,5 @@ +const GAS_DROPOFF_SCALAR: u32 = 1_000; + +pub fn denormalize_gas_dropoff(gas_dropoff: u32) -> u64 { + u64::from(gas_dropoff).saturating_mul(GAS_DROPOFF_SCALAR.into()) +} diff --git a/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/mod.rs b/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/mod.rs new file mode 100644 index 00000000..728300fa --- /dev/null +++ b/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/mod.rs @@ -0,0 +1,2 @@ +mod shared_accounts_route; +pub use shared_accounts_route::*; diff --git a/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs b/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs new file mode 100644 index 00000000..2f5f3d0a --- /dev/null +++ b/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs @@ -0,0 +1,111 @@ +use crate::utils::{jupiter_v6::types::RoutePlanStep, AnchorInstructionData, AnchorSelector}; +use anchor_lang::prelude::*; + +pub const SHARED_ACCOUNTS_ROUTE_SELECTOR: AnchorSelector = + AnchorSelector([193, 32, 155, 51, 65, 214, 156, 129]); + +pub struct SharedAccountsRoute<'info> { + pub token_program: AccountInfo<'info>, + pub program_authority: AccountInfo<'info>, + pub user_transfer_authority: AccountInfo<'info>, + pub source_token: AccountInfo<'info>, + pub program_source_token: AccountInfo<'info>, + pub program_destination_token: AccountInfo<'info>, + pub destination_account: AccountInfo<'info>, + pub source_mint: AccountInfo<'info>, + pub destination_mint: AccountInfo<'info>, + pub platform_fee: Option>, + pub token_2022_program: Option>, + pub event_authority: AccountInfo<'info>, + pub program: AccountInfo<'info>, +} + +impl<'info> ToAccountMetas for SharedAccountsRoute<'info> { + fn to_account_metas(&self, is_signer: Option) -> Vec { + let program_id = *self.program.key; + + vec![ + AccountMeta::new_readonly(*self.token_program.key, false), + AccountMeta::new_readonly(*self.program_authority.key, is_signer.unwrap_or_default()), + AccountMeta::new_readonly(*self.user_transfer_authority.key, true), + AccountMeta::new(*self.source_token.key, false), + AccountMeta::new(*self.program_source_token.key, false), + AccountMeta::new(*self.program_destination_token.key, false), + AccountMeta::new(*self.destination_account.key, false), + AccountMeta::new_readonly(*self.source_mint.key, false), + AccountMeta::new_readonly(*self.destination_mint.key, false), + match self.platform_fee.as_ref() { + Some(acc_info) => AccountMeta::new(*acc_info.key, false), + None => AccountMeta::new_readonly(program_id, false), + }, + AccountMeta::new_readonly( + self.token_2022_program + .as_ref() + .map_or(program_id, |acc_info| *acc_info.key), + false, + ), + AccountMeta::new_readonly(*self.event_authority.key, false), + AccountMeta::new_readonly(program_id, false), + ] + } +} + +impl<'info> ToAccountInfos<'info> for SharedAccountsRoute<'info> { + fn to_account_infos(&self) -> Vec> { + let program = &self.program; + + vec![ + self.token_program.clone(), + self.program_authority.clone(), + self.user_transfer_authority.clone(), + self.source_token.clone(), + self.program_source_token.clone(), + self.program_destination_token.clone(), + self.destination_account.clone(), + self.source_mint.clone(), + self.destination_mint.clone(), + self.platform_fee + .as_ref() + .map_or(program.clone(), |acc_info| acc_info.clone()), + self.token_2022_program + .as_ref() + .map_or(program.clone(), |acc_info| acc_info.clone()), + self.event_authority.clone(), + program.clone(), + ] + } +} + +#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone)] +pub struct SharedAccountsRouteArgs { + pub authority_id: u8, + pub route_plan: Vec, + pub in_amount: u64, + pub quoted_out_amount: u64, + pub slippage_bps: u16, + pub platform_fee_bps: u8, +} + +impl AnchorInstructionData for SharedAccountsRouteArgs { + fn require_selector(data: &mut &[u8]) -> Result<()> { + require_eq!( + AnchorSelector::deserialize(data)?, + SHARED_ACCOUNTS_ROUTE_SELECTOR, + ErrorCode::InstructionDidNotDeserialize + ); + + Ok(()) + } +} + +/// NOTE: This requires remaining accounts, which are the accounts required to +/// perform swap routes. +pub fn shared_accounts_route<'info>( + ctx: CpiContext<'_, '_, '_, 'info, SharedAccountsRoute<'info>>, + args: SharedAccountsRouteArgs, +) -> Result<()> { + wormhole_solana_utils::cpi::invoke_data_with_context( + (SHARED_ACCOUNTS_ROUTE_SELECTOR, args), + ctx, + ) +} diff --git a/solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs b/solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs new file mode 100644 index 00000000..726ad56a --- /dev/null +++ b/solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs @@ -0,0 +1,70 @@ +pub mod cpi; +pub use cpi::SHARED_ACCOUNTS_ROUTE_SELECTOR; + +mod types; +pub use types::*; + +use solana_program::{pubkey, pubkey::Pubkey}; + +pub const JUPITER_V6_PROGRAM_ID: Pubkey = pubkey!("JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"); + +pub const AUTHORITY_COUNT: u8 = 8; + +#[allow(clippy::inconsistent_digit_grouping)] +pub const ONE_HUNDRED_PERCENT: u16 = 100_00; + +pub fn compute_quoted_out_amount(limit_amount: u64, slippage_bps: u16) -> Option { + if slippage_bps > ONE_HUNDRED_PERCENT { + None + } else { + let factor = 1. - f64::from(slippage_bps) / f64::from(ONE_HUNDRED_PERCENT); + + // We are aware of the potential loss of precision here if the limit amount is > 52 bits. + // + // An example with WSOL, which is 9 decimals: + // + // If the limit amount were 2 ^ 52 - 1 = 4503599627370495, this would equate to roughly + // 4,503,599 WSOL. At current day prices of $150, this would be worth 675,539,850 USDC. + // There would never be a situation where the swap amount from USDC be this high. + // + // In an extreme scenario where the price drops by 99.9% (so this means a price of $0.15), + // the swap amount would be 4,503,599 * 0.15 = 675,539.85 USDC. This is still too large of + // a number to pass through the Swap Layer. + #[allow(clippy::as_conversions)] + #[allow(clippy::cast_precision_loss)] + let quoted_out_amount = (limit_amount as f64) / factor; + + // We are fine to truncate here because we set the amount to the floor of the result. This + // result will also not ever be negative, so we are not worried about sign loss. + #[allow(clippy::as_conversions)] + #[allow(clippy::cast_possible_truncation)] + #[allow(clippy::cast_sign_loss)] + let quoted_out_amount = quoted_out_amount.floor() as u64; + + quoted_out_amount.into() + } +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_compute_quoted_out_amount() { + let slippage_bps = 200; + let limit_amount = 48_987_482_503; + + assert_eq!( + compute_quoted_out_amount(limit_amount, slippage_bps).unwrap(), + 49_987_227_043 + ); + } + + #[test] + fn test_invalid_slippage_bps() { + let slippage_bps = 10001; + let limit_amount = 48_987_482_503; + + assert_eq!(compute_quoted_out_amount(limit_amount, slippage_bps), None); + } +} diff --git a/solana/programs/swap-layer/src/utils/jupiter_v6/types/mod.rs b/solana/programs/swap-layer/src/utils/jupiter_v6/types/mod.rs new file mode 100644 index 00000000..53445802 --- /dev/null +++ b/solana/programs/swap-layer/src/utils/jupiter_v6/types/mod.rs @@ -0,0 +1,92 @@ +use anchor_lang::prelude::*; + +#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, PartialEq, Eq)] +pub struct RoutePlanStep { + swap: Swap, + percent: u8, + input_index: u8, + output_index: u8, +} + +#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, PartialEq, Eq)] +pub enum Swap { + Saber, + SaberAddDecimalsDeposit, + SaberAddDecimalsWithdraw, + TokenSwap, + Sencha, + Step, + Cropper, + Raydium, + Crema { + a_to_b: bool, + }, + Lifinity, + Mercurial, + Cykura, + Serum { + side: Side, + }, + MarinadeDeposit, + MarinadeUnstake, + Aldrin { + side: Side, + }, + AldrinV2 { + side: Side, + }, + Whirlpool { + a_to_b: bool, + }, + Invariant { + x_to_y: bool, + }, + Meteora, + GooseFX, + DeltaFi { + stable: bool, + }, + Balansol, + MarcoPolo { + x_to_y: bool, + }, + Dradex { + side: Side, + }, + LifinityV2, + RaydiumClmm, + Openbook { + side: Side, + }, + Phoenix { + side: Side, + }, + Symmetry { + from_token_id: u64, + to_token_id: u64, + }, + TokenSwapV2, + HeliumTreasuryManagementRedeemV0, + StakeDexStakeWrappedSol, + StakeDexSwapViaStake { + bridge_stake_seed: u32, + }, + GooseFXV2, + Perps, + PerpsAddLiquidity, + PerpsRemoveLiquidity, + MeteoraDlmm, + OpenbookV2 { + side: Side, + }, + RaydiumClmmV2, + StakeDexPrefundWithdrawStakeAndDepositStake { + bridge_stake_seed: u32, + }, +} + +#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, PartialEq, Eq)] +pub enum Side { + Bid, + Ask, +} diff --git a/solana/programs/swap-layer/src/utils/mod.rs b/solana/programs/swap-layer/src/utils/mod.rs new file mode 100644 index 00000000..ba84306f --- /dev/null +++ b/solana/programs/swap-layer/src/utils/mod.rs @@ -0,0 +1,28 @@ +pub mod gas_dropoff; +pub mod jupiter_v6; +pub mod relay_parameters; +pub mod relayer_fees; +//pub mod token_router; + +use std::fmt; + +use anchor_lang::prelude::*; + +#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, Copy, PartialEq, Eq)] +pub struct AnchorSelector(pub [u8; 8]); + +impl fmt::Display for AnchorSelector { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{}", hex::encode(self.0)) + } +} + +impl From<[u8; 8]> for AnchorSelector { + fn from(data: [u8; 8]) -> Self { + AnchorSelector(data) + } +} + +pub trait AnchorInstructionData: AnchorDeserialize { + fn require_selector(data: &mut &[u8]) -> Result<()>; +} diff --git a/solana/programs/swap-layer/src/utils/relay_parameters.rs b/solana/programs/swap-layer/src/utils/relay_parameters.rs new file mode 100644 index 00000000..05d889e3 --- /dev/null +++ b/solana/programs/swap-layer/src/utils/relay_parameters.rs @@ -0,0 +1,33 @@ +use crate::{ + error::SwapLayerError, + state::{ExecutionParams, RelayParams}, +}; +use anchor_lang::prelude::*; + +pub fn verify_relay_params(params: &RelayParams) -> Result<()> { + require!(params.base_fee > 0, SwapLayerError::InvalidBaseFee); + require!( + params.native_token_price > 0, + SwapLayerError::InvalidNativeTokenPrice + ); + require!( + params.gas_dropoff_margin <= crate::MAX_BPS, + SwapLayerError::InvalidMargin + ); + + match params.execution_params { + ExecutionParams::Evm { + gas_price, + gas_price_margin, + } => { + require!(gas_price > 0, SwapLayerError::InvalidGasPrice); + require!( + gas_price_margin <= crate::MAX_BPS, + SwapLayerError::InvalidMargin + ); + } + ExecutionParams::None => {} + } + + Ok(()) +} diff --git a/solana/programs/swap-layer/src/utils/relayer_fees.rs b/solana/programs/swap-layer/src/utils/relayer_fees.rs new file mode 100644 index 00000000..2963c674 --- /dev/null +++ b/solana/programs/swap-layer/src/utils/relayer_fees.rs @@ -0,0 +1,345 @@ +use crate::utils::gas_dropoff::denormalize_gas_dropoff; +use crate::{ + error::SwapLayerError, + state::{ExecutionParams, RelayParams}, +}; +use anchor_lang::prelude::*; +use swap_layer_messages::types::SwapType; + +// EVM gas overheads in gas units. +const EVM_GAS_OVERHEAD: u64 = 100_000; +const DROPOFF_GAS_OVERHEAD: u64 = 10_000; +const UNISWAP_GAS_OVERHEAD: u64 = 100_000; +const UNISWAP_GAS_PER_SWAP: u64 = 100_000; +const TRADERJOE_GAS_OVERHEAD: u64 = 100_000; +const TRADERJOE_GAS_PER_SWAP: u64 = 100_000; + +const ONE_SOL: u64 = 1_000_000_000; +const GAS_PRICE_SCALAR: u32 = 1_000_000; + +// 1 ETH in WEI. +const ONE_ETHER: u64 = 1_000_000_000_000_000_000; + +pub fn denormalize_gas_price(gas_price: u32) -> u64 { + u64::from(gas_price).saturating_mul(GAS_PRICE_SCALAR.into()) +} + +fn compound(percentage: u32, base: u64) -> Option { + if percentage == 0 { + Some(base) + } else { + // NOTE: Upcasting from u32 to u128 is safe here. + #[allow(clippy::as_conversions)] + #[allow(clippy::cast_possible_truncation)] + const MAX: u128 = crate::MAX_BPS as u128; + + let base = u128::from(base); + + let compounded = + base.saturating_add(base.saturating_mul(percentage.into()).saturating_div(MAX)); + + u64::try_from(compounded).ok() + } +} + +fn calculate_evm_swap_overhead(swap_type: &SwapType, swap_count: u8) -> Option { + match swap_type { + SwapType::TraderJoe(_) => TRADERJOE_GAS_OVERHEAD + .checked_add(TRADERJOE_GAS_PER_SWAP.checked_mul(u64::from(swap_count))?), + SwapType::UniswapV3(_) => UNISWAP_GAS_OVERHEAD + .checked_add(UNISWAP_GAS_PER_SWAP.checked_mul(u64::from(swap_count))?), + _ => None, + } +} + +fn calculate_evm_gas_cost( + gas_price: u32, + gas_price_margin: u32, + total_gas: u64, + native_token_price: u64, +) -> Option { + #[allow(clippy::as_conversions)] + const ONE_ETHER_U128: u128 = ONE_ETHER as u128; + + // Using u128 to prevent overflow. If this calculation does overflow, + // one of the inputs is grossly incorrect/misconfigured. + let gas_cost = u128::from(total_gas) + .checked_mul(u128::from(denormalize_gas_price(gas_price)))? + .checked_mul(u128::from(native_token_price))? + .saturating_div(ONE_ETHER_U128); + + compound(gas_price_margin, u64::try_from(gas_cost).ok()?) +} + +fn calculate_gas_dropoff_cost( + denorm_gas_dropoff: u64, + gas_dropoff_margin: u32, + native_token_price: u64, +) -> Option { + #[allow(clippy::as_conversions)] + const ONE_SOL_U128: u128 = ONE_SOL as u128; + + // Using u128 to prevent overflow. If this calculation does overflow, + // one of the inputs is grossly incorrect/misconfigured. + let dropoff_cost = u128::from(denorm_gas_dropoff) + .checked_mul(u128::from(native_token_price))? + .saturating_div(ONE_SOL_U128); + + compound(gas_dropoff_margin, u64::try_from(dropoff_cost).ok()?) +} + +pub fn calculate_relayer_fee( + relay_params: &RelayParams, + denorm_gas_dropoff: u64, + swap_type: &SwapType, + swap_count: u8, +) -> Result { + require!( + relay_params.base_fee != u32::MAX, + SwapLayerError::RelayingDisabled + ); + + // Running sum of the relayer fee (USDC). + let mut relayer_fee = u64::from(relay_params.base_fee); + + // Calculate the gas dropoff cost in USDC terms. + if denorm_gas_dropoff > 0 { + require!( + denorm_gas_dropoff <= denormalize_gas_dropoff(relay_params.max_gas_dropoff), + SwapLayerError::InvalidGasDropoff + ); + + let gas_dropoff_cost = calculate_gas_dropoff_cost( + denorm_gas_dropoff, + relay_params.gas_dropoff_margin, + relay_params.native_token_price, + ) + .ok_or(SwapLayerError::GasDropoffCalculationFailed)?; + relayer_fee = relayer_fee.saturating_add(gas_dropoff_cost); + } + + // Compute the relayer fee based on the cost of the relay in the + // target execution environment's gas units (converted to USDC). + let _ = match relay_params.execution_params { + ExecutionParams::None => { + err!(SwapLayerError::InvalidExecutionParams) + } + ExecutionParams::Evm { + gas_price, + gas_price_margin, + } => { + let mut total_gas = EVM_GAS_OVERHEAD; + + if denorm_gas_dropoff > 0 { + total_gas = total_gas.saturating_add(DROPOFF_GAS_OVERHEAD); + } + + if swap_count > 0 { + let overhead = calculate_evm_swap_overhead(swap_type, swap_count) + .ok_or(SwapLayerError::EvmGasCalculationFailed)?; + total_gas = total_gas.saturating_add(overhead); + } + + let evm_gas_cost = calculate_evm_gas_cost( + gas_price, + gas_price_margin, + total_gas, + relay_params.native_token_price, + ) + .ok_or(SwapLayerError::EvmGasCalculationFailed)?; + relayer_fee = relayer_fee.saturating_add(evm_gas_cost); + + Ok(()) + } + }; + + Ok(relayer_fee) +} + +#[cfg(test)] +mod test { + use swap_layer_messages::types::{ + TraderJoePoolId, TraderJoeSwapParameters, UniswapSwapParameters, + }; + + use crate::state::{ExecutionParams, RelayParams}; + + use super::*; + + #[test] + fn test_denormalize_gas_price() { + let gas_price = 1_000; // 10 GWEI + let denorm_gas_price = denormalize_gas_price(gas_price); + + assert_eq!(denorm_gas_price, 1_000_000_000); + } + + #[test] + fn test_compound() { + let base = 1_000; + let percentage = 500_000; // 50% + let compounded = compound(percentage, base); + + assert_eq!(compounded, Some(1_500)); + } + + #[test] + fn test_compound_max() { + let base = 1_000; + let percentage = 1_000_000; // 100% + let compounded = compound(percentage, base); + + assert_eq!(compounded, Some(2_000)); + } + + #[test] + fn test_zero_compound() { + let base = 1_000; + let percentage = 0; + let compounded = compound(percentage, base); + + assert_eq!(compounded, Some(1_000)); + } + + #[test] + fn test_uniswap_gas_overhead_one_swap() { + let swap_type = &SwapType::UniswapV3(UniswapSwapParameters { + first_leg_fee: 0.into(), + path: vec![], + }); + let swap_count = 1; + let gas_overhead = calculate_evm_swap_overhead(swap_type, swap_count); + + assert_eq!(gas_overhead, Some(200_000)); + } + + #[test] + fn test_uniswap_gas_overhead_three_swap() { + let swap_type = &SwapType::UniswapV3(UniswapSwapParameters { + first_leg_fee: 0.into(), + path: vec![], + }); + let swap_count = 3; + let gas_overhead = calculate_evm_swap_overhead(swap_type, swap_count); + + assert_eq!(gas_overhead, Some(400_000)); + } + + #[test] + fn test_traderjoe_gas_overhead_one_swap() { + let swap_type = &SwapType::TraderJoe(TraderJoeSwapParameters { + first_pool_id: TraderJoePoolId { + version: 0, + bin_size: 69, + }, + path: vec![], + }); + let swap_count = 1; + let gas_overhead = calculate_evm_swap_overhead(swap_type, swap_count); + + assert_eq!(gas_overhead, Some(200_000)); + } + + #[test] + fn test_traderjoe_gas_overhead_three_swap() { + let swap_type = &SwapType::TraderJoe(TraderJoeSwapParameters { + first_pool_id: TraderJoePoolId { + version: 0, + bin_size: 69, + }, + path: vec![], + }); + let swap_count = 3; + let gas_overhead = calculate_evm_swap_overhead(swap_type, swap_count); + + assert_eq!(gas_overhead, Some(400_000)); + } + + #[test] + fn test_calculate_evm_gas_cost() { + let gas_price = 1_000; // 10 GWEI + let gas_price_margin = 250_000; // 25% + let total_gas = 100_000; + let native_token_price = 200_000_000; // 200 USDC + + let gas_cost = + calculate_evm_gas_cost(gas_price, gas_price_margin, total_gas, native_token_price); + + assert_eq!(gas_cost, Some(25_000)); + } + + #[test] + fn test_calculate_gas_dropoff_cost() { + let denorm_gas_dropoff = 500_000_000; // .5 SOL + let gas_dropoff_margin = 500_000; // 50% + let native_token_price = 200_000_000; // 200 USDC + + let dropoff_cost = + calculate_gas_dropoff_cost(denorm_gas_dropoff, gas_dropoff_margin, native_token_price); + + assert_eq!(dropoff_cost, Some(150000000)); + } + + #[test] + fn test_calculate_relayer_fee_no_swap() { + let relay_params = test_relay_params(); + let denorm_gas_dropoff = 50_000_000; + let swap_type = &SwapType::Invalid; + let swap_count = 0; + + let relayer_fee = + calculate_relayer_fee(&relay_params, denorm_gas_dropoff, swap_type, swap_count); + + assert_eq!(relayer_fee.unwrap(), 16775000); + } + + #[test] + fn test_calculate_relayer_fee_with_uniswap_swap() { + let relay_params = test_relay_params(); + let denorm_gas_dropoff = 50_000_000; + let swap_type = &SwapType::UniswapV3(UniswapSwapParameters { + first_leg_fee: 0.into(), + path: vec![], + }); + let swap_count = 4; + + let relayer_fee = + calculate_relayer_fee(&relay_params, denorm_gas_dropoff, swap_type, swap_count); + + assert_eq!(relayer_fee.unwrap(), 18025000); + } + + #[test] + fn test_calculate_relayer_fee_with_trader_joe_swap() { + let relay_params = test_relay_params(); + let denorm_gas_dropoff = 50_000_000; + let swap_type = &SwapType::TraderJoe(TraderJoeSwapParameters { + first_pool_id: TraderJoePoolId { + version: 0, + bin_size: 69, + }, + path: vec![], + }); + let swap_count = 2; + + let relayer_fee = + calculate_relayer_fee(&relay_params, denorm_gas_dropoff, swap_type, swap_count); + + assert_eq!(relayer_fee.unwrap(), 17525000); + } + + // TODO: Add boundary tests. + + fn test_relay_params() -> RelayParams { + RelayParams { + base_fee: 1_500_000, // 1.5 USDC + native_token_price: 200_000_000, // 200 USDC + max_gas_dropoff: 500_000, // .5 SOL + gas_dropoff_margin: 500_000, // 50% + execution_params: ExecutionParams::Evm { + gas_price: 10_000, // 10 GWEI + gas_price_margin: 250_000, // 25% + }, + } + } +} diff --git a/solana/programs/swap-layer/src/utils/token_router/mod.rs b/solana/programs/swap-layer/src/utils/token_router/mod.rs new file mode 100644 index 00000000..559103fa --- /dev/null +++ b/solana/programs/swap-layer/src/utils/token_router/mod.rs @@ -0,0 +1,25 @@ +use crate::{composite::*, state::Custodian}; +use anchor_lang::prelude::*; + +pub fn consume_prepared_fill<'info>( + accounts: &ConsumeSwapLayerFill<'info>, + dst_token: AccountInfo<'info>, + token_program: AccountInfo<'info>, +) -> Result { + let amount = accounts.fill_custody_token.amount; + + token_router::cpi::consume_prepared_fill(CpiContext::new_with_signer( + accounts.token_router_program.to_account_info(), + token_router::cpi::accounts::ConsumePreparedFill { + redeemer: accounts.custodian.to_account_info(), + beneficiary: accounts.beneficiary.to_account_info(), + prepared_fill: accounts.fill.to_account_info(), + dst_token, + prepared_custody_token: accounts.fill_custody_token.to_account_info(), + token_program, + }, + &[Custodian::SIGNER_SEEDS], + ))?; + + Ok(amount) +} diff --git a/solana/ts/scripts/testJupV6QuoteFlip.ts b/solana/ts/scripts/testJupV6QuoteFlip.ts new file mode 100644 index 00000000..214fa033 --- /dev/null +++ b/solana/ts/scripts/testJupV6QuoteFlip.ts @@ -0,0 +1,107 @@ +import { InstructionFromJSON, createJupiterApiClient } from "@jup-ag/api"; +import * as splToken from "@solana/spl-token"; +import { Keypair, PublicKey, TransactionInstruction } from "@solana/web3.js"; +import { execSync } from "child_process"; +import { argv } from "process"; + +const USDC_MINT_ADDRESS = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); +const USDT_MINT_ADDRESS = new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"); + +const ALLOWED_DEXES = [ + //"Lifinity V2", // use + //"Meteora DLMM", // use + //"Orca V2", + //"Phoenix", // use + //"Raydium", + //"Raydium CLMM", // use + "Whirlpool", // use +]; + +main(argv); + +async function main(argv: string[]) { + if (argv.length < 3) { + console.error("Usage: testJupV6QuoteFlip.ts "); + process.exit(1); + } + + const amount = Number(argv[2]); + const slippageBps = 200; + + const jupiter = createJupiterApiClient({ + basePath: "https://quote-api.jup.ag/v6", + }); + + const inputMint = USDT_MINT_ADDRESS; + const outputMint = USDC_MINT_ADDRESS; + + const swapLayerProgramId = new PublicKey("SwapLayer1111111111111111111111111111111111"); + const preparedFill = Keypair.generate().publicKey; + const [swapAuthority] = PublicKey.findProgramAddressSync( + [Buffer.from("swap-authority"), preparedFill.toBuffer()], + swapLayerProgramId, + ); + console.log("swapAuthority", swapAuthority.toString()); + + { + const quoteResponse = await jupiter.quoteGet({ + inputMint: inputMint.toString(), + outputMint: outputMint.toString(), + amount, + slippageBps, + onlyDirectRoutes: true, + swapMode: "ExactIn", + dexes: ALLOWED_DEXES, + }); + console.log( + "USDT -> USDC, quoteResponse out amounts", + quoteResponse.outAmount, + quoteResponse.otherAmountThreshold, + ); + + const ixResponse = await jupiter.swapInstructionsPost({ + swapRequest: { + userPublicKey: swapAuthority.toString(), + quoteResponse, + }, + }); + console.log("ixResponse", JSON.stringify(ixResponse.swapInstruction, null, 2)); + } + + { + const quoteResponse = await jupiter.quoteGet({ + inputMint: outputMint.toString(), + outputMint: inputMint.toString(), + amount, + slippageBps, + onlyDirectRoutes: true, + swapMode: "ExactIn", + dexes: ALLOWED_DEXES, + }); + console.log( + "USDC -> USDT, quoteResponse out amounts", + quoteResponse.outAmount, + quoteResponse.otherAmountThreshold, + ); + + const ixResponse = await jupiter.swapInstructionsPost({ + swapRequest: { + userPublicKey: swapAuthority.toString(), + quoteResponse, + }, + }); + console.log("ixResponse", JSON.stringify(ixResponse.swapInstruction, null, 2)); + } +} + +function deserializeInstruction(instruction: any) { + return new TransactionInstruction({ + programId: new PublicKey(instruction.programId), + keys: instruction.accounts.map((key: any) => ({ + pubkey: new PublicKey(key.pubkey), + isSigner: key.isSigner, + isWritable: key.isWritable, + })), + data: Buffer.from(instruction.data, "base64"), + }); +} diff --git a/solana/ts/scripts/testJupV6QuoteFlipWhirlpool.ts b/solana/ts/scripts/testJupV6QuoteFlipWhirlpool.ts new file mode 100644 index 00000000..552d417a --- /dev/null +++ b/solana/ts/scripts/testJupV6QuoteFlipWhirlpool.ts @@ -0,0 +1,106 @@ +import { InstructionFromJSON, createJupiterApiClient } from "@jup-ag/api"; +import * as splToken from "@solana/spl-token"; +import { Keypair, PublicKey, TransactionInstruction } from "@solana/web3.js"; +import { execSync } from "child_process"; +import { argv } from "process"; + +const USDC_MINT_ADDRESS = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); +const USDT_MINT_ADDRESS = new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"); + +const ALLOWED_DEXES = [ + //"Lifinity V2", // use + //"Meteora DLMM", // use + //"Orca V2", + //"Phoenix", // use + //"Raydium", + //"Raydium CLMM", // use + "Whirlpool", // use +]; + +main(argv); + +async function main(argv: string[]) { + if (argv.length < 3) { + console.error("Usage: testJupV6QuoteFlip.ts "); + process.exit(1); + } + + const amount = Number(argv[2]); + + const jupiter = createJupiterApiClient({ + basePath: "https://quote-api.jup.ag/v6", + }); + + const inputMint = USDT_MINT_ADDRESS; + const outputMint = USDC_MINT_ADDRESS; + + const swapLayerProgramId = new PublicKey("SwapLayer1111111111111111111111111111111111"); + const preparedFill = Keypair.generate().publicKey; + const [swapAuthority] = PublicKey.findProgramAddressSync( + [Buffer.from("swap-authority"), preparedFill.toBuffer()], + swapLayerProgramId, + ); + console.log("swapAuthority", swapAuthority.toString()); + + { + const quoteResponse = await jupiter.quoteGet({ + inputMint: inputMint.toString(), + outputMint: outputMint.toString(), + amount, + slippageBps: 200, + onlyDirectRoutes: true, + swapMode: "ExactIn", + dexes: ALLOWED_DEXES, + }); + console.log( + "USDT -> USDC, quoteResponse out amounts", + quoteResponse.outAmount, + quoteResponse.otherAmountThreshold, + ); + + const ixResponse = await jupiter.swapInstructionsPost({ + swapRequest: { + userPublicKey: swapAuthority.toString(), + quoteResponse, + }, + }); + console.log("ixResponse", JSON.stringify(ixResponse.swapInstruction, null, 2)); + } + + { + const quoteResponse = await jupiter.quoteGet({ + inputMint: outputMint.toString(), + outputMint: inputMint.toString(), + amount, + slippageBps: 50, + onlyDirectRoutes: true, + swapMode: "ExactIn", + dexes: ALLOWED_DEXES, + }); + console.log( + "USDC -> USDT, quoteResponse out amounts", + quoteResponse.outAmount, + quoteResponse.otherAmountThreshold, + ); + + const ixResponse = await jupiter.swapInstructionsPost({ + swapRequest: { + userPublicKey: swapAuthority.toString(), + quoteResponse, + }, + }); + console.log("ixResponse", JSON.stringify(ixResponse.swapInstruction, null, 2)); + } +} + +function deserializeInstruction(instruction: any) { + return new TransactionInstruction({ + programId: new PublicKey(instruction.programId), + keys: instruction.accounts.map((key: any) => ({ + pubkey: new PublicKey(key.pubkey), + isSigner: key.isSigner, + isWritable: key.isWritable, + })), + data: Buffer.from(instruction.data, "base64"), + }); +} diff --git a/solana/ts/scripts/testJupV6Serde.ts b/solana/ts/scripts/testJupV6Serde.ts new file mode 100644 index 00000000..a7d07ef4 --- /dev/null +++ b/solana/ts/scripts/testJupV6Serde.ts @@ -0,0 +1,23 @@ +import { decodeSharedAccountsRouteArgs } from "../src/jupiterV6"; + +main(); + +function main() { + const samples = [ + "wSCbM0HWnIEFAQAAABEAZAABAHQ7pAsAAABoSiqlCwAAADIAAA==", // recent + "wSCbM0HWnIEAAQAAABEBZAABAHQ7pAsAAACbnbOiCwAAADIAAA==", // a.json + "wSCbM0HWnIEAAQAAABEAZAABAHQ7pAsAAAB29CSlCwAAADIAAA==", // b.json + "wSCbM0HWnIECAQAAABEAZAABAHQ7pAsAAAAoYEulCwAAADIAAA==", // og + ]; + + for (const sample of samples) { + const data = Buffer.from(sample, "base64"); + console.log({ data }); + + const wtf = decodeSharedAccountsRouteArgs(data); + + console.log({ wtf }); + console.log(wtf.routePlan); + console.log(); + } +} diff --git a/solana/ts/scripts/testJupiterQuote.ts b/solana/ts/scripts/testJupiterQuote.ts new file mode 100644 index 00000000..1fbdd631 --- /dev/null +++ b/solana/ts/scripts/testJupiterQuote.ts @@ -0,0 +1,68 @@ +import { + InstructionFromJSON, + createJupiterApiClient, + QuoteGetRequest, + SwapInstructionsPostRequest, +} from "@jup-ag/api"; +import * as splToken from "@solana/spl-token"; +import { PublicKey, TransactionInstruction } from "@solana/web3.js"; +import { execSync } from "child_process"; + +const USDC_MINT_ADDRESS = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); +const USDT_MINT_ADDRESS = new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"); + +const ALLOWED_DEXES = [ + //"Lifinity V2", // use + //"Meteora DLMM", // use + //"Orca V2", + //"Phoenix", // use + //"Raydium", + //"Raydium CLMM", // use + "Whirlpool", // use +]; + +main(); + +async function main() { + const jupiter = createJupiterApiClient({ + basePath: "https://quote-api.jup.ag/v6", + }); + + const inputMint = USDT_MINT_ADDRESS; + const outputMint = USDC_MINT_ADDRESS; + + const quoteRequest = { + inputMint: inputMint.toString(), + outputMint: outputMint.toString(), + amount: 50000000000, + slippageBps: 50, + autoSlippage: false, + computeAutoSlippage: false, + onlyDirectRoutes: true, + swapMode: "ExactIn", + dexes: ALLOWED_DEXES, + } as QuoteGetRequest; + console.log({ quoteRequest }); + + const quoteResponse = await jupiter.quoteGet(quoteRequest); + console.log({ quoteResponse }); + + const swapLayerProgramId = new PublicKey("SwapLayer1111111111111111111111111111111111"); + const [swapAuthority] = PublicKey.findProgramAddressSync( + [Buffer.from("swap-authority")], + swapLayerProgramId, + ); + console.log("swap authority:", swapAuthority.toString()); + + const swapInstructionRequest = { + swapRequest: { + userPublicKey: swapAuthority.toString(), + useSharedAccounts: true, + quoteResponse, + }, + } as SwapInstructionsPostRequest; + console.log({ swapInstructionRequest }); + + const swapInstructionResponse = await jupiter.swapInstructionsPost(swapInstructionRequest); + console.log({ swapInstructionResponse }); +} diff --git a/solana/ts/src/common/index.ts b/solana/ts/src/common/index.ts new file mode 100644 index 00000000..b83a7a4d --- /dev/null +++ b/solana/ts/src/common/index.ts @@ -0,0 +1 @@ +export * from "./layouts"; diff --git a/solana/ts/src/common/layouts.ts b/solana/ts/src/common/layouts.ts new file mode 100644 index 00000000..9b75fc74 --- /dev/null +++ b/solana/ts/src/common/layouts.ts @@ -0,0 +1,10 @@ +import { CustomConversion, UintLayoutItem } from "@wormhole-foundation/sdk-base"; + +export const boolItem = { + binary: "uint", + size: 1, + custom: { + to: (encoded: number): boolean => encoded > 0, + from: (val: boolean): number => (val ? 1 : 0), + } satisfies CustomConversion, +} as const satisfies UintLayoutItem; diff --git a/solana/ts/src/jupiterV6/index.ts b/solana/ts/src/jupiterV6/index.ts new file mode 100644 index 00000000..8dd737a9 --- /dev/null +++ b/solana/ts/src/jupiterV6/index.ts @@ -0,0 +1,103 @@ +export * from "./layouts"; + +import * as jupAg from "@jup-ag/api"; +import * as splToken from "@solana/spl-token"; +import { PublicKey, TransactionInstruction } from "@solana/web3.js"; +import { decodeSharedAccountsRouteArgs, encodeSharedAccountsRouteArgs } from "./layouts"; + +export const JUPITER_V6_PROGRAM_ID = new PublicKey("JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"); + +export function toTransactionInstruction(instruction: jupAg.Instruction): TransactionInstruction { + return { + programId: new PublicKey(instruction.programId), + keys: instruction.accounts.map((key: any) => ({ + pubkey: new PublicKey(key.pubkey), + isSigner: key.isSigner, + isWritable: key.isWritable, + })), + data: Buffer.from(instruction.data, "base64"), + }; +} + +export type ModifySharedAccountsRouteOpts = { + inAmount: bigint; + quotedOutAmount?: bigint; + slippageBps?: number; + cpi?: boolean; +}; + +export type ModifiedSharedAccountsRoute = { + instruction: TransactionInstruction; + sourceToken: PublicKey; + destinationToken: PublicKey; + sourceMint: PublicKey; + destinationMint: PublicKey; + minAmountOut: bigint; +}; + +export function modifySharedAccountsRouteInstruction( + instruction: jupAg.Instruction, + tokenOwner: PublicKey, + opts: ModifySharedAccountsRouteOpts, +): ModifiedSharedAccountsRoute { + const { inAmount } = opts; + let { quotedOutAmount, slippageBps, cpi } = opts; + quotedOutAmount ??= inAmount; + slippageBps ??= 0; + cpi ??= false; + + const ix = toTransactionInstruction(instruction); + + // Adjust accounts. + const userTransferAuthorityIdx = 2; + ix.keys[userTransferAuthorityIdx].pubkey = tokenOwner; + ix.keys[userTransferAuthorityIdx].isSigner = !cpi; + + const sourceMint = ix.keys[7].pubkey; + const destinationMint = ix.keys[8].pubkey; + + const sourceToken = splToken.getAssociatedTokenAddressSync( + sourceMint, + tokenOwner, + true, // allowOwnerOffCurve + ); + ix.keys[3].pubkey = sourceToken; + + const destinationToken = splToken.getAssociatedTokenAddressSync( + destinationMint, + tokenOwner, + true, // allowOwnerOffCurve + ); + ix.keys[6].pubkey = destinationToken; + + // Deserialize to modify args. + const args = decodeSharedAccountsRouteArgs(ix.data) as any; + args.inAmount = inAmount; + args.quotedOutAmount = quotedOutAmount; + args.slippageBps = slippageBps; + + // Serialize again. + ix.data = encodeSharedAccountsRouteArgs(args); + + const minAmountOut = (quotedOutAmount * BigInt(10000 - slippageBps)) / BigInt(10000); + + return { + instruction: ix, + sourceToken, + destinationToken, + sourceMint, + destinationMint, + minAmountOut, + }; +} + +export function eventAuthorityAddress(programId: PublicKey): PublicKey { + return PublicKey.findProgramAddressSync([Buffer.from("__event_authority")], programId)[0]; +} + +export function programAuthorityAddress(authorityId: number) { + return PublicKey.findProgramAddressSync( + [Buffer.from("authority"), Buffer.from([authorityId])], + JUPITER_V6_PROGRAM_ID, + )[0]; +} diff --git a/solana/ts/src/jupiterV6/layouts.ts b/solana/ts/src/jupiterV6/layouts.ts new file mode 100644 index 00000000..5066ed84 --- /dev/null +++ b/solana/ts/src/jupiterV6/layouts.ts @@ -0,0 +1,104 @@ +import { + CustomConversion, + Layout, + LayoutToType, + SwitchLayoutItem, + UintLayoutItem, + deserializeLayout, + serializeLayout, +} from "@wormhole-foundation/sdk-base"; + +export type SharedAccountsRouteArgs = LayoutToType; + +export const decodeSharedAccountsRouteArgs = (data: Buffer | Uint8Array): SharedAccountsRouteArgs => + deserializeLayout(sharedAccountsRouteArgsLayout, Uint8Array.from(data)); + +export const encodeSharedAccountsRouteArgs = (decoded: SharedAccountsRouteArgs): Buffer => + Buffer.from(serializeLayout(sharedAccountsRouteArgsLayout, decoded)); + +const boolItem = { + binary: "uint", + size: 1, + custom: { + to: (encoded: number): boolean => encoded > 0, + from: (val: boolean): number => (val ? 1 : 0), + } satisfies CustomConversion, +} as const satisfies UintLayoutItem; + +const sideItem = { + binary: "switch", + idSize: 1, + layouts: [ + [[0, "Bid"], []], + [[1, "Ask"], []], + ], +} as const satisfies SwitchLayoutItem; + +const swapItem = { + binary: "switch", + idSize: 1, + layouts: [ + [[0, "Saber"], []], + [[1, "SaberAddDecimalsDeposit"], []], + [[2, "SaberAddDecimalsWithdraw"], []], + [[3, "TokenSwap"], []], + [[4, "Sencha"], []], + [[5, "Step"], []], + [[6, "Cropper"], []], + [[7, "Raydium"], []], + [[8, "Crema"], [{ name: "aToB", ...boolItem }]], + [[9, "Lifinity"], []], + [[10, "Mercurial"], []], + [[11, "Cykura"], []], + [[12, "Serum"], [{ name: "side", ...sideItem }]], + [[13, "MarinadeDeposit"], []], + [[14, "MarinadeUnstake"], []], + [[15, "Aldrin"], [{ name: "side", ...sideItem }]], + [[16, "AldrinV2"], [{ name: "side", ...sideItem }]], + [[17, "Whirlpool"], [{ name: "aToB", ...boolItem }]], + [[18, "Invariant"], [{ name: "xToY", ...boolItem }]], + [[19, "Meteora"], []], + [[20, "GooseFX"], []], + [[21, "DeltaFi"], [{ name: "stable", ...boolItem }]], + [[22, "Balansol"], []], + [[23, "MarcoPolo"], [{ name: "xToY", ...boolItem }]], + [[24, "Dradex"], [{ name: "side", ...sideItem }]], + [[25, "LifinityV2"], []], + [[26, "RaydiumClmm"], []], + [[27, "Openbook"], [{ name: "side", ...sideItem }]], + [[28, "Phoenix"], [{ name: "side", ...sideItem }]], + // TODO: add more? + ], +} as const satisfies SwitchLayoutItem; + +const routePlanStep = [ + { name: "swap", ...swapItem }, + { name: "percent", binary: "uint", size: 1 }, + { name: "inputIndex", binary: "uint", size: 1 }, + { name: "outputIndex", binary: "uint", size: 1 }, +] as const satisfies Layout; + +export type AnchorSelector = [number, number, number, number, number, number, number, number]; + +export const selectorItem = (selector: AnchorSelector) => + ({ + name: "prefix", + binary: "bytes", + custom: Uint8Array.from(selector), + }) as const; + +const sharedAccountsRouteArgsLayout = [ + selectorItem([193, 32, 155, 51, 65, 214, 156, 129]), + { name: "id", binary: "uint", size: 1 }, + { + name: "routePlan", + binary: "array", + lengthSize: 4, + lengthEndianness: "little", + layout: routePlanStep, + }, + { name: "inAmount", binary: "uint", size: 8, endianness: "little" }, + { name: "quotedOutAmount", binary: "uint", size: 8, endianness: "little" }, + { name: "slippageBps", binary: "uint", size: 2, endianness: "little" }, + { name: "platformFeeBps", binary: "uint", size: 1 }, +] as const satisfies Layout; diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts new file mode 100644 index 00000000..5b835e43 --- /dev/null +++ b/solana/ts/src/swapLayer/index.ts @@ -0,0 +1,586 @@ +export * from "./messages"; +export * from "./relayerFees"; +export * from "./state"; + +import * as wormholeSdk from "@certusone/wormhole-sdk"; +import { BN, Program } from "@coral-xyz/anchor"; +import * as splToken from "@solana/spl-token"; +import { Connection, PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; +import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; +import IDL from "../../../target/idl/swap_layer.json"; +import { SwapLayer } from "../../../target/types/swap_layer"; +import { Custodian, Peer, RelayParams } from "./state"; + +export const PROGRAM_IDS = ["SwapLayer1111111111111111111111111111111111"] as const; + +export type ProgramId = (typeof PROGRAM_IDS)[number]; + +export type AddPeerArgs = { + chain: wormholeSdk.ChainId; + address: Array; + relayParams: RelayParams; +}; + +export type RelayOptions = { + gasDropoff: number; + maxRelayerFee: BN; +}; + +export type InitiateTransferArgs = { + amountIn: BN; + targetChain: number; + relayOptions: RelayOptions | null; + recipient: Array; +}; + +export type UpdateRelayParametersArgs = { + chain: wormholeSdk.ChainId; + relayParams: RelayParams; +}; + +type CheckedCustodianComposite = { + custodian: PublicKey; +}; + +type RegisteredPeerComposite = { peer: PublicKey }; + +export class SwapLayerProgram { + private _programId: ProgramId; + private _mint: PublicKey; + + program: Program; + + get ID(): PublicKey { + return this.program.programId; + } + + get mint(): PublicKey { + return this._mint; + } + + constructor(connection: Connection, programId: ProgramId, mint: PublicKey) { + this._programId = programId; + this._mint = mint; + this.program = new Program( + { ...(IDL as any), address: this._programId }, + { + connection, + }, + ); + } + + custodianAddress(): PublicKey { + return PublicKey.findProgramAddressSync([Buffer.from("custodian")], this.ID)[0]; + } + + peerAddress(chain: wormholeSdk.ChainId): PublicKey { + return Peer.address(this.ID, chain); + } + + usdcComposite(mint?: PublicKey): { mint: PublicKey } { + return { + mint: mint ?? this.mint, + }; + } + + completeTokenAccountKey(preparedFill: PublicKey) { + return PublicKey.findProgramAddressSync( + [Buffer.from("complete"), preparedFill.toBuffer()], + this.ID, + )[0]; + } + + checkedCustodianComposite(addr?: PublicKey): CheckedCustodianComposite { + return { custodian: addr ?? this.custodianAddress() }; + } + + adminComposite( + ownerOrAssistant: PublicKey, + custodian?: PublicKey, + ): { ownerOrAssistant: PublicKey; custodian: CheckedCustodianComposite } { + return { ownerOrAssistant, custodian: this.checkedCustodianComposite(custodian) }; + } + + adminMutComposite( + ownerOrAssistant: PublicKey, + custodian?: PublicKey, + ): { ownerOrAssistant: PublicKey; custodian: PublicKey } { + return { ownerOrAssistant, custodian: custodian ?? this.custodianAddress() }; + } + + ownerOnlyComposite( + owner: PublicKey, + custodian?: PublicKey, + ): { owner: PublicKey; custodian: CheckedCustodianComposite } { + return { owner, custodian: this.checkedCustodianComposite(custodian) }; + } + + ownerOnlyMutComposite( + owner: PublicKey, + custodian?: PublicKey, + ): { owner: PublicKey; custodian: PublicKey } { + return { owner, custodian: custodian ?? this.custodianAddress() }; + } + + feeUpdaterComposite( + feeUpdater: PublicKey, + custodian?: PublicKey, + ): { feeUpdater: PublicKey; custodian: CheckedCustodianComposite } { + return { feeUpdater, custodian: this.checkedCustodianComposite(custodian) }; + } + + registeredPeerComposite(chain: wormholeSdk.ChainId): RegisteredPeerComposite { + return { peer: this.peerAddress(chain) }; + } + + async consumeSwapLayerFillComposite( + accounts: { + preparedFill: PublicKey; + beneficiary: PublicKey; + associatedPeer?: PublicKey; + }, + opts: { sourceChain?: wormholeSdk.ChainId } = {}, + ): Promise<{ + custodian: CheckedCustodianComposite; + fill: PublicKey; + fillCustodyToken: PublicKey; + associatedPeer: RegisteredPeerComposite; + beneficiary: PublicKey; + tokenRouterProgram: PublicKey; + }> { + const { preparedFill, beneficiary } = accounts; + + let { associatedPeer: peer } = accounts; + let { sourceChain } = opts; + + const tokenRouter = this.tokenRouterProgram(); + if (sourceChain === undefined) { + const { info } = await tokenRouter.fetchPreparedFill(preparedFill); + // @ts-ignore: This is a real chain ID. + sourceChain = info.sourceChain; + } + + peer ??= this.peerAddress(sourceChain); + + return { + custodian: this.checkedCustodianComposite(), + fill: preparedFill, + fillCustodyToken: tokenRouter.preparedCustodyTokenAddress(preparedFill), + associatedPeer: { peer }, + beneficiary, + tokenRouterProgram: tokenRouter.ID, + }; + } + + swapAuthorityAddress(preparedFill: PublicKey): PublicKey { + return PublicKey.findProgramAddressSync( + [Buffer.from("swap-authority"), preparedFill.toBuffer()], + this.ID, + )[0]; + } + + swapComposite(accounts: { + preparedFill: PublicKey; + sourceMint: PublicKey; + destinationMint: PublicKey; + }) { + const { preparedFill, sourceMint, destinationMint } = accounts; + + const authority = this.swapAuthorityAddress(preparedFill); + return { + authority, + srcSwapToken: splToken.getAssociatedTokenAddressSync(sourceMint, authority, true), + dstSwapToken: splToken.getAssociatedTokenAddressSync(destinationMint, authority, true), + }; + } + + async fetchCustodian(input?: { address: PublicKey }): Promise { + const addr = input === undefined ? this.custodianAddress() : input.address; + return this.program.account.custodian.fetch(addr); + } + + async fetchPeer(input: wormholeSdk.ChainId | { address: PublicKey }): Promise { + const addr = + typeof input == "object" && "address" in input + ? input.address + : this.peerAddress(input); + return this.program.account.peer.fetch(addr); + } + + async initializeIx(accounts: { + owner: PublicKey; + ownerAssistant: PublicKey; + feeRecipient: PublicKey; + feeUpdater: PublicKey; + mint?: PublicKey; + }): Promise { + const { owner, ownerAssistant, feeRecipient, feeUpdater, mint } = accounts; + + return this.program.methods + .initialize() + .accounts({ + owner, + custodian: this.custodianAddress(), + ownerAssistant, + feeRecipient, + feeRecipientToken: splToken.getAssociatedTokenAddressSync(this.mint, feeRecipient), + feeUpdater, + usdc: this.usdcComposite(this.mint), + systemProgram: SystemProgram.programId, + }) + .instruction(); + } + + async addPeerIx( + accounts: { + ownerOrAssistant: PublicKey; + payer?: PublicKey; + custodian?: PublicKey; + peer?: PublicKey; + }, + args: AddPeerArgs, + ) { + let { ownerOrAssistant, payer, custodian, peer } = accounts; + payer ??= ownerOrAssistant; + peer ??= this.peerAddress(args.chain); + + return ( + this.program.methods + // @ts-ignore + .addPeer(args) + .accounts({ + payer, + admin: this.adminComposite(ownerOrAssistant, custodian), + peer, + systemProgram: SystemProgram.programId, + }) + .instruction() + ); + } + + async updatePeerIx( + accounts: { + owner: PublicKey; + custodian?: PublicKey; + peer?: PublicKey; + }, + args: AddPeerArgs, + ) { + let { owner, custodian, peer } = accounts; + peer ??= this.peerAddress(args.chain); + + return ( + this.program.methods + // @ts-ignore + .updatePeer(args) + .accounts({ + admin: this.ownerOnlyComposite(owner, custodian), + peer, + }) + .instruction() + ); + } + + async submitOwnershipTransferIx(accounts: { + owner: PublicKey; + newOwner: PublicKey; + custodian?: PublicKey; + }): Promise { + const { owner, newOwner, custodian } = accounts; + return this.program.methods + .submitOwnershipTransferRequest() + .accounts({ + admin: this.ownerOnlyMutComposite(owner, custodian), + newOwner, + }) + .instruction(); + } + + async confirmOwnershipTransferIx(accounts: { + pendingOwner: PublicKey; + custodian?: PublicKey; + }): Promise { + const { pendingOwner } = accounts; + let { custodian } = accounts; + custodian ??= this.custodianAddress(); + return this.program.methods + .confirmOwnershipTransferRequest() + .accounts({ pendingOwner, custodian }) + .instruction(); + } + + async cancelOwnershipTransferIx(accounts: { + owner: PublicKey; + custodian?: PublicKey; + }): Promise { + const { owner, custodian } = accounts; + return this.program.methods + .cancelOwnershipTransferRequest() + .accounts({ + admin: this.ownerOnlyMutComposite(owner, custodian), + }) + .instruction(); + } + + async updateOwnerAssistantIx(accounts: { + owner: PublicKey; + newOwnerAssistant: PublicKey; + custodian?: PublicKey; + }) { + const { owner, newOwnerAssistant, custodian } = accounts; + return this.program.methods + .updateOwnerAssistant() + .accounts({ + admin: this.ownerOnlyMutComposite(owner, custodian), + newOwnerAssistant, + }) + .instruction(); + } + + async updateFeeUpdaterIx(accounts: { + ownerOrAssistant: PublicKey; + newFeeUpdater: PublicKey; + custodian?: PublicKey; + }) { + const { ownerOrAssistant, newFeeUpdater, custodian } = accounts; + return this.program.methods + .updateFeeUpdater() + .accounts({ + admin: this.adminMutComposite(ownerOrAssistant, custodian), + newFeeUpdater, + }) + .instruction(); + } + + async updateRelayParamsIx( + accounts: { feeUpdater: PublicKey; custodian?: PublicKey; peer?: PublicKey }, + args: UpdateRelayParametersArgs, + ) { + let { feeUpdater, custodian, peer } = accounts; + + peer ??= this.peerAddress(args.chain); + + return ( + this.program.methods + // @ts-ignore + .updateRelayParameters(args) + .accounts({ + feeUpdater: this.feeUpdaterComposite(feeUpdater, custodian), + peer, + }) + .instruction() + ); + } + + async updateFeeRecipientIx(accounts: { + ownerOrAssistant: PublicKey; + newFeeRecipient: PublicKey; + custodian?: PublicKey; + }): Promise { + const { ownerOrAssistant, newFeeRecipient, custodian } = accounts; + return this.program.methods + .updateFeeRecipient() + .accounts({ + admin: this.adminMutComposite(ownerOrAssistant, custodian), + newFeeRecipient, + newFeeRecipientToken: splToken.getAssociatedTokenAddressSync( + this.mint, + newFeeRecipient, + ), + }) + .instruction(); + } + + async initiateTransferIx( + accounts: { + payer: PublicKey; + preparedOrder: PublicKey; // Just generate a keypair + payerToken?: PublicKey; + peer?: PublicKey; + }, + args: InitiateTransferArgs, + ) { + let { payer, preparedOrder, payerToken, peer } = accounts; + + payerToken ??= splToken.getAssociatedTokenAddressSync(this.mint, payer); + peer ??= this.peerAddress(args.targetChain as wormholeSdk.ChainId); + + const tokenRouter = this.tokenRouterProgram(); + + return this.program.methods + .initiateTransfer(args) + .accounts({ + payer, + payerToken, + usdc: this.usdcComposite(this.mint), + peer, + tokenRouterCustodian: tokenRouter.custodianAddress(), + preparedOrder, + preparedCustodyToken: tokenRouter.preparedCustodyTokenAddress(preparedOrder), + tokenRouterProgram: tokenRouter.ID, + tokenProgram: splToken.TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }) + .instruction(); + } + + async completeTransferRelayIx( + accounts: { + payer: PublicKey; + preparedFill: PublicKey; + recipient: PublicKey; + peer?: PublicKey; + beneficiary?: PublicKey; + recipientTokenAccount?: PublicKey; + feeRecipientToken?: PublicKey; + }, + sourceChain?: wormholeSdk.ChainId, + ) { + let { + payer, + beneficiary, + preparedFill, + peer, + recipient, + recipientTokenAccount, + feeRecipientToken, + } = accounts; + + beneficiary ??= payer; + recipientTokenAccount ??= splToken.getAssociatedTokenAddressSync(this.mint, recipient); + + // Need the undefined check to satisfy the type checker. + feeRecipientToken ??= await this.fetchCustodian().then((c) => c.feeRecipientToken); + if (feeRecipientToken === undefined) { + throw new Error("fee recipient token account not found"); + } + + const tokenRouter = this.tokenRouterProgram(); + + return this.program.methods + .completeTransferRelay() + .accounts({ + payer, + consumeSwapLayerFill: await this.consumeSwapLayerFillComposite( + { + preparedFill, + beneficiary, + associatedPeer: peer, + }, + { sourceChain }, + ), + completeTokenAccount: this.completeTokenAccountKey(preparedFill), + recipient, + recipientTokenAccount, + usdc: this.usdcComposite(this.mint), + feeRecipientToken, + tokenProgram: splToken.TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }) + .instruction(); + } + + async completeTransferDirectIx( + accounts: { + payer: PublicKey; + preparedFill: PublicKey; + peer?: PublicKey; + recipient?: PublicKey; + beneficiary?: PublicKey; + recipientTokenAccount?: PublicKey; + }, + sourceChain?: wormholeSdk.ChainId, + ) { + let { payer, beneficiary, preparedFill, peer, recipient, recipientTokenAccount } = accounts; + + beneficiary ??= payer; + recipient ??= payer; + recipientTokenAccount ??= splToken.getAssociatedTokenAddressSync(this.mint, recipient); + + const tokenRouter = this.tokenRouterProgram(); + + return this.program.methods + .completeTransferDirect() + .accounts({ + consumeSwapLayerFill: await this.consumeSwapLayerFillComposite( + { + preparedFill, + beneficiary, + associatedPeer: peer, + }, + { sourceChain }, + ), + recipient, + recipientTokenAccount, + tokenProgram: splToken.TOKEN_PROGRAM_ID, + }) + .instruction(); + } + + // async completeSwapDirectIx( + // accounts: { payer: PublicKey; preparedFill: PublicKey; beneficiary?: PublicKey }, + // args: { + // innerIx: TransactionInstruction; + // }, + // ): Promise { + // const { payer, preparedFill } = accounts; + // const { innerIx } = args; + + // let { beneficiary } = accounts; + // beneficiary ??= payer; + + // const swapAuthority = + + // return this.program.methods + // .completeSwap(innerIx.data) + // .accounts({ + // payer: payer, + // consumeSwapLayerFill: await this.consumeSwapLayerFillComposite({ + // preparedFill, + // beneficiary, + // }), + // swapAuthority, + // srcSwapToken: splToken.getAssociatedTokenAddressSync( + // swapLayer.mint, + // swapAuthority, + // true, // allowOwnerOffCurve + // ), + // dstSwapToken: splToken.getAssociatedTokenAddressSync( + // USDT_MINT_ADDRESS, + // swapAuthority, + // true, // allowOwnerOffCurve + // ), + // usdc: swapLayer.usdcComposite(), + // dstMint: USDT_MINT_ADDRESS, + // recipientToken: splToken.getAssociatedTokenAddressSync( + // USDT_MINT_ADDRESS, + // recipient.publicKey, + // ), + // recipient: recipient.publicKey, + // associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, + // tokenProgram: splToken.TOKEN_PROGRAM_ID, + // systemProgram: SystemProgram.programId, + // }) + // .remainingAccounts(innerIx.keys) + // .instruction(); + // } + + tokenRouterProgram(): tokenRouterSdk.TokenRouterProgram { + switch (this._programId) { + case localnet(): { + return new tokenRouterSdk.TokenRouterProgram( + this.program.provider.connection, + tokenRouterSdk.localnet(), + this.mint, + ); + } + default: { + throw new Error("unsupported network"); + } + } + } +} + +export function localnet(): ProgramId { + return "SwapLayer1111111111111111111111111111111111"; +} diff --git a/solana/ts/src/swapLayer/messages/index.ts b/solana/ts/src/swapLayer/messages/index.ts new file mode 100644 index 00000000..b83a7a4d --- /dev/null +++ b/solana/ts/src/swapLayer/messages/index.ts @@ -0,0 +1 @@ +export * from "./layouts"; diff --git a/solana/ts/src/swapLayer/messages/layouts.ts b/solana/ts/src/swapLayer/messages/layouts.ts new file mode 100644 index 00000000..60c36b25 --- /dev/null +++ b/solana/ts/src/swapLayer/messages/layouts.ts @@ -0,0 +1,148 @@ +import { + CustomConversion, + Layout, + LayoutItem, + LayoutToType, + ManualSizePureBytes, + NamedLayoutItem, + UintLayoutItem, + deserializeLayout, + serializeLayout, + zip, +} from "@wormhole-foundation/sdk-base"; +import { layoutItems } from "@wormhole-foundation/sdk-definitions"; +import { EvmAddress } from "@wormhole-foundation/sdk-evm"; + +export type SwapLayerMessage = LayoutToType; +export type OutputToken = LayoutToType; +export type RedeemMode = LayoutToType; +export type SwapType = LayoutToType; +export type JupiterV6SwapParameters = LayoutToType; + +export const decodeSwapLayerMessage = (encoded: Uint8Array): SwapLayerMessage => + deserializeLayout(swapLayerMessageLayout, encoded); + +export const encodeSwapLayerMessage = (message: SwapLayerMessage): Uint8Array => + serializeLayout(swapLayerMessageLayout, message); + +const forceBigIntConversion = { + custom: { + to: (encoded: number) => BigInt(encoded), + from: (val: bigint) => Number(val), + } satisfies CustomConversion, +} as const; + +const boolItem = { + binary: "uint", + size: 1, + custom: { + to: (encoded: number): boolean => encoded > 0, + from: (val: boolean): number => (val ? 1 : 0), + } satisfies CustomConversion, +} as const satisfies UintLayoutItem; + +const evmAddressItem = { + binary: "bytes", + size: 20, + custom: { + to: (encoded: Uint8Array): string => new EvmAddress(encoded).toString(), + from: (addr: string): Uint8Array => new EvmAddress(addr).toUint8Array(), + } satisfies CustomConversion, +} as const satisfies ManualSizePureBytes; + +const timestampItem = { binary: "uint", size: 4 } as const satisfies UintLayoutItem; +const amountItem = { binary: "uint", size: 16 } as const satisfies UintLayoutItem; + +const gasDropoffItem = { + binary: "uint", + size: 4, +} as const satisfies UintLayoutItem; + +const redeemModeItem = { + name: "redeemMode", + binary: "switch", + idSize: 1, + idTag: "mode", + layouts: [ + [[0, "Direct"], []], + [[1, "Payload"], [{ name: "payload", binary: "bytes", lengthSize: 4 }]], + [ + [2, "Relay"], + [ + { name: "gasDropoff", ...gasDropoffItem }, + { name: "relayingFee", binary: "uint", size: 6, ...forceBigIntConversion }, + ], + ], + ], +} as const satisfies NamedLayoutItem; + +const sharedUniswapTraderJoeLayout = [ + { name: "firstPoolId", binary: "uint", size: 3 }, + { + name: "path", + binary: "array", + lengthSize: 1, + layout: [ + { name: "address", ...evmAddressItem }, + { name: "poolId", binary: "uint", size: 3 }, + ], + }, +] as const satisfies Layout; + +const jupiterV6SwapParametersLayout = [ + { + name: "dexProgramId", + binary: "switch", + idSize: 1, + idTag: "isSome", + layouts: [ + [[0, false], []], + [[1, true], [{ name: "address", ...layoutItems.universalAddressItem }]], + ], + }, +] as const satisfies Layout; + +const [swapTypes, swapItemLayouts] = [ + [ + [1, "UniswapV3"], + [2, "TraderJoe"], + [16, "JupiterV6"], + ], + [sharedUniswapTraderJoeLayout, sharedUniswapTraderJoeLayout, jupiterV6SwapParametersLayout], +] as const; + +const swapItem = { + name: "swap", + binary: "bytes", + layout: [ + { name: "deadline", ...timestampItem }, + { name: "limitAmount", ...amountItem }, + { name: "type", binary: "switch", idSize: 1, layouts: zip([swapTypes, swapItemLayouts]) }, + ], +} as const satisfies NamedLayoutItem; + +const [ioTokenTypes, outputTokenLayouts] = [ + [ + [0, "Usdc"], + [1, "Gas"], + [2, "Other"], + ], + [[], [swapItem], [{ name: "address", ...layoutItems.universalAddressItem }, swapItem]], +] as const; + +const outputTokenItem = { + name: "outputToken", + binary: "switch", + idSize: 1, + idTag: "type", + layouts: zip([ioTokenTypes, outputTokenLayouts]), +} as const satisfies NamedLayoutItem; + +// ---- message layout ---- + +const swapLayerMessageLayout = [ + { name: "version", binary: "uint", size: 1, custom: 1, omit: true }, + { name: "recipient", ...layoutItems.universalAddressItem }, + redeemModeItem, + outputTokenItem, +] as const satisfies Layout; diff --git a/solana/ts/src/swapLayer/relayerFees.ts b/solana/ts/src/swapLayer/relayerFees.ts new file mode 100644 index 00000000..bc38606e --- /dev/null +++ b/solana/ts/src/swapLayer/relayerFees.ts @@ -0,0 +1,126 @@ +import { RelayParams } from "."; + +// Gas overheads for EVM. +const EVM_GAS_OVERHEAD = 100_000n; +const DROPOFF_GAS_OVERHEAD = 10_000n; +const UNISWAP_GAS_OVERHEAD = 100_000n; +const UNISWAP_GAS_PER_SWAP = 100_000n; +const TRADERJOE_GAS_OVERHEAD = 100_000n; +const TRADERJOE_GAS_PER_SWAP = 100_000n; +const ONE_ETHER = 1_000_000_000_000_000_000n; + +// Solana specific constants. +const ONE_SOL = 1_000_000_000n; +const GAS_PRICE_SCALAR = 1_000_000n; +const GAS_DROPOFF_SCALAR = 1_000n; + +export const U32_MAX = 4294967295; +const MAX_BPS = 1_000_000n; + +// TODO: Need to implement serde for the following types. For now, we will use a dummy +// type to represent the swap type. +export type DestinationSwapType = { + none?: {}; + uniswapV3?: {}; + traderJoe?: {}; + jupiterV6?: {}; +}; + +export function denormalizeGasDropOff(gasDropOff: number): bigint { + return BigInt(gasDropOff) * GAS_DROPOFF_SCALAR; +} + +export function denormalizeGasPrice(gasPrice: number): bigint { + return BigInt(gasPrice) * GAS_PRICE_SCALAR; +} + +function compound(percentage: number, base: bigint): bigint { + if (percentage == 0) { + return base; + } else { + return base + (base * BigInt(percentage)) / MAX_BPS; + } +} + +function calculateEvmSwapOverhead(swapType: DestinationSwapType, swapCount: number): bigint { + switch (swapType) { + case { none: {} }: + return 0n; + case { uniswapV3: {} }: + return UNISWAP_GAS_OVERHEAD + UNISWAP_GAS_PER_SWAP * BigInt(swapCount); + case { traderJoe: {} }: + return TRADERJOE_GAS_OVERHEAD + TRADERJOE_GAS_PER_SWAP * BigInt(swapCount); + default: + throw Error("Unsupported swap type"); + } +} + +function calculateEvmGasCost( + gasPrice: number, + gasPriceMargin: number, + totalGas: bigint, + nativeTokenPrice: bigint, +): bigint { + return compound( + gasPriceMargin, + (totalGas * denormalizeGasPrice(gasPrice) * nativeTokenPrice) / ONE_ETHER, + ); +} + +function calculateGasDropoffCost( + denormGasDropoff: bigint, + gasDropoffMargin: number, + nativeTokenPrice: bigint, +): bigint { + return compound(gasDropoffMargin, (denormGasDropoff * nativeTokenPrice) / ONE_SOL); +} + +export function calculateRelayerFee( + relayParams: RelayParams, + denormGasDropOff: bigint, + swapType: DestinationSwapType, + swapCount: number, +) { + if (relayParams.baseFee === U32_MAX) { + throw Error("Relaying Disabled"); + } + + let relayerFee = BigInt(relayParams.baseFee); + + if (denormGasDropOff > 0) { + if (denormGasDropOff > denormalizeGasDropOff(relayParams.maxGasDropoff)) { + throw Error("Gas Dropoff too high"); + } + + relayerFee += calculateGasDropoffCost( + denormGasDropOff, + relayParams.gasDropoffMargin, + BigInt(relayParams.nativeTokenPrice.toString()), + ); + } + + // Compute the relayer fee based on the cost of the relay in the + // target execution environment's gas units (convert to USDC). + if (relayParams.executionParams.evm) { + let totalGas = EVM_GAS_OVERHEAD; + + if (denormGasDropOff > 0) { + totalGas += DROPOFF_GAS_OVERHEAD; + } + + if (swapCount > 0) { + totalGas += calculateEvmSwapOverhead(swapType, swapCount); + } + + relayerFee += calculateEvmGasCost( + relayParams.executionParams.evm.gasPrice, + relayParams.executionParams.evm.gasPriceMargin, + totalGas, + BigInt(relayParams.nativeTokenPrice.toString()), + ); + } else { + throw Error("Unsupported execution environment"); + } + + return relayerFee; +} diff --git a/solana/ts/src/swapLayer/state/Custodian.ts b/solana/ts/src/swapLayer/state/Custodian.ts new file mode 100644 index 00000000..5179b3be --- /dev/null +++ b/solana/ts/src/swapLayer/state/Custodian.ts @@ -0,0 +1,23 @@ +import { PublicKey } from "@solana/web3.js"; + +export class Custodian { + owner: PublicKey; + pendingOwner: PublicKey | null; + ownerAssistant: PublicKey; + feeRecipientToken: PublicKey; + feeUpdater: PublicKey; + + constructor( + owner: PublicKey, + pendingOwner: PublicKey | null, + ownerAssistant: PublicKey, + feeRecipientToken: PublicKey, + feeUpdater: PublicKey, + ) { + this.owner = owner; + this.pendingOwner = pendingOwner; + this.ownerAssistant = ownerAssistant; + this.feeRecipientToken = feeRecipientToken; + this.feeUpdater = feeUpdater; + } +} diff --git a/solana/ts/src/swapLayer/state/Peer.ts b/solana/ts/src/swapLayer/state/Peer.ts new file mode 100644 index 00000000..9eeb97b4 --- /dev/null +++ b/solana/ts/src/swapLayer/state/Peer.ts @@ -0,0 +1,36 @@ +import { PublicKey } from "@solana/web3.js"; +import { BN } from "@coral-xyz/anchor"; + +export type ExecutionParams = { + none?: {}; + evm?: { + gasPrice: number; + gasPriceMargin: number; + }; +}; + +export type RelayParams = { + baseFee: number; + nativeTokenPrice: BN; + maxGasDropoff: number; + gasDropoffMargin: number; + executionParams: ExecutionParams; +}; + +export class Peer { + chain: number; + address: Array; + relayParams: RelayParams; + + constructor(chain: number, address: Array, relayParams: RelayParams) { + this.chain = chain; + this.address = address; + this.relayParams = relayParams; + } + + static address(programId: PublicKey, chain: number) { + const encodedChain = Buffer.alloc(2); + encodedChain.writeUInt16BE(chain); + return PublicKey.findProgramAddressSync([Buffer.from("peer"), encodedChain], programId)[0]; + } +} diff --git a/solana/ts/src/swapLayer/state/index.ts b/solana/ts/src/swapLayer/state/index.ts new file mode 100644 index 00000000..fabef4d3 --- /dev/null +++ b/solana/ts/src/swapLayer/state/index.ts @@ -0,0 +1,2 @@ +export * from "./Custodian"; +export * from "./Peer"; diff --git a/solana/ts/src/swapLayer/utils.ts b/solana/ts/src/swapLayer/utils.ts new file mode 100644 index 00000000..cc0fb1b3 --- /dev/null +++ b/solana/ts/src/swapLayer/utils.ts @@ -0,0 +1,12 @@ +import { PublicKey } from "@solana/web3.js"; + +export const BPF_LOADER_UPGRADEABLE_PROGRAM_ID = new PublicKey( + "BPFLoaderUpgradeab1e11111111111111111111111", +); + +export function programDataAddress(programId: PublicKey) { + return PublicKey.findProgramAddressSync( + [programId.toBuffer()], + BPF_LOADER_UPGRADEABLE_PROGRAM_ID, + )[0]; +} diff --git a/solana/ts/src/types/whirlpool.ts b/solana/ts/src/types/whirlpool.ts new file mode 100644 index 00000000..a9b1ef5b --- /dev/null +++ b/solana/ts/src/types/whirlpool.ts @@ -0,0 +1,5019 @@ +export type Whirlpool = { + version: "0.2.0"; + name: "whirlpool"; + instructions: [ + { + name: "initializeConfig"; + docs: [ + "Initializes a WhirlpoolsConfig account that hosts info & authorities", + "required to govern a set of Whirlpools.", + "", + "### Parameters", + "- `fee_authority` - Authority authorized to initialize fee-tiers and set customs fees.", + "- `collect_protocol_fees_authority` - Authority authorized to collect protocol fees.", + "- `reward_emissions_super_authority` - Authority authorized to set reward authorities in pools.", + ]; + accounts: [ + { + name: "config"; + isMut: true; + isSigner: true; + }, + { + name: "funder"; + isMut: true; + isSigner: true; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "feeAuthority"; + type: "publicKey"; + }, + { + name: "collectProtocolFeesAuthority"; + type: "publicKey"; + }, + { + name: "rewardEmissionsSuperAuthority"; + type: "publicKey"; + }, + { + name: "defaultProtocolFeeRate"; + type: "u16"; + }, + ]; + }, + { + name: "initializePool"; + docs: [ + "Initializes a Whirlpool account.", + "Fee rate is set to the default values on the config and supplied fee_tier.", + "", + "### Parameters", + "- `bumps` - The bump value when deriving the PDA of the Whirlpool address.", + "- `tick_spacing` - The desired tick spacing for this pool.", + "- `initial_sqrt_price` - The desired initial sqrt-price for this pool", + "", + "#### Special Errors", + "`InvalidTokenMintOrder` - The order of mints have to be ordered by", + "`SqrtPriceOutOfBounds` - provided initial_sqrt_price is not between 2^-64 to 2^64", + "", + ]; + accounts: [ + { + name: "whirlpoolsConfig"; + isMut: false; + isSigner: false; + }, + { + name: "tokenMintA"; + isMut: false; + isSigner: false; + }, + { + name: "tokenMintB"; + isMut: false; + isSigner: false; + }, + { + name: "funder"; + isMut: true; + isSigner: true; + }, + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultA"; + isMut: true; + isSigner: true; + }, + { + name: "tokenVaultB"; + isMut: true; + isSigner: true; + }, + { + name: "feeTier"; + isMut: false; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "bumps"; + type: { + defined: "WhirlpoolBumps"; + }; + }, + { + name: "tickSpacing"; + type: "u16"; + }, + { + name: "initialSqrtPrice"; + type: "u128"; + }, + ]; + }, + { + name: "initializeTickArray"; + docs: [ + "Initializes a tick_array account to represent a tick-range in a Whirlpool.", + "", + "### Parameters", + "- `start_tick_index` - The starting tick index for this tick-array.", + "Has to be a multiple of TickArray size & the tick spacing of this pool.", + "", + "#### Special Errors", + "- `InvalidStartTick` - if the provided start tick is out of bounds or is not a multiple of", + "TICK_ARRAY_SIZE * tick spacing.", + ]; + accounts: [ + { + name: "whirlpool"; + isMut: false; + isSigner: false; + }, + { + name: "funder"; + isMut: true; + isSigner: true; + }, + { + name: "tickArray"; + isMut: true; + isSigner: false; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "startTickIndex"; + type: "i32"; + }, + ]; + }, + { + name: "initializeFeeTier"; + docs: [ + "Initializes a fee_tier account usable by Whirlpools in a WhirlpoolConfig space.", + "", + "### Authority", + '- "fee_authority" - Set authority in the WhirlpoolConfig', + "", + "### Parameters", + "- `tick_spacing` - The tick-spacing that this fee-tier suggests the default_fee_rate for.", + "- `default_fee_rate` - The default fee rate that a pool will use if the pool uses this", + "fee tier during initialization.", + "", + "#### Special Errors", + "- `FeeRateMaxExceeded` - If the provided default_fee_rate exceeds MAX_FEE_RATE.", + ]; + accounts: [ + { + name: "config"; + isMut: false; + isSigner: false; + }, + { + name: "feeTier"; + isMut: true; + isSigner: false; + }, + { + name: "funder"; + isMut: true; + isSigner: true; + }, + { + name: "feeAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "tickSpacing"; + type: "u16"; + }, + { + name: "defaultFeeRate"; + type: "u16"; + }, + ]; + }, + { + name: "initializeReward"; + docs: [ + "Initialize reward for a Whirlpool. A pool can only support up to a set number of rewards.", + "", + "### Authority", + '- "reward_authority" - assigned authority by the reward_super_authority for the specified', + "reward-index in this Whirlpool", + "", + "### Parameters", + "- `reward_index` - The reward index that we'd like to initialize. (0 <= index <= NUM_REWARDS)", + "", + "#### Special Errors", + "- `InvalidRewardIndex` - If the provided reward index doesn't match the lowest uninitialized", + "index in this pool, or exceeds NUM_REWARDS, or", + "all reward slots for this pool has been initialized.", + ]; + accounts: [ + { + name: "rewardAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "funder"; + isMut: true; + isSigner: true; + }, + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "rewardMint"; + isMut: false; + isSigner: false; + }, + { + name: "rewardVault"; + isMut: true; + isSigner: true; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "rewardIndex"; + type: "u8"; + }, + ]; + }, + { + name: "setRewardEmissions"; + docs: [ + "Set the reward emissions for a reward in a Whirlpool.", + "", + "### Authority", + '- "reward_authority" - assigned authority by the reward_super_authority for the specified', + "reward-index in this Whirlpool", + "", + "### Parameters", + "- `reward_index` - The reward index (0 <= index <= NUM_REWARDS) that we'd like to modify.", + "- `emissions_per_second_x64` - The amount of rewards emitted in this pool.", + "", + "#### Special Errors", + "- `RewardVaultAmountInsufficient` - The amount of rewards in the reward vault cannot emit", + "more than a day of desired emissions.", + "- `InvalidTimestamp` - Provided timestamp is not in order with the previous timestamp.", + "- `InvalidRewardIndex` - If the provided reward index doesn't match the lowest uninitialized", + "index in this pool, or exceeds NUM_REWARDS, or", + "all reward slots for this pool has been initialized.", + ]; + accounts: [ + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "rewardAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "rewardVault"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "rewardIndex"; + type: "u8"; + }, + { + name: "emissionsPerSecondX64"; + type: "u128"; + }, + ]; + }, + { + name: "openPosition"; + docs: [ + "Open a position in a Whirlpool. A unique token will be minted to represent the position", + "in the users wallet. The position will start off with 0 liquidity.", + "", + "### Parameters", + "- `tick_lower_index` - The tick specifying the lower end of the position range.", + "- `tick_upper_index` - The tick specifying the upper end of the position range.", + "", + "#### Special Errors", + "- `InvalidTickIndex` - If a provided tick is out of bounds, out of order or not a multiple of", + "the tick-spacing in this pool.", + ]; + accounts: [ + { + name: "funder"; + isMut: true; + isSigner: true; + }, + { + name: "owner"; + isMut: false; + isSigner: false; + }, + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "positionMint"; + isMut: true; + isSigner: true; + }, + { + name: "positionTokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "whirlpool"; + isMut: false; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + }, + { + name: "associatedTokenProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "bumps"; + type: { + defined: "OpenPositionBumps"; + }; + }, + { + name: "tickLowerIndex"; + type: "i32"; + }, + { + name: "tickUpperIndex"; + type: "i32"; + }, + ]; + }, + { + name: "openPositionWithMetadata"; + docs: [ + "Open a position in a Whirlpool. A unique token will be minted to represent the position", + "in the users wallet. Additional Metaplex metadata is appended to identify the token.", + "The position will start off with 0 liquidity.", + "", + "### Parameters", + "- `tick_lower_index` - The tick specifying the lower end of the position range.", + "- `tick_upper_index` - The tick specifying the upper end of the position range.", + "", + "#### Special Errors", + "- `InvalidTickIndex` - If a provided tick is out of bounds, out of order or not a multiple of", + "the tick-spacing in this pool.", + ]; + accounts: [ + { + name: "funder"; + isMut: true; + isSigner: true; + }, + { + name: "owner"; + isMut: false; + isSigner: false; + }, + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "positionMint"; + isMut: true; + isSigner: true; + }, + { + name: "positionMetadataAccount"; + isMut: true; + isSigner: false; + docs: [ + "https://github.com/metaplex-foundation/metaplex-program-library/blob/master/token-metadata/program/src/utils.rs#L873", + ]; + }, + { + name: "positionTokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "whirlpool"; + isMut: false; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + }, + { + name: "associatedTokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "metadataProgram"; + isMut: false; + isSigner: false; + }, + { + name: "metadataUpdateAuth"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "bumps"; + type: { + defined: "OpenPositionWithMetadataBumps"; + }; + }, + { + name: "tickLowerIndex"; + type: "i32"; + }, + { + name: "tickUpperIndex"; + type: "i32"; + }, + ]; + }, + { + name: "increaseLiquidity"; + docs: [ + "Add liquidity to a position in the Whirlpool. This call also updates the position's accrued fees and rewards.", + "", + "### Authority", + "- `position_authority` - authority that owns the token corresponding to this desired position.", + "", + "### Parameters", + "- `liquidity_amount` - The total amount of Liquidity the user is willing to deposit.", + "- `token_max_a` - The maximum amount of tokenA the user is willing to deposit.", + "- `token_max_b` - The maximum amount of tokenB the user is willing to deposit.", + "", + "#### Special Errors", + "- `LiquidityZero` - Provided liquidity amount is zero.", + "- `LiquidityTooHigh` - Provided liquidity exceeds u128::max.", + "- `TokenMaxExceeded` - The required token to perform this operation exceeds the user defined amount.", + ]; + accounts: [ + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "positionAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "positionTokenAccount"; + isMut: false; + isSigner: false; + }, + { + name: "tokenOwnerAccountA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenOwnerAccountB"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultB"; + isMut: true; + isSigner: false; + }, + { + name: "tickArrayLower"; + isMut: true; + isSigner: false; + }, + { + name: "tickArrayUpper"; + isMut: true; + isSigner: false; + }, + ]; + args: [ + { + name: "liquidityAmount"; + type: "u128"; + }, + { + name: "tokenMaxA"; + type: "u64"; + }, + { + name: "tokenMaxB"; + type: "u64"; + }, + ]; + }, + { + name: "decreaseLiquidity"; + docs: [ + "Withdraw liquidity from a position in the Whirlpool. This call also updates the position's accrued fees and rewards.", + "", + "### Authority", + "- `position_authority` - authority that owns the token corresponding to this desired position.", + "", + "### Parameters", + "- `liquidity_amount` - The total amount of Liquidity the user desires to withdraw.", + "- `token_min_a` - The minimum amount of tokenA the user is willing to withdraw.", + "- `token_min_b` - The minimum amount of tokenB the user is willing to withdraw.", + "", + "#### Special Errors", + "- `LiquidityZero` - Provided liquidity amount is zero.", + "- `LiquidityTooHigh` - Provided liquidity exceeds u128::max.", + "- `TokenMinSubceeded` - The required token to perform this operation subceeds the user defined amount.", + ]; + accounts: [ + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "positionAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "positionTokenAccount"; + isMut: false; + isSigner: false; + }, + { + name: "tokenOwnerAccountA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenOwnerAccountB"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultB"; + isMut: true; + isSigner: false; + }, + { + name: "tickArrayLower"; + isMut: true; + isSigner: false; + }, + { + name: "tickArrayUpper"; + isMut: true; + isSigner: false; + }, + ]; + args: [ + { + name: "liquidityAmount"; + type: "u128"; + }, + { + name: "tokenMinA"; + type: "u64"; + }, + { + name: "tokenMinB"; + type: "u64"; + }, + ]; + }, + { + name: "updateFeesAndRewards"; + docs: [ + "Update the accrued fees and rewards for a position.", + "", + "#### Special Errors", + "- `TickNotFound` - Provided tick array account does not contain the tick for this position.", + "- `LiquidityZero` - Position has zero liquidity and therefore already has the most updated fees and reward values.", + ]; + accounts: [ + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "tickArrayLower"; + isMut: false; + isSigner: false; + }, + { + name: "tickArrayUpper"; + isMut: false; + isSigner: false; + }, + ]; + args: []; + }, + { + name: "collectFees"; + docs: [ + "Collect fees accrued for this position.", + "", + "### Authority", + "- `position_authority` - authority that owns the token corresponding to this desired position.", + ]; + accounts: [ + { + name: "whirlpool"; + isMut: false; + isSigner: false; + }, + { + name: "positionAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "positionTokenAccount"; + isMut: false; + isSigner: false; + }, + { + name: "tokenOwnerAccountA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenOwnerAccountB"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultB"; + isMut: true; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: []; + }, + { + name: "collectReward"; + docs: [ + "Collect rewards accrued for this position.", + "", + "### Authority", + "- `position_authority` - authority that owns the token corresponding to this desired position.", + ]; + accounts: [ + { + name: "whirlpool"; + isMut: false; + isSigner: false; + }, + { + name: "positionAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "positionTokenAccount"; + isMut: false; + isSigner: false; + }, + { + name: "rewardOwnerAccount"; + isMut: true; + isSigner: false; + }, + { + name: "rewardVault"; + isMut: true; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "rewardIndex"; + type: "u8"; + }, + ]; + }, + { + name: "collectProtocolFees"; + docs: [ + "Collect the protocol fees accrued in this Whirlpool", + "", + "### Authority", + "- `collect_protocol_fees_authority` - assigned authority in the WhirlpoolConfig that can collect protocol fees", + ]; + accounts: [ + { + name: "whirlpoolsConfig"; + isMut: false; + isSigner: false; + }, + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "collectProtocolFeesAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "tokenVaultA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultB"; + isMut: true; + isSigner: false; + }, + { + name: "tokenDestinationA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenDestinationB"; + isMut: true; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: []; + }, + { + name: "swap"; + docs: [ + "Perform a swap in this Whirlpool", + "", + "### Authority", + '- "token_authority" - The authority to withdraw tokens from the input token account.', + "", + "### Parameters", + "- `amount` - The amount of input or output token to swap from (depending on amount_specified_is_input).", + "- `other_amount_threshold` - The maximum/minimum of input/output token to swap into (depending on amount_specified_is_input).", + "- `sqrt_price_limit` - The maximum/minimum price the swap will swap to.", + "- `amount_specified_is_input` - Specifies the token the parameter `amount`represents. If true, the amount represents the input token of the swap.", + "- `a_to_b` - The direction of the swap. True if swapping from A to B. False if swapping from B to A.", + "", + "#### Special Errors", + "- `ZeroTradableAmount` - User provided parameter `amount` is 0.", + "- `InvalidSqrtPriceLimitDirection` - User provided parameter `sqrt_price_limit` does not match the direction of the trade.", + "- `SqrtPriceOutOfBounds` - User provided parameter `sqrt_price_limit` is over Whirlppool's max/min bounds for sqrt-price.", + "- `InvalidTickArraySequence` - User provided tick-arrays are not in sequential order required to proceed in this trade direction.", + "- `TickArraySequenceInvalidIndex` - The swap loop attempted to access an invalid array index during the query of the next initialized tick.", + "- `TickArrayIndexOutofBounds` - The swap loop attempted to access an invalid array index during tick crossing.", + "- `LiquidityOverflow` - Liquidity value overflowed 128bits during tick crossing.", + "- `InvalidTickSpacing` - The swap pool was initialized with tick-spacing of 0.", + ]; + accounts: [ + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "tokenAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "tokenOwnerAccountA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenOwnerAccountB"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultB"; + isMut: true; + isSigner: false; + }, + { + name: "tickArray0"; + isMut: true; + isSigner: false; + }, + { + name: "tickArray1"; + isMut: true; + isSigner: false; + }, + { + name: "tickArray2"; + isMut: true; + isSigner: false; + }, + { + name: "oracle"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "amount"; + type: "u64"; + }, + { + name: "otherAmountThreshold"; + type: "u64"; + }, + { + name: "sqrtPriceLimit"; + type: "u128"; + }, + { + name: "amountSpecifiedIsInput"; + type: "bool"; + }, + { + name: "aToB"; + type: "bool"; + }, + ]; + }, + { + name: "closePosition"; + docs: [ + "Close a position in a Whirlpool. Burns the position token in the owner's wallet.", + "", + "### Authority", + '- "position_authority" - The authority that owns the position token.', + "", + "#### Special Errors", + "- `ClosePositionNotEmpty` - The provided position account is not empty.", + ]; + accounts: [ + { + name: "positionAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "receiver"; + isMut: true; + isSigner: false; + }, + { + name: "position"; + isMut: true; + isSigner: false; + }, + { + name: "positionMint"; + isMut: true; + isSigner: false; + }, + { + name: "positionTokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: []; + }, + { + name: "setDefaultFeeRate"; + docs: [ + "Set the default_fee_rate for a FeeTier", + "Only the current fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority in the WhirlpoolConfig', + "", + "### Parameters", + "- `default_fee_rate` - The default fee rate that a pool will use if the pool uses this", + "fee tier during initialization.", + "", + "#### Special Errors", + "- `FeeRateMaxExceeded` - If the provided default_fee_rate exceeds MAX_FEE_RATE.", + ]; + accounts: [ + { + name: "whirlpoolsConfig"; + isMut: false; + isSigner: false; + }, + { + name: "feeTier"; + isMut: true; + isSigner: false; + }, + { + name: "feeAuthority"; + isMut: false; + isSigner: true; + }, + ]; + args: [ + { + name: "defaultFeeRate"; + type: "u16"; + }, + ]; + }, + { + name: "setDefaultProtocolFeeRate"; + docs: [ + "Sets the default protocol fee rate for a WhirlpoolConfig", + "Protocol fee rate is represented as a basis point.", + "Only the current fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority that can modify pool fees in the WhirlpoolConfig', + "", + "### Parameters", + "- `default_protocol_fee_rate` - Rate that is referenced during the initialization of a Whirlpool using this config.", + "", + "#### Special Errors", + "- `ProtocolFeeRateMaxExceeded` - If the provided default_protocol_fee_rate exceeds MAX_PROTOCOL_FEE_RATE.", + ]; + accounts: [ + { + name: "whirlpoolsConfig"; + isMut: true; + isSigner: false; + }, + { + name: "feeAuthority"; + isMut: false; + isSigner: true; + }, + ]; + args: [ + { + name: "defaultProtocolFeeRate"; + type: "u16"; + }, + ]; + }, + { + name: "setFeeRate"; + docs: [ + "Sets the fee rate for a Whirlpool.", + "Fee rate is represented as hundredths of a basis point.", + "Only the current fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority that can modify pool fees in the WhirlpoolConfig', + "", + "### Parameters", + "- `fee_rate` - The rate that the pool will use to calculate fees going onwards.", + "", + "#### Special Errors", + "- `FeeRateMaxExceeded` - If the provided fee_rate exceeds MAX_FEE_RATE.", + ]; + accounts: [ + { + name: "whirlpoolsConfig"; + isMut: false; + isSigner: false; + }, + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "feeAuthority"; + isMut: false; + isSigner: true; + }, + ]; + args: [ + { + name: "feeRate"; + type: "u16"; + }, + ]; + }, + { + name: "setProtocolFeeRate"; + docs: [ + "Sets the protocol fee rate for a Whirlpool.", + "Protocol fee rate is represented as a basis point.", + "Only the current fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority that can modify pool fees in the WhirlpoolConfig', + "", + "### Parameters", + "- `protocol_fee_rate` - The rate that the pool will use to calculate protocol fees going onwards.", + "", + "#### Special Errors", + "- `ProtocolFeeRateMaxExceeded` - If the provided default_protocol_fee_rate exceeds MAX_PROTOCOL_FEE_RATE.", + ]; + accounts: [ + { + name: "whirlpoolsConfig"; + isMut: false; + isSigner: false; + }, + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "feeAuthority"; + isMut: false; + isSigner: true; + }, + ]; + args: [ + { + name: "protocolFeeRate"; + type: "u16"; + }, + ]; + }, + { + name: "setFeeAuthority"; + docs: [ + "Sets the fee authority for a WhirlpoolConfig.", + "The fee authority can set the fee & protocol fee rate for individual pools or", + "set the default fee rate for newly minted pools.", + "Only the current fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority that can modify pool fees in the WhirlpoolConfig', + ]; + accounts: [ + { + name: "whirlpoolsConfig"; + isMut: true; + isSigner: false; + }, + { + name: "feeAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "newFeeAuthority"; + isMut: false; + isSigner: false; + }, + ]; + args: []; + }, + { + name: "setCollectProtocolFeesAuthority"; + docs: [ + "Sets the fee authority to collect protocol fees for a WhirlpoolConfig.", + "Only the current collect protocol fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority that can collect protocol fees in the WhirlpoolConfig', + ]; + accounts: [ + { + name: "whirlpoolsConfig"; + isMut: true; + isSigner: false; + }, + { + name: "collectProtocolFeesAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "newCollectProtocolFeesAuthority"; + isMut: false; + isSigner: false; + }, + ]; + args: []; + }, + { + name: "setRewardAuthority"; + docs: [ + "Set the whirlpool reward authority at the provided `reward_index`.", + "Only the current reward authority for this reward index has permission to invoke this instruction.", + "", + "### Authority", + '- "reward_authority" - Set authority that can control reward emission for this particular reward.', + "", + "#### Special Errors", + "- `InvalidRewardIndex` - If the provided reward index doesn't match the lowest uninitialized", + "index in this pool, or exceeds NUM_REWARDS, or", + "all reward slots for this pool has been initialized.", + ]; + accounts: [ + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "rewardAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "newRewardAuthority"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "rewardIndex"; + type: "u8"; + }, + ]; + }, + { + name: "setRewardAuthorityBySuperAuthority"; + docs: [ + "Set the whirlpool reward authority at the provided `reward_index`.", + "Only the current reward super authority has permission to invoke this instruction.", + "", + "### Authority", + '- "reward_authority" - Set authority that can control reward emission for this particular reward.', + "", + "#### Special Errors", + "- `InvalidRewardIndex` - If the provided reward index doesn't match the lowest uninitialized", + "index in this pool, or exceeds NUM_REWARDS, or", + "all reward slots for this pool has been initialized.", + ]; + accounts: [ + { + name: "whirlpoolsConfig"; + isMut: false; + isSigner: false; + }, + { + name: "whirlpool"; + isMut: true; + isSigner: false; + }, + { + name: "rewardEmissionsSuperAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "newRewardAuthority"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "rewardIndex"; + type: "u8"; + }, + ]; + }, + { + name: "setRewardEmissionsSuperAuthority"; + docs: [ + "Set the whirlpool reward super authority for a WhirlpoolConfig", + "Only the current reward super authority has permission to invoke this instruction.", + "This instruction will not change the authority on any `WhirlpoolRewardInfo` whirlpool rewards.", + "", + "### Authority", + '- "reward_emissions_super_authority" - Set authority that can control reward authorities for all pools in this config space.', + ]; + accounts: [ + { + name: "whirlpoolsConfig"; + isMut: true; + isSigner: false; + }, + { + name: "rewardEmissionsSuperAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "newRewardEmissionsSuperAuthority"; + isMut: false; + isSigner: false; + }, + ]; + args: []; + }, + { + name: "twoHopSwap"; + docs: [ + "Perform a two-hop swap in this Whirlpool", + "", + "### Authority", + '- "token_authority" - The authority to withdraw tokens from the input token account.', + "", + "### Parameters", + "- `amount` - The amount of input or output token to swap from (depending on amount_specified_is_input).", + "- `other_amount_threshold` - The maximum/minimum of input/output token to swap into (depending on amount_specified_is_input).", + "- `amount_specified_is_input` - Specifies the token the parameter `amount`represents. If true, the amount represents the input token of the swap.", + "- `a_to_b_one` - The direction of the swap of hop one. True if swapping from A to B. False if swapping from B to A.", + "- `a_to_b_two` - The direction of the swap of hop two. True if swapping from A to B. False if swapping from B to A.", + "- `sqrt_price_limit_one` - The maximum/minimum price the swap will swap to in the first hop.", + "- `sqrt_price_limit_two` - The maximum/minimum price the swap will swap to in the second hop.", + "", + "#### Special Errors", + "- `ZeroTradableAmount` - User provided parameter `amount` is 0.", + "- `InvalidSqrtPriceLimitDirection` - User provided parameter `sqrt_price_limit` does not match the direction of the trade.", + "- `SqrtPriceOutOfBounds` - User provided parameter `sqrt_price_limit` is over Whirlppool's max/min bounds for sqrt-price.", + "- `InvalidTickArraySequence` - User provided tick-arrays are not in sequential order required to proceed in this trade direction.", + "- `TickArraySequenceInvalidIndex` - The swap loop attempted to access an invalid array index during the query of the next initialized tick.", + "- `TickArrayIndexOutofBounds` - The swap loop attempted to access an invalid array index during tick crossing.", + "- `LiquidityOverflow` - Liquidity value overflowed 128bits during tick crossing.", + "- `InvalidTickSpacing` - The swap pool was initialized with tick-spacing of 0.", + "- `InvalidIntermediaryMint` - Error if the intermediary mint between hop one and two do not equal.", + "- `DuplicateTwoHopPool` - Error if whirlpool one & two are the same pool.", + ]; + accounts: [ + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "tokenAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "whirlpoolOne"; + isMut: true; + isSigner: false; + }, + { + name: "whirlpoolTwo"; + isMut: true; + isSigner: false; + }, + { + name: "tokenOwnerAccountOneA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultOneA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenOwnerAccountOneB"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultOneB"; + isMut: true; + isSigner: false; + }, + { + name: "tokenOwnerAccountTwoA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultTwoA"; + isMut: true; + isSigner: false; + }, + { + name: "tokenOwnerAccountTwoB"; + isMut: true; + isSigner: false; + }, + { + name: "tokenVaultTwoB"; + isMut: true; + isSigner: false; + }, + { + name: "tickArrayOne0"; + isMut: true; + isSigner: false; + }, + { + name: "tickArrayOne1"; + isMut: true; + isSigner: false; + }, + { + name: "tickArrayOne2"; + isMut: true; + isSigner: false; + }, + { + name: "tickArrayTwo0"; + isMut: true; + isSigner: false; + }, + { + name: "tickArrayTwo1"; + isMut: true; + isSigner: false; + }, + { + name: "tickArrayTwo2"; + isMut: true; + isSigner: false; + }, + { + name: "oracleOne"; + isMut: false; + isSigner: false; + }, + { + name: "oracleTwo"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "amount"; + type: "u64"; + }, + { + name: "otherAmountThreshold"; + type: "u64"; + }, + { + name: "amountSpecifiedIsInput"; + type: "bool"; + }, + { + name: "aToBOne"; + type: "bool"; + }, + { + name: "aToBTwo"; + type: "bool"; + }, + { + name: "sqrtPriceLimitOne"; + type: "u128"; + }, + { + name: "sqrtPriceLimitTwo"; + type: "u128"; + }, + ]; + }, + { + name: "initializePositionBundle"; + docs: [ + "Initializes a PositionBundle account that bundles several positions.", + "A unique token will be minted to represent the position bundle in the users wallet.", + ]; + accounts: [ + { + name: "positionBundle"; + isMut: true; + isSigner: false; + }, + { + name: "positionBundleMint"; + isMut: true; + isSigner: true; + }, + { + name: "positionBundleTokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "positionBundleOwner"; + isMut: false; + isSigner: false; + }, + { + name: "funder"; + isMut: true; + isSigner: true; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + }, + { + name: "associatedTokenProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: []; + }, + { + name: "initializePositionBundleWithMetadata"; + docs: [ + "Initializes a PositionBundle account that bundles several positions.", + "A unique token will be minted to represent the position bundle in the users wallet.", + "Additional Metaplex metadata is appended to identify the token.", + ]; + accounts: [ + { + name: "positionBundle"; + isMut: true; + isSigner: false; + }, + { + name: "positionBundleMint"; + isMut: true; + isSigner: true; + }, + { + name: "positionBundleMetadata"; + isMut: true; + isSigner: false; + docs: [ + "https://github.com/metaplex-foundation/metaplex-program-library/blob/773a574c4b34e5b9f248a81306ec24db064e255f/token-metadata/program/src/utils/metadata.rs#L100", + ]; + }, + { + name: "positionBundleTokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "positionBundleOwner"; + isMut: false; + isSigner: false; + }, + { + name: "funder"; + isMut: true; + isSigner: true; + }, + { + name: "metadataUpdateAuth"; + isMut: false; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + }, + { + name: "associatedTokenProgram"; + isMut: false; + isSigner: false; + }, + { + name: "metadataProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: []; + }, + { + name: "deletePositionBundle"; + docs: [ + "Delete a PositionBundle account. Burns the position bundle token in the owner's wallet.", + "", + "### Authority", + "- `position_bundle_owner` - The owner that owns the position bundle token.", + "", + "### Special Errors", + "- `PositionBundleNotDeletable` - The provided position bundle has open positions.", + ]; + accounts: [ + { + name: "positionBundle"; + isMut: true; + isSigner: false; + }, + { + name: "positionBundleMint"; + isMut: true; + isSigner: false; + }, + { + name: "positionBundleTokenAccount"; + isMut: true; + isSigner: false; + }, + { + name: "positionBundleOwner"; + isMut: false; + isSigner: true; + }, + { + name: "receiver"; + isMut: true; + isSigner: false; + }, + { + name: "tokenProgram"; + isMut: false; + isSigner: false; + }, + ]; + args: []; + }, + { + name: "openBundledPosition"; + docs: [ + "Open a bundled position in a Whirlpool. No new tokens are issued", + "because the owner of the position bundle becomes the owner of the position.", + "The position will start off with 0 liquidity.", + "", + "### Authority", + "- `position_bundle_authority` - authority that owns the token corresponding to this desired position bundle.", + "", + "### Parameters", + "- `bundle_index` - The bundle index that we'd like to open.", + "- `tick_lower_index` - The tick specifying the lower end of the position range.", + "- `tick_upper_index` - The tick specifying the upper end of the position range.", + "", + "#### Special Errors", + "- `InvalidBundleIndex` - If the provided bundle index is out of bounds.", + "- `InvalidTickIndex` - If a provided tick is out of bounds, out of order or not a multiple of", + "the tick-spacing in this pool.", + ]; + accounts: [ + { + name: "bundledPosition"; + isMut: true; + isSigner: false; + }, + { + name: "positionBundle"; + isMut: true; + isSigner: false; + }, + { + name: "positionBundleTokenAccount"; + isMut: false; + isSigner: false; + }, + { + name: "positionBundleAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "whirlpool"; + isMut: false; + isSigner: false; + }, + { + name: "funder"; + isMut: true; + isSigner: true; + }, + { + name: "systemProgram"; + isMut: false; + isSigner: false; + }, + { + name: "rent"; + isMut: false; + isSigner: false; + }, + ]; + args: [ + { + name: "bundleIndex"; + type: "u16"; + }, + { + name: "tickLowerIndex"; + type: "i32"; + }, + { + name: "tickUpperIndex"; + type: "i32"; + }, + ]; + }, + { + name: "closeBundledPosition"; + docs: [ + "Close a bundled position in a Whirlpool.", + "", + "### Authority", + "- `position_bundle_authority` - authority that owns the token corresponding to this desired position bundle.", + "", + "### Parameters", + "- `bundle_index` - The bundle index that we'd like to close.", + "", + "#### Special Errors", + "- `InvalidBundleIndex` - If the provided bundle index is out of bounds.", + "- `ClosePositionNotEmpty` - The provided position account is not empty.", + ]; + accounts: [ + { + name: "bundledPosition"; + isMut: true; + isSigner: false; + }, + { + name: "positionBundle"; + isMut: true; + isSigner: false; + }, + { + name: "positionBundleTokenAccount"; + isMut: false; + isSigner: false; + }, + { + name: "positionBundleAuthority"; + isMut: false; + isSigner: true; + }, + { + name: "receiver"; + isMut: true; + isSigner: false; + }, + ]; + args: [ + { + name: "bundleIndex"; + type: "u16"; + }, + ]; + }, + ]; + accounts: [ + { + name: "whirlpoolsConfig"; + type: { + kind: "struct"; + fields: [ + { + name: "feeAuthority"; + type: "publicKey"; + }, + { + name: "collectProtocolFeesAuthority"; + type: "publicKey"; + }, + { + name: "rewardEmissionsSuperAuthority"; + type: "publicKey"; + }, + { + name: "defaultProtocolFeeRate"; + type: "u16"; + }, + ]; + }; + }, + { + name: "feeTier"; + type: { + kind: "struct"; + fields: [ + { + name: "whirlpoolsConfig"; + type: "publicKey"; + }, + { + name: "tickSpacing"; + type: "u16"; + }, + { + name: "defaultFeeRate"; + type: "u16"; + }, + ]; + }; + }, + { + name: "positionBundle"; + type: { + kind: "struct"; + fields: [ + { + name: "positionBundleMint"; + type: "publicKey"; + }, + { + name: "positionBitmap"; + type: { + array: ["u8", 32]; + }; + }, + ]; + }; + }, + { + name: "position"; + type: { + kind: "struct"; + fields: [ + { + name: "whirlpool"; + type: "publicKey"; + }, + { + name: "positionMint"; + type: "publicKey"; + }, + { + name: "liquidity"; + type: "u128"; + }, + { + name: "tickLowerIndex"; + type: "i32"; + }, + { + name: "tickUpperIndex"; + type: "i32"; + }, + { + name: "feeGrowthCheckpointA"; + type: "u128"; + }, + { + name: "feeOwedA"; + type: "u64"; + }, + { + name: "feeGrowthCheckpointB"; + type: "u128"; + }, + { + name: "feeOwedB"; + type: "u64"; + }, + { + name: "rewardInfos"; + type: { + array: [ + { + defined: "PositionRewardInfo"; + }, + 3, + ]; + }; + }, + ]; + }; + }, + { + name: "tickArray"; + type: { + kind: "struct"; + fields: [ + { + name: "startTickIndex"; + type: "i32"; + }, + { + name: "ticks"; + type: { + array: [ + { + defined: "Tick"; + }, + 88, + ]; + }; + }, + { + name: "whirlpool"; + type: "publicKey"; + }, + ]; + }; + }, + { + name: "whirlpool"; + type: { + kind: "struct"; + fields: [ + { + name: "whirlpoolsConfig"; + type: "publicKey"; + }, + { + name: "whirlpoolBump"; + type: { + array: ["u8", 1]; + }; + }, + { + name: "tickSpacing"; + type: "u16"; + }, + { + name: "tickSpacingSeed"; + type: { + array: ["u8", 2]; + }; + }, + { + name: "feeRate"; + type: "u16"; + }, + { + name: "protocolFeeRate"; + type: "u16"; + }, + { + name: "liquidity"; + type: "u128"; + }, + { + name: "sqrtPrice"; + type: "u128"; + }, + { + name: "tickCurrentIndex"; + type: "i32"; + }, + { + name: "protocolFeeOwedA"; + type: "u64"; + }, + { + name: "protocolFeeOwedB"; + type: "u64"; + }, + { + name: "tokenMintA"; + type: "publicKey"; + }, + { + name: "tokenVaultA"; + type: "publicKey"; + }, + { + name: "feeGrowthGlobalA"; + type: "u128"; + }, + { + name: "tokenMintB"; + type: "publicKey"; + }, + { + name: "tokenVaultB"; + type: "publicKey"; + }, + { + name: "feeGrowthGlobalB"; + type: "u128"; + }, + { + name: "rewardLastUpdatedTimestamp"; + type: "u64"; + }, + { + name: "rewardInfos"; + type: { + array: [ + { + defined: "WhirlpoolRewardInfo"; + }, + 3, + ]; + }; + }, + ]; + }; + }, + ]; + types: [ + { + name: "OpenPositionBumps"; + type: { + kind: "struct"; + fields: [ + { + name: "positionBump"; + type: "u8"; + }, + ]; + }; + }, + { + name: "OpenPositionWithMetadataBumps"; + type: { + kind: "struct"; + fields: [ + { + name: "positionBump"; + type: "u8"; + }, + { + name: "metadataBump"; + type: "u8"; + }, + ]; + }; + }, + { + name: "PositionRewardInfo"; + type: { + kind: "struct"; + fields: [ + { + name: "growthInsideCheckpoint"; + type: "u128"; + }, + { + name: "amountOwed"; + type: "u64"; + }, + ]; + }; + }, + { + name: "Tick"; + type: { + kind: "struct"; + fields: [ + { + name: "initialized"; + type: "bool"; + }, + { + name: "liquidityNet"; + type: "i128"; + }, + { + name: "liquidityGross"; + type: "u128"; + }, + { + name: "feeGrowthOutsideA"; + type: "u128"; + }, + { + name: "feeGrowthOutsideB"; + type: "u128"; + }, + { + name: "rewardGrowthsOutside"; + type: { + array: ["u128", 3]; + }; + }, + ]; + }; + }, + { + name: "WhirlpoolRewardInfo"; + docs: [ + "Stores the state relevant for tracking liquidity mining rewards at the `Whirlpool` level.", + "These values are used in conjunction with `PositionRewardInfo`, `Tick.reward_growths_outside`,", + "and `Whirlpool.reward_last_updated_timestamp` to determine how many rewards are earned by open", + "positions.", + ]; + type: { + kind: "struct"; + fields: [ + { + name: "mint"; + docs: ["Reward token mint."]; + type: "publicKey"; + }, + { + name: "vault"; + docs: ["Reward vault token account."]; + type: "publicKey"; + }, + { + name: "authority"; + docs: [ + "Authority account that has permission to initialize the reward and set emissions.", + ]; + type: "publicKey"; + }, + { + name: "emissionsPerSecondX64"; + docs: [ + "Q64.64 number that indicates how many tokens per second are earned per unit of liquidity.", + ]; + type: "u128"; + }, + { + name: "growthGlobalX64"; + docs: [ + "Q64.64 number that tracks the total tokens earned per unit of liquidity since the reward", + "emissions were turned on.", + ]; + type: "u128"; + }, + ]; + }; + }, + { + name: "WhirlpoolBumps"; + type: { + kind: "struct"; + fields: [ + { + name: "whirlpoolBump"; + type: "u8"; + }, + ]; + }; + }, + { + name: "CurrIndex"; + type: { + kind: "enum"; + variants: [ + { + name: "Below"; + }, + { + name: "Inside"; + }, + { + name: "Above"; + }, + ]; + }; + }, + { + name: "TickLabel"; + type: { + kind: "enum"; + variants: [ + { + name: "Upper"; + }, + { + name: "Lower"; + }, + ]; + }; + }, + { + name: "Direction"; + type: { + kind: "enum"; + variants: [ + { + name: "Left"; + }, + { + name: "Right"; + }, + ]; + }; + }, + ]; + errors: [ + { + code: 6000; + name: "InvalidEnum"; + msg: "Enum value could not be converted"; + }, + { + code: 6001; + name: "InvalidStartTick"; + msg: "Invalid start tick index provided."; + }, + { + code: 6002; + name: "TickArrayExistInPool"; + msg: "Tick-array already exists in this whirlpool"; + }, + { + code: 6003; + name: "TickArrayIndexOutofBounds"; + msg: "Attempt to search for a tick-array failed"; + }, + { + code: 6004; + name: "InvalidTickSpacing"; + msg: "Tick-spacing is not supported"; + }, + { + code: 6005; + name: "ClosePositionNotEmpty"; + msg: "Position is not empty It cannot be closed"; + }, + { + code: 6006; + name: "DivideByZero"; + msg: "Unable to divide by zero"; + }, + { + code: 6007; + name: "NumberCastError"; + msg: "Unable to cast number into BigInt"; + }, + { + code: 6008; + name: "NumberDownCastError"; + msg: "Unable to down cast number"; + }, + { + code: 6009; + name: "TickNotFound"; + msg: "Tick not found within tick array"; + }, + { + code: 6010; + name: "InvalidTickIndex"; + msg: "Provided tick index is either out of bounds or uninitializable"; + }, + { + code: 6011; + name: "SqrtPriceOutOfBounds"; + msg: "Provided sqrt price out of bounds"; + }, + { + code: 6012; + name: "LiquidityZero"; + msg: "Liquidity amount must be greater than zero"; + }, + { + code: 6013; + name: "LiquidityTooHigh"; + msg: "Liquidity amount must be less than i64::MAX"; + }, + { + code: 6014; + name: "LiquidityOverflow"; + msg: "Liquidity overflow"; + }, + { + code: 6015; + name: "LiquidityUnderflow"; + msg: "Liquidity underflow"; + }, + { + code: 6016; + name: "LiquidityNetError"; + msg: "Tick liquidity net underflowed or overflowed"; + }, + { + code: 6017; + name: "TokenMaxExceeded"; + msg: "Exceeded token max"; + }, + { + code: 6018; + name: "TokenMinSubceeded"; + msg: "Did not meet token min"; + }, + { + code: 6019; + name: "MissingOrInvalidDelegate"; + msg: "Position token account has a missing or invalid delegate"; + }, + { + code: 6020; + name: "InvalidPositionTokenAmount"; + msg: "Position token amount must be 1"; + }, + { + code: 6021; + name: "InvalidTimestampConversion"; + msg: "Timestamp should be convertible from i64 to u64"; + }, + { + code: 6022; + name: "InvalidTimestamp"; + msg: "Timestamp should be greater than the last updated timestamp"; + }, + { + code: 6023; + name: "InvalidTickArraySequence"; + msg: "Invalid tick array sequence provided for instruction."; + }, + { + code: 6024; + name: "InvalidTokenMintOrder"; + msg: "Token Mint in wrong order"; + }, + { + code: 6025; + name: "RewardNotInitialized"; + msg: "Reward not initialized"; + }, + { + code: 6026; + name: "InvalidRewardIndex"; + msg: "Invalid reward index"; + }, + { + code: 6027; + name: "RewardVaultAmountInsufficient"; + msg: "Reward vault requires amount to support emissions for at least one day"; + }, + { + code: 6028; + name: "FeeRateMaxExceeded"; + msg: "Exceeded max fee rate"; + }, + { + code: 6029; + name: "ProtocolFeeRateMaxExceeded"; + msg: "Exceeded max protocol fee rate"; + }, + { + code: 6030; + name: "MultiplicationShiftRightOverflow"; + msg: "Multiplication with shift right overflow"; + }, + { + code: 6031; + name: "MulDivOverflow"; + msg: "Muldiv overflow"; + }, + { + code: 6032; + name: "MulDivInvalidInput"; + msg: "Invalid div_u256 input"; + }, + { + code: 6033; + name: "MultiplicationOverflow"; + msg: "Multiplication overflow"; + }, + { + code: 6034; + name: "InvalidSqrtPriceLimitDirection"; + msg: "Provided SqrtPriceLimit not in the same direction as the swap."; + }, + { + code: 6035; + name: "ZeroTradableAmount"; + msg: "There are no tradable amount to swap."; + }, + { + code: 6036; + name: "AmountOutBelowMinimum"; + msg: "Amount out below minimum threshold"; + }, + { + code: 6037; + name: "AmountInAboveMaximum"; + msg: "Amount in above maximum threshold"; + }, + { + code: 6038; + name: "TickArraySequenceInvalidIndex"; + msg: "Invalid index for tick array sequence"; + }, + { + code: 6039; + name: "AmountCalcOverflow"; + msg: "Amount calculated overflows"; + }, + { + code: 6040; + name: "AmountRemainingOverflow"; + msg: "Amount remaining overflows"; + }, + { + code: 6041; + name: "InvalidIntermediaryMint"; + msg: "Invalid intermediary mint"; + }, + { + code: 6042; + name: "DuplicateTwoHopPool"; + msg: "Duplicate two hop pool"; + }, + { + code: 6043; + name: "InvalidBundleIndex"; + msg: "Bundle index is out of bounds"; + }, + { + code: 6044; + name: "BundledPositionAlreadyOpened"; + msg: "Position has already been opened"; + }, + { + code: 6045; + name: "BundledPositionAlreadyClosed"; + msg: "Position has already been closed"; + }, + { + code: 6046; + name: "PositionBundleNotDeletable"; + msg: "Unable to delete PositionBundle with open positions"; + }, + ]; +}; + +export const IDL: Whirlpool = { + version: "0.2.0", + name: "whirlpool", + instructions: [ + { + name: "initializeConfig", + docs: [ + "Initializes a WhirlpoolsConfig account that hosts info & authorities", + "required to govern a set of Whirlpools.", + "", + "### Parameters", + "- `fee_authority` - Authority authorized to initialize fee-tiers and set customs fees.", + "- `collect_protocol_fees_authority` - Authority authorized to collect protocol fees.", + "- `reward_emissions_super_authority` - Authority authorized to set reward authorities in pools.", + ], + accounts: [ + { + name: "config", + isMut: true, + isSigner: true, + }, + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "feeAuthority", + type: "publicKey", + }, + { + name: "collectProtocolFeesAuthority", + type: "publicKey", + }, + { + name: "rewardEmissionsSuperAuthority", + type: "publicKey", + }, + { + name: "defaultProtocolFeeRate", + type: "u16", + }, + ], + }, + { + name: "initializePool", + docs: [ + "Initializes a Whirlpool account.", + "Fee rate is set to the default values on the config and supplied fee_tier.", + "", + "### Parameters", + "- `bumps` - The bump value when deriving the PDA of the Whirlpool address.", + "- `tick_spacing` - The desired tick spacing for this pool.", + "- `initial_sqrt_price` - The desired initial sqrt-price for this pool", + "", + "#### Special Errors", + "`InvalidTokenMintOrder` - The order of mints have to be ordered by", + "`SqrtPriceOutOfBounds` - provided initial_sqrt_price is not between 2^-64 to 2^64", + "", + ], + accounts: [ + { + name: "whirlpoolsConfig", + isMut: false, + isSigner: false, + }, + { + name: "tokenMintA", + isMut: false, + isSigner: false, + }, + { + name: "tokenMintB", + isMut: false, + isSigner: false, + }, + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultA", + isMut: true, + isSigner: true, + }, + { + name: "tokenVaultB", + isMut: true, + isSigner: true, + }, + { + name: "feeTier", + isMut: false, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "bumps", + type: { + defined: "WhirlpoolBumps", + }, + }, + { + name: "tickSpacing", + type: "u16", + }, + { + name: "initialSqrtPrice", + type: "u128", + }, + ], + }, + { + name: "initializeTickArray", + docs: [ + "Initializes a tick_array account to represent a tick-range in a Whirlpool.", + "", + "### Parameters", + "- `start_tick_index` - The starting tick index for this tick-array.", + "Has to be a multiple of TickArray size & the tick spacing of this pool.", + "", + "#### Special Errors", + "- `InvalidStartTick` - if the provided start tick is out of bounds or is not a multiple of", + "TICK_ARRAY_SIZE * tick spacing.", + ], + accounts: [ + { + name: "whirlpool", + isMut: false, + isSigner: false, + }, + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "tickArray", + isMut: true, + isSigner: false, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "startTickIndex", + type: "i32", + }, + ], + }, + { + name: "initializeFeeTier", + docs: [ + "Initializes a fee_tier account usable by Whirlpools in a WhirlpoolConfig space.", + "", + "### Authority", + '- "fee_authority" - Set authority in the WhirlpoolConfig', + "", + "### Parameters", + "- `tick_spacing` - The tick-spacing that this fee-tier suggests the default_fee_rate for.", + "- `default_fee_rate` - The default fee rate that a pool will use if the pool uses this", + "fee tier during initialization.", + "", + "#### Special Errors", + "- `FeeRateMaxExceeded` - If the provided default_fee_rate exceeds MAX_FEE_RATE.", + ], + accounts: [ + { + name: "config", + isMut: false, + isSigner: false, + }, + { + name: "feeTier", + isMut: true, + isSigner: false, + }, + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "feeAuthority", + isMut: false, + isSigner: true, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "tickSpacing", + type: "u16", + }, + { + name: "defaultFeeRate", + type: "u16", + }, + ], + }, + { + name: "initializeReward", + docs: [ + "Initialize reward for a Whirlpool. A pool can only support up to a set number of rewards.", + "", + "### Authority", + '- "reward_authority" - assigned authority by the reward_super_authority for the specified', + "reward-index in this Whirlpool", + "", + "### Parameters", + "- `reward_index` - The reward index that we'd like to initialize. (0 <= index <= NUM_REWARDS)", + "", + "#### Special Errors", + "- `InvalidRewardIndex` - If the provided reward index doesn't match the lowest uninitialized", + "index in this pool, or exceeds NUM_REWARDS, or", + "all reward slots for this pool has been initialized.", + ], + accounts: [ + { + name: "rewardAuthority", + isMut: false, + isSigner: true, + }, + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "rewardMint", + isMut: false, + isSigner: false, + }, + { + name: "rewardVault", + isMut: true, + isSigner: true, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "rewardIndex", + type: "u8", + }, + ], + }, + { + name: "setRewardEmissions", + docs: [ + "Set the reward emissions for a reward in a Whirlpool.", + "", + "### Authority", + '- "reward_authority" - assigned authority by the reward_super_authority for the specified', + "reward-index in this Whirlpool", + "", + "### Parameters", + "- `reward_index` - The reward index (0 <= index <= NUM_REWARDS) that we'd like to modify.", + "- `emissions_per_second_x64` - The amount of rewards emitted in this pool.", + "", + "#### Special Errors", + "- `RewardVaultAmountInsufficient` - The amount of rewards in the reward vault cannot emit", + "more than a day of desired emissions.", + "- `InvalidTimestamp` - Provided timestamp is not in order with the previous timestamp.", + "- `InvalidRewardIndex` - If the provided reward index doesn't match the lowest uninitialized", + "index in this pool, or exceeds NUM_REWARDS, or", + "all reward slots for this pool has been initialized.", + ], + accounts: [ + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "rewardAuthority", + isMut: false, + isSigner: true, + }, + { + name: "rewardVault", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "rewardIndex", + type: "u8", + }, + { + name: "emissionsPerSecondX64", + type: "u128", + }, + ], + }, + { + name: "openPosition", + docs: [ + "Open a position in a Whirlpool. A unique token will be minted to represent the position", + "in the users wallet. The position will start off with 0 liquidity.", + "", + "### Parameters", + "- `tick_lower_index` - The tick specifying the lower end of the position range.", + "- `tick_upper_index` - The tick specifying the upper end of the position range.", + "", + "#### Special Errors", + "- `InvalidTickIndex` - If a provided tick is out of bounds, out of order or not a multiple of", + "the tick-spacing in this pool.", + ], + accounts: [ + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "owner", + isMut: false, + isSigner: false, + }, + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "positionMint", + isMut: true, + isSigner: true, + }, + { + name: "positionTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "whirlpool", + isMut: false, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + { + name: "associatedTokenProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "bumps", + type: { + defined: "OpenPositionBumps", + }, + }, + { + name: "tickLowerIndex", + type: "i32", + }, + { + name: "tickUpperIndex", + type: "i32", + }, + ], + }, + { + name: "openPositionWithMetadata", + docs: [ + "Open a position in a Whirlpool. A unique token will be minted to represent the position", + "in the users wallet. Additional Metaplex metadata is appended to identify the token.", + "The position will start off with 0 liquidity.", + "", + "### Parameters", + "- `tick_lower_index` - The tick specifying the lower end of the position range.", + "- `tick_upper_index` - The tick specifying the upper end of the position range.", + "", + "#### Special Errors", + "- `InvalidTickIndex` - If a provided tick is out of bounds, out of order or not a multiple of", + "the tick-spacing in this pool.", + ], + accounts: [ + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "owner", + isMut: false, + isSigner: false, + }, + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "positionMint", + isMut: true, + isSigner: true, + }, + { + name: "positionMetadataAccount", + isMut: true, + isSigner: false, + docs: [ + "https://github.com/metaplex-foundation/metaplex-program-library/blob/master/token-metadata/program/src/utils.rs#L873", + ], + }, + { + name: "positionTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "whirlpool", + isMut: false, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + { + name: "associatedTokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "metadataProgram", + isMut: false, + isSigner: false, + }, + { + name: "metadataUpdateAuth", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "bumps", + type: { + defined: "OpenPositionWithMetadataBumps", + }, + }, + { + name: "tickLowerIndex", + type: "i32", + }, + { + name: "tickUpperIndex", + type: "i32", + }, + ], + }, + { + name: "increaseLiquidity", + docs: [ + "Add liquidity to a position in the Whirlpool. This call also updates the position's accrued fees and rewards.", + "", + "### Authority", + "- `position_authority` - authority that owns the token corresponding to this desired position.", + "", + "### Parameters", + "- `liquidity_amount` - The total amount of Liquidity the user is willing to deposit.", + "- `token_max_a` - The maximum amount of tokenA the user is willing to deposit.", + "- `token_max_b` - The maximum amount of tokenB the user is willing to deposit.", + "", + "#### Special Errors", + "- `LiquidityZero` - Provided liquidity amount is zero.", + "- `LiquidityTooHigh` - Provided liquidity exceeds u128::max.", + "- `TokenMaxExceeded` - The required token to perform this operation exceeds the user defined amount.", + ], + accounts: [ + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "positionAuthority", + isMut: false, + isSigner: true, + }, + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "positionTokenAccount", + isMut: false, + isSigner: false, + }, + { + name: "tokenOwnerAccountA", + isMut: true, + isSigner: false, + }, + { + name: "tokenOwnerAccountB", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultA", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultB", + isMut: true, + isSigner: false, + }, + { + name: "tickArrayLower", + isMut: true, + isSigner: false, + }, + { + name: "tickArrayUpper", + isMut: true, + isSigner: false, + }, + ], + args: [ + { + name: "liquidityAmount", + type: "u128", + }, + { + name: "tokenMaxA", + type: "u64", + }, + { + name: "tokenMaxB", + type: "u64", + }, + ], + }, + { + name: "decreaseLiquidity", + docs: [ + "Withdraw liquidity from a position in the Whirlpool. This call also updates the position's accrued fees and rewards.", + "", + "### Authority", + "- `position_authority` - authority that owns the token corresponding to this desired position.", + "", + "### Parameters", + "- `liquidity_amount` - The total amount of Liquidity the user desires to withdraw.", + "- `token_min_a` - The minimum amount of tokenA the user is willing to withdraw.", + "- `token_min_b` - The minimum amount of tokenB the user is willing to withdraw.", + "", + "#### Special Errors", + "- `LiquidityZero` - Provided liquidity amount is zero.", + "- `LiquidityTooHigh` - Provided liquidity exceeds u128::max.", + "- `TokenMinSubceeded` - The required token to perform this operation subceeds the user defined amount.", + ], + accounts: [ + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "positionAuthority", + isMut: false, + isSigner: true, + }, + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "positionTokenAccount", + isMut: false, + isSigner: false, + }, + { + name: "tokenOwnerAccountA", + isMut: true, + isSigner: false, + }, + { + name: "tokenOwnerAccountB", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultA", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultB", + isMut: true, + isSigner: false, + }, + { + name: "tickArrayLower", + isMut: true, + isSigner: false, + }, + { + name: "tickArrayUpper", + isMut: true, + isSigner: false, + }, + ], + args: [ + { + name: "liquidityAmount", + type: "u128", + }, + { + name: "tokenMinA", + type: "u64", + }, + { + name: "tokenMinB", + type: "u64", + }, + ], + }, + { + name: "updateFeesAndRewards", + docs: [ + "Update the accrued fees and rewards for a position.", + "", + "#### Special Errors", + "- `TickNotFound` - Provided tick array account does not contain the tick for this position.", + "- `LiquidityZero` - Position has zero liquidity and therefore already has the most updated fees and reward values.", + ], + accounts: [ + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "tickArrayLower", + isMut: false, + isSigner: false, + }, + { + name: "tickArrayUpper", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "collectFees", + docs: [ + "Collect fees accrued for this position.", + "", + "### Authority", + "- `position_authority` - authority that owns the token corresponding to this desired position.", + ], + accounts: [ + { + name: "whirlpool", + isMut: false, + isSigner: false, + }, + { + name: "positionAuthority", + isMut: false, + isSigner: true, + }, + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "positionTokenAccount", + isMut: false, + isSigner: false, + }, + { + name: "tokenOwnerAccountA", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultA", + isMut: true, + isSigner: false, + }, + { + name: "tokenOwnerAccountB", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultB", + isMut: true, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "collectReward", + docs: [ + "Collect rewards accrued for this position.", + "", + "### Authority", + "- `position_authority` - authority that owns the token corresponding to this desired position.", + ], + accounts: [ + { + name: "whirlpool", + isMut: false, + isSigner: false, + }, + { + name: "positionAuthority", + isMut: false, + isSigner: true, + }, + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "positionTokenAccount", + isMut: false, + isSigner: false, + }, + { + name: "rewardOwnerAccount", + isMut: true, + isSigner: false, + }, + { + name: "rewardVault", + isMut: true, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "rewardIndex", + type: "u8", + }, + ], + }, + { + name: "collectProtocolFees", + docs: [ + "Collect the protocol fees accrued in this Whirlpool", + "", + "### Authority", + "- `collect_protocol_fees_authority` - assigned authority in the WhirlpoolConfig that can collect protocol fees", + ], + accounts: [ + { + name: "whirlpoolsConfig", + isMut: false, + isSigner: false, + }, + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "collectProtocolFeesAuthority", + isMut: false, + isSigner: true, + }, + { + name: "tokenVaultA", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultB", + isMut: true, + isSigner: false, + }, + { + name: "tokenDestinationA", + isMut: true, + isSigner: false, + }, + { + name: "tokenDestinationB", + isMut: true, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "swap", + docs: [ + "Perform a swap in this Whirlpool", + "", + "### Authority", + '- "token_authority" - The authority to withdraw tokens from the input token account.', + "", + "### Parameters", + "- `amount` - The amount of input or output token to swap from (depending on amount_specified_is_input).", + "- `other_amount_threshold` - The maximum/minimum of input/output token to swap into (depending on amount_specified_is_input).", + "- `sqrt_price_limit` - The maximum/minimum price the swap will swap to.", + "- `amount_specified_is_input` - Specifies the token the parameter `amount`represents. If true, the amount represents the input token of the swap.", + "- `a_to_b` - The direction of the swap. True if swapping from A to B. False if swapping from B to A.", + "", + "#### Special Errors", + "- `ZeroTradableAmount` - User provided parameter `amount` is 0.", + "- `InvalidSqrtPriceLimitDirection` - User provided parameter `sqrt_price_limit` does not match the direction of the trade.", + "- `SqrtPriceOutOfBounds` - User provided parameter `sqrt_price_limit` is over Whirlppool's max/min bounds for sqrt-price.", + "- `InvalidTickArraySequence` - User provided tick-arrays are not in sequential order required to proceed in this trade direction.", + "- `TickArraySequenceInvalidIndex` - The swap loop attempted to access an invalid array index during the query of the next initialized tick.", + "- `TickArrayIndexOutofBounds` - The swap loop attempted to access an invalid array index during tick crossing.", + "- `LiquidityOverflow` - Liquidity value overflowed 128bits during tick crossing.", + "- `InvalidTickSpacing` - The swap pool was initialized with tick-spacing of 0.", + ], + accounts: [ + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "tokenAuthority", + isMut: false, + isSigner: true, + }, + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "tokenOwnerAccountA", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultA", + isMut: true, + isSigner: false, + }, + { + name: "tokenOwnerAccountB", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultB", + isMut: true, + isSigner: false, + }, + { + name: "tickArray0", + isMut: true, + isSigner: false, + }, + { + name: "tickArray1", + isMut: true, + isSigner: false, + }, + { + name: "tickArray2", + isMut: true, + isSigner: false, + }, + { + name: "oracle", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + { + name: "otherAmountThreshold", + type: "u64", + }, + { + name: "sqrtPriceLimit", + type: "u128", + }, + { + name: "amountSpecifiedIsInput", + type: "bool", + }, + { + name: "aToB", + type: "bool", + }, + ], + }, + { + name: "closePosition", + docs: [ + "Close a position in a Whirlpool. Burns the position token in the owner's wallet.", + "", + "### Authority", + '- "position_authority" - The authority that owns the position token.', + "", + "#### Special Errors", + "- `ClosePositionNotEmpty` - The provided position account is not empty.", + ], + accounts: [ + { + name: "positionAuthority", + isMut: false, + isSigner: true, + }, + { + name: "receiver", + isMut: true, + isSigner: false, + }, + { + name: "position", + isMut: true, + isSigner: false, + }, + { + name: "positionMint", + isMut: true, + isSigner: false, + }, + { + name: "positionTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "setDefaultFeeRate", + docs: [ + "Set the default_fee_rate for a FeeTier", + "Only the current fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority in the WhirlpoolConfig', + "", + "### Parameters", + "- `default_fee_rate` - The default fee rate that a pool will use if the pool uses this", + "fee tier during initialization.", + "", + "#### Special Errors", + "- `FeeRateMaxExceeded` - If the provided default_fee_rate exceeds MAX_FEE_RATE.", + ], + accounts: [ + { + name: "whirlpoolsConfig", + isMut: false, + isSigner: false, + }, + { + name: "feeTier", + isMut: true, + isSigner: false, + }, + { + name: "feeAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "defaultFeeRate", + type: "u16", + }, + ], + }, + { + name: "setDefaultProtocolFeeRate", + docs: [ + "Sets the default protocol fee rate for a WhirlpoolConfig", + "Protocol fee rate is represented as a basis point.", + "Only the current fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority that can modify pool fees in the WhirlpoolConfig', + "", + "### Parameters", + "- `default_protocol_fee_rate` - Rate that is referenced during the initialization of a Whirlpool using this config.", + "", + "#### Special Errors", + "- `ProtocolFeeRateMaxExceeded` - If the provided default_protocol_fee_rate exceeds MAX_PROTOCOL_FEE_RATE.", + ], + accounts: [ + { + name: "whirlpoolsConfig", + isMut: true, + isSigner: false, + }, + { + name: "feeAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "defaultProtocolFeeRate", + type: "u16", + }, + ], + }, + { + name: "setFeeRate", + docs: [ + "Sets the fee rate for a Whirlpool.", + "Fee rate is represented as hundredths of a basis point.", + "Only the current fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority that can modify pool fees in the WhirlpoolConfig', + "", + "### Parameters", + "- `fee_rate` - The rate that the pool will use to calculate fees going onwards.", + "", + "#### Special Errors", + "- `FeeRateMaxExceeded` - If the provided fee_rate exceeds MAX_FEE_RATE.", + ], + accounts: [ + { + name: "whirlpoolsConfig", + isMut: false, + isSigner: false, + }, + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "feeAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "feeRate", + type: "u16", + }, + ], + }, + { + name: "setProtocolFeeRate", + docs: [ + "Sets the protocol fee rate for a Whirlpool.", + "Protocol fee rate is represented as a basis point.", + "Only the current fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority that can modify pool fees in the WhirlpoolConfig', + "", + "### Parameters", + "- `protocol_fee_rate` - The rate that the pool will use to calculate protocol fees going onwards.", + "", + "#### Special Errors", + "- `ProtocolFeeRateMaxExceeded` - If the provided default_protocol_fee_rate exceeds MAX_PROTOCOL_FEE_RATE.", + ], + accounts: [ + { + name: "whirlpoolsConfig", + isMut: false, + isSigner: false, + }, + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "feeAuthority", + isMut: false, + isSigner: true, + }, + ], + args: [ + { + name: "protocolFeeRate", + type: "u16", + }, + ], + }, + { + name: "setFeeAuthority", + docs: [ + "Sets the fee authority for a WhirlpoolConfig.", + "The fee authority can set the fee & protocol fee rate for individual pools or", + "set the default fee rate for newly minted pools.", + "Only the current fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority that can modify pool fees in the WhirlpoolConfig', + ], + accounts: [ + { + name: "whirlpoolsConfig", + isMut: true, + isSigner: false, + }, + { + name: "feeAuthority", + isMut: false, + isSigner: true, + }, + { + name: "newFeeAuthority", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "setCollectProtocolFeesAuthority", + docs: [ + "Sets the fee authority to collect protocol fees for a WhirlpoolConfig.", + "Only the current collect protocol fee authority has permission to invoke this instruction.", + "", + "### Authority", + '- "fee_authority" - Set authority that can collect protocol fees in the WhirlpoolConfig', + ], + accounts: [ + { + name: "whirlpoolsConfig", + isMut: true, + isSigner: false, + }, + { + name: "collectProtocolFeesAuthority", + isMut: false, + isSigner: true, + }, + { + name: "newCollectProtocolFeesAuthority", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "setRewardAuthority", + docs: [ + "Set the whirlpool reward authority at the provided `reward_index`.", + "Only the current reward authority for this reward index has permission to invoke this instruction.", + "", + "### Authority", + '- "reward_authority" - Set authority that can control reward emission for this particular reward.', + "", + "#### Special Errors", + "- `InvalidRewardIndex` - If the provided reward index doesn't match the lowest uninitialized", + "index in this pool, or exceeds NUM_REWARDS, or", + "all reward slots for this pool has been initialized.", + ], + accounts: [ + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "rewardAuthority", + isMut: false, + isSigner: true, + }, + { + name: "newRewardAuthority", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "rewardIndex", + type: "u8", + }, + ], + }, + { + name: "setRewardAuthorityBySuperAuthority", + docs: [ + "Set the whirlpool reward authority at the provided `reward_index`.", + "Only the current reward super authority has permission to invoke this instruction.", + "", + "### Authority", + '- "reward_authority" - Set authority that can control reward emission for this particular reward.', + "", + "#### Special Errors", + "- `InvalidRewardIndex` - If the provided reward index doesn't match the lowest uninitialized", + "index in this pool, or exceeds NUM_REWARDS, or", + "all reward slots for this pool has been initialized.", + ], + accounts: [ + { + name: "whirlpoolsConfig", + isMut: false, + isSigner: false, + }, + { + name: "whirlpool", + isMut: true, + isSigner: false, + }, + { + name: "rewardEmissionsSuperAuthority", + isMut: false, + isSigner: true, + }, + { + name: "newRewardAuthority", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "rewardIndex", + type: "u8", + }, + ], + }, + { + name: "setRewardEmissionsSuperAuthority", + docs: [ + "Set the whirlpool reward super authority for a WhirlpoolConfig", + "Only the current reward super authority has permission to invoke this instruction.", + "This instruction will not change the authority on any `WhirlpoolRewardInfo` whirlpool rewards.", + "", + "### Authority", + '- "reward_emissions_super_authority" - Set authority that can control reward authorities for all pools in this config space.', + ], + accounts: [ + { + name: "whirlpoolsConfig", + isMut: true, + isSigner: false, + }, + { + name: "rewardEmissionsSuperAuthority", + isMut: false, + isSigner: true, + }, + { + name: "newRewardEmissionsSuperAuthority", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "twoHopSwap", + docs: [ + "Perform a two-hop swap in this Whirlpool", + "", + "### Authority", + '- "token_authority" - The authority to withdraw tokens from the input token account.', + "", + "### Parameters", + "- `amount` - The amount of input or output token to swap from (depending on amount_specified_is_input).", + "- `other_amount_threshold` - The maximum/minimum of input/output token to swap into (depending on amount_specified_is_input).", + "- `amount_specified_is_input` - Specifies the token the parameter `amount`represents. If true, the amount represents the input token of the swap.", + "- `a_to_b_one` - The direction of the swap of hop one. True if swapping from A to B. False if swapping from B to A.", + "- `a_to_b_two` - The direction of the swap of hop two. True if swapping from A to B. False if swapping from B to A.", + "- `sqrt_price_limit_one` - The maximum/minimum price the swap will swap to in the first hop.", + "- `sqrt_price_limit_two` - The maximum/minimum price the swap will swap to in the second hop.", + "", + "#### Special Errors", + "- `ZeroTradableAmount` - User provided parameter `amount` is 0.", + "- `InvalidSqrtPriceLimitDirection` - User provided parameter `sqrt_price_limit` does not match the direction of the trade.", + "- `SqrtPriceOutOfBounds` - User provided parameter `sqrt_price_limit` is over Whirlppool's max/min bounds for sqrt-price.", + "- `InvalidTickArraySequence` - User provided tick-arrays are not in sequential order required to proceed in this trade direction.", + "- `TickArraySequenceInvalidIndex` - The swap loop attempted to access an invalid array index during the query of the next initialized tick.", + "- `TickArrayIndexOutofBounds` - The swap loop attempted to access an invalid array index during tick crossing.", + "- `LiquidityOverflow` - Liquidity value overflowed 128bits during tick crossing.", + "- `InvalidTickSpacing` - The swap pool was initialized with tick-spacing of 0.", + "- `InvalidIntermediaryMint` - Error if the intermediary mint between hop one and two do not equal.", + "- `DuplicateTwoHopPool` - Error if whirlpool one & two are the same pool.", + ], + accounts: [ + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "tokenAuthority", + isMut: false, + isSigner: true, + }, + { + name: "whirlpoolOne", + isMut: true, + isSigner: false, + }, + { + name: "whirlpoolTwo", + isMut: true, + isSigner: false, + }, + { + name: "tokenOwnerAccountOneA", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultOneA", + isMut: true, + isSigner: false, + }, + { + name: "tokenOwnerAccountOneB", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultOneB", + isMut: true, + isSigner: false, + }, + { + name: "tokenOwnerAccountTwoA", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultTwoA", + isMut: true, + isSigner: false, + }, + { + name: "tokenOwnerAccountTwoB", + isMut: true, + isSigner: false, + }, + { + name: "tokenVaultTwoB", + isMut: true, + isSigner: false, + }, + { + name: "tickArrayOne0", + isMut: true, + isSigner: false, + }, + { + name: "tickArrayOne1", + isMut: true, + isSigner: false, + }, + { + name: "tickArrayOne2", + isMut: true, + isSigner: false, + }, + { + name: "tickArrayTwo0", + isMut: true, + isSigner: false, + }, + { + name: "tickArrayTwo1", + isMut: true, + isSigner: false, + }, + { + name: "tickArrayTwo2", + isMut: true, + isSigner: false, + }, + { + name: "oracleOne", + isMut: false, + isSigner: false, + }, + { + name: "oracleTwo", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "amount", + type: "u64", + }, + { + name: "otherAmountThreshold", + type: "u64", + }, + { + name: "amountSpecifiedIsInput", + type: "bool", + }, + { + name: "aToBOne", + type: "bool", + }, + { + name: "aToBTwo", + type: "bool", + }, + { + name: "sqrtPriceLimitOne", + type: "u128", + }, + { + name: "sqrtPriceLimitTwo", + type: "u128", + }, + ], + }, + { + name: "initializePositionBundle", + docs: [ + "Initializes a PositionBundle account that bundles several positions.", + "A unique token will be minted to represent the position bundle in the users wallet.", + ], + accounts: [ + { + name: "positionBundle", + isMut: true, + isSigner: false, + }, + { + name: "positionBundleMint", + isMut: true, + isSigner: true, + }, + { + name: "positionBundleTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "positionBundleOwner", + isMut: false, + isSigner: false, + }, + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + { + name: "associatedTokenProgram", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "initializePositionBundleWithMetadata", + docs: [ + "Initializes a PositionBundle account that bundles several positions.", + "A unique token will be minted to represent the position bundle in the users wallet.", + "Additional Metaplex metadata is appended to identify the token.", + ], + accounts: [ + { + name: "positionBundle", + isMut: true, + isSigner: false, + }, + { + name: "positionBundleMint", + isMut: true, + isSigner: true, + }, + { + name: "positionBundleMetadata", + isMut: true, + isSigner: false, + docs: [ + "https://github.com/metaplex-foundation/metaplex-program-library/blob/773a574c4b34e5b9f248a81306ec24db064e255f/token-metadata/program/src/utils/metadata.rs#L100", + ], + }, + { + name: "positionBundleTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "positionBundleOwner", + isMut: false, + isSigner: false, + }, + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "metadataUpdateAuth", + isMut: false, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + { + name: "associatedTokenProgram", + isMut: false, + isSigner: false, + }, + { + name: "metadataProgram", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "deletePositionBundle", + docs: [ + "Delete a PositionBundle account. Burns the position bundle token in the owner's wallet.", + "", + "### Authority", + "- `position_bundle_owner` - The owner that owns the position bundle token.", + "", + "### Special Errors", + "- `PositionBundleNotDeletable` - The provided position bundle has open positions.", + ], + accounts: [ + { + name: "positionBundle", + isMut: true, + isSigner: false, + }, + { + name: "positionBundleMint", + isMut: true, + isSigner: false, + }, + { + name: "positionBundleTokenAccount", + isMut: true, + isSigner: false, + }, + { + name: "positionBundleOwner", + isMut: false, + isSigner: true, + }, + { + name: "receiver", + isMut: true, + isSigner: false, + }, + { + name: "tokenProgram", + isMut: false, + isSigner: false, + }, + ], + args: [], + }, + { + name: "openBundledPosition", + docs: [ + "Open a bundled position in a Whirlpool. No new tokens are issued", + "because the owner of the position bundle becomes the owner of the position.", + "The position will start off with 0 liquidity.", + "", + "### Authority", + "- `position_bundle_authority` - authority that owns the token corresponding to this desired position bundle.", + "", + "### Parameters", + "- `bundle_index` - The bundle index that we'd like to open.", + "- `tick_lower_index` - The tick specifying the lower end of the position range.", + "- `tick_upper_index` - The tick specifying the upper end of the position range.", + "", + "#### Special Errors", + "- `InvalidBundleIndex` - If the provided bundle index is out of bounds.", + "- `InvalidTickIndex` - If a provided tick is out of bounds, out of order or not a multiple of", + "the tick-spacing in this pool.", + ], + accounts: [ + { + name: "bundledPosition", + isMut: true, + isSigner: false, + }, + { + name: "positionBundle", + isMut: true, + isSigner: false, + }, + { + name: "positionBundleTokenAccount", + isMut: false, + isSigner: false, + }, + { + name: "positionBundleAuthority", + isMut: false, + isSigner: true, + }, + { + name: "whirlpool", + isMut: false, + isSigner: false, + }, + { + name: "funder", + isMut: true, + isSigner: true, + }, + { + name: "systemProgram", + isMut: false, + isSigner: false, + }, + { + name: "rent", + isMut: false, + isSigner: false, + }, + ], + args: [ + { + name: "bundleIndex", + type: "u16", + }, + { + name: "tickLowerIndex", + type: "i32", + }, + { + name: "tickUpperIndex", + type: "i32", + }, + ], + }, + { + name: "closeBundledPosition", + docs: [ + "Close a bundled position in a Whirlpool.", + "", + "### Authority", + "- `position_bundle_authority` - authority that owns the token corresponding to this desired position bundle.", + "", + "### Parameters", + "- `bundle_index` - The bundle index that we'd like to close.", + "", + "#### Special Errors", + "- `InvalidBundleIndex` - If the provided bundle index is out of bounds.", + "- `ClosePositionNotEmpty` - The provided position account is not empty.", + ], + accounts: [ + { + name: "bundledPosition", + isMut: true, + isSigner: false, + }, + { + name: "positionBundle", + isMut: true, + isSigner: false, + }, + { + name: "positionBundleTokenAccount", + isMut: false, + isSigner: false, + }, + { + name: "positionBundleAuthority", + isMut: false, + isSigner: true, + }, + { + name: "receiver", + isMut: true, + isSigner: false, + }, + ], + args: [ + { + name: "bundleIndex", + type: "u16", + }, + ], + }, + ], + accounts: [ + { + name: "whirlpoolsConfig", + type: { + kind: "struct", + fields: [ + { + name: "feeAuthority", + type: "publicKey", + }, + { + name: "collectProtocolFeesAuthority", + type: "publicKey", + }, + { + name: "rewardEmissionsSuperAuthority", + type: "publicKey", + }, + { + name: "defaultProtocolFeeRate", + type: "u16", + }, + ], + }, + }, + { + name: "feeTier", + type: { + kind: "struct", + fields: [ + { + name: "whirlpoolsConfig", + type: "publicKey", + }, + { + name: "tickSpacing", + type: "u16", + }, + { + name: "defaultFeeRate", + type: "u16", + }, + ], + }, + }, + { + name: "positionBundle", + type: { + kind: "struct", + fields: [ + { + name: "positionBundleMint", + type: "publicKey", + }, + { + name: "positionBitmap", + type: { + array: ["u8", 32], + }, + }, + ], + }, + }, + { + name: "position", + type: { + kind: "struct", + fields: [ + { + name: "whirlpool", + type: "publicKey", + }, + { + name: "positionMint", + type: "publicKey", + }, + { + name: "liquidity", + type: "u128", + }, + { + name: "tickLowerIndex", + type: "i32", + }, + { + name: "tickUpperIndex", + type: "i32", + }, + { + name: "feeGrowthCheckpointA", + type: "u128", + }, + { + name: "feeOwedA", + type: "u64", + }, + { + name: "feeGrowthCheckpointB", + type: "u128", + }, + { + name: "feeOwedB", + type: "u64", + }, + { + name: "rewardInfos", + type: { + array: [ + { + defined: "PositionRewardInfo", + }, + 3, + ], + }, + }, + ], + }, + }, + { + name: "tickArray", + type: { + kind: "struct", + fields: [ + { + name: "startTickIndex", + type: "i32", + }, + { + name: "ticks", + type: { + array: [ + { + defined: "Tick", + }, + 88, + ], + }, + }, + { + name: "whirlpool", + type: "publicKey", + }, + ], + }, + }, + { + name: "whirlpool", + type: { + kind: "struct", + fields: [ + { + name: "whirlpoolsConfig", + type: "publicKey", + }, + { + name: "whirlpoolBump", + type: { + array: ["u8", 1], + }, + }, + { + name: "tickSpacing", + type: "u16", + }, + { + name: "tickSpacingSeed", + type: { + array: ["u8", 2], + }, + }, + { + name: "feeRate", + type: "u16", + }, + { + name: "protocolFeeRate", + type: "u16", + }, + { + name: "liquidity", + type: "u128", + }, + { + name: "sqrtPrice", + type: "u128", + }, + { + name: "tickCurrentIndex", + type: "i32", + }, + { + name: "protocolFeeOwedA", + type: "u64", + }, + { + name: "protocolFeeOwedB", + type: "u64", + }, + { + name: "tokenMintA", + type: "publicKey", + }, + { + name: "tokenVaultA", + type: "publicKey", + }, + { + name: "feeGrowthGlobalA", + type: "u128", + }, + { + name: "tokenMintB", + type: "publicKey", + }, + { + name: "tokenVaultB", + type: "publicKey", + }, + { + name: "feeGrowthGlobalB", + type: "u128", + }, + { + name: "rewardLastUpdatedTimestamp", + type: "u64", + }, + { + name: "rewardInfos", + type: { + array: [ + { + defined: "WhirlpoolRewardInfo", + }, + 3, + ], + }, + }, + ], + }, + }, + ], + types: [ + { + name: "OpenPositionBumps", + type: { + kind: "struct", + fields: [ + { + name: "positionBump", + type: "u8", + }, + ], + }, + }, + { + name: "OpenPositionWithMetadataBumps", + type: { + kind: "struct", + fields: [ + { + name: "positionBump", + type: "u8", + }, + { + name: "metadataBump", + type: "u8", + }, + ], + }, + }, + { + name: "PositionRewardInfo", + type: { + kind: "struct", + fields: [ + { + name: "growthInsideCheckpoint", + type: "u128", + }, + { + name: "amountOwed", + type: "u64", + }, + ], + }, + }, + { + name: "Tick", + type: { + kind: "struct", + fields: [ + { + name: "initialized", + type: "bool", + }, + { + name: "liquidityNet", + type: "i128", + }, + { + name: "liquidityGross", + type: "u128", + }, + { + name: "feeGrowthOutsideA", + type: "u128", + }, + { + name: "feeGrowthOutsideB", + type: "u128", + }, + { + name: "rewardGrowthsOutside", + type: { + array: ["u128", 3], + }, + }, + ], + }, + }, + { + name: "WhirlpoolRewardInfo", + docs: [ + "Stores the state relevant for tracking liquidity mining rewards at the `Whirlpool` level.", + "These values are used in conjunction with `PositionRewardInfo`, `Tick.reward_growths_outside`,", + "and `Whirlpool.reward_last_updated_timestamp` to determine how many rewards are earned by open", + "positions.", + ], + type: { + kind: "struct", + fields: [ + { + name: "mint", + docs: ["Reward token mint."], + type: "publicKey", + }, + { + name: "vault", + docs: ["Reward vault token account."], + type: "publicKey", + }, + { + name: "authority", + docs: [ + "Authority account that has permission to initialize the reward and set emissions.", + ], + type: "publicKey", + }, + { + name: "emissionsPerSecondX64", + docs: [ + "Q64.64 number that indicates how many tokens per second are earned per unit of liquidity.", + ], + type: "u128", + }, + { + name: "growthGlobalX64", + docs: [ + "Q64.64 number that tracks the total tokens earned per unit of liquidity since the reward", + "emissions were turned on.", + ], + type: "u128", + }, + ], + }, + }, + { + name: "WhirlpoolBumps", + type: { + kind: "struct", + fields: [ + { + name: "whirlpoolBump", + type: "u8", + }, + ], + }, + }, + { + name: "CurrIndex", + type: { + kind: "enum", + variants: [ + { + name: "Below", + }, + { + name: "Inside", + }, + { + name: "Above", + }, + ], + }, + }, + { + name: "TickLabel", + type: { + kind: "enum", + variants: [ + { + name: "Upper", + }, + { + name: "Lower", + }, + ], + }, + }, + { + name: "Direction", + type: { + kind: "enum", + variants: [ + { + name: "Left", + }, + { + name: "Right", + }, + ], + }, + }, + ], + errors: [ + { + code: 6000, + name: "InvalidEnum", + msg: "Enum value could not be converted", + }, + { + code: 6001, + name: "InvalidStartTick", + msg: "Invalid start tick index provided.", + }, + { + code: 6002, + name: "TickArrayExistInPool", + msg: "Tick-array already exists in this whirlpool", + }, + { + code: 6003, + name: "TickArrayIndexOutofBounds", + msg: "Attempt to search for a tick-array failed", + }, + { + code: 6004, + name: "InvalidTickSpacing", + msg: "Tick-spacing is not supported", + }, + { + code: 6005, + name: "ClosePositionNotEmpty", + msg: "Position is not empty It cannot be closed", + }, + { + code: 6006, + name: "DivideByZero", + msg: "Unable to divide by zero", + }, + { + code: 6007, + name: "NumberCastError", + msg: "Unable to cast number into BigInt", + }, + { + code: 6008, + name: "NumberDownCastError", + msg: "Unable to down cast number", + }, + { + code: 6009, + name: "TickNotFound", + msg: "Tick not found within tick array", + }, + { + code: 6010, + name: "InvalidTickIndex", + msg: "Provided tick index is either out of bounds or uninitializable", + }, + { + code: 6011, + name: "SqrtPriceOutOfBounds", + msg: "Provided sqrt price out of bounds", + }, + { + code: 6012, + name: "LiquidityZero", + msg: "Liquidity amount must be greater than zero", + }, + { + code: 6013, + name: "LiquidityTooHigh", + msg: "Liquidity amount must be less than i64::MAX", + }, + { + code: 6014, + name: "LiquidityOverflow", + msg: "Liquidity overflow", + }, + { + code: 6015, + name: "LiquidityUnderflow", + msg: "Liquidity underflow", + }, + { + code: 6016, + name: "LiquidityNetError", + msg: "Tick liquidity net underflowed or overflowed", + }, + { + code: 6017, + name: "TokenMaxExceeded", + msg: "Exceeded token max", + }, + { + code: 6018, + name: "TokenMinSubceeded", + msg: "Did not meet token min", + }, + { + code: 6019, + name: "MissingOrInvalidDelegate", + msg: "Position token account has a missing or invalid delegate", + }, + { + code: 6020, + name: "InvalidPositionTokenAmount", + msg: "Position token amount must be 1", + }, + { + code: 6021, + name: "InvalidTimestampConversion", + msg: "Timestamp should be convertible from i64 to u64", + }, + { + code: 6022, + name: "InvalidTimestamp", + msg: "Timestamp should be greater than the last updated timestamp", + }, + { + code: 6023, + name: "InvalidTickArraySequence", + msg: "Invalid tick array sequence provided for instruction.", + }, + { + code: 6024, + name: "InvalidTokenMintOrder", + msg: "Token Mint in wrong order", + }, + { + code: 6025, + name: "RewardNotInitialized", + msg: "Reward not initialized", + }, + { + code: 6026, + name: "InvalidRewardIndex", + msg: "Invalid reward index", + }, + { + code: 6027, + name: "RewardVaultAmountInsufficient", + msg: "Reward vault requires amount to support emissions for at least one day", + }, + { + code: 6028, + name: "FeeRateMaxExceeded", + msg: "Exceeded max fee rate", + }, + { + code: 6029, + name: "ProtocolFeeRateMaxExceeded", + msg: "Exceeded max protocol fee rate", + }, + { + code: 6030, + name: "MultiplicationShiftRightOverflow", + msg: "Multiplication with shift right overflow", + }, + { + code: 6031, + name: "MulDivOverflow", + msg: "Muldiv overflow", + }, + { + code: 6032, + name: "MulDivInvalidInput", + msg: "Invalid div_u256 input", + }, + { + code: 6033, + name: "MultiplicationOverflow", + msg: "Multiplication overflow", + }, + { + code: 6034, + name: "InvalidSqrtPriceLimitDirection", + msg: "Provided SqrtPriceLimit not in the same direction as the swap.", + }, + { + code: 6035, + name: "ZeroTradableAmount", + msg: "There are no tradable amount to swap.", + }, + { + code: 6036, + name: "AmountOutBelowMinimum", + msg: "Amount out below minimum threshold", + }, + { + code: 6037, + name: "AmountInAboveMaximum", + msg: "Amount in above maximum threshold", + }, + { + code: 6038, + name: "TickArraySequenceInvalidIndex", + msg: "Invalid index for tick array sequence", + }, + { + code: 6039, + name: "AmountCalcOverflow", + msg: "Amount calculated overflows", + }, + { + code: 6040, + name: "AmountRemainingOverflow", + msg: "Amount remaining overflows", + }, + { + code: 6041, + name: "InvalidIntermediaryMint", + msg: "Invalid intermediary mint", + }, + { + code: 6042, + name: "DuplicateTwoHopPool", + msg: "Duplicate two hop pool", + }, + { + code: 6043, + name: "InvalidBundleIndex", + msg: "Bundle index is out of bounds", + }, + { + code: 6044, + name: "BundledPositionAlreadyOpened", + msg: "Position has already been opened", + }, + { + code: 6045, + name: "BundledPositionAlreadyClosed", + msg: "Position has already been closed", + }, + { + code: 6046, + name: "PositionBundleNotDeletable", + msg: "Unable to delete PositionBundle with open positions", + }, + ], +}; diff --git a/solana/ts/tests/00__messages.ts b/solana/ts/tests/00__messages.ts new file mode 100644 index 00000000..61967ac9 --- /dev/null +++ b/solana/ts/tests/00__messages.ts @@ -0,0 +1,132 @@ +import { SYSVAR_CLOCK_PUBKEY, SYSVAR_EPOCH_SCHEDULE_PUBKEY } from "@solana/web3.js"; +import { encoding } from "@wormhole-foundation/sdk-base"; +import { toUniversal } from "@wormhole-foundation/sdk-definitions"; +import { expect } from "chai"; +import { SwapLayerMessage, decodeSwapLayerMessage, encodeSwapLayerMessage } from "../src/swapLayer"; +import { USDC_MINT_ADDRESS } from "@wormhole-foundation/example-liquidity-layer-solana/testing"; + +describe("Swap Layer Messages", () => { + it("USDC Direct", function () { + const encoded = encoding.hex.decode( + "010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0000", + ); + + const decoded = decodeSwapLayerMessage(encoded); + expect(decoded).to.eql({ + recipient: toUniversal("Ethereum", "0x6ca6d1e2d5347bfab1d91e883f1915560e09129d"), + redeemMode: { mode: "Direct" }, + outputToken: { type: "Usdc" }, + } as SwapLayerMessage); + expect(encodeSwapLayerMessage(decoded)).to.eql(encoded); + }); + + it("Ethereum Swap", function () { + const encoded = encoding.hex.decode( + "010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d00010000000000000000000000000000000000000000010001f4015991a2df15a8f6a256d3ec51e99254cd3fb576a90001f4", + ); + + const decoded = decodeSwapLayerMessage(encoded); + expect(decoded).to.eql({ + recipient: toUniversal("Ethereum", "0x6ca6d1e2d5347bfab1d91e883f1915560e09129d"), + redeemMode: { mode: "Direct" }, + outputToken: { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [ + { + address: "0x5991A2dF15A8F6A256D3Ec51E99254Cd3fb576A9", + poolId: 500, + }, + ], + }, + }, + }, + } as SwapLayerMessage); + expect(encodeSwapLayerMessage(decoded)).to.eql(encoded); + }); + + it("USDC Relay", function () { + const encoded = encoding.hex.decode( + "010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d02000000000000000f424000", + ); + + const decoded = decodeSwapLayerMessage(encoded); + expect(decoded).to.eql({ + recipient: toUniversal("Ethereum", "0x6ca6d1e2d5347bfab1d91e883f1915560e09129d"), + redeemMode: { mode: "Relay", gasDropoff: 0, relayingFee: 1000000n }, + outputToken: { type: "Usdc" }, + } as SwapLayerMessage); + expect(encodeSwapLayerMessage(decoded)).to.eql(encoded); + }); + + it("USDC Payload", function () { + const encoded = encoding.hex.decode( + "010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000004deadbeef00", + ); + + const decoded = decodeSwapLayerMessage(encoded); + expect(decoded).to.eql({ + recipient: toUniversal("Ethereum", "0x6ca6d1e2d5347bfab1d91e883f1915560e09129d"), + redeemMode: { mode: "Payload", payload: Buffer.from("deadbeef", "hex") }, + outputToken: { type: "Usdc" }, + } as SwapLayerMessage); + expect(encodeSwapLayerMessage(decoded)).to.eql(encoded); + }); + + it("Jupiter V6 Swap Direct Gas (No Dex)", function () { + const encoded = encoding.hex.decode( + "0106a7d51718c774c928566398691d5eb68b5eb8a39b4b6d5c73555b2100000000000100bc614e0000000000000000000000003b9ac9ff1000", + ); + + const decoded = decodeSwapLayerMessage(encoded); + expect(decoded).to.eql({ + recipient: toUniversal("Solana", SYSVAR_CLOCK_PUBKEY.toBytes()), + redeemMode: { mode: "Direct" }, + outputToken: { + type: "Gas", + swap: { + deadline: 12345678, + limitAmount: 999999999n, + type: { + id: "JupiterV6", + dexProgramId: { isSome: false }, + }, + }, + }, + } as SwapLayerMessage); + expect(encodeSwapLayerMessage(decoded)).to.eql(encoded); + }); + + it("Jupiter V6 Swap Direct Other (Some Dex)", function () { + const encoded = encoding.hex.decode( + "0106a7d51718c774c928566398691d5eb68b5eb8a39b4b6d5c73555b21000000000002c6fa7af3bedbad3a3d65f36aabc97431b1bbe4c2d2f6e0e47ca60203452f5d6100bc614e0000000000000000000000003b9ac9ff100106a7d51718dc3fee02d3e47f0100f8b054f7942e60591e3f508719a805000000", + ); + + const decoded = decodeSwapLayerMessage(encoded); + expect(decoded).to.eql({ + recipient: toUniversal("Solana", SYSVAR_CLOCK_PUBKEY.toBytes()), + redeemMode: { mode: "Direct" }, + outputToken: { + type: "Other", + address: toUniversal("Solana", USDC_MINT_ADDRESS.toBytes()), + swap: { + deadline: 12345678, + limitAmount: 999999999n, + type: { + id: "JupiterV6", + dexProgramId: { + isSome: true, + address: toUniversal("Solana", SYSVAR_EPOCH_SCHEDULE_PUBKEY.toBytes()), + }, + }, + }, + }, + } as SwapLayerMessage); + expect(encodeSwapLayerMessage(decoded)).to.eql(encoded); + }); +}); diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__swapLayer.ts new file mode 100644 index 00000000..a340a269 --- /dev/null +++ b/solana/ts/tests/01__swapLayer.ts @@ -0,0 +1,2463 @@ +import { BN } from "@coral-xyz/anchor"; +import * as splToken from "@solana/spl-token"; +import { + ComputeBudgetProgram, + Connection, + Keypair, + PublicKey, + SystemProgram, + TransactionInstruction, +} from "@solana/web3.js"; +import { CctpTokenBurnMessage } from "@wormhole-foundation/example-liquidity-layer-solana/cctp"; +import { + LiquidityLayerDeposit, + LiquidityLayerMessage, +} from "@wormhole-foundation/example-liquidity-layer-solana/common"; +import { + CircleAttester, + ETHEREUM_USDC_ADDRESS, + LOCALHOST, + MOCK_GUARDIANS, + OWNER_ASSISTANT_KEYPAIR, + OWNER_KEYPAIR, + PAYER_KEYPAIR, + REGISTERED_TOKEN_ROUTERS, + USDC_MINT_ADDRESS, + expectIxErr, + expectIxOk, + getUsdcAtaBalance, + postLiquidityLayerVaa, +} from "@wormhole-foundation/example-liquidity-layer-solana/testing"; +import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; +import { PreparedOrder } from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter/state"; +import { ChainId, toChainId } from "@wormhole-foundation/sdk-base"; +import { UniversalAddress } from "@wormhole-foundation/sdk-definitions"; +import { use as chaiUse, expect } from "chai"; +import { + AddPeerArgs, + Custodian, + Peer, + RelayParams, + SwapLayerProgram, + U32_MAX, + UpdateRelayParametersArgs, + calculateRelayerFee, + denormalizeGasDropOff, + encodeSwapLayerMessage, + localnet, +} from "../src/swapLayer"; +import { + FEE_UPDATER_KEYPAIR, + REGISTERED_PEERS, + createLut, + hackedExpectDeepEqual, + tryNativeToUint8Array, +} from "./helpers"; + +chaiUse(require("chai-as-promised")); + +const SOLANA_CHAIN_ID = toChainId("Solana"); + +describe("Swap Layer", () => { + const connection = new Connection(LOCALHOST, "processed"); + const payer = PAYER_KEYPAIR; + const owner = OWNER_KEYPAIR; + const recipient = Keypair.generate(); + const ownerAssistant = OWNER_ASSISTANT_KEYPAIR; + const feeUpdater = FEE_UPDATER_KEYPAIR; + const feeRecipient = Keypair.generate().publicKey; + const feeRecipientToken = splToken.getAssociatedTokenAddressSync( + USDC_MINT_ADDRESS, + feeRecipient, + ); + const newFeeRecipient = Keypair.generate().publicKey; + + // Sending chain information. + const foreignChain = toChainId("Ethereum"); + const foreignTokenRouterAddress = REGISTERED_TOKEN_ROUTERS["Ethereum"]!; + const foreignSwapLayerAddress = REGISTERED_PEERS["Ethereum"]!; + const foreignRecipientAddress = Array.from( + Buffer.alloc(32, "0000000000000000000000beefdeadCf7178C407aA7369b67CB7edeadbeef", "hex"), + ); + + // Program SDKs + const swapLayer = new SwapLayerProgram(connection, localnet(), USDC_MINT_ADDRESS); + const tokenRouter = new tokenRouterSdk.TokenRouterProgram( + connection, + tokenRouterSdk.localnet(), + USDC_MINT_ADDRESS, + ); + + let tokenRouterLkupTable: PublicKey; + + const relayParamsForTest: RelayParams = { + baseFee: 100000, + nativeTokenPrice: new BN(1000000), + maxGasDropoff: 500000, + gasDropoffMargin: 10000, + executionParams: { + evm: { + gasPrice: 100000, + gasPriceMargin: 10000, + }, + }, + }; + + describe("Admin", () => { + describe("Initialize", () => { + it("Initialize", async () => { + const ix = await swapLayer.initializeIx({ + owner: payer.publicKey, + ownerAssistant: ownerAssistant.publicKey, + feeRecipient: feeRecipient, + feeUpdater: feeUpdater.publicKey, + }); + + await expectIxOk(connection, [ix], [payer]); + + const custodianData = await swapLayer.fetchCustodian(); + + hackedExpectDeepEqual( + custodianData, + new Custodian( + payer.publicKey, + null, + ownerAssistant.publicKey, + feeRecipientToken, + feeUpdater.publicKey, + ), + ); + }); + + before("Set up Token Accounts", async function () { + await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + feeRecipient, + ); + + await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + PublicKey.default, + ); + + await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + SystemProgram.programId, + ); + + await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + recipient.publicKey, + ); + }); + + after("Setup Lookup Table", async function () { + const usdcCommonAccounts = await tokenRouter.commonAccounts(); + + tokenRouterLkupTable = await createLut( + connection, + payer, + Object.values(usdcCommonAccounts).filter((key) => key !== undefined), + ); + }); + + after("Transfer Lamports to Owner and Owner Assistant", async function () { + await expectIxOk( + connection, + [ + SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: owner.publicKey, + lamports: 1000000000, + }), + SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: ownerAssistant.publicKey, + lamports: 1000000000, + }), + SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: feeUpdater.publicKey, + lamports: 1000000000, + }), + ], + [payer], + ); + }); + }); + + describe("Peer Registration", () => { + const startParams: RelayParams = { + baseFee: 200000, + nativeTokenPrice: new BN(4000000), + maxGasDropoff: 200000, + gasDropoffMargin: 50000, + executionParams: { + evm: { + gasPrice: 500000, + gasPriceMargin: 50000, + }, + }, + }; + + describe("Add", () => { + const createAddPeerIx = (opts?: { + ownerOrAssistant?: PublicKey; + args?: AddPeerArgs; + }) => + swapLayer.addPeerIx( + { + ownerOrAssistant: opts?.ownerOrAssistant ?? payer.publicKey, + }, + opts?.args ?? { + chain: foreignChain, + address: foreignRecipientAddress, + relayParams: startParams, + }, + ); + + it("Cannot Add Peer (Only Owner or Assistant)", async () => { + await expectIxErr( + connection, + [await createAddPeerIx({ ownerOrAssistant: feeUpdater.publicKey })], + [feeUpdater], + "OwnerOrAssistantOnly", + ); + }); + + it("Cannot Add Peer (ChainId == 0)", async () => { + await expectIxErr( + connection, + [ + await createAddPeerIx({ + args: { + chain: 0, + address: foreignSwapLayerAddress, + relayParams: startParams, + }, + }), + ], + [payer], + "ChainNotAllowed", + ); + }); + + it("Cannot Add Peer (ChainId == 1)", async () => { + await expectIxErr( + connection, + [ + await createAddPeerIx({ + args: { + chain: SOLANA_CHAIN_ID, + address: foreignSwapLayerAddress, + relayParams: startParams, + }, + }), + ], + [payer], + "ChainNotAllowed", + ); + }); + + it("Cannot Add Peer (InvalidPeer)", async () => { + await expectIxErr( + connection, + [ + await createAddPeerIx({ + args: { + chain: foreignChain, + address: new Array(32).fill(0), + relayParams: startParams, + }, + }), + ], + [payer], + "InvalidPeer", + ); + }); + + it("Cannot Add Peer (Invalid Base Fee)", async () => { + await expectIxErr( + connection, + [ + await createAddPeerIx({ + args: { + chain: foreignChain, + address: foreignSwapLayerAddress, + relayParams: { ...startParams, baseFee: 0 }, + }, + }), + ], + [payer], + "InvalidBaseFee", + ); + }); + + it("Cannot Add Peer (Invalid Native Token Price)", async () => { + await expectIxErr( + connection, + [ + await createAddPeerIx({ + args: { + chain: foreignChain, + address: foreignSwapLayerAddress, + relayParams: { ...startParams, nativeTokenPrice: new BN(0) }, + }, + }), + ], + [payer], + "InvalidNativeTokenPrice", + ); + }); + + it("Cannot Add Peer (Invalid Gas Dropoff Margin)", async () => { + await expectIxErr( + connection, + [ + await createAddPeerIx({ + args: { + chain: foreignChain, + address: foreignSwapLayerAddress, + relayParams: { ...startParams, gasDropoffMargin: 4294967295 }, + }, + }), + ], + [payer], + "InvalidMargin", + ); + }); + + it("Cannot Add Peer (Invalid Gas Price)", async () => { + await expectIxErr( + connection, + [ + await createAddPeerIx({ + args: { + chain: foreignChain, + address: foreignSwapLayerAddress, + relayParams: { + ...startParams, + executionParams: { + evm: { gasPrice: 0, gasPriceMargin: 69 }, + }, + }, + }, + }), + ], + [payer], + "InvalidGasPrice", + ); + }); + + it("Cannot Add Peer (Invalid Gas Price Margin)", async () => { + await expectIxErr( + connection, + [ + await createAddPeerIx({ + args: { + chain: foreignChain, + address: foreignSwapLayerAddress, + relayParams: { + ...startParams, + executionParams: { + evm: { gasPrice: 10000, gasPriceMargin: 4294967295 }, + }, + }, + }, + }), + ], + [payer], + "InvalidMargin", + ); + }); + + it("Add Peer As Owner", async () => { + await expectIxOk(connection, [await createAddPeerIx()], [payer]); + + const peer = await swapLayer.fetchPeer(foreignChain); + hackedExpectDeepEqual( + peer, + new Peer(foreignChain, foreignRecipientAddress, startParams), + ); + }); + }); + + describe("Update", () => { + const createUpdatePeerIx = (opts?: { owner?: PublicKey; args?: AddPeerArgs }) => + swapLayer.updatePeerIx( + { + owner: opts?.owner ?? payer.publicKey, + }, + opts?.args ?? { + chain: foreignChain, + address: foreignSwapLayerAddress, + relayParams: relayParamsForTest, + }, + ); + + it("Cannot Update Peer (Owner Only)", async () => { + expectIxErr( + connection, + [await createUpdatePeerIx({ owner: ownerAssistant.publicKey })], + [ownerAssistant], + "OwnerOnly", + ); + }); + + it("Cannot Update Peer (InvalidPeer)", async () => { + await expectIxErr( + connection, + [ + await createUpdatePeerIx({ + args: { + chain: foreignChain, + address: new Array(32).fill(0), + relayParams: startParams, + }, + }), + ], + [payer], + "InvalidPeer", + ); + }); + + it("Cannot Update Peer (Invalid Base Fee)", async () => { + await expectIxErr( + connection, + [ + await createUpdatePeerIx({ + args: { + chain: foreignChain, + address: foreignSwapLayerAddress, + relayParams: { ...relayParamsForTest, baseFee: 0 }, + }, + }), + ], + [payer], + "InvalidBaseFee", + ); + }); + + it("Cannot Update Peer (Invalid Native Token Price)", async () => { + await expectIxErr( + connection, + [ + await createUpdatePeerIx({ + args: { + chain: foreignChain, + address: foreignSwapLayerAddress, + relayParams: { + ...relayParamsForTest, + nativeTokenPrice: new BN(0), + }, + }, + }), + ], + [payer], + "InvalidNativeTokenPrice", + ); + }); + + it("Cannot Update Peer (Invalid Gas Dropoff Margin)", async () => { + await expectIxErr( + connection, + [ + await createUpdatePeerIx({ + args: { + chain: foreignChain, + address: foreignSwapLayerAddress, + relayParams: { + ...relayParamsForTest, + gasDropoffMargin: 4294967295, + }, + }, + }), + ], + [payer], + "InvalidMargin", + ); + }); + + it("Cannot Update Peer (Invalid Gas Price)", async () => { + await expectIxErr( + connection, + [ + await createUpdatePeerIx({ + args: { + chain: foreignChain, + address: foreignSwapLayerAddress, + relayParams: { + ...relayParamsForTest, + executionParams: { + evm: { gasPrice: 0, gasPriceMargin: 69 }, + }, + }, + }, + }), + ], + [payer], + "InvalidGasPrice", + ); + }); + + it("Cannot Update Peer (Invalid Gas Price Margin)", async () => { + await expectIxErr( + connection, + [ + await createUpdatePeerIx({ + args: { + chain: foreignChain, + address: foreignSwapLayerAddress, + relayParams: { + ...relayParamsForTest, + executionParams: { + evm: { gasPrice: 10000, gasPriceMargin: 4294967295 }, + }, + }, + }, + }), + ], + [payer], + "InvalidMargin", + ); + }); + + it("Update Peer As Owner", async () => { + await expectIxOk(connection, [await createUpdatePeerIx()], [payer]); + + const peer = await swapLayer.fetchPeer(foreignChain); + hackedExpectDeepEqual( + peer, + new Peer(foreignChain, foreignSwapLayerAddress, relayParamsForTest), + ); + }); + }); + }); + + describe("Ownership Transfer Request", async function () { + const createSubmitOwnershipTransferIx = (opts?: { + sender?: PublicKey; + newOwner?: PublicKey; + }) => + swapLayer.submitOwnershipTransferIx({ + owner: opts?.sender ?? owner.publicKey, + newOwner: opts?.newOwner ?? feeUpdater.publicKey, + }); + + const createConfirmOwnershipTransferIx = (opts?: { sender?: PublicKey }) => + swapLayer.confirmOwnershipTransferIx({ + pendingOwner: opts?.sender ?? feeUpdater.publicKey, + }); + + // Instruction to cancel an ownership transfer request. + const createCancelOwnershipTransferIx = (opts?: { sender?: PublicKey }) => + swapLayer.cancelOwnershipTransferIx({ + owner: opts?.sender ?? owner.publicKey, + }); + + it("Submit Ownership Transfer Request as Deployer (Payer)", async function () { + await expectIxOk( + connection, + [ + await createSubmitOwnershipTransferIx({ + sender: payer.publicKey, + newOwner: owner.publicKey, + }), + ], + [payer], + ); + + // Confirm that the pending owner variable is set in the owner config. + const custodianData = await swapLayer.fetchCustodian(); + + hackedExpectDeepEqual(custodianData.pendingOwner, owner.publicKey); + }); + + it("Confirm Ownership Transfer Request as Pending Owner", async function () { + await expectIxOk( + connection, + [await createConfirmOwnershipTransferIx({ sender: owner.publicKey })], + [payer, owner], + ); + + // Confirm that the custodian reflects the current ownership status. + { + const custodianData = await swapLayer.fetchCustodian(); + hackedExpectDeepEqual(custodianData.owner, owner.publicKey); + hackedExpectDeepEqual(custodianData.pendingOwner, null); + } + }); + + it("Cannot Submit Ownership Transfer Request (New Owner == Address(0))", async function () { + await expectIxErr( + connection, + [ + await createSubmitOwnershipTransferIx({ + newOwner: PublicKey.default, + }), + ], + [payer, owner], + "InvalidNewOwner", + ); + }); + + it("Cannot Submit Ownership Transfer Request (New Owner == Owner)", async function () { + await expectIxErr( + connection, + [ + await createSubmitOwnershipTransferIx({ + newOwner: owner.publicKey, + }), + ], + [payer, owner], + "AlreadyOwner", + ); + }); + + it("Cannot Submit Ownership Transfer Request as Non-Owner", async function () { + await expectIxErr( + connection, + [ + await createSubmitOwnershipTransferIx({ + sender: ownerAssistant.publicKey, + }), + ], + [payer, ownerAssistant], + "OwnerOnly", + ); + }); + + it("Submit Ownership Transfer Request as Owner", async function () { + await expectIxOk( + connection, + [await createSubmitOwnershipTransferIx()], + [payer, owner], + ); + + // Confirm that the pending owner variable is set in the owner config. + const custodianData = await swapLayer.fetchCustodian(); + expect(custodianData.pendingOwner).to.eql(feeUpdater.publicKey); + }); + + it("Cannot Confirm Ownership Transfer Request as Non Pending Owner", async function () { + await expectIxErr( + connection, + [ + await createConfirmOwnershipTransferIx({ + sender: ownerAssistant.publicKey, + }), + ], + [payer, ownerAssistant], + "NotPendingOwner", + ); + }); + + it("Confirm Ownership Transfer Request as Pending Owner", async function () { + await expectIxOk( + connection, + [await createConfirmOwnershipTransferIx()], + [payer, feeUpdater], + ); + + // Confirm that the custodian reflects the current ownership status. + { + const custodianData = await swapLayer.fetchCustodian(); + hackedExpectDeepEqual(custodianData.owner, feeUpdater.publicKey); + hackedExpectDeepEqual(custodianData.pendingOwner, null); + } + + // Set the owner back to the payer key. + await expectIxOk( + connection, + [ + await createSubmitOwnershipTransferIx({ + sender: feeUpdater.publicKey, + newOwner: owner.publicKey, + }), + ], + [payer, feeUpdater], + ); + + await expectIxOk( + connection, + [await createConfirmOwnershipTransferIx({ sender: owner.publicKey })], + [payer, owner], + ); + + // Confirm that the payer is the owner again. + { + const custodianData = await swapLayer.fetchCustodian(); + hackedExpectDeepEqual(custodianData.owner, owner.publicKey); + hackedExpectDeepEqual(custodianData.pendingOwner, null); + } + }); + + it("Cannot Cancel Ownership Request as Non-Owner", async function () { + // First, submit the ownership transfer request. + await expectIxOk( + connection, + [await createSubmitOwnershipTransferIx()], + [payer, owner], + ); + + // Confirm that the pending owner variable is set in the owner config. + { + const custodianData = await swapLayer.fetchCustodian(); + expect(custodianData.pendingOwner).to.eql(feeUpdater.publicKey); + } + + // Confirm that the cancel ownership transfer request fails. + await expectIxErr( + connection, + [await createCancelOwnershipTransferIx({ sender: ownerAssistant.publicKey })], + [payer, ownerAssistant], + "OwnerOnly", + ); + }); + + it("Cancel Ownership Request as Owner", async function () { + await expectIxOk( + connection, + [await createCancelOwnershipTransferIx()], + [payer, owner], + ); + + // Confirm the pending owner field was reset. + const custodianData = await swapLayer.fetchCustodian(); + expect(custodianData.pendingOwner).to.eql(null); + }); + }); + + describe("Update Owner Assistant", async function () { + // Create the update owner assistant instruction. + const createUpdateOwnerAssistantIx = (opts?: { + sender?: PublicKey; + newAssistant?: PublicKey; + }) => + swapLayer.updateOwnerAssistantIx({ + owner: opts?.sender ?? owner.publicKey, + newOwnerAssistant: opts?.newAssistant ?? feeUpdater.publicKey, + }); + + it("Cannot Update Assistant (New Assistant == Address(0))", async function () { + await expectIxErr( + connection, + [await createUpdateOwnerAssistantIx({ newAssistant: PublicKey.default })], + [payer, owner], + "AssistantZeroPubkey", + ); + }); + + it("Cannot Update Assistant as Non-Owner", async function () { + await expectIxErr( + connection, + [await createUpdateOwnerAssistantIx({ sender: ownerAssistant.publicKey })], + [payer, ownerAssistant], + "OwnerOnly", + ); + }); + + it("Update Assistant as Owner", async function () { + await expectIxOk( + connection, + [await createUpdateOwnerAssistantIx()], + [payer, owner], + ); + + // Confirm the assistant field was updated. + const custodianData = await swapLayer.fetchCustodian(); + expect(custodianData.ownerAssistant).to.eql(feeUpdater.publicKey); + + // Set the assistant back to the assistant key. + await expectIxOk( + connection, + [ + await createUpdateOwnerAssistantIx({ + newAssistant: ownerAssistant.publicKey, + }), + ], + [payer, owner], + ); + }); + }); + + describe("Update Fee Updater", async function () { + // Create the update owner assistant instruction. + const createUpdateFeeUpdaterIx = (opts?: { + sender?: PublicKey; + newFeeUpdater?: PublicKey; + }) => + swapLayer.updateFeeUpdaterIx({ + ownerOrAssistant: opts?.sender ?? owner.publicKey, + newFeeUpdater: opts?.newFeeUpdater ?? feeRecipient, + }); + + it("Cannot Update Fee Updater (New Fee Updater == Address(0))", async function () { + await expectIxErr( + connection, + [await createUpdateFeeUpdaterIx({ newFeeUpdater: PublicKey.default })], + [payer, owner], + "FeeUpdaterZeroPubkey", + ); + }); + + it("Cannot Update Fee Updater Without Owner or Assistant", async function () { + await expectIxErr( + connection, + [await createUpdateFeeUpdaterIx({ sender: payer.publicKey })], + [payer], + "OwnerOrAssistantOnly", + ); + }); + + it("Update Fee Updater as Owner", async function () { + await expectIxOk(connection, [await createUpdateFeeUpdaterIx()], [payer, owner]); + + // Confirm the fee updater field was updated. + const custodianData = await swapLayer.fetchCustodian(); + hackedExpectDeepEqual(custodianData.feeRecipientToken, feeRecipientToken); + + // Revert back to original fee updater. + await expectIxOk( + connection, + [ + await createUpdateFeeUpdaterIx({ + newFeeUpdater: feeUpdater.publicKey, + }), + ], + [payer, owner], + ); + }); + }); + + describe("Update Fee Recipient", async function () { + const localVariables = new Map(); + + it("Cannot Update Fee Recipient with Non-Existent ATA", async function () { + const ix = await swapLayer.updateFeeRecipientIx({ + ownerOrAssistant: ownerAssistant.publicKey, + newFeeRecipient, + }); + + await expectIxErr( + connection, + [ix], + [ownerAssistant], + "new_fee_recipient_token. Error Code: AccountNotInitialized", + ); + + localVariables.set("ix", ix); + }); + + it("Update Fee Recipient as Owner Assistant", async function () { + const ix = localVariables.get("ix") as TransactionInstruction; + expect(localVariables.delete("ix")).is.true; + + await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + newFeeRecipient, + ); + + await expectIxOk(connection, [ix], [ownerAssistant]); + + const custodianData = await swapLayer.fetchCustodian(); + expect(custodianData.feeRecipientToken).to.eql( + splToken.getAssociatedTokenAddressSync(USDC_MINT_ADDRESS, newFeeRecipient), + ); + }); + + it("Cannot Update Fee Recipient without Owner or Assistant", async function () { + const ix = await swapLayer.updateFeeRecipientIx({ + ownerOrAssistant: payer.publicKey, + newFeeRecipient: feeRecipient, + }); + + await expectIxErr(connection, [ix], [payer], "Error Code: OwnerOrAssistantOnly"); + }); + + it("Cannot Update Fee Recipient to Default Pubkey", async function () { + const ix = await swapLayer.updateFeeRecipientIx({ + ownerOrAssistant: ownerAssistant.publicKey, + newFeeRecipient: PublicKey.default, + }); + + await expectIxErr(connection, [ix], [ownerAssistant], "FeeRecipientZeroPubkey"); + }); + + it("Update Fee Recipient as Owner", async function () { + const ix = await swapLayer.updateFeeRecipientIx({ + ownerOrAssistant: owner.publicKey, + newFeeRecipient: feeRecipient, + }); + await expectIxOk(connection, [ix], [owner]); + + const custodianData = await swapLayer.fetchCustodian(); + expect(custodianData.feeRecipientToken).to.eql(feeRecipientToken); + }); + }); + + describe("Update Relay Parameters", () => { + const updateParams: RelayParams = { + baseFee: 200000, + nativeTokenPrice: new BN(4000000), + maxGasDropoff: 200000, + gasDropoffMargin: 50000, + executionParams: { + evm: { + gasPrice: 500000, + gasPriceMargin: 50000, + }, + }, + }; + + const createUpdateRelayParamsIx = (opts?: { + feeUpdater?: PublicKey; + args?: UpdateRelayParametersArgs; + }) => + swapLayer.updateRelayParamsIx( + { + feeUpdater: opts?.feeUpdater ?? feeUpdater.publicKey, + }, + opts?.args ?? { + chain: foreignChain, + relayParams: updateParams, + }, + ); + + it("Cannot Update Relay Parameters (Invalid Fee Updater)", async () => { + await expectIxErr( + connection, + [await createUpdateRelayParamsIx({ feeUpdater: payer.publicKey })], + [payer], + "InvalidFeeUpdater", + ); + }); + + it("Cannot Update Relay Parameters (Invalid Base Fee)", async () => { + await expectIxErr( + connection, + [ + await createUpdateRelayParamsIx({ + args: { + chain: foreignChain, + relayParams: { ...updateParams, baseFee: 0 }, + }, + }), + ], + [feeUpdater], + "InvalidBaseFee", + ); + }); + + it("Cannot Update Relay Parameters (Invalid Native Token Price)", async () => { + await expectIxErr( + connection, + [ + await createUpdateRelayParamsIx({ + args: { + chain: foreignChain, + relayParams: { ...updateParams, nativeTokenPrice: new BN(0) }, + }, + }), + ], + [feeUpdater], + "InvalidNativeTokenPrice", + ); + }); + + it("Cannot Update Relay Parameters (Invalid Gas Dropoff Margin)", async () => { + await expectIxErr( + connection, + [ + await createUpdateRelayParamsIx({ + args: { + chain: foreignChain, + relayParams: { ...updateParams, gasDropoffMargin: 4294967295 }, + }, + }), + ], + [feeUpdater], + "InvalidMargin", + ); + }); + + it("Cannot Update Relay Parameters (Invalid Gas Price)", async () => { + await expectIxErr( + connection, + [ + await createUpdateRelayParamsIx({ + args: { + chain: foreignChain, + relayParams: { + ...updateParams, + executionParams: { evm: { gasPrice: 0, gasPriceMargin: 69 } }, + }, + }, + }), + ], + [feeUpdater], + "InvalidGasPrice", + ); + }); + + it("Cannot Update Relay Parameters (Invalid Gas Price Margin)", async () => { + await expectIxErr( + connection, + [ + await createUpdateRelayParamsIx({ + args: { + chain: foreignChain, + relayParams: { + ...updateParams, + executionParams: { + evm: { gasPrice: 10000, gasPriceMargin: 4294967295 }, + }, + }, + }, + }), + ], + [feeUpdater], + "InvalidMargin", + ); + }); + + it("Update Relay Parameters as Owner", async () => { + let relayParams = { + ...relayParamsForTest, + baseFee: 69, + }; + await expectIxOk( + connection, + [ + await createUpdateRelayParamsIx({ + feeUpdater: owner.publicKey, + args: { + chain: foreignChain, + relayParams, + }, + }), + ], + [owner], + ); + + const peer = await swapLayer.fetchPeer(foreignChain); + hackedExpectDeepEqual(peer.relayParams, relayParams); + }); + + it("Update Relay Parameters as Owner Assistant", async () => { + let relayParams = { + ...relayParamsForTest, + baseFee: 690, + }; + await expectIxOk( + connection, + [ + await createUpdateRelayParamsIx({ + feeUpdater: owner.publicKey, + args: { + chain: foreignChain, + relayParams, + }, + }), + ], + [owner], + ); + + const peer = await swapLayer.fetchPeer(foreignChain); + hackedExpectDeepEqual(peer.relayParams, relayParams); + }); + + it("Update Relay Parameters as Fee Updater", async () => { + let relayParams = { + ...relayParamsForTest, + }; + await expectIxOk( + connection, + [ + await createUpdateRelayParamsIx({ + feeUpdater: owner.publicKey, + args: { + chain: foreignChain, + relayParams, + }, + }), + ], + [owner], + ); + + const peer = await swapLayer.fetchPeer(foreignChain); + hackedExpectDeepEqual(peer.relayParams, relayParams); + }); + }); + }); + + describe("Business Logic", function () { + let testCctpNonce = 2n ** 64n - 20n * 6400n; + + let wormholeSequence = 2000n; + describe("USDC Transfer (Relay)", function () { + describe("Outbound", function () { + it("Cannot Initiate Transfer (Invalid Prepared Order)", async function () { + const amountIn = 6900000000n; + const gasDropoff = 100000; + const maxRelayerFee = 9999999999999; + + // Pass the payer key as the prepared order. + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: payer.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: foreignChain, + relayOptions: { + gasDropoff: gasDropoff, + maxRelayerFee: new BN(maxRelayerFee), + }, + recipient: foreignRecipientAddress, + }, + ); + + await expectIxErr(connection, [ix], [payer], "InvalidPreparedOrder"); + }); + + it("Cannot Initiate Transfer (Invalid Peer)", async function () { + const amountIn = 6900000000n; + const gasDropoff = 100000; + const maxRelayerFee = 9999999999999; + const invalidChain = 69; + + const preparedOrder = Keypair.generate(); + + // Pass the payer key as the prepared order. + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: invalidChain, + relayOptions: { + gasDropoff: gasDropoff, + maxRelayerFee: new BN(maxRelayerFee), + }, + recipient: foreignRecipientAddress, + }, + ); + + await expectIxErr( + connection, + [ix], + [payer, preparedOrder], + "AccountNotInitialized", + ); + }); + + it("Cannot Initiate Transfer (Invalid Recipient)", async function () { + const amountIn = 6900000000n; + const gasDropoff = 100000; + const maxRelayerFee = 9999999999999; + + const preparedOrder = Keypair.generate(); + + // Pass the payer key as the prepared order. + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: foreignChain, + relayOptions: { + gasDropoff: gasDropoff, + maxRelayerFee: new BN(maxRelayerFee), + }, + recipient: new Array(32).fill(0), + }, + ); + + await expectIxErr(connection, [ix], [payer, preparedOrder], "InvalidRecipient"); + }); + + it("Cannot Initiate Transfer (Max Relayer Fee Exceeded)", async function () { + const amountIn = 6900000000n; + const gasDropoff = 100000; + + // Set the max relayer fee to the minimum. + const maxRelayerFee = 1; + + const preparedOrder = Keypair.generate(); + + // Pass the payer key as the prepared order. + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: foreignChain, + relayOptions: { + gasDropoff: gasDropoff, + maxRelayerFee: new BN(maxRelayerFee), + }, + recipient: foreignRecipientAddress, + }, + ); + + await expectIxErr( + connection, + [ix], + [payer, preparedOrder], + "ExceedsMaxRelayingFee", + ); + }); + + it("Cannot Initiate Transfer (Relaying Disabled)", async function () { + const amountIn = 6900000000n; + const gasDropoff = 100000; + const maxRelayerFee = 9999999999999; + + // Update the relay parameters to disable relaying. + await updateRelayParamsForTest( + swapLayer, + foreignChain, + { + ...relayParamsForTest, + baseFee: U32_MAX, + }, + feeUpdater, + ); + + const preparedOrder = Keypair.generate(); + + // Pass the payer key as the prepared order. + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: foreignChain, + relayOptions: { + gasDropoff: gasDropoff, + maxRelayerFee: new BN(maxRelayerFee), + }, + recipient: foreignRecipientAddress, + }, + ); + + await expectIxErr(connection, [ix], [payer, preparedOrder], "RelayingDisabled"); + + // Set the relay parameters back to the original. + await updateRelayParamsForTest( + swapLayer, + foreignChain, + relayParamsForTest, + feeUpdater, + ); + }); + + it("Cannot Initiate Transfer (Invalid Gas Dropoff)", async function () { + const amountIn = 6900000000n; + const maxRelayerFee = 9999999999999; + + // Set the gas dropoff to a value larger than the max. + const gasDropoff = relayParamsForTest.maxGasDropoff + 1; + + const preparedOrder = Keypair.generate(); + + // Pass the payer key as the prepared order. + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: foreignChain, + relayOptions: { + gasDropoff: gasDropoff, + maxRelayerFee: new BN(maxRelayerFee), + }, + recipient: foreignRecipientAddress, + }, + ); + + await expectIxErr( + connection, + [ix], + [payer, preparedOrder], + "InvalidGasDropoff", + ); + }); + + it("Initiate Transfer With Gas Dropoff", async function () { + const amountIn = 6900000000n; + const gasDropoff = 100000; + const maxRelayerFee = 9999999999999; + + // Fetch peer data. + const peer = await swapLayer.fetchPeer(foreignChain); + + const expectedRelayerFee = calculateRelayerFee( + peer.relayParams, + denormalizeGasDropOff(gasDropoff), + { none: {} }, + 0, + ); + + // Balance check. + const payerToken = await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + payer.publicKey, + ); + const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); + + const preparedOrder = Keypair.generate(); + + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: foreignChain, + relayOptions: { + gasDropoff: gasDropoff, + maxRelayerFee: new BN(maxRelayerFee), + }, + recipient: foreignRecipientAddress, + }, + ); + + await expectIxOk(connection, [ix], [payer, preparedOrder]); + + // Balance check. + const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); + expect(payerAfter).to.equal(payerBefore - amountIn - expectedRelayerFee); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder( + preparedOrder.publicKey, + ); + + const { + info: { preparedCustodyTokenBump }, + } = preparedOrderData; + + hackedExpectDeepEqual( + preparedOrderData, + new PreparedOrder( + { + orderSender: payer.publicKey, + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, + }, + srcToken: payerToken.address, + refundToken: payerToken.address, + targetChain: foreignChain, + redeemer: foreignSwapLayerAddress, + preparedCustodyTokenBump, + }, + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + Uint8Array.from(foreignRecipientAddress), + ), + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee: expectedRelayerFee, + }, + outputToken: { type: "Usdc" }, + }), + ), + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), + ); + expect(preparedCustodyTokenBalance).equals(amountIn + expectedRelayerFee); + }); + + it("Initiate Transfer Without Gas Dropoff", async function () { + const amountIn = 6900000000n; + const gasDropoff = 0; + const maxRelayerFee = 9999999999999; + + // Fetch peer data. + const peer = await swapLayer.fetchPeer(foreignChain); + + const expectedRelayerFee = calculateRelayerFee( + peer.relayParams, + denormalizeGasDropOff(gasDropoff), + { none: {} }, + 0, + ); + + // Balance check. + const payerToken = await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + payer.publicKey, + ); + const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); + + const preparedOrder = Keypair.generate(); + + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: foreignChain, + relayOptions: { + gasDropoff: gasDropoff, + maxRelayerFee: new BN(maxRelayerFee), + }, + recipient: foreignRecipientAddress, + }, + ); + + await expectIxOk(connection, [ix], [payer, preparedOrder]); + + // Balance check. + const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); + expect(payerAfter).to.equal(payerBefore - amountIn - expectedRelayerFee); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder( + preparedOrder.publicKey, + ); + + const { + info: { preparedCustodyTokenBump }, + } = preparedOrderData; + + hackedExpectDeepEqual( + preparedOrderData, + new PreparedOrder( + { + orderSender: payer.publicKey, + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, + }, + srcToken: payerToken.address, + refundToken: payerToken.address, + targetChain: foreignChain, + redeemer: foreignSwapLayerAddress, + preparedCustodyTokenBump, + }, + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + Uint8Array.from(foreignRecipientAddress), + ), + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee: expectedRelayerFee, + }, + outputToken: { type: "Usdc" }, + }), + ), + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), + ); + expect(preparedCustodyTokenBalance).equals(amountIn + expectedRelayerFee); + }); + }); + + describe("Inbound", function () { + it("Cannot Complete Transfer (Invalid Fee Recipient)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress(payer.publicKey.toString(), "base58"), + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 6900n, + }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + // Pass the payer token to as the fee recipient token. + const payerToken = await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + payer.publicKey, + ); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + preparedFill, + recipient: payer.publicKey, + feeRecipientToken: payerToken.address, + }, + foreignChain, + ); + + await expectIxErr( + connection, + [transferIx], + [payer], + "fee_recipient_token. Error Code: ConstraintAddress", + ); + }); + + it("Cannot Complete Transfer (Peer Doesn't Exist)", async function () { + const invalidChain = 69; + + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress(payer.publicKey.toString(), "base58"), + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 6900n, + }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + preparedFill, + recipient: payer.publicKey, + }, + invalidChain as ChainId, + ); + + await expectIxErr(connection, [transferIx], [payer], "AccountNotInitialized"); + }); + + it("Cannot Complete Transfer (Invalid Swap Message)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + Buffer.from("invalid message"), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + preparedFill, + recipient: payer.publicKey, + }, + foreignChain, + ); + + await expectIxErr(connection, [transferIx], [payer], "InvalidSwapMessage"); + }); + + it("Cannot Complete Transfer (Invalid Peer)", async function () { + // Create a valid transfer but from the wrong sender. + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + Array.from( + Buffer.alloc( + 32, + "00000000000000000000000000000000000000000000000000000000deadbeef", + "hex", + ), + ), // Invalid Address. + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress(payer.publicKey.toString(), "base58"), + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 6900n, + }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + preparedFill, + recipient: payer.publicKey, + }, + foreignChain, + ); + + await expectIxErr(connection, [transferIx], [payer], "InvalidPeer"); + }); + + it.skip("Cannot Complete Transfer (InvalidOutputToken)", async function () { + // TODO: Need to use encoded swaptype for this test. + }); + + it("Cannot Complete Transfer (Invalid Recipient)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress(payer.publicKey.toString(), "base58"), + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 6900n, + }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + preparedFill, + recipient: feeRecipient, // Invalid recipient + }, + foreignChain, + ); + + await expectIxErr(connection, [transferIx], [payer], "InvalidRecipient"); + }); + + it("Cannot Complete Transfer (Invalid Redeem Mode)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress(payer.publicKey.toString(), "base58"), + redeemMode: { mode: "Direct" }, + outputToken: { type: "Usdc" }, + }), // Encode Direct instead of Relay. + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + preparedFill, + recipient: payer.publicKey, + }, + foreignChain, + ); + + await expectIxErr(connection, [transferIx], [payer], "InvalidRedeemMode"); + }); + + it("Complete Transfer (Payer == Recipient)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress(payer.publicKey.toString(), "base58"), + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 6900n, + }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa, message } = result!; + + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); + + // Balance check. + const recipientBefore = await getUsdcAtaBalance(connection, payer.publicKey); + const payerLamportBefore = await connection.getBalance(payer.publicKey); + const feeRecipientBefore = await getUsdcAtaBalance(connection, feeRecipient); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + recipient: payer.publicKey, + }, + foreignChain, + ); + + await expectIxOk(connection, [transferIx], [payer]); + + // Balance check. + const recipientAfter = await getUsdcAtaBalance(connection, payer.publicKey); + const payerLamportAfter = await connection.getBalance(payer.publicKey); + const feeRecipientAfter = await getUsdcAtaBalance(connection, feeRecipient); + + expect(recipientAfter).to.equal( + recipientBefore + message.deposit!.header.amount, + ); + expect(payerLamportAfter).to.be.lessThan(payerLamportBefore); + expect(feeRecipientAfter).to.equal(feeRecipientBefore); + }); + + it("Complete Transfer With Gas Dropoff", async function () { + const relayerFee = 1000000n; + const gasAmountDenorm = 690000000; + + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { + mode: "Relay", + gasDropoff: gasAmountDenorm / 1000, + relayingFee: relayerFee, + }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa, message } = result!; + + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); + + // Balance check. + const recipientBefore = await getUsdcAtaBalance( + connection, + recipient.publicKey, + ); + const recipientLamportBefore = await connection.getBalance(recipient.publicKey); + const payerLamportBefore = await connection.getBalance(payer.publicKey); + const feeRecipientBefore = await getUsdcAtaBalance(connection, feeRecipient); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + recipient: recipient.publicKey, + }, + foreignChain, + ); + + await expectIxOk(connection, [transferIx], [payer]); + + // Balance check. + const recipientAfter = await getUsdcAtaBalance(connection, recipient.publicKey); + const recipientLamportAfter = await connection.getBalance(recipient.publicKey); + const payerLamportAfter = await connection.getBalance(payer.publicKey); + const feeRecipientAfter = await getUsdcAtaBalance(connection, feeRecipient); + + expect(recipientAfter - recipientBefore).to.equal( + message.deposit!.header.amount - relayerFee, + ); + expect(recipientLamportAfter - recipientLamportBefore).to.equal( + Number(gasAmountDenorm), + ); + expect(payerLamportAfter).to.be.lessThan( + payerLamportBefore - Number(gasAmountDenorm), + ); + expect(feeRecipientAfter).to.equal(feeRecipientBefore + relayerFee); + }); + + it("Complete Transfer Without Gas Dropoff", async function () { + const relayerFee = 1000000n; + const gasAmount = 0; + + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { + mode: "Relay", + gasDropoff: gasAmount, + relayingFee: relayerFee, + }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa, message } = result!; + + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); + + // Balance check. + const recipientBefore = await getUsdcAtaBalance( + connection, + recipient.publicKey, + ); + const recipientLamportBefore = await connection.getBalance(recipient.publicKey); + const payerLamportBefore = await connection.getBalance(payer.publicKey); + const feeRecipientBefore = await getUsdcAtaBalance(connection, feeRecipient); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + recipient: recipient.publicKey, + }, + foreignChain, + ); + + await expectIxOk(connection, [transferIx], [payer]); + + // Balance check. + const recipientAfter = await getUsdcAtaBalance(connection, recipient.publicKey); + const recipientLamportAfter = await connection.getBalance(recipient.publicKey); + const payerLamportAfter = await connection.getBalance(payer.publicKey); + const feeRecipientAfter = await getUsdcAtaBalance(connection, feeRecipient); + + expect(recipientAfter - recipientBefore).to.equal( + message.deposit!.header.amount - relayerFee, + ); + expect(recipientLamportAfter - recipientLamportBefore).to.equal( + Number(gasAmount), + ); + expect(payerLamportAfter).to.be.lessThan( + payerLamportBefore - Number(gasAmount), + ); + expect(feeRecipientAfter).to.equal(feeRecipientBefore + relayerFee); + }); + }); + }); + + describe("USDC Transfer (Direct)", function () { + describe("Outbound", function () { + it("Initiate Transfer", async function () { + const amountIn = 6900000000n; + + // Balance check. + const payerToken = await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + payer.publicKey, + ); + const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); + + const preparedOrder = Keypair.generate(); + + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: foreignChain, + relayOptions: null, + recipient: foreignRecipientAddress, + }, + ); + + await expectIxOk(connection, [ix], [payer, preparedOrder]); + + // Balance check. + const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); + expect(payerAfter).to.equal(payerBefore - amountIn); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder( + preparedOrder.publicKey, + ); + + const { + info: { preparedCustodyTokenBump }, + } = preparedOrderData; + + hackedExpectDeepEqual( + preparedOrderData, + new PreparedOrder( + { + orderSender: payer.publicKey, + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, + }, + srcToken: payerToken.address, + refundToken: payerToken.address, + targetChain: foreignChain, + redeemer: foreignSwapLayerAddress, + preparedCustodyTokenBump, + }, + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + Uint8Array.from(foreignRecipientAddress), + ), + redeemMode: { mode: "Direct" }, + outputToken: { type: "Usdc" }, + }), + ), + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), + ); + expect(preparedCustodyTokenBalance).equals(amountIn); + }); + }); + + describe("Inbound", function () { + it("Cannot Complete Transfer (Invalid Swap Message)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + Buffer.from("invalid message"), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferDirectIx( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient.publicKey, + }, + foreignChain, + ); + + await expectIxErr(connection, [transferIx], [payer], "InvalidSwapMessage"); + }); + + it("Cannot Complete Transfer (Invalid Peer)", async function () { + // Create a valid transfer but from the wrong sender. + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + Array.from( + Buffer.alloc( + 32, + "00000000000000000000000000000000000000000000000000000000deadbeef", + "hex", + ), + ), // Invalid Address., + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { mode: "Direct" }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferDirectIx( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient.publicKey, + }, + foreignChain, + ); + + await expectIxErr(connection, [transferIx], [payer], "InvalidPeer"); + }); + + it("Cannot Complete Transfer (Peer Doesn't Exist)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { mode: "Direct" }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferDirectIx( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient.publicKey, + }, + 69 as ChainId, // Invalid chain. + ); + + await expectIxErr(connection, [transferIx], [payer], "AccountNotInitialized"); + }); + + it("Cannot Complete Transfer (Invalid Recipient)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { mode: "Direct" }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferDirectIx( + { + payer: payer.publicKey, + preparedFill, + recipient: payer.publicKey, // Pass invalid recipient. + }, + foreignChain, + ); + + await expectIxErr(connection, [transferIx], [payer], "InvalidRecipient"); + }); + + it.skip("Cannot Complete Transfer (InvalidOutputToken)", async function () { + // TODO: Need to use encoded swaptype for this test. + }); + + it("Complete Transfer (Recipient Not Payer)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { mode: "Direct" }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa, message } = result!; + + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); + + // Balance check. + const recipientBefore = await getUsdcAtaBalance( + connection, + recipient.publicKey, + ); + const beneficiaryBefore = await connection.getBalance(beneficiary.publicKey); + + const transferIx = await swapLayer.completeTransferDirectIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + recipient: recipient.publicKey, + }, + foreignChain, + ); + + await expectIxOk(connection, [transferIx], [payer]); + + // Balance check. + const recipientAfter = await getUsdcAtaBalance(connection, recipient.publicKey); + const beneficiaryAfter = await connection.getBalance(beneficiary.publicKey); + + expect(recipientAfter).to.equal( + recipientBefore + message.deposit!.header.amount, + ); + expect(beneficiaryAfter).to.be.greaterThan(beneficiaryBefore); + }); + + it("Complete Transfer (Recipient Is Payer)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress(payer.publicKey.toString(), "base58"), + redeemMode: { mode: "Direct" }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa, message } = result!; + + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); + + // Balance check. + const recipientBefore = await getUsdcAtaBalance(connection, payer.publicKey); + const beneficiaryBefore = await connection.getBalance(beneficiary.publicKey); + + const transferIx = await swapLayer.completeTransferDirectIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + }, + foreignChain, + ); + + await expectIxOk(connection, [transferIx], [payer]); + + // Balance check. + const recipientAfter = await getUsdcAtaBalance(connection, payer.publicKey); + const beneficiaryAfter = await connection.getBalance(beneficiary.publicKey); + + expect(recipientAfter).to.equal( + recipientBefore + message.deposit!.header.amount, + ); + expect(beneficiaryAfter).to.be.greaterThan(beneficiaryBefore); + }); + }); + }); + + describe("Jupiter V6 Swap", function () { + // TODO + + before("Not Paused", async function () { + const custodian = await tokenRouter.fetchCustodian(); + expect(custodian.paused).is.false; + }); + }); + }); +}); + +async function createAndRedeemCctpFillForTest( + connection: Connection, + tokenRouter: tokenRouterSdk.TokenRouterProgram, + swapLayer: SwapLayerProgram, + tokenRouterLkupTable: PublicKey, + payer: Keypair, + cctpNonce: bigint, + foreignChain: number, + foreignEndpointAddress: number[], + orderSender: number[], + wormholeSequence: bigint, + redeemerMessage: Buffer | Uint8Array, +): Promise { + const encodedMintRecipient = Array.from(tokenRouter.cctpMintRecipientAddress().toBuffer()); + const sourceCctpDomain = 0; + const amount = 6900000000n; + const burnSource = Array.from(Buffer.alloc(32, "beefdead", "hex")); + const redeemer = swapLayer.custodianAddress(); + + // Concoct a Circle message. + const { destinationCctpDomain, burnMessage, encodedCctpMessage, cctpAttestation } = + await craftCctpTokenBurnMessage( + tokenRouter, + sourceCctpDomain, + cctpNonce, + encodedMintRecipient, + amount, + burnSource, + ); + + const message = new LiquidityLayerMessage({ + deposit: new LiquidityLayerDeposit( + { + tokenAddress: burnMessage.burnTokenAddress, + amount, + sourceCctpDomain, + destinationCctpDomain, + cctpNonce, + burnSource, + mintRecipient: encodedMintRecipient, + }, + { + fill: { + sourceChain: foreignChain as ChainId, + orderSender, + redeemer: Array.from(redeemer.toBuffer()), + redeemerMessage: Buffer.from(redeemerMessage), + }, + }, + ), + }); + + const vaa = await postLiquidityLayerVaa( + connection, + payer, + MOCK_GUARDIANS, + foreignEndpointAddress, + wormholeSequence++, + message, + { sourceChain: "Ethereum" }, + ); + + const ix = await tokenRouter.redeemCctpFillIx( + { + payer: payer.publicKey, + vaa, + }, + { + encodedCctpMessage, + cctpAttestation, + }, + ); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 300_000, + }); + + const { value: lookupTableAccount } = + await connection.getAddressLookupTable(tokenRouterLkupTable); + + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts: [lookupTableAccount!], + }); + + return { vaa, message }; +} + +async function craftCctpTokenBurnMessage( + tokenRouter: tokenRouterSdk.TokenRouterProgram, + sourceCctpDomain: number, + cctpNonce: bigint, + encodedMintRecipient: number[], + amount: bigint, + burnSource: number[], + overrides: { destinationCctpDomain?: number } = {}, +) { + const { destinationCctpDomain: inputDestinationCctpDomain } = overrides; + + const messageTransmitterProgram = tokenRouter.messageTransmitterProgram(); + const { version, localDomain } = await messageTransmitterProgram.fetchMessageTransmitterConfig( + messageTransmitterProgram.messageTransmitterConfigAddress(), + ); + const destinationCctpDomain = inputDestinationCctpDomain ?? localDomain; + + const tokenMessengerMinterProgram = tokenRouter.tokenMessengerMinterProgram(); + const { tokenMessenger: sourceTokenMessenger } = + await tokenMessengerMinterProgram.fetchRemoteTokenMessenger( + tokenMessengerMinterProgram.remoteTokenMessengerAddress(sourceCctpDomain), + ); + + const burnMessage = new CctpTokenBurnMessage( + { + version, + sourceDomain: sourceCctpDomain, + destinationDomain: destinationCctpDomain, + nonce: cctpNonce, + sender: sourceTokenMessenger, + recipient: Array.from(tokenMessengerMinterProgram.ID.toBuffer()), // targetTokenMessenger + targetCaller: Array.from(tokenRouter.custodianAddress().toBuffer()), // targetCaller + }, + 0, + Array.from(tryNativeToUint8Array(ETHEREUM_USDC_ADDRESS, "Ethereum")), // sourceTokenAddress + encodedMintRecipient, + amount, + burnSource, + ); + + const encodedCctpMessage = burnMessage.encode(); + const cctpAttestation = new CircleAttester().createAttestation(encodedCctpMessage); + + return { + destinationCctpDomain, + burnMessage, + encodedCctpMessage, + cctpAttestation, + }; +} + +async function updateRelayParamsForTest( + swapLayer: SwapLayerProgram, + foreignChain: ChainId, + relayParams: RelayParams, + feeUpdater: Keypair, +) { + const ix = await swapLayer.updateRelayParamsIx( + { + feeUpdater: feeUpdater.publicKey, + }, + { + chain: foreignChain, + relayParams, + }, + ); + + await expectIxOk(swapLayer.program.provider.connection, [ix], [feeUpdater]); +} + +async function addPeerForTest( + swapLayer: SwapLayerProgram, + ownerOrAssistant: Keypair, + addPeerArgs: AddPeerArgs, +) { + const ix = await swapLayer.addPeerIx( + { + ownerOrAssistant: ownerOrAssistant.publicKey, + }, + addPeerArgs, + ); + + expectIxOk(swapLayer.program.provider.connection, [ix], [ownerOrAssistant]); +} diff --git a/solana/ts/tests/10__jupiterTest.ts b/solana/ts/tests/10__jupiterTest.ts new file mode 100644 index 00000000..62b4f8eb --- /dev/null +++ b/solana/ts/tests/10__jupiterTest.ts @@ -0,0 +1,790 @@ +import * as splToken from "@solana/spl-token"; +import { + ComputeBudgetProgram, + Connection, + Keypair, + PublicKey, + Signer, + SystemProgram, + TransactionInstruction, +} from "@solana/web3.js"; +import { CctpTokenBurnMessage } from "@wormhole-foundation/example-liquidity-layer-solana/cctp"; +import { + FastMarketOrder, + LiquidityLayerDeposit, + LiquidityLayerMessage, + SlowOrderResponse, +} from "@wormhole-foundation/example-liquidity-layer-solana/common"; +import * as matchingEngineSdk from "@wormhole-foundation/example-liquidity-layer-solana/matchingEngine"; +import { + CHAIN_TO_DOMAIN, + CircleAttester, + ETHEREUM_USDC_ADDRESS, + LOCALHOST, + MOCK_GUARDIANS, + OWNER_ASSISTANT_KEYPAIR, + OWNER_KEYPAIR, + PAYER_KEYPAIR, + REGISTERED_TOKEN_ROUTERS, + USDC_MINT_ADDRESS, + expectIxOk, + getBlockTime, + postLiquidityLayerVaa, +} from "@wormhole-foundation/example-liquidity-layer-solana/testing"; +import { VaaAccount } from "@wormhole-foundation/example-liquidity-layer-solana/wormhole"; +import { Chain, toChainId } from "@wormhole-foundation/sdk-base"; +import { toUniversal } from "@wormhole-foundation/sdk-definitions"; +import * as legacyAnchor from "anchor-0.29.0"; +import { use as chaiUse, expect } from "chai"; +import * as fs from "fs"; +import * as jupiterV6 from "../src/jupiterV6"; +import { + SwapLayerMessage, + SwapLayerProgram, + decodeSwapLayerMessage, + encodeSwapLayerMessage, + localnet, +} from "../src/swapLayer"; +import { IDL as WHIRLPOOL_IDL } from "../src/types/whirlpool"; +import { + FEE_UPDATER_KEYPAIR, + REGISTERED_PEERS, + USDT_MINT_ADDRESS, + WHIRLPOOL_PROGRAM_ID, + createLut, + tryNativeToUint8Array, +} from "./helpers"; + +chaiUse(require("chai-as-promised")); + +describe("Jupiter V6 Testing", () => { + const connection = new Connection(LOCALHOST, "processed"); + const payer = PAYER_KEYPAIR; + const relayer = Keypair.generate(); + const owner = OWNER_KEYPAIR; + const recipient = Keypair.generate(); + const ownerAssistant = OWNER_ASSISTANT_KEYPAIR; + const feeUpdater = FEE_UPDATER_KEYPAIR; + const feeRecipient = Keypair.generate(); + const feeRecipientToken = splToken.getAssociatedTokenAddressSync( + USDC_MINT_ADDRESS, + feeRecipient.publicKey, + ); + + // Sending chain information. + const foreignChain = toChainId("Sepolia"); + const foreignEndpointAddress = Array.from( + Buffer.alloc(32, "000000000000000000000000603541d1Cf7178C407aA7369b67CB7e0274952e2", "hex"), + ); + const foreignCctpDomain = 0; + + // Program SDKs + const swapLayer = new SwapLayerProgram(connection, localnet(), USDC_MINT_ADDRESS); + const tokenRouter = swapLayer.tokenRouterProgram(); + const matchingEngine = tokenRouter.matchingEngineProgram(); + + const whirlpoolProgram = new legacyAnchor.Program(WHIRLPOOL_IDL, WHIRLPOOL_PROGRAM_ID, { + connection, + }); + + const luts: [PublicKey, PublicKey] = [PublicKey.default, PublicKey.default]; + + let testCctpNonce = 2n ** 64n - 1n; + + // Hack to prevent math overflow error when invoking CCTP programs. + testCctpNonce -= 100n * 6400n; + + let wormholeSequence = 10000n; + + describe("Jupiter V6 Setup", function () { + before("Generate ATAs", async function () { + for (const mint of [swapLayer.mint, USDT_MINT_ADDRESS]) { + await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + mint, + recipient.publicKey, + ); + + for (let i = 0; i < 8; ++i) { + const authority = jupiterV6.programAuthorityAddress(i); + + await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + mint, + authority, + true, // allowOwnerOffCurve + ); + } + } + }); + + after("Setup Lookup Tables", async function () { + luts[0] = await createLut( + connection, + payer, + await tokenRouter + .commonAccounts() + .then((accounts) => Object.values(accounts).filter((key) => key !== undefined)), + ); + + luts[1] = await createLut( + connection, + payer, + await matchingEngine + .commonAccounts() + .then((accounts) => Object.values(accounts).filter((key) => key !== undefined)), + ); + }); + + it("Swap USDC to USDT From Simulated Quote", async function () { + await invokeSharedAccountsRouteAsUser( + modifyUsdcToUsdtSwapResponseForTest(payer.publicKey, { + inAmount: 100_000_000n, + slippageBps: 50, + }), + ); + }); + + it("Swap USDT to USDC From Simulated Quote", async function () { + await invokeSharedAccountsRouteAsUser( + modifyUsdtToUsdcSwapResponseForTest(payer.publicKey, { + inAmount: 50_000_000n, + slippageBps: 50, + }), + ); + }); + + async function invokeSharedAccountsRouteAsUser(modifyArgs: { + instruction: TransactionInstruction; + sourceMint: PublicKey; + destinationMint: PublicKey; + minAmountOut: bigint; + }) { + const { instruction: ix, sourceMint, destinationMint, minAmountOut } = modifyArgs; + + const srcToken = splToken.getAssociatedTokenAddressSync(sourceMint, payer.publicKey); + const dstToken = splToken.getAssociatedTokenAddressSync( + destinationMint, + payer.publicKey, + ); + const { amount: srcBalanceBefore } = await splToken.getAccount(connection, srcToken); + const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); + + await expectIxOk(connection, [ix], [payer]); + + const decodedIxData = jupiterV6.decodeSharedAccountsRouteArgs(ix.data); + + const { amount: srcBalanceAfter } = await splToken.getAccount(connection, srcToken); + expect(srcBalanceBefore - srcBalanceAfter).equals(decodedIxData.inAmount); + + const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); + expect(dstBalanceAfter - dstBalanceBefore >= minAmountOut).is.true; + } + }); + + describe("Complete Swap -- Direct", function () { + const emittedEvents: EmittedFilledLocalFastOrder[] = []; + let listenerId: number | null; + + before("Start Event Listener", async function () { + listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { + emittedEvents.push({ event, slot, signature }); + }); + }); + + after("Stop Event Listener", async function () { + if (listenerId !== null) { + matchingEngine.program.removeEventListener(listenerId!); + } + }); + + it("Generate Fast Fill", async function () { + const amountIn = 200_000_000n; + const quotedAmountOut = 198_800_000n; + const slippage = 15; // 1.5bps + + // Computed after quote. + const limitAmount = (quotedAmountOut * (10000n - BigInt(slippage))) / 10000n; + const deadline = 0; + + const msg = { + recipient: toUniversal("Solana", recipient.publicKey.toString()), + redeemMode: { mode: "Direct" }, + outputToken: { + type: "Other", + address: toUniversal("Solana", USDT_MINT_ADDRESS.toString()), + swap: { + deadline, + limitAmount, + type: { + id: "JupiterV6", + dexProgramId: { isSome: false }, + }, + }, + }, + } as SwapLayerMessage; + + const { preparedFill } = await redeemFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + amountIn, + redeemerMessage: encodeSwapLayerMessage(msg), + }, + ); + + const preparedFillData = await tokenRouter.fetchPreparedFill(preparedFill); + expect(decodeSwapLayerMessage(preparedFillData.redeemerMessage)).to.eql(msg); + + const beneficiary = Keypair.generate().publicKey; + const [swapAuthority] = PublicKey.findProgramAddressSync( + [Buffer.from("swap-authority"), preparedFill.toBuffer()], + swapLayer.ID, + ); + + const { instruction: innerIx } = modifyUsdcToUsdtSwapResponseForTest(swapAuthority, { + inAmount: 0n, + cpi: true, + }); + + const ix = await swapLayer.program.methods + .completeSwapDirect(innerIx.data) + .accounts({ + completeSwap: { + payer: payer.publicKey, + consumeSwapLayerFill: await swapLayer.consumeSwapLayerFillComposite({ + preparedFill, + beneficiary, + }), + authority: swapAuthority, + srcSwapToken: splToken.getAssociatedTokenAddressSync( + swapLayer.mint, + swapAuthority, + true, // allowOwnerOffCurve + ), + dstSwapToken: splToken.getAssociatedTokenAddressSync( + USDT_MINT_ADDRESS, + swapAuthority, + true, // allowOwnerOffCurve + ), + srcMint: swapLayer.mint, + dstMint: USDT_MINT_ADDRESS, + associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, + tokenProgram: splToken.TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }, + recipientToken: splToken.getAssociatedTokenAddressSync( + USDT_MINT_ADDRESS, + recipient.publicKey, + ), + recipient: recipient.publicKey, + }) + .remainingAccounts(innerIx.keys) + .instruction(); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 420_000, + }); + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + const dstToken = splToken.getAssociatedTokenAddressSync( + USDT_MINT_ADDRESS, + recipient.publicKey, + ); + + const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); + + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts, + }); + + const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); + expect(dstBalanceAfter - dstBalanceBefore >= limitAmount).is.true; + }); + }); + + function modifyUsdcToUsdtSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): jupiterV6.ModifiedSharedAccountsRoute { + const response = JSON.parse( + fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/whirlpool_usdc_to_usdt.json`, { + encoding: "utf-8", + }), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction(response, tokenOwner, opts); + } + + function modifyUsdtToUsdcSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): jupiterV6.ModifiedSharedAccountsRoute { + const response = JSON.parse( + fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/whirlpool_usdt_to_usdc.json`, { + encoding: "utf-8", + }), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction(response, tokenOwner, opts); + } + + type PrepareOrderResponseForTestOptionalOpts = { + args?: matchingEngineSdk.CctpMessageArgs; + }; + + async function prepareOrderResponseCctpForTest( + accounts: { + payer: PublicKey; + }, + opts: ObserveCctpOrderVaasOpts & PrepareOrderResponseForTestOptionalOpts, + ): Promise< + | undefined + | { + fastVaa: PublicKey; + finalizedVaa: PublicKey; + args: matchingEngineSdk.CctpMessageArgs; + preparedOrderResponse: PublicKey; + prepareOrderResponseInstruction?: TransactionInstruction; + } + > { + let { args } = opts; + + const { fastVaa, fastVaaAccount, finalizedVaa } = await (async () => { + const { fast, finalized } = await observeCctpOrderVaas(opts); + args ??= finalized!.cctp; + + return { + fastVaa: fast.vaa, + fastVaaAccount: fast.vaaAccount, + finalizedVaa: finalized!.vaa, + }; + })(); + + const ix = await matchingEngine.prepareOrderResponseCctpIx( + { + payer: accounts.payer, + fastVaa, + finalizedVaa, + }, + args!, + ); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 280_000, + }); + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const { value } = await connection.getAddressLookupTable(lookupTableAddress); + + return value; + }), + ); + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts, + }); + + return { + fastVaa, + finalizedVaa, + args: args!, + preparedOrderResponse: matchingEngine.preparedOrderResponseAddress( + fastVaaAccount.digest(), + ), + }; + } + + async function reserveFastFillSequenceNoAuctionForTest( + accounts: { + payer: PublicKey; + fastVaa?: PublicKey; + auction?: PublicKey; + preparedOrderResponse?: PublicKey; + }, + opts: ObserveCctpOrderVaasOpts, + ): Promise< + | undefined + | { + fastVaa: PublicKey; + fastVaaAccount: VaaAccount; + reservedSequence: PublicKey; + finalizedVaa?: PublicKey; + finalizedVaaAccount?: VaaAccount; + } + > { + let preparedOrderResponse: PublicKey | undefined; + const { fastVaa, fastVaaAccount, finalizedVaa, finalizedVaaAccount } = await (async () => { + if (accounts.preparedOrderResponse === undefined) { + const result = await prepareOrderResponseCctpForTest( + { + payer: accounts.payer, + }, + opts, + ); + const { fastVaa, finalizedVaa } = result!; + preparedOrderResponse = result!.preparedOrderResponse; + + return { + fastVaa, + fastVaaAccount: await VaaAccount.fetch(connection, fastVaa), + finalizedVaa: finalizedVaa, + finalizedVaaAccount: await VaaAccount.fetch(connection, finalizedVaa), + }; + } else if (accounts.fastVaa !== undefined) { + preparedOrderResponse = accounts.preparedOrderResponse; + return { + fastVaa: accounts.fastVaa, + fastVaaAccount: await VaaAccount.fetch(connection, accounts.fastVaa), + }; + } else { + throw new Error("fastVaa must be defined if preparedOrderResponse is defined"); + } + })(); + + const ix = await matchingEngine.reserveFastFillSequenceNoAuctionIx({ + ...accounts, + fastVaa: accounts.fastVaa ?? fastVaa, + preparedOrderResponse, + }); + + await expectIxOk(connection, [ix], [payer]); + + return { + fastVaa, + fastVaaAccount, + reservedSequence: matchingEngine.reservedFastFillSequenceAddress( + fastVaaAccount.digest(), + ), + finalizedVaa, + finalizedVaaAccount, + }; + } + + type EmittedFilledLocalFastOrder = { + event: matchingEngineSdk.LocalFastOrderFilled; + slot: number; + signature: string; + }; + + async function settleAuctionNoneLocalForTest( + accounts: { + payer: PublicKey; + reservedSequence?: PublicKey; + }, + emittedEvents: EmittedFilledLocalFastOrder[], + opts: ObserveCctpOrderVaasOpts, + ): Promise { + const reserveResult = await reserveFastFillSequenceNoAuctionForTest( + { + payer: accounts.payer, + }, + opts, + ); + + const ix = await matchingEngine.settleAuctionNoneLocalIx({ + ...accounts, + reservedSequence: reserveResult!.reservedSequence, + }); + + await expectIxOk(connection, [ix], [payer]); + + // Check event. + while (emittedEvents.length == 0) { + console.log("waiting..."); + await new Promise((resolve) => setTimeout(resolve, 200)); + } + + return emittedEvents.shift()!; + } + + async function redeemFastFillForTest( + accounts: { payer: PublicKey }, + emittedEvents: EmittedFilledLocalFastOrder[], + opts: ObserveCctpOrderVaasOpts, + ) { + const settleResult = await settleAuctionNoneLocalForTest( + { payer: payer.publicKey }, + emittedEvents, + opts, + ); + const { + event: { + seeds: { sourceChain, orderSender, sequence }, + }, + } = settleResult!; + + const fastFill = matchingEngine.fastFillAddress( + toChainId(sourceChain), + orderSender, + sequence, + ); + + const ix = await tokenRouter.redeemFastFillIx({ + ...accounts, + fastFill, + }); + + await expectIxOk(connection, [ix], [payer]); + + return { fastFill, preparedFill: tokenRouter.preparedFillAddress(fastFill) }; + } + + type ForTestOpts = { + signers?: Signer[]; + errorMsg?: string | null; + }; + + function setDefaultForTestOpts( + opts: T, + overrides: { + signers?: Signer[]; + } = {}, + ): [{ signers: Signer[]; errorMsg: string | null }, Omit] { + let { signers, errorMsg } = opts; + signers ??= overrides.signers ?? [payer]; + delete opts.signers; + + errorMsg ??= null; + delete opts.errorMsg; + + return [{ signers, errorMsg }, { ...opts }]; + } + + function newFastMarketOrder(args: { + redeemerMessage: Uint8Array; + sender?: Array; + amountIn?: bigint; + minAmountOut?: bigint; + initAuctionFee?: bigint; + targetChain?: Chain; + maxFee?: bigint; + deadline?: number; + }): FastMarketOrder { + const { + amountIn, + targetChain, + minAmountOut, + maxFee, + initAuctionFee, + deadline, + redeemerMessage, + sender, + } = args; + + return { + amountIn: amountIn ?? 1_000_000_000n, + minAmountOut: minAmountOut ?? 0n, + targetChain: toChainId(targetChain ?? "Solana"), + redeemer: Array.from(swapLayer.custodianAddress().toBuffer()), + sender: sender ?? REGISTERED_PEERS["Ethereum"]!, + refundAddress: new Array(32).fill(3), + maxFee: maxFee ?? 42069n, + initAuctionFee: initAuctionFee ?? 1_250_000n, + deadline: deadline ?? 0, + redeemerMessage: Buffer.from(redeemerMessage), + }; + } + + function newSlowOrderResponse(args: { baseFee?: bigint } = {}): SlowOrderResponse { + const { baseFee } = args; + + return { + baseFee: baseFee ?? 420n, + }; + } + + type VaaResult = { + vaa: PublicKey; + vaaAccount: VaaAccount; + }; + + type FastObservedResult = VaaResult & { + fastMarketOrder: FastMarketOrder; + }; + + type FinalizedObservedResult = VaaResult & { + slowOrderResponse: SlowOrderResponse; + cctp: matchingEngineSdk.CctpMessageArgs; + }; + + type ObserveCctpOrderVaasOpts = { + redeemerMessage: Uint8Array; + amountIn: bigint; + sourceChain?: Chain; + emitter?: Array; + vaaTimestamp?: number; + fastMarketOrder?: FastMarketOrder; + finalized?: boolean; + slowOrderResponse?: SlowOrderResponse; + finalizedSourceChain?: Chain; + finalizedEmitter?: Array; + finalizedSequence?: bigint; + finalizedVaaTimestamp?: number; + }; + + async function observeCctpOrderVaas(opts: ObserveCctpOrderVaasOpts): Promise<{ + fast: FastObservedResult; + finalized?: FinalizedObservedResult; + }> { + let { + sourceChain, + emitter, + vaaTimestamp, + fastMarketOrder, + finalized, + slowOrderResponse, + finalizedSourceChain, + finalizedEmitter, + finalizedSequence, + finalizedVaaTimestamp, + } = opts; + sourceChain ??= "Ethereum"; + emitter ??= REGISTERED_TOKEN_ROUTERS[sourceChain] ?? new Array(32).fill(0); + vaaTimestamp ??= await getBlockTime(connection); + fastMarketOrder ??= newFastMarketOrder(opts); + finalized ??= true; + slowOrderResponse ??= newSlowOrderResponse(); + finalizedSourceChain ??= sourceChain; + finalizedEmitter ??= emitter; + finalizedSequence ??= finalized ? wormholeSequence++ : 0n; + finalizedVaaTimestamp ??= vaaTimestamp; + + const sourceCctpDomain = CHAIN_TO_DOMAIN[sourceChain]; + if (sourceCctpDomain === undefined) { + throw new Error(`Invalid source chain: ${sourceChain}`); + } + + const fastVaa = await postLiquidityLayerVaa( + connection, + payer, + MOCK_GUARDIANS, + emitter, + wormholeSequence++, + new LiquidityLayerMessage({ + fastMarketOrder, + }), + { sourceChain, timestamp: vaaTimestamp }, + ); + const fastVaaAccount = await VaaAccount.fetch(connection, fastVaa); + const fast = { fastMarketOrder, vaa: fastVaa, vaaAccount: fastVaaAccount }; + + if (finalized) { + const { amountIn: amount } = fastMarketOrder; + const cctpNonce = testCctpNonce++; + + // Concoct a Circle message. + const { destinationCctpDomain, burnMessage, encodedCctpMessage, cctpAttestation } = + await craftCctpTokenBurnMessage(sourceCctpDomain, cctpNonce, amount); + + const finalizedMessage = new LiquidityLayerMessage({ + deposit: new LiquidityLayerDeposit( + { + tokenAddress: burnMessage.burnTokenAddress, + amount, + sourceCctpDomain, + destinationCctpDomain, + cctpNonce, + burnSource: Array.from(Buffer.alloc(32, "beefdead", "hex")), + mintRecipient: Array.from( + matchingEngine.cctpMintRecipientAddress().toBuffer(), + ), + }, + { + slowOrderResponse, + }, + ), + }); + + const finalizedVaa = await postLiquidityLayerVaa( + connection, + payer, + MOCK_GUARDIANS, + finalizedEmitter, + finalizedSequence, + finalizedMessage, + { sourceChain: finalizedSourceChain, timestamp: finalizedVaaTimestamp }, + ); + const finalizedVaaAccount = await VaaAccount.fetch(connection, finalizedVaa); + return { + fast, + finalized: { + slowOrderResponse, + vaa: finalizedVaa, + vaaAccount: finalizedVaaAccount, + cctp: { + encodedCctpMessage, + cctpAttestation, + }, + }, + }; + } else { + return { fast }; + } + } + + async function craftCctpTokenBurnMessage( + sourceCctpDomain: number, + cctpNonce: bigint, + amount: bigint, + overrides: { destinationCctpDomain?: number } = {}, + ) { + const { destinationCctpDomain: inputDestinationCctpDomain } = overrides; + + const messageTransmitterProgram = matchingEngine.messageTransmitterProgram(); + const { version, localDomain } = + await messageTransmitterProgram.fetchMessageTransmitterConfig( + messageTransmitterProgram.messageTransmitterConfigAddress(), + ); + const destinationCctpDomain = inputDestinationCctpDomain ?? localDomain; + + const tokenMessengerMinterProgram = matchingEngine.tokenMessengerMinterProgram(); + const { tokenMessenger: sourceTokenMessenger } = + await tokenMessengerMinterProgram.fetchRemoteTokenMessenger( + tokenMessengerMinterProgram.remoteTokenMessengerAddress(sourceCctpDomain), + ); + + const burnMessage = new CctpTokenBurnMessage( + { + version, + sourceDomain: sourceCctpDomain, + destinationDomain: destinationCctpDomain, + nonce: cctpNonce, + sender: sourceTokenMessenger, + recipient: Array.from(tokenMessengerMinterProgram.ID.toBuffer()), // targetTokenMessenger + targetCaller: Array.from(matchingEngine.custodianAddress().toBuffer()), // targetCaller + }, + 0, + Array.from(tryNativeToUint8Array(ETHEREUM_USDC_ADDRESS, "Ethereum")), // sourceTokenAddress + Array.from(matchingEngine.cctpMintRecipientAddress().toBuffer()), // mint recipient + amount, + new Array(32).fill(0), // burnSource + ); + + const encodedCctpMessage = burnMessage.encode(); + const cctpAttestation = new CircleAttester().createAttestation(encodedCctpMessage); + + return { + destinationCctpDomain, + burnMessage, + encodedCctpMessage, + cctpAttestation, + }; + } +}); + +// TODO: look into shared account swap w/ token ledger +const JUPITER_V6_TOKEN_LEDGERS = [ + new PublicKey("HtncvpUBGhSrs48KtC58ntJcTDw53sn78Lpq71zVwiez"), + new PublicKey("HxTk98CmBcxmtkrBWqRszYxrnDpqAsbitQBc2QjVBG3j"), + new PublicKey("CnUPHtfUVw3D2s4FB8H6QBuLwoes8YxauVgDtFybm7rz"), + new PublicKey("FhLPkpFmszHtSyyayj7KsXNZeBTqfQbUPmvgWAyJHBXh"), +]; diff --git a/solana/ts/tests/accounts/jupiter/jupiter_custody_owner.json b/solana/ts/tests/accounts/jupiter/jupiter_custody_owner.json new file mode 100644 index 00000000..5a56d76d --- /dev/null +++ b/solana/ts/tests/accounts/jupiter/jupiter_custody_owner.json @@ -0,0 +1,14 @@ +{ + "pubkey": "BQ72nSv9f3PRyRKCBnHLVrerrv37CYTHm5h3s9VSGQDV", + "account": { + "lamports": 9117358653, + "data": [ + "", + "base64" + ], + "owner": "11111111111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 0 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter/jupiter_lut1.json b/solana/ts/tests/accounts/jupiter/jupiter_lut1.json new file mode 100644 index 00000000..b9a72ba7 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter/jupiter_lut1.json @@ -0,0 +1,14 @@ +{ + "pubkey": "GxS6FiQ3mNnAar9HGQ6mxP7t6FcwmHkU7peSeQDUHmpN", + "account": { + "lamports": 57628800, + "data": [ + "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", + "base64" + ], + "owner": "AddressLookupTab1e1111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 8152 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter/jupiter_usdc_custody_token.json b/solana/ts/tests/accounts/jupiter/jupiter_usdc_custody_token.json new file mode 100644 index 00000000..015c7f85 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter/jupiter_usdc_custody_token.json @@ -0,0 +1,14 @@ +{ + "pubkey": "7u7cD7NxcZEuzRCBaYo8uVpotRdqZwez47vvuwzCov43", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWGagAv/TIc2iJbCD8FAc+vxy1qjdf6B/k29yCuk37deeHQUgwQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter/jupiter_usdt_custody_token.json b/solana/ts/tests/accounts/jupiter/jupiter_usdt_custody_token.json new file mode 100644 index 00000000..00301b55 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter/jupiter_usdt_custody_token.json @@ -0,0 +1,14 @@ +{ + "pubkey": "6pXVFSACE5BND2C3ibGRWMG1fNtV7hfynWrfNKtCXhN3", + "account": { + "lamports": 2039280, + "data": [ + "zgEOYK/tsicXvWMZL1QUWj+WWjO7gtLHAp6yzh4ggmSagAv/TIc2iJbCD8FAc+vxy1qjdf6B/k29yCuk37deeB4yBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/matching_engine/ethereum_token_router_endpoint.json b/solana/ts/tests/accounts/matching_engine/ethereum_token_router_endpoint.json new file mode 100644 index 00000000..734310fb --- /dev/null +++ b/solana/ts/tests/accounts/matching_engine/ethereum_token_router_endpoint.json @@ -0,0 +1,14 @@ +{ + "pubkey": "BCyuV2SuRRfVBcCG82mtK9svwH9kTFtqGHdhLrfGJbzS", + "account": { + "lamports": 1642560, + "data": [ + "2ZS8y7dpms3/AgDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDw8PDwAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "MatchingEngine11111111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 108 + } +} diff --git a/solana/ts/tests/accounts/matching_engine/local_custody_token_ethereum.json b/solana/ts/tests/accounts/matching_engine/local_custody_token_ethereum.json new file mode 100644 index 00000000..3dd51e14 --- /dev/null +++ b/solana/ts/tests/accounts/matching_engine/local_custody_token_ethereum.json @@ -0,0 +1,14 @@ +{ + "pubkey": "Gv92Ev9RGL5gDrJe4QW7UuFqhDPtowcWsDEK5TFuxEXk", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWGXppnIu51s44hKtaRA/0bU8CeR5k1GK1L6aBKRElPD4wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} diff --git a/solana/ts/tests/accounts/matching_engine/local_token_router_endpoint.json b/solana/ts/tests/accounts/matching_engine/local_token_router_endpoint.json new file mode 100644 index 00000000..e1adf418 --- /dev/null +++ b/solana/ts/tests/accounts/matching_engine/local_token_router_endpoint.json @@ -0,0 +1,14 @@ +{ + "pubkey": "DM2XBh6idYEGffbmpXpZ8imvvqr3wiGWQSPDPi7DUhK6", + "account": { + "lamports": 1642560, + "data": [ + "2ZS8y7dpms3+AQDLBAbllVW/A3G3xP/xgSoRqNktrQKtQiBilx1h3M4s0DNaCpv0sk+AZeIvAcOHXlUjPSggm8JUmF3OIGM4z2RPAQbd9uG30FNCYIGt/sMR2odA7yJzvBqMmQv6AP8AAAAA", + "base64" + ], + "owner": "MatchingEngine11111111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 108 + } +} diff --git a/solana/ts/tests/accounts/matching_engine/matching_engine_custodian.json b/solana/ts/tests/accounts/matching_engine/matching_engine_custodian.json new file mode 100644 index 00000000..a90bf63a --- /dev/null +++ b/solana/ts/tests/accounts/matching_engine/matching_engine_custodian.json @@ -0,0 +1,14 @@ +{ + "pubkey": "8h2y1vLbZGtjuiULKf7aXTE43xDVepegFCpdsvyGfjna", + "account": { + "lamports": 1927920, + "data": [ + "hOSLuHDkbPDAUdFeBdSAesMbgbuH1v/y+B8CdTSkCIZZNuCntHQ+IgAAwFHRXgXUgHrDG4G7h9b/8vgfAnU0pAiGWTbgp7R0PiKuCWamoSkQdY+3hXAeX0OBXanyqg4oyBl8g1z1sDnSWjm5C/buD6O3qMWeYe5GQZHSVEA0eMIQ2k6BuN+QeOPoAgAAAAIAAAAAAAAAt++pwtyl3+I9TFms9C490IWNVScAAAAAAAAAAAAAAAA=", + "base64" + ], + "owner": "MatchingEngine11111111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 149 + } +} diff --git a/solana/ts/tests/accounts/matching_engine/matching_engine_mint_recipient.json b/solana/ts/tests/accounts/matching_engine/matching_engine_mint_recipient.json new file mode 100644 index 00000000..cfcd9778 --- /dev/null +++ b/solana/ts/tests/accounts/matching_engine/matching_engine_mint_recipient.json @@ -0,0 +1,14 @@ +{ + "pubkey": "35iwWKi7ebFyXNaqpswd1g9e9jrjvqWPV39nCQPaBbX1", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWFyQ0N5lerefHFKSfnvNtiyHLFAUzsKR5tE+bDg3KuBWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} diff --git a/solana/ts/tests/accounts/payer_usdc_token.json b/solana/ts/tests/accounts/payer_usdc_token.json new file mode 100644 index 00000000..b528ab79 --- /dev/null +++ b/solana/ts/tests/accounts/payer_usdc_token.json @@ -0,0 +1,14 @@ +{ + "pubkey": "4tKtuvtQ4TzkkrkESnRpbfSXCEZPkZe3eL5tCFUdpxtf", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWEMGliG/hCT35/EOMKW+fcnW3cYtrwOFW2NM2xY8IOZbQBQfVDBPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} diff --git a/solana/ts/tests/accounts/payer_usdt_token.json b/solana/ts/tests/accounts/payer_usdt_token.json new file mode 100644 index 00000000..c671c662 --- /dev/null +++ b/solana/ts/tests/accounts/payer_usdt_token.json @@ -0,0 +1,14 @@ +{ + "pubkey": "4MXG73DEVVRN9xiJavCkFVFtZdYBrKmD1hjxmTtNoZnA", + "account": { + "lamports": 2039280, + "data": [ + "zgEOYK/tsicXvWMZL1QUWj+WWjO7gtLHAp6yzh4ggmQMGliG/hCT35/EOMKW+fcnW3cYtrwOFW2NM2xY8IOZbQBQfVDBPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} diff --git a/solana/ts/tests/accounts/token_router/token_router_custodian.json b/solana/ts/tests/accounts/token_router/token_router_custodian.json new file mode 100644 index 00000000..400bde8f --- /dev/null +++ b/solana/ts/tests/accounts/token_router/token_router_custodian.json @@ -0,0 +1,14 @@ +{ + "pubkey": "EfVKoFHtCktpNTk3NbayPpRNo8rR7prvcV4M9Mvxd6ko", + "account": { + "lamports": 1851360, + "data": [ + "hOSLuHDkbPAADBpYhv4Qk9+fxDjClvn3J1t3GLa8DhVtjTNsWPCDmW0AsmIbhgz6XX8yTgZ3Hk7x1/Eund3zACbSgqeOUgYltXGyYhuGDPpdfzJOBnceTvHX8S6d3fMAJtKCp45SBiW1cQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenRouter11111111111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 138 + } +} diff --git a/solana/ts/tests/accounts/token_router/token_router_mint_recipient.json b/solana/ts/tests/accounts/token_router/token_router_mint_recipient.json new file mode 100644 index 00000000..b73f88c6 --- /dev/null +++ b/solana/ts/tests/accounts/token_router/token_router_mint_recipient.json @@ -0,0 +1,14 @@ +{ + "pubkey": "4TTRh2xhgbxnJC1y3EdcPC6MMYyLyasaQqkYDEgnaF8i", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWHLBAbllVW/A3G3xP/xgSoRqNktrQKtQiBilx1h3M4s0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} diff --git a/solana/ts/tests/accounts/usdc_mint.json b/solana/ts/tests/accounts/usdc_mint.json new file mode 100644 index 00000000..c8e8ea78 --- /dev/null +++ b/solana/ts/tests/accounts/usdc_mint.json @@ -0,0 +1,14 @@ +{ + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "account": { + "lamports": 251560315802, + "data": [ + "AQAAABzjWe1aAS4E+hQrnHUaHF6Hz9CgFhuchf/TG3jN/Nj2p6tW8+EFCgAGAQEAAAAqnl7btTwEZ5CY/3sSZRcUQ0/AjFYqmjuGEQXmctQicw==", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 82 + } +} diff --git a/solana/ts/tests/accounts/usdt_mint.json b/solana/ts/tests/accounts/usdt_mint.json new file mode 100644 index 00000000..e7059a18 --- /dev/null +++ b/solana/ts/tests/accounts/usdt_mint.json @@ -0,0 +1,14 @@ +{ + "pubkey": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", + "account": { + "lamports": 50202380623, + "data": [ + "AQAAAAXqnPFs5BGY8aSZN8iMNwqU1K//ibW6y470XmMku3j3venZj+O2BgAGAQEAAAAF6pzxbOQRmPGkmTfIjDcKlNSv/4m1usuO9F5jJLt49w==", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 82 + } +} diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_pool.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_pool.json new file mode 100644 index 00000000..c8ef4314 --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_pool.json @@ -0,0 +1,14 @@ +{ + "pubkey": "4fuUiYxTQ6QCrdSq9ouBYcTM7bqSwYTSyLueGZLTy4T4", + "account": { + "lamports": 8369767, + "data": [ + "P5XRDOGAYwkT5EH4ORPKaLBjT7Al/eqohzfoQRDRJV41ezN33e4czf4BAAEAZAABADNdiXE+YzsAAAAAAAAAAABtQdc53gwGAAEAAAAAAAAAAQAAAO3cEgAAAAAAQCgSAAAAAADG+nrzvtutOj1l82qryXQxsbvkwtL24OR8pgIDRS9dYTh+16gWHhKPYwCd04bLWbFzFdwmlKokL2uxqbmvB+ZNRzJ5sLuDKQAAAAAAAAAAAM4BDmCv7bInF71jGS9UFFo/llozu4LSxwKess4eIIJkNeiIbH+TIrH808Mo64y1NcUTXvhTIy/NSkLP4hzxPoJg2+jNodAoAAAAAAAAAAAAMUo+ZgAAAAAMANCv64YU2n8Zq6AtQPGMaSWF9lAg387T1eX5qcDE4Vb/V4Hf5q0uG0Yn2nq153n0gURGWxMEBqVj2oUQXQp6vR0xrxfe/zwmhIFgCsr+SxQJjA/hQbf0oc34STRkRAMAAAAAAAAAAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjiJYZue8w+Ov+p5Y2yG1Srr8ZMc5KvEGfy8Lslz4ckgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACOIlhm57zD46/6nljbIbVKuvxkxzkq8QZ/LwuyXPhySAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "base64" + ], + "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 653 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_0.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_0.json new file mode 100644 index 00000000..674fc40e --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_0.json @@ -0,0 +1,14 @@ +{ + "pubkey": "8kZSTVuV7C4GD9ZVR4wDtRSXv1SvsSQPfqUbthueRNGV", + "account": { + "lamports": 70407360, + "data": [ + "RWG9vm4HQruo////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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", + "base64" + ], + "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 9988 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1a.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1a.json new file mode 100644 index 00000000..f61c50dc --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1a.json @@ -0,0 +1,14 @@ +{ + "pubkey": "2B48L1ACPvVb67UKeSMkUGdzrnhvNMm6pFt2nspGKxs4", + "account": { + "lamports": 70407360, + "data": [ + "RWG9vm4HQrtQ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEzagnAAAAAAAAAAAAAAAARM2oJwAAAAAAAAAAAAAAAE/E53c/yBcAAAAAAAAAAADNsyttMhoXAAAAAAAAAAAAUbb9FgmvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuuZiNQAAAAAAAAAAAAAAALrmYjUAAAAAAAAAAAAAAAC0aH/h8csfAAAAAAAAAAAAzykS3RQOHwAAAAAAAAAAAFG2/RYJrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGp7gqAAAAAAAAAAAAAAAABqe4KgAAAAAAAAAAAAAAAAnVUyjCUCkAAAAAAAAAAAAtwTrfVJ0oAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8zRkMUoAAAAAAAAAAAAAAPM0ZDFKAAAAAAAAAAAAAADPltl6o9onAAAAAAAAAAAAeuumbn4mJwAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdD6PeoNAAAAAAAAAAAAAADQ+j3qDQAAAAAAAAAAAAAApV6R+kfyKAAAAAAAAAAAAKK31OAQPygAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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", + "base64" + ], + "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 9988 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1b.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1b.json new file mode 100644 index 00000000..30831f8e --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1b.json @@ -0,0 +1,14 @@ +{ + "pubkey": "FqFkv2xNNCUyx1RYV61pGZ9AMzGfgcD8uXC9zCF5JKnR", + "account": { + "lamports": 120407360, + "data": [ + "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHqfmzh8v//////////////FoGTHg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgMXi5f///////////////4A6HRoAAAAAAAAAAAAAAADYAprR+L0DAAAAAAAAAAAAJgaoRDTIAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF+v/r/////////////////gkAFAAAAAAAAAAAAAAAAAJ34LgOs8wIAAAAAAAAAAACjNDNJkvwCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDEw==", + "base64" + ], + "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 9988 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2a.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2a.json new file mode 100644 index 00000000..dde41261 --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2a.json @@ -0,0 +1,14 @@ +{ + "pubkey": "BMGfBaW69aUm6hRdmsfAcNEmAW59C2rWJ9EX7gWnrVN9", + "account": { + "lamports": 70407360, + "data": [ + "RWG9vm4HQrv4/v//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcTTm4AAAAAAAAAAAAAAAAHE05uAAAAAAAAAAAAAAAACOHhPr9xghAAAAAAAAAAAAtugzxEZdIAAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZYAAAAAAAAAAAAAAAAAAACWAAAAAAAAAAAAAAAAAAAAGlIrexR5EAAAAAAAAAAAAKMni40vxQ8AAAAAAAAAAABRtv0WCa8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbV/U7QEAAAAAAAAAAAAAAG1f1O0BAAAAAAAAAAAAAADsDxVyrv4QAAAAAAAAAAAAF9y3imFKEAAAAAAAAAAAAFG2/RYJrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcZvwFAAAAAAAAAAAAAAAAXGb8BQAAAAAAAAAAAAAAAOHJtAsGgiUAAAAAAAAAAADU/kW5wMskAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABD3UNBgAAAAAAAAAAAAAAAA91DQYAAAAAAAAAAAAAAABwfkVtZ+8oAAAAAAAAAAAA3V0qS6k8KAAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDEw==", + "base64" + ], + "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 9988 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2b.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2b.json new file mode 100644 index 00000000..a0352bb9 --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2b.json @@ -0,0 +1,14 @@ +{ + "pubkey": "A7sdy3NoAZp49cQNpreMGARAb9QJjYrrSyDALhThgk3D", + "account": { + "lamports": 70407360, + "data": [ + "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbZvDjv///////////////9KkPHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7n4CJOT//////////////xKB/dsbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH6WEfV////////////////Bqe4KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG8MlfY////////////////RM2oJwAAAAAAAAAAAAAAAKMu2tYGIQAAAAAAAAAAAAD0A8X/pCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDEw==", + "base64" + ], + "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 9988 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__0.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__0.json new file mode 100644 index 00000000..f3e2fdc4 --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__0.json @@ -0,0 +1,14 @@ +{ + "pubkey": "FqFkv2xNNCUyx1RYV61pGZ9AMzGfgcD8uXC9zCF5JKnR", + "account": { + "lamports": 120407360, + "data": [ + "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgMXi5f///////////////4A6HRoAAAAAAAAAAAAAAADYAprR+L0DAAAAAAAAAAAAJgaoRDTIAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF+v/r/////////////////gkAFAAAAAAAAAAAAAAAAAJ34LgOs8wIAAAAAAAAAAACjNDNJkvwCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDEw==", + "base64" + ], + "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 9988 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__1.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__1.json new file mode 100644 index 00000000..74630e75 --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__1.json @@ -0,0 +1,14 @@ +{ + "pubkey": "8kZSTVuV7C4GD9ZVR4wDtRSXv1SvsSQPfqUbthueRNGV", + "account": { + "lamports": 70407360, + "data": [ + "RWG9vm4HQruo////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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", + "base64" + ], + "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 9988 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__2.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__2.json new file mode 100644 index 00000000..4b3be2da --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__2.json @@ -0,0 +1,14 @@ +{ + "pubkey": "2B48L1ACPvVb67UKeSMkUGdzrnhvNMm6pFt2nspGKxs4", + "account": { + "lamports": 70407360, + "data": [ + "RWG9vm4HQrtQ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEzagnAAAAAAAAAAAAAAAARM2oJwAAAAAAAAAAAAAAAE/E53c/yBcAAAAAAAAAAADNsyttMhoXAAAAAAAAAAAAUbb9FgmvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuuZiNQAAAAAAAAAAAAAAALrmYjUAAAAAAAAAAAAAAAC0aH/h8csfAAAAAAAAAAAAzykS3RQOHwAAAAAAAAAAAFG2/RYJrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGp7gqAAAAAAAAAAAAAAAABqe4KgAAAAAAAAAAAAAAAAnVUyjCUCkAAAAAAAAAAAAtwTrfVJ0oAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABaMsgVgMAAAAAAAAAAAAAAGjLIFYDAAAAAAAAAAAAAADPltl6o9onAAAAAAAAAAAAeuumbn4mJwAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdD6PeoNAAAAAAAAAAAAAADQ+j3qDQAAAAAAAAAAAAAApV6R+kfyKAAAAAAAAAAAAKK31OAQPygAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB/fAHzAQAAAAAAAAAAAAAAP3wB8wEAAAAAAAAAAAAAAAznwy6+x8pAAAAAAAAAAAA3yBRV45sKAAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE0AAAAAAAAAAAAAAAAAAAANAAAAAAAAAAAAAAAAAAAAEyq96/rjBMAAAAAAAAAAACU9nv/TdASAAAAAAAAAAAAUbb9FgmvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcMBAAAAAAAAAAAAAAAAAADDAQAAAAAAAAAAAAAAAAAAZy69fjTyEAAAAAAAAAAAAOv5FO5aLBAAAAAAAAAAAADWOy2mawMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtSRcGAAAAAAAAAAAAAAAArUkXBgAAAAAAAAAAAAAAAHNDJlySAikAAAAAAAAAAAAEbQgsA08oAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABlfDJCesAAAAAAAAAAAAAAJXwyQnrAAAAAAAAAAAAAAAg4u4o6WcpAAAAAAAAAAAAxtQWVia1KAAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFKkPHEAAAAAAAAAAAAAAAASpDxxAAAAAAAAAAAAAAAAKy+N2b97ygAAAAAAAAAAADetnuJiz0oAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDEw==", + "base64" + ], + "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 9988 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__3.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__3.json new file mode 100644 index 00000000..f84ff0a0 --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__3.json @@ -0,0 +1,14 @@ +{ + "pubkey": "A7sdy3NoAZp49cQNpreMGARAb9QJjYrrSyDALhThgk3D", + "account": { + "lamports": 70407360, + "data": [ + "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFrDzb2FP//////////////lfDJCesAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbZvDjv///////////////9KkPHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH6WEfV////////////////Bqe4KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG8MlfY////////////////RM2oJwAAAAAAAAAAAAAAAKMu2tYGIQAAAAAAAAAAAAD0A8X/pCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDEw==", + "base64" + ], + "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 9988 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__4.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__4.json new file mode 100644 index 00000000..b4093a84 --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__4.json @@ -0,0 +1,14 @@ +{ + "pubkey": "9opqNK3dWUijw8VNLtvne4juCTq1qADaph29tZqkoZHa", + "account": { + "lamports": 70407360, + "data": [ + "RWG9vm4HQruwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWr///////////////////+WAAAAAAAAAAAAAAAAAAAAo9ePfj0uAAAAAAAAAAAAAG2ZoKIwLwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABzKArEv7//////////////zRf1O0BAAAAAAAAAAAAAADOmncIZxgAAAAAAAAAAAAALhCxBu4YAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGkmQP6////////////////XGb8BQAAAAAAAAAAAAAAAPC0ZyFIBgAAAAAAAAAAAAAzG7dLbAYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8Yry+f///////////////w91DQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGPyxkf////////////////cTTm4AAAAAAAAAAAAAAAANFT2bsqAgAAAAAAAAAAAAAD2nxOOAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG7pwap+///////////////RVj5VgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDEw==", + "base64" + ], + "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 9988 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_vault.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_vault.json new file mode 100644 index 00000000..2060edc0 --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_vault.json @@ -0,0 +1,14 @@ +{ + "pubkey": "4oY1eVHJrt7ywuFoQnAZwto4qcQip1QhYMAhD11PU4QL", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWE2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDE5qK3fy2CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdt_vault.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdt_vault.json new file mode 100644 index 00000000..be571bd5 --- /dev/null +++ b/solana/ts/tests/accounts/whirlpool/whirlpool_usdt_vault.json @@ -0,0 +1,14 @@ +{ + "pubkey": "4dSG9tKHZR4CAictyEnH9XuGZyKapodWXq5xyg7uFwE9", + "account": { + "lamports": 2039280, + "data": [ + "zgEOYK/tsicXvWMZL1QUWj+WWjO7gtLHAp6yzh4ggmQ2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDExaCvmx4AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/helpers/consts.ts b/solana/ts/tests/helpers/consts.ts new file mode 100644 index 00000000..2a51f718 --- /dev/null +++ b/solana/ts/tests/helpers/consts.ts @@ -0,0 +1,21 @@ +import { Keypair, PublicKey } from "@solana/web3.js"; +import { Chain } from "@wormhole-foundation/sdk-base"; + +export const CORE_BRIDGE_PID = new PublicKey("worm2ZoG2kUd4vFXhvjh93UUH596ayRfgQ2MgjNMTth"); +export const GUARDIAN_KEY = "cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0"; + +export const FEE_UPDATER_KEYPAIR = Keypair.fromSecretKey( + Buffer.from( + "rI0Zx3zKrtyTbkR6tjGflafgMUJFoVSOnPikC2FPl1dyHvGqDulylhs8RuGza/GcmplFUU/jqMXBxiPy2RhgMQ==", + "base64", + ), +); + +export const USDT_MINT_ADDRESS = new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"); + +export const WHIRLPOOL_PROGRAM_ID = new PublicKey("whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc"); +export const WHIRLPOOL_USDC_USDT = new PublicKey("4fuUiYxTQ6QCrdSq9ouBYcTM7bqSwYTSyLueGZLTy4T4"); + +export const REGISTERED_PEERS: { [k in Chain]?: Array } = { + Ethereum: Array.from(Buffer.alloc(32, "50", "hex")), +}; diff --git a/solana/ts/tests/helpers/index.ts b/solana/ts/tests/helpers/index.ts new file mode 100644 index 00000000..a64a0fde --- /dev/null +++ b/solana/ts/tests/helpers/index.ts @@ -0,0 +1,2 @@ +export * from "./consts"; +export * from "./utils"; diff --git a/solana/ts/tests/helpers/utils.ts b/solana/ts/tests/helpers/utils.ts new file mode 100644 index 00000000..5e42b3b7 --- /dev/null +++ b/solana/ts/tests/helpers/utils.ts @@ -0,0 +1,40 @@ +import { AddressLookupTableProgram, Connection, Keypair, PublicKey } from "@solana/web3.js"; +import { expect } from "chai"; +import { expectIxOk } from "@wormhole-foundation/example-liquidity-layer-solana/testing"; +import { Chain } from "@wormhole-foundation/sdk-base"; +import { toUniversal } from "@wormhole-foundation/sdk-definitions"; + +export function hackedExpectDeepEqual(left: any, right: any) { + expect(JSON.parse(JSON.stringify(left))).to.eql(JSON.parse(JSON.stringify(right))); +} + +export function tryNativeToUint8Array(address: string, chain: Chain) { + return toUniversal(chain, address).toUint8Array(); +} + +export async function createLut(connection: Connection, payer: Keypair, addresses: PublicKey[]) { + // Create. + const [createIx, lookupTable] = await connection.getSlot("finalized").then((slot) => + AddressLookupTableProgram.createLookupTable({ + authority: payer.publicKey, + payer: payer.publicKey, + recentSlot: slot, + }), + ); + + await expectIxOk(connection, [createIx], [payer]); + + // Extend. + const extendIx = AddressLookupTableProgram.extendLookupTable({ + payer: payer.publicKey, + authority: payer.publicKey, + lookupTable, + addresses, + }); + + await expectIxOk(connection, [extendIx], [payer], { + confirmOptions: { commitment: "finalized" }, + }); + + return lookupTable; +} diff --git a/solana/ts/tests/jupiterV6SwapResponses/whirlpool_usdc_to_usdt.json b/solana/ts/tests/jupiterV6SwapResponses/whirlpool_usdc_to_usdt.json new file mode 100644 index 00000000..34a50360 --- /dev/null +++ b/solana/ts/tests/jupiterV6SwapResponses/whirlpool_usdc_to_usdt.json @@ -0,0 +1,131 @@ +{ + "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "accounts": [ + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "GGztQqQ6pCPaJQnNpXBgELr5cs3WwDakRbh1iEMzjgSJ", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "B3ppUiUuJWWTD1ve52bf6Ve5y9avhEqy6k5qK4n2SLgp", + "isSigner": true, + "isWritable": false + }, + { + "pubkey": "GDU7r2RtnQCmSFesccWgKgwPjq5QJN6Kwdgx8gDsapXk", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "DVCeozFGbe6ew3eWTnZByjHeYqTq1cvbrB7JJhkLxaRJ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "HkphEpUqnFBxBuCPEq5j1HA9L8EwmsmRT6UcFKziptM1", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "8Gt7E6NJPohxsN2rAB9tEayh8jZjxXhBvFetcCuGtFAq", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "GGztQqQ6pCPaJQnNpXBgELr5cs3WwDakRbh1iEMzjgSJ", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "4fuUiYxTQ6QCrdSq9ouBYcTM7bqSwYTSyLueGZLTy4T4", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "DVCeozFGbe6ew3eWTnZByjHeYqTq1cvbrB7JJhkLxaRJ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "4oY1eVHJrt7ywuFoQnAZwto4qcQip1QhYMAhD11PU4QL", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "HkphEpUqnFBxBuCPEq5j1HA9L8EwmsmRT6UcFKziptM1", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "4dSG9tKHZR4CAictyEnH9XuGZyKapodWXq5xyg7uFwE9", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "FqFkv2xNNCUyx1RYV61pGZ9AMzGfgcD8uXC9zCF5JKnR", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "8kZSTVuV7C4GD9ZVR4wDtRSXv1SvsSQPfqUbthueRNGV", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "2B48L1ACPvVb67UKeSMkUGdzrnhvNMm6pFt2nspGKxs4", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "3NxDBWt55DZnEwwQ2bhQ3xWG8Jd18TdUXAG4Zdr7jDai", + "isSigner": false, + "isWritable": false + } + ], + "data": "wSCbM0HWnIEAAQAAABEBZAABAMqaOwAAAACtWJs7AAAAADIAAA==" +} diff --git a/solana/ts/tests/jupiterV6SwapResponses/whirlpool_usdt_to_usdc.json b/solana/ts/tests/jupiterV6SwapResponses/whirlpool_usdt_to_usdc.json new file mode 100644 index 00000000..ca6fbf0b --- /dev/null +++ b/solana/ts/tests/jupiterV6SwapResponses/whirlpool_usdt_to_usdc.json @@ -0,0 +1,131 @@ +{ + "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "accounts": [ + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "2MFoS3MPtvyQ4Wh4M9pdfPjz6UhVoNbFbGJAskCPCj3h", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "B3ppUiUuJWWTD1ve52bf6Ve5y9avhEqy6k5qK4n2SLgp", + "isSigner": true, + "isWritable": false + }, + { + "pubkey": "8Gt7E6NJPohxsN2rAB9tEayh8jZjxXhBvFetcCuGtFAq", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "F3Hej7eXZMWTr141APvCiNM7ZUn22cD9b1p8EcfFH8vn", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "JSvtokJbtGsYhneKomFBjnJh4djEQLdHV2kAeS43bBZ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "GDU7r2RtnQCmSFesccWgKgwPjq5QJN6Kwdgx8gDsapXk", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "2MFoS3MPtvyQ4Wh4M9pdfPjz6UhVoNbFbGJAskCPCj3h", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "4fuUiYxTQ6QCrdSq9ouBYcTM7bqSwYTSyLueGZLTy4T4", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "JSvtokJbtGsYhneKomFBjnJh4djEQLdHV2kAeS43bBZ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "4oY1eVHJrt7ywuFoQnAZwto4qcQip1QhYMAhD11PU4QL", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "F3Hej7eXZMWTr141APvCiNM7ZUn22cD9b1p8EcfFH8vn", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "4dSG9tKHZR4CAictyEnH9XuGZyKapodWXq5xyg7uFwE9", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "FqFkv2xNNCUyx1RYV61pGZ9AMzGfgcD8uXC9zCF5JKnR", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "A7sdy3NoAZp49cQNpreMGARAb9QJjYrrSyDALhThgk3D", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "9opqNK3dWUijw8VNLtvne4juCTq1qADaph29tZqkoZHa", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "3NxDBWt55DZnEwwQ2bhQ3xWG8Jd18TdUXAG4Zdr7jDai", + "isSigner": false, + "isWritable": false + } + ], + "data": "wSCbM0HWnIEBAQAAABEAZAABAMqaOwAAAACtLZc7AAAAAMgAAA==" +} diff --git a/solana/ts/tests/keys/pFCBP4bhqdSsrWUVTgqhPsLrfEdChBK17vgFM7TxjxQ.json b/solana/ts/tests/keys/pFCBP4bhqdSsrWUVTgqhPsLrfEdChBK17vgFM7TxjxQ.json new file mode 100644 index 00000000..3e28fb44 --- /dev/null +++ b/solana/ts/tests/keys/pFCBP4bhqdSsrWUVTgqhPsLrfEdChBK17vgFM7TxjxQ.json @@ -0,0 +1 @@ +[112,55,233,99,229,91,68,85,207,63,10,46,103,0,49,250,22,189,30,167,157,146,26,148,175,155,212,104,86,182,185,192,12,26,88,134,254,16,147,223,159,196,56,194,150,249,247,39,91,119,24,182,188,14,21,109,141,51,108,88,240,131,153,109] \ No newline at end of file diff --git a/solana/tsconfig.anchor-test.json b/solana/tsconfig.anchor-test.json new file mode 100644 index 00000000..a7f8a03e --- /dev/null +++ b/solana/tsconfig.anchor-test.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "types": ["mocha", "chai", "node"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2020"], + "module": "CommonJs", + "target": "es2020", + "noEmit": true, + "esModuleInterop": true + } +} diff --git a/solana/tsconfig.json b/solana/tsconfig.json new file mode 100644 index 00000000..433d6db0 --- /dev/null +++ b/solana/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "types":["chai", "mocha", "node"], + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "esModuleInterop": true, + "skipLibCheck": true, + "outDir": "dist", + } +} diff --git a/universal/rs/.gitignore b/universal/rs/.gitignore new file mode 100644 index 00000000..869df07d --- /dev/null +++ b/universal/rs/.gitignore @@ -0,0 +1,2 @@ +/target +Cargo.lock \ No newline at end of file diff --git a/universal/rs/Cargo.toml b/universal/rs/Cargo.toml new file mode 100644 index 00000000..57e1784b --- /dev/null +++ b/universal/rs/Cargo.toml @@ -0,0 +1,52 @@ +[workspace] +members = [ + "messages" +] +resolver = "2" + +[workspace.package] +edition = "2021" +version = "0.0.0" +authors = ["Wormhole Contributors"] +license = "Apache-2.0" +homepage = "https://https://github.com/xlabs" +repository = "https://github.com/xlabs/swap-layer" + +[workspace.dependencies.liquidity-layer-messages] +path = "../../lib/example-liquidity-layer/universal/rs/messages" + +[workspace.dependencies] +wormhole-io = "0.3.0-alpha.1" +ruint = "1.9.0" +hex-literal = "0.4.1" +anchor-lang = "0.30.0" +solana-program = "1.18.11" + +[workspace.lints.clippy] +correctness = { level = "warn"} + +arithmetic_side_effects = "deny" +as_conversions = "deny" +cast_abs_to_unsigned = "deny" +cast_lossless= "deny" +cast_possible_truncation = "deny" +cast_possible_wrap = "deny" +cast_precision_loss = "deny" +cast_sign_loss = "deny" +eq_op = "deny" +expect_used = "deny" +float_cmp = "deny" +integer_division = "deny" +large_futures = "deny" +large_stack_arrays = "deny" +large_stack_frames = "deny" +lossy_float_literal = "deny" +manual_slice_size_calculation = "deny" +modulo_one = "deny" +out_of_bounds_indexing = "deny" +overflow_check_conditional = "deny" +panic = "deny" +recursive_format_impl = "deny" +todo = "deny" +unchecked_duration_subtraction = "deny" +unreachable = "deny" diff --git a/universal/rs/messages/Cargo.toml b/universal/rs/messages/Cargo.toml new file mode 100644 index 00000000..db43233c --- /dev/null +++ b/universal/rs/messages/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "swap-layer-messages" +edition.workspace = true +version.workspace = true +authors.workspace = true +license.workspace = true +homepage.workspace = true +repository.workspace = true + +[features] +default = [] +anchor = ["dep:anchor-lang"] +idl-build = ["anchor", "anchor-lang/idl-build"] + +[dependencies] +liquidity-layer-messages.workspace = true +wormhole-io.workspace = true +ruint.workspace = true + +anchor-lang = { workspace = true, optional = true } + +[dev-dependencies] +hex-literal.workspace = true +solana-program.workspace = true + +[lints] +workspace = true diff --git a/universal/rs/messages/src/lib.rs b/universal/rs/messages/src/lib.rs new file mode 100644 index 00000000..f2a1394b --- /dev/null +++ b/universal/rs/messages/src/lib.rs @@ -0,0 +1,5 @@ +pub mod messages; + +pub mod types; + +pub use wormhole_io; diff --git a/universal/rs/messages/src/messages/mod.rs b/universal/rs/messages/src/messages/mod.rs new file mode 100644 index 00000000..1f8d2cf1 --- /dev/null +++ b/universal/rs/messages/src/messages/mod.rs @@ -0,0 +1,202 @@ +use std::io; + +use crate::{ + types::{OutputToken, RedeemMode}, + wormhole_io::{Readable, TypePrefixedPayload, Writeable}, +}; + +#[cfg(feature = "anchor")] +use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; + +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct SwapMessageV1 { + pub recipient: [u8; 32], + pub redeem_mode: RedeemMode, + pub output_token: OutputToken, +} + +impl Readable for SwapMessageV1 { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + Ok(Self { + recipient: Readable::read(reader)?, + redeem_mode: Readable::read(reader)?, + output_token: Readable::read(reader)?, + }) + } +} + +impl Writeable for SwapMessageV1 { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + self.recipient.write(writer)?; + self.redeem_mode.write(writer)?; + self.output_token.write(writer) + } +} + +impl TypePrefixedPayload<1> for SwapMessageV1 { + const TYPE: Option<[u8; 1]> = Some([1]); + + fn written_size(&self) -> usize { + self.redeem_mode + .written_size() + .saturating_add(self.output_token.written_size()) + .saturating_add(32) // recipient + } +} + +#[cfg(test)] +mod test { + use hex_literal::hex; + + use crate::types::{ + OutputSwap, OutputToken, RedeemMode, SwapType, Uint24, Uint48, UniswapSwapParameters, + UniswapSwapPath, + }; + + use super::*; + + #[test] + pub fn test_swap_message_v1_usdc_direct() { + let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a00000023010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0000"); + + let redeemer_message = + hex!("010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0000"); + + let fill = liquidity_layer_messages::Fill::read_slice(&encoded_fill).unwrap(); + assert_eq!( + fill, + liquidity_layer_messages::Fill { + source_chain: 0xf00f, + order_sender: hex!( + "0000000000000000000000000000000000000000000000000000000000000002" + ), + redeemer: hex!("000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a"), + redeemer_message: redeemer_message.to_vec().try_into().unwrap() + } + ); + + let swap_message = SwapMessageV1::read_slice(&redeemer_message).unwrap(); + assert_eq!( + swap_message, + SwapMessageV1 { + recipient: hex!("0000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d"), + redeem_mode: RedeemMode::Direct, + output_token: OutputToken::Usdc, + } + ); + } + + #[test] + pub fn test_swap_message_v1_eth_swap() { + let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a00000053010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d00010000000000000000000000000000000000000000010001f4015991a2df15a8f6a256d3ec51e99254cd3fb576a90001f4"); + + let redeemer_message = + hex!("010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d00010000000000000000000000000000000000000000010001f4015991a2df15a8f6a256d3ec51e99254cd3fb576a90001f4"); + + let fill = liquidity_layer_messages::Fill::read_slice(&encoded_fill).unwrap(); + assert_eq!( + fill, + liquidity_layer_messages::Fill { + source_chain: 0xf00f, + order_sender: hex!( + "0000000000000000000000000000000000000000000000000000000000000002" + ), + redeemer: hex!("000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a"), + redeemer_message: redeemer_message.to_vec().try_into().unwrap() + } + ); + + let swap_message = SwapMessageV1::read_slice(&redeemer_message).unwrap(); + assert_eq!( + swap_message, + SwapMessageV1 { + recipient: hex!("0000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d"), + redeem_mode: RedeemMode::Direct, + output_token: OutputToken::Gas(OutputSwap { + deadline: 0, + limit_amount: 0, + swap_type: SwapType::UniswapV3(UniswapSwapParameters { + first_leg_fee: Uint24::from(500), + path: vec![UniswapSwapPath { + evm_address: hex!("5991a2df15a8f6a256d3ec51e99254cd3fb576a9"), + fee: Uint24::from(500), + },] + }) + }), + } + ); + } + + #[test] + pub fn test_swap_message_v1_usdc_relay() { + let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a0000002d010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d02000000000000000f424000"); + + let redeemer_message = + hex!("010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d02000000000000000f424000"); + + let fill = liquidity_layer_messages::Fill::read_slice(&encoded_fill).unwrap(); + assert_eq!( + fill, + liquidity_layer_messages::Fill { + source_chain: 0xf00f, + order_sender: hex!( + "0000000000000000000000000000000000000000000000000000000000000002" + ), + redeemer: hex!("000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a"), + redeemer_message: redeemer_message.to_vec().try_into().unwrap() + } + ); + + let swap_message = SwapMessageV1::read_slice(&redeemer_message).unwrap(); + assert_eq!( + swap_message, + SwapMessageV1 { + recipient: hex!("0000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d"), + redeem_mode: RedeemMode::Relay { + gas_dropoff: 0, + relaying_fee: Uint48::from(1000000u32), + }, + output_token: OutputToken::Usdc, + } + ); + } + + #[test] + pub fn test_swap_message_v1_usdc_payload() { + let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a0000002b010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000004deadbeef00"); + + let redeemer_message = + hex!("010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000004deadbeef00"); + + let fill = liquidity_layer_messages::Fill::read_slice(&encoded_fill).unwrap(); + assert_eq!( + fill, + liquidity_layer_messages::Fill { + source_chain: 0xf00f, + order_sender: hex!( + "0000000000000000000000000000000000000000000000000000000000000002" + ), + redeemer: hex!("000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a"), + redeemer_message: redeemer_message.to_vec().try_into().unwrap() + } + ); + + let swap_message = SwapMessageV1::read_slice(&redeemer_message).unwrap(); + assert_eq!( + swap_message, + SwapMessageV1 { + recipient: hex!("0000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d"), + redeem_mode: RedeemMode::Payload(hex!("deadbeef").to_vec()), + output_token: OutputToken::Usdc, + } + ); + } +} diff --git a/universal/rs/messages/src/types/mod.rs b/universal/rs/messages/src/types/mod.rs new file mode 100644 index 00000000..8263bf21 --- /dev/null +++ b/universal/rs/messages/src/types/mod.rs @@ -0,0 +1,104 @@ +mod output; +pub use output::*; + +mod swap_type; +pub use swap_type::*; + +mod uint; +pub use uint::*; + +use std::io; + +use crate::wormhole_io::{Readable, Writeable, WriteableBytes}; + +#[cfg(feature = "anchor")] +use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; + +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub enum RedeemMode { + Direct, + Payload(Vec), + Relay { + gas_dropoff: u32, + relaying_fee: crate::types::Uint48, + }, +} + +impl RedeemMode { + const DIRECT: u8 = 0; + const PAYLOAD: u8 = 1; + const RELAY: u8 = 2; + + pub fn written_size(&self) -> usize { + match self { + Self::Direct => 1, + Self::Payload(payload) => payload.len().saturating_add( + 1 // discriminant + + 4, // payload len + ), + Self::Relay { .. } => { + const FIXED: usize = 1 // discriminant + + 4 // gas_dropoff + + Uint48::BYTES; // relaying_fee + + FIXED + } + } + } +} + +impl Readable for RedeemMode { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + match u8::read(reader)? { + Self::DIRECT => Ok(Self::Direct), + Self::PAYLOAD => Ok(Self::Payload( + WriteableBytes::::read(reader).map(Into::into)?, + )), + Self::RELAY => Ok(Self::Relay { + gas_dropoff: Readable::read(reader)?, + relaying_fee: Readable::read(reader)?, + }), + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid RedeemMode", + )), + } + } +} + +impl Writeable for RedeemMode { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + match self { + Self::Direct => Self::DIRECT.write(writer), + Self::Payload(payload) => { + Self::PAYLOAD.write(writer)?; + + let writeable = unsafe_writeable_bytes_ref(payload); + + // Check whether length can be encoded. + writeable.try_encoded_len()?; + writeable.write(writer) + } + Self::Relay { + gas_dropoff, + relaying_fee, + } => { + Self::RELAY.write(writer)?; + gas_dropoff.write(writer)?; + relaying_fee.write(writer) + } + } + } +} + +fn unsafe_writeable_bytes_ref(bytes: &Vec) -> &WriteableBytes { + unsafe { std::mem::transmute::<&Vec, &WriteableBytes>(bytes) } +} diff --git a/universal/rs/messages/src/types/output.rs b/universal/rs/messages/src/types/output.rs new file mode 100644 index 00000000..7e68a24c --- /dev/null +++ b/universal/rs/messages/src/types/output.rs @@ -0,0 +1,116 @@ +use std::io; + +use crate::wormhole_io::{Readable, Writeable}; + +#[cfg(feature = "anchor")] +use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; + +use super::SwapType; + +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub enum OutputToken { + Usdc, + Gas(OutputSwap), + Other { address: [u8; 32], swap: OutputSwap }, +} + +impl OutputToken { + const USDC: u8 = 0; + const GAS: u8 = 1; + const OTHER: u8 = 2; + + pub fn written_size(&self) -> usize { + match self { + Self::Usdc => 1, + Self::Gas(swap) => swap.written_size().saturating_add(1), + Self::Other { address: _, swap } => swap.written_size().saturating_add( + 32 // address + + 1, + ), + } + } +} + +impl Readable for OutputToken { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + match u8::read(reader)? { + Self::USDC => Ok(Self::Usdc), + Self::GAS => Ok(Self::Gas(Readable::read(reader)?)), + Self::OTHER => Ok(Self::Other { + address: Readable::read(reader)?, + swap: Readable::read(reader)?, + }), + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid OutputToken", + )), + } + } +} + +impl Writeable for OutputToken { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + match self { + Self::Usdc => Self::USDC.write(writer), + Self::Gas(swap) => { + Self::GAS.write(writer)?; + swap.write(writer) + } + Self::Other { address, swap } => { + Self::OTHER.write(writer)?; + address.write(writer)?; + swap.write(writer) + } + } + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct OutputSwap { + pub deadline: u32, + pub limit_amount: u128, + pub swap_type: SwapType, +} + +impl OutputSwap { + pub fn written_size(&self) -> usize { + const FIXED: usize = 4 // deadline + + 16 // limit_amount + ; + self.swap_type.written_size().saturating_add(FIXED) + } +} + +impl Readable for OutputSwap { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + Ok(Self { + deadline: Readable::read(reader)?, + limit_amount: Readable::read(reader)?, + swap_type: Readable::read(reader)?, + }) + } +} + +impl Writeable for OutputSwap { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + self.deadline.write(writer)?; + self.limit_amount.write(writer)?; + self.swap_type.write(writer) + } +} diff --git a/universal/rs/messages/src/types/swap_type/evm/mod.rs b/universal/rs/messages/src/types/swap_type/evm/mod.rs new file mode 100644 index 00000000..5ede5641 --- /dev/null +++ b/universal/rs/messages/src/types/swap_type/evm/mod.rs @@ -0,0 +1,5 @@ +mod trader_joe; +pub use trader_joe::*; + +mod uniswap_v3; +pub use uniswap_v3::*; diff --git a/universal/rs/messages/src/types/swap_type/evm/trader_joe.rs b/universal/rs/messages/src/types/swap_type/evm/trader_joe.rs new file mode 100644 index 00000000..659ed347 --- /dev/null +++ b/universal/rs/messages/src/types/swap_type/evm/trader_joe.rs @@ -0,0 +1,128 @@ +use std::io::{self, ErrorKind}; + +use crate::wormhole_io::{Readable, Writeable}; + +#[cfg(feature = "anchor")] +use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; + +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct TraderJoeSwapParameters { + pub first_pool_id: TraderJoePoolId, + pub path: Vec, +} + +impl TraderJoeSwapParameters { + pub fn written_size(&self) -> usize { + const FIXED: usize = TraderJoePoolId::ENCODED_SIZE + + 1 // path_len + ; + self.path + .len() + .saturating_mul(TraderJoeSwapPath::ENCODED_SIZE) + .saturating_add(FIXED) + } +} + +impl Readable for TraderJoeSwapParameters { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + let first_pool_id = Readable::read(reader)?; + + let path_len = u8::read(reader)?; + let mut path = Vec::with_capacity(path_len.into()); + for _ in 0..path_len { + path.push(Readable::read(reader)?); + } + Ok(Self { + first_pool_id, + path, + }) + } +} + +impl Writeable for TraderJoeSwapParameters { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + self.first_pool_id.write(writer)?; + + let path_len = u8::try_from(self.path.len()).map_err(|_| ErrorKind::InvalidInput)?; + path_len.write(writer)?; + for path in &self.path { + path.write(writer)?; + } + Ok(()) + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct TraderJoeSwapPath { + pub evm_address: [u8; 20], + pub pool_id: TraderJoePoolId, +} + +impl TraderJoeSwapPath { + const ENCODED_SIZE: usize = 20 + TraderJoePoolId::ENCODED_SIZE; +} + +impl Readable for TraderJoeSwapPath { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + Ok(Self { + evm_address: Readable::read(reader)?, + pool_id: Readable::read(reader)?, + }) + } +} +impl Writeable for TraderJoeSwapPath { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + self.evm_address.write(writer)?; + self.pool_id.write(writer) + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct TraderJoePoolId { + pub version: u8, + pub bin_size: u16, +} + +impl TraderJoePoolId { + const ENCODED_SIZE: usize = 3; +} + +impl Readable for TraderJoePoolId { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + Ok(Self { + version: u8::read(reader)?, + bin_size: u16::read(reader)?, + }) + } +} + +impl Writeable for TraderJoePoolId { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + self.version.write(writer)?; + self.bin_size.write(writer) + } +} diff --git a/universal/rs/messages/src/types/swap_type/evm/uniswap_v3.rs b/universal/rs/messages/src/types/swap_type/evm/uniswap_v3.rs new file mode 100644 index 00000000..6722cef1 --- /dev/null +++ b/universal/rs/messages/src/types/swap_type/evm/uniswap_v3.rs @@ -0,0 +1,95 @@ +use std::io::{self, ErrorKind}; + +use crate::types::Uint24; +use crate::wormhole_io::{Readable, Writeable}; + +#[cfg(feature = "anchor")] +use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; + +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct UniswapSwapParameters { + pub first_leg_fee: Uint24, + pub path: Vec, +} + +impl UniswapSwapParameters { + pub fn written_size(&self) -> usize { + const FIXED: usize = Uint24::BYTES + + 1 // path_len + ; + self.path + .len() + .saturating_mul(UniswapSwapPath::ENCODED_SIZE) + .saturating_add(FIXED) + } +} + +impl Readable for UniswapSwapParameters { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + let first_leg_fee = Readable::read(reader)?; + + let path_len = u8::read(reader)?; + let mut path = Vec::with_capacity(path_len.into()); + for _ in 0..path_len { + path.push(Readable::read(reader)?); + } + Ok(Self { + first_leg_fee, + path, + }) + } +} + +impl Writeable for UniswapSwapParameters { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + self.first_leg_fee.write(writer)?; + + let path_len = u8::try_from(self.path.len()).map_err(|_| ErrorKind::InvalidInput)?; + path_len.write(writer)?; + for path in &self.path { + path.write(writer)?; + } + Ok(()) + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct UniswapSwapPath { + pub evm_address: [u8; 20], + pub fee: Uint24, +} + +impl UniswapSwapPath { + const ENCODED_SIZE: usize = 20 + Uint24::BYTES; +} + +impl Readable for UniswapSwapPath { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + Ok(Self { + evm_address: Readable::read(reader)?, + fee: Readable::read(reader)?, + }) + } +} +impl Writeable for UniswapSwapPath { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + self.evm_address.write(writer)?; + self.fee.write(writer) + } +} diff --git a/universal/rs/messages/src/types/swap_type/mod.rs b/universal/rs/messages/src/types/swap_type/mod.rs new file mode 100644 index 00000000..d4b6b7ea --- /dev/null +++ b/universal/rs/messages/src/types/swap_type/mod.rs @@ -0,0 +1,80 @@ +mod evm; +pub use evm::*; + +mod solana; +pub use solana::*; + +use std::io; + +use crate::wormhole_io::{Readable, Writeable}; + +#[cfg(feature = "anchor")] +use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; + +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub enum SwapType { + Invalid, + UniswapV3(UniswapSwapParameters), + TraderJoe(TraderJoeSwapParameters), + JupiterV6(JupiterV6SwapParameters), +} + +impl SwapType { + const UNISWAP_V3: u8 = 1; + const TRADER_JOE: u8 = 2; + const JUPITER_V6: u8 = 16; + + pub fn written_size(&self) -> usize { + match self { + Self::Invalid => 0, + Self::UniswapV3(parameters) => parameters.written_size().saturating_add(1), + Self::TraderJoe(parameters) => parameters.written_size().saturating_add(1), + Self::JupiterV6(parameters) => parameters.written_size().saturating_add(1), + } + } +} + +impl Readable for SwapType { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + match u8::read(reader)? { + Self::UNISWAP_V3 => Ok(Self::UniswapV3(Readable::read(reader)?)), + Self::TRADER_JOE => Ok(Self::TraderJoe(Readable::read(reader)?)), + Self::JUPITER_V6 => Ok(Self::JupiterV6(Readable::read(reader)?)), + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid SwapType", + )), + } + } +} + +impl Writeable for SwapType { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + match self { + Self::UniswapV3(parameters) => { + Self::UNISWAP_V3.write(writer)?; + parameters.write(writer) + } + Self::TraderJoe(parameters) => { + Self::TRADER_JOE.write(writer)?; + parameters.write(writer) + } + Self::JupiterV6(parameters) => { + Self::JUPITER_V6.write(writer)?; + parameters.write(writer) + } + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid SwapType", + )), + } + } +} diff --git a/universal/rs/messages/src/types/swap_type/solana/jupiter_v6.rs b/universal/rs/messages/src/types/swap_type/solana/jupiter_v6.rs new file mode 100644 index 00000000..b28b8984 --- /dev/null +++ b/universal/rs/messages/src/types/swap_type/solana/jupiter_v6.rs @@ -0,0 +1,87 @@ +use std::io; + +use crate::wormhole_io::{Readable, Writeable}; + +#[cfg(feature = "anchor")] +use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; + +#[derive(Debug, Clone, PartialEq, Eq)] +#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] +pub struct JupiterV6SwapParameters { + pub dex_program_id: Option<[u8; 32]>, +} + +impl JupiterV6SwapParameters { + pub fn written_size(&self) -> usize { + match self.dex_program_id { + Some(_) => 33, + None => 1, + } + } +} + +impl Readable for JupiterV6SwapParameters { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + Ok(Self { + dex_program_id: Readable::read(reader)?, + }) + } +} + +impl Writeable for JupiterV6SwapParameters { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + self.dex_program_id.write(writer) + } +} + +#[cfg(test)] +mod test { + use hex_literal::hex; + use solana_program::pubkey::Pubkey; + use wormhole_io::{Readable, Writeable}; + + use super::JupiterV6SwapParameters; + + #[test] + fn dex_program_id_some() { + let dex_program_id = Pubkey::from([88; 32]); + let params = JupiterV6SwapParameters { + dex_program_id: Some(dex_program_id.to_bytes()), + }; + + let mut encoded = [0; 33]; + assert_eq!(params.written_size(), encoded.len()); + + params.write(&mut encoded.as_mut_slice()).unwrap(); + assert_eq!( + encoded, + hex!("015858585858585858585858585858585858585858585858585858585858585858") + ); + + let decoded = JupiterV6SwapParameters::read(&mut &encoded[..]).unwrap(); + assert_eq!(decoded, params); + } + + #[test] + fn dex_program_id_none() { + let params = JupiterV6SwapParameters { + dex_program_id: Default::default(), + }; + + let mut encoded = [0; 1]; + assert_eq!(params.written_size(), encoded.len()); + + params.write(&mut encoded.as_mut_slice()).unwrap(); + assert_eq!(encoded, hex!("00")); + + let decoded = JupiterV6SwapParameters::read(&mut &encoded[..]).unwrap(); + assert_eq!(decoded, params); + } +} diff --git a/universal/rs/messages/src/types/swap_type/solana/mod.rs b/universal/rs/messages/src/types/swap_type/solana/mod.rs new file mode 100644 index 00000000..31e75f3e --- /dev/null +++ b/universal/rs/messages/src/types/swap_type/solana/mod.rs @@ -0,0 +1,2 @@ +mod jupiter_v6; +pub use jupiter_v6::*; diff --git a/universal/rs/messages/src/types/uint.rs b/universal/rs/messages/src/types/uint.rs new file mode 100644 index 00000000..852bf2d7 --- /dev/null +++ b/universal/rs/messages/src/types/uint.rs @@ -0,0 +1,398 @@ +use std::{io, ops::Deref}; + +use crate::wormhole_io::{Readable, Writeable}; +use ruint::{ToUintError, Uint}; + +#[cfg(feature = "idl-build")] +use anchor_lang::prelude::IdlBuild; +#[cfg(feature = "anchor")] +use anchor_lang::prelude::{AnchorDeserialize, AnchorSerialize}; + +/// New type for a 3-byte unsigned integer. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] +pub struct Uint24(Uint<24, 1>); + +impl Uint24 { + pub const ZERO: Uint24 = Self(Uint::ZERO); + pub const BYTES: usize = Uint::<24, 1>::BYTES; + pub const LAST_INDEX: usize = Self::BYTES - 1; + + pub fn from_be_bytes(bytes: [u8; Self::BYTES]) -> Self { + let mut out = u64::default(); + for (i, byte) in bytes.into_iter().enumerate() { + let value = u64::from(byte) + << usize::saturating_mul(8, usize::saturating_sub(Self::LAST_INDEX, i)); + out = out.saturating_add(value); + } + + Self(Uint::from(out)) + } + + pub fn from_le_bytes(bytes: [u8; Self::BYTES]) -> Self { + let mut out = u64::default(); + for (i, byte) in bytes.into_iter().enumerate() { + let value = u64::from(byte) << usize::saturating_mul(8, i); + out = out.saturating_add(value); + } + + Self(Uint::from(out)) + } + + pub fn to_be_bytes(&self) -> [u8; Self::BYTES] { + self.0.to_be_bytes::<{ Self::BYTES }>() + } + + pub fn to_le_bytes(&self) -> [u8; Self::BYTES] { + self.0.to_le_bytes::<{ Self::BYTES }>() + } +} + +impl Deref for Uint24 { + type Target = Uint<24, 1>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl From for Uint<24, 1> { + fn from(value: Uint24) -> Self { + value.0 + } +} + +impl From for u64 { + fn from(value: Uint24) -> Self { + value.0.into_limbs()[0] + } +} + +impl From for Uint24 { + fn from(value: u16) -> Self { + Self(Uint::from(value)) + } +} + +impl TryFrom for Uint24 { + type Error = ToUintError<::Target>; + + fn try_from(value: u32) -> Result { + Ok(Self(Uint::try_from(value)?)) + } +} + +impl TryFrom for Uint24 { + type Error = ToUintError<::Target>; + + fn try_from(value: u64) -> Result { + Ok(Self(Uint::try_from(value)?)) + } +} + +impl Readable for Uint24 { + fn read(reader: &mut R) -> io::Result + where + R: io::Read, + { + let mut bytes = <[u8; Self::BYTES]>::default(); + reader.read_exact(&mut bytes)?; + Ok(Self::from_be_bytes(bytes)) + } +} + +impl Writeable for Uint24 { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + writer.write_all(&self.to_be_bytes()) + } +} + +#[cfg(feature = "anchor")] +impl AnchorDeserialize for Uint24 { + fn deserialize_reader(reader: &mut R) -> io::Result { + let mut bytes = <[u8; Self::BYTES]>::default(); + reader.read_exact(&mut bytes)?; + Ok(Self::from_le_bytes(bytes)) + } +} + +#[cfg(feature = "anchor")] +impl AnchorSerialize for Uint24 { + fn serialize(&self, writer: &mut W) -> io::Result<()> { + writer.write_all(&self.to_le_bytes()) + } +} + +#[cfg(feature = "idl-build")] +impl IdlBuild for Uint24 { + // TODO +} + +/// New type for a 6-byte unsigned integer. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub struct Uint48(Uint<48, 1>); + +impl Uint48 { + pub const ZERO: Uint48 = Self(Uint::ZERO); + pub const BYTES: usize = Uint::<48, 1>::BYTES; + pub const LAST_INDEX: usize = Self::BYTES - 1; + + pub fn from_be_bytes(bytes: [u8; Self::BYTES]) -> Self { + let mut out = u64::default(); + for (i, byte) in bytes.into_iter().enumerate() { + let value = u64::from(byte) + << usize::saturating_mul(8, usize::saturating_sub(Self::LAST_INDEX, i)); + out = out.saturating_add(value); + } + + Self(Uint::from(out)) + } + + pub fn from_le_bytes(bytes: [u8; Self::BYTES]) -> Self { + let mut out = u64::default(); + for (i, byte) in bytes.into_iter().enumerate() { + let value = u64::from(byte) << usize::saturating_mul(8, i); + out = out.saturating_add(value); + } + + Self(Uint::from(out)) + } + + pub fn to_be_bytes(&self) -> [u8; Self::BYTES] { + self.0.to_be_bytes::<{ Self::BYTES }>() + } + + pub fn to_le_bytes(&self) -> [u8; Self::BYTES] { + self.0.to_le_bytes::<{ Self::BYTES }>() + } +} + +impl Deref for Uint48 { + type Target = Uint<48, 1>; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl From for Uint<48, 1> { + fn from(value: Uint48) -> Self { + value.0 + } +} + +impl From for u64 { + fn from(value: Uint48) -> Self { + value.0.into_limbs()[0] + } +} + +impl From for Uint48 { + fn from(value: u16) -> Self { + Self(Uint::from(value)) + } +} + +impl From for Uint48 { + fn from(value: u32) -> Self { + Self(Uint::from(value)) + } +} + +impl TryFrom for Uint48 { + type Error = ToUintError<::Target>; + + fn try_from(value: u64) -> Result { + Ok(Self(Uint::try_from(value)?)) + } +} + +impl Readable for Uint48 { + fn read(reader: &mut R) -> io::Result + where + R: io::Read, + { + let mut bytes = <[u8; Self::BYTES]>::default(); + reader.read_exact(&mut bytes)?; + Ok(Self::from_be_bytes(bytes)) + } +} + +impl Writeable for Uint48 { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + writer.write_all(&self.to_be_bytes()) + } +} + +#[cfg(feature = "anchor")] +impl AnchorDeserialize for Uint48 { + fn deserialize_reader(reader: &mut R) -> io::Result { + let mut bytes = <[u8; Self::BYTES]>::default(); + reader.read_exact(&mut bytes)?; + Ok(Self::from_le_bytes(bytes)) + } +} + +#[cfg(feature = "anchor")] +impl AnchorSerialize for Uint48 { + fn serialize(&self, writer: &mut W) -> io::Result<()> { + writer.write_all(&self.to_le_bytes()) + } +} + +#[cfg(feature = "idl-build")] +impl IdlBuild for Uint48 { + // TODO +} + +#[cfg(test)] +mod test { + use hex_literal::hex; + + use super::*; + + #[test] + fn test_uint24_small_be() { + const EXPECTED: u64 = 69; + + let encoded = hex!("000045"); + let value = Uint24::from_be_bytes(encoded); + assert_eq!(value.0, Uint::from(EXPECTED)); + assert_eq!(value.to_be_bytes(), encoded); + + let value = ::read(&mut &encoded[..]).unwrap(); + assert_eq!(value.0, Uint::from(EXPECTED)); + + let mut written = [0u8; 3]; + value.write(&mut written.as_mut_slice()).unwrap(); + assert_eq!(written, encoded); + } + + #[test] + #[cfg(feature = "anchor")] + fn test_uint24_small_le() { + const EXPECTED: u64 = 69; + + let encoded = hex!("450000"); + let value = Uint24::from_le_bytes(encoded); + assert_eq!(value.0, Uint::from(EXPECTED)); + assert_eq!(value.to_le_bytes(), encoded); + + let value = ::deserialize(&mut &encoded[..]).unwrap(); + assert_eq!(value.0, Uint::from(EXPECTED)); + + let mut written = [0u8; 3]; + value.serialize(&mut written.as_mut_slice()).unwrap(); + assert_eq!(written, encoded); + } + + #[test] + fn test_uint24_large_be() { + const EXPECTED: u64 = 4408389; + + let encoded = hex!("434445"); + let value = Uint24::from_be_bytes(encoded); + assert_eq!(value.0, Uint::from(EXPECTED)); + assert_eq!(value.to_be_bytes(), encoded); + + let value = ::read(&mut &encoded[..]).unwrap(); + assert_eq!(value.0, Uint::from(EXPECTED)); + + let mut written = [0u8; 3]; + value.write(&mut written.as_mut_slice()).unwrap(); + assert_eq!(written, encoded); + } + + #[test] + #[cfg(feature = "anchor")] + fn test_uint24_large_le() { + const EXPECTED: u64 = 4408389; + + let encoded = hex!("454443"); + let value = Uint24::from_le_bytes(encoded); + assert_eq!(value.0, Uint::from(EXPECTED)); + assert_eq!(value.to_le_bytes(), encoded); + + let value = ::deserialize(&mut &encoded[..]).unwrap(); + assert_eq!(value.0, Uint::from(EXPECTED)); + + let mut written = [0u8; 3]; + value.serialize(&mut written.as_mut_slice()).unwrap(); + assert_eq!(written, encoded); + } + + #[test] + fn test_uint48_small_be() { + const EXPECTED: u64 = 69; + + let encoded = hex!("000000000045"); + let value = Uint48::from_be_bytes(encoded); + assert_eq!(value.0, Uint::from(EXPECTED)); + assert_eq!(value.to_be_bytes(), encoded); + + let value = ::read(&mut &encoded[..]).unwrap(); + assert_eq!(value.0, Uint::from(EXPECTED)); + + let mut written = [0u8; 6]; + value.write(&mut written.as_mut_slice()).unwrap(); + assert_eq!(written, encoded); + } + + #[test] + #[cfg(feature = "anchor")] + fn test_uint48_small_le() { + const EXPECTED: u64 = 69; + + let encoded = hex!("450000000000"); + let value = Uint48::from_le_bytes(encoded); + assert_eq!(value.0, Uint::from(EXPECTED)); + assert_eq!(value.to_le_bytes(), encoded); + + let value = ::deserialize(&mut &encoded[..]).unwrap(); + assert_eq!(value.0, Uint::from(EXPECTED)); + + let mut written = [0u8; 6]; + value.serialize(&mut written.as_mut_slice()).unwrap(); + assert_eq!(written, encoded); + } + + #[test] + fn test_uint48_large_be() { + const EXPECTED: u64 = 70649028756549; + + let encoded = hex!("404142434445"); + let value = Uint48::from_be_bytes(encoded); + assert_eq!(value.0, Uint::from(EXPECTED)); + assert_eq!(value.to_be_bytes(), encoded); + + let value = ::read(&mut &encoded[..]).unwrap(); + assert_eq!(value.0, Uint::from(EXPECTED)); + + let mut written = [0u8; 6]; + value.write(&mut written.as_mut_slice()).unwrap(); + assert_eq!(written, encoded); + } + + #[test] + #[cfg(feature = "anchor")] + fn test_uint48_large_le() { + const EXPECTED: u64 = 70649028756549; + + let encoded = hex!("454443424140"); + let value = Uint48::from_le_bytes(encoded); + assert_eq!(value.0, Uint::from(EXPECTED)); + assert_eq!(value.to_le_bytes(), encoded); + + let value = ::deserialize(&mut &encoded[..]).unwrap(); + assert_eq!(value.0, Uint::from(EXPECTED)); + + let mut written = [0u8; 6]; + value.serialize(&mut written.as_mut_slice()).unwrap(); + assert_eq!(written, encoded); + } +} From 759f8edb1beabe05cde97e0c902cf93b1cf6738a Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Tue, 14 May 2024 15:17:55 -0500 Subject: [PATCH 02/50] solana: complete swap gas (direct) (#20) * solana: override slippage to 0 * solana: add phoenix v1 and wsol * solana/ts: clean up * solana: add gas handling; more clean up --------- Co-authored-by: A5 Pickle --- solana/Anchor.toml | 37 +- solana/Makefile | 7 +- .../programs/swap-layer/src/composite/mod.rs | 16 +- .../src/processor/complete/other/direct.rs | 88 ++- ...teFlip.ts => testJupV6QuoteFlipPhoenix.ts} | 48 +- .../ts/scripts/testJupV6QuoteFlipWhirlpool.ts | 5 +- solana/ts/scripts/testJupiterQuote.ts | 10 +- solana/ts/src/jupiterV6/index.ts | 22 +- solana/ts/src/swapLayer/index.ts | 102 ++-- solana/ts/tests/10__jupiterTest.ts | 527 ++++++++++++------ .../ts/tests/accounts/payer_wsol_token.json | 14 + .../phoenix_jupiter_trader_quote_token.json | 14 + .../phoenix_v1/phoenix_usdc_custody.json | 14 + .../phoenix_v1/phoenix_wsol_custody.json | 14 + .../phoenix_wsol_usdc_market_state.json | 14 + .../whirlpool_usdc_usdt_tick_array_0.json | 14 - .../whirlpool_usdc_usdt_tick_array_1a.json | 14 - .../whirlpool_usdc_usdt_tick_array_1b.json | 14 - .../whirlpool_usdc_usdt_tick_array_2a.json | 14 - .../whirlpool_usdc_usdt_tick_array_2b.json | 14 - .../phoenix_v1_usdc_to_wsol.json | 116 ++++ .../phoenix_v1_wsol_to_usdc.json | 116 ++++ 22 files changed, 878 insertions(+), 356 deletions(-) rename solana/ts/scripts/{testJupV6QuoteFlip.ts => testJupV6QuoteFlipPhoenix.ts} (70%) create mode 100644 solana/ts/tests/accounts/payer_wsol_token.json create mode 100644 solana/ts/tests/accounts/phoenix_v1/phoenix_jupiter_trader_quote_token.json create mode 100644 solana/ts/tests/accounts/phoenix_v1/phoenix_usdc_custody.json create mode 100644 solana/ts/tests/accounts/phoenix_v1/phoenix_wsol_custody.json create mode 100644 solana/ts/tests/accounts/phoenix_v1/phoenix_wsol_usdc_market_state.json delete mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_0.json delete mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1a.json delete mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1b.json delete mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2a.json delete mode 100644 solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2b.json create mode 100644 solana/ts/tests/jupiterV6SwapResponses/phoenix_v1_usdc_to_wsol.json create mode 100644 solana/ts/tests/jupiterV6SwapResponses/phoenix_v1_wsol_to_usdc.json diff --git a/solana/Anchor.toml b/solana/Anchor.toml index e78e9192..62b40e07 100644 --- a/solana/Anchor.toml +++ b/solana/Anchor.toml @@ -179,11 +179,6 @@ filename = "ts/tests/accounts/usdt_mint.json" address = "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4" program = "ts/tests/artifacts/mainnet_jupiter_v6.so" -### Whirlpool Program -[[test.genesis]] -address = "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc" -program = "ts/tests/artifacts/mainnet_whirlpool.so" - ### Jupiter V6 -- Custody Token Owner [[test.validator.account]] address = "BQ72nSv9f3PRyRKCBnHLVrerrv37CYTHm5h3s9VSGQDV" @@ -204,6 +199,11 @@ filename = "ts/tests/accounts/jupiter/jupiter_usdt_custody_token.json" address = "GxS6FiQ3mNnAar9HGQ6mxP7t6FcwmHkU7peSeQDUHmpN" filename = "ts/tests/accounts/jupiter/jupiter_lut1.json" +### Whirlpool Program +[[test.genesis]] +address = "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc" +program = "ts/tests/artifacts/mainnet_whirlpool.so" + ### Whirlpool -- USDC-USDT Pool [[test.validator.account]] address = "4fuUiYxTQ6QCrdSq9ouBYcTM7bqSwYTSyLueGZLTy4T4" @@ -242,4 +242,29 @@ filename = "ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__3.json" ### Whirlpool -- USDC-USDT Pool Tick Array 4 [[test.validator.account]] address = "9opqNK3dWUijw8VNLtvne4juCTq1qADaph29tZqkoZHa" -filename = "ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__4.json" \ No newline at end of file +filename = "ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array__4.json" + +### Phoenix V1 Program +[[test.genesis]] +address = "PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY" +program = "ts/tests/artifacts/mainnet_phoenix_v1.so" + +### Phoenix V1 -- Jupiter Trader Quote Token Account +[[test.validator.account]] +address = "EXrqY7jLTLp83H38L8Zw3GvGkk1KoQbYTckPGBghwD8X" +filename = "ts/tests/accounts/phoenix_v1/phoenix_jupiter_trader_quote_token.json" + +### Phoenix V1 -- USDC Custody +[[test.validator.account]] +address = "3HSYXeGc3LjEPCuzoNDjQN37F1ebsSiR4CqXVqQCdekZ" +filename = "ts/tests/accounts/phoenix_v1/phoenix_usdc_custody.json" + +### Phoenix V1 -- WSOL Custody +[[test.validator.account]] +address = "8g4Z9d6PqGkgH31tMW6FwxGhwYJrXpxZHQrkikpLJKrG" +filename = "ts/tests/accounts/phoenix_v1/phoenix_wsol_custody.json" + +### Phoenix V1 -- WSOL-USDC Market State +[[test.validator.account]] +address = "4DoNfFBfF7UokCC2FQzriy7yHK6DY6NVdYpuekQ5pRgg" +filename = "ts/tests/accounts/phoenix_v1/phoenix_wsol_usdc_market_state.json" \ No newline at end of file diff --git a/solana/Makefile b/solana/Makefile index e21349b5..638f107d 100644 --- a/solana/Makefile +++ b/solana/Makefile @@ -3,7 +3,8 @@ CLONED_PROGRAMS=\ ts/tests/artifacts/mainnet_cctp_token_messenger_minter.so \ ts/tests/artifacts/mainnet_cctp_message_transmitter.so \ ts/tests/artifacts/mainnet_jupiter_v6.so \ - ts/tests/artifacts/mainnet_whirlpool.so + ts/tests/artifacts/mainnet_whirlpool.so \ + ts/tests/artifacts/mainnet_phoenix_v1.so .PHONY: all all: check @@ -73,5 +74,5 @@ ts/tests/artifacts/mainnet_jupiter_v6.so: ts/tests/artifacts ts/tests/artifacts/mainnet_whirlpool.so: ts/tests/artifacts solana program dump -u m whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc ts/tests/artifacts/mainnet_whirlpool.so -../lib/example-liquidity-layer/solana/artifacts-localnet: - cd ../lib/example-liquidity-layer/solana && NETWORK=localnet $(MAKE) build +ts/tests/artifacts/mainnet_phoenix_v1.so: ts/tests/artifacts + solana program dump -u m PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY ts/tests/artifacts/mainnet_phoenix_v1.so diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs index 8a2440ac..0e6eb008 100644 --- a/solana/programs/swap-layer/src/composite/mod.rs +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -186,15 +186,15 @@ pub struct ConsumeSwapLayerFill<'info> { /// /// CHECK: Mutable. Seeds must be \["custody"\, source_chain.to_be_bytes()]. #[account(mut)] - pub fill_custody_token: Box>, + fill_custody_token: Box>, associated_peer: RegisteredPeer<'info>, /// CHECK: Recipient of lamports from closing the prepared_fill account. #[account(mut)] - pub beneficiary: UncheckedAccount<'info>, + beneficiary: UncheckedAccount<'info>, - pub token_router_program: Program<'info, token_router::program::TokenRouter>, + token_router_program: Program<'info, token_router::program::TokenRouter>, } impl<'info> ConsumeSwapLayerFill<'info> { @@ -349,7 +349,11 @@ impl<'info> CompleteSwap<'info> { Ok(self.src_swap_token.amount) } - pub fn close_swap_accounts(&self, bumps: &CompleteSwapBumps) -> Result<()> { + pub fn close_swap_accounts( + &self, + bumps: &CompleteSwapBumps, + destination: AccountInfo<'info>, + ) -> Result<()> { let prepared_key = self.prepared_fill_key(); let swap_authority_seeds = &[ crate::SWAP_AUTHORITY_SEED_PREFIX, @@ -361,7 +365,7 @@ impl<'info> CompleteSwap<'info> { self.token_program.to_account_info(), token::CloseAccount { account: self.src_swap_token.to_account_info(), - destination: self.payer.to_account_info(), + destination: destination.to_account_info(), authority: self.authority.to_account_info(), }, &[swap_authority_seeds], @@ -371,7 +375,7 @@ impl<'info> CompleteSwap<'info> { self.token_program.to_account_info(), token::CloseAccount { account: self.dst_swap_token.to_account_info(), - destination: self.payer.to_account_info(), + destination, authority: self.authority.to_account_info(), }, &[swap_authority_seeds], diff --git a/solana/programs/swap-layer/src/processor/complete/other/direct.rs b/solana/programs/swap-layer/src/processor/complete/other/direct.rs index a06aade4..8915b955 100644 --- a/solana/programs/swap-layer/src/processor/complete/other/direct.rs +++ b/solana/programs/swap-layer/src/processor/complete/other/direct.rs @@ -7,7 +7,7 @@ use crate::{ }, }; use anchor_lang::prelude::*; -use anchor_spl::token; +use anchor_spl::{associated_token, token}; use swap_layer_messages::{ messages::SwapMessageV1, types::{JupiterV6SwapParameters, OutputSwap, OutputToken, RedeemMode, SwapType}, @@ -30,16 +30,23 @@ pub struct CompleteSwapDirect<'info> { #[account( mut, - associated_token::mint = complete_swap.dst_mint, - associated_token::authority = recipient + address = associated_token::get_associated_token_address( + &recipient.key(), + &complete_swap.dst_mint.key() + ) )] - /// Recipient associated token account. The recipient authority check - /// is necessary to ensure that the recipient is the intended recipient - /// of the bridged tokens. Mutable. - recipient_token: Box>, + /// Recipient associated token account. The recipient authority check is necessary to ensure + /// that the recipient is the intended recipient of the bridged tokens. + /// + /// If OutputToken::Other, this account will be deserialized to ensure that the recipient is + /// the owner of this token account. + /// + /// CHECK: Mutable ATA whose owner is the recipient and mint is the destination mint. + recipient_token: UncheckedAccount<'info>, /// CHECK: This account must be the owner of the recipient token account. The recipient token /// account must be encoded in the prepared fill. + #[account(mut)] recipient: UncheckedAccount<'info>, } @@ -64,6 +71,17 @@ where match redeem_mode { RedeemMode::Direct => match output_token { + OutputToken::Gas(OutputSwap { + deadline: _, + limit_amount, + swap_type: SwapType::JupiterV6(swap_params), + }) => handle_complete_swap_direct_jupiter_v6( + ctx, + ix_data, + limit_amount.try_into().unwrap(), + swap_params, + true, + ), OutputToken::Other { address: _, swap: @@ -77,6 +95,7 @@ where ix_data, limit_amount.try_into().unwrap(), swap_params, + false, ), _ => err!(SwapLayerError::InvalidOutputToken), }, @@ -89,6 +108,7 @@ pub fn handle_complete_swap_direct_jupiter_v6<'a, 'b, 'c, 'info>( ix_data: Vec, limit_amount: u64, swap_params: JupiterV6SwapParameters, + unwrap_native: bool, ) -> Result<()> where 'c: 'info, @@ -184,9 +204,7 @@ where // This is perverse, but we are performing a balance check after the swap to see if we get // the desired amount. If we don't, revert. jupiter_args.quoted_out_amount = limit_amount; - - // Configure 100% slippage (yikes). - jupiter_args.slippage_bps = 10000; + jupiter_args.slippage_bps = 0; // Peek into the head of remaining accounts. This account will be the dex program that Jupiter // V6 interacts with. If the swap params specify a specific dex program, we need to ensure that @@ -242,23 +260,41 @@ where SwapLayerError::SwapFailed ); - // Transfer destination tokens to recipient. - token::transfer( - CpiContext::new_with_signer( - ctx.accounts.complete_swap.token_program.to_account_info(), - token::Transfer { - from: dst_swap_token.to_account_info(), - to: ctx.accounts.recipient_token.to_account_info(), - authority: swap_authority.to_account_info(), - }, - &[swap_authority_seeds], - ), - dst_swap_token.amount, - )?; + let recipient = &ctx.accounts.recipient; + + if !unwrap_native { + // Verify that the encoded owner is the actual owner. ATAs are no different from other token + // accounts, so anyone can set the authority of an ATA to be someone else. + { + let mut acc_data: &[_] = &ctx.accounts.recipient_token.data.borrow(); + let recipient_token_owner = + token::TokenAccount::try_deserialize(&mut acc_data).map(|token| token.owner)?; + require_keys_eq!( + recipient_token_owner, + recipient.key(), + ErrorCode::ConstraintTokenOwner, + ); + } + + // Transfer destination tokens to recipient. + token::transfer( + CpiContext::new_with_signer( + ctx.accounts.complete_swap.token_program.to_account_info(), + token::Transfer { + from: dst_swap_token.to_account_info(), + to: ctx.accounts.recipient_token.to_account_info(), + authority: swap_authority.to_account_info(), + }, + &[swap_authority_seeds], + ), + dst_swap_token.amount, + )?; + } - ctx.accounts - .complete_swap - .close_swap_accounts(&ctx.bumps.complete_swap) + ctx.accounts.complete_swap.close_swap_accounts( + &ctx.bumps.complete_swap, + ctx.accounts.recipient.to_account_info(), + ) } //////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/solana/ts/scripts/testJupV6QuoteFlip.ts b/solana/ts/scripts/testJupV6QuoteFlipPhoenix.ts similarity index 70% rename from solana/ts/scripts/testJupV6QuoteFlip.ts rename to solana/ts/scripts/testJupV6QuoteFlipPhoenix.ts index 214fa033..4fe04b54 100644 --- a/solana/ts/scripts/testJupV6QuoteFlip.ts +++ b/solana/ts/scripts/testJupV6QuoteFlipPhoenix.ts @@ -5,34 +5,20 @@ import { execSync } from "child_process"; import { argv } from "process"; const USDC_MINT_ADDRESS = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); -const USDT_MINT_ADDRESS = new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"); -const ALLOWED_DEXES = [ - //"Lifinity V2", // use - //"Meteora DLMM", // use - //"Orca V2", - //"Phoenix", // use - //"Raydium", - //"Raydium CLMM", // use - "Whirlpool", // use -]; +const ALLOWED_DEXES = ["Phoenix"]; main(argv); async function main(argv: string[]) { - if (argv.length < 3) { - console.error("Usage: testJupV6QuoteFlip.ts "); - process.exit(1); - } - - const amount = Number(argv[2]); + const price = 145; const slippageBps = 200; const jupiter = createJupiterApiClient({ basePath: "https://quote-api.jup.ag/v6", }); - const inputMint = USDT_MINT_ADDRESS; + const inputMint = splToken.NATIVE_MINT; const outputMint = USDC_MINT_ADDRESS; const swapLayerProgramId = new PublicKey("SwapLayer1111111111111111111111111111111111"); @@ -47,14 +33,14 @@ async function main(argv: string[]) { const quoteResponse = await jupiter.quoteGet({ inputMint: inputMint.toString(), outputMint: outputMint.toString(), - amount, + amount: 100_000 * Math.floor(1_000_000_000 / price), slippageBps, onlyDirectRoutes: true, swapMode: "ExactIn", dexes: ALLOWED_DEXES, }); console.log( - "USDT -> USDC, quoteResponse out amounts", + "WSOL -> USDC, quoteResponse out amounts", quoteResponse.outAmount, quoteResponse.otherAmountThreshold, ); @@ -66,20 +52,30 @@ async function main(argv: string[]) { }, }); console.log("ixResponse", JSON.stringify(ixResponse.swapInstruction, null, 2)); + for (let i = 13; i < ixResponse.swapInstruction.accounts.length; i++) { + const account = ixResponse.swapInstruction.accounts[i].pubkey; + const cmd = `solana account -u m -o collected/${account}.json --output json ${account}`; + console.log(cmd); + try { + execSync(cmd); + } catch (_) { + console.log("uh oh, failed"); + } + } } { const quoteResponse = await jupiter.quoteGet({ inputMint: outputMint.toString(), outputMint: inputMint.toString(), - amount, + amount: 100_000_000_000, slippageBps, onlyDirectRoutes: true, swapMode: "ExactIn", dexes: ALLOWED_DEXES, }); console.log( - "USDC -> USDT, quoteResponse out amounts", + "USDC -> WSOL, quoteResponse out amounts", quoteResponse.outAmount, quoteResponse.otherAmountThreshold, ); @@ -91,6 +87,16 @@ async function main(argv: string[]) { }, }); console.log("ixResponse", JSON.stringify(ixResponse.swapInstruction, null, 2)); + for (let i = 13; i < ixResponse.swapInstruction.accounts.length; i++) { + const account = ixResponse.swapInstruction.accounts[i].pubkey; + const cmd = `solana account -u m -o collected/${account}.json --output json ${account}`; + console.log(cmd); + try { + execSync(cmd); + } catch (_) { + console.log("uh oh, failed"); + } + } } } diff --git a/solana/ts/scripts/testJupV6QuoteFlipWhirlpool.ts b/solana/ts/scripts/testJupV6QuoteFlipWhirlpool.ts index 552d417a..214fa033 100644 --- a/solana/ts/scripts/testJupV6QuoteFlipWhirlpool.ts +++ b/solana/ts/scripts/testJupV6QuoteFlipWhirlpool.ts @@ -26,6 +26,7 @@ async function main(argv: string[]) { } const amount = Number(argv[2]); + const slippageBps = 200; const jupiter = createJupiterApiClient({ basePath: "https://quote-api.jup.ag/v6", @@ -47,7 +48,7 @@ async function main(argv: string[]) { inputMint: inputMint.toString(), outputMint: outputMint.toString(), amount, - slippageBps: 200, + slippageBps, onlyDirectRoutes: true, swapMode: "ExactIn", dexes: ALLOWED_DEXES, @@ -72,7 +73,7 @@ async function main(argv: string[]) { inputMint: outputMint.toString(), outputMint: inputMint.toString(), amount, - slippageBps: 50, + slippageBps, onlyDirectRoutes: true, swapMode: "ExactIn", dexes: ALLOWED_DEXES, diff --git a/solana/ts/scripts/testJupiterQuote.ts b/solana/ts/scripts/testJupiterQuote.ts index 1fbdd631..4c11a2de 100644 --- a/solana/ts/scripts/testJupiterQuote.ts +++ b/solana/ts/scripts/testJupiterQuote.ts @@ -15,10 +15,10 @@ const ALLOWED_DEXES = [ //"Lifinity V2", // use //"Meteora DLMM", // use //"Orca V2", - //"Phoenix", // use + "Phoenix", // use //"Raydium", //"Raydium CLMM", // use - "Whirlpool", // use + //"Whirlpool", // use ]; main(); @@ -28,13 +28,15 @@ async function main() { basePath: "https://quote-api.jup.ag/v6", }); - const inputMint = USDT_MINT_ADDRESS; + const inputMint = splToken.NATIVE_MINT; const outputMint = USDC_MINT_ADDRESS; + const price = 145; + const quoteRequest = { inputMint: inputMint.toString(), outputMint: outputMint.toString(), - amount: 50000000000, + amount: 50_000 * Math.floor(1_000_000_000 / price), slippageBps: 50, autoSlippage: false, computeAutoSlippage: false, diff --git a/solana/ts/src/jupiterV6/index.ts b/solana/ts/src/jupiterV6/index.ts index 8dd737a9..853e0179 100644 --- a/solana/ts/src/jupiterV6/index.ts +++ b/solana/ts/src/jupiterV6/index.ts @@ -20,7 +20,7 @@ export function toTransactionInstruction(instruction: jupAg.Instruction): Transa } export type ModifySharedAccountsRouteOpts = { - inAmount: bigint; + inAmount?: bigint; quotedOutAmount?: bigint; slippageBps?: number; cpi?: boolean; @@ -40,10 +40,8 @@ export function modifySharedAccountsRouteInstruction( tokenOwner: PublicKey, opts: ModifySharedAccountsRouteOpts, ): ModifiedSharedAccountsRoute { - const { inAmount } = opts; - let { quotedOutAmount, slippageBps, cpi } = opts; - quotedOutAmount ??= inAmount; - slippageBps ??= 0; + const { inAmount, quotedOutAmount, slippageBps } = opts; + let { cpi } = opts; cpi ??= false; const ix = toTransactionInstruction(instruction); @@ -72,14 +70,20 @@ export function modifySharedAccountsRouteInstruction( // Deserialize to modify args. const args = decodeSharedAccountsRouteArgs(ix.data) as any; - args.inAmount = inAmount; - args.quotedOutAmount = quotedOutAmount; - args.slippageBps = slippageBps; + if (inAmount !== undefined) { + args.inAmount = inAmount; + } + if (quotedOutAmount !== undefined) { + args.quotedOutAmount = quotedOutAmount; + } + if (slippageBps !== undefined) { + args.slippageBps = slippageBps; + } // Serialize again. ix.data = encodeSharedAccountsRouteArgs(args); - const minAmountOut = (quotedOutAmount * BigInt(10000 - slippageBps)) / BigInt(10000); + const minAmountOut = (args.quotedOutAmount * BigInt(10000 - args.slippageBps)) / BigInt(10000); return { instruction: ix, diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 5b835e43..22855281 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -517,53 +517,61 @@ export class SwapLayerProgram { .instruction(); } - // async completeSwapDirectIx( - // accounts: { payer: PublicKey; preparedFill: PublicKey; beneficiary?: PublicKey }, - // args: { - // innerIx: TransactionInstruction; - // }, - // ): Promise { - // const { payer, preparedFill } = accounts; - // const { innerIx } = args; - - // let { beneficiary } = accounts; - // beneficiary ??= payer; - - // const swapAuthority = - - // return this.program.methods - // .completeSwap(innerIx.data) - // .accounts({ - // payer: payer, - // consumeSwapLayerFill: await this.consumeSwapLayerFillComposite({ - // preparedFill, - // beneficiary, - // }), - // swapAuthority, - // srcSwapToken: splToken.getAssociatedTokenAddressSync( - // swapLayer.mint, - // swapAuthority, - // true, // allowOwnerOffCurve - // ), - // dstSwapToken: splToken.getAssociatedTokenAddressSync( - // USDT_MINT_ADDRESS, - // swapAuthority, - // true, // allowOwnerOffCurve - // ), - // usdc: swapLayer.usdcComposite(), - // dstMint: USDT_MINT_ADDRESS, - // recipientToken: splToken.getAssociatedTokenAddressSync( - // USDT_MINT_ADDRESS, - // recipient.publicKey, - // ), - // recipient: recipient.publicKey, - // associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, - // tokenProgram: splToken.TOKEN_PROGRAM_ID, - // systemProgram: SystemProgram.programId, - // }) - // .remainingAccounts(innerIx.keys) - // .instruction(); - // } + async completeSwapDirectIx( + accounts: { + payer: PublicKey; + preparedFill: PublicKey; + recipient: PublicKey; + dstMint?: PublicKey; + beneficiary?: PublicKey; + srcMint?: PublicKey; + }, + args: { + cpiInstruction: TransactionInstruction; + }, + ): Promise { + const { payer, preparedFill, recipient } = accounts; + const { cpiInstruction } = args; + + let { beneficiary, srcMint, dstMint } = accounts; + beneficiary ??= payer; + srcMint ??= this.mint; + dstMint ??= splToken.NATIVE_MINT; + + const swapAuthority = this.swapAuthorityAddress(preparedFill); + + return this.program.methods + .completeSwapDirect(cpiInstruction.data) + .accounts({ + completeSwap: { + payer, + consumeSwapLayerFill: await this.consumeSwapLayerFillComposite({ + preparedFill, + beneficiary, + }), + authority: swapAuthority, + srcSwapToken: splToken.getAssociatedTokenAddressSync( + srcMint, + swapAuthority, + true, // allowOwnerOffCurve + ), + dstSwapToken: splToken.getAssociatedTokenAddressSync( + dstMint, + swapAuthority, + true, // allowOwnerOffCurve + ), + srcMint, + dstMint, + associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, + tokenProgram: splToken.TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }, + recipientToken: splToken.getAssociatedTokenAddressSync(dstMint, recipient), + recipient, + }) + .remainingAccounts(cpiInstruction.keys) + .instruction(); + } tokenRouterProgram(): tokenRouterSdk.TokenRouterProgram { switch (this._programId) { diff --git a/solana/ts/tests/10__jupiterTest.ts b/solana/ts/tests/10__jupiterTest.ts index 62b4f8eb..12fdd195 100644 --- a/solana/ts/tests/10__jupiterTest.ts +++ b/solana/ts/tests/10__jupiterTest.ts @@ -27,6 +27,7 @@ import { PAYER_KEYPAIR, REGISTERED_TOKEN_ROUTERS, USDC_MINT_ADDRESS, + expectIxErr, expectIxOk, getBlockTime, postLiquidityLayerVaa, @@ -34,59 +35,40 @@ import { import { VaaAccount } from "@wormhole-foundation/example-liquidity-layer-solana/wormhole"; import { Chain, toChainId } from "@wormhole-foundation/sdk-base"; import { toUniversal } from "@wormhole-foundation/sdk-definitions"; -import * as legacyAnchor from "anchor-0.29.0"; -import { use as chaiUse, expect } from "chai"; +import { assert } from "chai"; import * as fs from "fs"; import * as jupiterV6 from "../src/jupiterV6"; import { + OutputToken, + RedeemMode, SwapLayerMessage, SwapLayerProgram, decodeSwapLayerMessage, encodeSwapLayerMessage, localnet, } from "../src/swapLayer"; -import { IDL as WHIRLPOOL_IDL } from "../src/types/whirlpool"; import { FEE_UPDATER_KEYPAIR, REGISTERED_PEERS, USDT_MINT_ADDRESS, - WHIRLPOOL_PROGRAM_ID, createLut, tryNativeToUint8Array, } from "./helpers"; -chaiUse(require("chai-as-promised")); - describe("Jupiter V6 Testing", () => { const connection = new Connection(LOCALHOST, "processed"); + const payer = PAYER_KEYPAIR; const relayer = Keypair.generate(); const owner = OWNER_KEYPAIR; - const recipient = Keypair.generate(); const ownerAssistant = OWNER_ASSISTANT_KEYPAIR; const feeUpdater = FEE_UPDATER_KEYPAIR; - const feeRecipient = Keypair.generate(); - const feeRecipientToken = splToken.getAssociatedTokenAddressSync( - USDC_MINT_ADDRESS, - feeRecipient.publicKey, - ); - - // Sending chain information. - const foreignChain = toChainId("Sepolia"); - const foreignEndpointAddress = Array.from( - Buffer.alloc(32, "000000000000000000000000603541d1Cf7178C407aA7369b67CB7e0274952e2", "hex"), - ); - const foreignCctpDomain = 0; // Program SDKs const swapLayer = new SwapLayerProgram(connection, localnet(), USDC_MINT_ADDRESS); const tokenRouter = swapLayer.tokenRouterProgram(); const matchingEngine = tokenRouter.matchingEngineProgram(); - const whirlpoolProgram = new legacyAnchor.Program(WHIRLPOOL_IDL, WHIRLPOOL_PROGRAM_ID, { - connection, - }); - const luts: [PublicKey, PublicKey] = [PublicKey.default, PublicKey.default]; let testCctpNonce = 2n ** 64n - 1n; @@ -98,14 +80,7 @@ describe("Jupiter V6 Testing", () => { describe("Jupiter V6 Setup", function () { before("Generate ATAs", async function () { - for (const mint of [swapLayer.mint, USDT_MINT_ADDRESS]) { - await splToken.getOrCreateAssociatedTokenAccount( - connection, - payer, - mint, - recipient.publicKey, - ); - + for (const mint of [swapLayer.mint, USDT_MINT_ADDRESS, splToken.NATIVE_MINT]) { for (let i = 0; i < 8; ++i) { const authority = jupiterV6.programAuthorityAddress(i); @@ -118,6 +93,30 @@ describe("Jupiter V6 Testing", () => { ); } } + + const payerWsol = splToken.getAssociatedTokenAddressSync( + splToken.NATIVE_MINT, + payer.publicKey, + ); + + await expectIxOk( + connection, + [ + splToken.createAssociatedTokenAccountInstruction( + payer.publicKey, + payerWsol, + payer.publicKey, + splToken.NATIVE_MINT, + ), + SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: payerWsol, + lamports: 2_000_000_000_000n, + }), + splToken.createSyncNativeInstruction(payerWsol), + ], + [payer], + ); }); after("Setup Lookup Tables", async function () { @@ -138,37 +137,56 @@ describe("Jupiter V6 Testing", () => { ); }); - it("Swap USDC to USDT From Simulated Quote", async function () { + it("User Swap USDC to USDT From Simulated Quote -- Whirlpool", async function () { await invokeSharedAccountsRouteAsUser( modifyUsdcToUsdtSwapResponseForTest(payer.publicKey, { inAmount: 100_000_000n, + quotedOutAmount: 100_000_000n, slippageBps: 50, }), ); }); - it("Swap USDT to USDC From Simulated Quote", async function () { + it("User Swap USDT to USDC From Simulated Quote -- Whirlpool", async function () { await invokeSharedAccountsRouteAsUser( modifyUsdtToUsdcSwapResponseForTest(payer.publicKey, { inAmount: 50_000_000n, + quotedOutAmount: 50_000_000n, slippageBps: 50, }), ); }); - async function invokeSharedAccountsRouteAsUser(modifyArgs: { - instruction: TransactionInstruction; - sourceMint: PublicKey; - destinationMint: PublicKey; - minAmountOut: bigint; - }) { - const { instruction: ix, sourceMint, destinationMint, minAmountOut } = modifyArgs; + it("User Swap USDC to WSOL From Simulated Quote -- Phoenix V1", async function () { + await invokeSharedAccountsRouteAsUser( + modifyUsdcToWsolSwapResponseForTest(payer.publicKey, { + inAmount: 150_000_000n, + quotedOutAmount: 1_000_000_000n, + slippageBps: 200, + }), + ); + }); - const srcToken = splToken.getAssociatedTokenAddressSync(sourceMint, payer.publicKey); - const dstToken = splToken.getAssociatedTokenAddressSync( - destinationMint, - payer.publicKey, + it("User Swap WSOL to USDC From Simulated Quote -- Phoenix V1", async function () { + await invokeSharedAccountsRouteAsUser( + modifyWsolToUsdcSwapResponseForTest(payer.publicKey, { + inAmount: 1_000_000_000n, + quotedOutAmount: 150_000_000n, + slippageBps: 200, + }), ); + }); + + async function invokeSharedAccountsRouteAsUser( + modifyArgs: jupiterV6.ModifiedSharedAccountsRoute, + ) { + const { + instruction: ix, + sourceToken: srcToken, + destinationToken: dstToken, + minAmountOut, + } = modifyArgs; + const { amount: srcBalanceBefore } = await splToken.getAccount(connection, srcToken); const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); @@ -177,10 +195,10 @@ describe("Jupiter V6 Testing", () => { const decodedIxData = jupiterV6.decodeSharedAccountsRouteArgs(ix.data); const { amount: srcBalanceAfter } = await splToken.getAccount(connection, srcToken); - expect(srcBalanceBefore - srcBalanceAfter).equals(decodedIxData.inAmount); + assert.strictEqual(srcBalanceBefore - srcBalanceAfter, decodedIxData.inAmount); const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); - expect(dstBalanceAfter - dstBalanceBefore >= minAmountOut).is.true; + assert.isTrue(dstBalanceAfter - dstBalanceBefore >= minAmountOut); } }); @@ -200,116 +218,307 @@ describe("Jupiter V6 Testing", () => { } }); - it("Generate Fast Fill", async function () { + function newQuotedSwapOutputToken(opts: { + quotedAmountOut: bigint; + dstMint?: PublicKey | null; + slippageBps?: number; + deadline?: number; + dexProgramId?: PublicKey | null; + }) { + const { quotedAmountOut } = opts; + + let { dstMint, slippageBps, deadline, dexProgramId } = opts; + dstMint ??= null; + slippageBps ??= 0; + deadline ??= 0; + dexProgramId ??= null; + + const limitAmount = (quotedAmountOut * (10000n - BigInt(slippageBps))) / 10000n; + const swap = { + deadline, + limitAmount, + type: { + id: "JupiterV6", + dexProgramId: + dexProgramId === null + ? { isSome: false } + : { + isSome: true, + address: toUniversal("Solana", dexProgramId.toString()), + }, + }, + }; + return { + limitAmount, + outputToken: (dstMint === null + ? { type: "Gas", swap } + : { + type: "Other", + address: toUniversal("Solana", dstMint.toString()), + swap, + }) as OutputToken, + }; + } + + it("Other -- USDT via Whirlpool", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 15, + }); + const amountIn = 200_000_000n; - const quotedAmountOut = 198_800_000n; - const slippage = 15; // 1.5bps - - // Computed after quote. - const limitAmount = (quotedAmountOut * (10000n - BigInt(slippage))) / 10000n; - const deadline = 0; - - const msg = { - recipient: toUniversal("Solana", recipient.publicKey.toString()), - redeemMode: { mode: "Direct" }, - outputToken: { - type: "Other", - address: toUniversal("Solana", USDT_MINT_ADDRESS.toString()), - swap: { - deadline, - limitAmount, - type: { - id: "JupiterV6", - dexProgramId: { isSome: false }, - }, - }, + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + amountIn, + }, + ); + + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, }, - } as SwapLayerMessage; + ); + }); - const { preparedFill } = await redeemFastFillForTest( + it("Other -- WSOL via Phoenix V1", async function () { + const dstMint = splToken.NATIVE_MINT; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + dstMint, + slippageBps: 150, + }); + + const amountIn = 300_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( { payer: payer.publicKey }, emittedEvents, { + dstMint, + outputToken, amountIn, - redeemerMessage: encodeSwapLayerMessage(msg), }, ); - const preparedFillData = await tokenRouter.fetchPreparedFill(preparedFill); - expect(decodeSwapLayerMessage(preparedFillData.redeemerMessage)).to.eql(msg); + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + ); + }); + + it("Gas via Phoenix V1", async function () { + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + slippageBps: 150, + }); - const beneficiary = Keypair.generate().publicKey; - const [swapAuthority] = PublicKey.findProgramAddressSync( - [Buffer.from("swap-authority"), preparedFill.toBuffer()], - swapLayer.ID, + const amountIn = 300_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + outputToken, + amountIn, + }, ); - const { instruction: innerIx } = modifyUsdcToUsdtSwapResponseForTest(swapAuthority, { - inAmount: 0n, + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + ); + }); + }); + + async function completeSwapDirectForTest( + accounts: { + payer: PublicKey; + preparedFill: PublicKey; + recipient: PublicKey; + dstMint?: PublicKey; + }, + opts: ForTestOpts & { + limitAmount: bigint; + swapResponseModifier: ( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ) => jupiterV6.ModifiedSharedAccountsRoute; + }, + ): Promise { + const [{ signers, errorMsg }, otherOpts] = setDefaultForTestOpts(opts); + const { limitAmount, swapResponseModifier } = otherOpts; + + const { instruction: cpiInstruction, destinationMint } = swapResponseModifier( + swapLayer.swapAuthorityAddress(accounts.preparedFill), + { cpi: true, - }); + }, + ); + const expectedDstMint = accounts.dstMint ?? splToken.NATIVE_MINT; + assert.deepEqual(destinationMint, expectedDstMint); - const ix = await swapLayer.program.methods - .completeSwapDirect(innerIx.data) - .accounts({ - completeSwap: { - payer: payer.publicKey, - consumeSwapLayerFill: await swapLayer.consumeSwapLayerFillComposite({ - preparedFill, - beneficiary, - }), - authority: swapAuthority, - srcSwapToken: splToken.getAssociatedTokenAddressSync( - swapLayer.mint, - swapAuthority, - true, // allowOwnerOffCurve - ), - dstSwapToken: splToken.getAssociatedTokenAddressSync( - USDT_MINT_ADDRESS, - swapAuthority, - true, // allowOwnerOffCurve - ), - srcMint: swapLayer.mint, - dstMint: USDT_MINT_ADDRESS, - associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, - tokenProgram: splToken.TOKEN_PROGRAM_ID, - systemProgram: SystemProgram.programId, - }, - recipientToken: splToken.getAssociatedTokenAddressSync( - USDT_MINT_ADDRESS, - recipient.publicKey, - ), - recipient: recipient.publicKey, - }) - .remainingAccounts(innerIx.keys) - .instruction(); + const ix = await swapLayer.completeSwapDirectIx(accounts, { cpiInstruction }); - const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + const ixs = [ + ComputeBudgetProgram.setComputeUnitLimit({ units: 420_000, + }), + ix, + ]; + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + if (errorMsg !== null) { + await expectIxErr(connection, ixs, signers, errorMsg, { + addressLookupTableAccounts, }); + return; + } - const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { - const resp = await connection.getAddressLookupTable(lookupTableAddress); - return resp.value; - }), - ); + const { redeemerMessage } = await tokenRouter.fetchPreparedFill(accounts.preparedFill); + const outputToken = decodeSwapLayerMessage(redeemerMessage).outputToken; + + if (outputToken.type === "Gas") { + const balanceBefore = await connection.getBalance(accounts.recipient).then(BigInt); + + await expectIxOk(connection, ixs, signers, { + addressLookupTableAccounts, + }); + const balanceAfter = await connection.getBalance(accounts.recipient).then(BigInt); + assert.isTrue(balanceAfter - balanceBefore >= limitAmount); + } else if (outputToken.type === "Other") { const dstToken = splToken.getAssociatedTokenAddressSync( - USDT_MINT_ADDRESS, - recipient.publicKey, + expectedDstMint, + accounts.recipient, ); - const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); - await expectIxOk(connection, [computeIx, ix], [payer], { + await expectIxOk(connection, ixs, signers, { addressLookupTableAccounts, }); const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); - expect(dstBalanceAfter - dstBalanceBefore >= limitAmount).is.true; + assert.isTrue(dstBalanceAfter - dstBalanceBefore >= limitAmount); + } else { + assert.fail("Invalid output token type"); + } + } + + async function redeemSwapLayerFastFillForTest( + accounts: { payer: PublicKey }, + emittedEvents: EmittedFilledLocalFastOrder[], + opts: ObserveCctpOrderVaasOpts & { + dstMint?: PublicKey; + recipient?: PublicKey; + redeemMode?: RedeemMode; + outputToken?: OutputToken; + }, + ) { + let { dstMint, recipient, redeemMode, outputToken } = opts; + dstMint ??= splToken.NATIVE_MINT; + recipient ??= Keypair.generate().publicKey; + redeemMode ??= { mode: "Direct" }; + outputToken ??= { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "JupiterV6", + dexProgramId: { isSome: false }, + }, + }, + }; + + // Generate a new token account for recipient. + const recipientToken = splToken.getAssociatedTokenAddressSync(dstMint, recipient); + + await expectIxOk( + connection, + [ + splToken.createAssociatedTokenAccountInstruction( + payer.publicKey, + recipientToken, + recipient, + dstMint, + ), + ], + [payer], + ); + + const msg = { + recipient: toUniversal("Solana", recipient.toString()), + redeemMode, + outputToken, + } as SwapLayerMessage; + + // Override redeemer message if undefined. + if (opts.redeemerMessage === undefined) { + opts.redeemerMessage = encodeSwapLayerMessage(msg); + } + + const settleResult = await settleAuctionNoneLocalForTest( + { payer: payer.publicKey }, + emittedEvents, + opts, + ); + const { + event: { + seeds: { sourceChain, orderSender, sequence }, + }, + } = settleResult!; + + const fastFill = matchingEngine.fastFillAddress( + toChainId(sourceChain), + orderSender, + sequence, + ); + + const ix = await tokenRouter.redeemFastFillIx({ + ...accounts, + fastFill, }); - }); + + await expectIxOk(connection, [ix], [payer]); + + const preparedFill = tokenRouter.preparedFillAddress(fastFill); + const { redeemerMessage } = await tokenRouter.fetchPreparedFill(preparedFill); + assert.deepEqual(decodeSwapLayerMessage(redeemerMessage), msg); + + return { preparedFill, recipient }; + } function modifyUsdcToUsdtSwapResponseForTest( tokenOwner: PublicKey, @@ -337,6 +546,32 @@ describe("Jupiter V6 Testing", () => { return jupiterV6.modifySharedAccountsRouteInstruction(response, tokenOwner, opts); } + function modifyUsdcToWsolSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): jupiterV6.ModifiedSharedAccountsRoute { + const response = JSON.parse( + fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/phoenix_v1_usdc_to_wsol.json`, { + encoding: "utf-8", + }), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction(response, tokenOwner, opts); + } + + function modifyWsolToUsdcSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): jupiterV6.ModifiedSharedAccountsRoute { + const response = JSON.parse( + fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/phoenix_v1_wsol_to_usdc.json`, { + encoding: "utf-8", + }), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction(response, tokenOwner, opts); + } + type PrepareOrderResponseForTestOptionalOpts = { args?: matchingEngineSdk.CctpMessageArgs; }; @@ -506,38 +741,6 @@ describe("Jupiter V6 Testing", () => { return emittedEvents.shift()!; } - async function redeemFastFillForTest( - accounts: { payer: PublicKey }, - emittedEvents: EmittedFilledLocalFastOrder[], - opts: ObserveCctpOrderVaasOpts, - ) { - const settleResult = await settleAuctionNoneLocalForTest( - { payer: payer.publicKey }, - emittedEvents, - opts, - ); - const { - event: { - seeds: { sourceChain, orderSender, sequence }, - }, - } = settleResult!; - - const fastFill = matchingEngine.fastFillAddress( - toChainId(sourceChain), - orderSender, - sequence, - ); - - const ix = await tokenRouter.redeemFastFillIx({ - ...accounts, - fastFill, - }); - - await expectIxOk(connection, [ix], [payer]); - - return { fastFill, preparedFill: tokenRouter.preparedFillAddress(fastFill) }; - } - type ForTestOpts = { signers?: Signer[]; errorMsg?: string | null; @@ -560,7 +763,7 @@ describe("Jupiter V6 Testing", () => { } function newFastMarketOrder(args: { - redeemerMessage: Uint8Array; + redeemerMessage?: Uint8Array; sender?: Array; amountIn?: bigint; minAmountOut?: bigint; @@ -590,7 +793,7 @@ describe("Jupiter V6 Testing", () => { maxFee: maxFee ?? 42069n, initAuctionFee: initAuctionFee ?? 1_250_000n, deadline: deadline ?? 0, - redeemerMessage: Buffer.from(redeemerMessage), + redeemerMessage: Buffer.from(redeemerMessage ?? Uint8Array.from([4, 20, 69])), }; } @@ -617,8 +820,8 @@ describe("Jupiter V6 Testing", () => { }; type ObserveCctpOrderVaasOpts = { - redeemerMessage: Uint8Array; amountIn: bigint; + redeemerMessage?: Uint8Array; sourceChain?: Chain; emitter?: Array; vaaTimestamp?: number; diff --git a/solana/ts/tests/accounts/payer_wsol_token.json b/solana/ts/tests/accounts/payer_wsol_token.json new file mode 100644 index 00000000..3bbc4964 --- /dev/null +++ b/solana/ts/tests/accounts/payer_wsol_token.json @@ -0,0 +1,14 @@ +{ + "pubkey": "DxP5ymwEd2wTDw6SMB1mpzxGgeH8uoW4DpC4gJHrHZE8", + "account": { + "lamports": 69000002039280, + "data": [ + "BpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAEMGliG/hCT35/EOMKW+fcnW3cYtrwOFW2NM2xY8IOZbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAADwHR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} diff --git a/solana/ts/tests/accounts/phoenix_v1/phoenix_jupiter_trader_quote_token.json b/solana/ts/tests/accounts/phoenix_v1/phoenix_jupiter_trader_quote_token.json new file mode 100644 index 00000000..1cc74f7a --- /dev/null +++ b/solana/ts/tests/accounts/phoenix_v1/phoenix_jupiter_trader_quote_token.json @@ -0,0 +1,14 @@ +{ + "pubkey": "EXrqY7jLTLp83H38L8Zw3GvGkk1KoQbYTckPGBghwD8X", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWGCl+VE/0RAahO3+mTCz/o+xuFd+JNeAMdBcN6u8BPzffk2EgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/phoenix_v1/phoenix_usdc_custody.json b/solana/ts/tests/accounts/phoenix_v1/phoenix_usdc_custody.json new file mode 100644 index 00000000..2a5e337d --- /dev/null +++ b/solana/ts/tests/accounts/phoenix_v1/phoenix_usdc_custody.json @@ -0,0 +1,14 @@ +{ + "pubkey": "3HSYXeGc3LjEPCuzoNDjQN37F1ebsSiR4CqXVqQCdekZ", + "account": { + "lamports": 3439389, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWEh7YyNLKBFBQLEN03WYHn12aZvk0qQ7dBkrqaOgwDSwsOs9rrTAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/phoenix_v1/phoenix_wsol_custody.json b/solana/ts/tests/accounts/phoenix_v1/phoenix_wsol_custody.json new file mode 100644 index 00000000..5c3ee9f3 --- /dev/null +++ b/solana/ts/tests/accounts/phoenix_v1/phoenix_wsol_custody.json @@ -0,0 +1,14 @@ +{ + "pubkey": "8g4Z9d6PqGkgH31tMW6FwxGhwYJrXpxZHQrkikpLJKrG", + "account": { + "lamports": 18962154039280, + "data": [ + "BpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAFyA3qYINiYGB+BIsPMVkwIyQ0mLznXcktZZsxlJ3DBKQCKVfg+EQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAADwHR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/phoenix_v1/phoenix_wsol_usdc_market_state.json b/solana/ts/tests/accounts/phoenix_v1/phoenix_wsol_usdc_market_state.json new file mode 100644 index 00000000..bd641b7d --- /dev/null +++ b/solana/ts/tests/accounts/phoenix_v1/phoenix_wsol_usdc_market_state.json @@ -0,0 +1,14 @@ +{ + "pubkey": "4DoNfFBfF7UokCC2FQzriy7yHK6DY6NVdYpuekQ5pRgg", + "account": { + "lamports": 12096367360, + "data": [ + "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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", + "base64" + ], + "owner": "PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 1723488 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_0.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_0.json deleted file mode 100644 index 674fc40e..00000000 --- a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_0.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "pubkey": "8kZSTVuV7C4GD9ZVR4wDtRSXv1SvsSQPfqUbthueRNGV", - "account": { - "lamports": 70407360, - "data": [ - "RWG9vm4HQruo////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa+89+tlAAAAAAAAAAAAAACvvPfrZQAAAAAAAAAAAAAA50Z8D0FIKQAAAAAAAAAAAKUzWX6YlCgAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGb2QLuAAAAAAAAAAAAAAAAm9kC7gAAAAAAAAAAAAAAAAqILLuKiycAAAAAAAAAAAD23qCwhtcmAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHHMaDVAAAAAAAAAAAAAAAAxzGg1QAAAAAAAAAAAAAAAELrSH95gicAAAAAAAAAAAD3VOUeys4mAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb4jlioAAAAAAAAAAAAAAAC+I5YqAAAAAAAAAAAAAAAAs/Qs0vDEFAAAAAAAAAAAAP7Ihg12BRQAAAAAAAAAAABJeNtWBZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABm5EWAAAAAAAAAAAAAAAAAJuRFgAAAAAAAAAAAAAAAAA3dU/gh4MgAAAAAAAAAAAA9sgnmKjHHwAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHL847vfwAAAAAAAAAAAAAAy/OO738AAAAAAAAAAAAAABc/ti6gMyUAAAAAAAAAAABOv8MM4HwkAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQF/pBtSAAAAAAAAAAAAAAABf6QbUgAAAAAAAAAAAAAAhWBfgsgdJQAAAAAAAAAAAIOxGKshZyQAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8E6dogoAAAAAAAAAAAAAAPBOnaIKAAAAAAAAAAAAAABgjx04yHQTAAAAAAAAAAAA549ergSrEgAAAAAAAAAAADTLD+usDwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEDYzDaIAAAAAAAAAAAAAAAA2Mw2iAAAAAAAAAAAAAAAOY2NVX/FSUAAAAAAAAAAABoMMdxo18kAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdNlCi8AAAAAAAAAAAAAAADTZQovAAAAAAAAAAAAAAAAfofn1KV7JQAAAAAAAAAAACM1tICexSQAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHvNJyL7AIAAAAAAAAAAAAA7zSci+wCAAAAAAAAAAAAAHm8T0ZJoScAAAAAAAAAAADtrjixde0mAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcDEr/g0EAAAAAAAAAAAAAHAxK/4NBAAAAAAAAAAAAACmImYHwCwpAAAAAAAAAAAAaIyPelR5KAAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGIxSsPAAAAAAAAAAAAAAAAiMUrDwAAAAAAAAAAAAAAAIMDNd1+ABcAAAAAAAAAAADono+OCD4WAAAAAAAAAAAAUbb9FgmvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAY2I700CAAAAAAAAAAAAAACNiO9NAgAAAAAAAAAAAAAAudut3KCBJQAAAAAAAAAAAEk7jbtryyQAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABL/Yc7xgAAAAAAAAAAAAAAC/2HO8YAAAAAAAAAAAAAAAX1m8moTQlAAAAAAAAAAAAqaycTal9JAAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASMBAR4AAAAAAAAAAAAAAAAjAQEeAAAAAAAAAAAAAAAADaI7P7YnJQAAAAAAAAAAABqkNAhlcCQAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABXIpnAQAAAAAAAAAAAAAAAFyKZwEAAAAAAAAAAAAAAABFpfk/BdIXAAAAAAAAAAAATKfw//4OFwAAAAAAAAAAAFG2/RYJrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHN8emBJwAAAAAAAAAAAAAAzfHpgScAAAAAAAAAAAAAAERhtRSQVSUAAAAAAAAAAACZ+dPLtp8kAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdQJqXRzAQAAAAAAAAAAAADUCal0cwEAAAAAAAAAAAAAZoSkWuptJwAAAAAAAAAAAIfkmFxIvCYAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABfB7/1JUAAAAAAAAAAAAAAHwe/9SVAAAAAAAAAAAAAAB2jLTuY04hAAAAAAAAAAAAZEFbEa2SIAAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG9uBEAAAAAAAAAAAAAAAAAvbgRAAAAAAAAAAAAAAAAAI/Hrvnd0SAAAAAAAAAAAADnpCjsjBYgAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkh+0PBMNAAAAAAAAAAAAAJIftDwTDQAAAAAAAAAAAACOsgt2NHcgAAAAAAAAAAAAM6+UYSu7HwAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFtInvUDAMAAAAAAAAAAAAAbSJ71AwDAAAAAAAAAAAAAAFA2rHJTSEAAAAAAAAAAAACF9Yv5JEgAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUSxTOorEAAAAAAAAAAAAABEsUzqKxAAAAAAAAAAAAAAkY+ewEglGAAAAAAAAAAAAH3KNDq/YhcAAAAAAAAAAABRtv0WCa8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABUidy5/QGAAAAAAAAAAAAAFIncuf0BgAAAAAAAAAAAACgywi7/8wkAAAAAAAAAAAAo+IfGYsWJAAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGc4DzXHQAAAAAAAAAAAAAAnOA81x0AAAAAAAAAAAAAAI+zn8qvLSUAAAAAAAAAAAA/03KsTXckAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ2iw9KnFAAAAAAAAAAAAAANosPSpxQAAAAAAAAAAAAAGYbIZ4vsJwAAAAAAAAAAACBwt5pROCcAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABqc8MZnsCAAAAAAAAAAAAAKnPDGZ7AgAAAAAAAAAAAAB8hgNCGowhAAAAAAAAAAAAp0xYU1HQIAAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGLmS82AAEAAAAAAAAAAAAAi5kvNgABAAAAAAAAAAAAAOU6+/UnUSkAAAAAAAAAAABOHOQztJ0oAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXcDAAAAAAAAAAAAAAAAAAB3AwAAAAAAAAAAAAAAAAAA7uPI/8pCGQAAAAAAAAAAAKQ9CiwCfxgAAAAAAAAAAABRtv0WCa8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1AWePJgAAAAAAAAAAAAAANQFnjyYAAAAAAAAAAAAAADs2HIxPi8ZAAAAAAAAAAAAUm1XZiJrGAAAAAAAAAAAAFG2/RYJrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEs8xzv1xkAAAAAAAAAAAAALPMc79cZAAAAAAAAAAAAANY+30a5zCEAAAAAAAAAAAB/G9txfhAhAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWxbsrO7OwAAAAAAAAAAAABsW7KzuzsAAAAAAAAAAAAAXfdeO5TjJwAAAAAAAAAAAIXKr1ZBMCcAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwhaENtcCAAAAAAAAAAAAAMIWhDbXAgAAAAAAAAAAAAAwmukqxd0hAAAAAAAAAAAABKp7HxAiIQAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHpIbFVbBIAAAAAAAAAAAAA6SGxVWwSAAAAAAAAAAAAAL3VA+/1JSUAAAAAAAAAAABA6J6qG28kAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAASlMbou8iwcAAAAAAAAAAAApTG6LvIsHAAAAAAAAAAAAzKEc++5BIQAAAAAAAAAAAGXs/SDMhiAAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABM+2KlM8pAAAAAAAAAAAAAIeurbaYKgAAAAAAAAAAAABF8XO4Ou0ZAAAAAAAAAAAAznAdIeEoGQAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF8j6H4pyAAAAAAAAAAAAAAfI+h+KcgAAAAAAAAAAAAADJX2vDEShkAAAAAAAAAAAAgNNOOMYcYAAAAAAAAAAAACe2xtmWrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYUH1PDrAAAAAAAAAAAAAACFB9Tw6wAAAAAAAAAAAAAAq8wwzKBwIQAAAAAAAAAAAGIdBxT8tCAAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABENZVcGRfAAAAAAAAAAAAABDWVXBkXwAAAAAAAAAAAABGyQJznb0hAAAAAAAAAAAAJuVpPYkBIQAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGWSQGC1H8AAAAAAAAAAAAAlkkBgtR/AAAAAAAAAAAAAMgUo1Q1TRoAAAAAAAAAAADQuGfy44gZAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdHJliCQ/wEAAAAAAAAAAADRyZYgkP8BAAAAAAAAAAAA4FZmdbDWIAAAAAAAAAAAAGe3FufsGSAAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJeqRZyjaBwAAAAAAAAAAACXqkWco2gcAAAAAAAAAAADTqbt328chAAAAAAAAAAAAeNlszvsLIQAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFmse3rqkkBAAAAAAAAAAAAglsTV41KAQAAAAAAAAAAAI/X0DRH/iAAAAAAAAAAAABOWJ9VpEEgAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbxeqLnTHAcAAAAAAAAAAAAAOM0KnYAHAAAAAAAAAAAAVnO+6iWrGgAAAAAAAAAAADB1oTzA5hkAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgGxAO7Y8DAAAAAAAAAAAALzTGcn5aQwAAAAAAAAAAABIPdcECREiAAAAAAAAAAAACeVwQuVUIQAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHSuahAiJ7+////////////2PVkLna3CQAAAAAAAAAAAAWlsT+UWSEAAAAAAAAAAACTC8XvIZ0gAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAetpjdI5dfn///////////9J9LbvdocIAAAAAAAAAAAALt+VXUUWBwAAAAAAAAAAAJJEckG2HgcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABp9thi3SP+f///////////7VhyfrxtgYAAAAAAAAAAAB6u4szgRoHAAAAAAAAAAAAU6yV3FoiBwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHIfLGwIML/////////////lIT5xD1gAAAAAAAAAAAAAMyl+zj5jA4AAAAAAAAAAAAZOaeLKJwOAAAAAAAAAAAA2eM9WK07AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbMSwusyCwAAAAAAAAAAAADrumaeDQwAAAAAAAAAAAAAiS/j/Rg3BwAAAAAAAAAAACnC9EfhPwcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDEw==", - "base64" - ], - "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", - "executable": false, - "rentEpoch": 18446744073709551615, - "space": 9988 - } -} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1a.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1a.json deleted file mode 100644 index f61c50dc..00000000 --- a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1a.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "pubkey": "2B48L1ACPvVb67UKeSMkUGdzrnhvNMm6pFt2nspGKxs4", - "account": { - "lamports": 70407360, - "data": [ - "RWG9vm4HQrtQ////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFEzagnAAAAAAAAAAAAAAAARM2oJwAAAAAAAAAAAAAAAE/E53c/yBcAAAAAAAAAAADNsyttMhoXAAAAAAAAAAAAUbb9FgmvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuuZiNQAAAAAAAAAAAAAAALrmYjUAAAAAAAAAAAAAAAC0aH/h8csfAAAAAAAAAAAAzykS3RQOHwAAAAAAAAAAAFG2/RYJrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEGp7gqAAAAAAAAAAAAAAAABqe4KgAAAAAAAAAAAAAAAAnVUyjCUCkAAAAAAAAAAAAtwTrfVJ0oAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB8zRkMUoAAAAAAAAAAAAAAPM0ZDFKAAAAAAAAAAAAAADPltl6o9onAAAAAAAAAAAAeuumbn4mJwAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdD6PeoNAAAAAAAAAAAAAADQ+j3qDQAAAAAAAAAAAAAApV6R+kfyKAAAAAAAAAAAAKK31OAQPygAAAAAAAAAAAB7G29iC68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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", - "base64" - ], - "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", - "executable": false, - "rentEpoch": 18446744073709551615, - "space": 9988 - } -} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1b.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1b.json deleted file mode 100644 index 30831f8e..00000000 --- a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_1b.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "pubkey": "FqFkv2xNNCUyx1RYV61pGZ9AMzGfgcD8uXC9zCF5JKnR", - "account": { - "lamports": 120407360, - "data": [ - "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHqfmzh8v//////////////FoGTHg0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgMXi5f///////////////4A6HRoAAAAAAAAAAAAAAADYAprR+L0DAAAAAAAAAAAAJgaoRDTIAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF+v/r/////////////////gkAFAAAAAAAAAAAAAAAAAJ34LgOs8wIAAAAAAAAAAACjNDNJkvwCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDEw==", - "base64" - ], - "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", - "executable": false, - "rentEpoch": 18446744073709551615, - "space": 9988 - } -} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2a.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2a.json deleted file mode 100644 index dde41261..00000000 --- a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2a.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "pubkey": "BMGfBaW69aUm6hRdmsfAcNEmAW59C2rWJ9EX7gWnrVN9", - "account": { - "lamports": 70407360, - "data": [ - "RWG9vm4HQrv4/v//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABcTTm4AAAAAAAAAAAAAAAAHE05uAAAAAAAAAAAAAAAACOHhPr9xghAAAAAAAAAAAAtugzxEZdIAAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZYAAAAAAAAAAAAAAAAAAACWAAAAAAAAAAAAAAAAAAAAGlIrexR5EAAAAAAAAAAAAKMni40vxQ8AAAAAAAAAAABRtv0WCa8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABbV/U7QEAAAAAAAAAAAAAAG1f1O0BAAAAAAAAAAAAAADsDxVyrv4QAAAAAAAAAAAAF9y3imFKEAAAAAAAAAAAAFG2/RYJrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFcZvwFAAAAAAAAAAAAAAAAXGb8BQAAAAAAAAAAAAAAAOHJtAsGgiUAAAAAAAAAAADU/kW5wMskAAAAAAAAAAAAextvYguvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABD3UNBgAAAAAAAAAAAAAAAA91DQYAAAAAAAAAAAAAAABwfkVtZ+8oAAAAAAAAAAAA3V0qS6k8KAAAAAAAAAAAAHsbb2ILrwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDEw==", - "base64" - ], - "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", - "executable": false, - "rentEpoch": 18446744073709551615, - "space": 9988 - } -} \ No newline at end of file diff --git a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2b.json b/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2b.json deleted file mode 100644 index a0352bb9..00000000 --- a/solana/ts/tests/accounts/whirlpool/whirlpool_usdc_usdt_tick_array_2b.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "pubkey": "A7sdy3NoAZp49cQNpreMGARAb9QJjYrrSyDALhThgk3D", - "account": { - "lamports": 70407360, - "data": [ - "RWG9vm4HQrtYAAAAAetQg3Xx//////////////8Vr3yKDgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAXGrtPD///////////////+PVEsPAAAAAAAAAAAAAAAAO6jR1WkEAgAAAAAAAAAAABlGZ69iCwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdtz0ZL9//////////////8ljC5tAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcz///////////////////80AAAAAAAAAAAAAAAAAAAA52Rxe5rRAQAAAAAAAAAAAGh3Q9cZ2AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABHnOLQ+H//////////////+KMdLweAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE9/v//////////////////wwEAAAAAAAAAAAAAAAAAAJB+Nqi6BQMAAAAAAAAAAACYBtRqiBQDAAAAAAAAAAAAy0VWHIAnAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbwo6Pn///////////////9E1xcGAAAAAAAAAAAAAAAA0m4Z4nO4AQAAAAAAAAAAAOB+INGzvgEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMAXCFfL//////////////9D6PeoNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbZvDjv///////////////9KkPHEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB7n4CJOT//////////////xKB/dsbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH6WEfV////////////////Bqe4KgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG8MlfY////////////////RM2oJwAAAAAAAAAAAAAAAKMu2tYGIQAAAAAAAAAAAAD0A8X/pCEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2infrpab+D8lY3cn0uKaxD7wbNQO12IExvrPUQHTDEw==", - "base64" - ], - "owner": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", - "executable": false, - "rentEpoch": 18446744073709551615, - "space": 9988 - } -} \ No newline at end of file diff --git a/solana/ts/tests/jupiterV6SwapResponses/phoenix_v1_usdc_to_wsol.json b/solana/ts/tests/jupiterV6SwapResponses/phoenix_v1_usdc_to_wsol.json new file mode 100644 index 00000000..34628e87 --- /dev/null +++ b/solana/ts/tests/jupiterV6SwapResponses/phoenix_v1_usdc_to_wsol.json @@ -0,0 +1,116 @@ +{ + "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "accounts": [ + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "9nnLbotNTcUhvbrsA6Mdkx45Sm82G35zo28AqUvjExn8", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D14nCDVdFv8XAa5u5yGmsRRHGe9UtRuiyhW6YD5vxD3X", + "isSigner": true, + "isWritable": false + }, + { + "pubkey": "FfgPAtzRXSZ9YCPYSHNJmoVP81wRjeo8F1kDoUS7ttcb", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "EXrqY7jLTLp83H38L8Zw3GvGkk1KoQbYTckPGBghwD8X", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "A8kEy5wWgdW4FG593fQJ5QPVbqx1wkfXw9c4L9bPo2CN", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "BZ9C8aAWyXTbRCwxr8x1mEAhMkLFimNTNJtpUD5pzxTc", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "So11111111111111111111111111111111111111112", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "7aDTsspkQNGKmrexAN7FLx9oxU3iPczSSvHNggyuqYkR", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "4DoNfFBfF7UokCC2FQzriy7yHK6DY6NVdYpuekQ5pRgg", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "9nnLbotNTcUhvbrsA6Mdkx45Sm82G35zo28AqUvjExn8", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "A8kEy5wWgdW4FG593fQJ5QPVbqx1wkfXw9c4L9bPo2CN", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "EXrqY7jLTLp83H38L8Zw3GvGkk1KoQbYTckPGBghwD8X", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "8g4Z9d6PqGkgH31tMW6FwxGhwYJrXpxZHQrkikpLJKrG", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "3HSYXeGc3LjEPCuzoNDjQN37F1ebsSiR4CqXVqQCdekZ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + } + ], + "data": "wSCbM0HWnIEGAQAAABwAZAABAOh2SBcAAAAwYjtonAAAAMgAAA==" +} diff --git a/solana/ts/tests/jupiterV6SwapResponses/phoenix_v1_wsol_to_usdc.json b/solana/ts/tests/jupiterV6SwapResponses/phoenix_v1_wsol_to_usdc.json new file mode 100644 index 00000000..d31963b4 --- /dev/null +++ b/solana/ts/tests/jupiterV6SwapResponses/phoenix_v1_wsol_to_usdc.json @@ -0,0 +1,116 @@ +{ + "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "accounts": [ + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "6U91aKa8pmMxkJwBCfPTmUEfZi6dHe7DcFq2ALvB2tbB", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D14nCDVdFv8XAa5u5yGmsRRHGe9UtRuiyhW6YD5vxD3X", + "isSigner": true, + "isWritable": false + }, + { + "pubkey": "BZ9C8aAWyXTbRCwxr8x1mEAhMkLFimNTNJtpUD5pzxTc", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "7x4VcEX8aLd3kFsNWULTp1qFgVtDwyWSxpTGQkoMM6XX", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "59v2cSbCsnyaWymLnsq6TWzE6cEN5KJYNTBNrcP4smRH", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "FfgPAtzRXSZ9YCPYSHNJmoVP81wRjeo8F1kDoUS7ttcb", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "So11111111111111111111111111111111111111112", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "7aDTsspkQNGKmrexAN7FLx9oxU3iPczSSvHNggyuqYkR", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "4DoNfFBfF7UokCC2FQzriy7yHK6DY6NVdYpuekQ5pRgg", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "6U91aKa8pmMxkJwBCfPTmUEfZi6dHe7DcFq2ALvB2tbB", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "7x4VcEX8aLd3kFsNWULTp1qFgVtDwyWSxpTGQkoMM6XX", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "59v2cSbCsnyaWymLnsq6TWzE6cEN5KJYNTBNrcP4smRH", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "8g4Z9d6PqGkgH31tMW6FwxGhwYJrXpxZHQrkikpLJKrG", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "3HSYXeGc3LjEPCuzoNDjQN37F1ebsSiR4CqXVqQCdekZ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + } + ], + "data": "wSCbM0HWnIEDAQAAABwBZAABYLKlkqAAAABXQh/fFwAAAMgAAA==" +} From d25e1951824acdcc9778e1814f174039c523b070 Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Wed, 15 May 2024 09:22:41 -0500 Subject: [PATCH 03/50] Solana: add payload redeem type (#19) * solana: add outbound payload support to usdc instruction * solana: add staged transfer * solana: add staged transfer instruction for inbound payload handling * solana: add output token arg * solana: add consume staged transfer ix * solana: address feedback * solana: add tests * solana: address more feedback --------- Co-authored-by: gator-boi --- solana/programs/swap-layer/src/error.rs | 1 + solana/programs/swap-layer/src/lib.rs | 9 + .../src/processor/complete/usdc/mod.rs | 3 + .../src/processor/complete/usdc/payload.rs | 117 ++++++ .../src/processor/consume_staged_transfer.rs | 84 ++++ .../swap-layer/src/processor/initiate/usdc.rs | 29 +- .../programs/swap-layer/src/processor/mod.rs | 3 + solana/programs/swap-layer/src/state/mod.rs | 3 + .../swap-layer/src/state/staged_transfer.rs | 56 +++ .../swap-layer/src/utils/relayer_fees.rs | 144 ++++--- solana/ts/src/swapLayer/index.ts | 81 +++- solana/ts/src/swapLayer/messages/layouts.ts | 3 + .../ts/src/swapLayer/state/StagedTransfer.ts | 33 ++ solana/ts/src/swapLayer/state/index.ts | 1 + solana/ts/tests/01__swapLayer.ts | 366 ++++++++++++++++-- 15 files changed, 833 insertions(+), 100 deletions(-) create mode 100644 solana/programs/swap-layer/src/processor/complete/usdc/payload.rs create mode 100644 solana/programs/swap-layer/src/processor/consume_staged_transfer.rs create mode 100644 solana/programs/swap-layer/src/state/staged_transfer.rs create mode 100644 solana/ts/src/swapLayer/state/StagedTransfer.ts diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs index 8efda449..e3d6a16e 100644 --- a/solana/programs/swap-layer/src/error.rs +++ b/solana/programs/swap-layer/src/error.rs @@ -21,6 +21,7 @@ pub enum SwapLayerError { ExceedsMaxRelayingFee = 0x111, InvalidPreparedOrder = 0x112, InvalidFeeRecipient = 0x113, + PayloadTooLarge = 0x114, // EVM Execution Param errors InvalidBaseFee = 0x200, diff --git a/solana/programs/swap-layer/src/lib.rs b/solana/programs/swap-layer/src/lib.rs index f66ce306..5a54d633 100644 --- a/solana/programs/swap-layer/src/lib.rs +++ b/solana/programs/swap-layer/src/lib.rs @@ -16,6 +16,7 @@ declare_id!("SwapLayer1111111111111111111111111111111111"); const CUSTODIAN_BUMP: u8 = 254; const COMPLETE_TOKEN_SEED_PREFIX: &[u8] = b"complete"; const SWAP_AUTHORITY_SEED_PREFIX: &[u8] = b"swap-authority"; +const STAGED_CUSTODY_TOKEN_SEED_PREFIX: &[u8] = b"staged-custody"; const MAX_BPS: u32 = 1_000_000; // 10,000.00 bps (100%) #[program] @@ -106,6 +107,14 @@ pub mod swap_layer { processor::complete_transfer_direct(ctx) } + pub fn complete_transfer_payload(ctx: Context) -> Result<()> { + processor::complete_transfer_payload(ctx) + } + + pub fn consume_staged_transfer(ctx: Context) -> Result<()> { + processor::consume_staged_transfer(ctx) + } + pub fn initiate_transfer( ctx: Context, args: InitiateTransferArgs, diff --git a/solana/programs/swap-layer/src/processor/complete/usdc/mod.rs b/solana/programs/swap-layer/src/processor/complete/usdc/mod.rs index 9f79f08c..d0674765 100644 --- a/solana/programs/swap-layer/src/processor/complete/usdc/mod.rs +++ b/solana/programs/swap-layer/src/processor/complete/usdc/mod.rs @@ -3,3 +3,6 @@ pub use relay::*; mod direct; pub use direct::*; + +mod payload; +pub use payload::*; diff --git a/solana/programs/swap-layer/src/processor/complete/usdc/payload.rs b/solana/programs/swap-layer/src/processor/complete/usdc/payload.rs new file mode 100644 index 00000000..620327ab --- /dev/null +++ b/solana/programs/swap-layer/src/processor/complete/usdc/payload.rs @@ -0,0 +1,117 @@ +use crate::{ + composite::*, + error::SwapLayerError, + state::{StagedTransfer, StagedTransferInfo, StagedTransferSeeds}, +}; +use anchor_lang::prelude::*; +use anchor_spl::token; +use swap_layer_messages::messages::SwapMessageV1; +use swap_layer_messages::types::{OutputToken, RedeemMode}; + +#[derive(Accounts)] +pub struct CompleteTransferPayload<'info> { + #[account(mut)] + /// The payer of the transaction. + payer: Signer<'info>, + + #[account( + constraint = { + let swap_msg = consume_swap_layer_fill.read_message_unchecked(); + + require!( + matches!( + swap_msg.output_token, + OutputToken::Usdc + ), + SwapLayerError::InvalidOutputToken + ); + + true + } + )] + consume_swap_layer_fill: ConsumeSwapLayerFill<'info>, + + #[account( + init_if_needed, + payer = payer, + space = try_compute_staged_transfer_size(&consume_swap_layer_fill.read_message_unchecked())?, + seeds = [ + StagedTransfer::SEED_PREFIX, + consume_swap_layer_fill.prepared_fill_key().as_ref(), + ], + bump + )] + staged_transfer: Account<'info, StagedTransfer>, + + #[account( + init_if_needed, + payer = payer, + token::mint = usdc, + token::authority = staged_transfer, + seeds = [ + crate::STAGED_CUSTODY_TOKEN_SEED_PREFIX, + staged_transfer.key().as_ref(), + ], + bump, + )] + staged_custody_token: Box>, + + usdc: Usdc<'info>, + + token_program: Program<'info, token::Token>, + system_program: Program<'info, System>, +} + +pub fn complete_transfer_payload(ctx: Context) -> Result<()> { + let staged_transfer = &mut ctx.accounts.staged_transfer; + + // Set the staged transfer if it hasn't been set yet. + if staged_transfer.staged_by == Pubkey::default() { + // Consume the prepared fill, and send the tokens to the staged custody account. + ctx.accounts.consume_swap_layer_fill.consume_prepared_fill( + ctx.accounts.staged_custody_token.to_account_info(), + ctx.accounts.token_program.to_account_info(), + )?; + + let swap_msg = ctx + .accounts + .consume_swap_layer_fill + .read_message_unchecked(); + + staged_transfer.set_inner(StagedTransfer { + seeds: StagedTransferSeeds { + prepared_fill: ctx.accounts.consume_swap_layer_fill.prepared_fill_key(), + bump: ctx.bumps.staged_transfer, + }, + info: StagedTransferInfo { + staged_custody_token_bump: ctx.bumps.staged_custody_token, + staged_by: ctx.accounts.payer.key(), + source_chain: ctx.accounts.consume_swap_layer_fill.fill.source_chain, + recipient: Pubkey::from(swap_msg.recipient), + is_native: false, + }, + recipient_payload: get_swap_message_payload(&swap_msg)?.to_vec(), + }); + } + + Ok(()) +} + +fn try_compute_staged_transfer_size(swap_msg: &SwapMessageV1) -> Result { + // Match on Payload redeem type. + match &swap_msg.redeem_mode { + RedeemMode::Payload(payload) => { + let payload_size = payload.len(); + StagedTransfer::checked_compute_size(payload_size) + .ok_or(error!(SwapLayerError::PayloadTooLarge)) + } + _ => Err(SwapLayerError::InvalidRedeemMode.into()), + } +} + +fn get_swap_message_payload(swap_msg: &SwapMessageV1) -> Result<&[u8]> { + match &swap_msg.redeem_mode { + RedeemMode::Payload(payload) => Ok(payload), + _ => Err(SwapLayerError::InvalidRedeemMode.into()), + } +} diff --git a/solana/programs/swap-layer/src/processor/consume_staged_transfer.rs b/solana/programs/swap-layer/src/processor/consume_staged_transfer.rs new file mode 100644 index 00000000..dd291bd0 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/consume_staged_transfer.rs @@ -0,0 +1,84 @@ +use crate::state::StagedTransfer; +use anchor_lang::prelude::*; +use anchor_spl::token; + +/// Accounts required for [consume_prepared_fill]. +#[derive(Accounts)] +pub struct ConsumeStagedTransfer<'info> { + /// This signer must be the same one encoded in the staged transfer. + #[account(address = staged_transfer.recipient)] + recipient: Signer<'info>, + + /// CHECK: This recipient may not necessarily be the same one encoded in the staged transfer (as + /// the payer). If someone were to stage a transfer via a stage transfer ix and he had no + /// intention of consuming it, he will be out of luck. We will reward the redeemer with the + /// closed account funds with a payer of his choosing. + #[account(mut)] + beneficiary: UncheckedAccount<'info>, + + #[account( + mut, + close = beneficiary, + )] + staged_transfer: Account<'info, StagedTransfer>, + + /// Destination token account, which the redeemer may not own. But because the redeemer is a + /// signer and is the one encoded in the Deposit Fill message, he may have the tokens be sent + /// to any account he chooses (this one). + /// + /// CHECK: This token account must already exist. + #[account(mut)] + dst_token: UncheckedAccount<'info>, + + /// Staged custody token account. This account will be closed at the end of this instruction. + /// + /// CHECK: Mutable. Seeds must be \["staged-custody-token"\]. + #[account( + mut, + seeds = [ + crate::STAGED_CUSTODY_TOKEN_SEED_PREFIX, + staged_transfer.key().as_ref(), + ], + bump = staged_transfer.staged_custody_token_bump, + )] + staged_custody_token: Account<'info, token::TokenAccount>, + + token_program: Program<'info, token::Token>, +} + +pub fn consume_staged_transfer(ctx: Context) -> Result<()> { + let staged_transfer = &ctx.accounts.staged_transfer; + + let staged_transfer_signer_seeds = &[ + StagedTransfer::SEED_PREFIX, + staged_transfer.seeds.prepared_fill.as_ref(), + &[staged_transfer.seeds.bump], + ]; + + let custody_token = &ctx.accounts.staged_custody_token; + let token_program = &ctx.accounts.token_program; + + token::transfer( + CpiContext::new_with_signer( + token_program.to_account_info(), + token::Transfer { + from: custody_token.to_account_info(), + to: ctx.accounts.dst_token.to_account_info(), + authority: staged_transfer.to_account_info(), + }, + &[staged_transfer_signer_seeds], + ), + custody_token.amount, + )?; + + // Finally close token account. + token::close_account(CpiContext::new_with_signer( + token_program.to_account_info(), + token::CloseAccount { + account: custody_token.to_account_info(), + destination: ctx.accounts.beneficiary.to_account_info(), + authority: staged_transfer.to_account_info(), + }, + &[staged_transfer_signer_seeds], + )) +} diff --git a/solana/programs/swap-layer/src/processor/initiate/usdc.rs b/solana/programs/swap-layer/src/processor/initiate/usdc.rs index 3635d451..ae313485 100644 --- a/solana/programs/swap-layer/src/processor/initiate/usdc.rs +++ b/solana/programs/swap-layer/src/processor/initiate/usdc.rs @@ -4,9 +4,10 @@ use crate::{composite::*, error::SwapLayerError, state::Peer}; use anchor_lang::prelude::borsh::BorshDeserialize; use anchor_lang::prelude::*; use anchor_spl::token; +use common::wormhole_io::Readable; use common::wormhole_io::TypePrefixedPayload; use swap_layer_messages::messages::SwapMessageV1; -use swap_layer_messages::types::{OutputToken, RedeemMode, SwapType, Uint48}; +use swap_layer_messages::types::{OutputToken, RedeemMode, Uint48}; #[derive(Accounts)] #[instruction(args: InitiateTransferArgs)] @@ -70,14 +71,27 @@ pub struct InitiateTransferArgs { /// The Wormhole chain ID of the network to transfer tokens to. pub target_chain: u16, + /// Optional relay options. If specified, the redeem mode will be set to Relay. pub relay_options: Option, + /// The recipient of the transfer. pub recipient: [u8; 32], + + /// Encoded output token to be included in the redeem message. + pub encoded_output_token: Vec, + + // Optional payload to be included in the redeem message. If a payload + // is specified, the redeem mode will be set to Payload. + pub payload: Option>, } pub fn initiate_transfer(ctx: Context, args: InitiateTransferArgs) -> Result<()> { require!(args.recipient != [0; 32], SwapLayerError::InvalidRecipient); + // Decode the output token to verify that it's valid. + let output_token = OutputToken::read(&mut &args.encoded_output_token[..]) + .map_err(|_| SwapLayerError::InvalidOutputToken)?; + // Save this, we will need to account for the relayer fee. let mut transfer_amount = args.amount_in; @@ -88,8 +102,7 @@ pub fn initiate_transfer(ctx: Context, args: InitiateTransferA let relaying_fee = calculate_relayer_fee( &ctx.accounts.peer.relay_params, denormalize_gas_dropoff(relay_options.gas_dropoff), - &SwapType::Invalid, - 0, // Swap count. + &output_token, )?; require!( relaying_fee <= relay_options.max_relayer_fee, @@ -104,13 +117,19 @@ pub fn initiate_transfer(ctx: Context, args: InitiateTransferA gas_dropoff: relay_options.gas_dropoff, relaying_fee: Uint48::try_from(relaying_fee).unwrap(), }, - output_token: OutputToken::Usdc, + output_token, + } + } else if args.payload.is_some() { + SwapMessageV1 { + recipient: args.recipient, + redeem_mode: RedeemMode::Payload(args.payload.unwrap()), + output_token, } } else { SwapMessageV1 { recipient: args.recipient, redeem_mode: RedeemMode::Direct, - output_token: OutputToken::Usdc, + output_token, } }; diff --git a/solana/programs/swap-layer/src/processor/mod.rs b/solana/programs/swap-layer/src/processor/mod.rs index f56c2285..ed504084 100644 --- a/solana/programs/swap-layer/src/processor/mod.rs +++ b/solana/programs/swap-layer/src/processor/mod.rs @@ -6,3 +6,6 @@ pub use complete::*; mod initiate; pub use initiate::*; + +mod consume_staged_transfer; +pub use consume_staged_transfer::*; diff --git a/solana/programs/swap-layer/src/state/mod.rs b/solana/programs/swap-layer/src/state/mod.rs index 62e7d9e2..2c52aa2f 100644 --- a/solana/programs/swap-layer/src/state/mod.rs +++ b/solana/programs/swap-layer/src/state/mod.rs @@ -3,3 +3,6 @@ pub use custodian::*; mod peer; pub use peer::*; + +mod staged_transfer; +pub use staged_transfer::*; diff --git a/solana/programs/swap-layer/src/state/staged_transfer.rs b/solana/programs/swap-layer/src/state/staged_transfer.rs new file mode 100644 index 00000000..05f73eab --- /dev/null +++ b/solana/programs/swap-layer/src/state/staged_transfer.rs @@ -0,0 +1,56 @@ +use anchor_lang::prelude::*; + +#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, InitSpace)] +pub struct StagedTransferSeeds { + pub prepared_fill: Pubkey, + pub bump: u8, +} + +#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, InitSpace)] +pub struct StagedTransferInfo { + pub staged_custody_token_bump: u8, + + // Payer that created this StagedTransfer. + pub staged_by: Pubkey, + + // Exposed out of convenience for the receiving program. + pub source_chain: u16, + + // pub payload_sender: [u8; 32], + + // The encoded recipient must be the caller. + pub recipient: Pubkey, + + // Indicates whether the output token type is Gas. + pub is_native: bool, +} + +#[account] +#[derive(Debug)] +pub struct StagedTransfer { + pub seeds: StagedTransferSeeds, + pub info: StagedTransferInfo, + pub recipient_payload: Vec, +} + +impl StagedTransfer { + pub const SEED_PREFIX: &'static [u8] = b"staged"; + + pub fn checked_compute_size(payload_len: usize) -> Option { + const FIXED: usize = 8 // DISCRIMINATOR + + StagedTransferSeeds::INIT_SPACE + + StagedTransferInfo::INIT_SPACE + + 4 // payload len + ; + + payload_len.checked_add(FIXED) + } +} + +impl std::ops::Deref for StagedTransfer { + type Target = StagedTransferInfo; + + fn deref(&self) -> &Self::Target { + &self.info + } +} diff --git a/solana/programs/swap-layer/src/utils/relayer_fees.rs b/solana/programs/swap-layer/src/utils/relayer_fees.rs index 2963c674..d34b5571 100644 --- a/solana/programs/swap-layer/src/utils/relayer_fees.rs +++ b/solana/programs/swap-layer/src/utils/relayer_fees.rs @@ -4,7 +4,9 @@ use crate::{ state::{ExecutionParams, RelayParams}, }; use anchor_lang::prelude::*; -use swap_layer_messages::types::SwapType; +use swap_layer_messages::types::{ + OutputToken, SwapType, TraderJoeSwapParameters, UniswapSwapParameters, +}; // EVM gas overheads in gas units. const EVM_GAS_OVERHEAD: u64 = 100_000; @@ -42,14 +44,28 @@ fn compound(percentage: u32, base: u64) -> Option { } } -fn calculate_evm_swap_overhead(swap_type: &SwapType, swap_count: u8) -> Option { - match swap_type { - SwapType::TraderJoe(_) => TRADERJOE_GAS_OVERHEAD - .checked_add(TRADERJOE_GAS_PER_SWAP.checked_mul(u64::from(swap_count))?), - SwapType::UniswapV3(_) => UNISWAP_GAS_OVERHEAD - .checked_add(UNISWAP_GAS_PER_SWAP.checked_mul(u64::from(swap_count))?), - _ => None, - } +fn calculate_evm_swap_overhead(swap_type: &SwapType) -> Option { + let (overhead, cost_per_swap, num_hops) = match swap_type { + SwapType::TraderJoe(TraderJoeSwapParameters { + first_pool_id: _, + path, + }) => ( + TRADERJOE_GAS_OVERHEAD, + TRADERJOE_GAS_PER_SWAP, + path.len().saturating_add(1), + ), + SwapType::UniswapV3(UniswapSwapParameters { + first_leg_fee: _, + path, + }) => ( + UNISWAP_GAS_OVERHEAD, + UNISWAP_GAS_PER_SWAP, + path.len().saturating_add(1), + ), + _ => return None, + }; + + overhead.checked_add(cost_per_swap.checked_mul(num_hops.try_into().unwrap())?) } fn calculate_evm_gas_cost( @@ -91,8 +107,7 @@ fn calculate_gas_dropoff_cost( pub fn calculate_relayer_fee( relay_params: &RelayParams, denorm_gas_dropoff: u64, - swap_type: &SwapType, - swap_count: u8, + output_token: &OutputToken, ) -> Result { require!( relay_params.base_fee != u32::MAX, @@ -134,11 +149,14 @@ pub fn calculate_relayer_fee( total_gas = total_gas.saturating_add(DROPOFF_GAS_OVERHEAD); } - if swap_count > 0 { - let overhead = calculate_evm_swap_overhead(swap_type, swap_count) - .ok_or(SwapLayerError::EvmGasCalculationFailed)?; - total_gas = total_gas.saturating_add(overhead); - } + let swap_overhead = match output_token { + OutputToken::Gas(swap) | OutputToken::Other { address: _, swap } => { + calculate_evm_swap_overhead(&swap.swap_type) + .ok_or(SwapLayerError::EvmGasCalculationFailed)? + } + _ => 0, + }; + total_gas = total_gas.saturating_add(swap_overhead); let evm_gas_cost = calculate_evm_gas_cost( gas_price, @@ -158,8 +176,11 @@ pub fn calculate_relayer_fee( #[cfg(test)] mod test { + use hex_literal::hex; + use swap_layer_messages::types::{ - TraderJoePoolId, TraderJoeSwapParameters, UniswapSwapParameters, + OutputSwap, TraderJoePoolId, TraderJoeSwapParameters, TraderJoeSwapPath, Uint24, + UniswapSwapParameters, UniswapSwapPath, }; use crate::state::{ExecutionParams, RelayParams}; @@ -207,24 +228,11 @@ mod test { first_leg_fee: 0.into(), path: vec![], }); - let swap_count = 1; - let gas_overhead = calculate_evm_swap_overhead(swap_type, swap_count); + let gas_overhead = calculate_evm_swap_overhead(swap_type); assert_eq!(gas_overhead, Some(200_000)); } - #[test] - fn test_uniswap_gas_overhead_three_swap() { - let swap_type = &SwapType::UniswapV3(UniswapSwapParameters { - first_leg_fee: 0.into(), - path: vec![], - }); - let swap_count = 3; - let gas_overhead = calculate_evm_swap_overhead(swap_type, swap_count); - - assert_eq!(gas_overhead, Some(400_000)); - } - #[test] fn test_traderjoe_gas_overhead_one_swap() { let swap_type = &SwapType::TraderJoe(TraderJoeSwapParameters { @@ -234,27 +242,11 @@ mod test { }, path: vec![], }); - let swap_count = 1; - let gas_overhead = calculate_evm_swap_overhead(swap_type, swap_count); + let gas_overhead = calculate_evm_swap_overhead(swap_type); assert_eq!(gas_overhead, Some(200_000)); } - #[test] - fn test_traderjoe_gas_overhead_three_swap() { - let swap_type = &SwapType::TraderJoe(TraderJoeSwapParameters { - first_pool_id: TraderJoePoolId { - version: 0, - bin_size: 69, - }, - path: vec![], - }); - let swap_count = 3; - let gas_overhead = calculate_evm_swap_overhead(swap_type, swap_count); - - assert_eq!(gas_overhead, Some(400_000)); - } - #[test] fn test_calculate_evm_gas_cost() { let gas_price = 1_000; // 10 GWEI @@ -284,33 +276,48 @@ mod test { fn test_calculate_relayer_fee_no_swap() { let relay_params = test_relay_params(); let denorm_gas_dropoff = 50_000_000; - let swap_type = &SwapType::Invalid; - let swap_count = 0; + let output_token = &OutputToken::Usdc; - let relayer_fee = - calculate_relayer_fee(&relay_params, denorm_gas_dropoff, swap_type, swap_count); + let relayer_fee = calculate_relayer_fee(&relay_params, denorm_gas_dropoff, output_token); assert_eq!(relayer_fee.unwrap(), 16775000); } #[test] - fn test_calculate_relayer_fee_with_uniswap_swap() { + fn test_calculate_relayer_fee_with_gas_uniswap_swap() { let relay_params = test_relay_params(); let denorm_gas_dropoff = 50_000_000; - let swap_type = &SwapType::UniswapV3(UniswapSwapParameters { - first_leg_fee: 0.into(), - path: vec![], + let swap_type = SwapType::UniswapV3(UniswapSwapParameters { + first_leg_fee: Uint24::from(500), + path: vec![ + UniswapSwapPath { + evm_address: hex!("5991a2df15a8f6a256d3ec51e99254cd3fb576a9"), + fee: Uint24::from(500), + }, + UniswapSwapPath { + evm_address: hex!("5991a2df15a8f6a256d3ec51e99254cd3fb576a9"), + fee: Uint24::from(500), + }, + UniswapSwapPath { + evm_address: hex!("5991a2df15a8f6a256d3ec51e99254cd3fb576a9"), + fee: Uint24::from(500), + }, + ], }); - let swap_count = 4; - let relayer_fee = - calculate_relayer_fee(&relay_params, denorm_gas_dropoff, swap_type, swap_count); + let output_token = OutputToken::Gas(OutputSwap { + deadline: 0, + limit_amount: 0, + swap_type: swap_type.clone(), + }); + + let relayer_fee = calculate_relayer_fee(&relay_params, denorm_gas_dropoff, &output_token); assert_eq!(relayer_fee.unwrap(), 18025000); } #[test] - fn test_calculate_relayer_fee_with_trader_joe_swap() { + fn test_calculate_relayer_fee_with_gas_trader_joe_swap() { let relay_params = test_relay_params(); let denorm_gas_dropoff = 50_000_000; let swap_type = &SwapType::TraderJoe(TraderJoeSwapParameters { @@ -318,12 +325,21 @@ mod test { version: 0, bin_size: 69, }, - path: vec![], + path: vec![TraderJoeSwapPath { + evm_address: hex!("5991a2df15a8f6a256d3ec51e99254cd3fb576a9"), + pool_id: TraderJoePoolId { + version: 0, + bin_size: 69, + }, + }], + }); + let output_token = OutputToken::Gas(OutputSwap { + deadline: 0, + limit_amount: 0, + swap_type: swap_type.clone(), }); - let swap_count = 2; - let relayer_fee = - calculate_relayer_fee(&relay_params, denorm_gas_dropoff, swap_type, swap_count); + let relayer_fee = calculate_relayer_fee(&relay_params, denorm_gas_dropoff, &output_token); assert_eq!(relayer_fee.unwrap(), 17525000); } diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 22855281..4c07b426 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -9,7 +9,7 @@ import { Connection, PublicKey, SystemProgram, TransactionInstruction } from "@s import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; import IDL from "../../../target/idl/swap_layer.json"; import { SwapLayer } from "../../../target/types/swap_layer"; -import { Custodian, Peer, RelayParams } from "./state"; +import { Custodian, Peer, RelayParams, StagedTransfer } from "./state"; export const PROGRAM_IDS = ["SwapLayer1111111111111111111111111111111111"] as const; @@ -31,6 +31,8 @@ export type InitiateTransferArgs = { targetChain: number; relayOptions: RelayOptions | null; recipient: Array; + encodedOutputToken: Buffer; + payload: Buffer | null; }; export type UpdateRelayParametersArgs = { @@ -194,6 +196,21 @@ export class SwapLayerProgram { }; } + stagedTransferAddress(preparedFill: PublicKey) { + return StagedTransfer.address(this.ID, preparedFill); + } + + stagedTransferTokenAddress(stagedTransfer: PublicKey): PublicKey { + return PublicKey.findProgramAddressSync( + [Buffer.from("staged-custody"), stagedTransfer.toBuffer()], + this.ID, + )[0]; + } + + async fetchStagedTransfer(addr: PublicKey): Promise { + return this.program.account.stagedTransfer.fetch(addr); + } + async fetchCustodian(input?: { address: PublicKey }): Promise { const addr = input === undefined ? this.custodianAddress() : input.address; return this.program.account.custodian.fetch(addr); @@ -455,8 +472,6 @@ export class SwapLayerProgram { throw new Error("fee recipient token account not found"); } - const tokenRouter = this.tokenRouterProgram(); - return this.program.methods .completeTransferRelay() .accounts({ @@ -497,8 +512,6 @@ export class SwapLayerProgram { recipient ??= payer; recipientTokenAccount ??= splToken.getAssociatedTokenAddressSync(this.mint, recipient); - const tokenRouter = this.tokenRouterProgram(); - return this.program.methods .completeTransferDirect() .accounts({ @@ -517,6 +530,64 @@ export class SwapLayerProgram { .instruction(); } + async completeTransferPayloadIx( + accounts: { + payer: PublicKey; + preparedFill: PublicKey; + peer?: PublicKey; + beneficiary?: PublicKey; + }, + sourceChain?: wormholeSdk.ChainId, + ) { + let { payer, preparedFill, peer, beneficiary } = accounts; + + beneficiary ??= payer; + + const stagedTransfer = this.stagedTransferAddress(preparedFill); + const stagedCustodyToken = this.stagedTransferTokenAddress(stagedTransfer); + + return this.program.methods + .completeTransferPayload() + .accounts({ + payer: payer, + consumeSwapLayerFill: await this.consumeSwapLayerFillComposite( + { + preparedFill, + beneficiary, + associatedPeer: peer, + }, + { sourceChain }, + ), + stagedTransfer, + stagedCustodyToken, + usdc: this.usdcComposite(this.mint), + tokenProgram: splToken.TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }) + .instruction(); + } + + async consumeStagedTransferIx(accounts: { + stagedTransfer: PublicKey; + recipient: PublicKey; + dstToken: PublicKey; + beneficiary: PublicKey; + }): Promise { + const { stagedTransfer, recipient, dstToken, beneficiary } = accounts; + + return this.program.methods + .consumeStagedTransfer() + .accounts({ + recipient, + beneficiary, + stagedTransfer, + dstToken, + stagedCustodyToken: this.stagedTransferTokenAddress(stagedTransfer), + tokenProgram: splToken.TOKEN_PROGRAM_ID, + }) + .instruction(); + } + async completeSwapDirectIx( accounts: { payer: PublicKey; diff --git a/solana/ts/src/swapLayer/messages/layouts.ts b/solana/ts/src/swapLayer/messages/layouts.ts index 60c36b25..ce95b552 100644 --- a/solana/ts/src/swapLayer/messages/layouts.ts +++ b/solana/ts/src/swapLayer/messages/layouts.ts @@ -25,6 +25,9 @@ export const decodeSwapLayerMessage = (encoded: Uint8Array): SwapLayerMessage => export const encodeSwapLayerMessage = (message: SwapLayerMessage): Uint8Array => serializeLayout(swapLayerMessageLayout, message); +export const encodeOutputToken = (outputToken: OutputToken): Uint8Array => + serializeLayout(outputTokenItem, outputToken); + const forceBigIntConversion = { custom: { to: (encoded: number) => BigInt(encoded), diff --git a/solana/ts/src/swapLayer/state/StagedTransfer.ts b/solana/ts/src/swapLayer/state/StagedTransfer.ts new file mode 100644 index 00000000..46f4baa8 --- /dev/null +++ b/solana/ts/src/swapLayer/state/StagedTransfer.ts @@ -0,0 +1,33 @@ +import { PublicKey } from "@solana/web3.js"; + +export type StagedTransferSeeds = { + preparedFill: PublicKey; + bump: number; +}; + +export type StagedTransferInfo = { + stagedCustodyTokenBump: number; + stagedBy: PublicKey; + sourceChain: number; + recipient: PublicKey; + isNative: boolean; +}; + +export class StagedTransfer { + seeds: StagedTransferSeeds; + info: StagedTransferInfo; + recipientPayload: Buffer; + + constructor(seeds: StagedTransferSeeds, info: StagedTransferInfo, recipientPayload: Buffer) { + this.seeds = seeds; + this.info = info; + this.recipientPayload = recipientPayload; + } + + static address(programId: PublicKey, preparedFill: PublicKey) { + return PublicKey.findProgramAddressSync( + [Buffer.from("staged"), preparedFill.toBuffer()], + programId, + )[0]; + } +} diff --git a/solana/ts/src/swapLayer/state/index.ts b/solana/ts/src/swapLayer/state/index.ts index fabef4d3..c87ccb77 100644 --- a/solana/ts/src/swapLayer/state/index.ts +++ b/solana/ts/src/swapLayer/state/index.ts @@ -1,2 +1,3 @@ export * from "./Custodian"; export * from "./Peer"; +export * from "./StagedTransfer"; diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__swapLayer.ts index a340a269..88baceb1 100644 --- a/solana/ts/tests/01__swapLayer.ts +++ b/solana/ts/tests/01__swapLayer.ts @@ -38,6 +38,7 @@ import { Custodian, Peer, RelayParams, + StagedTransfer, SwapLayerProgram, U32_MAX, UpdateRelayParametersArgs, @@ -45,6 +46,7 @@ import { denormalizeGasDropOff, encodeSwapLayerMessage, localnet, + encodeOutputToken, } from "../src/swapLayer"; import { FEE_UPDATER_KEYPAIR, @@ -1126,6 +1128,8 @@ describe("Swap Layer", () => { maxRelayerFee: new BN(maxRelayerFee), }, recipient: foreignRecipientAddress, + encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + payload: null, }, ); @@ -1154,6 +1158,8 @@ describe("Swap Layer", () => { maxRelayerFee: new BN(maxRelayerFee), }, recipient: foreignRecipientAddress, + encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + payload: null, }, ); @@ -1186,6 +1192,8 @@ describe("Swap Layer", () => { maxRelayerFee: new BN(maxRelayerFee), }, recipient: new Array(32).fill(0), + encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + payload: null, }, ); @@ -1215,6 +1223,8 @@ describe("Swap Layer", () => { maxRelayerFee: new BN(maxRelayerFee), }, recipient: foreignRecipientAddress, + encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + payload: null, }, ); @@ -1258,6 +1268,8 @@ describe("Swap Layer", () => { maxRelayerFee: new BN(maxRelayerFee), }, recipient: foreignRecipientAddress, + encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + payload: null, }, ); @@ -1295,6 +1307,8 @@ describe("Swap Layer", () => { maxRelayerFee: new BN(maxRelayerFee), }, recipient: foreignRecipientAddress, + encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + payload: null, }, ); @@ -1345,6 +1359,8 @@ describe("Swap Layer", () => { maxRelayerFee: new BN(maxRelayerFee), }, recipient: foreignRecipientAddress, + encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + payload: null, }, ); @@ -1443,6 +1459,8 @@ describe("Swap Layer", () => { maxRelayerFee: new BN(maxRelayerFee), }, recipient: foreignRecipientAddress, + encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + payload: null, }, ); @@ -1667,8 +1685,51 @@ describe("Swap Layer", () => { await expectIxErr(connection, [transferIx], [payer], "InvalidPeer"); }); - it.skip("Cannot Complete Transfer (InvalidOutputToken)", async function () { - // TODO: Need to use encoded swaptype for this test. + it("Cannot Complete Transfer (Invalid Output Token)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress(payer.publicKey.toString(), "base58"), + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 6900n, + }, + outputToken: { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "JupiterV6", + dexProgramId: { isSome: false }, + }, + }, + }, + }), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + preparedFill, + recipient: payer.publicKey, + }, + foreignChain, + ); + + await expectIxErr(connection, [transferIx], [payer], "InvalidOutputToken"); }); it("Cannot Complete Transfer (Invalid Recipient)", async function () { @@ -1969,6 +2030,8 @@ describe("Swap Layer", () => { targetChain: foreignChain, relayOptions: null, recipient: foreignRecipientAddress, + encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + payload: null, }, ); @@ -2170,8 +2233,52 @@ describe("Swap Layer", () => { await expectIxErr(connection, [transferIx], [payer], "InvalidRecipient"); }); - it.skip("Cannot Complete Transfer (InvalidOutputToken)", async function () { - // TODO: Need to use encoded swaptype for this test. + it("Cannot Complete Transfer (Invalid Output Token)", async function () { + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { + mode: "Direct", + }, + outputToken: { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "JupiterV6", + dexProgramId: { isSome: false }, + }, + }, + }, + }), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferDirectIx( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient.publicKey, + }, + foreignChain, + ); + + await expectIxErr(connection, [transferIx], [payer], "InvalidOutputToken"); }); it("Complete Transfer (Recipient Not Payer)", async function () { @@ -2279,12 +2386,233 @@ describe("Swap Layer", () => { }); }); - describe("Jupiter V6 Swap", function () { - // TODO + describe("USDC Transfer (Payload)", function () { + describe("Outbound", function () { + it("Initiate Transfer", async function () { + const amountIn = 6900000000n; + const payload = Buffer.from("Insert payload here"); + + // Balance check. + const payerToken = await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + payer.publicKey, + ); + const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); - before("Not Paused", async function () { - const custodian = await tokenRouter.fetchCustodian(); - expect(custodian.paused).is.false; + const preparedOrder = Keypair.generate(); + + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: foreignChain, + relayOptions: null, + recipient: foreignRecipientAddress, + encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + payload, + }, + ); + + await expectIxOk(connection, [ix], [payer, preparedOrder]); + + // Balance check. + const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); + expect(payerAfter).to.equal(payerBefore - amountIn); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder( + preparedOrder.publicKey, + ); + + const { + info: { preparedCustodyTokenBump }, + } = preparedOrderData; + + hackedExpectDeepEqual( + preparedOrderData, + new PreparedOrder( + { + orderSender: payer.publicKey, + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, + }, + srcToken: payerToken.address, + refundToken: payerToken.address, + targetChain: foreignChain, + redeemer: foreignSwapLayerAddress, + preparedCustodyTokenBump, + }, + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + Uint8Array.from(foreignRecipientAddress), + ), + redeemMode: { mode: "Payload", payload }, + outputToken: { type: "Usdc" }, + }), + ), + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), + ); + expect(preparedCustodyTokenBalance).equals(amountIn); + }); + }); + + describe("Inbound", function () { + const localVariables = {}; + + it("Stage Transfer", async function () { + const payload = Buffer.from("Insert payload here"); + + const result = await createAndRedeemCctpFillForTest( + connection, + tokenRouter, + swapLayer, + tokenRouterLkupTable, + payer, + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { mode: "Payload", payload }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa, message } = result!; + + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); + + const transferIx = await swapLayer.completeTransferPayloadIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + }, + foreignChain, + ); + + await expectIxOk(connection, [transferIx], [payer]); + + // Balance check. + const stagedTransfer = swapLayer.stagedTransferAddress(preparedFill); + const stagedTransferTokenAddress = + swapLayer.stagedTransferTokenAddress(stagedTransfer); + + const { amount: balanceAfter } = await splToken.getAccount( + connection, + stagedTransferTokenAddress, + ); + expect(balanceAfter).to.equal(message.deposit!.header.amount); + + // State check. + const stagedTransferData = await swapLayer.fetchStagedTransfer(stagedTransfer); + hackedExpectDeepEqual( + stagedTransferData, + new StagedTransfer( + { + preparedFill, + bump: stagedTransferData.seeds.bump, + }, + { + stagedCustodyTokenBump: + stagedTransferData.info.stagedCustodyTokenBump, + stagedBy: payer.publicKey, + sourceChain: foreignChain, + recipient: recipient.publicKey, + isNative: false, + }, + payload, + ), + ); + + localVariables["stagedTransfer"] = stagedTransfer; + }); + + it("Consume Staged Transfer", async function () { + const stagedTransfer = localVariables["stagedTransfer"]; + const beneficiary = Keypair.generate(); + const dstTokenOwner = Keypair.generate(); + + const dstToken = splToken.getAssociatedTokenAddressSync( + USDC_MINT_ADDRESS, + dstTokenOwner.publicKey, + ); + + await expectIxOk( + connection, + [ + splToken.createAssociatedTokenAccountInstruction( + payer.publicKey, + dstToken, + dstTokenOwner.publicKey, + USDC_MINT_ADDRESS, + ), + ], + [payer], + ); + + const expectedLamports = await connection + .getAccountInfo(stagedTransfer) + .then((info) => info!.lamports); + const custodyToken = swapLayer.stagedTransferTokenAddress(stagedTransfer); + const { amount: stagedTokenBalance } = await splToken.getAccount( + connection, + custodyToken, + ); + const expectedCustodyTokenLamports = await connection + .getAccountInfo(custodyToken) + .then((info) => info!.lamports); + + const consumeIx = await swapLayer.consumeStagedTransferIx({ + recipient: recipient.publicKey, + beneficiary: beneficiary.publicKey, + stagedTransfer, + dstToken: dstToken, + }); + + await expectIxOk(connection, [consumeIx], [recipient]); + + // Verify that accounts were closed. + { + const accInfo = await connection.getAccountInfo(stagedTransfer); + expect(accInfo).is.null; + } + { + const accInfo = await connection.getAccountInfo(custodyToken); + expect(accInfo).is.null; + } + + const { amount: dstTokenBalance } = await splToken.getAccount( + connection, + dstToken, + ); + expect(dstTokenBalance).equals(stagedTokenBalance); + + const beneficiaryBalance = await connection.getBalance(beneficiary.publicKey); + expect(beneficiaryBalance).equals( + expectedLamports + expectedCustodyTokenLamports, + ); + }); }); }); }); @@ -2367,8 +2695,9 @@ async function createAndRedeemCctpFillForTest( units: 300_000, }); - const { value: lookupTableAccount } = - await connection.getAddressLookupTable(tokenRouterLkupTable); + const { value: lookupTableAccount } = await connection.getAddressLookupTable( + tokenRouterLkupTable, + ); await expectIxOk(connection, [computeIx, ix], [payer], { addressLookupTableAccounts: [lookupTableAccount!], @@ -2446,18 +2775,3 @@ async function updateRelayParamsForTest( await expectIxOk(swapLayer.program.provider.connection, [ix], [feeUpdater]); } - -async function addPeerForTest( - swapLayer: SwapLayerProgram, - ownerOrAssistant: Keypair, - addPeerArgs: AddPeerArgs, -) { - const ix = await swapLayer.addPeerIx( - { - ownerOrAssistant: ownerOrAssistant.publicKey, - }, - addPeerArgs, - ); - - expectIxOk(swapLayer.program.provider.connection, [ix], [ownerOrAssistant]); -} From edc1e0f45e6236e741f91c5cfdf02bd561b52eaf Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Wed, 15 May 2024 11:24:58 -0500 Subject: [PATCH 04/50] solana: rename StagedTransfer to StagedInbound (#26) Co-authored-by: gator-boi --- solana/programs/swap-layer/src/lib.rs | 4 +- .../src/processor/complete/usdc/payload.rs | 28 +++++++------- .../programs/swap-layer/src/processor/mod.rs | 4 +- ..._staged_transfer.rs => release_inbound.rs} | 34 ++++++++--------- solana/programs/swap-layer/src/state/mod.rs | 4 +- .../{staged_transfer.rs => staged_inbound.rs} | 24 ++++++------ solana/ts/src/swapLayer/index.ts | 32 ++++++++-------- .../{StagedTransfer.ts => StagedInbound.ts} | 14 +++---- solana/ts/src/swapLayer/state/index.ts | 2 +- solana/ts/tests/01__swapLayer.ts | 38 +++++++++---------- 10 files changed, 92 insertions(+), 92 deletions(-) rename solana/programs/swap-layer/src/processor/{consume_staged_transfer.rs => release_inbound.rs} (71%) rename solana/programs/swap-layer/src/state/{staged_transfer.rs => staged_inbound.rs} (66%) rename solana/ts/src/swapLayer/state/{StagedTransfer.ts => StagedInbound.ts} (62%) diff --git a/solana/programs/swap-layer/src/lib.rs b/solana/programs/swap-layer/src/lib.rs index 5a54d633..e8148485 100644 --- a/solana/programs/swap-layer/src/lib.rs +++ b/solana/programs/swap-layer/src/lib.rs @@ -111,8 +111,8 @@ pub mod swap_layer { processor::complete_transfer_payload(ctx) } - pub fn consume_staged_transfer(ctx: Context) -> Result<()> { - processor::consume_staged_transfer(ctx) + pub fn release_inbound(ctx: Context) -> Result<()> { + processor::release_inbound(ctx) } pub fn initiate_transfer( diff --git a/solana/programs/swap-layer/src/processor/complete/usdc/payload.rs b/solana/programs/swap-layer/src/processor/complete/usdc/payload.rs index 620327ab..05b50d75 100644 --- a/solana/programs/swap-layer/src/processor/complete/usdc/payload.rs +++ b/solana/programs/swap-layer/src/processor/complete/usdc/payload.rs @@ -1,7 +1,7 @@ use crate::{ composite::*, error::SwapLayerError, - state::{StagedTransfer, StagedTransferInfo, StagedTransferSeeds}, + state::{StagedInbound, StagedInboundInfo, StagedInboundSeeds}, }; use anchor_lang::prelude::*; use anchor_spl::token; @@ -34,23 +34,23 @@ pub struct CompleteTransferPayload<'info> { #[account( init_if_needed, payer = payer, - space = try_compute_staged_transfer_size(&consume_swap_layer_fill.read_message_unchecked())?, + space = try_compute_staged_inbound_size(&consume_swap_layer_fill.read_message_unchecked())?, seeds = [ - StagedTransfer::SEED_PREFIX, + StagedInbound::SEED_PREFIX, consume_swap_layer_fill.prepared_fill_key().as_ref(), ], bump )] - staged_transfer: Account<'info, StagedTransfer>, + staged_inbound: Account<'info, StagedInbound>, #[account( init_if_needed, payer = payer, token::mint = usdc, - token::authority = staged_transfer, + token::authority = staged_inbound, seeds = [ crate::STAGED_CUSTODY_TOKEN_SEED_PREFIX, - staged_transfer.key().as_ref(), + staged_inbound.key().as_ref(), ], bump, )] @@ -63,10 +63,10 @@ pub struct CompleteTransferPayload<'info> { } pub fn complete_transfer_payload(ctx: Context) -> Result<()> { - let staged_transfer = &mut ctx.accounts.staged_transfer; + let staged_inbound = &mut ctx.accounts.staged_inbound; // Set the staged transfer if it hasn't been set yet. - if staged_transfer.staged_by == Pubkey::default() { + if staged_inbound.staged_by == Pubkey::default() { // Consume the prepared fill, and send the tokens to the staged custody account. ctx.accounts.consume_swap_layer_fill.consume_prepared_fill( ctx.accounts.staged_custody_token.to_account_info(), @@ -78,12 +78,12 @@ pub fn complete_transfer_payload(ctx: Context) -> Resul .consume_swap_layer_fill .read_message_unchecked(); - staged_transfer.set_inner(StagedTransfer { - seeds: StagedTransferSeeds { + staged_inbound.set_inner(StagedInbound { + seeds: StagedInboundSeeds { prepared_fill: ctx.accounts.consume_swap_layer_fill.prepared_fill_key(), - bump: ctx.bumps.staged_transfer, + bump: ctx.bumps.staged_inbound, }, - info: StagedTransferInfo { + info: StagedInboundInfo { staged_custody_token_bump: ctx.bumps.staged_custody_token, staged_by: ctx.accounts.payer.key(), source_chain: ctx.accounts.consume_swap_layer_fill.fill.source_chain, @@ -97,12 +97,12 @@ pub fn complete_transfer_payload(ctx: Context) -> Resul Ok(()) } -fn try_compute_staged_transfer_size(swap_msg: &SwapMessageV1) -> Result { +fn try_compute_staged_inbound_size(swap_msg: &SwapMessageV1) -> Result { // Match on Payload redeem type. match &swap_msg.redeem_mode { RedeemMode::Payload(payload) => { let payload_size = payload.len(); - StagedTransfer::checked_compute_size(payload_size) + StagedInbound::checked_compute_size(payload_size) .ok_or(error!(SwapLayerError::PayloadTooLarge)) } _ => Err(SwapLayerError::InvalidRedeemMode.into()), diff --git a/solana/programs/swap-layer/src/processor/mod.rs b/solana/programs/swap-layer/src/processor/mod.rs index ed504084..24a7b4e0 100644 --- a/solana/programs/swap-layer/src/processor/mod.rs +++ b/solana/programs/swap-layer/src/processor/mod.rs @@ -7,5 +7,5 @@ pub use complete::*; mod initiate; pub use initiate::*; -mod consume_staged_transfer; -pub use consume_staged_transfer::*; +mod release_inbound; +pub use release_inbound::*; diff --git a/solana/programs/swap-layer/src/processor/consume_staged_transfer.rs b/solana/programs/swap-layer/src/processor/release_inbound.rs similarity index 71% rename from solana/programs/swap-layer/src/processor/consume_staged_transfer.rs rename to solana/programs/swap-layer/src/processor/release_inbound.rs index dd291bd0..c5844509 100644 --- a/solana/programs/swap-layer/src/processor/consume_staged_transfer.rs +++ b/solana/programs/swap-layer/src/processor/release_inbound.rs @@ -1,12 +1,12 @@ -use crate::state::StagedTransfer; +use crate::state::StagedInbound; use anchor_lang::prelude::*; use anchor_spl::token; -/// Accounts required for [consume_prepared_fill]. +/// Accounts required for [consume_inbound]. #[derive(Accounts)] -pub struct ConsumeStagedTransfer<'info> { +pub struct ReleaseInbound<'info> { /// This signer must be the same one encoded in the staged transfer. - #[account(address = staged_transfer.recipient)] + #[account(address = staged_inbound.recipient)] recipient: Signer<'info>, /// CHECK: This recipient may not necessarily be the same one encoded in the staged transfer (as @@ -20,7 +20,7 @@ pub struct ConsumeStagedTransfer<'info> { mut, close = beneficiary, )] - staged_transfer: Account<'info, StagedTransfer>, + staged_inbound: Account<'info, StagedInbound>, /// Destination token account, which the redeemer may not own. But because the redeemer is a /// signer and is the one encoded in the Deposit Fill message, he may have the tokens be sent @@ -37,22 +37,22 @@ pub struct ConsumeStagedTransfer<'info> { mut, seeds = [ crate::STAGED_CUSTODY_TOKEN_SEED_PREFIX, - staged_transfer.key().as_ref(), + staged_inbound.key().as_ref(), ], - bump = staged_transfer.staged_custody_token_bump, + bump = staged_inbound.staged_custody_token_bump, )] staged_custody_token: Account<'info, token::TokenAccount>, token_program: Program<'info, token::Token>, } -pub fn consume_staged_transfer(ctx: Context) -> Result<()> { - let staged_transfer = &ctx.accounts.staged_transfer; +pub fn release_inbound(ctx: Context) -> Result<()> { + let staged_inbound = &ctx.accounts.staged_inbound; - let staged_transfer_signer_seeds = &[ - StagedTransfer::SEED_PREFIX, - staged_transfer.seeds.prepared_fill.as_ref(), - &[staged_transfer.seeds.bump], + let staged_inbound_signer_seeds = &[ + StagedInbound::SEED_PREFIX, + staged_inbound.seeds.prepared_fill.as_ref(), + &[staged_inbound.seeds.bump], ]; let custody_token = &ctx.accounts.staged_custody_token; @@ -64,9 +64,9 @@ pub fn consume_staged_transfer(ctx: Context) -> Result<() token::Transfer { from: custody_token.to_account_info(), to: ctx.accounts.dst_token.to_account_info(), - authority: staged_transfer.to_account_info(), + authority: staged_inbound.to_account_info(), }, - &[staged_transfer_signer_seeds], + &[staged_inbound_signer_seeds], ), custody_token.amount, )?; @@ -77,8 +77,8 @@ pub fn consume_staged_transfer(ctx: Context) -> Result<() token::CloseAccount { account: custody_token.to_account_info(), destination: ctx.accounts.beneficiary.to_account_info(), - authority: staged_transfer.to_account_info(), + authority: staged_inbound.to_account_info(), }, - &[staged_transfer_signer_seeds], + &[staged_inbound_signer_seeds], )) } diff --git a/solana/programs/swap-layer/src/state/mod.rs b/solana/programs/swap-layer/src/state/mod.rs index 2c52aa2f..fe5f4e22 100644 --- a/solana/programs/swap-layer/src/state/mod.rs +++ b/solana/programs/swap-layer/src/state/mod.rs @@ -4,5 +4,5 @@ pub use custodian::*; mod peer; pub use peer::*; -mod staged_transfer; -pub use staged_transfer::*; +mod staged_inbound; +pub use staged_inbound::*; diff --git a/solana/programs/swap-layer/src/state/staged_transfer.rs b/solana/programs/swap-layer/src/state/staged_inbound.rs similarity index 66% rename from solana/programs/swap-layer/src/state/staged_transfer.rs rename to solana/programs/swap-layer/src/state/staged_inbound.rs index 05f73eab..dc12eb87 100644 --- a/solana/programs/swap-layer/src/state/staged_transfer.rs +++ b/solana/programs/swap-layer/src/state/staged_inbound.rs @@ -1,16 +1,16 @@ use anchor_lang::prelude::*; #[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, InitSpace)] -pub struct StagedTransferSeeds { +pub struct StagedInboundSeeds { pub prepared_fill: Pubkey, pub bump: u8, } #[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, InitSpace)] -pub struct StagedTransferInfo { +pub struct StagedInboundInfo { pub staged_custody_token_bump: u8, - // Payer that created this StagedTransfer. + // Payer that created this StagedInbound. pub staged_by: Pubkey, // Exposed out of convenience for the receiving program. @@ -27,19 +27,19 @@ pub struct StagedTransferInfo { #[account] #[derive(Debug)] -pub struct StagedTransfer { - pub seeds: StagedTransferSeeds, - pub info: StagedTransferInfo, +pub struct StagedInbound { + pub seeds: StagedInboundSeeds, + pub info: StagedInboundInfo, pub recipient_payload: Vec, } -impl StagedTransfer { - pub const SEED_PREFIX: &'static [u8] = b"staged"; +impl StagedInbound { + pub const SEED_PREFIX: &'static [u8] = b"staged-inbound"; pub fn checked_compute_size(payload_len: usize) -> Option { const FIXED: usize = 8 // DISCRIMINATOR - + StagedTransferSeeds::INIT_SPACE - + StagedTransferInfo::INIT_SPACE + + StagedInboundSeeds::INIT_SPACE + + StagedInboundInfo::INIT_SPACE + 4 // payload len ; @@ -47,8 +47,8 @@ impl StagedTransfer { } } -impl std::ops::Deref for StagedTransfer { - type Target = StagedTransferInfo; +impl std::ops::Deref for StagedInbound { + type Target = StagedInboundInfo; fn deref(&self) -> &Self::Target { &self.info diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 4c07b426..80547c6d 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -9,7 +9,7 @@ import { Connection, PublicKey, SystemProgram, TransactionInstruction } from "@s import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; import IDL from "../../../target/idl/swap_layer.json"; import { SwapLayer } from "../../../target/types/swap_layer"; -import { Custodian, Peer, RelayParams, StagedTransfer } from "./state"; +import { Custodian, Peer, RelayParams, StagedInbound } from "./state"; export const PROGRAM_IDS = ["SwapLayer1111111111111111111111111111111111"] as const; @@ -196,19 +196,19 @@ export class SwapLayerProgram { }; } - stagedTransferAddress(preparedFill: PublicKey) { - return StagedTransfer.address(this.ID, preparedFill); + stagedInboundAddress(preparedFill: PublicKey) { + return StagedInbound.address(this.ID, preparedFill); } - stagedTransferTokenAddress(stagedTransfer: PublicKey): PublicKey { + stagedInboundTokenAddress(StagedInbound: PublicKey): PublicKey { return PublicKey.findProgramAddressSync( - [Buffer.from("staged-custody"), stagedTransfer.toBuffer()], + [Buffer.from("staged-custody"), StagedInbound.toBuffer()], this.ID, )[0]; } - async fetchStagedTransfer(addr: PublicKey): Promise { - return this.program.account.stagedTransfer.fetch(addr); + async fetchStagedInbound(addr: PublicKey): Promise { + return this.program.account.stagedInbound.fetch(addr); } async fetchCustodian(input?: { address: PublicKey }): Promise { @@ -543,8 +543,8 @@ export class SwapLayerProgram { beneficiary ??= payer; - const stagedTransfer = this.stagedTransferAddress(preparedFill); - const stagedCustodyToken = this.stagedTransferTokenAddress(stagedTransfer); + const stagedInbound = this.stagedInboundAddress(preparedFill); + const stagedCustodyToken = this.stagedInboundTokenAddress(stagedInbound); return this.program.methods .completeTransferPayload() @@ -558,7 +558,7 @@ export class SwapLayerProgram { }, { sourceChain }, ), - stagedTransfer, + stagedInbound, stagedCustodyToken, usdc: this.usdcComposite(this.mint), tokenProgram: splToken.TOKEN_PROGRAM_ID, @@ -567,22 +567,22 @@ export class SwapLayerProgram { .instruction(); } - async consumeStagedTransferIx(accounts: { - stagedTransfer: PublicKey; + async releaseInboundIx(accounts: { + stagedInbound: PublicKey; recipient: PublicKey; dstToken: PublicKey; beneficiary: PublicKey; }): Promise { - const { stagedTransfer, recipient, dstToken, beneficiary } = accounts; + const { stagedInbound, recipient, dstToken, beneficiary } = accounts; return this.program.methods - .consumeStagedTransfer() + .releaseInbound() .accounts({ recipient, beneficiary, - stagedTransfer, + stagedInbound, dstToken, - stagedCustodyToken: this.stagedTransferTokenAddress(stagedTransfer), + stagedCustodyToken: this.stagedInboundTokenAddress(stagedInbound), tokenProgram: splToken.TOKEN_PROGRAM_ID, }) .instruction(); diff --git a/solana/ts/src/swapLayer/state/StagedTransfer.ts b/solana/ts/src/swapLayer/state/StagedInbound.ts similarity index 62% rename from solana/ts/src/swapLayer/state/StagedTransfer.ts rename to solana/ts/src/swapLayer/state/StagedInbound.ts index 46f4baa8..dc37107a 100644 --- a/solana/ts/src/swapLayer/state/StagedTransfer.ts +++ b/solana/ts/src/swapLayer/state/StagedInbound.ts @@ -1,11 +1,11 @@ import { PublicKey } from "@solana/web3.js"; -export type StagedTransferSeeds = { +export type StagedInboundSeeds = { preparedFill: PublicKey; bump: number; }; -export type StagedTransferInfo = { +export type StagedInboundInfo = { stagedCustodyTokenBump: number; stagedBy: PublicKey; sourceChain: number; @@ -13,12 +13,12 @@ export type StagedTransferInfo = { isNative: boolean; }; -export class StagedTransfer { - seeds: StagedTransferSeeds; - info: StagedTransferInfo; +export class StagedInbound { + seeds: StagedInboundSeeds; + info: StagedInboundInfo; recipientPayload: Buffer; - constructor(seeds: StagedTransferSeeds, info: StagedTransferInfo, recipientPayload: Buffer) { + constructor(seeds: StagedInboundSeeds, info: StagedInboundInfo, recipientPayload: Buffer) { this.seeds = seeds; this.info = info; this.recipientPayload = recipientPayload; @@ -26,7 +26,7 @@ export class StagedTransfer { static address(programId: PublicKey, preparedFill: PublicKey) { return PublicKey.findProgramAddressSync( - [Buffer.from("staged"), preparedFill.toBuffer()], + [Buffer.from("staged-inbound"), preparedFill.toBuffer()], programId, )[0]; } diff --git a/solana/ts/src/swapLayer/state/index.ts b/solana/ts/src/swapLayer/state/index.ts index c87ccb77..e2b57382 100644 --- a/solana/ts/src/swapLayer/state/index.ts +++ b/solana/ts/src/swapLayer/state/index.ts @@ -1,3 +1,3 @@ export * from "./Custodian"; export * from "./Peer"; -export * from "./StagedTransfer"; +export * from "./StagedInbound"; diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__swapLayer.ts index 88baceb1..06fa0944 100644 --- a/solana/ts/tests/01__swapLayer.ts +++ b/solana/ts/tests/01__swapLayer.ts @@ -38,7 +38,7 @@ import { Custodian, Peer, RelayParams, - StagedTransfer, + StagedInbound, SwapLayerProgram, U32_MAX, UpdateRelayParametersArgs, @@ -2474,7 +2474,7 @@ describe("Swap Layer", () => { describe("Inbound", function () { const localVariables = {}; - it("Stage Transfer", async function () { + it("Stage Inbound Transfer", async function () { const payload = Buffer.from("Insert payload here"); const result = await createAndRedeemCctpFillForTest( @@ -2514,28 +2514,28 @@ describe("Swap Layer", () => { await expectIxOk(connection, [transferIx], [payer]); // Balance check. - const stagedTransfer = swapLayer.stagedTransferAddress(preparedFill); - const stagedTransferTokenAddress = - swapLayer.stagedTransferTokenAddress(stagedTransfer); + const stagedInbound = swapLayer.stagedInboundAddress(preparedFill); + const stagedInboundTokenAddress = + swapLayer.stagedInboundTokenAddress(stagedInbound); const { amount: balanceAfter } = await splToken.getAccount( connection, - stagedTransferTokenAddress, + stagedInboundTokenAddress, ); expect(balanceAfter).to.equal(message.deposit!.header.amount); // State check. - const stagedTransferData = await swapLayer.fetchStagedTransfer(stagedTransfer); + const stagedInboundData = await swapLayer.fetchStagedInbound(stagedInbound); hackedExpectDeepEqual( - stagedTransferData, - new StagedTransfer( + stagedInboundData, + new StagedInbound( { preparedFill, - bump: stagedTransferData.seeds.bump, + bump: stagedInboundData.seeds.bump, }, { stagedCustodyTokenBump: - stagedTransferData.info.stagedCustodyTokenBump, + stagedInboundData.info.stagedCustodyTokenBump, stagedBy: payer.publicKey, sourceChain: foreignChain, recipient: recipient.publicKey, @@ -2545,11 +2545,11 @@ describe("Swap Layer", () => { ), ); - localVariables["stagedTransfer"] = stagedTransfer; + localVariables["stagedInbound"] = stagedInbound; }); - it("Consume Staged Transfer", async function () { - const stagedTransfer = localVariables["stagedTransfer"]; + it("Release Inbound", async function () { + const stagedInbound = localVariables["stagedInbound"]; const beneficiary = Keypair.generate(); const dstTokenOwner = Keypair.generate(); @@ -2572,9 +2572,9 @@ describe("Swap Layer", () => { ); const expectedLamports = await connection - .getAccountInfo(stagedTransfer) + .getAccountInfo(stagedInbound) .then((info) => info!.lamports); - const custodyToken = swapLayer.stagedTransferTokenAddress(stagedTransfer); + const custodyToken = swapLayer.stagedInboundTokenAddress(stagedInbound); const { amount: stagedTokenBalance } = await splToken.getAccount( connection, custodyToken, @@ -2583,10 +2583,10 @@ describe("Swap Layer", () => { .getAccountInfo(custodyToken) .then((info) => info!.lamports); - const consumeIx = await swapLayer.consumeStagedTransferIx({ + const consumeIx = await swapLayer.releaseInboundIx({ recipient: recipient.publicKey, beneficiary: beneficiary.publicKey, - stagedTransfer, + stagedInbound, dstToken: dstToken, }); @@ -2594,7 +2594,7 @@ describe("Swap Layer", () => { // Verify that accounts were closed. { - const accInfo = await connection.getAccountInfo(stagedTransfer); + const accInfo = await connection.getAccountInfo(stagedInbound); expect(accInfo).is.null; } { From 677dfe15568954f37984726cb449dfb46a0406fc Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Wed, 15 May 2024 15:51:49 -0500 Subject: [PATCH 05/50] solana: fix ts relayer fees (#28) Co-authored-by: gator-boi --- solana/ts/src/swapLayer/relayerFees.ts | 38 ++-- solana/ts/tests/01__swapLayer.ts | 249 ++++++++++++++++++++++++- 2 files changed, 264 insertions(+), 23 deletions(-) diff --git a/solana/ts/src/swapLayer/relayerFees.ts b/solana/ts/src/swapLayer/relayerFees.ts index bc38606e..eca73f0b 100644 --- a/solana/ts/src/swapLayer/relayerFees.ts +++ b/solana/ts/src/swapLayer/relayerFees.ts @@ -1,4 +1,4 @@ -import { RelayParams } from "."; +import { OutputToken, RelayParams } from "."; // Gas overheads for EVM. const EVM_GAS_OVERHEAD = 100_000n; @@ -42,17 +42,28 @@ function compound(percentage: number, base: bigint): bigint { } } -function calculateEvmSwapOverhead(swapType: DestinationSwapType, swapCount: number): bigint { - switch (swapType) { - case { none: {} }: - return 0n; - case { uniswapV3: {} }: - return UNISWAP_GAS_OVERHEAD + UNISWAP_GAS_PER_SWAP * BigInt(swapCount); - case { traderJoe: {} }: - return TRADERJOE_GAS_OVERHEAD + TRADERJOE_GAS_PER_SWAP * BigInt(swapCount); - default: +function calculateEvmSwapOverhead(outputToken: OutputToken): bigint { + let overhead = 0n; + let costPerSwap = 0n; + let pathLen = 0n; + + if (outputToken.type === "Usdc") { + return 0n; + } else { + if (outputToken.swap.type.id === "UniswapV3") { + overhead = UNISWAP_GAS_OVERHEAD; + costPerSwap = UNISWAP_GAS_PER_SWAP; + pathLen = BigInt(outputToken.swap.type.path.length) + 1n; + } else if (outputToken.swap.type.id === "TraderJoe") { + overhead = TRADERJOE_GAS_OVERHEAD; + costPerSwap = TRADERJOE_GAS_PER_SWAP; + pathLen = BigInt(outputToken.swap.type.path.length) + 1n; + } else { throw Error("Unsupported swap type"); + } } + + return overhead + pathLen * costPerSwap; } function calculateEvmGasCost( @@ -78,8 +89,7 @@ function calculateGasDropoffCost( export function calculateRelayerFee( relayParams: RelayParams, denormGasDropOff: bigint, - swapType: DestinationSwapType, - swapCount: number, + outputToken: OutputToken, ) { if (relayParams.baseFee === U32_MAX) { throw Error("Relaying Disabled"); @@ -108,9 +118,7 @@ export function calculateRelayerFee( totalGas += DROPOFF_GAS_OVERHEAD; } - if (swapCount > 0) { - totalGas += calculateEvmSwapOverhead(swapType, swapCount); - } + totalGas += calculateEvmSwapOverhead(outputToken); relayerFee += calculateEvmGasCost( relayParams.executionParams.evm.gasPrice, diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__swapLayer.ts index 06fa0944..28f1018d 100644 --- a/solana/ts/tests/01__swapLayer.ts +++ b/solana/ts/tests/01__swapLayer.ts @@ -47,6 +47,7 @@ import { encodeSwapLayerMessage, localnet, encodeOutputToken, + OutputToken, } from "../src/swapLayer"; import { FEE_UPDATER_KEYPAIR, @@ -1324,6 +1325,7 @@ describe("Swap Layer", () => { const amountIn = 6900000000n; const gasDropoff = 100000; const maxRelayerFee = 9999999999999; + const outputToken: OutputToken = { type: "Usdc" }; // Fetch peer data. const peer = await swapLayer.fetchPeer(foreignChain); @@ -1331,8 +1333,7 @@ describe("Swap Layer", () => { const expectedRelayerFee = calculateRelayerFee( peer.relayParams, denormalizeGasDropOff(gasDropoff), - { none: {} }, - 0, + outputToken, ); // Balance check. @@ -1359,7 +1360,7 @@ describe("Swap Layer", () => { maxRelayerFee: new BN(maxRelayerFee), }, recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + encodedOutputToken: Buffer.from(encodeOutputToken(outputToken)), payload: null, }, ); @@ -1406,7 +1407,7 @@ describe("Swap Layer", () => { gasDropoff, relayingFee: expectedRelayerFee, }, - outputToken: { type: "Usdc" }, + outputToken, }), ), ), @@ -1424,6 +1425,7 @@ describe("Swap Layer", () => { const amountIn = 6900000000n; const gasDropoff = 0; const maxRelayerFee = 9999999999999; + const outputToken: OutputToken = { type: "Usdc" }; // Fetch peer data. const peer = await swapLayer.fetchPeer(foreignChain); @@ -1431,8 +1433,7 @@ describe("Swap Layer", () => { const expectedRelayerFee = calculateRelayerFee( peer.relayParams, denormalizeGasDropOff(gasDropoff), - { none: {} }, - 0, + outputToken, ); // Balance check. @@ -1459,7 +1460,7 @@ describe("Swap Layer", () => { maxRelayerFee: new BN(maxRelayerFee), }, recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), + encodedOutputToken: Buffer.from(encodeOutputToken(outputToken)), payload: null, }, ); @@ -1506,7 +1507,239 @@ describe("Swap Layer", () => { gasDropoff, relayingFee: expectedRelayerFee, }, - outputToken: { type: "Usdc" }, + outputToken, + }), + ), + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), + ); + expect(preparedCustodyTokenBalance).equals(amountIn + expectedRelayerFee); + }); + + it("Initiate Transfer With Gas Dropoff And Target Swap", async function () { + const amountIn = 6900000000n; + const gasDropoff = 100000; + const maxRelayerFee = 9999999999999; + const outputToken: OutputToken = { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [ + { + address: "0x5991A2dF15A8F6A256D3Ec51E99254Cd3fb576A9", + poolId: 500, + }, + ], + }, + }, + }; + + // Fetch peer data. + const peer = await swapLayer.fetchPeer(foreignChain); + + const expectedRelayerFee = calculateRelayerFee( + peer.relayParams, + denormalizeGasDropOff(gasDropoff), + outputToken, + ); + + // Balance check. + const payerToken = await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + payer.publicKey, + ); + const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); + + const preparedOrder = Keypair.generate(); + + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: foreignChain, + relayOptions: { + gasDropoff: gasDropoff, + maxRelayerFee: new BN(maxRelayerFee), + }, + recipient: foreignRecipientAddress, + encodedOutputToken: Buffer.from(encodeOutputToken(outputToken)), + payload: null, + }, + ); + + await expectIxOk(connection, [ix], [payer, preparedOrder]); + + // Balance check. + const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); + expect(payerAfter).to.equal(payerBefore - amountIn - expectedRelayerFee); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder( + preparedOrder.publicKey, + ); + + const { + info: { preparedCustodyTokenBump }, + } = preparedOrderData; + + hackedExpectDeepEqual( + preparedOrderData, + new PreparedOrder( + { + orderSender: payer.publicKey, + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, + }, + srcToken: payerToken.address, + refundToken: payerToken.address, + targetChain: foreignChain, + redeemer: foreignSwapLayerAddress, + preparedCustodyTokenBump, + }, + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + Uint8Array.from(foreignRecipientAddress), + ), + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee: expectedRelayerFee, + }, + outputToken, + }), + ), + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), + ); + expect(preparedCustodyTokenBalance).equals(amountIn + expectedRelayerFee); + }); + + it("Initiate Transfer Without Gas Dropoff And Target Swap", async function () { + const amountIn = 6900000000n; + const gasDropoff = 0; + const maxRelayerFee = 9999999999999; + const outputToken: OutputToken = { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [ + { + address: "0x5991A2dF15A8F6A256D3Ec51E99254Cd3fb576A9", + poolId: 500, + }, + ], + }, + }, + }; + + // Fetch peer data. + const peer = await swapLayer.fetchPeer(foreignChain); + + const expectedRelayerFee = calculateRelayerFee( + peer.relayParams, + denormalizeGasDropOff(gasDropoff), + outputToken, + ); + + // Balance check. + const payerToken = await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + payer.publicKey, + ); + const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); + + const preparedOrder = Keypair.generate(); + + const ix = await swapLayer.initiateTransferIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder.publicKey, + }, + { + amountIn: new BN(amountIn.toString()), + targetChain: foreignChain, + relayOptions: { + gasDropoff: gasDropoff, + maxRelayerFee: new BN(maxRelayerFee), + }, + recipient: foreignRecipientAddress, + encodedOutputToken: Buffer.from(encodeOutputToken(outputToken)), + payload: null, + }, + ); + + await expectIxOk(connection, [ix], [payer, preparedOrder]); + + // Balance check. + const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); + expect(payerAfter).to.equal(payerBefore - amountIn - expectedRelayerFee); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder( + preparedOrder.publicKey, + ); + + const { + info: { preparedCustodyTokenBump }, + } = preparedOrderData; + + hackedExpectDeepEqual( + preparedOrderData, + new PreparedOrder( + { + orderSender: payer.publicKey, + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, + }, + srcToken: payerToken.address, + refundToken: payerToken.address, + targetChain: foreignChain, + redeemer: foreignSwapLayerAddress, + preparedCustodyTokenBump, + }, + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + Uint8Array.from(foreignRecipientAddress), + ), + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee: expectedRelayerFee, + }, + outputToken, }), ), ), From 8c7eb49c560ee0222da9535ee0285d3b58f2b5bb Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Wed, 15 May 2024 16:21:45 -0500 Subject: [PATCH 06/50] resync submodule (#27) * pin submodule to new commit * universal/rs: fix tests * Fix submodule TS build steps (#29) * fix package-lock --------- Co-authored-by: A5 Pickle Co-authored-by: Ben Guidarelli --- .gitmodules | 2 +- Makefile | 9 +- lib/example-liquidity-layer | 2 +- package-lock.json | 8104 +++++++++------------ solana/package.json | 1 + solana/ts/tests/01__swapLayer.ts | 16 +- solana/ts/tests/10__jupiterTest.ts | 22 +- universal/rs/messages/src/messages/mod.rs | 8 +- 8 files changed, 3511 insertions(+), 4653 deletions(-) diff --git a/.gitmodules b/.gitmodules index 19853a9b..27cebd2f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "lib/example-liquidity-layer"] path = lib/example-liquidity-layer url = https://github.com/wormhole-foundation/example-liquidity-layer.git - branch = main + rev = 68ba4e5ea8743e1173e70203b572ebd4f5e4b00c diff --git a/Makefile b/Makefile index f2a49439..5c9e3506 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ clean: .PHONY: fast-transfer-sync fast-transfer-sync: - git submodule update --init + git submodule update --remote git submodule sync --recursive .PHONY: fast-transfer-clean @@ -18,8 +18,11 @@ fast-transfer-setup: fast-transfer-sync .PHONY: fast-transfer-sdk fast-transfer-sdk: fast-transfer-setup - cd lib/example-liquidity-layer && npm ci && npm run build --workspace solana && npm pack --workspace solana + cd lib/example-liquidity-layer \ + && $(MAKE) build \ + && npm run build -w solana \ + && npm pack -w universal/ts -w solana node_modules: fast-transfer-sdk - npm update @wormhole-foundation/example-liquidity-layer-solana + npm install -w solana lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-* npm ci diff --git a/lib/example-liquidity-layer b/lib/example-liquidity-layer index d369fbf0..68ba4e5e 160000 --- a/lib/example-liquidity-layer +++ b/lib/example-liquidity-layer @@ -1 +1 @@ -Subproject commit d369fbf0c616da9bfdbdedd5b026f2b3382a3fa1 +Subproject commit 68ba4e5ea8743e1173e70203b572ebd4f5e4b00c diff --git a/package-lock.json b/package-lock.json index da093fba..78975213 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,31 +52,18 @@ } }, "node_modules/@0no-co/graphqlsp": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.12.2.tgz", - "integrity": "sha512-bUYuwoHuvlTIZZpt2l0furjcNMpd80T5JB4YzmOdcv+wlndHpRWeFwgnGH7qgyy986oGKxgomS0oBXjxmEMtYg==", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.12.3.tgz", + "integrity": "sha512-U0hV/FmFgm2perV+mrXKe/7Z5F4/9rmOziHJYYQgKLwzUVuN5LQG0qs3cLBGxAqoosG0HfTi2cQkgMKY1CMbYQ==", "dependencies": { - "@gql.tada/internal": "^0.3.0", - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "node-fetch": "^2.0.0" + "@gql.tada/internal": "^1.0.0", + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0" }, "peerDependencies": { "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", "typescript": "^5.0.0" } }, - "node_modules/@0no-co/graphqlsp/node_modules/@gql.tada/internal": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-0.3.3.tgz", - "integrity": "sha512-lBOiN0c/Fx5eY5KGwkzB5+6asUv9IAoD6f5rZjN8r9h4hvSk4V5Kuuu6EfKixF6h5/o/xDRgA/BU3355udnK3g==", - "dependencies": { - "@0no-co/graphql.web": "^1.0.5" - }, - "peerDependencies": { - "graphql": "^16.8.1", - "typescript": "^5.0.0" - } - }, "node_modules/@adraffy/ens-normalize": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", @@ -95,9 +82,9 @@ } }, "node_modules/@apollo/client": { - "version": "3.10.3", - "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.10.3.tgz", - "integrity": "sha512-4EIgZnFmRO1laWv3NCxlVIxcvimG63djuAXvyXhpQH3wkNMv9SykrasKRN08+z+cn/fVisBOLmkSRdyNyP9f4A==", + "version": "3.10.4", + "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.10.4.tgz", + "integrity": "sha512-51gk0xOwN6Ls1EbTG5svFva1kdm2APHYTzmFhaAdvUQoJFDxfc0UwQgDxGptzH84vkPlo1qunY1FuboyF9LI3Q==", "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", @@ -745,100 +732,15 @@ "rxjs": "^7.5.6" } }, - "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==", - "dependencies": { - "@types/long": "^4.0.2", - "@types/node": "^18.0.3" - } - }, - "node_modules/@certusone/wormhole-sdk-wasm/node_modules/@types/node": { - "version": "18.19.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", - "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@certusone/wormhole-sdk/node_modules/@solana/spl-token": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.11.tgz", - "integrity": "sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==", - "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/buffer-layout-utils": "^0.2.0", - "@solana/spl-token-metadata": "^0.1.2", - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.88.0" - } - }, - "node_modules/@certusone/wormhole-spydk": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@certusone/wormhole-spydk/-/wormhole-spydk-0.0.1.tgz", - "integrity": "sha512-iBQoY3UnmGoWHcbn0FypA6hKsANhdHKi03UN0GPoDAeMY12j8ly+7r462TfLl5f4hOJVQd3UZ2qviohEmdicmg==", - "dependencies": { - "@grpc/grpc-js": "^1.4.4", - "protobufjs": "^6.11.2" - } - }, - "node_modules/@certusone/wormhole-spydk/node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", - "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/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "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/@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/@classic-terra/terra.proto/node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "node_modules/@certusone/wormhole-sdk-proto-web/node_modules/protobufjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -851,97 +753,31 @@ "@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" + "long": "^5.0.0" }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "engines": { - "node": ">=0.1.90" - } - }, - "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==", - "dependencies": { - "@noble/hashes": "^1.0.0", - "protobufjs": "^6.8.8" - } - }, - "node_modules/@confio/ics23/node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", - "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/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" + "node": ">=12.0.0" } }, - "node_modules/@coral-xyz/anchor": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.0.tgz", - "integrity": "sha512-qreDh5ztiRHVnCbJ+RS70NJ6aSTPBYDAgFeQ7Z5QvaT5DcDIhNyt4onOciVz2ieIE1XWePOJDDu9SbNvPGBkvQ==", + "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==", "dependencies": { - "@coral-xyz/borsh": "^0.30.0", - "@noble/hashes": "^1.3.1", - "@solana/web3.js": "^1.68.0", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^6.3.0", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "superstruct": "^0.15.4", - "toml": "^3.0.0" - }, - "engines": { - "node": ">=11" + "@types/long": "^4.0.2", + "@types/node": "^18.0.3" } }, - "node_modules/@coral-xyz/anchor/node_modules/@coral-xyz/borsh": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.0.tgz", - "integrity": "sha512-OrcV+7N10cChhgDRUxM4iEIuwxUHHs52XD85R8cFCUqE0vbLYrcoPPPs+VF6kZ9DhdJGVW2I6DHJOp5TykyZog==", + "node_modules/@certusone/wormhole-sdk-wasm/node_modules/@types/node": { + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.68.0" + "undici-types": "~5.26.4" } }, - "node_modules/@coral-xyz/borsh": { + "node_modules/@certusone/wormhole-sdk/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==", @@ -956,7 +792,7 @@ "@solana/web3.js": "^1.2.0" } }, - "node_modules/@cosmjs/amino": { + "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/amino": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.30.1.tgz", "integrity": "sha512-yNHnzmvAlkETDYIpeCTdVqgvrdt1qgkOXwuRVi8s27UKI5hfqyE9fJ/fuunXE6ZZPnKkjIecDznmuUOMrMvw4w==", @@ -968,209 +804,49 @@ "@cosmjs/utils": "^0.30.1" } }, - "node_modules/@cosmjs/cosmwasm-stargate": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.32.3.tgz", - "integrity": "sha512-pqkt+QsLIPNMTRh9m+igJgIpzXXgn1BxmxfAb9zlC23kvsuzY/12un9M7iAdim1NwKXDFeYw46xC2YkprwQp+g==", - "dependencies": { - "@cosmjs/amino": "^0.32.3", - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/proto-signing": "^0.32.3", - "@cosmjs/stargate": "^0.32.3", - "@cosmjs/tendermint-rpc": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0", - "pako": "^2.0.2" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/amino": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", - "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", - "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/crypto": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", - "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", + "node_modules/@certusone/wormhole-sdk/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.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", + "@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-sumo": "^0.7.11" + "libsodium-wrappers": "^0.7.6" } }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/encoding": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", - "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", + "node_modules/@certusone/wormhole-sdk/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/cosmwasm-stargate/node_modules/@cosmjs/json-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", - "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", + "node_modules/@certusone/wormhole-sdk/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/@certusone/wormhole-sdk/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.32.3", + "@cosmjs/stream": "^0.30.1", "xstream": "^11.14.0" } }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/math": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", - "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", - "dependencies": { - "bn.js": "^5.2.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/proto-signing": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", - "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", - "dependencies": { - "@cosmjs/amino": "^0.32.3", - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/socket": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", - "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", - "dependencies": { - "@cosmjs/stream": "^0.32.3", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/stargate": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", - "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", - "dependencies": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/proto-signing": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/tendermint-rpc": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/stream": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", - "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", - "dependencies": { - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/tendermint-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", - "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", - "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/json-rpc": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/socket": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "axios": "^1.6.0", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/@cosmjs/utils": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", - "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "node_modules/@cosmjs/cosmwasm-stargate/node_modules/cosmjs-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", - "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" - }, - "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": { + "node_modules/@certusone/wormhole-sdk/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==", @@ -1179,7 +855,7 @@ "bn.js": "^5.2.0" } }, - "node_modules/@cosmjs/proto-signing": { + "node_modules/@certusone/wormhole-sdk/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==", @@ -1194,7 +870,7 @@ "long": "^4.0.0" } }, - "node_modules/@cosmjs/socket": { + "node_modules/@certusone/wormhole-sdk/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==", @@ -1206,7 +882,7 @@ "xstream": "^11.14.0" } }, - "node_modules/@cosmjs/stargate": { + "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/stargate": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.30.1.tgz", "integrity": "sha512-RdbYKZCGOH8gWebO7r6WvNnQMxHrNXInY/gPHPzMjbQF6UatA6fNM2G2tdgS5j5u7FTqlCI10stNXrknaNdzog==", @@ -1226,33 +902,7 @@ "xstream": "^11.14.0" } }, - "node_modules/@cosmjs/stargate/node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", - "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/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } - }, - "node_modules/@cosmjs/stream": { + "node_modules/@certusone/wormhole-sdk/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==", @@ -1261,7 +911,7 @@ "xstream": "^11.14.0" } }, - "node_modules/@cosmjs/tendermint-rpc": { + "node_modules/@certusone/wormhole-sdk/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==", @@ -1279,7 +929,7 @@ "xstream": "^11.14.0" } }, - "node_modules/@cosmjs/tendermint-rpc/node_modules/axios": { + "node_modules/@certusone/wormhole-sdk/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==", @@ -1288,2623 +938,1956 @@ "follow-redirects": "^1.14.0" } }, - "node_modules/@cosmjs/utils": { + "node_modules/@certusone/wormhole-sdk/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==", - "dev": true, + "node_modules/@certusone/wormhole-sdk/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": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" } }, - "node_modules/@cspotcode/source-map-support/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==", - "dev": true, + "node_modules/@certusone/wormhole-sdk/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/@certusone/wormhole-sdk/node_modules/@injectivelabs/core-proto-ts/node_modules/protobufjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "hasInstallScript": true, + "optional": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@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/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", + "node_modules/@certusone/wormhole-sdk/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": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" } }, - "node_modules/@ensdomains/ens-validation": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@ensdomains/ens-validation/-/ens-validation-0.1.0.tgz", - "integrity": "sha512-rbDh2K6GfqXvBcJUISaTTYEt3f079WA4ohTE5Lh4/8EaaPAk/9vk3EisMUQV2UVxeFIZQEEyRCIOmRTpqN0W7A==" - }, - "node_modules/@ensdomains/eth-ens-namehash": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@ensdomains/eth-ens-namehash/-/eth-ens-namehash-2.0.15.tgz", - "integrity": "sha512-JRDFP6+Hczb1E0/HhIg0PONgBYasfGfDheujmfxaZaAv/NAH4jE6Kf48WbqfRZdxt4IZI3jl3Ri7sZ1nP09lgw==" + "node_modules/@certusone/wormhole-sdk/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/@esbuild/aix-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", - "cpu": [ - "ppc64" - ], - "dev": true, + "node_modules/@certusone/wormhole-sdk/node_modules/@injectivelabs/indexer-proto-ts/node_modules/protobufjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "hasInstallScript": true, "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], + "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" + "node": ">=12.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@certusone/wormhole-sdk/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, - "os": [ - "android" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } + "node_modules/@certusone/wormhole-sdk/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/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@certusone/wormhole-sdk/node_modules/@injectivelabs/mito-proto-ts/node_modules/protobufjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "hasInstallScript": true, "optional": true, - "os": [ - "darwin" - ], + "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" + "node": ">=12.0.0" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@certusone/wormhole-sdk/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, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "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/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@certusone/wormhole-sdk/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, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "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/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, + "node_modules/@certusone/wormhole-sdk/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, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, + "node_modules/@certusone/wormhole-sdk/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, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "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/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, + "node_modules/@certusone/wormhole-sdk/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, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "dependencies": { + "follow-redirects": "^1.14.0" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "node_modules/@certusone/wormhole-sdk/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/" + } + ] }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" + "node_modules/@certusone/wormhole-sdk/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/" + } ], - "engines": { - "node": ">=12" + "dependencies": { + "@noble/hashes": "~1.1.1", + "@scure/base": "~1.1.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], + "node_modules/@certusone/wormhole-sdk/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": ">=12" + "node": ">=11.0.0" } }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "node_modules/@certusone/wormhole-sdk/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/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" + "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==", + "dependencies": { + "follow-redirects": "^1.14.4" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } + "node_modules/@certusone/wormhole-sdk/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, + "node_modules/@certusone/wormhole-sdk/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, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "long": "^4.0.0", + "protobufjs": "~6.11.2" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" + "node_modules/@certusone/wormhole-spydk": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@certusone/wormhole-spydk/-/wormhole-spydk-0.0.1.tgz", + "integrity": "sha512-iBQoY3UnmGoWHcbn0FypA6hKsANhdHKi03UN0GPoDAeMY12j8ly+7r462TfLl5f4hOJVQd3UZ2qviohEmdicmg==", + "dependencies": { + "@grpc/grpc-js": "^1.4.4", + "protobufjs": "^6.11.2" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" + "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/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "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/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "engines": { - "node": ">=12" + "node": ">=0.1.90" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" + "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==", + "dependencies": { + "@noble/hashes": "^1.0.0", + "protobufjs": "^6.8.8" } }, - "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, + "node_modules/@coral-xyz/anchor": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", + "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", "dependencies": { - "crc-32": "^1.2.0", - "ethereumjs-util": "^7.1.5" + "@coral-xyz/borsh": "^0.29.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" } }, - "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, + "node_modules/@coral-xyz/borsh": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", + "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", "dependencies": { - "@ethereumjs/common": "^2.6.4", - "ethereumjs-util": "^7.1.5" + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" } }, - "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" - } - ], + "node_modules/@cosmjs/amino": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", + "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", "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" + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3" } }, - "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" - } - ], + "node_modules/@cosmjs/cosmwasm-stargate": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.32.3.tgz", + "integrity": "sha512-pqkt+QsLIPNMTRh9m+igJgIpzXXgn1BxmxfAb9zlC23kvsuzY/12un9M7iAdim1NwKXDFeYw46xC2YkprwQp+g==", "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" + "@cosmjs/amino": "^0.32.3", + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/proto-signing": "^0.32.3", + "@cosmjs/stargate": "^0.32.3", + "@cosmjs/tendermint-rpc": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0", + "pako": "^2.0.2" } }, - "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" - } - ], + "node_modules/@cosmjs/crypto": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", + "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", "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" + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "@noble/hashes": "^1", + "bn.js": "^5.2.0", + "elliptic": "^6.5.4", + "libsodium-wrappers-sumo": "^0.7.11" } }, - "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" - } - ], + "node_modules/@cosmjs/encoding": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", + "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", "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" + "base64-js": "^1.3.0", + "bech32": "^1.1.4", + "readonly-date": "^1.0.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" - } - ], + "node_modules/@cosmjs/json-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", + "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", "dependencies": { - "@ethersproject/bytes": "^5.7.0" + "@cosmjs/stream": "^0.32.3", + "xstream": "^11.14.0" } }, - "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" - } - ], + "node_modules/@cosmjs/math": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", + "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" + "bn.js": "^5.2.0" } }, - "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" - } - ], + "node_modules/@cosmjs/proto-signing": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", + "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" + "@cosmjs/amino": "^0.32.3", + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0" } }, - "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" - } - ], + "node_modules/@cosmjs/socket": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", + "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "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" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.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" - } - ], - "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/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" - } - ], - "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/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" - } - ], - "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/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" - } - ], - "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/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" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "js-sha3": "0.8.0" - } - }, - "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" - } - ] - }, - "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" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "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" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/sha2": "^5.7.0" - } - }, - "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" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.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/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" - }, - "node_modules/@ethersproject/providers/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==", - "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/@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" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "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" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "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" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "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" - } - ], - "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/elliptic": { - "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" - } - }, - "node_modules/@ethersproject/signing-key/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==" - }, - "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" - } - ], - "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/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" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "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" - } - ], - "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/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" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "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" - } - ], - "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/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" - } - ], - "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/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" - } - ], - "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/@gql.tada/cli-utils": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/@gql.tada/cli-utils/-/cli-utils-1.3.4.tgz", - "integrity": "sha512-IHDJypDIIScs25pmsOrwlPy1MDnOwwzUKN+C9nLsQW0cW2c1S/L8K7FT9XUWH9qOjt7Q5K13GKWD3clfzlByuQ==", - "dependencies": { - "@0no-co/graphqlsp": "^1.12.1", - "@gql.tada/internal": "0.4.0", - "@vue/compiler-dom": "^3.4.23", - "@vue/language-core": "^2.0.0", - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "svelte2tsx": "^0.7.6" - }, - "peerDependencies": { - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "typescript": "^5.0.0" - } - }, - "node_modules/@gql.tada/internal": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-0.4.0.tgz", - "integrity": "sha512-VPJkuGcFu6dd6WPjhDK/FKcrCWtmSfb6KIFStSJc8yENLJeDkRBXm/H41lETPACHoP9N3WDh+VWgwuUAubcAVQ==", - "dependencies": { - "@0no-co/graphql.web": "^1.0.5" - }, - "peerDependencies": { - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "typescript": "^5.0.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==", - "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/@grpc/grpc-js": { - "version": "1.10.7", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.7.tgz", - "integrity": "sha512-ZMBVjSeDAz3tFSehyO6Pd08xZT1HfIwq3opbeM4cDlBh52gmwp0wVIPcQur53NN0ac68HMZ/7SF2rGRD5KmVmg==", - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@grpc/proto-loader/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/@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/@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/dmm-proto-ts": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/@injectivelabs/dmm-proto-ts/-/dmm-proto-ts-1.0.19.tgz", - "integrity": "sha512-2FCzCziy1RhzmnkAVIU+Asby/GXAVQqKt5/o1s52j0LJXfJMpiCrV6soLfnjTebj61T+1WvJBPFoZCCiVYBpcw==", - "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" - } - }, - "node_modules/@injectivelabs/exceptions": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/exceptions/-/exceptions-1.14.6.tgz", - "integrity": "sha512-A+URJwygeDjFPhulGMNVw70z738NtpIiCr0W8q4Kr4Ggg30i+AaVAjViYLm56pSMXXpomu9CYJ/sY6ijQn48IQ==", - "hasInstallScript": true, - "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "@injectivelabs/ts-types": "^1.14.6", - "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==", - "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==", - "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==", - "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/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/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.4", - "resolved": "https://registry.npmjs.org/@injectivelabs/test-utils/-/test-utils-1.14.4.tgz", - "integrity": "sha512-M7UoB5CIVVN7BtdmU26GwZsWKp0BQg9qV5a+YvcdhlwlSIkvt3gKVKBMq/vKClCakOu2AjhCVGDMZVnagIBogg==", - "hasInstallScript": 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==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@injectivelabs/token-metadata": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/@injectivelabs/token-metadata/-/token-metadata-1.14.7.tgz", - "integrity": "sha512-RRRuyirzoThwQ5P8D3STH2YOavGsdnetQy6ZPQ8yA7VUavt00KBB26M92zSLbiUz5VrxhPHDCEEkuJVWx+xtmw==", - "hasInstallScript": true, - "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/networks": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "@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.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", - "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", - "hasInstallScript": true, - "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" - } - }, - "node_modules/@injectivelabs/token-metadata/node_modules/@injectivelabs/utils": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", - "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", - "hasInstallScript": true, - "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "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" + "@cosmjs/stream": "^0.32.3", + "isomorphic-ws": "^4.0.1", + "ws": "^7", + "xstream": "^11.14.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==", + "node_modules/@cosmjs/stargate": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", + "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", "dependencies": { - "follow-redirects": "^1.14.0" + "@confio/ics23": "^0.6.8", + "@cosmjs/amino": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/proto-signing": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/tendermint-rpc": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "cosmjs-types": "^0.9.0", + "xstream": "^11.14.0" } }, - "node_modules/@injectivelabs/ts-types": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/ts-types/-/ts-types-1.14.6.tgz", - "integrity": "sha512-/Ax5eCSfE9OhcyUc9wZk/LFKTYhIY9RJIaNT/n92rbHjXSfXRLSX+Bvk62vC9Ej+SEBPp77WYngtrePPA1HEgw==", - "hasInstallScript": true, + "node_modules/@cosmjs/stream": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", + "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", "dependencies": { - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" + "xstream": "^11.14.0" } }, - "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, + "node_modules/@cosmjs/tendermint-rpc": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", + "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", "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" + "@cosmjs/crypto": "^0.32.3", + "@cosmjs/encoding": "^0.32.3", + "@cosmjs/json-rpc": "^0.32.3", + "@cosmjs/math": "^0.32.3", + "@cosmjs/socket": "^0.32.3", + "@cosmjs/stream": "^0.32.3", + "@cosmjs/utils": "^0.32.3", + "axios": "^1.6.0", + "readonly-date": "^1.0.0", + "xstream": "^11.14.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/@cosmjs/utils": { + "version": "0.32.3", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", + "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "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==", "dev": true, "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "node_modules/@cspotcode/source-map-support/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==", "dev": true, "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@jest/console/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==", - "dev": true, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" } }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@ensdomains/ens-validation": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@ensdomains/ens-validation/-/ens-validation-0.1.0.tgz", + "integrity": "sha512-rbDh2K6GfqXvBcJUISaTTYEt3f079WA4ohTE5Lh4/8EaaPAk/9vk3EisMUQV2UVxeFIZQEEyRCIOmRTpqN0W7A==" + }, + "node_modules/@ensdomains/eth-ens-namehash": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@ensdomains/eth-ens-namehash/-/eth-ens-namehash-2.0.15.tgz", + "integrity": "sha512-JRDFP6+Hczb1E0/HhIg0PONgBYasfGfDheujmfxaZaAv/NAH4jE6Kf48WbqfRZdxt4IZI3jl3Ri7sZ1nP09lgw==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12" } }, - "node_modules/@jest/console/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==", + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/@jest/console/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==", - "dev": true - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@jest/core/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==", + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=12" } }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12" } }, - "node_modules/@jest/core/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==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/@jest/core/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==", - "dev": true + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@jest/reporters/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==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=12" } }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12" } }, - "node_modules/@jest/reporters/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==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/@jest/reporters/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==", - "dev": true + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, + "optional": true, + "os": [ + "sunos" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": ">=12" } }, - "node_modules/@jest/transform/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==", + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "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/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "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": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" } }, - "node_modules/@jest/transform/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==", - "dev": true, + "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" + } + ], "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@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/@jest/transform/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==", - "dev": true - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, + "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" + } + ], "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "@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/@jest/types/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==", - "dev": true, + "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" + } + ], "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "@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/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, + "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" + } + ], "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "@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/@jest/types/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==", - "dev": true, + "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" + } + ], "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "@ethersproject/bytes": "^5.7.0" } }, - "node_modules/@jest/types/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==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "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" + } + ], "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" + "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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "engines": { - "node": ">=6.0.0" + "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" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.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.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "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" + } + ], "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@ethersproject/bignumber": "^5.7.0" } }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "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" + } + ], + "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/@jup-ag/api": { - "version": "6.0.20", - "resolved": "https://registry.npmjs.org/@jup-ag/api/-/api-6.0.20.tgz", - "integrity": "sha512-HaPWYpbcQiCkoq1fTKspFIismFI8Rw9ZzgC47PMNY+ZLN0IEDtSYcm3rVEyxO+E3StRxj9uKrNbok32SRCXWvQ==" - }, - "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==", + "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" + } + ], "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" + "@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/@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==", + "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" + } + ], "dependencies": { - "@types/node": "*" + "@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/@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==" - }, - "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==", + "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" + } + ], "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" + "@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/@mysten/bcs": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.7.1.tgz", - "integrity": "sha512-wFPb8bkhwrbiStfZMV5rFM7J+umpke59/dNjDp+UYJKykNlW23LCk2ePyEUvGdb62HGJM1jyOJ8g4egE3OmdKA==", + "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" + } + ], "dependencies": { - "bs58": "^5.0.0" + "@ethersproject/bytes": "^5.7.0", + "js-sha3": "0.8.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/@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" + } + ] }, - "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==", + "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" + } + ], "dependencies": { - "base-x": "^4.0.0" + "@ethersproject/logger": "^5.7.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/@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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" } }, - "node_modules/@mysten/sui.js/node_modules/superstruct": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", - "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", - "engines": { - "node": ">=14.0.0" + "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" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "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": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@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/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "node_modules/@ethersproject/providers/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==", "engines": { - "node": ">= 16" + "node": ">=8.3.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "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==", + "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" + } + ], "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" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@project-serum/anchor/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "engines": { - "node": ">=6" + "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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "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==", + "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" + } + ], "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.2.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" } }, - "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==" - }, - "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==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "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==", + "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" + } + ], "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@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/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" - }, - "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==" - }, - "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==" + "node_modules/@ethersproject/signing-key/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==", + "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/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + "node_modules/@ethersproject/signing-key/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==" }, - "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==" + "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" + } + ], + "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/@scure/base": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", - "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", - "funding": { - "url": "https://paulmillr.com/funding/" + "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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "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" + } + ], "dependencies": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@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/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", + "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" + } + ], "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "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" + } + ], + "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/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=1" + "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" + } + ], + "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/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, + "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" + } + ], "dependencies": { - "type-detect": "4.0.8" + "@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/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, + "node_modules/@gql.tada/cli-utils": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/@gql.tada/cli-utils/-/cli-utils-1.3.9.tgz", + "integrity": "sha512-oRb7SG/+csx9CiypSJTI21KaLfulOUnhX1vxg4FXi2snub9XShkGR2XnnlJVTAOZXY9Vcxti1NutAElxdDkycA==", "dependencies": { - "@sinonjs/commons": "^3.0.0" + "@0no-co/graphqlsp": "^1.12.1", + "@gql.tada/internal": "1.0.0", + "@vue/compiler-dom": "^3.4.23", + "@vue/language-core": "^2.0.17", + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "svelte2tsx": "^0.7.6" + }, + "peerDependencies": { + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "typescript": "^5.0.0" } }, - "node_modules/@solana/buffer-layout": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", - "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", + "node_modules/@gql.tada/internal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-1.0.0.tgz", + "integrity": "sha512-B55aIYyZn5ewdgMqoJciPAwF5DKYX6HBabTU+ap/dpNH3EgJrLomc8Y8w+MCxCyOx+dXL9OduT6eWnVr7J7Eyg==", "dependencies": { - "buffer": "~6.0.3" + "@0no-co/graphql.web": "^1.0.5" }, - "engines": { - "node": ">=5.10" + "peerDependencies": { + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "typescript": "^5.0.0" } }, - "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==", + "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==", + "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/@grpc/grpc-js": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz", + "integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==", "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/web3.js": "^1.32.0", - "bigint-buffer": "^1.1.5", - "bignumber.js": "^9.0.1" + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { - "node": ">= 10" + "node": ">=12.10.0" } }, - "node_modules/@solana/codecs": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.2.tgz", - "integrity": "sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==", + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-data-structures": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/codecs-strings": "2.0.0-preview.2", - "@solana/options": "2.0.0-preview.2" + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, + "engines": { + "node": ">=6" } }, - "node_modules/@solana/codecs-core": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz", - "integrity": "sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==", - "dependencies": { - "@solana/errors": "2.0.0-preview.2" - } + "node_modules/@grpc/proto-loader/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/@solana/codecs-data-structures": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz", - "integrity": "sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==", + "node_modules/@grpc/proto-loader/node_modules/protobufjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "hasInstallScript": true, "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" + "@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/@solana/codecs-numbers": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz", - "integrity": "sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==", + "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": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" + "browser-headers": "^0.4.1" + }, + "peerDependencies": { + "google-protobuf": "^3.14.0" } }, - "node_modules/@solana/codecs-strings": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz", - "integrity": "sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==", + "node_modules/@injectivelabs/core-proto-ts": { + "version": "0.0.21", + "resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz", + "integrity": "sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22" + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" } }, - "node_modules/@solana/errors": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.2.tgz", - "integrity": "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==", + "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==" + }, + "node_modules/@injectivelabs/core-proto-ts/node_modules/protobufjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "hasInstallScript": true, "dependencies": { - "chalk": "^5.3.0", - "commander": "^12.0.0" + "@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" }, - "bin": { - "errors": "bin/cli.js" + "engines": { + "node": ">=12.0.0" } }, - "node_modules/@solana/options": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz", - "integrity": "sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==", + "node_modules/@injectivelabs/dmm-proto-ts": { + "version": "1.0.19", + "resolved": "https://registry.npmjs.org/@injectivelabs/dmm-proto-ts/-/dmm-proto-ts-1.0.19.tgz", + "integrity": "sha512-2FCzCziy1RhzmnkAVIU+Asby/GXAVQqKt5/o1s52j0LJXfJMpiCrV6soLfnjTebj61T+1WvJBPFoZCCiVYBpcw==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2" + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" } }, - "node_modules/@solana/spl-token": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz", - "integrity": "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==", + "node_modules/@injectivelabs/dmm-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==" + }, + "node_modules/@injectivelabs/dmm-proto-ts/node_modules/protobufjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "hasInstallScript": true, "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/buffer-layout-utils": "^0.2.0", - "@solana/spl-token-group": "^0.0.4", - "@solana/spl-token-metadata": "^0.1.4", - "buffer": "^6.0.3" + "@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": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.91.6" + "node": ">=12.0.0" } }, - "node_modules/@solana/spl-token-group": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.4.tgz", - "integrity": "sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==", + "node_modules/@injectivelabs/exceptions": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/exceptions/-/exceptions-1.14.6.tgz", + "integrity": "sha512-A+URJwygeDjFPhulGMNVw70z738NtpIiCr0W8q4Kr4Ggg30i+AaVAjViYLm56pSMXXpomu9CYJ/sY6ijQn48IQ==", + "hasInstallScript": true, "dependencies": { - "@solana/codecs": "2.0.0-preview.2", - "@solana/spl-type-length-value": "0.1.0" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.91.6" + "@injectivelabs/grpc-web": "^0.0.1", + "@injectivelabs/ts-types": "^1.14.6", + "http-status-codes": "^2.2.0", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" } }, - "node_modules/@solana/spl-token-metadata": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz", - "integrity": "sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==", + "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==", "dependencies": { - "@solana/codecs": "2.0.0-preview.2", - "@solana/spl-type-length-value": "0.1.0" - }, - "engines": { - "node": ">=16" + "browser-headers": "^0.4.1" }, "peerDependencies": { - "@solana/web3.js": "^1.91.6" + "google-protobuf": "^3.14.0" } }, - "node_modules/@solana/spl-type-length-value": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz", - "integrity": "sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==", - "dependencies": { - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=16" + "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==", + "peerDependencies": { + "@injectivelabs/grpc-web": ">=0.0.1" } }, - "node_modules/@solana/web3.js": { - "version": "1.91.8", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.8.tgz", - "integrity": "sha512-USa6OS1jbh8zOapRJ/CBZImZ8Xb7AJjROZl5adql9TpOoBN9BUzyyouS5oPuZHft7S7eB8uJPuXWYjMi6BHgOw==", - "dependencies": { - "@babel/runtime": "^7.24.5", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.4.0", - "@solana/buffer-layout": "^4.0.1", - "agentkeepalive": "^4.5.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.7.0", - "rpc-websockets": "^7.11.0", - "superstruct": "^0.14.2" + "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==", + "peerDependencies": { + "@injectivelabs/grpc-web": ">=0.0.1" } }, - "node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + "node_modules/@injectivelabs/indexer-proto-ts": { + "version": "1.11.36", + "resolved": "https://registry.npmjs.org/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz", + "integrity": "sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew==", + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" + } }, - "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/@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==" }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "node_modules/@injectivelabs/indexer-proto-ts/node_modules/protobufjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "hasInstallScript": true, "dependencies": { - "defer-to-connect": "^2.0.0" + "@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": ">=10" + "node": ">=12.0.0" } }, - "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==", + "node_modules/@injectivelabs/mito-proto-ts": { + "version": "1.0.62", + "resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz", + "integrity": "sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA==", "dependencies": { - "google-protobuf": "^3.17.3", - "long": "^4.0.0", - "protobufjs": "~6.11.2" + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" } }, - "node_modules/@terra-money/legacy.proto/node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "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==" + }, + "node_modules/@injectivelabs/mito-proto-ts/node_modules/protobufjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -3917,40 +2900,72 @@ "@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" + "long": "^5.0.0" }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" + "engines": { + "node": ">=12.0.0" } }, - "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==", + "node_modules/@injectivelabs/networks": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", + "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", + "hasInstallScript": true, "dependencies": { - "@classic-terra/terra.proto": "^1.1.0", - "@terra-money/terra.proto": "^2.1.0", + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" + } + }, + "node_modules/@injectivelabs/sdk-ts": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz", + "integrity": "sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg==", + "hasInstallScript": true, + "dependencies": { + "@apollo/client": "^3.5.8", + "@cosmjs/amino": "^0.32.2", + "@cosmjs/proto-signing": "^0.32.2", + "@cosmjs/stargate": "^0.32.2", + "@ensdomains/ens-validation": "^0.1.0", + "@ensdomains/eth-ens-namehash": "^2.0.15", + "@ethersproject/bytes": "^5.7.0", + "@injectivelabs/core-proto-ts": "^0.0.21", + "@injectivelabs/dmm-proto-ts": "1.0.19", + "@injectivelabs/exceptions": "^1.14.6", + "@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.11.36", + "@injectivelabs/mito-proto-ts": "1.0.62", + "@injectivelabs/networks": "^1.14.6", + "@injectivelabs/test-utils": "^1.14.3", + "@injectivelabs/token-metadata": "^1.14.7", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "@metamask/eth-sig-util": "^4.0.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" + "bip39": "^3.0.4", + "cosmjs-types": "^0.9.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", + "secp256k1": "^4.0.3", + "shx": "^0.3.2", + "snakecase-keys": "^5.4.1" } }, - "node_modules/@terra-money/terra.js/node_modules/axios": { + "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==", @@ -3959,1151 +2974,1218 @@ "form-data": "^4.0.0" } }, - "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==", + "node_modules/@injectivelabs/sdk-ts/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, + "node_modules/@injectivelabs/test-utils": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@injectivelabs/test-utils/-/test-utils-1.14.4.tgz", + "integrity": "sha512-M7UoB5CIVVN7BtdmU26GwZsWKp0BQg9qV5a+YvcdhlwlSIkvt3gKVKBMq/vKClCakOu2AjhCVGDMZVnagIBogg==", + "hasInstallScript": true, "dependencies": { - "@improbable-eng/grpc-web": "^0.14.1", - "google-protobuf": "^3.17.3", - "long": "^4.0.0", - "protobufjs": "~6.11.2" + "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/@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==", + "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==", "dependencies": { - "browser-headers": "^0.4.1" - }, - "peerDependencies": { - "google-protobuf": "^3.14.0" + "follow-redirects": "^1.14.0" } }, - "node_modules/@terra-money/terra.proto/node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "node_modules/@injectivelabs/token-metadata": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/@injectivelabs/token-metadata/-/token-metadata-1.14.7.tgz", + "integrity": "sha512-RRRuyirzoThwQ5P8D3STH2YOavGsdnetQy6ZPQ8yA7VUavt00KBB26M92zSLbiUz5VrxhPHDCEEkuJVWx+xtmw==", "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/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/networks": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "@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/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true + "node_modules/@injectivelabs/ts-types": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/ts-types/-/ts-types-1.14.6.tgz", + "integrity": "sha512-/Ax5eCSfE9OhcyUc9wZk/LFKTYhIY9RJIaNT/n92rbHjXSfXRLSX+Bvk62vC9Ej+SEBPp77WYngtrePPA1HEgw==", + "hasInstallScript": true, + "dependencies": { + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" + } }, - "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==", - "dev": true + "node_modules/@injectivelabs/utils": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", + "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", + "hasInstallScript": true, + "dependencies": { + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "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/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, + "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==", "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "follow-redirects": "^1.14.0" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "dependencies": { - "@babel/types": "^7.0.0" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "engines": { + "node": ">=6" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, - "dependencies": { - "@babel/types": "^7.20.7" + "engines": { + "node": ">=8" } }, - "node_modules/@types/bn.js": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", - "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, "dependencies": { - "@types/node": "*" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "node_modules/@jest/console/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==", + "dev": true, "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", - "@types/node": "*", - "@types/responselike": "^1.0.0" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@types/chai": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", - "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", - "dev": true - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "@types/node": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "peer": true - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "node_modules/@jest/console/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==", "dev": true, "dependencies": { - "@types/node": "*" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "node_modules/@jest/console/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==", "dev": true }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "*" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "node_modules/@jest/core/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==", "dev": true, "dependencies": { - "@types/istanbul-lib-report": "*" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "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==", + "node_modules/@jest/core/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==", "dev": true, - "optional": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { - "@types/node": "*" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@types/lodash": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", - "integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==" + "node_modules/@jest/core/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==", + "dev": 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==", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, "dependencies": { - "@types/lodash": "*" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==" - }, - "node_modules/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, + "dependencies": { + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } }, - "node_modules/@types/node": { - "version": "20.12.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.11.tgz", - "integrity": "sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, "dependencies": { - "undici-types": "~5.26.4" + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "form-data": "^4.0.0" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, "dependencies": { - "@types/node": "*" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, "dependencies": { - "@types/node": "*" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@types/secp256k1": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", - "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", + "node_modules/@jest/reporters/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==", + "dev": true, "dependencies": { - "@types/node": "*" + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" - }, - "node_modules/@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "@types/node": "*" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "node_modules/@jest/reporters/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==", "dev": true, "dependencies": { - "@types/yargs-parser": "*" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true - }, - "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==", + "node_modules/@jest/reporters/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==", "dev": true }, - "node_modules/@volar/language-core": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.2.tgz", - "integrity": "sha512-GuvEL4JdxbnLVhPLICncCGT+tVW4cIz9GxXNeDofNnJ4iNTKhr5suGVsA1GLOne9PbraSjn8PlLt+pvLxuRVeQ==", - "dependencies": { - "@volar/source-map": "2.2.2" - } - }, - "node_modules/@volar/source-map": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.2.tgz", - "integrity": "sha512-vUwvZuSW6iN4JI9QRinh9EjFasx1TUtnaWMKwgWx08xz1PyYuNkLlWlrZXBZ5GGBhML0u230M/7X+AHY2h9yKg==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, "dependencies": { - "muggle-string": "^0.4.0" + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@vue/compiler-core": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", - "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", + "dev": true, "dependencies": { - "@babel/parser": "^7.24.4", - "@vue/shared": "3.4.27", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@vue/compiler-dom": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", - "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", + "dev": true, "dependencies": { - "@vue/compiler-core": "3.4.27", - "@vue/shared": "3.4.27" + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@vue/language-core": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.17.tgz", - "integrity": "sha512-tHw2J6G9yL4kn3jN5MftOHEq86Y6qnuohBQ1OHkJ73fAv3OYgwDI1cfX7ds0OEJEycOMG64BA3ql5bDgDa41zw==", + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", + "dev": true, "dependencies": { - "@volar/language-core": "~2.2.2", - "@vue/compiler-dom": "^3.4.0", - "@vue/shared": "^3.4.0", - "computeds": "^0.0.1", - "minimatch": "^9.0.3", - "path-browserify": "^1.0.1", - "vue-template-compiler": "^2.7.14" - }, - "peerDependencies": { - "typescript": "*" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@vue/language-core/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==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@vue/language-core/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "node_modules/@jest/transform/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==", + "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@vue/shared": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", - "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" - }, - "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { - "version": "0.0.1", - "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "integrity": "sha512-wETcbDAJNPR5KWMwkfSncFk6wD8LbF5WCrr4UBLbGRnBW0DD/XgkzNQAqXYZRp88EY6xN5Rr/qZrc5mziq20BQ==", + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "@certusone/wormhole-spydk": "^0.0.1", - "@coral-xyz/anchor": "^0.30.0", - "@solana/spl-token": "^0.4.6", - "@solana/spl-token-group": "^0.0.4", - "@solana/spl-token-metadata": "^0.1.4", - "@solana/web3.js": "^1.91.7", - "@types/node-fetch": "^2.6.11", - "@wormhole-foundation/sdk": "^0.6.8", - "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", - "dotenv": "^16.4.1", - "ethers": "^5.7.2", - "sha3": "^2.1.4", - "winston": "^3.13.0", - "yargs": "^17.7.2" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@wormhole-foundation/sdk": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk/-/sdk-0.6.8.tgz", - "integrity": "sha512-ZWhm+Mm+jlgK8WGHD2Xpu8h4D2QSueFBk64SsHePWLn3VNy1Nuq1Lm8A6WcHZN2k1AZgITTgQEliEypt6GR4rg==", + "node_modules/@jest/transform/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==", + "dev": true, "dependencies": { - "@wormhole-foundation/sdk-algorand": "0.6.8", - "@wormhole-foundation/sdk-algorand-core": "0.6.8", - "@wormhole-foundation/sdk-algorand-tokenbridge": "0.6.8", - "@wormhole-foundation/sdk-aptos": "0.6.8", - "@wormhole-foundation/sdk-aptos-core": "0.6.8", - "@wormhole-foundation/sdk-aptos-tokenbridge": "0.6.8", - "@wormhole-foundation/sdk-base": "0.6.8", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm-core": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm-ibc": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm-tokenbridge": "0.6.8", - "@wormhole-foundation/sdk-definitions": "0.6.8", - "@wormhole-foundation/sdk-evm": "0.6.8", - "@wormhole-foundation/sdk-evm-cctp": "0.6.8", - "@wormhole-foundation/sdk-evm-core": "0.6.8", - "@wormhole-foundation/sdk-evm-portico": "0.6.8", - "@wormhole-foundation/sdk-evm-tokenbridge": "0.6.8", - "@wormhole-foundation/sdk-solana": "0.6.8", - "@wormhole-foundation/sdk-solana-cctp": "0.6.8", - "@wormhole-foundation/sdk-solana-core": "0.6.8", - "@wormhole-foundation/sdk-solana-tokenbridge": "0.6.8", - "@wormhole-foundation/sdk-sui": "0.6.8", - "@wormhole-foundation/sdk-sui-core": "0.6.8", - "@wormhole-foundation/sdk-sui-tokenbridge": "0.6.8" + "color-name": "~1.1.4" }, "engines": { - "node": ">=16" + "node": ">=7.0.0" } }, - "node_modules/@wormhole-foundation/sdk-algorand": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand/-/sdk-algorand-0.6.8.tgz", - "integrity": "sha512-yyIzFCgXRRDKZiIypMhtvsu4Phst3kRdoAW7hZQWUQZTwsIRh89bwRh3mAtogOmRHfToLgnzwihXlIEe0zq5pg==", + "node_modules/@jest/transform/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==", + "dev": true + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, "dependencies": { - "@wormhole-foundation/sdk-connect": "0.6.8", - "algosdk": "2.7.0" + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, "engines": { - "node": ">=16" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@wormhole-foundation/sdk-algorand-core": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-core/-/sdk-algorand-core-0.6.8.tgz", - "integrity": "sha512-3Nv9jq0ndONCDvqqUq+5Z5IvxucP2vcmah9gVGz5OEcxtBfdeiW88qbmNk5uv1WT/CwLD+rDMCR8oSWKGX2cLA==", + "node_modules/@jest/types/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==", + "dev": true, "dependencies": { - "@wormhole-foundation/sdk-algorand": "0.6.8", - "@wormhole-foundation/sdk-connect": "0.6.8" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=16" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@wormhole-foundation/sdk-algorand-tokenbridge": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-tokenbridge/-/sdk-algorand-tokenbridge-0.6.8.tgz", - "integrity": "sha512-TFebQFpIqB6ONT3ZGQs2YGL9bTtSHaY3ha9L3FMI64ylv8bqe71WdX4GNxQEFwra6Xd6M5BIteTTZsAZXzeG/Q==", + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, "dependencies": { - "@wormhole-foundation/sdk-algorand": "0.6.8", - "@wormhole-foundation/sdk-algorand-core": "0.6.8", - "@wormhole-foundation/sdk-connect": "0.6.8" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=16" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@wormhole-foundation/sdk-aptos": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos/-/sdk-aptos-0.6.8.tgz", - "integrity": "sha512-TDjOk3GMZUV2YPiaLqLh9atM52ArW8EVjdCzQH2IlX5OHTwL0+9p8Navz568OK0y3CaDabBw+GDWordcSVNZ9w==", + "node_modules/@jest/types/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==", + "dev": true, "dependencies": { - "@wormhole-foundation/sdk-connect": "0.6.8", - "aptos": "1.21.0" + "color-name": "~1.1.4" }, "engines": { - "node": ">=16" + "node": ">=7.0.0" } }, - "node_modules/@wormhole-foundation/sdk-aptos-core": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-core/-/sdk-aptos-core-0.6.8.tgz", - "integrity": "sha512-J9xWSUvdQEFlbcSSH7n5Pn5QnaKmEujVHFvdY8yMZKwdYfJ1ad7EAogSTo+7r2tO9YWMcIlGeJv21lyebDE3JA==", + "node_modules/@jest/types/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==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dependencies": { - "@wormhole-foundation/sdk-aptos": "0.6.8", - "@wormhole-foundation/sdk-connect": "0.6.8" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=16" + "node": ">=6.0.0" } }, - "node_modules/@wormhole-foundation/sdk-aptos-tokenbridge": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-tokenbridge/-/sdk-aptos-tokenbridge-0.6.8.tgz", - "integrity": "sha512-SGkMSCipcI4E1z4WSNELx3+8YHWO2rWJOCBqn/HM8WUZw/MaqhR7iKmefW55Urf7OyGSv+OPV3EhILVylzA2SQ==", - "dependencies": { - "@wormhole-foundation/sdk-aptos": "0.6.8", - "@wormhole-foundation/sdk-connect": "0.6.8" - }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "engines": { - "node": ">=16" + "node": ">=6.0.0" } }, - "node_modules/@wormhole-foundation/sdk-aptos/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=6.0.0" } }, - "node_modules/@wormhole-foundation/sdk-aptos/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==", + "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.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dependencies": { - "@noble/hashes": "~1.3.0", - "@scure/base": "~1.1.0" - }, + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", "funding": { - "url": "https://paulmillr.com/funding/" + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/@wormhole-foundation/sdk-aptos/node_modules/aptos": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/aptos/-/aptos-1.21.0.tgz", - "integrity": "sha512-PRKjoFgL8tVEc9+oS7eJUv8GNxx8n3+0byH2+m7CP3raYOD6yFKOecuwjVMIJmgfpjp6xH0P0HDMGZAXmSyU0Q==", + "node_modules/@jup-ag/api": { + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/@jup-ag/api/-/api-6.0.22.tgz", + "integrity": "sha512-15r5vmY6CZ1VreDao+Y7lQ3gugAuXNH+QfQ76PcMsx+GfqgWLgzINzBZVJFN9Y9B+dwo2EVHlsWNqSH7HaC3jw==" + }, + "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==", "dependencies": { - "@aptos-labs/aptos-client": "^0.1.0", - "@noble/hashes": "1.3.3", - "@scure/bip39": "1.2.1", - "eventemitter3": "^5.0.1", - "form-data": "4.0.0", - "tweetnacl": "1.0.3" + "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": ">=11.0.0" + "node": ">=12.0.0" } }, - "node_modules/@wormhole-foundation/sdk-aptos/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" - }, - "node_modules/@wormhole-foundation/sdk-base": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.6.8.tgz", - "integrity": "sha512-8F6B9I60SEI2lQDAoPB6bB6NWLFso/hghfD/Zfxrrgu+LumwKIejgvsiOudVRjL2nvqUJJ/lIodgSBckpPW8Kg==", + "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==", "dependencies": { - "@scure/base": "^1.1.3" + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-connect": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.6.8.tgz", - "integrity": "sha512-AqMg2L2oXj8fHutuXgQVaQ6Dr5XXxoOBucxA2tt+m/iXa1Xy59pY2zJYmLH2RlPFgLAikMUtq72cVwKz/SPSxQ==", + "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==" + }, + "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==", "dependencies": { - "@wormhole-foundation/sdk-base": "0.6.8", - "@wormhole-foundation/sdk-definitions": "0.6.8", - "axios": "^1.4.0" - }, - "engines": { - "node": ">=16" + "@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/@wormhole-foundation/sdk-connect/node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "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": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "bs58": "^5.0.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm/-/sdk-cosmwasm-0.6.8.tgz", - "integrity": "sha512-FKna+WYOhUSrocKXoSOYmEXJhwjeGDXHz1ZdHvprKauocpku3VNJXB3kEPwMywfZsu52d1ca9v79vSsKM0iRBw==", + "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": { - "@cosmjs/cosmwasm-stargate": "^0.32.0", - "@cosmjs/proto-signing": "^0.32.0", - "@cosmjs/stargate": "^0.32.0", - "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.6.8", - "cosmjs-types": "^0.9.0" - }, - "engines": { - "node": ">=16" + "base-x": "^4.0.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-core/-/sdk-cosmwasm-core-0.6.8.tgz", - "integrity": "sha512-BprNt10TeZq1cV9Y3W2zzl2Nuioh4UAsU12lBczrw5j0d/zJ+ImDQL6R2d8FhV2iI0S+SEMbuhUYBOvnUgC2bg==", + "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": { - "@cosmjs/cosmwasm-stargate": "^0.32.0", - "@cosmjs/stargate": "^0.32.0", - "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm": "0.6.8" + "@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/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/amino": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", - "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", - "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3" - } - }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/crypto": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", - "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", - "dependencies": { - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers-sumo": "^0.7.11" - } - }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/encoding": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", - "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", - "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" + "node_modules/@mysten/sui.js/node_modules/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "engines": { + "node": ">=14.0.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/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==" - }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/json-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", - "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", + "node_modules/@noble/curves": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", + "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", "dependencies": { - "@cosmjs/stream": "^0.32.3", - "xstream": "^11.14.0" + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/math": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", - "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", - "dependencies": { - "bn.js": "^5.2.0" + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/proto-signing": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", - "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", + "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==", "dependencies": { - "@cosmjs/amino": "^0.32.3", - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0" + "@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/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/socket": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", - "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", - "dependencies": { - "@cosmjs/stream": "^0.32.3", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" + "node_modules/@project-serum/anchor/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/stargate": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", - "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", + "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==", "dependencies": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/proto-signing": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/tendermint-rpc": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0", - "xstream": "^11.14.0" + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.2.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/stream": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", - "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", - "dependencies": { - "xstream": "^11.14.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==" }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/tendermint-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", - "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", - "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/json-rpc": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/socket": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "axios": "^1.6.0", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } + "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==" }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@cosmjs/utils": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", - "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/core-proto-ts": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz", - "integrity": "sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==", - "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" - } + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/indexer-proto-ts": { - "version": "1.11.36", - "resolved": "https://registry.npmjs.org/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz", - "integrity": "sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew==", + "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==", "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/mito-proto-ts": { - "version": "1.0.62", - "resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz", - "integrity": "sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA==", - "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.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==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "node_modules/@scure/base": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", + "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/networks": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", - "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", - "hasInstallScript": true, + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/sdk-ts": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz", - "integrity": "sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg==", - "hasInstallScript": true, + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dependencies": { - "@apollo/client": "^3.5.8", - "@cosmjs/amino": "^0.32.2", - "@cosmjs/proto-signing": "^0.32.2", - "@cosmjs/stargate": "^0.32.2", - "@ensdomains/ens-validation": "^0.1.0", - "@ensdomains/eth-ens-namehash": "^2.0.15", - "@ethersproject/bytes": "^5.7.0", - "@injectivelabs/core-proto-ts": "^0.0.21", - "@injectivelabs/dmm-proto-ts": "1.0.19", - "@injectivelabs/exceptions": "^1.14.6", - "@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.11.36", - "@injectivelabs/mito-proto-ts": "1.0.62", - "@injectivelabs/networks": "^1.14.6", - "@injectivelabs/test-utils": "^1.14.3", - "@injectivelabs/token-metadata": "^1.14.7", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "@metamask/eth-sig-util": "^4.0.0", - "axios": "^0.27.2", - "bech32": "^2.0.0", - "bip39": "^3.0.4", - "cosmjs-types": "^0.9.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", - "secp256k1": "^4.0.3", - "shx": "^0.3.2", - "snakecase-keys": "^5.4.1" + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/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==", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/@injectivelabs/utils": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", - "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", - "hasInstallScript": true, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "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" + "type-detect": "4.0.8" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/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==", + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, "dependencies": { - "follow-redirects": "^1.14.0" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "node_modules/@solana/buffer-layout": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", + "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "buffer": "~6.0.3" + }, + "engines": { + "node": ">=5.10" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core/node_modules/cosmjs-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", - "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" - }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-ibc/-/sdk-cosmwasm-ibc-0.6.8.tgz", - "integrity": "sha512-H6Z//N2HghUmBcbEcJAZ0+bUPV2OWsFWao+Cta8g5ucCS9w7v6pLIUYrfn6TcFFgZpwihGt4pokDniFoOJ8/Rg==", + "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==", "dependencies": { - "@cosmjs/cosmwasm-stargate": "^0.32.0", - "@cosmjs/stargate": "^0.32.0", - "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm-core": "0.6.8", - "cosmjs-types": "^0.9.0" + "@solana/buffer-layout": "^4.0.0", + "@solana/web3.js": "^1.32.0", + "bigint-buffer": "^1.1.5", + "bignumber.js": "^9.0.1" }, "engines": { - "node": ">=16" + "node": ">= 10" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/amino": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", - "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", + "node_modules/@solana/codecs": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.2.tgz", + "integrity": "sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==", "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-data-structures": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/codecs-strings": "2.0.0-preview.2", + "@solana/options": "2.0.0-preview.2" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/crypto": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", - "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", + "node_modules/@solana/codecs-core": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz", + "integrity": "sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==", "dependencies": { - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers-sumo": "^0.7.11" + "@solana/errors": "2.0.0-preview.2" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/encoding": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", - "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", + "node_modules/@solana/codecs-data-structures": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz", + "integrity": "sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==", "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/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==" - }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/json-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", - "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", + "node_modules/@solana/codecs-numbers": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz", + "integrity": "sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==", "dependencies": { - "@cosmjs/stream": "^0.32.3", - "xstream": "^11.14.0" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/math": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", - "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", + "node_modules/@solana/codecs-strings": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz", + "integrity": "sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==", "dependencies": { - "bn.js": "^5.2.0" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/proto-signing": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", - "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", + "node_modules/@solana/errors": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.2.tgz", + "integrity": "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==", "dependencies": { - "@cosmjs/amino": "^0.32.3", - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0" + "chalk": "^5.3.0", + "commander": "^12.0.0" + }, + "bin": { + "errors": "bin/cli.js" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/socket": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", - "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", + "node_modules/@solana/options": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz", + "integrity": "sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==", "dependencies": { - "@cosmjs/stream": "^0.32.3", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/stargate": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", - "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", + "node_modules/@solana/spl-token": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", + "integrity": "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA==", "dependencies": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/proto-signing": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/tendermint-rpc": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0", - "xstream": "^11.14.0" + "@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/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/stream": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", - "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", + "node_modules/@solana/spl-token-group": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.4.tgz", + "integrity": "sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==", "dependencies": { - "xstream": "^11.14.0" + "@solana/codecs": "2.0.0-preview.2", + "@solana/spl-type-length-value": "0.1.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/tendermint-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", - "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", + "node_modules/@solana/spl-token-metadata": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz", + "integrity": "sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==", "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/json-rpc": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/socket": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "axios": "^1.6.0", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" + "@solana/codecs": "2.0.0-preview.2", + "@solana/spl-type-length-value": "0.1.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@cosmjs/utils": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", - "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" - }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/core-proto-ts": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz", - "integrity": "sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==", + "node_modules/@solana/spl-type-length-value": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz", + "integrity": "sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==", "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/indexer-proto-ts": { - "version": "1.11.36", - "resolved": "https://registry.npmjs.org/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz", - "integrity": "sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew==", + "node_modules/@solana/web3.js": { + "version": "1.91.7", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", + "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "@babel/runtime": "^7.23.4", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.3", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.0", + "node-fetch": "^2.7.0", + "rpc-websockets": "^7.5.1", + "superstruct": "^0.14.2" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/mito-proto-ts": { - "version": "1.0.62", - "resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz", - "integrity": "sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA==", + "node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + }, + "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/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "defer-to-connect": "^2.0.0" + }, + "engines": { + "node": ">=10" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/networks": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", - "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", - "hasInstallScript": true, + "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==", "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/sdk-ts": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz", - "integrity": "sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg==", - "hasInstallScript": true, + "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": { - "@apollo/client": "^3.5.8", - "@cosmjs/amino": "^0.32.2", - "@cosmjs/proto-signing": "^0.32.2", - "@cosmjs/stargate": "^0.32.2", - "@ensdomains/ens-validation": "^0.1.0", - "@ensdomains/eth-ens-namehash": "^2.0.15", - "@ethersproject/bytes": "^5.7.0", - "@injectivelabs/core-proto-ts": "^0.0.21", - "@injectivelabs/dmm-proto-ts": "1.0.19", - "@injectivelabs/exceptions": "^1.14.6", - "@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.11.36", - "@injectivelabs/mito-proto-ts": "1.0.62", - "@injectivelabs/networks": "^1.14.6", - "@injectivelabs/test-utils": "^1.14.3", - "@injectivelabs/token-metadata": "^1.14.7", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "@metamask/eth-sig-util": "^4.0.0", + "@classic-terra/terra.proto": "^1.1.0", + "@terra-money/terra.proto": "^2.1.0", "axios": "^0.27.2", "bech32": "^2.0.0", - "bip39": "^3.0.4", - "cosmjs-types": "^0.9.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", - "secp256k1": "^4.0.3", - "shx": "^0.3.2", - "snakecase-keys": "^5.4.1" + "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/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/sdk-ts/node_modules/axios": { + "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==", @@ -5112,596 +4194,669 @@ "form-data": "^4.0.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/@injectivelabs/utils": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", - "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", - "hasInstallScript": true, - "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "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/@terra-money/terra.js/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/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==", + "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==", "dependencies": { - "follow-redirects": "^1.14.0" + "@improbable-eng/grpc-web": "^0.14.1", + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "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==", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "browser-headers": "^0.4.1" + }, + "peerDependencies": { + "google-protobuf": "^3.14.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc/node_modules/cosmjs-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", - "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-tokenbridge/-/sdk-cosmwasm-tokenbridge-0.6.8.tgz", - "integrity": "sha512-NpCWSYttzdudW4r76hv+42Ym5CzIl6oBTTpkaBBkNFTPjzVkCJap+8X3oV9YlLCFC0gh9C+5UEtS2bvU5HMm6w==", + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, "dependencies": { - "@cosmjs/cosmwasm-stargate": "^0.32.0", - "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm": "0.6.8" - }, - "engines": { - "node": ">=16" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/amino": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", - "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3" + "@babel/types": "^7.0.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/crypto": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", - "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, "dependencies": { - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers-sumo": "^0.7.11" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/encoding": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", - "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" + "@babel/types": "^7.20.7" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/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==" + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "dependencies": { + "@types/node": "*" + } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/json-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", - "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", + "node_modules/@types/cacheable-request": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", + "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", "dependencies": { - "@cosmjs/stream": "^0.32.3", - "xstream": "^11.14.0" + "@types/http-cache-semantics": "*", + "@types/keyv": "^3.1.4", + "@types/node": "*", + "@types/responselike": "^1.0.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/math": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", - "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", + "node_modules/@types/chai": { + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", "dependencies": { - "bn.js": "^5.2.0" + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/proto-signing": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", - "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "peer": true + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, "dependencies": { - "@cosmjs/amino": "^0.32.3", - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0" + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/socket": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", - "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", + "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, "dependencies": { - "@cosmjs/stream": "^0.32.3", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/stargate": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", - "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, "dependencies": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/proto-signing": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/tendermint-rpc": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0", - "xstream": "^11.14.0" + "@types/istanbul-lib-report": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/stream": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", - "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, "dependencies": { - "xstream": "^11.14.0" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/tendermint-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", - "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", + "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==", + "dev": true, + "optional": true + }, + "node_modules/@types/keyv": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", + "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/json-rpc": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/socket": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "axios": "^1.6.0", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/tendermint-rpc/node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "node_modules/@types/lodash": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", + "integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==" + }, + "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==", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "@types/lodash": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@cosmjs/utils": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", - "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" + "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==" }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/core-proto-ts": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz", - "integrity": "sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==", + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "undici-types": "~5.26.4" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/indexer-proto-ts": { - "version": "1.11.36", - "resolved": "https://registry.npmjs.org/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz", - "integrity": "sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew==", + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "@types/node": "*", + "form-data": "^4.0.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/mito-proto-ts": { - "version": "1.0.62", - "resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz", - "integrity": "sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA==", + "node_modules/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/networks": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", - "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", - "hasInstallScript": true, + "node_modules/@types/responselike": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", + "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/sdk-ts": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz", - "integrity": "sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg==", - "hasInstallScript": true, + "node_modules/@types/secp256k1": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", "dependencies": { - "@apollo/client": "^3.5.8", - "@cosmjs/amino": "^0.32.2", - "@cosmjs/proto-signing": "^0.32.2", - "@cosmjs/stargate": "^0.32.2", - "@ensdomains/ens-validation": "^0.1.0", - "@ensdomains/eth-ens-namehash": "^2.0.15", - "@ethersproject/bytes": "^5.7.0", - "@injectivelabs/core-proto-ts": "^0.0.21", - "@injectivelabs/dmm-proto-ts": "1.0.19", - "@injectivelabs/exceptions": "^1.14.6", - "@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.11.36", - "@injectivelabs/mito-proto-ts": "1.0.62", - "@injectivelabs/networks": "^1.14.6", - "@injectivelabs/test-utils": "^1.14.3", - "@injectivelabs/token-metadata": "^1.14.7", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "@metamask/eth-sig-util": "^4.0.0", - "axios": "^0.27.2", - "bech32": "^2.0.0", - "bip39": "^3.0.4", - "cosmjs-types": "^0.9.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", - "secp256k1": "^4.0.3", - "shx": "^0.3.2", - "snakecase-keys": "^5.4.1" + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", + "dependencies": { + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/@injectivelabs/utils": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", - "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", - "hasInstallScript": true, + "node_modules/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "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" + "@types/yargs-parser": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/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==", + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/@volar/language-core": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.4.tgz", + "integrity": "sha512-7As47GndxGxsqqYnbreLrfB5NDUeQioPM2LJKUuB4/34c0NpEJ2byVl3c9KYdjIdiEstWZ9JLtLKNTaPWb5jtA==", "dependencies": { - "follow-redirects": "^1.14.0" + "@volar/source-map": "2.2.4" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/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==", + "node_modules/@volar/source-map": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.4.tgz", + "integrity": "sha512-m92FLpR9vB1YEZfiZ+bfgpLrToL/DNkOrorWVep3pffHrwwI4Tx2oIQN+sqHJfKkiT5N3J1owC+8crhAEinfjg==", "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "muggle-string": "^0.4.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge/node_modules/cosmjs-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", - "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" + "node_modules/@vue/compiler-core": { + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", + "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", + "dependencies": { + "@babel/parser": "^7.24.4", + "@vue/shared": "3.4.27", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/amino": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", - "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", + "node_modules/@vue/compiler-dom": { + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", + "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3" + "@vue/compiler-core": "3.4.27", + "@vue/shared": "3.4.27" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/crypto": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", - "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", + "node_modules/@vue/language-core": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.18.tgz", + "integrity": "sha512-MwKRQAReHN1z7P3/8k/ISC5MjDRjHxGyitn50jWrMmzW9FNySG/1NxMPgAHcVJ4zApJUolS9TexYzT4I6BKL5w==", "dependencies": { - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers-sumo": "^0.7.11" + "@volar/language-core": "~2.2.4", + "@vue/compiler-dom": "^3.4.0", + "@vue/shared": "^3.4.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/encoding": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", - "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", + "node_modules/@vue/language-core/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==", "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" + "balanced-match": "^1.0.0" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/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==" + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/json-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", - "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", + "node_modules/@vue/shared": { + "version": "3.4.27", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", + "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-definitions": { + "version": "0.0.1", + "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", + "integrity": "sha512-xV2Qgg4msA7tGGlDbi0Sx81eCylkEO2Q4211JcU7iPKhwllS1hc2AArn3vYq3/z7L9H0jN9Rb4Xg+FxqS/oDNw==", "dependencies": { - "@cosmjs/stream": "^0.32.3", - "xstream": "^11.14.0" + "@wormhole-foundation/sdk": "^0.6.8" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/math": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", - "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", + "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { + "version": "0.0.1", + "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", + "integrity": "sha512-v+li6WThalsf59JTJsYmJ9oFT3SuzGU70WraPoVccdTgqMnIL7229mE+/J35S1JKK66OMkLp2rXdWbDnUtkYOw==", "dependencies": { - "bn.js": "^5.2.0" + "@certusone/wormhole-spydk": "^0.0.1", + "@coral-xyz/anchor": "^0.30.0", + "@solana/spl-token": "^0.4.6", + "@solana/spl-token-group": "^0.0.4", + "@solana/spl-token-metadata": "^0.1.4", + "@solana/web3.js": "^1.91.7", + "@types/node-fetch": "^2.6.11", + "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", + "@wormhole-foundation/sdk": "^0.6.8", + "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", + "dotenv": "^16.4.1", + "ethers": "^5.7.2", + "sha3": "^2.1.4", + "winston": "^3.13.0", + "yargs": "^17.7.2" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/proto-signing": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", - "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@coral-xyz/anchor": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.0.tgz", + "integrity": "sha512-qreDh5ztiRHVnCbJ+RS70NJ6aSTPBYDAgFeQ7Z5QvaT5DcDIhNyt4onOciVz2ieIE1XWePOJDDu9SbNvPGBkvQ==", "dependencies": { - "@cosmjs/amino": "^0.32.3", - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0" + "@coral-xyz/borsh": "^0.30.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/socket": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", - "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@coral-xyz/borsh": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.0.tgz", + "integrity": "sha512-OrcV+7N10cChhgDRUxM4iEIuwxUHHs52XD85R8cFCUqE0vbLYrcoPPPs+VF6kZ9DhdJGVW2I6DHJOp5TykyZog==", "dependencies": { - "@cosmjs/stream": "^0.32.3", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@solana/spl-token": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz", + "integrity": "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==", + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "@solana/spl-token-group": "^0.0.4", + "@solana/spl-token-metadata": "^0.1.4", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" + } + }, + "node_modules/@wormhole-foundation/sdk": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk/-/sdk-0.6.8.tgz", + "integrity": "sha512-ZWhm+Mm+jlgK8WGHD2Xpu8h4D2QSueFBk64SsHePWLn3VNy1Nuq1Lm8A6WcHZN2k1AZgITTgQEliEypt6GR4rg==", + "dependencies": { + "@wormhole-foundation/sdk-algorand": "0.6.8", + "@wormhole-foundation/sdk-algorand-core": "0.6.8", + "@wormhole-foundation/sdk-algorand-tokenbridge": "0.6.8", + "@wormhole-foundation/sdk-aptos": "0.6.8", + "@wormhole-foundation/sdk-aptos-core": "0.6.8", + "@wormhole-foundation/sdk-aptos-tokenbridge": "0.6.8", + "@wormhole-foundation/sdk-base": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm-core": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm-ibc": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm-tokenbridge": "0.6.8", + "@wormhole-foundation/sdk-definitions": "0.6.8", + "@wormhole-foundation/sdk-evm": "0.6.8", + "@wormhole-foundation/sdk-evm-cctp": "0.6.8", + "@wormhole-foundation/sdk-evm-core": "0.6.8", + "@wormhole-foundation/sdk-evm-portico": "0.6.8", + "@wormhole-foundation/sdk-evm-tokenbridge": "0.6.8", + "@wormhole-foundation/sdk-solana": "0.6.8", + "@wormhole-foundation/sdk-solana-cctp": "0.6.8", + "@wormhole-foundation/sdk-solana-core": "0.6.8", + "@wormhole-foundation/sdk-solana-tokenbridge": "0.6.8", + "@wormhole-foundation/sdk-sui": "0.6.8", + "@wormhole-foundation/sdk-sui-core": "0.6.8", + "@wormhole-foundation/sdk-sui-tokenbridge": "0.6.8" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/stargate": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", - "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", + "node_modules/@wormhole-foundation/sdk-algorand": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand/-/sdk-algorand-0.6.8.tgz", + "integrity": "sha512-yyIzFCgXRRDKZiIypMhtvsu4Phst3kRdoAW7hZQWUQZTwsIRh89bwRh3mAtogOmRHfToLgnzwihXlIEe0zq5pg==", "dependencies": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/proto-signing": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/tendermint-rpc": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0", - "xstream": "^11.14.0" + "@wormhole-foundation/sdk-connect": "0.6.8", + "algosdk": "2.7.0" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/stream": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", - "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", + "node_modules/@wormhole-foundation/sdk-algorand-core": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-core/-/sdk-algorand-core-0.6.8.tgz", + "integrity": "sha512-3Nv9jq0ndONCDvqqUq+5Z5IvxucP2vcmah9gVGz5OEcxtBfdeiW88qbmNk5uv1WT/CwLD+rDMCR8oSWKGX2cLA==", "dependencies": { - "xstream": "^11.14.0" + "@wormhole-foundation/sdk-algorand": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.6.8" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/tendermint-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", - "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", + "node_modules/@wormhole-foundation/sdk-algorand-tokenbridge": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-tokenbridge/-/sdk-algorand-tokenbridge-0.6.8.tgz", + "integrity": "sha512-TFebQFpIqB6ONT3ZGQs2YGL9bTtSHaY3ha9L3FMI64ylv8bqe71WdX4GNxQEFwra6Xd6M5BIteTTZsAZXzeG/Q==", "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/json-rpc": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/socket": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "axios": "^1.6.0", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" + "@wormhole-foundation/sdk-algorand": "0.6.8", + "@wormhole-foundation/sdk-algorand-core": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.6.8" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@cosmjs/utils": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", - "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" - }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/core-proto-ts": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz", - "integrity": "sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==", + "node_modules/@wormhole-foundation/sdk-aptos": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos/-/sdk-aptos-0.6.8.tgz", + "integrity": "sha512-TDjOk3GMZUV2YPiaLqLh9atM52ArW8EVjdCzQH2IlX5OHTwL0+9p8Navz568OK0y3CaDabBw+GDWordcSVNZ9w==", "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "@wormhole-foundation/sdk-connect": "0.6.8", + "aptos": "1.21.0" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/indexer-proto-ts": { - "version": "1.11.36", - "resolved": "https://registry.npmjs.org/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz", - "integrity": "sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew==", + "node_modules/@wormhole-foundation/sdk-aptos-core": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-core/-/sdk-aptos-core-0.6.8.tgz", + "integrity": "sha512-J9xWSUvdQEFlbcSSH7n5Pn5QnaKmEujVHFvdY8yMZKwdYfJ1ad7EAogSTo+7r2tO9YWMcIlGeJv21lyebDE3JA==", "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "@wormhole-foundation/sdk-aptos": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.6.8" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/mito-proto-ts": { - "version": "1.0.62", - "resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz", - "integrity": "sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA==", + "node_modules/@wormhole-foundation/sdk-aptos-tokenbridge": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-tokenbridge/-/sdk-aptos-tokenbridge-0.6.8.tgz", + "integrity": "sha512-SGkMSCipcI4E1z4WSNELx3+8YHWO2rWJOCBqn/HM8WUZw/MaqhR7iKmefW55Urf7OyGSv+OPV3EhILVylzA2SQ==", "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "@wormhole-foundation/sdk-aptos": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.6.8" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/networks": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", - "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", - "hasInstallScript": true, + "node_modules/@wormhole-foundation/sdk-base": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.6.8.tgz", + "integrity": "sha512-8F6B9I60SEI2lQDAoPB6bB6NWLFso/hghfD/Zfxrrgu+LumwKIejgvsiOudVRjL2nvqUJJ/lIodgSBckpPW8Kg==", "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" + "@scure/base": "^1.1.3" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/sdk-ts": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz", - "integrity": "sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg==", - "hasInstallScript": true, + "node_modules/@wormhole-foundation/sdk-connect": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.6.8.tgz", + "integrity": "sha512-AqMg2L2oXj8fHutuXgQVaQ6Dr5XXxoOBucxA2tt+m/iXa1Xy59pY2zJYmLH2RlPFgLAikMUtq72cVwKz/SPSxQ==", "dependencies": { - "@apollo/client": "^3.5.8", - "@cosmjs/amino": "^0.32.2", - "@cosmjs/proto-signing": "^0.32.2", - "@cosmjs/stargate": "^0.32.2", - "@ensdomains/ens-validation": "^0.1.0", - "@ensdomains/eth-ens-namehash": "^2.0.15", - "@ethersproject/bytes": "^5.7.0", - "@injectivelabs/core-proto-ts": "^0.0.21", - "@injectivelabs/dmm-proto-ts": "1.0.19", - "@injectivelabs/exceptions": "^1.14.6", - "@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.11.36", - "@injectivelabs/mito-proto-ts": "1.0.62", - "@injectivelabs/networks": "^1.14.6", - "@injectivelabs/test-utils": "^1.14.3", - "@injectivelabs/token-metadata": "^1.14.7", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "@metamask/eth-sig-util": "^4.0.0", - "axios": "^0.27.2", - "bech32": "^2.0.0", - "bip39": "^3.0.4", - "cosmjs-types": "^0.9.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", - "secp256k1": "^4.0.3", - "shx": "^0.3.2", - "snakecase-keys": "^5.4.1" + "@wormhole-foundation/sdk-base": "0.6.8", + "@wormhole-foundation/sdk-definitions": "0.6.8", + "axios": "^1.4.0" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/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==", + "node_modules/@wormhole-foundation/sdk-cosmwasm": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm/-/sdk-cosmwasm-0.6.8.tgz", + "integrity": "sha512-FKna+WYOhUSrocKXoSOYmEXJhwjeGDXHz1ZdHvprKauocpku3VNJXB3kEPwMywfZsu52d1ca9v79vSsKM0iRBw==", "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "@cosmjs/cosmwasm-stargate": "^0.32.0", + "@cosmjs/proto-signing": "^0.32.0", + "@cosmjs/stargate": "^0.32.0", + "@injectivelabs/sdk-ts": "^1.14.4", + "@wormhole-foundation/sdk-connect": "0.6.8", + "cosmjs-types": "^0.9.0" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/@injectivelabs/utils": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", - "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", - "hasInstallScript": true, + "node_modules/@wormhole-foundation/sdk-cosmwasm-core": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-core/-/sdk-cosmwasm-core-0.6.8.tgz", + "integrity": "sha512-BprNt10TeZq1cV9Y3W2zzl2Nuioh4UAsU12lBczrw5j0d/zJ+ImDQL6R2d8FhV2iI0S+SEMbuhUYBOvnUgC2bg==", "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "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" + "@cosmjs/cosmwasm-stargate": "^0.32.0", + "@cosmjs/stargate": "^0.32.0", + "@injectivelabs/sdk-ts": "^1.14.4", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm": "0.6.8" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/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==", + "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-ibc/-/sdk-cosmwasm-ibc-0.6.8.tgz", + "integrity": "sha512-H6Z//N2HghUmBcbEcJAZ0+bUPV2OWsFWao+Cta8g5ucCS9w7v6pLIUYrfn6TcFFgZpwihGt4pokDniFoOJ8/Rg==", "dependencies": { - "follow-redirects": "^1.14.0" + "@cosmjs/cosmwasm-stargate": "^0.32.0", + "@cosmjs/stargate": "^0.32.0", + "@injectivelabs/sdk-ts": "^1.14.4", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm-core": "0.6.8", + "cosmjs-types": "^0.9.0" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-tokenbridge/-/sdk-cosmwasm-tokenbridge-0.6.8.tgz", + "integrity": "sha512-NpCWSYttzdudW4r76hv+42Ym5CzIl6oBTTpkaBBkNFTPjzVkCJap+8X3oV9YlLCFC0gh9C+5UEtS2bvU5HMm6w==", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "@cosmjs/cosmwasm-stargate": "^0.32.0", + "@injectivelabs/sdk-ts": "^1.14.4", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-cosmwasm": "0.6.8" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm/node_modules/cosmjs-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", - "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" - }, "node_modules/@wormhole-foundation/sdk-definitions": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.6.8.tgz", @@ -6152,426 +5307,114 @@ "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], - "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "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/@wormhole-foundation/sdk-solana": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.6.8.tgz", - "integrity": "sha512-spiBcyukLtoo+kcDLwcEmIH2nb+3VFRKY+mt1UC4uS7DCLkrRbJnKIfdQNEI9MgZSqXMwvwHQMqrIuXSOv7Kjw==", - "dependencies": { - "@coral-xyz/anchor": "0.29.0", - "@coral-xyz/borsh": "0.29.0", - "@solana/spl-token": "0.3.9", - "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.6.8" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/sdk-solana-cctp": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-cctp/-/sdk-solana-cctp-0.6.8.tgz", - "integrity": "sha512-QiA2Ad4/ui34f8XcSohCjQEzNVtSaSN8bIDLS4DwPtBvzwJyMuCu1vYzaR4fCUPjPRB8Hbt9trFPKBYCg9zyKQ==", - "dependencies": { - "@coral-xyz/anchor": "0.29.0", - "@solana/spl-token": "0.3.9", - "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-solana": "0.6.8" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/sdk-solana-cctp/node_modules/@coral-xyz/anchor": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", - "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", - "dependencies": { - "@coral-xyz/borsh": "^0.29.0", - "@noble/hashes": "^1.3.1", - "@solana/web3.js": "^1.68.0", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^6.3.0", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "superstruct": "^0.15.4", - "toml": "^3.0.0" - }, - "engines": { - "node": ">=11" - } - }, - "node_modules/@wormhole-foundation/sdk-solana-cctp/node_modules/@coral-xyz/borsh": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", - "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", - "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.68.0" - } - }, - "node_modules/@wormhole-foundation/sdk-solana-cctp/node_modules/@solana/spl-token": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", - "integrity": "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA==", - "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/@wormhole-foundation/sdk-solana-cctp/node_modules/@solana/web3.js": { - "version": "1.91.7", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", - "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", - "dependencies": { - "@babel/runtime": "^7.23.4", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.3", - "@solana/buffer-layout": "^4.0.1", - "agentkeepalive": "^4.5.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.7.0", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" - } - }, - "node_modules/@wormhole-foundation/sdk-solana-cctp/node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" - }, - "node_modules/@wormhole-foundation/sdk-solana-core": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.6.8.tgz", - "integrity": "sha512-zhsgS1JHkKKUZ/+AhMNVIyKbtO1/t4464TlnLxYEe9aTBsNAF8qj+kwaDbHuBhK17vQbiaKqOVwXbYcSnbfvFQ==", - "dependencies": { - "@coral-xyz/anchor": "0.29.0", - "@coral-xyz/borsh": "0.29.0", - "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-solana": "0.6.8" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@coral-xyz/anchor": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", - "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", - "dependencies": { - "@coral-xyz/borsh": "^0.29.0", - "@noble/hashes": "^1.3.1", - "@solana/web3.js": "^1.68.0", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^6.3.0", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "superstruct": "^0.15.4", - "toml": "^3.0.0" - }, - "engines": { - "node": ">=11" - } - }, - "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@coral-xyz/borsh": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", - "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", - "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.68.0" - } - }, - "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@solana/web3.js": { - "version": "1.91.7", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", - "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", - "dependencies": { - "@babel/runtime": "^7.23.4", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.3", - "@solana/buffer-layout": "^4.0.1", - "agentkeepalive": "^4.5.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.7.0", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" - } - }, - "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" - }, - "node_modules/@wormhole-foundation/sdk-solana-tokenbridge": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-tokenbridge/-/sdk-solana-tokenbridge-0.6.8.tgz", - "integrity": "sha512-0CrPCQvp3Txi/75RoGEZ5qe6X5zPibmKM1xCP70Yx6fIc0+0XxOnZ5pjOCeRYO84s0QGkap4G3mvAtXv/5xU8w==", - "dependencies": { - "@coral-xyz/anchor": "0.29.0", - "@solana/spl-token": "0.3.9", - "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-solana": "0.6.8", - "@wormhole-foundation/sdk-solana-core": "0.6.8" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/sdk-solana-tokenbridge/node_modules/@coral-xyz/anchor": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", - "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@coral-xyz/borsh": "^0.29.0", - "@noble/hashes": "^1.3.1", - "@solana/web3.js": "^1.68.0", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^6.3.0", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "superstruct": "^0.15.4", - "toml": "^3.0.0" + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "18.15.13", + "aes-js": "4.0.0-beta.5", + "tslib": "2.4.0", + "ws": "8.5.0" }, "engines": { - "node": ">=11" + "node": ">=14.0.0" } }, - "node_modules/@wormhole-foundation/sdk-solana-tokenbridge/node_modules/@coral-xyz/borsh": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", - "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", - "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, + "node_modules/@wormhole-foundation/sdk-evm/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/@wormhole-foundation/sdk-evm/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", "engines": { - "node": ">=10" + "node": ">=10.0.0" }, "peerDependencies": { - "@solana/web3.js": "^1.68.0" + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/@wormhole-foundation/sdk-solana-tokenbridge/node_modules/@solana/spl-token": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", - "integrity": "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA==", + "node_modules/@wormhole-foundation/sdk-solana": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.6.8.tgz", + "integrity": "sha512-spiBcyukLtoo+kcDLwcEmIH2nb+3VFRKY+mt1UC4uS7DCLkrRbJnKIfdQNEI9MgZSqXMwvwHQMqrIuXSOv7Kjw==", "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/buffer-layout-utils": "^0.2.0", - "buffer": "^6.0.3" + "@coral-xyz/anchor": "0.29.0", + "@coral-xyz/borsh": "0.29.0", + "@solana/spl-token": "0.3.9", + "@solana/web3.js": "1.91.7", + "@wormhole-foundation/sdk-connect": "0.6.8" }, "engines": { "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.47.4" - } - }, - "node_modules/@wormhole-foundation/sdk-solana-tokenbridge/node_modules/@solana/web3.js": { - "version": "1.91.7", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", - "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", - "dependencies": { - "@babel/runtime": "^7.23.4", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.3", - "@solana/buffer-layout": "^4.0.1", - "agentkeepalive": "^4.5.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.7.0", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" } }, - "node_modules/@wormhole-foundation/sdk-solana-tokenbridge/node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" - }, - "node_modules/@wormhole-foundation/sdk-solana/node_modules/@coral-xyz/anchor": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", - "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", + "node_modules/@wormhole-foundation/sdk-solana-cctp": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-cctp/-/sdk-solana-cctp-0.6.8.tgz", + "integrity": "sha512-QiA2Ad4/ui34f8XcSohCjQEzNVtSaSN8bIDLS4DwPtBvzwJyMuCu1vYzaR4fCUPjPRB8Hbt9trFPKBYCg9zyKQ==", "dependencies": { - "@coral-xyz/borsh": "^0.29.0", - "@noble/hashes": "^1.3.1", - "@solana/web3.js": "^1.68.0", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^6.3.0", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "superstruct": "^0.15.4", - "toml": "^3.0.0" + "@coral-xyz/anchor": "0.29.0", + "@solana/spl-token": "0.3.9", + "@solana/web3.js": "1.91.7", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-solana": "0.6.8" }, "engines": { - "node": ">=11" + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-solana/node_modules/@coral-xyz/borsh": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", - "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", + "node_modules/@wormhole-foundation/sdk-solana-core": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.6.8.tgz", + "integrity": "sha512-zhsgS1JHkKKUZ/+AhMNVIyKbtO1/t4464TlnLxYEe9aTBsNAF8qj+kwaDbHuBhK17vQbiaKqOVwXbYcSnbfvFQ==", "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" + "@coral-xyz/anchor": "0.29.0", + "@coral-xyz/borsh": "0.29.0", + "@solana/web3.js": "1.91.7", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-solana": "0.6.8" }, "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.68.0" + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-solana/node_modules/@solana/spl-token": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", - "integrity": "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA==", + "node_modules/@wormhole-foundation/sdk-solana-tokenbridge": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-tokenbridge/-/sdk-solana-tokenbridge-0.6.8.tgz", + "integrity": "sha512-0CrPCQvp3Txi/75RoGEZ5qe6X5zPibmKM1xCP70Yx6fIc0+0XxOnZ5pjOCeRYO84s0QGkap4G3mvAtXv/5xU8w==", "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/buffer-layout-utils": "^0.2.0", - "buffer": "^6.0.3" + "@coral-xyz/anchor": "0.29.0", + "@solana/spl-token": "0.3.9", + "@solana/web3.js": "1.91.7", + "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-solana": "0.6.8", + "@wormhole-foundation/sdk-solana-core": "0.6.8" }, "engines": { "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.47.4" - } - }, - "node_modules/@wormhole-foundation/sdk-solana/node_modules/@solana/web3.js": { - "version": "1.91.7", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", - "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", - "dependencies": { - "@babel/runtime": "^7.23.4", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.3", - "@solana/buffer-layout": "^4.0.1", - "agentkeepalive": "^4.5.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.7.0", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" } }, - "node_modules/@wormhole-foundation/sdk-solana/node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" - }, "node_modules/@wormhole-foundation/sdk-sui": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui/-/sdk-sui-0.6.8.tgz", @@ -6632,6 +5475,11 @@ "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, + "node_modules/@wormhole-foundation/sdk-sui-core/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, "node_modules/@wormhole-foundation/sdk-sui-core/node_modules/bs58": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", @@ -6697,6 +5545,11 @@ "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, + "node_modules/@wormhole-foundation/sdk-sui-tokenbridge/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, "node_modules/@wormhole-foundation/sdk-sui-tokenbridge/node_modules/bs58": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", @@ -6748,6 +5601,11 @@ "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" }, + "node_modules/@wormhole-foundation/sdk-sui/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, "node_modules/@wormhole-foundation/sdk-sui/node_modules/bs58": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", @@ -6854,11 +5712,15 @@ "follow-redirects": "^1.14.8" } }, + "node_modules/@xpla/xpla.js/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, "node_modules/acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", - "optional": true, + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "bin": { "acorn": "bin/acorn" }, @@ -6943,21 +5805,6 @@ "node": ">=11" } }, - "node_modules/anchor-0.29.0/node_modules/@coral-xyz/borsh": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", - "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", - "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.68.0" - } - }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -7016,54 +5863,48 @@ } }, "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==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/aptos/-/aptos-1.21.0.tgz", + "integrity": "sha512-PRKjoFgL8tVEc9+oS7eJUv8GNxx8n3+0byH2+m7CP3raYOD6yFKOecuwjVMIJmgfpjp6xH0P0HDMGZAXmSyU0Q==", "dependencies": { - "@noble/hashes": "1.1.3", - "@scure/bip39": "1.1.0", - "axios": "0.27.2", + "@aptos-labs/aptos-client": "^0.1.0", + "@noble/hashes": "1.3.3", + "@scure/bip39": "1.2.1", + "eventemitter3": "^5.0.1", "form-data": "4.0.0", "tweetnacl": "1.0.3" }, - "engines": { - "node": ">=11.0.0" + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/aptos/node_modules/@noble/hashes": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", + "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/aptos/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/" - } - ] - }, "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/" - } - ], + "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.1.1", + "@noble/hashes": "~1.3.0", "@scure/base": "~1.1.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "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/aptos/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" }, "node_modules/arg": { "version": "4.1.3", @@ -7117,11 +5958,13 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "0.24.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", - "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dependencies": { - "follow-redirects": "^1.14.4" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/axobject-query": { @@ -7322,9 +6165,9 @@ ] }, "node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" }, "node_modules/big-integer": { "version": "1.6.36", @@ -7641,20 +6484,6 @@ "node": ">=8" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -7676,9 +6505,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001617", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001617.tgz", - "integrity": "sha512-mLyjzNI9I+Pix8zwcrpxEbGlfqOkF9kM3ptzmKNw5tizSyYwMe+nGLTqMK9cO+0E+Bh6TsBxNAaHWEM8xwSsmA==", + "version": "1.0.30001618", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz", + "integrity": "sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==", "dev": true, "funding": [ { @@ -7718,14 +6547,14 @@ } }, "node_modules/chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.2.tgz", + "integrity": "sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw==", "dependencies": { "check-error": "^1.0.2" }, "peerDependencies": { - "chai": ">= 2.1.2 < 5" + "chai": ">= 2.1.2 < 6" } }, "node_modules/chalk": { @@ -7863,18 +6692,6 @@ "periscopic": "^3.1.0" } }, - "node_modules/code-red/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/code-red/node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -8016,40 +6833,9 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "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/cosmjs-types/node_modules/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", - "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/long": "^4.0.1", - "@types/node": ">=13.7.0", - "long": "^4.0.0" - }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" - } + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", + "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" }, "node_modules/crc-32": { "version": "1.2.2", @@ -8486,6 +7272,18 @@ "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", @@ -8507,6 +7305,12 @@ "minimalistic-crypto-utils": "^1.0.1" } }, + "node_modules/eccrypto/node_modules/nan": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", + "optional": true + }, "node_modules/eccrypto/node_modules/secp256k1": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", @@ -8528,9 +7332,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.762", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.762.tgz", - "integrity": "sha512-rrFvGweLxPwwSwJOjIopy3Vr+J3cIPtZzuc74bmlvmBIgQO3VYJDvVrlj94iKZ3ukXUH64Ex31hSfRTLqvjYJQ==", + "version": "1.4.770", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.770.tgz", + "integrity": "sha512-ONwOsDiVvV07CMsyH4+dEaZ9L79HMH/ODHnDS3GkIhgNqdDHJN2C18kFb0fBj0RXpQywsPJl6k2Pqg1IY4r1ig==", "dev": true }, "node_modules/elliptic": { @@ -8956,6 +7760,18 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -9176,12 +7992,14 @@ } }, "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -9295,13 +8113,13 @@ } }, "node_modules/gql.tada": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/gql.tada/-/gql.tada-1.7.0.tgz", - "integrity": "sha512-kOtyb949T1oqMCf3KTR9DYg0hWturvSlz0N2r2ePlAJVJ3fvuu07iP7SwSML0E8ltnSPLQDTvFBeaM8ZmJop9Q==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/gql.tada/-/gql.tada-1.7.5.tgz", + "integrity": "sha512-GepPTee+FWSVVZQ7GiJHzsGNo7gOb59kcn4mUPYLlkbpeJfOUwpuoB05ZNaXG0W4qZVPd1I7R2UgMHBjY1lGlQ==", "dependencies": { "@0no-co/graphql.web": "^1.0.5", - "@gql.tada/cli-utils": "1.3.4", - "@gql.tada/internal": "0.4.0" + "@gql.tada/cli-utils": "1.3.9", + "@gql.tada/internal": "1.0.0" }, "bin": { "gql-tada": "bin/cli.js", @@ -11948,9 +10766,9 @@ } }, "node_modules/nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", + "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==" }, "node_modules/nanoid": { "version": "3.3.1", @@ -12348,9 +11166,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -12450,9 +11268,9 @@ } }, "node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -12465,18 +11283,15 @@ "@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": "^5.0.0" + "long": "^4.0.0" }, - "engines": { - "node": ">=12.0.0" + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" } }, - "node_modules/protobufjs/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/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -13159,9 +11974,9 @@ } }, "node_modules/svelte": { - "version": "4.2.16", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.16.tgz", - "integrity": "sha512-mQwHpqHD2PmFcCyHaZ7XiTqposaLvJ75WpYcyY5/ce3qxbYtwQpZ+M7ZKP+2CG5U6kfnBZBpPLyofhlE6ROrnQ==", + "version": "4.2.17", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.17.tgz", + "integrity": "sha512-N7m1YnoXtRf5wya5Gyx3TWuTddI4nAyayyIWFojiWV5IayDYNV5i2mRp/7qNGol4DtxEYxljmrbgp1HM6hUbmQ==", "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.1", @@ -13183,18 +11998,6 @@ "node": ">=16" } }, - "node_modules/svelte/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/svelte/node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", @@ -13568,18 +12371,6 @@ } } }, - "node_modules/ts-node/node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/ts-node/node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -13637,9 +12428,9 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsx": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.9.3.tgz", - "integrity": "sha512-czVbetlILiyJZI5zGlj2kw9vFiSeyra9liPD4nG+Thh4pKTi0AmMEQ8zdV/L2xbIVKrIqif4sUNrsMAOksx9Zg==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.10.2.tgz", + "integrity": "sha512-gOfACgv1ElsIjvt7Fp0rMJKGnMGjox0JfGOfX3kmZCV/yZumaNqtHGKBXt1KgaYS9KjDOmqGeI8gHk/W7kWVZg==", "dev": true, "dependencies": { "esbuild": "~0.20.2", @@ -13721,9 +12512,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.15", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.15.tgz", - "integrity": "sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -13741,7 +12532,7 @@ ], "dependencies": { "escalade": "^3.1.2", - "picocolors": "^1.0.0" + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -14110,6 +12901,7 @@ "@solana/spl-token": "^0.4.3", "@solana/web3.js": "^1.91.6", "@types/node-fetch": "^2.6.11", + "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", "@wormhole-foundation/sdk-base": "^0.6.8", "@wormhole-foundation/sdk-definitions": "^0.6.8", @@ -14135,11 +12927,67 @@ "tsx": "^4.7.2" } }, + "solana/node_modules/@coral-xyz/anchor": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.0.tgz", + "integrity": "sha512-qreDh5ztiRHVnCbJ+RS70NJ6aSTPBYDAgFeQ7Z5QvaT5DcDIhNyt4onOciVz2ieIE1XWePOJDDu9SbNvPGBkvQ==", + "dependencies": { + "@coral-xyz/borsh": "^0.30.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "solana/node_modules/@coral-xyz/borsh": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.0.tgz", + "integrity": "sha512-OrcV+7N10cChhgDRUxM4iEIuwxUHHs52XD85R8cFCUqE0vbLYrcoPPPs+VF6kZ9DhdJGVW2I6DHJOp5TykyZog==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "solana/node_modules/@solana/spl-token": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz", + "integrity": "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==", + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "@solana/spl-token-group": "^0.0.4", + "@solana/spl-token-metadata": "^0.1.4", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" + } + }, "solana/node_modules/prettier": { "version": "2.8.8", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", - "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, + "license": "MIT", "bin": { "prettier": "bin-prettier.js" }, diff --git a/solana/package.json b/solana/package.json index 02a8b94a..4069bf26 100644 --- a/solana/package.json +++ b/solana/package.json @@ -23,6 +23,7 @@ "@solana/spl-token": "^0.4.3", "@solana/web3.js": "^1.91.6", "@types/node-fetch": "^2.6.11", + "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", "@wormhole-foundation/sdk-base": "^0.6.8", "@wormhole-foundation/sdk-definitions": "^0.6.8", diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__swapLayer.ts index 28f1018d..8fd22cb2 100644 --- a/solana/ts/tests/01__swapLayer.ts +++ b/solana/ts/tests/01__swapLayer.ts @@ -27,10 +27,11 @@ import { expectIxOk, getUsdcAtaBalance, postLiquidityLayerVaa, + toUniversalAddress, } from "@wormhole-foundation/example-liquidity-layer-solana/testing"; import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; import { PreparedOrder } from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter/state"; -import { ChainId, toChainId } from "@wormhole-foundation/sdk-base"; +import { ChainId, toChain, toChainId } from "@wormhole-foundation/sdk-base"; import { UniversalAddress } from "@wormhole-foundation/sdk-definitions"; import { use as chaiUse, expect } from "chai"; import { @@ -2884,19 +2885,20 @@ async function createAndRedeemCctpFillForTest( const message = new LiquidityLayerMessage({ deposit: new LiquidityLayerDeposit( { - tokenAddress: burnMessage.burnTokenAddress, + tokenAddress: toUniversalAddress(burnMessage.burnTokenAddress), amount, sourceCctpDomain, destinationCctpDomain, cctpNonce, - burnSource, - mintRecipient: encodedMintRecipient, + burnSource: toUniversalAddress(burnSource), + mintRecipient: toUniversalAddress(encodedMintRecipient), + payload: new Uint8Array(), }, { fill: { - sourceChain: foreignChain as ChainId, - orderSender, - redeemer: Array.from(redeemer.toBuffer()), + sourceChain: toChain(foreignChain), + orderSender: toUniversalAddress(orderSender), + redeemer: toUniversalAddress(redeemer.toBuffer()), redeemerMessage: Buffer.from(redeemerMessage), }, }, diff --git a/solana/ts/tests/10__jupiterTest.ts b/solana/ts/tests/10__jupiterTest.ts index 12fdd195..6c103cce 100644 --- a/solana/ts/tests/10__jupiterTest.ts +++ b/solana/ts/tests/10__jupiterTest.ts @@ -10,10 +10,8 @@ import { } from "@solana/web3.js"; import { CctpTokenBurnMessage } from "@wormhole-foundation/example-liquidity-layer-solana/cctp"; import { - FastMarketOrder, LiquidityLayerDeposit, LiquidityLayerMessage, - SlowOrderResponse, } from "@wormhole-foundation/example-liquidity-layer-solana/common"; import * as matchingEngineSdk from "@wormhole-foundation/example-liquidity-layer-solana/matchingEngine"; import { @@ -31,6 +29,7 @@ import { expectIxOk, getBlockTime, postLiquidityLayerVaa, + toUniversalAddress, } from "@wormhole-foundation/example-liquidity-layer-solana/testing"; import { VaaAccount } from "@wormhole-foundation/example-liquidity-layer-solana/wormhole"; import { Chain, toChainId } from "@wormhole-foundation/sdk-base"; @@ -54,6 +53,10 @@ import { createLut, tryNativeToUint8Array, } from "./helpers"; +import { + FastMarketOrder, + SlowOrderResponse, +} from "@wormhole-foundation/example-liquidity-layer-definitions"; describe("Jupiter V6 Testing", () => { const connection = new Connection(LOCALHOST, "processed"); @@ -786,10 +789,10 @@ describe("Jupiter V6 Testing", () => { return { amountIn: amountIn ?? 1_000_000_000n, minAmountOut: minAmountOut ?? 0n, - targetChain: toChainId(targetChain ?? "Solana"), - redeemer: Array.from(swapLayer.custodianAddress().toBuffer()), - sender: sender ?? REGISTERED_PEERS["Ethereum"]!, - refundAddress: new Array(32).fill(3), + targetChain: targetChain ?? "Solana", + redeemer: toUniversalAddress(swapLayer.custodianAddress().toBuffer()), + sender: toUniversalAddress(sender ?? REGISTERED_PEERS["Ethereum"]!), + refundAddress: toUniversalAddress(new Array(32).fill(3)), maxFee: maxFee ?? 42069n, initAuctionFee: initAuctionFee ?? 1_250_000n, deadline: deadline ?? 0, @@ -891,15 +894,16 @@ describe("Jupiter V6 Testing", () => { const finalizedMessage = new LiquidityLayerMessage({ deposit: new LiquidityLayerDeposit( { - tokenAddress: burnMessage.burnTokenAddress, + tokenAddress: toUniversalAddress(burnMessage.burnTokenAddress), amount, sourceCctpDomain, destinationCctpDomain, cctpNonce, - burnSource: Array.from(Buffer.alloc(32, "beefdead", "hex")), - mintRecipient: Array.from( + burnSource: toUniversalAddress(Buffer.alloc(32, "beefdead", "hex")), + mintRecipient: toUniversalAddress( matchingEngine.cctpMintRecipientAddress().toBuffer(), ), + payload: new Uint8Array(), }, { slowOrderResponse, diff --git a/universal/rs/messages/src/messages/mod.rs b/universal/rs/messages/src/messages/mod.rs index 1f8d2cf1..79d6e228 100644 --- a/universal/rs/messages/src/messages/mod.rs +++ b/universal/rs/messages/src/messages/mod.rs @@ -65,7 +65,7 @@ mod test { #[test] pub fn test_swap_message_v1_usdc_direct() { - let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a00000023010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0000"); + let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a0023010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0000"); let redeemer_message = hex!("010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0000"); @@ -96,7 +96,7 @@ mod test { #[test] pub fn test_swap_message_v1_eth_swap() { - let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a00000053010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d00010000000000000000000000000000000000000000010001f4015991a2df15a8f6a256d3ec51e99254cd3fb576a90001f4"); + let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a0053010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d00010000000000000000000000000000000000000000010001f4015991a2df15a8f6a256d3ec51e99254cd3fb576a90001f4"); let redeemer_message = hex!("010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d00010000000000000000000000000000000000000000010001f4015991a2df15a8f6a256d3ec51e99254cd3fb576a90001f4"); @@ -137,7 +137,7 @@ mod test { #[test] pub fn test_swap_message_v1_usdc_relay() { - let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a0000002d010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d02000000000000000f424000"); + let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a002d010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d02000000000000000f424000"); let redeemer_message = hex!("010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d02000000000000000f424000"); @@ -171,7 +171,7 @@ mod test { #[test] pub fn test_swap_message_v1_usdc_payload() { - let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a0000002b010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000004deadbeef00"); + let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a002b010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000004deadbeef00"); let redeemer_message = hex!("010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000004deadbeef00"); From c473f2f8c9bc3f8e067604631514928ebd695825 Mon Sep 17 00:00:00 2001 From: Ben Guidarelli Date: Mon, 20 May 2024 13:53:57 -0400 Subject: [PATCH 07/50] Update LL submodule version (#32) * bump versions * fixup tests --- evm/ts-sdk/package.json | 6 +- lib/example-liquidity-layer | 2 +- package-lock.json | 2281 +++++++--------------------- package.json | 2 +- solana/package.json | 10 +- solana/ts/tests/01__swapLayer.ts | 46 +- solana/ts/tests/10__jupiterTest.ts | 29 +- 7 files changed, 626 insertions(+), 1750 deletions(-) diff --git a/evm/ts-sdk/package.json b/evm/ts-sdk/package.json index 83664eb3..09ccf6a3 100644 --- a/evm/ts-sdk/package.json +++ b/evm/ts-sdk/package.json @@ -10,9 +10,9 @@ "author": "", "license": "ISC", "dependencies": { - "@wormhole-foundation/sdk-base": "^0.6.8", - "@wormhole-foundation/sdk-definitions": "^0.6.8", - "@wormhole-foundation/sdk-evm": "^0.6.8", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-evm": "^0.7.0-beta.3", "typescript": "^5.4.5" } } diff --git a/lib/example-liquidity-layer b/lib/example-liquidity-layer index 68ba4e5e..13f07732 160000 --- a/lib/example-liquidity-layer +++ b/lib/example-liquidity-layer @@ -1 +1 @@ -Subproject commit 68ba4e5ea8743e1173e70203b572ebd4f5e4b00c +Subproject commit 13f07732f5dde13006d1884cc9a2f7019759905f diff --git a/package-lock.json b/package-lock.json index 78975213..338d10d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "solana" ], "dependencies": { - "@wormhole-foundation/sdk": "^0.6.8" + "@wormhole-foundation/sdk": "^0.7.0-beta.3" }, "devDependencies": { "@types/chai": "^4.3.5", @@ -32,9 +32,9 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@wormhole-foundation/sdk-base": "^0.6.8", - "@wormhole-foundation/sdk-definitions": "^0.6.8", - "@wormhole-foundation/sdk-evm": "^0.6.8", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-evm": "^0.7.0-beta.3", "typescript": "^5.4.5" } }, @@ -408,6 +408,21 @@ "node": ">=4" } }, + "node_modules/@babel/highlight/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true + }, "node_modules/@babel/highlight/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1166,7 +1181,58 @@ "follow-redirects": "^1.14.0" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@noble/hashes": { + "node_modules/@certusone/wormhole-sdk/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/@certusone/wormhole-sdk/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/@certusone/wormhole-sdk/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/@certusone/wormhole-sdk/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/@certusone/wormhole-sdk/node_modules/aptos/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==", @@ -1177,7 +1243,7 @@ } ] }, - "node_modules/@certusone/wormhole-sdk/node_modules/@scure/bip39": { + "node_modules/@certusone/wormhole-sdk/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==", @@ -1192,21 +1258,6 @@ "@scure/base": "~1.1.0" } }, - "node_modules/@certusone/wormhole-sdk/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/@certusone/wormhole-sdk/node_modules/aptos/node_modules/axios": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", @@ -1224,6 +1275,11 @@ "follow-redirects": "^1.14.4" } }, + "node_modules/@certusone/wormhole-sdk/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/@certusone/wormhole-sdk/node_modules/bech32": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", @@ -1239,6 +1295,14 @@ "protobufjs": "~6.11.2" } }, + "node_modules/@certusone/wormhole-sdk/node_modules/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@certusone/wormhole-spydk": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@certusone/wormhole-spydk/-/wormhole-spydk-0.0.1.tgz", @@ -2672,6 +2736,19 @@ "node": ">=6" } }, + "node_modules/@grpc/proto-loader/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@grpc/proto-loader/node_modules/long": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", @@ -2700,6 +2777,23 @@ "node": ">=12.0.0" } }, + "node_modules/@grpc/proto-loader/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, "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", @@ -3106,55 +3200,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/console/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/console/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@jest/console/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/console/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==", - "dev": true - }, "node_modules/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", @@ -3202,55 +3247,6 @@ } } }, - "node_modules/@jest/core/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/core/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@jest/core/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/core/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==", - "dev": true - }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", @@ -3366,55 +3362,6 @@ } } }, - "node_modules/@jest/reporters/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/reporters/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@jest/reporters/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/reporters/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==", - "dev": true - }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -3497,59 +3444,10 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/transform/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/transform/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@jest/transform/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/transform/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==", - "dev": true - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", @@ -3563,55 +3461,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@jest/types/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@jest/types/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/@jest/types/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@jest/types/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==", - "dev": true - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -3712,9 +3561,9 @@ } }, "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==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.11.1.tgz", + "integrity": "sha512-xP85isNSYUCHd3O/g+TmZYmg4wK6cU8q/n/MebkIGP4CYVJZz2wU/G24xIZ3wI+0iTop4dfgA5kYrg/DQKCUzA==", "dependencies": { "bs58": "^5.0.0" } @@ -3733,18 +3582,20 @@ } }, "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==", + "version": "0.50.1", + "resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.50.1.tgz", + "integrity": "sha512-AY0wb4n6PMTRsDGygzrrTHUK/m5KwKZ4aQcN9cayiwsq2iIhfjGo7uuqMA7Y5UiqvLCoF+z7Ig14Q5qejQ/S/w==", "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", + "@graphql-typed-document-node/core": "^3.2.0", + "@mysten/bcs": "0.11.1", + "@noble/curves": "^1.1.0", + "@noble/hashes": "^1.3.1", + "@scure/bip32": "^1.3.1", + "@scure/bip39": "^1.2.1", "@suchipi/femver": "^1.0.0", - "jayson": "^4.0.0", - "rpc-websockets": "^7.5.1", + "bech32": "^2.0.0", + "gql.tada": "^1.2.0", + "graphql": "^16.8.1", "superstruct": "^1.0.3", "tweetnacl": "^1.0.3" }, @@ -3752,6 +3603,11 @@ "node": ">=16" } }, + "node_modules/@mysten/sui.js/node_modules/bech32": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + }, "node_modules/@mysten/sui.js/node_modules/superstruct": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", @@ -4041,6 +3897,25 @@ "errors": "bin/cli.js" } }, + "node_modules/@solana/errors/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@solana/errors/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } + }, "node_modules/@solana/options": { "version": "2.0.0-preview.2", "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz", @@ -4389,9 +4264,9 @@ } }, "node_modules/@types/lodash": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", - "integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==" + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==" }, "node_modules/@types/lodash.values": { "version": "4.3.9", @@ -4531,9 +4406,9 @@ } }, "node_modules/@vue/language-core": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.18.tgz", - "integrity": "sha512-MwKRQAReHN1z7P3/8k/ISC5MjDRjHxGyitn50jWrMmzW9FNySG/1NxMPgAHcVJ4zApJUolS9TexYzT4I6BKL5w==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.19.tgz", + "integrity": "sha512-A9EGOnvb51jOvnCYoRLnMP+CcoPlbZVxI9gZXE/y2GksRWM6j/PrLEIC++pnosWTN08tFpJgxhSS//E9v/Sg+Q==", "dependencies": { "@volar/language-core": "~2.2.4", "@vue/compiler-dom": "^3.4.0", @@ -4582,15 +4457,16 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-definitions": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", - "integrity": "sha512-xV2Qgg4msA7tGGlDbi0Sx81eCylkEO2Q4211JcU7iPKhwllS1hc2AArn3vYq3/z7L9H0jN9Rb4Xg+FxqS/oDNw==", + "integrity": "sha512-9QcRfF4CLQVanW/FWYfW/Uetclb4fjxKzXeRhnvSFwgLS+3qqq9p55WYxywy0W+bvdCvNuafSJ311cPI15URgA==", + "license": "Apache-2.0", "dependencies": { - "@wormhole-foundation/sdk": "^0.6.8" + "@wormhole-foundation/sdk": "^0.7.0-beta.3" } }, "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "integrity": "sha512-v+li6WThalsf59JTJsYmJ9oFT3SuzGU70WraPoVccdTgqMnIL7229mE+/J35S1JKK66OMkLp2rXdWbDnUtkYOw==", + "integrity": "sha512-v/P32Tv5oFlVs+ejDP+mTXibcpPe4FW6o1ZMSwFKyMhSD0+YYKk/7PlC6teeBT373hbDpxSV60xgbE7mAT+eZw==", "dependencies": { "@certusone/wormhole-spydk": "^0.0.1", "@coral-xyz/anchor": "^0.30.0", @@ -4600,7 +4476,7 @@ "@solana/web3.js": "^1.91.7", "@types/node-fetch": "^2.6.11", "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", - "@wormhole-foundation/sdk": "^0.6.8", + "@wormhole-foundation/sdk": "^0.7.0-beta.3", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", "dotenv": "^16.4.1", "ethers": "^5.7.2", @@ -4666,47 +4542,77 @@ "@solana/web3.js": "^1.91.6" } }, + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@wormhole-foundation/sdk": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk/-/sdk-0.6.8.tgz", - "integrity": "sha512-ZWhm+Mm+jlgK8WGHD2Xpu8h4D2QSueFBk64SsHePWLn3VNy1Nuq1Lm8A6WcHZN2k1AZgITTgQEliEypt6GR4rg==", - "dependencies": { - "@wormhole-foundation/sdk-algorand": "0.6.8", - "@wormhole-foundation/sdk-algorand-core": "0.6.8", - "@wormhole-foundation/sdk-algorand-tokenbridge": "0.6.8", - "@wormhole-foundation/sdk-aptos": "0.6.8", - "@wormhole-foundation/sdk-aptos-core": "0.6.8", - "@wormhole-foundation/sdk-aptos-tokenbridge": "0.6.8", - "@wormhole-foundation/sdk-base": "0.6.8", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm-core": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm-ibc": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm-tokenbridge": "0.6.8", - "@wormhole-foundation/sdk-definitions": "0.6.8", - "@wormhole-foundation/sdk-evm": "0.6.8", - "@wormhole-foundation/sdk-evm-cctp": "0.6.8", - "@wormhole-foundation/sdk-evm-core": "0.6.8", - "@wormhole-foundation/sdk-evm-portico": "0.6.8", - "@wormhole-foundation/sdk-evm-tokenbridge": "0.6.8", - "@wormhole-foundation/sdk-solana": "0.6.8", - "@wormhole-foundation/sdk-solana-cctp": "0.6.8", - "@wormhole-foundation/sdk-solana-core": "0.6.8", - "@wormhole-foundation/sdk-solana-tokenbridge": "0.6.8", - "@wormhole-foundation/sdk-sui": "0.6.8", - "@wormhole-foundation/sdk-sui-core": "0.6.8", - "@wormhole-foundation/sdk-sui-tokenbridge": "0.6.8" + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk/-/sdk-0.7.0-beta.3.tgz", + "integrity": "sha512-0hZi2kvhNOWTvk3o0UGQes3xJchH2COXa00BDYZg2aQAmZwB+7cn6BmkSLYJZZ26iu4B34+rjtVOGk/zIfgIaw==", + "dependencies": { + "@wormhole-foundation/sdk-algorand": "0.7.0-beta.3", + "@wormhole-foundation/sdk-algorand-core": "0.7.0-beta.3", + "@wormhole-foundation/sdk-algorand-tokenbridge": "0.7.0-beta.3", + "@wormhole-foundation/sdk-aptos": "0.7.0-beta.3", + "@wormhole-foundation/sdk-aptos-core": "0.7.0-beta.3", + "@wormhole-foundation/sdk-aptos-tokenbridge": "0.7.0-beta.3", + "@wormhole-foundation/sdk-base": "0.7.0-beta.3", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-cosmwasm": "0.7.0-beta.3", + "@wormhole-foundation/sdk-cosmwasm-core": "0.7.0-beta.3", + "@wormhole-foundation/sdk-cosmwasm-ibc": "0.7.0-beta.3", + "@wormhole-foundation/sdk-cosmwasm-tokenbridge": "0.7.0-beta.3", + "@wormhole-foundation/sdk-definitions": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm-cctp": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm-core": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm-portico": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm-tokenbridge": "0.7.0-beta.3", + "@wormhole-foundation/sdk-solana": "0.7.0-beta.3", + "@wormhole-foundation/sdk-solana-cctp": "0.7.0-beta.3", + "@wormhole-foundation/sdk-solana-core": "0.7.0-beta.3", + "@wormhole-foundation/sdk-solana-tokenbridge": "0.7.0-beta.3", + "@wormhole-foundation/sdk-sui": "0.7.0-beta.3", + "@wormhole-foundation/sdk-sui-core": "0.7.0-beta.3", + "@wormhole-foundation/sdk-sui-tokenbridge": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-algorand": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand/-/sdk-algorand-0.6.8.tgz", - "integrity": "sha512-yyIzFCgXRRDKZiIypMhtvsu4Phst3kRdoAW7hZQWUQZTwsIRh89bwRh3mAtogOmRHfToLgnzwihXlIEe0zq5pg==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand/-/sdk-algorand-0.7.0-beta.3.tgz", + "integrity": "sha512-NhMoc783wcbGhaWNIydZalF5Gm4BBqhVg+rtFaT+6fiyeSpoPSv2BJrXK4g9U79II3gwA0LdMbARRMkA3jIuqw==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", "algosdk": "2.7.0" }, "engines": { @@ -4714,36 +4620,36 @@ } }, "node_modules/@wormhole-foundation/sdk-algorand-core": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-core/-/sdk-algorand-core-0.6.8.tgz", - "integrity": "sha512-3Nv9jq0ndONCDvqqUq+5Z5IvxucP2vcmah9gVGz5OEcxtBfdeiW88qbmNk5uv1WT/CwLD+rDMCR8oSWKGX2cLA==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-core/-/sdk-algorand-core-0.7.0-beta.3.tgz", + "integrity": "sha512-RTMIBkK0GDNfaCf6NNhGTO39Ycvv0K9SeX8agbBv4QQ6V4qzNZUYv+OwO8RdpmNmvuaVP7ID6zp/E3zCBZCjyw==", "dependencies": { - "@wormhole-foundation/sdk-algorand": "0.6.8", - "@wormhole-foundation/sdk-connect": "0.6.8" + "@wormhole-foundation/sdk-algorand": "0.7.0-beta.3", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-algorand-tokenbridge": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-tokenbridge/-/sdk-algorand-tokenbridge-0.6.8.tgz", - "integrity": "sha512-TFebQFpIqB6ONT3ZGQs2YGL9bTtSHaY3ha9L3FMI64ylv8bqe71WdX4GNxQEFwra6Xd6M5BIteTTZsAZXzeG/Q==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-tokenbridge/-/sdk-algorand-tokenbridge-0.7.0-beta.3.tgz", + "integrity": "sha512-+QvdJlPFnpBDW4m9XsWG02/sm1w39WAIT6jE+wk5ZwRrVOwvZfafVrD8RqnQ/bmOEWC3YxC2l8YCJ34T6YQr9g==", "dependencies": { - "@wormhole-foundation/sdk-algorand": "0.6.8", - "@wormhole-foundation/sdk-algorand-core": "0.6.8", - "@wormhole-foundation/sdk-connect": "0.6.8" + "@wormhole-foundation/sdk-algorand": "0.7.0-beta.3", + "@wormhole-foundation/sdk-algorand-core": "0.7.0-beta.3", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-aptos": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos/-/sdk-aptos-0.6.8.tgz", - "integrity": "sha512-TDjOk3GMZUV2YPiaLqLh9atM52ArW8EVjdCzQH2IlX5OHTwL0+9p8Navz568OK0y3CaDabBw+GDWordcSVNZ9w==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos/-/sdk-aptos-0.7.0-beta.3.tgz", + "integrity": "sha512-QYtEF499xtKw/V5jf6a9/2Jy7sD6bTrFFrDZV6L6Gw6hPwMPtiPWyzlX5s5beBznojxEfoLv9d4unLCcBxYY2Q==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", "aptos": "1.21.0" }, "engines": { @@ -4751,44 +4657,44 @@ } }, "node_modules/@wormhole-foundation/sdk-aptos-core": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-core/-/sdk-aptos-core-0.6.8.tgz", - "integrity": "sha512-J9xWSUvdQEFlbcSSH7n5Pn5QnaKmEujVHFvdY8yMZKwdYfJ1ad7EAogSTo+7r2tO9YWMcIlGeJv21lyebDE3JA==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-core/-/sdk-aptos-core-0.7.0-beta.3.tgz", + "integrity": "sha512-tCpzETyjGtHrimKMou0YO48msExQQJ5+qZhpTSHnQ2hd3XaTIn93Wz+RvV6HRJJs+4RZNA30XeQSEzP2hMWsHQ==", "dependencies": { - "@wormhole-foundation/sdk-aptos": "0.6.8", - "@wormhole-foundation/sdk-connect": "0.6.8" + "@wormhole-foundation/sdk-aptos": "0.7.0-beta.3", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-aptos-tokenbridge": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-tokenbridge/-/sdk-aptos-tokenbridge-0.6.8.tgz", - "integrity": "sha512-SGkMSCipcI4E1z4WSNELx3+8YHWO2rWJOCBqn/HM8WUZw/MaqhR7iKmefW55Urf7OyGSv+OPV3EhILVylzA2SQ==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-tokenbridge/-/sdk-aptos-tokenbridge-0.7.0-beta.3.tgz", + "integrity": "sha512-HMqKy0Dc2nMCdOhbT/C30xMnreHHTA1WbhzJRZdh3om1yR+EEi/L5pFTuh81WHVpRe6t1UsZWdGW1vjUSWk1PA==", "dependencies": { - "@wormhole-foundation/sdk-aptos": "0.6.8", - "@wormhole-foundation/sdk-connect": "0.6.8" + "@wormhole-foundation/sdk-aptos": "0.7.0-beta.3", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-base": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.6.8.tgz", - "integrity": "sha512-8F6B9I60SEI2lQDAoPB6bB6NWLFso/hghfD/Zfxrrgu+LumwKIejgvsiOudVRjL2nvqUJJ/lIodgSBckpPW8Kg==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.7.0-beta.3.tgz", + "integrity": "sha512-L0Dja5eBrvZaYDEWYicvzmLWaoigToqzcVOfjba3QICxzyg50W+cKuOu+qdbOPZF7Y8BUoSJOZFF5whDh2yQ/g==", "dependencies": { "@scure/base": "^1.1.3" } }, "node_modules/@wormhole-foundation/sdk-connect": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.6.8.tgz", - "integrity": "sha512-AqMg2L2oXj8fHutuXgQVaQ6Dr5XXxoOBucxA2tt+m/iXa1Xy59pY2zJYmLH2RlPFgLAikMUtq72cVwKz/SPSxQ==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.7.0-beta.3.tgz", + "integrity": "sha512-U4dAyrsWRi6vPW0UKlRg9W7aOoKYzJXUBSyC6k1+OOjaTXnP/welmP4DypYwtEniTc1spCzm0tw0GVHWbpyNvQ==", "dependencies": { - "@wormhole-foundation/sdk-base": "0.6.8", - "@wormhole-foundation/sdk-definitions": "0.6.8", + "@wormhole-foundation/sdk-base": "0.7.0-beta.3", + "@wormhole-foundation/sdk-definitions": "0.7.0-beta.3", "axios": "^1.4.0" }, "engines": { @@ -4796,15 +4702,15 @@ } }, "node_modules/@wormhole-foundation/sdk-cosmwasm": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm/-/sdk-cosmwasm-0.6.8.tgz", - "integrity": "sha512-FKna+WYOhUSrocKXoSOYmEXJhwjeGDXHz1ZdHvprKauocpku3VNJXB3kEPwMywfZsu52d1ca9v79vSsKM0iRBw==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm/-/sdk-cosmwasm-0.7.0-beta.3.tgz", + "integrity": "sha512-C35Ao74w/V26V7OR7DRIAe8AIotYl22b6f7+VrY7F8ChVgdfs//qwek2j9ZCKmRQksvSiZ80qDXHEpTTqMqhPg==", "dependencies": { "@cosmjs/cosmwasm-stargate": "^0.32.0", "@cosmjs/proto-signing": "^0.32.0", "@cosmjs/stargate": "^0.32.0", "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", "cosmjs-types": "^0.9.0" }, "engines": { @@ -4812,31 +4718,31 @@ } }, "node_modules/@wormhole-foundation/sdk-cosmwasm-core": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-core/-/sdk-cosmwasm-core-0.6.8.tgz", - "integrity": "sha512-BprNt10TeZq1cV9Y3W2zzl2Nuioh4UAsU12lBczrw5j0d/zJ+ImDQL6R2d8FhV2iI0S+SEMbuhUYBOvnUgC2bg==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-core/-/sdk-cosmwasm-core-0.7.0-beta.3.tgz", + "integrity": "sha512-Zo4IQeq1Eut4M4/OaPrfysJMeNr48CqodiHwuB0JlEFqeLHZUXAjk0GG8anso4aLmw0h+ziJohXNavZLxfINGg==", "dependencies": { "@cosmjs/cosmwasm-stargate": "^0.32.0", "@cosmjs/stargate": "^0.32.0", "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm": "0.6.8" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-cosmwasm": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-ibc/-/sdk-cosmwasm-ibc-0.6.8.tgz", - "integrity": "sha512-H6Z//N2HghUmBcbEcJAZ0+bUPV2OWsFWao+Cta8g5ucCS9w7v6pLIUYrfn6TcFFgZpwihGt4pokDniFoOJ8/Rg==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-ibc/-/sdk-cosmwasm-ibc-0.7.0-beta.3.tgz", + "integrity": "sha512-s3XQPIyypN+u9xkEbyt5Xmeo1Awvb+yFoSdO0V+oyYi/uTtgPtk4wtUb/CiGuGppp6VVg4BNSwX79MF8Gh2HSw==", "dependencies": { "@cosmjs/cosmwasm-stargate": "^0.32.0", "@cosmjs/stargate": "^0.32.0", "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm-core": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-cosmwasm": "0.7.0-beta.3", + "@wormhole-foundation/sdk-cosmwasm-core": "0.7.0-beta.3", "cosmjs-types": "^0.9.0" }, "engines": { @@ -4844,35 +4750,35 @@ } }, "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-tokenbridge/-/sdk-cosmwasm-tokenbridge-0.6.8.tgz", - "integrity": "sha512-NpCWSYttzdudW4r76hv+42Ym5CzIl6oBTTpkaBBkNFTPjzVkCJap+8X3oV9YlLCFC0gh9C+5UEtS2bvU5HMm6w==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-tokenbridge/-/sdk-cosmwasm-tokenbridge-0.7.0-beta.3.tgz", + "integrity": "sha512-LheKQaPAKboF1veOyYZiU3cX1kL+K1cbZmy8uZAW7/9E2v9Af6C8L2bJVhGQSppK74Pp3NmTETEeCAfPQRIBqQ==", "dependencies": { "@cosmjs/cosmwasm-stargate": "^0.32.0", "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-cosmwasm": "0.6.8" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-cosmwasm": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-definitions": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.6.8.tgz", - "integrity": "sha512-UcILpnIuZddhqDGcU3eXwpMobf9Q/GAVUTyeMbS34cvBN7kHaxLlsYBB5mzbvPo6X4PP23KKt9AjDbpHh+5B5g==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.7.0-beta.3.tgz", + "integrity": "sha512-8Be4R+azLgkFXH7Yw2wi8xpZJRm6pliJTMqD6jusN4Dg6KatRgm5GKpyhZrkIDrDXxIcj/PfLwu32X+rKjmH/Q==", "dependencies": { "@noble/curves": "^1.4.0", "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "0.6.8" + "@wormhole-foundation/sdk-base": "0.7.0-beta.3" } }, "node_modules/@wormhole-foundation/sdk-evm": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.6.8.tgz", - "integrity": "sha512-0ABqWo2Moh+V1yLEBY2/1yLbRkJzd7pp6dGIDO3D1NIhgeA9oYwBlDjd1bJ12JOxIJO4pvVGMz7wKiHKTzcfjA==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.7.0-beta.3.tgz", + "integrity": "sha512-Eug8ZN6521u9RzYqDq+ZFcjnq+DibVSvdR5MNqaI7QWobYOhLRjbPude2qXDBQWhmLHpmyD2qQdLhJZPoFTKEw==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", "ethers": "^6.5.1" }, "engines": { @@ -4880,12 +4786,12 @@ } }, "node_modules/@wormhole-foundation/sdk-evm-cctp": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-cctp/-/sdk-evm-cctp-0.6.8.tgz", - "integrity": "sha512-ULxqMNMsClvhKZdnrwjarOxypyOvNa8NGewGKKG3ijC39XUOHmlJ+gl8jXrl9sUkl9Wy7ZHph6kVcwkwhFg0UA==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-cctp/-/sdk-evm-cctp-0.7.0-beta.3.tgz", + "integrity": "sha512-XdrFpA4ug7l9h1M6DFgwv3z+Zj7Wnb5+nmDiosnK5TCxtIqLdhn/xDqfnM5oFrhl88w4PQtrioVnBoydwuVQpw==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-evm": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", "ethers": "^6.5.1" }, "engines": { @@ -4977,12 +4883,12 @@ } }, "node_modules/@wormhole-foundation/sdk-evm-core": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-core/-/sdk-evm-core-0.6.8.tgz", - "integrity": "sha512-9MuYn9hAL8VrF9+eOmRivcD1leI6pU9O6gkZZmlbmJRQiWkiOQwCFYJcB4LB0ykfCxBzo4NvphX0Fm1cB0RVtw==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-core/-/sdk-evm-core-0.7.0-beta.3.tgz", + "integrity": "sha512-ZBL4wYCR9GnVILX41EDofOZiEI35XsIMtLSsiAB6XP/WMRKd53yPpri//yIKGpl96jdqngkOeV/RLRKjBERsWA==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-evm": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", "ethers": "^6.5.1" }, "engines": { @@ -5074,14 +4980,14 @@ } }, "node_modules/@wormhole-foundation/sdk-evm-portico": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-portico/-/sdk-evm-portico-0.6.8.tgz", - "integrity": "sha512-GM9bT8EBIK+SCUJA6UMygn2Kpkmvb8IpCrjCZXz6PocXke2A04f9XJmCz0m2s/2UrQ3tlnCGkpzIcQwTL3nTLQ==", - "dependencies": { - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-evm": "0.6.8", - "@wormhole-foundation/sdk-evm-core": "0.6.8", - "@wormhole-foundation/sdk-evm-tokenbridge": "0.6.8", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-portico/-/sdk-evm-portico-0.7.0-beta.3.tgz", + "integrity": "sha512-/OtMTSr+deYNB1XoVVUNbzvpuUDbRpjXVH+4snAyauGCqKjk0klqZIm63+8UsgUjg01jO+fKI3IS/z49ONo3Qw==", + "dependencies": { + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm-core": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm-tokenbridge": "0.7.0-beta.3", "ethers": "^6.5.1" }, "engines": { @@ -5173,13 +5079,13 @@ } }, "node_modules/@wormhole-foundation/sdk-evm-tokenbridge": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-tokenbridge/-/sdk-evm-tokenbridge-0.6.8.tgz", - "integrity": "sha512-eRX6EuV1AB56/lIhAXCAgCORWjqKdnWqBSamyaorQCr9lvv43uKvhLLkv6aAMfFBvHGVf2izuspfTQUTqt7FYg==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-tokenbridge/-/sdk-evm-tokenbridge-0.7.0-beta.3.tgz", + "integrity": "sha512-64NlZQjR1nvGoL7Q2KjkVhfpjtd5zmD2iWzm3GJLK/bLIn1vUJlKwNPXzjtwVLWzw00BCwrYeQzSAI5qLpQ1VA==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-evm": "0.6.8", - "@wormhole-foundation/sdk-evm-core": "0.6.8", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", + "@wormhole-foundation/sdk-evm-core": "0.7.0-beta.3", "ethers": "^6.5.1" }, "engines": { @@ -5355,312 +5261,144 @@ } }, "node_modules/@wormhole-foundation/sdk-solana": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.6.8.tgz", - "integrity": "sha512-spiBcyukLtoo+kcDLwcEmIH2nb+3VFRKY+mt1UC4uS7DCLkrRbJnKIfdQNEI9MgZSqXMwvwHQMqrIuXSOv7Kjw==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.7.0-beta.3.tgz", + "integrity": "sha512-bT6RmOlGzmYBtn8sw6xHDe/nROrLhfOOJXGACLE00vmfT+tYCqRDQpEg7QHybqxuFjGl1n/QDQmzqAwoDIU/Kg==", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@coral-xyz/borsh": "0.29.0", "@solana/spl-token": "0.3.9", "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.6.8" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-solana-cctp": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-cctp/-/sdk-solana-cctp-0.6.8.tgz", - "integrity": "sha512-QiA2Ad4/ui34f8XcSohCjQEzNVtSaSN8bIDLS4DwPtBvzwJyMuCu1vYzaR4fCUPjPRB8Hbt9trFPKBYCg9zyKQ==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-cctp/-/sdk-solana-cctp-0.7.0-beta.3.tgz", + "integrity": "sha512-xa0TOP2Yx35ItuNKNUk5OvIsJcsx0MsVPe9KwC3CQzcrOyR9D5XCn2zneJwMJq+6VFdgB8rE0BQq63NLOkIUrQ==", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@solana/spl-token": "0.3.9", "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-solana": "0.6.8" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-solana": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-solana-core": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.6.8.tgz", - "integrity": "sha512-zhsgS1JHkKKUZ/+AhMNVIyKbtO1/t4464TlnLxYEe9aTBsNAF8qj+kwaDbHuBhK17vQbiaKqOVwXbYcSnbfvFQ==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.7.0-beta.3.tgz", + "integrity": "sha512-vL5/PWXEnXctUMY4ii9ndmoQMqWnAlRBDJ5y+nIEnVkkTEOaoInvmEGdSzGV+z5fOotkPPnItunFTSGLhUsHrA==", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@coral-xyz/borsh": "0.29.0", "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-solana": "0.6.8" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-solana": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-solana-tokenbridge": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-tokenbridge/-/sdk-solana-tokenbridge-0.6.8.tgz", - "integrity": "sha512-0CrPCQvp3Txi/75RoGEZ5qe6X5zPibmKM1xCP70Yx6fIc0+0XxOnZ5pjOCeRYO84s0QGkap4G3mvAtXv/5xU8w==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-tokenbridge/-/sdk-solana-tokenbridge-0.7.0-beta.3.tgz", + "integrity": "sha512-XB0WAZKDASnnR9gJ0IRlZhXf9IKjC7uROeQSfAtggvb8wPQxhNkvIryL/cqF9Sr8QTOcgH6X8yu1qeOn8YjLPw==", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@solana/spl-token": "0.3.9", "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-solana": "0.6.8", - "@wormhole-foundation/sdk-solana-core": "0.6.8" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-solana": "0.7.0-beta.3", + "@wormhole-foundation/sdk-solana-core": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-sui": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui/-/sdk-sui-0.6.8.tgz", - "integrity": "sha512-1klJjPCmRQyk/NI89tDhC6/IOIgtch8eTF/QYpCL2g6clsV5Cyojkeb8q0zsPtrPaFcZeRG7y2rPw/5J7k1MTA==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui/-/sdk-sui-0.7.0-beta.3.tgz", + "integrity": "sha512-oi2Jb1iRK0+Bpni4NmAWexNXwtaaMSb4oC7YofaEeuPboo90AJg2cV/N/f5kJhK45Qy3jZRpy2UbShZaSDcgIw==", "dependencies": { "@mysten/sui.js": "^0.50.1", - "@wormhole-foundation/sdk-connect": "0.6.8" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-sui-core": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui-core/-/sdk-sui-core-0.6.8.tgz", - "integrity": "sha512-RJCM6QhT9YM14ygEirIw/GtcMRR+cNg7LFbtrW65UiAV2uPf/iiuSf3SDUjbxkXqgAv9J6zPxFrftGTDKdAQ4Q==", + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui-core/-/sdk-sui-core-0.7.0-beta.3.tgz", + "integrity": "sha512-+9XcviPpLsfI+KV8xbYyGXqVj0KW1CLftuoRRmpbOzH6oG/Nh9kf0qSs4Bqin+kfj87qYMzEElCb3V3hN6rQrA==", "dependencies": { "@mysten/sui.js": "^0.50.1", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-sui": "0.6.8" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-sui": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-sui-core/node_modules/@mysten/bcs": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.11.1.tgz", - "integrity": "sha512-xP85isNSYUCHd3O/g+TmZYmg4wK6cU8q/n/MebkIGP4CYVJZz2wU/G24xIZ3wI+0iTop4dfgA5kYrg/DQKCUzA==", - "dependencies": { - "bs58": "^5.0.0" - } - }, - "node_modules/@wormhole-foundation/sdk-sui-core/node_modules/@mysten/sui.js": { - "version": "0.50.1", - "resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.50.1.tgz", - "integrity": "sha512-AY0wb4n6PMTRsDGygzrrTHUK/m5KwKZ4aQcN9cayiwsq2iIhfjGo7uuqMA7Y5UiqvLCoF+z7Ig14Q5qejQ/S/w==", + "node_modules/@wormhole-foundation/sdk-sui-tokenbridge": { + "version": "0.7.0-beta.3", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui-tokenbridge/-/sdk-sui-tokenbridge-0.7.0-beta.3.tgz", + "integrity": "sha512-pSXlGUTMrHIx2mPQo91inZ9bnnUTiF+35qyYCu8WBiSNbD8D2k/CjgbddJFGnffOBrRDrExsl7a+V0EfEDoY2g==", "dependencies": { - "@graphql-typed-document-node/core": "^3.2.0", - "@mysten/bcs": "0.11.1", - "@noble/curves": "^1.1.0", - "@noble/hashes": "^1.3.1", - "@scure/bip32": "^1.3.1", - "@scure/bip39": "^1.2.1", - "@suchipi/femver": "^1.0.0", - "bech32": "^2.0.0", - "gql.tada": "^1.2.0", - "graphql": "^16.8.1", - "superstruct": "^1.0.3", - "tweetnacl": "^1.0.3" + "@mysten/sui.js": "^0.50.1", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", + "@wormhole-foundation/sdk-sui": "0.7.0-beta.3", + "@wormhole-foundation/sdk-sui-core": "0.7.0-beta.3" }, "engines": { "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-sui-core/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/@wormhole-foundation/swap-layer-evm": { + "resolved": "evm/ts-sdk", + "link": true }, - "node_modules/@wormhole-foundation/sdk-sui-core/node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + "node_modules/@wormhole-foundation/swap-layer-solana": { + "resolved": "solana", + "link": true }, - "node_modules/@wormhole-foundation/sdk-sui-core/node_modules/bs58": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", - "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", + "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==", "dependencies": { - "base-x": "^4.0.0" + "tslib": "^2.3.0" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@wormhole-foundation/sdk-sui-core/node_modules/superstruct": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", - "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "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==", + "dependencies": { + "tslib": "^2.3.0" + }, "engines": { - "node": ">=14.0.0" + "node": ">=8" } }, - "node_modules/@wormhole-foundation/sdk-sui-tokenbridge": { - "version": "0.6.8", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui-tokenbridge/-/sdk-sui-tokenbridge-0.6.8.tgz", - "integrity": "sha512-BLpIfqJwOymnkumKP+KM3yjTEjlGgsPmcXY+E5+9eth63BJq5WDdl6vaqv+5abQ+56iLa3ARWb9jYSaR9gClcw==", + "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==", "dependencies": { - "@mysten/sui.js": "^0.50.1", - "@wormhole-foundation/sdk-connect": "0.6.8", - "@wormhole-foundation/sdk-sui": "0.6.8", - "@wormhole-foundation/sdk-sui-core": "0.6.8" + "tslib": "^2.3.0" }, "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/sdk-sui-tokenbridge/node_modules/@mysten/bcs": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.11.1.tgz", - "integrity": "sha512-xP85isNSYUCHd3O/g+TmZYmg4wK6cU8q/n/MebkIGP4CYVJZz2wU/G24xIZ3wI+0iTop4dfgA5kYrg/DQKCUzA==", - "dependencies": { - "bs58": "^5.0.0" - } - }, - "node_modules/@wormhole-foundation/sdk-sui-tokenbridge/node_modules/@mysten/sui.js": { - "version": "0.50.1", - "resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.50.1.tgz", - "integrity": "sha512-AY0wb4n6PMTRsDGygzrrTHUK/m5KwKZ4aQcN9cayiwsq2iIhfjGo7uuqMA7Y5UiqvLCoF+z7Ig14Q5qejQ/S/w==", - "dependencies": { - "@graphql-typed-document-node/core": "^3.2.0", - "@mysten/bcs": "0.11.1", - "@noble/curves": "^1.1.0", - "@noble/hashes": "^1.3.1", - "@scure/bip32": "^1.3.1", - "@scure/bip39": "^1.2.1", - "@suchipi/femver": "^1.0.0", - "bech32": "^2.0.0", - "gql.tada": "^1.2.0", - "graphql": "^16.8.1", - "superstruct": "^1.0.3", - "tweetnacl": "^1.0.3" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/sdk-sui-tokenbridge/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/@wormhole-foundation/sdk-sui-tokenbridge/node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - }, - "node_modules/@wormhole-foundation/sdk-sui-tokenbridge/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/@wormhole-foundation/sdk-sui-tokenbridge/node_modules/superstruct": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", - "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@wormhole-foundation/sdk-sui/node_modules/@mysten/bcs": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.11.1.tgz", - "integrity": "sha512-xP85isNSYUCHd3O/g+TmZYmg4wK6cU8q/n/MebkIGP4CYVJZz2wU/G24xIZ3wI+0iTop4dfgA5kYrg/DQKCUzA==", - "dependencies": { - "bs58": "^5.0.0" - } - }, - "node_modules/@wormhole-foundation/sdk-sui/node_modules/@mysten/sui.js": { - "version": "0.50.1", - "resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.50.1.tgz", - "integrity": "sha512-AY0wb4n6PMTRsDGygzrrTHUK/m5KwKZ4aQcN9cayiwsq2iIhfjGo7uuqMA7Y5UiqvLCoF+z7Ig14Q5qejQ/S/w==", - "dependencies": { - "@graphql-typed-document-node/core": "^3.2.0", - "@mysten/bcs": "0.11.1", - "@noble/curves": "^1.1.0", - "@noble/hashes": "^1.3.1", - "@scure/bip32": "^1.3.1", - "@scure/bip39": "^1.2.1", - "@suchipi/femver": "^1.0.0", - "bech32": "^2.0.0", - "gql.tada": "^1.2.0", - "graphql": "^16.8.1", - "superstruct": "^1.0.3", - "tweetnacl": "^1.0.3" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/sdk-sui/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/@wormhole-foundation/sdk-sui/node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - }, - "node_modules/@wormhole-foundation/sdk-sui/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/@wormhole-foundation/sdk-sui/node_modules/superstruct": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", - "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@wormhole-foundation/swap-layer-evm": { - "resolved": "evm/ts-sdk", - "link": true - }, - "node_modules/@wormhole-foundation/swap-layer-solana": { - "resolved": "solana", - "link": true - }, - "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==", - "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==", - "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==", - "dependencies": { - "tslib": "^2.3.0" - }, - "engines": { - "node": ">=8" + "node": ">=8" } }, "node_modules/@wry/trie": { @@ -5838,12 +5576,14 @@ } }, "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, + "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" + }, "engines": { - "node": ">=10" + "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" @@ -5958,9 +5698,9 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.1.tgz", + "integrity": "sha512-+LV37nQcd1EpFalkXksWNBiA17NZ5m5/WspmHGmZmdx1qBOg/VNq/c4eRJiA9VQQHBOs+N0ZhhdU10h2TyNK7Q==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -5997,55 +5737,6 @@ "@babel/core": "^7.8.0" } }, - "node_modules/babel-jest/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/babel-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/babel-jest/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/babel-jest/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==", - "dev": true - }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", @@ -6505,9 +6196,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001618", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001618.tgz", - "integrity": "sha512-p407+D1tIkDvsEAPS22lJxLQQaG8OTBEqo0KhzfABGk0TU4juBNDSfH0hyAp/HRyx+M8L17z/ltyhxh27FTfQg==", + "version": "1.0.30001620", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz", + "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==", "dev": true, "funding": [ { @@ -6558,11 +6249,16 @@ } }, "node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -6646,16 +6342,13 @@ "dev": true }, "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "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.1", + "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" } }, "node_modules/clone-response": { @@ -6717,17 +6410,20 @@ } }, "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==", + "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.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "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==" + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/color-string": { "version": "1.9.1", @@ -6738,6 +6434,19 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/color/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/color/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/colorspace": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", @@ -6759,12 +6468,9 @@ } }, "node_modules/commander": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", - "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", - "engines": { - "node": ">=18" - } + "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==" }, "node_modules/computeds": { "version": "0.0.1", @@ -6800,33 +6506,6 @@ "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==", - "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==", - "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", @@ -6895,55 +6574,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/create-jest/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/create-jest/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/create-jest/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/create-jest/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==", - "dev": true - }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -7205,9 +6835,9 @@ } }, "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==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "engines": { "node": ">=0.3.1" @@ -7332,9 +6962,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.770", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.770.tgz", - "integrity": "sha512-ONwOsDiVvV07CMsyH4+dEaZ9L79HMH/ODHnDS3GkIhgNqdDHJN2C18kFb0fBj0RXpQywsPJl6k2Pqg1IY4r1ig==", + "version": "1.4.774", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.774.tgz", + "integrity": "sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg==", "dev": true }, "node_modules/elliptic": { @@ -7495,15 +7125,12 @@ } }, "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, "node_modules/esprima": { @@ -8662,11 +8289,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, - "node_modules/jayson/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==" - }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -8738,55 +8360,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-circus/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-circus/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-circus/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-circus/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==", - "dev": true - }, "node_modules/jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", @@ -8820,55 +8393,38 @@ } } }, - "node_modules/jest-cli/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-cli/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=12" } }, - "node_modules/jest-cli/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==", + "node_modules/jest-cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" } }, - "node_modules/jest-cli/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==", - "dev": true - }, "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -8914,208 +8470,61 @@ } } }, - "node_modules/jest-config/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-config/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/jest-diff": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "chalk": "^4.0.0", + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/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==", + "node_modules/jest-docblock": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "detect-newline": "^3.0.0" }, "engines": { - "node": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-config/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==", - "dev": true - }, - "node_modules/jest-diff": { + "node_modules/jest-each": { "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", - "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-diff/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==", + "node_modules/jest-environment-node": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-diff/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-diff/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-diff/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==", - "dev": true - }, - "node_modules/jest-docblock": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", - "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", - "dev": true, - "dependencies": { - "detect-newline": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", - "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "jest-util": "^29.7.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-each/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-each/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-each/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-each/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==", - "dev": true - }, - "node_modules/jest-environment-node": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", - "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -9183,55 +8592,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-matcher-utils/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-matcher-utils/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-matcher-utils/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-matcher-utils/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==", - "dev": true - }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", @@ -9252,55 +8612,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-message-util/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-message-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-message-util/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-message-util/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==", - "dev": true - }, "node_modules/jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", @@ -9374,55 +8685,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-resolve/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-resolve/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-resolve/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-resolve/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==", - "dev": true - }, "node_modules/jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", @@ -9455,55 +8717,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runner/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runner/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-runner/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runner/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==", - "dev": true - }, "node_modules/jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", @@ -9537,55 +8750,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-runtime/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-runtime/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-runtime/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-runtime/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==", - "dev": true - }, "node_modules/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", @@ -9617,55 +8781,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-snapshot/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-snapshot/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-snapshot/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-snapshot/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==", - "dev": true - }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -9694,122 +8809,24 @@ "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } - }, - "node_modules/jest-util/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-util/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-util/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-util/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==", - "dev": true - }, - "node_modules/jest-validate": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", - "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "camelcase": "^6.2.0", - "chalk": "^4.0.0", - "jest-get-type": "^29.6.3", - "leven": "^3.1.0", - "pretty-format": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/jest-validate/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-validate/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-validate/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==", + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" }, "engines": { - "node": ">=7.0.0" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-validate/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==", - "dev": true - }, "node_modules/jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", @@ -9829,55 +8846,6 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/jest-watcher/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/jest-watcher/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "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/jest-watcher/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/jest-watcher/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==", - "dev": true - }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", @@ -10160,6 +9128,19 @@ "node": ">=4" } }, + "node_modules/link-module-alias/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/link-module-alias/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/link-module-alias/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -10242,55 +9223,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/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==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "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==", - "dev": true, - "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/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==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/log-symbols/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==", - "dev": true - }, "node_modules/logform": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/logform/-/logform-2.6.0.tgz", @@ -10578,17 +9510,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "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==", - "dev": true, - "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.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -10612,6 +9533,27 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/mocha/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==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/mocha/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/mocha/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -10729,20 +9671,11 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "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==", + "node_modules/mocha/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==", "dev": 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" } @@ -11233,6 +10166,18 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/pretty-format/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", @@ -11836,15 +10781,6 @@ "node": ">=10" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -12246,15 +11182,6 @@ "node": ">=10" } }, - "node_modules/ts-jest/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/ts-mocha": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", @@ -12371,15 +11298,6 @@ } } }, - "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==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/ts-results": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/ts-results/-/ts-results-3.3.0.tgz", @@ -12428,13 +11346,13 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsx": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.10.2.tgz", - "integrity": "sha512-gOfACgv1ElsIjvt7Fp0rMJKGnMGjox0JfGOfX3kmZCV/yZumaNqtHGKBXt1KgaYS9KjDOmqGeI8gHk/W7kWVZg==", + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.10.5.tgz", + "integrity": "sha512-twDSbf7Gtea4I2copqovUiNTEDrT8XNFXsuHpfGbdpW/z9ZW4fTghzzhAG0WfrCuJmJiOEY1nLIjq4u3oujRWQ==", "dev": true, "dependencies": { "esbuild": "~0.20.2", - "get-tsconfig": "^4.7.3" + "get-tsconfig": "^4.7.5" }, "bin": { "tsx": "dist/cli.mjs" @@ -12702,36 +11620,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/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==", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/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==", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/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==" - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -12810,28 +11698,28 @@ "dev": true }, "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dependencies": { - "cliui": "^8.0.1", + "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.3", + "string-width": "^4.2.0", "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "yargs-parser": "^20.2.2" }, "engines": { - "node": ">=12" + "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==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-unparser": { @@ -12850,11 +11738,11 @@ } }, "node_modules/yargs/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "engines": { - "node": ">=12" + "node": ">=10" } }, "node_modules/yn": { @@ -12903,11 +11791,11 @@ "@types/node-fetch": "^2.6.11", "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "@wormhole-foundation/sdk-base": "^0.6.8", - "@wormhole-foundation/sdk-definitions": "^0.6.8", - "@wormhole-foundation/sdk-evm": "0.6.8", - "@wormhole-foundation/sdk-solana": "^0.6.8", - "@wormhole-foundation/sdk-solana-core": "^0.6.8", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", + "@wormhole-foundation/sdk-solana": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.3", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", "chai-as-promised": "^7.1.1", "ts-results": "^3.3.0", @@ -12929,8 +11817,7 @@ }, "solana/node_modules/@coral-xyz/anchor": { "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.0.tgz", - "integrity": "sha512-qreDh5ztiRHVnCbJ+RS70NJ6aSTPBYDAgFeQ7Z5QvaT5DcDIhNyt4onOciVz2ieIE1XWePOJDDu9SbNvPGBkvQ==", + "license": "(MIT OR Apache-2.0)", "dependencies": { "@coral-xyz/borsh": "^0.30.0", "@noble/hashes": "^1.3.1", @@ -12953,8 +11840,7 @@ }, "solana/node_modules/@coral-xyz/borsh": { "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.0.tgz", - "integrity": "sha512-OrcV+7N10cChhgDRUxM4iEIuwxUHHs52XD85R8cFCUqE0vbLYrcoPPPs+VF6kZ9DhdJGVW2I6DHJOp5TykyZog==", + "license": "Apache-2.0", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -12968,8 +11854,7 @@ }, "solana/node_modules/@solana/spl-token": { "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz", - "integrity": "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==", + "license": "Apache-2.0", "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", diff --git a/package.json b/package.json index 1bc648e9..1151fc88 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "test": "npm run test --workspaces --if-present" }, "dependencies": { - "@wormhole-foundation/sdk": "^0.6.8" + "@wormhole-foundation/sdk": "^0.7.0-beta.3" }, "devDependencies": { "typescript": "5.4.5", diff --git a/solana/package.json b/solana/package.json index 4069bf26..e68752c3 100644 --- a/solana/package.json +++ b/solana/package.json @@ -25,11 +25,11 @@ "@types/node-fetch": "^2.6.11", "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "@wormhole-foundation/sdk-base": "^0.6.8", - "@wormhole-foundation/sdk-definitions": "^0.6.8", - "@wormhole-foundation/sdk-evm": "0.6.8", - "@wormhole-foundation/sdk-solana": "^0.6.8", - "@wormhole-foundation/sdk-solana-core": "^0.6.8", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", + "@wormhole-foundation/sdk-solana": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.3", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", "chai-as-promised": "^7.1.1", "ts-results": "^3.3.0", diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__swapLayer.ts index 8fd22cb2..c702821b 100644 --- a/solana/ts/tests/01__swapLayer.ts +++ b/solana/ts/tests/01__swapLayer.ts @@ -2086,7 +2086,7 @@ describe("Swap Layer", () => { const feeRecipientAfter = await getUsdcAtaBalance(connection, feeRecipient); expect(recipientAfter).to.equal( - recipientBefore + message.deposit!.header.amount, + recipientBefore + message.deposit!.message.amount, ); expect(payerLamportAfter).to.be.lessThan(payerLamportBefore); expect(feeRecipientAfter).to.equal(feeRecipientBefore); @@ -2153,7 +2153,7 @@ describe("Swap Layer", () => { const feeRecipientAfter = await getUsdcAtaBalance(connection, feeRecipient); expect(recipientAfter - recipientBefore).to.equal( - message.deposit!.header.amount - relayerFee, + message.deposit!.message.amount - relayerFee, ); expect(recipientLamportAfter - recipientLamportBefore).to.equal( Number(gasAmountDenorm), @@ -2225,7 +2225,7 @@ describe("Swap Layer", () => { const feeRecipientAfter = await getUsdcAtaBalance(connection, feeRecipient); expect(recipientAfter - recipientBefore).to.equal( - message.deposit!.header.amount - relayerFee, + message.deposit!.message.amount - relayerFee, ); expect(recipientLamportAfter - recipientLamportBefore).to.equal( Number(gasAmount), @@ -2565,7 +2565,7 @@ describe("Swap Layer", () => { const beneficiaryAfter = await connection.getBalance(beneficiary.publicKey); expect(recipientAfter).to.equal( - recipientBefore + message.deposit!.header.amount, + recipientBefore + message.deposit!.message.amount, ); expect(beneficiaryAfter).to.be.greaterThan(beneficiaryBefore); }); @@ -2613,7 +2613,7 @@ describe("Swap Layer", () => { const beneficiaryAfter = await connection.getBalance(beneficiary.publicKey); expect(recipientAfter).to.equal( - recipientBefore + message.deposit!.header.amount, + recipientBefore + message.deposit!.message.amount, ); expect(beneficiaryAfter).to.be.greaterThan(beneficiaryBefore); }); @@ -2756,7 +2756,7 @@ describe("Swap Layer", () => { connection, stagedInboundTokenAddress, ); - expect(balanceAfter).to.equal(message.deposit!.header.amount); + expect(balanceAfter).to.equal(message.deposit!.message.amount); // State check. const stagedInboundData = await swapLayer.fetchStagedInbound(stagedInbound); @@ -2883,26 +2883,22 @@ async function createAndRedeemCctpFillForTest( ); const message = new LiquidityLayerMessage({ - deposit: new LiquidityLayerDeposit( - { - tokenAddress: toUniversalAddress(burnMessage.burnTokenAddress), - amount, - sourceCctpDomain, - destinationCctpDomain, - cctpNonce, - burnSource: toUniversalAddress(burnSource), - mintRecipient: toUniversalAddress(encodedMintRecipient), - payload: new Uint8Array(), - }, - { - fill: { - sourceChain: toChain(foreignChain), - orderSender: toUniversalAddress(orderSender), - redeemer: toUniversalAddress(redeemer.toBuffer()), - redeemerMessage: Buffer.from(redeemerMessage), - }, + deposit: new LiquidityLayerDeposit({ + tokenAddress: toUniversalAddress(burnMessage.burnTokenAddress), + amount, + sourceCctpDomain, + destinationCctpDomain, + cctpNonce, + burnSource: toUniversalAddress(burnSource), + mintRecipient: toUniversalAddress(encodedMintRecipient), + payload: { + id: 1, + sourceChain: toChain(foreignChain), + orderSender: toUniversalAddress(orderSender), + redeemer: toUniversalAddress(redeemer.toBuffer()), + redeemerMessage: Buffer.from(redeemerMessage), }, - ), + }), }); const vaa = await postLiquidityLayerVaa( diff --git a/solana/ts/tests/10__jupiterTest.ts b/solana/ts/tests/10__jupiterTest.ts index 6c103cce..ffa00e54 100644 --- a/solana/ts/tests/10__jupiterTest.ts +++ b/solana/ts/tests/10__jupiterTest.ts @@ -892,23 +892,18 @@ describe("Jupiter V6 Testing", () => { await craftCctpTokenBurnMessage(sourceCctpDomain, cctpNonce, amount); const finalizedMessage = new LiquidityLayerMessage({ - deposit: new LiquidityLayerDeposit( - { - tokenAddress: toUniversalAddress(burnMessage.burnTokenAddress), - amount, - sourceCctpDomain, - destinationCctpDomain, - cctpNonce, - burnSource: toUniversalAddress(Buffer.alloc(32, "beefdead", "hex")), - mintRecipient: toUniversalAddress( - matchingEngine.cctpMintRecipientAddress().toBuffer(), - ), - payload: new Uint8Array(), - }, - { - slowOrderResponse, - }, - ), + deposit: new LiquidityLayerDeposit({ + tokenAddress: toUniversalAddress(burnMessage.burnTokenAddress), + amount, + sourceCctpDomain, + destinationCctpDomain, + cctpNonce, + burnSource: toUniversalAddress(Buffer.alloc(32, "beefdead", "hex")), + mintRecipient: toUniversalAddress( + matchingEngine.cctpMintRecipientAddress().toBuffer(), + ), + payload: { id: 2, ...slowOrderResponse }, + }), }); const finalizedVaa = await postLiquidityLayerVaa( From 4f9deaded1134eae70811b795f85902c13e9b87d Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Tue, 21 May 2024 09:52:35 -0500 Subject: [PATCH 08/50] solana: staged outbound (#30) * solana: remove * solana: several things * refactor * add usdc direct handling (needs testing) * staged outbound and initiate swap WIP * solana: fix stage outbound; add tests * solana: simplify staging; add is_native * solana: add peer bump to account * solana: fix encoded output token * solana: add usc refund token * solana: add initialize transfer new (untested) * solana: fix cargo tests * solana: add check * fix package-lock.json * solana: prepared order PDA; add some tests * fix .gitmodules * solana: yolo initialize swap exact in * solana: add delegated amount check * fix Makefile * solana: fix comments --------- Co-authored-by: A5 Pickle --- .gitmodules | 2 +- Makefile | 2 +- package-lock.json | 5 +- solana/a.json | 131 -- solana/b.json | 131 -- solana/migrations/deploy.ts | 12 - .../programs/swap-layer/src/composite/mod.rs | 253 +++- solana/programs/swap-layer/src/error.rs | 16 + solana/programs/swap-layer/src/lib.rs | 27 +- .../src/processor/admin/peer/add.rs | 2 +- .../src/processor/admin/peer/mod.rs | 38 +- .../src/processor/admin/peer/update.rs | 4 +- .../src/processor/complete/other/direct.rs | 303 ++--- .../swap-layer/src/processor/initiate/mod.rs | 6 + .../src/processor/initiate/swap/exact_in.rs | 301 +++++ .../src/processor/initiate/swap/mod.rs | 2 + .../src/processor/initiate/transfer.rs | 193 +++ .../swap-layer/src/processor/initiate/usdc.rs | 18 +- .../programs/swap-layer/src/processor/mod.rs | 3 + .../src/processor/stage_outbound.rs | 290 +++++ solana/programs/swap-layer/src/state/mod.rs | 4 +- solana/programs/swap-layer/src/state/peer.rs | 15 +- .../{staged_inbound.rs => staged/inbound.rs} | 0 .../swap-layer/src/state/staged/mod.rs | 5 + .../swap-layer/src/state/staged/outbound.rs | 96 ++ .../swap-layer/src/utils/jupiter_v6/mod.rs | 87 +- solana/programs/swap-layer/src/utils/mod.rs | 7 + .../swap-layer/src/utils/relayer_fees.rs | 85 +- solana/ts/src/swapLayer/index.ts | 222 +++- solana/ts/src/swapLayer/state/Peer.ts | 11 +- .../ts/src/swapLayer/state/StagedOutbound.ts | 39 + solana/ts/src/swapLayer/state/index.ts | 1 + solana/ts/tests/01__swapLayer.ts | 1158 +++++++++++------ solana/ts/tests/10__jupiterTest.ts | 2 +- solana/ts/tests/helpers/utils.ts | 5 - 35 files changed, 2342 insertions(+), 1134 deletions(-) delete mode 100644 solana/a.json delete mode 100644 solana/b.json delete mode 100644 solana/migrations/deploy.ts create mode 100644 solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs create mode 100644 solana/programs/swap-layer/src/processor/initiate/swap/mod.rs create mode 100644 solana/programs/swap-layer/src/processor/initiate/transfer.rs create mode 100644 solana/programs/swap-layer/src/processor/stage_outbound.rs rename solana/programs/swap-layer/src/state/{staged_inbound.rs => staged/inbound.rs} (100%) create mode 100644 solana/programs/swap-layer/src/state/staged/mod.rs create mode 100644 solana/programs/swap-layer/src/state/staged/outbound.rs create mode 100644 solana/ts/src/swapLayer/state/StagedOutbound.ts diff --git a/.gitmodules b/.gitmodules index 27cebd2f..b13e9aa8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "lib/example-liquidity-layer"] path = lib/example-liquidity-layer url = https://github.com/wormhole-foundation/example-liquidity-layer.git - rev = 68ba4e5ea8743e1173e70203b572ebd4f5e4b00c + rev = 13f07732f5dde13006d1884cc9a2f7019759905f diff --git a/Makefile b/Makefile index 5c9e3506..f95b4001 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ clean: .PHONY: fast-transfer-sync fast-transfer-sync: - git submodule update --remote + git submodule update --checkout git submodule sync --recursive .PHONY: fast-transfer-clean diff --git a/package-lock.json b/package-lock.json index 338d10d8..58d9f71a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4457,8 +4457,7 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-definitions": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", - "integrity": "sha512-9QcRfF4CLQVanW/FWYfW/Uetclb4fjxKzXeRhnvSFwgLS+3qqq9p55WYxywy0W+bvdCvNuafSJ311cPI15URgA==", - "license": "Apache-2.0", + "integrity": "sha512-qoV+IXNvir79vpjS2VcQZkfwVz4YoKaX+yz6evbspzD3bddJpRDxk16dYh4cQUpeQIRTCUYWAt3ojKdFXnCbbQ==", "dependencies": { "@wormhole-foundation/sdk": "^0.7.0-beta.3" } @@ -4466,7 +4465,7 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "integrity": "sha512-v/P32Tv5oFlVs+ejDP+mTXibcpPe4FW6o1ZMSwFKyMhSD0+YYKk/7PlC6teeBT373hbDpxSV60xgbE7mAT+eZw==", + "integrity": "sha512-CyZshOfX+p3EioCPjuCfpLb0+FohPFpohcFPFlSbR5KILCynTHk8SdXGyn2tgkZMJynj6+Boiywkm6Tsx81yyg==", "dependencies": { "@certusone/wormhole-spydk": "^0.0.1", "@coral-xyz/anchor": "^0.30.0", diff --git a/solana/a.json b/solana/a.json deleted file mode 100644 index a1b92795..00000000 --- a/solana/a.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", - "accounts": [ - { - "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "GGztQqQ6pCPaJQnNpXBgELr5cs3WwDakRbh1iEMzjgSJ", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "21TrZtZnFU1rEvmiKTNSdZz7voe8kRZL7KX3pEGe7rS2", - "isSigner": true, - "isWritable": false - }, - { - "pubkey": "CyBqVej3Bq73UGdaYv2BMNLeRhfv2nkUSy2KA4Tc5WtE", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "DVCeozFGbe6ew3eWTnZByjHeYqTq1cvbrB7JJhkLxaRJ", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "HkphEpUqnFBxBuCPEq5j1HA9L8EwmsmRT6UcFKziptM1", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "BGNHoqiqB4oM7caZvDUKqC2JMfjXA8MnxeeaGrHdJ5xP", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "GGztQqQ6pCPaJQnNpXBgELr5cs3WwDakRbh1iEMzjgSJ", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "4fuUiYxTQ6QCrdSq9ouBYcTM7bqSwYTSyLueGZLTy4T4", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "DVCeozFGbe6ew3eWTnZByjHeYqTq1cvbrB7JJhkLxaRJ", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "4oY1eVHJrt7ywuFoQnAZwto4qcQip1QhYMAhD11PU4QL", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "HkphEpUqnFBxBuCPEq5j1HA9L8EwmsmRT6UcFKziptM1", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "4dSG9tKHZR4CAictyEnH9XuGZyKapodWXq5xyg7uFwE9", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "8kZSTVuV7C4GD9ZVR4wDtRSXv1SvsSQPfqUbthueRNGV", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "2B48L1ACPvVb67UKeSMkUGdzrnhvNMm6pFt2nspGKxs4", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "BMGfBaW69aUm6hRdmsfAcNEmAW59C2rWJ9EX7gWnrVN9", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "3NxDBWt55DZnEwwQ2bhQ3xWG8Jd18TdUXAG4Zdr7jDai", - "isSigner": false, - "isWritable": false - } - ], - "data": "wSCbM0HWnIEAAQAAABEBZAABAHQ7pAsAAACbnbOiCwAAADIAAA==" -} diff --git a/solana/b.json b/solana/b.json deleted file mode 100644 index ca99a718..00000000 --- a/solana/b.json +++ /dev/null @@ -1,131 +0,0 @@ -{ - "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", - "accounts": [ - { - "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "GGztQqQ6pCPaJQnNpXBgELr5cs3WwDakRbh1iEMzjgSJ", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "21TrZtZnFU1rEvmiKTNSdZz7voe8kRZL7KX3pEGe7rS2", - "isSigner": true, - "isWritable": false - }, - { - "pubkey": "BGNHoqiqB4oM7caZvDUKqC2JMfjXA8MnxeeaGrHdJ5xP", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "HkphEpUqnFBxBuCPEq5j1HA9L8EwmsmRT6UcFKziptM1", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "DVCeozFGbe6ew3eWTnZByjHeYqTq1cvbrB7JJhkLxaRJ", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "CyBqVej3Bq73UGdaYv2BMNLeRhfv2nkUSy2KA4Tc5WtE", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "GGztQqQ6pCPaJQnNpXBgELr5cs3WwDakRbh1iEMzjgSJ", - "isSigner": false, - "isWritable": false - }, - { - "pubkey": "4fuUiYxTQ6QCrdSq9ouBYcTM7bqSwYTSyLueGZLTy4T4", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "DVCeozFGbe6ew3eWTnZByjHeYqTq1cvbrB7JJhkLxaRJ", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "4oY1eVHJrt7ywuFoQnAZwto4qcQip1QhYMAhD11PU4QL", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "HkphEpUqnFBxBuCPEq5j1HA9L8EwmsmRT6UcFKziptM1", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "4dSG9tKHZR4CAictyEnH9XuGZyKapodWXq5xyg7uFwE9", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "8kZSTVuV7C4GD9ZVR4wDtRSXv1SvsSQPfqUbthueRNGV", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "FqFkv2xNNCUyx1RYV61pGZ9AMzGfgcD8uXC9zCF5JKnR", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "A7sdy3NoAZp49cQNpreMGARAb9QJjYrrSyDALhThgk3D", - "isSigner": false, - "isWritable": true - }, - { - "pubkey": "3NxDBWt55DZnEwwQ2bhQ3xWG8Jd18TdUXAG4Zdr7jDai", - "isSigner": false, - "isWritable": false - } - ], - "data": "wSCbM0HWnIEAAQAAABEAZAABAHQ7pAsAAAB29CSlCwAAADIAAA==" -} diff --git a/solana/migrations/deploy.ts b/solana/migrations/deploy.ts deleted file mode 100644 index 82fb175f..00000000 --- a/solana/migrations/deploy.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Migrations are an early feature. Currently, they're nothing more than this -// single deploy script that's invoked from the CLI, injecting a provider -// configured from the workspace's Anchor.toml. - -const anchor = require("@coral-xyz/anchor"); - -module.exports = async function (provider) { - // Configure client to use the provider. - anchor.setProvider(provider); - - // Add your deploy script here. -}; diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs index 0e6eb008..4b2adebf 100644 --- a/solana/programs/swap-layer/src/composite/mod.rs +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -1,6 +1,13 @@ use std::ops::Deref; -use crate::{error::SwapLayerError, state::Custodian, state::Peer}; +use crate::{ + error::SwapLayerError, + state::{Custodian, Peer}, + utils::{ + jupiter_v6::{self, cpi::SharedAccountsRouteArgs, JUPITER_V6_PROGRAM_ID}, + AnchorInstructionData, + }, +}; use anchor_lang::prelude::*; use anchor_spl::{associated_token, token}; use common::{ @@ -13,7 +20,7 @@ use common::{ }; use swap_layer_messages::{ messages::SwapMessageV1, - types::{OutputToken, SwapType}, + types::{OutputSwap, OutputToken, RedeemMode, SwapType}, }; use token_router::state::PreparedFill; @@ -139,9 +146,9 @@ pub struct RegisteredPeer<'info> { #[account( seeds = [ Peer::SEED_PREFIX, - &peer.chain.to_be_bytes() + &peer.seeds.chain.to_be_bytes() ], - bump, + bump = peer.seeds.bump, )] peer: Box>, } @@ -166,7 +173,7 @@ pub struct ConsumeSwapLayerFill<'info> { .map_err(|_| SwapLayerError::InvalidSwapMessage)?; require_eq!( - associated_peer.chain, + associated_peer.seeds.chain, fill.source_chain, SwapLayerError::InvalidPeer, ); @@ -247,44 +254,63 @@ impl<'info> Deref for ConsumeSwapLayerFill<'info> { #[derive(Accounts)] pub struct CompleteSwap<'info> { #[account(mut)] - payer: Signer<'info>, + pub payer: Signer<'info>, #[account( constraint = { let swap_msg = consume_swap_layer_fill.read_message_unchecked(); - // Ensure that the output token is a swap token for Jupiter V6. + // Ensure that the output token is a swap token for Jupiter V6. If swap is not encoded, + // we allow the recipient to perform the swap himself in a direct transfer. + // + // NOTE: The recipient must be equal to the payer if OutputToken::Usdc! This check is + // not performed here, but should be performed with the account context composing with + // this composite. let (expected_dst_mint, swap) = match &swap_msg.output_token { - OutputToken::Gas(swap) => (token::spl_token::native_mint::id(), swap), - OutputToken::Other { address, swap } => (Pubkey::from(*address), swap), - _ => return err!(SwapLayerError::InvalidOutputToken), + OutputToken::Usdc => { + require!( + matches!(swap_msg.redeem_mode, RedeemMode::Direct), + SwapLayerError::InvalidRedeemMode, + ); + + (Default::default(), None) + }, + OutputToken::Gas(swap) => (token::spl_token::native_mint::id(), swap.into()), + OutputToken::Other { address, swap } => (Pubkey::from(*address), swap.into()), }; - require!( - matches!(swap.swap_type, SwapType::JupiterV6(_)), - SwapLayerError::InvalidSwapType, - ); - - // Verify the address matches the destination mint. - require_keys_eq!( - dst_mint.key(), - expected_dst_mint, - SwapLayerError::InvalidDestinationMint - ); - - // Check the deadline for the swap. There may not be a deadline check with the - // dex that this instruction composes with, so we will check it here. - // - // TODO: Do we accept deadline == 0? - require!( - swap.deadline == 0 - || Clock::get().unwrap().unix_timestamp <= i64::from(swap.deadline), - SwapLayerError::SwapPastDeadline, - ); - - // Just in case the encoded limit amount exceeds u64, we have nothing to do if - // this message were misconfigured. - u64::try_from(swap.limit_amount).map_err(|_| SwapLayerError::InvalidLimitAmount)?; + if let Some(swap) = swap { + // Verify the address matches the destination mint. + require_keys_eq!( + dst_mint.key(), + expected_dst_mint, + SwapLayerError::InvalidDestinationMint + ); + + let OutputSwap { + limit_amount, + deadline, + swap_type, + } = swap; + + require!( + matches!(swap_type, SwapType::JupiterV6(_)), + SwapLayerError::InvalidSwapType, + ); + + // Check the deadline for the swap. There may not be a deadline check with the + // dex that this instruction composes with, so we will check it here. + // + // TODO: Do we accept deadline == 0? + require!( + *deadline == 0 || Clock::get().unwrap().unix_timestamp <= i64::from(*deadline), + SwapLayerError::SwapPastDeadline, + ); + + // Just in case the encoded limit amount exceeds u64, we have nothing to do if + // this message were misconfigured. + u64::try_from(*limit_amount).map_err(|_| SwapLayerError::InvalidLimitAmount)?; + } true } @@ -306,7 +332,7 @@ pub struct CompleteSwap<'info> { #[account( init_if_needed, payer = payer, - associated_token::mint = src_mint, + associated_token::mint = usdc, associated_token::authority = authority )] pub src_swap_token: Box>, @@ -322,10 +348,10 @@ pub struct CompleteSwap<'info> { pub dst_swap_token: Box>, /// This account must be verified as the source mint for the swap. - pub src_mint: Box>, + pub usdc: Usdc<'info>, /// This account must be verified as the destination mint for the swap. - #[account(constraint = src_mint.key() != dst_mint.key() @ SwapLayerError::SameMint)] + #[account(constraint = usdc.key() != dst_mint.key() @ SwapLayerError::SameMint)] pub dst_mint: Box>, pub token_program: Program<'info, token::Token>, @@ -391,20 +417,137 @@ impl<'info> Deref for CompleteSwap<'info> { } } -// fn require_jupiter_v6_output_swap(swap: &OutputSwap) -> Result<()> { -// // Check the deadline for the swap. There may not be a deadline check with the -// // dex that this instruction composes with, so we will check it here. -// // -// // TODO: Do we accept deadline == 0? -// require!( -// swap.deadline == 0 || Clock::get().unwrap().unix_timestamp <= i64::from(swap.deadline), -// SwapLayerError::SwapPastDeadline, -// ); - -// // Just in case the encoded limit amount exceeds u64, we have nothing to do if -// // this message were misconfigured. -// u64::try_from(swap.limit_amount).map_err(|_| SwapLayerError::InvalidLimitAmount)?; - -// // Done. -// Ok(()) -// } +//////////////////////////////////////////////////////////////////////////////////////////////////// +// +// Jupiter V6 handling. +// +//////////////////////////////////////////////////////////////////////////////////////////////////// + +#[derive(Accounts)] +#[instruction(args: SharedAccountsRouteArgs)] +pub struct JupiterV6SharedAccountsRoute<'info> { + pub token_program: Program<'info, token::Token>, + + /// We can lean on Jupiter V6 CPI failing if this is not valid. But we are + /// being extra sure about the authority. Per Jupiter's documentation, there + /// are only 8 authorities. + /// + /// CHECK: Seeds must be \["authority", id\] (Jupiter V6 Program). + #[account( + seeds = [ + b"authority", + &[args.authority_id], + ], + bump, + seeds::program = jupiter_v6_program, + constraint = { + require!( + args.authority_id <= jupiter_v6::AUTHORITY_COUNT, + SwapLayerError::InvalidJupiterV6AuthorityId, + ); + + true + } + )] + pub jupiter_v6_authority: UncheckedAccount<'info>, + + /// CHECK: This account will be the Swap Layer's swap authority. + pub transfer_authority: UncheckedAccount<'info>, + + /// CHECK: This account will be the Swap Layer's source token account. + #[account(mut)] + pub src_custody_token: UncheckedAccount<'info>, + + #[account( + mut, + associated_token::mint = src_mint, + associated_token::authority = jupiter_v6_authority, + )] + pub jupiter_v6_src_custody_token: Box>, + + #[account( + mut, + associated_token::mint = dst_mint, + associated_token::authority = jupiter_v6_authority, + )] + pub jupiter_v6_dst_custody_token: Box>, + + /// CHECK: This account will be the Swap Layer's destination token account. + #[account(mut)] + pub dst_custody_token: UncheckedAccount<'info>, + + /// CHECK: This account must be the source mint for the swap. + pub src_mint: UncheckedAccount<'info>, + + /// CHECK: This account must be the destination mint for the swap. + pub dst_mint: UncheckedAccount<'info>, + + /// CHECK: This is an optional account, which we will enforce to be None (so it will be passed + /// in as the Jupiter V6 program ID) because Swap Layer will not collect platform fees. + #[account(address = jupiter_v6::JUPITER_V6_PROGRAM_ID)] + pub platform_fee_none: UncheckedAccount<'info>, + + /// CHECK: Token 2022 program is optional. + pub token_2022_program: UncheckedAccount<'info>, + + /// CHECK: Seeds must be \["__event_authority"\] (Jupiter V6 Program). + pub jupiter_v6_event_authority: UncheckedAccount<'info>, + + /// CHECK: Must equal Jupiter V6 Program ID. + #[account(address = jupiter_v6::JUPITER_V6_PROGRAM_ID)] + pub jupiter_v6_program: UncheckedAccount<'info>, +} + +impl<'info> JupiterV6SharedAccountsRoute<'info> { + pub fn set_up( + mut cpi_account_infos: &'info [AccountInfo<'info>], + ix_data: &[u8], + ) -> Result<(Self, SharedAccountsRouteArgs, Vec>)> { + // Deserialize Jupiter V6 shared accounts route args. + let args = AnchorInstructionData::deserialize_checked(ix_data)?; + + // Now try account infos. + let accounts = JupiterV6SharedAccountsRoute::try_accounts( + &JUPITER_V6_PROGRAM_ID, + &mut cpi_account_infos, + &ix_data[8..], + &mut JupiterV6SharedAccountsRouteBumps { + jupiter_v6_authority: Default::default(), + }, + &mut Default::default(), + )?; + + Ok((accounts, args, cpi_account_infos.to_vec())) + } + + pub fn invoke_cpi( + &self, + args: SharedAccountsRouteArgs, + signer_seeds: &[&[u8]], + cpi_remaining_accounts: Vec>, + ) -> Result<()> { + jupiter_v6::cpi::shared_accounts_route( + CpiContext::new_with_signer( + self.jupiter_v6_program.to_account_info(), + jupiter_v6::cpi::SharedAccountsRoute { + token_program: self.token_program.to_account_info(), + program_authority: self.jupiter_v6_authority.to_account_info(), + user_transfer_authority: self.transfer_authority.to_account_info(), + source_token: self.src_custody_token.to_account_info(), + program_source_token: self.jupiter_v6_src_custody_token.to_account_info(), + program_destination_token: self.jupiter_v6_dst_custody_token.to_account_info(), + destination_account: self.dst_custody_token.to_account_info(), + source_mint: self.src_mint.to_account_info(), + destination_mint: self.dst_mint.to_account_info(), + platform_fee: Default::default(), + token_2022_program: self.token_2022_program.to_account_info().into(), + event_authority: self.jupiter_v6_event_authority.to_account_info(), + program: self.jupiter_v6_program.to_account_info(), + }, + &[signer_seeds], + ) + .with_remaining_accounts(cpi_remaining_accounts), + args, + ) + } +} diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs index e3d6a16e..2da3ec0d 100644 --- a/solana/programs/swap-layer/src/error.rs +++ b/solana/programs/swap-layer/src/error.rs @@ -1,6 +1,13 @@ #[anchor_lang::error_code] pub enum SwapLayerError { DummyError = 0x0, + ExceedsCpiAccountRealloc = 0x2, + U64Overflow = 0x4, + + // Common errors for inbound and outbound. + InvalidTargetChain = 0x20, + RelayerFeeOverflow = 0x30, + AssistantZeroPubkey = 0x100, FeeRecipientZeroPubkey = 0x101, FeeUpdaterZeroPubkey = 0x102, @@ -32,6 +39,14 @@ pub enum SwapLayerError { InvalidMargin = 0x205, EvmGasCalculationFailed = 0x206, + // Staged outbound + EitherSenderOrProgramTransferAuthority = 0x240, + SenderTokenRequired = 0x242, + SenderRequired = 0x244, + RelayingFeeExceedsMinAmountOut = 0x260, + ZeroMinAmountOut = 0x262, + DelegatedAmountMismatch = 0x264, + // Swap SwapPastDeadline = 0x300, InvalidLimitAmount = 0x302, @@ -50,6 +65,7 @@ pub enum SwapLayerError { JupiterV6DexProgramMismatch = 0x342, InvalidJupiterV6QuotedOutAmount = 0x344, SwapFailed = 0x346, + InvalidSwapInAmount = 0x348, // Ownership NoTransferOwnershipRequest = 0x400, diff --git a/solana/programs/swap-layer/src/lib.rs b/solana/programs/swap-layer/src/lib.rs index e8148485..b0a2a783 100644 --- a/solana/programs/swap-layer/src/lib.rs +++ b/solana/programs/swap-layer/src/lib.rs @@ -15,8 +15,13 @@ declare_id!("SwapLayer1111111111111111111111111111111111"); const CUSTODIAN_BUMP: u8 = 254; const COMPLETE_TOKEN_SEED_PREFIX: &[u8] = b"complete"; + const SWAP_AUTHORITY_SEED_PREFIX: &[u8] = b"swap-authority"; +const TRANSFER_AUTHORITY_SEED_PREFIX: &[u8] = b"transfer-authority"; + +const PREPARED_ORDER_SEED_PREFIX: &[u8] = b"prepared-order"; const STAGED_CUSTODY_TOKEN_SEED_PREFIX: &[u8] = b"staged-custody"; + const MAX_BPS: u32 = 1_000_000; // 10,000.00 bps (100%) #[program] @@ -115,6 +120,10 @@ pub mod swap_layer { processor::release_inbound(ctx) } + pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> Result<()> { + processor::stage_outbound(ctx, args) + } + pub fn initiate_transfer( ctx: Context, args: InitiateTransferArgs, @@ -122,13 +131,27 @@ pub mod swap_layer { processor::initiate_transfer(ctx, args) } + pub fn initiate_transfer_new(ctx: Context) -> Result<()> { + processor::initiate_transfer_new(ctx) + } + + pub fn initiate_swap_exact_in<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, InitiateSwapExactIn<'info>>, + instruction_data: Vec, + ) -> Result<()> + where + 'c: 'info, + { + processor::initiate_swap_exact_in(ctx, instruction_data) + } + pub fn complete_swap_direct<'a, 'b, 'c, 'info>( ctx: Context<'a, 'b, 'c, 'info, CompleteSwapDirect<'info>>, - ix_data: Vec, + instruction_data: Vec, ) -> Result<()> where 'c: 'info, { - processor::complete_swap_direct(ctx, ix_data) + processor::complete_swap_direct(ctx, instruction_data) } } diff --git a/solana/programs/swap-layer/src/processor/admin/peer/add.rs b/solana/programs/swap-layer/src/processor/admin/peer/add.rs index 58cdf646..ef92067d 100644 --- a/solana/programs/swap-layer/src/processor/admin/peer/add.rs +++ b/solana/programs/swap-layer/src/processor/admin/peer/add.rs @@ -35,5 +35,5 @@ pub struct AddPeerArgs { } pub fn add_peer(ctx: Context, args: AddPeerArgs) -> Result<()> { - crate::handle_add_peer(&mut ctx.accounts.peer, args) + crate::handle_add_peer(&mut ctx.accounts.peer, args, ctx.bumps.peer.into()) } diff --git a/solana/programs/swap-layer/src/processor/admin/peer/mod.rs b/solana/programs/swap-layer/src/processor/admin/peer/mod.rs index 7eb46e15..c68032d4 100644 --- a/solana/programs/swap-layer/src/processor/admin/peer/mod.rs +++ b/solana/programs/swap-layer/src/processor/admin/peer/mod.rs @@ -4,12 +4,19 @@ pub use add::*; mod update; pub use update::*; -use crate::utils::relay_parameters::verify_relay_params; -use crate::{error::SwapLayerError, state::Peer}; +use crate::{ + error::SwapLayerError, + state::{Peer, PeerSeeds}, + utils::relay_parameters::verify_relay_params, +}; use anchor_lang::prelude::*; use common::wormhole_cctp_solana::wormhole::SOLANA_CHAIN; -pub fn handle_add_peer(peer: &mut Account, args: AddPeerArgs) -> Result<()> { +pub fn handle_add_peer( + peer: &mut Account, + args: AddPeerArgs, + bump_seed: Option, +) -> Result<()> { require!( args.chain != 0 && args.chain != SOLANA_CHAIN, SwapLayerError::ChainNotAllowed @@ -19,9 +26,28 @@ pub fn handle_add_peer(peer: &mut Account, args: AddPeerArgs) -> Result<() // Verify the relay parameters. verify_relay_params(&args.relay_params)?; - peer.chain = args.chain; - peer.address = args.address; - peer.relay_params = args.relay_params; + let AddPeerArgs { + chain, + address, + relay_params, + } = args; + + let seeds = PeerSeeds { + chain, + bump: bump_seed.unwrap_or(peer.seeds.bump), + }; + let expected = Pubkey::create_program_address( + &[Peer::SEED_PREFIX, &seeds.chain.to_be_bytes(), &[seeds.bump]], + &crate::id(), + ) + .map_err(|_| ErrorCode::ConstraintSeeds)?; + require_keys_eq!(peer.key(), expected, ErrorCode::ConstraintSeeds); + + peer.set_inner(Peer { + seeds, + address, + relay_params, + }); Ok(()) } diff --git a/solana/programs/swap-layer/src/processor/admin/peer/update.rs b/solana/programs/swap-layer/src/processor/admin/peer/update.rs index 1a300b07..7ceecc9d 100644 --- a/solana/programs/swap-layer/src/processor/admin/peer/update.rs +++ b/solana/programs/swap-layer/src/processor/admin/peer/update.rs @@ -12,11 +12,11 @@ pub struct UpdatePeer<'info> { Peer::SEED_PREFIX, &args.chain.to_be_bytes() ], - bump, + bump = peer.seeds.bump, )] peer: Account<'info, Peer>, } pub fn update_peer(ctx: Context, args: crate::AddPeerArgs) -> Result<()> { - crate::handle_add_peer(&mut ctx.accounts.peer, args) + crate::handle_add_peer(&mut ctx.accounts.peer, args, None) } diff --git a/solana/programs/swap-layer/src/processor/complete/other/direct.rs b/solana/programs/swap-layer/src/processor/complete/other/direct.rs index 8915b955..6988ee8b 100644 --- a/solana/programs/swap-layer/src/processor/complete/other/direct.rs +++ b/solana/programs/swap-layer/src/processor/complete/other/direct.rs @@ -1,11 +1,4 @@ -use crate::{ - composite::*, - error::SwapLayerError, - utils::{ - jupiter_v6::{self, cpi::SharedAccountsRouteArgs}, - AnchorInstructionData, - }, -}; +use crate::{composite::*, error::SwapLayerError, utils}; use anchor_lang::prelude::*; use anchor_spl::{associated_token, token}; use swap_layer_messages::{ @@ -15,17 +8,6 @@ use swap_layer_messages::{ #[derive(Accounts)] pub struct CompleteSwapDirect<'info> { - #[account( - constraint = { - require_keys_eq!( - complete_swap.src_mint.key(), - common::USDC_MINT, - SwapLayerError::InvalidSourceMint - ); - - true - } - )] complete_swap: CompleteSwap<'info>, #[account( @@ -52,7 +34,7 @@ pub struct CompleteSwapDirect<'info> { pub fn complete_swap_direct<'a, 'b, 'c, 'info>( ctx: Context<'a, 'b, 'c, 'info, CompleteSwapDirect<'info>>, - ix_data: Vec, + instruction_data: Vec, ) -> Result<()> where 'c: 'info, @@ -71,15 +53,30 @@ where match redeem_mode { RedeemMode::Direct => match output_token { + OutputToken::Usdc => { + // In this case, we require that the signer of the instruction (the payer) is the + // recipient himself. + require_keys_eq!( + ctx.accounts.complete_swap.payer.key(), + ctx.accounts.recipient.key(), + SwapLayerError::InvalidRecipient + ); + + handle_complete_swap_direct_jup_v6( + ctx, + instruction_data, + Default::default(), + Default::default(), + ) + } OutputToken::Gas(OutputSwap { deadline: _, limit_amount, swap_type: SwapType::JupiterV6(swap_params), - }) => handle_complete_swap_direct_jupiter_v6( + }) => handle_complete_swap_direct_jup_v6( ctx, - ix_data, - limit_amount.try_into().unwrap(), - swap_params, + instruction_data, + (limit_amount.try_into().unwrap(), swap_params).into(), true, ), OutputToken::Other { @@ -90,11 +87,10 @@ where limit_amount, swap_type: SwapType::JupiterV6(swap_params), }, - } => handle_complete_swap_direct_jupiter_v6( + } => handle_complete_swap_direct_jup_v6( ctx, - ix_data, - limit_amount.try_into().unwrap(), - swap_params, + instruction_data, + (limit_amount.try_into().unwrap(), swap_params).into(), false, ), _ => err!(SwapLayerError::InvalidOutputToken), @@ -103,12 +99,11 @@ where } } -pub fn handle_complete_swap_direct_jupiter_v6<'a, 'b, 'c, 'info>( +pub fn handle_complete_swap_direct_jup_v6<'a, 'b, 'c, 'info>( ctx: Context<'a, 'b, 'c, 'info, CompleteSwapDirect<'info>>, ix_data: Vec, - limit_amount: u64, - swap_params: JupiterV6SwapParameters, - unwrap_native: bool, + limit_and_params: Option<(u64, JupiterV6SwapParameters)>, + is_native: bool, ) -> Result<()> where 'c: 'info, @@ -117,7 +112,6 @@ where let in_amount = ctx.accounts.complete_swap.consume_prepared_fill()?; let swap_authority = &ctx.accounts.complete_swap.authority; - let src_swap_token = &ctx.accounts.complete_swap.src_swap_token; let prepared_fill_key = &ctx.accounts.complete_swap.prepared_fill_key(); let swap_authority_seeds = &[ @@ -126,127 +120,94 @@ where &[ctx.bumps.complete_swap.authority], ]; - { - // Handle Jupiter V6 swap. - let ix_data = &mut &ix_data[..]; - - // Peel off the instruction selector and check that it matches what we expect. - SharedAccountsRouteArgs::require_selector(ix_data)?; - - // Try taking remaining account infos as shared accounts route accounts. - let mut cpi_account_infos = ctx.remaining_accounts; - let CheckedSharedAccountsRoute { - token_program, - jupiter_v6_authority, - transfer_authority, - src_custody_token, - jupiter_v6_src_custody_token, - jupiter_v6_dst_custody_token, - dst_custody_token, - src_mint, - dst_mint, - platform_fee_none: _, - token_2022_program, - jupiter_v6_event_authority, - jupiter_v6_program, - } = CheckedSharedAccountsRoute::try_accounts( - &jupiter_v6::JUPITER_V6_PROGRAM_ID, - &mut cpi_account_infos, - ix_data, - &mut CheckedSharedAccountsRouteBumps { - jupiter_v6_authority: Default::default(), - }, - &mut Default::default(), - )?; - - // Deserialize Jupiter V6 shared accounts route args. - let mut jupiter_args = SharedAccountsRouteArgs::deserialize(ix_data)?; + // Handle Jupiter V6 swap. + let limit_amount = { + let (shared_accounts_route, mut swap_args, cpi_remaining_accounts) = + JupiterV6SharedAccountsRoute::set_up(ctx.remaining_accounts, &ix_data[..])?; // Verify remaining accounts. - let dst_swap_token = &ctx.accounts.complete_swap.dst_swap_token; { require_keys_eq!( - transfer_authority.key(), + shared_accounts_route.transfer_authority.key(), swap_authority.key(), SwapLayerError::InvalidSwapAuthority ); require_keys_eq!( - src_custody_token.key(), - src_swap_token.key(), + shared_accounts_route.src_custody_token.key(), + ctx.accounts.complete_swap.src_swap_token.key(), SwapLayerError::InvalidSourceSwapToken ); require_keys_eq!( - dst_custody_token.key(), - dst_swap_token.key(), + shared_accounts_route.dst_custody_token.key(), + ctx.accounts.complete_swap.dst_swap_token.key(), SwapLayerError::InvalidDestinationSwapToken ); require_keys_eq!( - src_mint.key(), + shared_accounts_route.src_mint.key(), common::USDC_MINT, SwapLayerError::InvalidSourceMint ); require_keys_eq!( - dst_mint.key(), + shared_accounts_route.dst_mint.key(), ctx.accounts.complete_swap.dst_mint.key(), SwapLayerError::InvalidDestinationMint ); } - // Replace the in amount with the one found in the prepared custody token account. - msg!( - "Override in_amount: {}, quoted_out_amount: {}, slippage: {}", - jupiter_args.in_amount, - jupiter_args.quoted_out_amount, - jupiter_args.slippage_bps - ); - jupiter_args.in_amount = in_amount; - - // This is perverse, but we are performing a balance check after the swap to see if we get - // the desired amount. If we don't, revert. - jupiter_args.quoted_out_amount = limit_amount; - jupiter_args.slippage_bps = 0; - - // Peek into the head of remaining accounts. This account will be the dex program that Jupiter - // V6 interacts with. If the swap params specify a specific dex program, we need to ensure that - // the one passed into this instruction handler is that. - if let Some(dex_program_id) = swap_params.dex_program_id { - require_eq!( - jupiter_args.route_plan.len(), - 1, - SwapLayerError::NotJupiterV6DirectRoute - ); - require_keys_eq!( - cpi_account_infos[0].key(), - Pubkey::from(dex_program_id), - SwapLayerError::JupiterV6DexProgramMismatch - ); - } + let limit_amount = match limit_and_params { + // If the limit amount is some value (meaning that the OutputToken is Gas or Other), we + // will override the instruction arguments with the limit amount and slippage == 0 bps. + // Otherwise we will compute the limit amount using the given swap args. + Some((limit_amount, swap_params)) => { + msg!( + "Override in_amount: {}, quoted_out_amount: {}, slippage_bps: {}", + swap_args.in_amount, + swap_args.quoted_out_amount, + swap_args.slippage_bps + ); + swap_args.in_amount = in_amount; + swap_args.quoted_out_amount = limit_amount; + swap_args.slippage_bps = 0; + + // Peek into the head of remaining accounts. This account will be the dex program that Jupiter + // V6 interacts with. If the swap params specify a specific dex program, we need to ensure that + // the one passed into this instruction handler is that. + if let Some(dex_program_id) = swap_params.dex_program_id { + require_eq!( + swap_args.route_plan.len(), + 1, + SwapLayerError::NotJupiterV6DirectRoute + ); + require_keys_eq!( + cpi_remaining_accounts[0].key(), + Pubkey::from(dex_program_id), + SwapLayerError::JupiterV6DexProgramMismatch + ); + } + + limit_amount + } + None => { + // Fetched swap args should have the same in amount as the prepared (fast) fill. + require_eq!( + swap_args.in_amount, + in_amount, + SwapLayerError::InvalidSwapInAmount + ); + + utils::jupiter_v6::compute_min_amount_out(&swap_args) + } + }; // Execute swap. - jupiter_v6::cpi::shared_accounts_route( - CpiContext::new_with_signer( - jupiter_v6_program.to_account_info(), - jupiter_v6::cpi::SharedAccountsRoute { - token_program: token_program.to_account_info(), - program_authority: jupiter_v6_authority.to_account_info(), - user_transfer_authority: swap_authority.to_account_info(), - source_token: src_swap_token.to_account_info(), - program_source_token: jupiter_v6_src_custody_token.to_account_info(), - program_destination_token: jupiter_v6_dst_custody_token.to_account_info(), - destination_account: dst_swap_token.to_account_info(), - source_mint: src_mint.to_account_info(), - destination_mint: dst_mint.to_account_info(), - platform_fee: Default::default(), - token_2022_program: token_2022_program.to_account_info().into(), - event_authority: jupiter_v6_event_authority.to_account_info(), - program: jupiter_v6_program.to_account_info(), - }, - &[swap_authority_seeds], - ) - .with_remaining_accounts(cpi_account_infos.to_vec()), - jupiter_args, + shared_accounts_route.invoke_cpi( + swap_args, + swap_authority_seeds, + cpi_remaining_accounts, )?; - } + + limit_amount + }; // After the swap, we reload the destination token account to get the correct amount. ctx.accounts.complete_swap.dst_swap_token.reload()?; @@ -262,7 +223,8 @@ where let recipient = &ctx.accounts.recipient; - if !unwrap_native { + // We perform a token transfer if the output token is not gas. + if !is_native { // Verify that the encoded owner is the actual owner. ATAs are no different from other token // accounts, so anyone can set the authority of an ATA to be someone else. { @@ -291,89 +253,10 @@ where )?; } + // NOTE: If the output token is gas, lamports reflecting the WSOL amount will be transferred to + // the recipient's account. ctx.accounts.complete_swap.close_swap_accounts( &ctx.bumps.complete_swap, ctx.accounts.recipient.to_account_info(), ) } - -//////////////////////////////////////////////////////////////////////////////////////////////////// -// -// Jupiter V6 handling. -// -//////////////////////////////////////////////////////////////////////////////////////////////////// - -#[derive(Accounts)] -#[instruction(args: SharedAccountsRouteArgs)] -pub struct CheckedSharedAccountsRoute<'info> { - token_program: Program<'info, token::Token>, - - /// We can lean on Jupiter V6 CPI failing if this is not valid. But we are - /// being extra sure about the authority. Per Jupiter's documentation, there - /// are only 8 authorities. - /// - /// CHECK: Seeds must be \["authority", id\] (Jupiter V6 Program). - #[account( - seeds = [ - b"authority", - &[args.authority_id], - ], - bump, - seeds::program = jupiter_v6_program, - constraint = { - require!( - args.authority_id <= jupiter_v6::AUTHORITY_COUNT, - SwapLayerError::InvalidJupiterV6AuthorityId, - ); - - true - } - )] - jupiter_v6_authority: UncheckedAccount<'info>, - - /// CHECK: This account will be the Swap Layer's swap authority. - transfer_authority: UncheckedAccount<'info>, - - /// CHECK: This account will be the Swap Layer's source token account. - #[account(mut)] - src_custody_token: UncheckedAccount<'info>, - - #[account( - mut, - associated_token::mint = src_mint, - associated_token::authority = jupiter_v6_authority, - )] - jupiter_v6_src_custody_token: Box>, - - #[account( - mut, - associated_token::mint = dst_mint, - associated_token::authority = jupiter_v6_authority, - )] - jupiter_v6_dst_custody_token: Box>, - - /// CHECK: This account will be the Swap Layer's destination token account. - #[account(mut)] - dst_custody_token: UncheckedAccount<'info>, - - /// CHECK: This account must be the source mint for the swap. - src_mint: UncheckedAccount<'info>, - - /// CHECK: This account must be the destination mint for the swap. - dst_mint: UncheckedAccount<'info>, - - /// CHECK: This is an optional account, which we will enforce to be None (so it will be passed - /// in as the Jupiter V6 program ID) because Swap Layer will not collect platform fees. - #[account(address = jupiter_v6::JUPITER_V6_PROGRAM_ID)] - platform_fee_none: UncheckedAccount<'info>, - - /// CHECK: Token 2022 program is optional. - token_2022_program: UncheckedAccount<'info>, - - /// CHECK: Seeds must be \["__event_authority"\] (Jupiter V6 Program). - jupiter_v6_event_authority: UncheckedAccount<'info>, - - /// CHECK: Must equal Jupiter V6 Program ID. - #[account(address = jupiter_v6::JUPITER_V6_PROGRAM_ID)] - jupiter_v6_program: UncheckedAccount<'info>, -} diff --git a/solana/programs/swap-layer/src/processor/initiate/mod.rs b/solana/programs/swap-layer/src/processor/initiate/mod.rs index cea54517..89f99a70 100644 --- a/solana/programs/swap-layer/src/processor/initiate/mod.rs +++ b/solana/programs/swap-layer/src/processor/initiate/mod.rs @@ -1,2 +1,8 @@ +mod swap; +pub use swap::*; + +mod transfer; +pub use transfer::*; + mod usdc; pub use usdc::*; diff --git a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs new file mode 100644 index 00000000..4ef874f7 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs @@ -0,0 +1,301 @@ +use crate::{ + composite::*, + error::SwapLayerError, + state::{Custodian, Peer, StagedOutbound, StagedRedeem}, + utils, +}; +use anchor_lang::prelude::*; +use anchor_spl::{associated_token, token}; +use common::wormhole_io::{Readable, TypePrefixedPayload}; +use swap_layer_messages::{ + messages::SwapMessageV1, + types::{OutputToken, RedeemMode, Uint48}, +}; + +#[derive(Accounts)] +pub struct InitiateSwapExactIn<'info> { + #[account(mut)] + payer: Signer<'info>, + + custodian: CheckedCustodian<'info>, + + /// CHECK: This account must be the one who paid to create the staged outbound account. + #[account( + mut, + address = staged_outbound.info.prepared_by, + )] + prepared_by: UncheckedAccount<'info>, + + /// Staging for outbound transfer. This account has all of the instructions needed to initiate + /// the transfer. + /// + /// This account will be closed by the end of the instruction. + #[account( + mut, + close = prepared_by, + )] + staged_outbound: Account<'info, StagedOutbound>, + + /// This custody token account will be closed by the end of the instruction. + #[account( + mut, + seeds = [ + crate::STAGED_CUSTODY_TOKEN_SEED_PREFIX, + staged_outbound.key().as_ref(), + ], + bump = staged_outbound.info.custody_token_bump, + )] + staged_custody_token: Account<'info, token::TokenAccount>, + + /// CHECK: This account must equal the usdc refund token encoded in the staged outbound account. + #[account(address = staged_outbound.usdc_refund_token)] + usdc_refund_token: UncheckedAccount<'info>, + + /// Peer used to determine whether assets are sent to a valid destination. + #[account( + constraint = { + require_eq!( + staged_outbound.info.target_chain, + target_peer.seeds.chain, + SwapLayerError::InvalidTargetChain, + ); + + true + } + )] + target_peer: RegisteredPeer<'info>, + + /// CHECK: Seeds must be \["swap-authority", staged_outbound.key()\]. + #[account( + seeds = [ + crate::SWAP_AUTHORITY_SEED_PREFIX, + staged_outbound.key().as_ref(), + ], + bump, + )] + swap_authority: UncheckedAccount<'info>, + + /// Temporary swap token account to receive source mint from the staged custody token. This + /// account will be closed at the end of this instruction. + #[account( + init_if_needed, + payer = payer, + associated_token::mint = src_mint, + associated_token::authority = swap_authority + )] + src_swap_token: Box>, + + /// Temporary swap token account to receive destination mint after the swap. This account will + /// be closed at the end of this instruction. + #[account( + init_if_needed, + payer = payer, + associated_token::mint = usdc, + associated_token::authority = swap_authority + )] + dst_swap_token: Box>, + + /// This account must be verified as the source mint for the swap. + #[account(address = staged_custody_token.mint)] + src_mint: Box>, + + /// This account must be verified as the destination mint for the swap. + #[account(constraint = src_mint.key() != usdc.key() @ SwapLayerError::SameMint)] + usdc: Usdc<'info>, + + /// CHECK: Token router config. + token_router_custodian: UncheckedAccount<'info>, + + /// CHECK: Mutable, seeds must be \["prepared-order", staged_outbound.key()\] + #[account( + mut, + seeds = [ + crate::PREPARED_ORDER_SEED_PREFIX, + staged_outbound.key().as_ref(), + ], + bump, + )] + prepared_order: UncheckedAccount<'info>, + + /// CHECK: Mutable, seeds must be \["prepared-custody", prepared_order.key()\] + #[account(mut)] + prepared_custody_token: UncheckedAccount<'info>, + + token_router_program: Program<'info, token_router::program::TokenRouter>, + associated_token_program: Program<'info, associated_token::AssociatedToken>, + token_program: Program<'info, token::Token>, + system_program: Program<'info, System>, +} + +pub fn initiate_swap_exact_in<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, InitiateSwapExactIn<'info>>, + instruction_data: Vec, +) -> Result<()> +where + 'c: 'info, +{ + let (shared_accounts_route, swap_args, cpi_remaining_accounts) = + JupiterV6SharedAccountsRoute::set_up(ctx.remaining_accounts, &instruction_data[..])?; + + let swap_authority = &ctx.accounts.swap_authority; + + // Verify remaining accounts. + { + require_keys_eq!( + shared_accounts_route.transfer_authority.key(), + swap_authority.key(), + SwapLayerError::InvalidSwapAuthority + ); + require_keys_eq!( + shared_accounts_route.src_custody_token.key(), + ctx.accounts.src_swap_token.key(), + SwapLayerError::InvalidSourceSwapToken + ); + require_keys_eq!( + shared_accounts_route.dst_custody_token.key(), + ctx.accounts.dst_swap_token.key(), + SwapLayerError::InvalidDestinationSwapToken + ); + require_keys_eq!( + shared_accounts_route.src_mint.key(), + ctx.accounts.src_mint.key(), + SwapLayerError::InvalidSourceMint + ); + require_keys_eq!( + shared_accounts_route.dst_mint.key(), + common::USDC_MINT, + SwapLayerError::InvalidDestinationMint + ); + } + + // We perform this operation first so we can have an immutable reference to the staged outbound + // account. + let staged_redeem = std::mem::take(&mut ctx.accounts.staged_outbound.staged_redeem); + let staged_outbound = &ctx.accounts.staged_outbound; + + let staged_outbound_key = staged_outbound.key(); + let swap_authority_seeds = &[ + crate::SWAP_AUTHORITY_SEED_PREFIX, + staged_outbound_key.as_ref(), + &[ctx.bumps.swap_authority], + ]; + + let limit_amount = utils::jupiter_v6::compute_min_amount_out(&swap_args); + + // Execute swap. + shared_accounts_route.invoke_cpi(swap_args, swap_authority_seeds, cpi_remaining_accounts)?; + + // After the swap, we reload the destination token account to get the correct amount. + ctx.accounts.dst_swap_token.reload()?; + let dst_swap_token = &ctx.accounts.dst_swap_token; + + require_gte!( + dst_swap_token.amount, + limit_amount, + SwapLayerError::SwapFailed + ); + + let token_program = &ctx.accounts.token_program; + let custodian = &ctx.accounts.custodian; + + // Change the custody token authority from target peer to custodian. + let peer_seeds = &ctx.accounts.target_peer.seeds; + token::set_authority( + CpiContext::new_with_signer( + token_program.to_account_info(), + token::SetAuthority { + current_authority: ctx.accounts.target_peer.to_account_info(), + account_or_mint: dst_swap_token.to_account_info(), + }, + &[&[ + Peer::SEED_PREFIX, + &peer_seeds.chain.to_be_bytes(), + &[peer_seeds.bump], + ]], + ), + token::spl_token::instruction::AuthorityType::AccountOwner, + custodian.key().into(), + )?; + + // Decode the output token to verify that it's valid. + let output_token = OutputToken::read(&mut &staged_outbound.encoded_output_token[..]) + .map_err(|_| SwapLayerError::InvalidOutputToken)?; + + let swap_message = match staged_redeem { + StagedRedeem::Direct => SwapMessageV1 { + recipient: staged_outbound.info.recipient, + redeem_mode: RedeemMode::Direct, + output_token, + }, + StagedRedeem::Relay { + gas_dropoff, + relaying_fee, + } => SwapMessageV1 { + recipient: staged_outbound.info.recipient, + redeem_mode: RedeemMode::Relay { + gas_dropoff, + relaying_fee: Uint48::try_from(relaying_fee).unwrap(), + }, + output_token, + }, + StagedRedeem::Payload(payload) => SwapMessageV1 { + recipient: staged_outbound.info.recipient, + redeem_mode: RedeemMode::Payload(payload), + output_token, + }, + }; + + // Prepare market order as custodian. + token_router::cpi::prepare_market_order( + CpiContext::new_with_signer( + ctx.accounts.token_router_program.to_account_info(), + token_router::cpi::accounts::PrepareMarketOrder { + payer: ctx.accounts.payer.to_account_info(), + custodian: token_router::cpi::accounts::CheckedCustodian { + custodian: ctx.accounts.token_router_custodian.to_account_info(), + }, + program_transfer_authority: Default::default(), + sender: custodian.to_account_info().into(), + prepared_order: ctx.accounts.prepared_order.to_account_info(), + sender_token: dst_swap_token.to_account_info(), + refund_token: ctx.accounts.usdc_refund_token.to_account_info(), + prepared_custody_token: ctx.accounts.prepared_custody_token.to_account_info(), + usdc: token_router::cpi::accounts::Usdc { + mint: ctx.accounts.usdc.to_account_info(), + }, + token_program: token_program.to_account_info(), + system_program: ctx.accounts.system_program.to_account_info(), + }, + &[Custodian::SIGNER_SEEDS], + ), + token_router::PrepareMarketOrderArgs { + amount_in: dst_swap_token.amount, + min_amount_out: None, + target_chain: staged_outbound.target_chain, + redeemer: ctx.accounts.target_peer.address, + redeemer_message: swap_message.to_vec(), + }, + )?; + + let payer = &ctx.accounts.payer; + + // Finally close swap token accounts. + token::close_account(CpiContext::new_with_signer( + token_program.to_account_info(), + token::CloseAccount { + account: ctx.accounts.src_swap_token.to_account_info(), + destination: payer.to_account_info(), + authority: swap_authority.to_account_info(), + }, + &[swap_authority_seeds], + ))?; + token::close_account(CpiContext::new_with_signer( + token_program.to_account_info(), + token::CloseAccount { + account: dst_swap_token.to_account_info(), + destination: payer.to_account_info(), + authority: swap_authority.to_account_info(), + }, + &[swap_authority_seeds], + )) +} diff --git a/solana/programs/swap-layer/src/processor/initiate/swap/mod.rs b/solana/programs/swap-layer/src/processor/initiate/swap/mod.rs new file mode 100644 index 00000000..e5b761c9 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/initiate/swap/mod.rs @@ -0,0 +1,2 @@ +mod exact_in; +pub use exact_in::*; diff --git a/solana/programs/swap-layer/src/processor/initiate/transfer.rs b/solana/programs/swap-layer/src/processor/initiate/transfer.rs new file mode 100644 index 00000000..f2182be0 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/initiate/transfer.rs @@ -0,0 +1,193 @@ +use crate::{ + composite::*, + error::SwapLayerError, + state::{Custodian, Peer, StagedOutbound, StagedRedeem}, +}; +use anchor_lang::prelude::*; +use anchor_spl::token; +use common::wormhole_io::{Readable, TypePrefixedPayload}; +use swap_layer_messages::{ + messages::SwapMessageV1, + types::{OutputToken, RedeemMode, Uint48}, +}; + +#[derive(Accounts)] +pub struct InitiateTransferNew<'info> { + #[account(mut)] + payer: Signer<'info>, + + custodian: CheckedCustodian<'info>, + + /// CHECK: This account must be the one who paid to create the staged outbound account. + #[account( + mut, + address = staged_outbound.info.prepared_by, + )] + prepared_by: UncheckedAccount<'info>, + + /// Staging for outbound transfer. This account has all of the instructions needed to initiate + /// the transfer. + /// + /// This account will be closed by the end of the instruction. + #[account( + mut, + close = prepared_by, + )] + staged_outbound: Account<'info, StagedOutbound>, + + /// This custody token account will be closed by the end of the instruction. + #[account( + mut, + token::mint = common::USDC_MINT, + seeds = [ + crate::STAGED_CUSTODY_TOKEN_SEED_PREFIX, + staged_outbound.key().as_ref(), + ], + bump = staged_outbound.info.custody_token_bump, + )] + staged_custody_token: Account<'info, token::TokenAccount>, + + /// CHECK: This account must equal the usdc refund token encoded in the staged outbound account. + #[account(address = staged_outbound.usdc_refund_token)] + usdc_refund_token: UncheckedAccount<'info>, + + /// Peer used to determine whether assets are sent to a valid destination. + #[account( + constraint = { + require_eq!( + staged_outbound.info.target_chain, + target_peer.seeds.chain, + SwapLayerError::InvalidPeer, + ); + + true + } + )] + target_peer: RegisteredPeer<'info>, + + /// CHECK: Token router config. + token_router_custodian: UncheckedAccount<'info>, + + /// CHECK: Mutable, seeds must be \["prepared-order", staged_outbound.key()\]. + #[account( + mut, + seeds = [ + crate::PREPARED_ORDER_SEED_PREFIX, + staged_outbound.key().as_ref(), + ], + bump, + )] + prepared_order: UncheckedAccount<'info>, + + /// CHECK: Mutable, seeds must be \["prepared-custody", prepared_order.key()\]. + #[account(mut)] + prepared_custody_token: UncheckedAccount<'info>, + + usdc: Usdc<'info>, + + token_router_program: Program<'info, token_router::program::TokenRouter>, + token_program: Program<'info, token::Token>, + system_program: Program<'info, System>, +} + +pub fn initiate_transfer_new(ctx: Context) -> Result<()> { + // We perform this operation first so we can have an immutable reference to the staged outbound + // account. + let staged_redeem = std::mem::take(&mut ctx.accounts.staged_outbound.staged_redeem); + + let staged_outbound = &ctx.accounts.staged_outbound; + let custody_token = &ctx.accounts.staged_custody_token; + + // Decode the output token to verify that it's valid. + let output_token = OutputToken::read(&mut &staged_outbound.encoded_output_token[..]) + .map_err(|_| SwapLayerError::InvalidOutputToken)?; + + let swap_message = match staged_redeem { + StagedRedeem::Direct => SwapMessageV1 { + recipient: staged_outbound.info.recipient, + redeem_mode: RedeemMode::Direct, + output_token, + }, + StagedRedeem::Relay { + gas_dropoff, + relaying_fee, + } => SwapMessageV1 { + recipient: staged_outbound.info.recipient, + redeem_mode: RedeemMode::Relay { + gas_dropoff, + relaying_fee: Uint48::try_from(relaying_fee).unwrap(), + }, + output_token, + }, + StagedRedeem::Payload(payload) => SwapMessageV1 { + recipient: staged_outbound.info.recipient, + redeem_mode: RedeemMode::Payload(payload), + output_token, + }, + }; + + let token_program = &ctx.accounts.token_program; + let custodian = &ctx.accounts.custodian; + + // Change the custody token authority from target peer to custodian. + let peer_seeds = &ctx.accounts.target_peer.seeds; + token::set_authority( + CpiContext::new_with_signer( + token_program.to_account_info(), + token::SetAuthority { + current_authority: ctx.accounts.target_peer.to_account_info(), + account_or_mint: custody_token.to_account_info(), + }, + &[&[ + Peer::SEED_PREFIX, + &peer_seeds.chain.to_be_bytes(), + &[peer_seeds.bump], + ]], + ), + token::spl_token::instruction::AuthorityType::AccountOwner, + custodian.key().into(), + )?; + + // Prepare market order as custodian. + token_router::cpi::prepare_market_order( + CpiContext::new_with_signer( + ctx.accounts.token_router_program.to_account_info(), + token_router::cpi::accounts::PrepareMarketOrder { + payer: ctx.accounts.payer.to_account_info(), + custodian: token_router::cpi::accounts::CheckedCustodian { + custodian: ctx.accounts.token_router_custodian.to_account_info(), + }, + program_transfer_authority: Default::default(), + sender: custodian.to_account_info().into(), + prepared_order: ctx.accounts.prepared_order.to_account_info(), + sender_token: custody_token.to_account_info(), + refund_token: ctx.accounts.usdc_refund_token.to_account_info(), + prepared_custody_token: ctx.accounts.prepared_custody_token.to_account_info(), + usdc: token_router::cpi::accounts::Usdc { + mint: ctx.accounts.usdc.to_account_info(), + }, + token_program: token_program.to_account_info(), + system_program: ctx.accounts.system_program.to_account_info(), + }, + &[Custodian::SIGNER_SEEDS], + ), + token_router::PrepareMarketOrderArgs { + amount_in: custody_token.amount, + min_amount_out: None, + target_chain: staged_outbound.target_chain, + redeemer: ctx.accounts.target_peer.address, + redeemer_message: swap_message.to_vec(), + }, + )?; + + // Finally close the custody token account. + token::close_account(CpiContext::new_with_signer( + ctx.accounts.token_program.to_account_info(), + token::CloseAccount { + account: custody_token.to_account_info(), + destination: ctx.accounts.payer.to_account_info(), + authority: ctx.accounts.custodian.to_account_info(), + }, + &[Custodian::SIGNER_SEEDS], + )) +} diff --git a/solana/programs/swap-layer/src/processor/initiate/usdc.rs b/solana/programs/swap-layer/src/processor/initiate/usdc.rs index ae313485..e79f6d54 100644 --- a/solana/programs/swap-layer/src/processor/initiate/usdc.rs +++ b/solana/programs/swap-layer/src/processor/initiate/usdc.rs @@ -1,13 +1,13 @@ -use crate::utils::gas_dropoff::denormalize_gas_dropoff; -use crate::utils::relayer_fees::calculate_relayer_fee; -use crate::{composite::*, error::SwapLayerError, state::Peer}; -use anchor_lang::prelude::borsh::BorshDeserialize; +use crate::{ + composite::*, error::SwapLayerError, state::Peer, utils::relayer_fees::calculate_relayer_fee, +}; use anchor_lang::prelude::*; use anchor_spl::token; -use common::wormhole_io::Readable; -use common::wormhole_io::TypePrefixedPayload; -use swap_layer_messages::messages::SwapMessageV1; -use swap_layer_messages::types::{OutputToken, RedeemMode, Uint48}; +use common::wormhole_io::{Readable, TypePrefixedPayload}; +use swap_layer_messages::{ + messages::SwapMessageV1, + types::{OutputToken, RedeemMode, Uint48}, +}; #[derive(Accounts)] #[instruction(args: InitiateTransferArgs)] @@ -101,7 +101,7 @@ pub fn initiate_transfer(ctx: Context, args: InitiateTransferA // Relaying fee must be less than the user-specific maximum. let relaying_fee = calculate_relayer_fee( &ctx.accounts.peer.relay_params, - denormalize_gas_dropoff(relay_options.gas_dropoff), + relay_options.gas_dropoff, &output_token, )?; require!( diff --git a/solana/programs/swap-layer/src/processor/mod.rs b/solana/programs/swap-layer/src/processor/mod.rs index 24a7b4e0..12901423 100644 --- a/solana/programs/swap-layer/src/processor/mod.rs +++ b/solana/programs/swap-layer/src/processor/mod.rs @@ -9,3 +9,6 @@ pub use initiate::*; mod release_inbound; pub use release_inbound::*; + +mod stage_outbound; +pub use stage_outbound::*; diff --git a/solana/programs/swap-layer/src/processor/stage_outbound.rs b/solana/programs/swap-layer/src/processor/stage_outbound.rs new file mode 100644 index 00000000..35926b5c --- /dev/null +++ b/solana/programs/swap-layer/src/processor/stage_outbound.rs @@ -0,0 +1,290 @@ +use crate::{ + composite::*, + error::SwapLayerError, + state::{Peer, RedeemOption, StagedOutbound, StagedOutboundInfo, StagedRedeem}, + utils, TRANSFER_AUTHORITY_SEED_PREFIX, +}; +use anchor_lang::{prelude::*, system_program}; +use anchor_spl::token; +use common::wormhole_io::{Readable, Writeable}; +use solana_program::keccak; +use swap_layer_messages::types::OutputToken; + +#[derive(Accounts)] +#[instruction(args: StageOutboundArgs)] +pub struct StageOutbound<'info> { + #[account(mut)] + payer: Signer<'info>, + + /// This signer is mutable in case the integrator wants to separate the payer of accounts from + /// the sender, who may be sending lamports ([StageOutboundArgs::is_native] is true). + #[account(mut)] + sender: Option>, + + #[account( + seeds = [ + TRANSFER_AUTHORITY_SEED_PREFIX, + &keccak::hash(&args.try_to_vec()?).0, + ], + bump, + constraint = sender_token.is_some() @ SwapLayerError::SenderTokenRequired, + )] + program_transfer_authority: Option>, + + /// If provided, this token account's mint must be equal to the source mint. + /// + /// NOTE: This account may not be necessary because the sender may send lamports directly + /// ([StageOutboundArgs::is_native] is true). + #[account( + mut, + token::mint = src_mint, + )] + sender_token: Option>, + + /// Peer used to determine whether assets are sent to a valid destination. The registered peer + /// will also act as the authority over the staged custody token account. + /// + /// Ordinarily we could consider the authority to be the staged outbound account itself. But + /// because this account can be signed for outside of this program (either keypair or PDA), the + /// token account would then be out of this program's control. + #[account( + constraint = { + require_eq!( + args.target_chain, + target_peer.seeds.chain, + SwapLayerError::InvalidTargetChain, + ); + + true + } + )] + target_peer: RegisteredPeer<'info>, + + /// Staged outbound account, which contains all of the instructions needed to initiate a + /// transfer on behalf of the sender. + #[account( + init, + payer = payer, + space = StagedOutbound::try_compute_size(&args.redeem_option, &args.encoded_output_token)?, + constraint = { + // Cannot send to zero address. + require!(args.recipient != [0; 32], SwapLayerError::InvalidRecipient); + + true + } + )] + staged_outbound: Account<'info, StagedOutbound>, + + /// Custody token account for the staged outbound transfer. This account will be owned by the + /// registered peer. + #[account( + init, + payer = payer, + token::mint = src_mint, + token::authority = target_peer, + seeds = [ + crate::STAGED_CUSTODY_TOKEN_SEED_PREFIX, + staged_outbound.key().as_ref(), + ], + bump, + )] + staged_custody_token: Account<'info, token::TokenAccount>, + + #[account( + mut, + token::mint = common::USDC_MINT, + )] + usdc_refund_token: Box>, + + /// Mint can either be USDC or whichever mint is used to swap into USDC. + src_mint: Account<'info, token::Mint>, + + token_program: Program<'info, token::Token>, + system_program: Program<'info, System>, +} + +/// Arguments for [stage_outbound]. +#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)] +pub struct StageOutboundArgs { + pub amount_in: u64, + + /// The Wormhole chain ID of the network to transfer tokens to. + pub target_chain: u16, + + /// The recipient of the transfer. + pub recipient: [u8; 32], + + pub redeem_option: Option, + + pub encoded_output_token: Option>, +} + +pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> Result<()> { + // In case we use a program transfer authority, we need to use these for the transfer. + let last_transfer_authority_signer_seeds = ctx + .bumps + .program_transfer_authority + .map(|bump| (keccak::hash(&args.try_to_vec().unwrap()).0, bump)); + + let StageOutboundArgs { + amount_in, + target_chain, + recipient, + redeem_option, + encoded_output_token, + } = args; + + // Replace None with OutputToken::USDC encoded. + let encoded_output_token = encoded_output_token.unwrap_or({ + let mut buf = Vec::with_capacity(1); + OutputToken::Usdc.write(&mut buf).unwrap(); + buf + }); + let output_token = OutputToken::read(&mut &encoded_output_token[..]).unwrap(); + + // We need to determine the relayer fee. This fee will either be paid for right now if + // StagedInput::Usdc or will be deducted from the USDC after a resulting swap from the source + // mint. + // + // NOTE: The swap instruction will revert if the amount of destination tokens is less than the + // calculated relaying fee. The amount of source tokens should be sufficient enough to cover the + // relaying fee after the swap. + let (transfer_amount, staged_redeem) = match redeem_option { + Some(redeem_option) => match redeem_option { + RedeemOption::Relay { + gas_dropoff, + max_relayer_fee, + } => { + // Relaying fee must be less than the user-specific maximum. + let relaying_fee = utils::relayer_fees::calculate_relayer_fee( + &ctx.accounts.target_peer.relay_params, + gas_dropoff, + &output_token, + )?; + require!( + relaying_fee <= max_relayer_fee, + SwapLayerError::ExceedsMaxRelayingFee + ); + + ( + if ctx.accounts.src_mint.key() == common::USDC_MINT { + relaying_fee + .checked_add(amount_in) + .ok_or(SwapLayerError::U64Overflow)? + } else { + amount_in + }, + StagedRedeem::Relay { + gas_dropoff, + relaying_fee, + }, + ) + } + RedeemOption::Payload(buf) => (amount_in, StagedRedeem::Payload(buf)), + }, + None => (amount_in, StagedRedeem::Direct), + }; + + let token_program = &ctx.accounts.token_program; + let custody_token = &ctx.accounts.staged_custody_token; + + let sender = match &ctx.accounts.sender_token { + Some(sender_token) => match ( + &ctx.accounts.sender, + &ctx.accounts.program_transfer_authority, + ) { + (Some(sender), None) => { + token::transfer( + CpiContext::new( + token_program.to_account_info(), + token::Transfer { + from: sender_token.to_account_info(), + to: custody_token.to_account_info(), + authority: sender.to_account_info(), + }, + ), + transfer_amount, + )?; + + sender.key() + } + (None, Some(program_transfer_authority)) => { + // If the program transfer authority is used, we require that the delegated amount + // is exactly the amount being transferred. + require_eq!( + sender_token.delegated_amount, + transfer_amount, + SwapLayerError::DelegatedAmountMismatch, + ); + + let (hashed_args, authority_bump) = last_transfer_authority_signer_seeds.unwrap(); + + token::transfer( + CpiContext::new_with_signer( + ctx.accounts.token_program.to_account_info(), + token::Transfer { + from: sender_token.to_account_info(), + to: custody_token.to_account_info(), + authority: program_transfer_authority.to_account_info(), + }, + &[&[ + crate::TRANSFER_AUTHORITY_SEED_PREFIX, + &hashed_args, + &[authority_bump], + ]], + ), + transfer_amount, + )?; + + sender_token.owner + } + _ => return err!(SwapLayerError::EitherSenderOrProgramTransferAuthority), + }, + None => match &ctx.accounts.sender { + Some(sender) => { + system_program::transfer( + CpiContext::new( + ctx.accounts.system_program.to_account_info(), + system_program::Transfer { + from: sender.to_account_info(), + to: custody_token.to_account_info(), + }, + ), + transfer_amount, + )?; + + let peer_seeds = &ctx.accounts.target_peer.seeds; + token::sync_native(CpiContext::new_with_signer( + token_program.to_account_info(), + token::SyncNative { + account: custody_token.to_account_info(), + }, + &[&[ + Peer::SEED_PREFIX, + &peer_seeds.chain.to_be_bytes(), + &[peer_seeds.bump], + ]], + ))?; + + sender.key() + } + None => return err!(SwapLayerError::SenderRequired), + }, + }; + + ctx.accounts.staged_outbound.set_inner(StagedOutbound { + info: StagedOutboundInfo { + custody_token_bump: ctx.bumps.staged_custody_token, + prepared_by: ctx.accounts.payer.key(), + usdc_refund_token: ctx.accounts.usdc_refund_token.key(), + sender, + target_chain, + recipient, + }, + staged_redeem, + encoded_output_token, + }); + + // Done. + Ok(()) +} diff --git a/solana/programs/swap-layer/src/state/mod.rs b/solana/programs/swap-layer/src/state/mod.rs index fe5f4e22..3e68575d 100644 --- a/solana/programs/swap-layer/src/state/mod.rs +++ b/solana/programs/swap-layer/src/state/mod.rs @@ -4,5 +4,5 @@ pub use custodian::*; mod peer; pub use peer::*; -mod staged_inbound; -pub use staged_inbound::*; +mod staged; +pub use staged::*; diff --git a/solana/programs/swap-layer/src/state/peer.rs b/solana/programs/swap-layer/src/state/peer.rs index d8c5551a..ac7a8432 100644 --- a/solana/programs/swap-layer/src/state/peer.rs +++ b/solana/programs/swap-layer/src/state/peer.rs @@ -12,7 +12,7 @@ pub enum ExecutionParams { }, } -#[derive(Debug, Default, Clone, InitSpace, AnchorSerialize, AnchorDeserialize)] +#[derive(Debug, Clone, InitSpace, AnchorSerialize, AnchorDeserialize)] pub struct RelayParams { // Atomic usdc (i.e. 6 decimals -> 1e6 = 1 usdc), max=disabled pub base_fee: u32, @@ -27,12 +27,19 @@ pub struct RelayParams { pub execution_params: ExecutionParams, } +#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize, InitSpace)] +pub struct PeerSeeds { + /// Peer chain. Cannot equal `1` (Solana's Chain ID). + pub chain: u16, + pub bump: u8, +} + #[account] -#[derive(Default, InitSpace)] +#[derive(Debug, InitSpace)] /// Foreign Peer account data. pub struct Peer { - /// Peer chain. Cannot equal `1` (Solana's Chain ID). - pub chain: u16, + /// TODO: add bump seed + pub seeds: PeerSeeds, /// Peer address. Cannot be zero address. pub address: [u8; 32], /// Relay parameters. diff --git a/solana/programs/swap-layer/src/state/staged_inbound.rs b/solana/programs/swap-layer/src/state/staged/inbound.rs similarity index 100% rename from solana/programs/swap-layer/src/state/staged_inbound.rs rename to solana/programs/swap-layer/src/state/staged/inbound.rs diff --git a/solana/programs/swap-layer/src/state/staged/mod.rs b/solana/programs/swap-layer/src/state/staged/mod.rs new file mode 100644 index 00000000..2e2f82c3 --- /dev/null +++ b/solana/programs/swap-layer/src/state/staged/mod.rs @@ -0,0 +1,5 @@ +mod inbound; +pub use inbound::*; + +mod outbound; +pub use outbound::*; diff --git a/solana/programs/swap-layer/src/state/staged/outbound.rs b/solana/programs/swap-layer/src/state/staged/outbound.rs new file mode 100644 index 00000000..6a4edd3f --- /dev/null +++ b/solana/programs/swap-layer/src/state/staged/outbound.rs @@ -0,0 +1,96 @@ +use crate::error::SwapLayerError; +use anchor_lang::prelude::*; +use common::wormhole_io::Readable; +use swap_layer_messages::types::OutputToken; + +#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)] +pub enum RedeemOption { + Relay { + /// Normalized amount of gas to drop off on destination network. + gas_dropoff: u32, + + /// Maximum fee that a relayer can charge for the transfer. + max_relayer_fee: u64, + }, + Payload(Vec), +} + +#[derive(Debug, Default, Clone, AnchorSerialize, AnchorDeserialize)] +pub enum StagedRedeem { + #[default] + Direct, + Relay { + gas_dropoff: u32, + relaying_fee: u64, + }, + Payload(Vec), +} + +#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize, InitSpace)] +pub struct StagedOutboundInfo { + pub custody_token_bump: u8, + + /// One who paid the lamports to create [StagedOutbound]. + pub prepared_by: Pubkey, + + /// Sender of the swap message. + pub sender: Pubkey, + + /// Wormhole chain ID of the target network. + pub target_chain: u16, + + /// Intended recipient of the transfer. + pub recipient: [u8; 32], + + /// The specified token account to refund USDC. This account is required by the Token Router + /// program in case a fast order is reverted at the Matching Engine after it has been placed. + pub usdc_refund_token: Pubkey, +} + +#[account] +#[derive(Debug)] +pub struct StagedOutbound { + pub info: StagedOutboundInfo, + pub staged_redeem: StagedRedeem, + pub encoded_output_token: Vec, +} + +impl StagedOutbound { + const BASE_SIZE: usize = 8 // DISCRIMINATOR + + StagedOutboundInfo::INIT_SPACE + + 1 // StagedRedeem discrimant + + 1 // encoded_output_token === None + ; + + pub fn try_compute_size( + redeem_option: &Option, + encoded_output_token: &Option>, + ) -> Result { + Ok(Self::BASE_SIZE + .saturating_add(match redeem_option { + Some(redeem) => match redeem { + RedeemOption::Relay { .. } => 12, // gas_dropoff + relaying_fee + RedeemOption::Payload(payload) => payload.len().saturating_add(4), + }, + None => 0, + }) + .saturating_add(match encoded_output_token { + Some(encoded_output_token) => { + // First validate the encoded output token by attempting to deserialize it. + OutputToken::read(&mut &encoded_output_token[..]) + .map_err(|_| error!(SwapLayerError::InvalidOutputToken))?; + + encoded_output_token.len().saturating_add(4) + } + None => 5, // len + OutputToken::Usdc, + })) + } +} + +impl std::ops::Deref for StagedOutbound { + type Target = StagedOutboundInfo; + + fn deref(&self) -> &Self::Target { + &self.info + } +} diff --git a/solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs b/solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs index 726ad56a..de7202de 100644 --- a/solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs +++ b/solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs @@ -9,62 +9,57 @@ use solana_program::{pubkey, pubkey::Pubkey}; pub const JUPITER_V6_PROGRAM_ID: Pubkey = pubkey!("JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"); pub const AUTHORITY_COUNT: u8 = 8; +pub const MAX_SLIPPAGE_BPS: u16 = 10_000; -#[allow(clippy::inconsistent_digit_grouping)] -pub const ONE_HUNDRED_PERCENT: u16 = 100_00; +#[allow(clippy::arithmetic_side_effects)] +#[allow(clippy::as_conversions)] +#[allow(clippy::integer_division)] +pub const MAX_QUOTED_OUT_AMOUNT: u64 = u64::MAX / (MAX_SLIPPAGE_BPS as u64); -pub fn compute_quoted_out_amount(limit_amount: u64, slippage_bps: u16) -> Option { - if slippage_bps > ONE_HUNDRED_PERCENT { - None - } else { - let factor = 1. - f64::from(slippage_bps) / f64::from(ONE_HUNDRED_PERCENT); +pub trait JupiterV6SwapExactIn { + fn quoted_out_amount(&self) -> u64; - // We are aware of the potential loss of precision here if the limit amount is > 52 bits. - // - // An example with WSOL, which is 9 decimals: - // - // If the limit amount were 2 ^ 52 - 1 = 4503599627370495, this would equate to roughly - // 4,503,599 WSOL. At current day prices of $150, this would be worth 675,539,850 USDC. - // There would never be a situation where the swap amount from USDC be this high. - // - // In an extreme scenario where the price drops by 99.9% (so this means a price of $0.15), - // the swap amount would be 4,503,599 * 0.15 = 675,539.85 USDC. This is still too large of - // a number to pass through the Swap Layer. - #[allow(clippy::as_conversions)] - #[allow(clippy::cast_precision_loss)] - let quoted_out_amount = (limit_amount as f64) / factor; + fn slippage_bps(&self) -> u16; +} - // We are fine to truncate here because we set the amount to the floor of the result. This - // result will also not ever be negative, so we are not worried about sign loss. - #[allow(clippy::as_conversions)] - #[allow(clippy::cast_possible_truncation)] - #[allow(clippy::cast_sign_loss)] - let quoted_out_amount = quoted_out_amount.floor() as u64; +impl JupiterV6SwapExactIn for cpi::SharedAccountsRouteArgs { + fn quoted_out_amount(&self) -> u64 { + self.quoted_out_amount + } - quoted_out_amount.into() + fn slippage_bps(&self) -> u16 { + self.slippage_bps } } -#[cfg(test)] -mod test { - use super::*; +pub fn compute_min_amount_out(swap_args: &T) -> u64 +where + T: JupiterV6SwapExactIn, +{ + let quoted_out_amount = swap_args.quoted_out_amount(); - #[test] - fn test_compute_quoted_out_amount() { - let slippage_bps = 200; - let limit_amount = 48_987_482_503; + // In case the slippage bps is configured to be greater than the max, we will set it to the max + // in this case because slippage cannot exceed 100%. + let after_slippage_bps = + MAX_SLIPPAGE_BPS.saturating_sub(swap_args.slippage_bps().min(MAX_SLIPPAGE_BPS)); - assert_eq!( - compute_quoted_out_amount(limit_amount, slippage_bps).unwrap(), - 49_987_227_043 - ); - } - - #[test] - fn test_invalid_slippage_bps() { - let slippage_bps = 10001; - let limit_amount = 48_987_482_503; + // Only upcast to u128 if the quoted out amount * 10_000 will overflow u64. + if quoted_out_amount > MAX_QUOTED_OUT_AMOUNT { + // There are no side effects here because MAX_SLIPPAGE_BPS is not zero. + #[allow(clippy::arithmetic_side_effects)] + quoted_out_amount + .saturating_mul(after_slippage_bps.into()) + .saturating_div(MAX_SLIPPAGE_BPS.into()) + } else { + // There will be no side effects with this operation. And because MAX_SLIPPAGE_BPS is + // greater than slippage_bps, the result will always be less than or equal to u64::MAX. + #[allow(clippy::arithmetic_side_effects)] + #[allow(clippy::as_conversions)] + #[allow(clippy::cast_possible_truncation)] + let limit_amount = u128::from(quoted_out_amount) + .saturating_mul(after_slippage_bps.into()) + .saturating_div(MAX_SLIPPAGE_BPS.into()) as u64; - assert_eq!(compute_quoted_out_amount(limit_amount, slippage_bps), None); + limit_amount } } diff --git a/solana/programs/swap-layer/src/utils/mod.rs b/solana/programs/swap-layer/src/utils/mod.rs index ba84306f..820dae85 100644 --- a/solana/programs/swap-layer/src/utils/mod.rs +++ b/solana/programs/swap-layer/src/utils/mod.rs @@ -25,4 +25,11 @@ impl From<[u8; 8]> for AnchorSelector { pub trait AnchorInstructionData: AnchorDeserialize { fn require_selector(data: &mut &[u8]) -> Result<()>; + + fn deserialize_checked(data: &[u8]) -> Result { + let mut data = data; + Self::require_selector(&mut data)?; + + AnchorDeserialize::deserialize(&mut data).map_err(Into::into) + } } diff --git a/solana/programs/swap-layer/src/utils/relayer_fees.rs b/solana/programs/swap-layer/src/utils/relayer_fees.rs index d34b5571..a533c1fd 100644 --- a/solana/programs/swap-layer/src/utils/relayer_fees.rs +++ b/solana/programs/swap-layer/src/utils/relayer_fees.rs @@ -5,7 +5,7 @@ use crate::{ }; use anchor_lang::prelude::*; use swap_layer_messages::types::{ - OutputToken, SwapType, TraderJoeSwapParameters, UniswapSwapParameters, + OutputToken, SwapType, TraderJoeSwapParameters, Uint48, UniswapSwapParameters, }; // EVM gas overheads in gas units. @@ -35,12 +35,11 @@ fn compound(percentage: u32, base: u64) -> Option { #[allow(clippy::cast_possible_truncation)] const MAX: u128 = crate::MAX_BPS as u128; - let base = u128::from(base); + let base: u128 = u128::from(base); - let compounded = - base.saturating_add(base.saturating_mul(percentage.into()).saturating_div(MAX)); - - u64::try_from(compounded).ok() + base.saturating_add(base.saturating_mul(percentage.into()).saturating_div(MAX)) + .try_into() + .ok() } } @@ -88,7 +87,7 @@ fn calculate_evm_gas_cost( } fn calculate_gas_dropoff_cost( - denorm_gas_dropoff: u64, + specified_gas_dropoff: u32, gas_dropoff_margin: u32, native_token_price: u64, ) -> Option { @@ -97,8 +96,8 @@ fn calculate_gas_dropoff_cost( // Using u128 to prevent overflow. If this calculation does overflow, // one of the inputs is grossly incorrect/misconfigured. - let dropoff_cost = u128::from(denorm_gas_dropoff) - .checked_mul(u128::from(native_token_price))? + let dropoff_cost = u128::from(denormalize_gas_dropoff(specified_gas_dropoff)) + .checked_mul(native_token_price.into())? .saturating_div(ONE_SOL_U128); compound(gas_dropoff_margin, u64::try_from(dropoff_cost).ok()?) @@ -106,7 +105,7 @@ fn calculate_gas_dropoff_cost( pub fn calculate_relayer_fee( relay_params: &RelayParams, - denorm_gas_dropoff: u64, + specified_gas_dropoff: u32, output_token: &OutputToken, ) -> Result { require!( @@ -118,45 +117,42 @@ pub fn calculate_relayer_fee( let mut relayer_fee = u64::from(relay_params.base_fee); // Calculate the gas dropoff cost in USDC terms. - if denorm_gas_dropoff > 0 { + if specified_gas_dropoff > 0 { require!( - denorm_gas_dropoff <= denormalize_gas_dropoff(relay_params.max_gas_dropoff), + specified_gas_dropoff <= relay_params.max_gas_dropoff, SwapLayerError::InvalidGasDropoff ); let gas_dropoff_cost = calculate_gas_dropoff_cost( - denorm_gas_dropoff, + specified_gas_dropoff, relay_params.gas_dropoff_margin, relay_params.native_token_price, ) .ok_or(SwapLayerError::GasDropoffCalculationFailed)?; + relayer_fee = relayer_fee.saturating_add(gas_dropoff_cost); } // Compute the relayer fee based on the cost of the relay in the // target execution environment's gas units (converted to USDC). - let _ = match relay_params.execution_params { - ExecutionParams::None => { - err!(SwapLayerError::InvalidExecutionParams) - } + match relay_params.execution_params { ExecutionParams::Evm { gas_price, gas_price_margin, } => { - let mut total_gas = EVM_GAS_OVERHEAD; - - if denorm_gas_dropoff > 0 { - total_gas = total_gas.saturating_add(DROPOFF_GAS_OVERHEAD); - } - - let swap_overhead = match output_token { - OutputToken::Gas(swap) | OutputToken::Other { address: _, swap } => { - calculate_evm_swap_overhead(&swap.swap_type) - .ok_or(SwapLayerError::EvmGasCalculationFailed)? - } - _ => 0, - }; - total_gas = total_gas.saturating_add(swap_overhead); + let total_gas = EVM_GAS_OVERHEAD + .saturating_add(if specified_gas_dropoff > 0 { + DROPOFF_GAS_OVERHEAD + } else { + 0 + }) + .saturating_add(match output_token { + OutputToken::Gas(swap) | OutputToken::Other { address: _, swap } => { + calculate_evm_swap_overhead(&swap.swap_type) + .ok_or(SwapLayerError::EvmGasCalculationFailed)? + } + _ => 0, + }); let evm_gas_cost = calculate_evm_gas_cost( gas_price, @@ -165,13 +161,16 @@ pub fn calculate_relayer_fee( relay_params.native_token_price, ) .ok_or(SwapLayerError::EvmGasCalculationFailed)?; + relayer_fee = relayer_fee.saturating_add(evm_gas_cost); - Ok(()) - } - }; + // Relaying fee cannot exceed uint48. + Uint48::try_from(relayer_fee).map_err(|_| SwapLayerError::RelayerFeeOverflow)?; - Ok(relayer_fee) + Ok(relayer_fee) + } + _ => err!(SwapLayerError::InvalidExecutionParams), + } } #[cfg(test)] @@ -262,12 +261,12 @@ mod test { #[test] fn test_calculate_gas_dropoff_cost() { - let denorm_gas_dropoff = 500_000_000; // .5 SOL + let gas_dropoff = 500_000; // .5 SOL normalized let gas_dropoff_margin = 500_000; // 50% let native_token_price = 200_000_000; // 200 USDC let dropoff_cost = - calculate_gas_dropoff_cost(denorm_gas_dropoff, gas_dropoff_margin, native_token_price); + calculate_gas_dropoff_cost(gas_dropoff, gas_dropoff_margin, native_token_price); assert_eq!(dropoff_cost, Some(150000000)); } @@ -275,10 +274,10 @@ mod test { #[test] fn test_calculate_relayer_fee_no_swap() { let relay_params = test_relay_params(); - let denorm_gas_dropoff = 50_000_000; + let gas_dropoff = 50_000; let output_token = &OutputToken::Usdc; - let relayer_fee = calculate_relayer_fee(&relay_params, denorm_gas_dropoff, output_token); + let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, output_token); assert_eq!(relayer_fee.unwrap(), 16775000); } @@ -286,7 +285,7 @@ mod test { #[test] fn test_calculate_relayer_fee_with_gas_uniswap_swap() { let relay_params = test_relay_params(); - let denorm_gas_dropoff = 50_000_000; + let gas_dropoff = 50_000; let swap_type = SwapType::UniswapV3(UniswapSwapParameters { first_leg_fee: Uint24::from(500), path: vec![ @@ -311,7 +310,7 @@ mod test { swap_type: swap_type.clone(), }); - let relayer_fee = calculate_relayer_fee(&relay_params, denorm_gas_dropoff, &output_token); + let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, &output_token); assert_eq!(relayer_fee.unwrap(), 18025000); } @@ -319,7 +318,7 @@ mod test { #[test] fn test_calculate_relayer_fee_with_gas_trader_joe_swap() { let relay_params = test_relay_params(); - let denorm_gas_dropoff = 50_000_000; + let gas_dropoff = 50_000; let swap_type = &SwapType::TraderJoe(TraderJoeSwapParameters { first_pool_id: TraderJoePoolId { version: 0, @@ -339,7 +338,7 @@ mod test { swap_type: swap_type.clone(), }); - let relayer_fee = calculate_relayer_fee(&relay_params, denorm_gas_dropoff, &output_token); + let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, &output_token); assert_eq!(relayer_fee.unwrap(), 17525000); } diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 80547c6d..d6f14637 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -6,10 +6,18 @@ import * as wormholeSdk from "@certusone/wormhole-sdk"; import { BN, Program } from "@coral-xyz/anchor"; import * as splToken from "@solana/spl-token"; import { Connection, PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; +import { + Uint64, + uint64ToBN, + uint64ToBigInt, +} from "@wormhole-foundation/example-liquidity-layer-solana/common"; import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; +import { ChainId } from "@wormhole-foundation/sdk-base"; +import { keccak256 } from "@wormhole-foundation/sdk-definitions"; import IDL from "../../../target/idl/swap_layer.json"; import { SwapLayer } from "../../../target/types/swap_layer"; -import { Custodian, Peer, RelayParams, StagedInbound } from "./state"; +import { OutputToken, encodeOutputToken } from "./messages"; +import { Custodian, Peer, RedeemOption, RelayParams, StagedInbound, StagedOutbound } from "./state"; export const PROGRAM_IDS = ["SwapLayer1111111111111111111111111111111111"] as const; @@ -48,7 +56,7 @@ type RegisteredPeerComposite = { peer: PublicKey }; export class SwapLayerProgram { private _programId: ProgramId; - private _mint: PublicKey; + private _usdcMint: PublicKey; program: Program; @@ -56,13 +64,13 @@ export class SwapLayerProgram { return this.program.programId; } - get mint(): PublicKey { - return this._mint; + get usdcMint(): PublicKey { + return this._usdcMint; } - constructor(connection: Connection, programId: ProgramId, mint: PublicKey) { + constructor(connection: Connection, programId: ProgramId, usdcMint: PublicKey) { this._programId = programId; - this._mint = mint; + this._usdcMint = usdcMint; this.program = new Program( { ...(IDL as any), address: this._programId }, { @@ -71,6 +79,10 @@ export class SwapLayerProgram { ); } + connection(): Connection { + return this.program.provider.connection; + } + custodianAddress(): PublicKey { return PublicKey.findProgramAddressSync([Buffer.from("custodian")], this.ID)[0]; } @@ -81,7 +93,7 @@ export class SwapLayerProgram { usdcComposite(mint?: PublicKey): { mint: PublicKey } { return { - mint: mint ?? this.mint, + mint: mint ?? this._usdcMint, }; } @@ -131,8 +143,12 @@ export class SwapLayerProgram { return { feeUpdater, custodian: this.checkedCustodianComposite(custodian) }; } - registeredPeerComposite(chain: wormholeSdk.ChainId): RegisteredPeerComposite { - return { peer: this.peerAddress(chain) }; + registeredPeerComposite(opts: { peer?: PublicKey; chain?: ChainId }): RegisteredPeerComposite { + const { peer, chain } = opts; + if (peer === undefined && chain === undefined) { + throw new Error("peer or chain must be provided"); + } + return { peer: peer ?? this.peerAddress(chain) }; } async consumeSwapLayerFillComposite( @@ -200,17 +216,22 @@ export class SwapLayerProgram { return StagedInbound.address(this.ID, preparedFill); } - stagedInboundTokenAddress(StagedInbound: PublicKey): PublicKey { + async fetchStagedInbound(addr: PublicKey): Promise { + return this.program.account.stagedInbound.fetch(addr); + } + + async fetchStagedOutbound(addr: PublicKey): Promise { + // @ts-ignore: This works. + return this.program.account.stagedOutbound.fetch(addr); + } + + stagedCustodyTokenAddress(stagedAccount: PublicKey): PublicKey { return PublicKey.findProgramAddressSync( - [Buffer.from("staged-custody"), StagedInbound.toBuffer()], + [Buffer.from("staged-custody"), stagedAccount.toBuffer()], this.ID, )[0]; } - async fetchStagedInbound(addr: PublicKey): Promise { - return this.program.account.stagedInbound.fetch(addr); - } - async fetchCustodian(input?: { address: PublicKey }): Promise { const addr = input === undefined ? this.custodianAddress() : input.address; return this.program.account.custodian.fetch(addr); @@ -240,9 +261,12 @@ export class SwapLayerProgram { custodian: this.custodianAddress(), ownerAssistant, feeRecipient, - feeRecipientToken: splToken.getAssociatedTokenAddressSync(this.mint, feeRecipient), + feeRecipientToken: splToken.getAssociatedTokenAddressSync( + this.usdcMint, + feeRecipient, + ), feeUpdater, - usdc: this.usdcComposite(this.mint), + usdc: this.usdcComposite(), systemProgram: SystemProgram.programId, }) .instruction(); @@ -401,13 +425,147 @@ export class SwapLayerProgram { admin: this.adminMutComposite(ownerOrAssistant, custodian), newFeeRecipient, newFeeRecipientToken: splToken.getAssociatedTokenAddressSync( - this.mint, + this.usdcMint, newFeeRecipient, ), }) .instruction(); } + async stageOutboundIx( + accounts: { + payer: PublicKey; + stagedOutbound: PublicKey; + usdcRefundToken: PublicKey; + sender?: PublicKey | null; + senderToken?: PublicKey | null; + programTransferAuthority?: PublicKey | null; + srcMint?: PublicKey; + peer?: PublicKey; + }, + args: { + transferType: "native" | "programTransferAuthority" | "sender"; + amountIn: Uint64; + targetChain: ChainId; + recipient: Array; + redeemOption: + | { relay: { gasDropoff: number; maxRelayerFee: Uint64 } } + | { payload: Uint8Array | Buffer } + | null; + outputToken: OutputToken | null; + }, + ): Promise<[approveIx: TransactionInstruction | null, stageIx: TransactionInstruction]> { + const { payer, stagedOutbound, usdcRefundToken, peer } = accounts; + const { transferType, amountIn, redeemOption: inputRedeemOption, outputToken } = args; + + let { sender, senderToken, programTransferAuthority, srcMint } = accounts; + srcMint ??= transferType === "native" ? splToken.NATIVE_MINT : this.usdcMint; + + const redeemOption = ((): RedeemOption | null => { + if (inputRedeemOption === null) { + return null; + } else if ("relay" in inputRedeemOption) { + const { gasDropoff, maxRelayerFee } = inputRedeemOption.relay; + return { + relay: { + gasDropoff, + maxRelayerFee: uint64ToBN(maxRelayerFee), + }, + }; + } else if ("payload" in inputRedeemOption) { + const { payload } = inputRedeemOption; + return { payload: [Buffer.from(payload)] }; + } else { + throw new Error("invalid redeem option"); + } + })(); + + const encodedOutputToken = + outputToken === null ? null : Buffer.from(encodeOutputToken(outputToken)); + const ixBuilder = this.program.methods.stageOutbound({ + ...args, + amountIn: uint64ToBN(amountIn), + redeemOption, + encodedOutputToken, + }); + + if (transferType === "native") { + if (sender === undefined) { + sender = payer; + } + if (senderToken === undefined) { + senderToken = null; + } + if (programTransferAuthority === undefined) { + programTransferAuthority = null; + } + } else if (transferType === "programTransferAuthority") { + if (sender === undefined) { + sender = null; + } + // This checks if undefined or null. + if (senderToken === undefined) { + throw new Error("senderToken must be provided"); + } + } else if (transferType === "sender") { + if (sender === undefined) { + sender = payer; + } + senderToken ??= splToken.getAssociatedTokenAddressSync(srcMint, sender); + if (programTransferAuthority === undefined) { + programTransferAuthority = null; + } + } else { + throw new Error("invalid transfer type"); + } + + const definedAccounts = { + payer, + sender, + programTransferAuthority: null, + senderToken, + targetPeer: this.registeredPeerComposite({ peer, chain: args.targetChain }), + stagedOutbound, + stagedCustodyToken: this.stagedCustodyTokenAddress(stagedOutbound), + usdcRefundToken, + srcMint, + tokenProgram: splToken.TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }; + + // TODO: This approval amount will not be correct if RedeemOption is Relay. Fix this. + let approveIx: TransactionInstruction | null = null; + if (programTransferAuthority === undefined) { + if (transferType === "programTransferAuthority") { + const hashedArgs = await ixBuilder + .accounts(definedAccounts) + .instruction() + .then((ix) => keccak256(ix.data.subarray(8))); + + // Replace the program transfer authority in the defined accounts. + [programTransferAuthority] = PublicKey.findProgramAddressSync( + [Buffer.from("transfer-authority"), hashedArgs], + this.ID, + ); + + const owner = await splToken + .getAccount(this.connection(), senderToken) + .then((token) => token.owner) + .catch((_) => PublicKey.default); + approveIx = splToken.createApproveInstruction( + senderToken, + programTransferAuthority, + owner, + uint64ToBigInt(amountIn), + ); + + definedAccounts.programTransferAuthority = programTransferAuthority; + } + } + + return [approveIx, await ixBuilder.accounts(definedAccounts).instruction()]; + } + async initiateTransferIx( accounts: { payer: PublicKey; @@ -419,7 +577,7 @@ export class SwapLayerProgram { ) { let { payer, preparedOrder, payerToken, peer } = accounts; - payerToken ??= splToken.getAssociatedTokenAddressSync(this.mint, payer); + payerToken ??= splToken.getAssociatedTokenAddressSync(this.usdcMint, payer); peer ??= this.peerAddress(args.targetChain as wormholeSdk.ChainId); const tokenRouter = this.tokenRouterProgram(); @@ -429,7 +587,7 @@ export class SwapLayerProgram { .accounts({ payer, payerToken, - usdc: this.usdcComposite(this.mint), + usdc: this.usdcComposite(), peer, tokenRouterCustodian: tokenRouter.custodianAddress(), preparedOrder, @@ -464,7 +622,7 @@ export class SwapLayerProgram { } = accounts; beneficiary ??= payer; - recipientTokenAccount ??= splToken.getAssociatedTokenAddressSync(this.mint, recipient); + recipientTokenAccount ??= splToken.getAssociatedTokenAddressSync(this.usdcMint, recipient); // Need the undefined check to satisfy the type checker. feeRecipientToken ??= await this.fetchCustodian().then((c) => c.feeRecipientToken); @@ -487,7 +645,7 @@ export class SwapLayerProgram { completeTokenAccount: this.completeTokenAccountKey(preparedFill), recipient, recipientTokenAccount, - usdc: this.usdcComposite(this.mint), + usdc: this.usdcComposite(), feeRecipientToken, tokenProgram: splToken.TOKEN_PROGRAM_ID, systemProgram: SystemProgram.programId, @@ -510,7 +668,7 @@ export class SwapLayerProgram { beneficiary ??= payer; recipient ??= payer; - recipientTokenAccount ??= splToken.getAssociatedTokenAddressSync(this.mint, recipient); + recipientTokenAccount ??= splToken.getAssociatedTokenAddressSync(this.usdcMint, recipient); return this.program.methods .completeTransferDirect() @@ -544,7 +702,7 @@ export class SwapLayerProgram { beneficiary ??= payer; const stagedInbound = this.stagedInboundAddress(preparedFill); - const stagedCustodyToken = this.stagedInboundTokenAddress(stagedInbound); + const stagedCustodyToken = this.stagedCustodyTokenAddress(stagedInbound); return this.program.methods .completeTransferPayload() @@ -560,7 +718,7 @@ export class SwapLayerProgram { ), stagedInbound, stagedCustodyToken, - usdc: this.usdcComposite(this.mint), + usdc: this.usdcComposite(), tokenProgram: splToken.TOKEN_PROGRAM_ID, systemProgram: SystemProgram.programId, }) @@ -582,7 +740,7 @@ export class SwapLayerProgram { beneficiary, stagedInbound, dstToken, - stagedCustodyToken: this.stagedInboundTokenAddress(stagedInbound), + stagedCustodyToken: this.stagedCustodyTokenAddress(stagedInbound), tokenProgram: splToken.TOKEN_PROGRAM_ID, }) .instruction(); @@ -595,7 +753,6 @@ export class SwapLayerProgram { recipient: PublicKey; dstMint?: PublicKey; beneficiary?: PublicKey; - srcMint?: PublicKey; }, args: { cpiInstruction: TransactionInstruction; @@ -604,9 +761,8 @@ export class SwapLayerProgram { const { payer, preparedFill, recipient } = accounts; const { cpiInstruction } = args; - let { beneficiary, srcMint, dstMint } = accounts; + let { beneficiary, dstMint } = accounts; beneficiary ??= payer; - srcMint ??= this.mint; dstMint ??= splToken.NATIVE_MINT; const swapAuthority = this.swapAuthorityAddress(preparedFill); @@ -622,7 +778,7 @@ export class SwapLayerProgram { }), authority: swapAuthority, srcSwapToken: splToken.getAssociatedTokenAddressSync( - srcMint, + this.usdcMint, swapAuthority, true, // allowOwnerOffCurve ), @@ -631,7 +787,7 @@ export class SwapLayerProgram { swapAuthority, true, // allowOwnerOffCurve ), - srcMint, + usdc: this.usdcComposite(), dstMint, associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, tokenProgram: splToken.TOKEN_PROGRAM_ID, @@ -648,9 +804,9 @@ export class SwapLayerProgram { switch (this._programId) { case localnet(): { return new tokenRouterSdk.TokenRouterProgram( - this.program.provider.connection, + this.connection(), tokenRouterSdk.localnet(), - this.mint, + this.usdcMint, ); } default: { diff --git a/solana/ts/src/swapLayer/state/Peer.ts b/solana/ts/src/swapLayer/state/Peer.ts index 9eeb97b4..2857e5fd 100644 --- a/solana/ts/src/swapLayer/state/Peer.ts +++ b/solana/ts/src/swapLayer/state/Peer.ts @@ -17,13 +17,18 @@ export type RelayParams = { executionParams: ExecutionParams; }; -export class Peer { +export type PeerSeeds = { chain: number; + bump: number; +}; + +export class Peer { + seeds: PeerSeeds; address: Array; relayParams: RelayParams; - constructor(chain: number, address: Array, relayParams: RelayParams) { - this.chain = chain; + constructor(seeds: PeerSeeds, address: Array, relayParams: RelayParams) { + this.seeds = seeds; this.address = address; this.relayParams = relayParams; } diff --git a/solana/ts/src/swapLayer/state/StagedOutbound.ts b/solana/ts/src/swapLayer/state/StagedOutbound.ts new file mode 100644 index 00000000..d9f8bf99 --- /dev/null +++ b/solana/ts/src/swapLayer/state/StagedOutbound.ts @@ -0,0 +1,39 @@ +import { BN } from "@coral-xyz/anchor"; +import { PublicKey } from "@solana/web3.js"; + +export type RedeemOption = + | { + relay: { + gasDropoff: number; + maxRelayerFee: BN; + }; + } + | { + payload: [Buffer]; + }; + +export type StagedRedeem = + | { direct: {} } + | { relay: { gasDropoff: number; relayingFee: BN } } + | { payload: [Buffer] }; + +export type StagedOutboundInfo = { + custodyTokenBump: number; + preparedBy: PublicKey; + sender: PublicKey; + targetChain: number; + recipient: Array; + usdcRefundToken: PublicKey; +}; + +export class StagedOutbound { + info: StagedOutboundInfo; + stagedRedeem: StagedRedeem; + encodedOutputToken: Buffer; + + constructor(info: StagedOutboundInfo, stagedRedeem: StagedRedeem, encodedOutputToken: Buffer) { + this.info = info; + this.stagedRedeem = stagedRedeem; + this.encodedOutputToken = encodedOutputToken; + } +} diff --git a/solana/ts/src/swapLayer/state/index.ts b/solana/ts/src/swapLayer/state/index.ts index e2b57382..cbf4c039 100644 --- a/solana/ts/src/swapLayer/state/index.ts +++ b/solana/ts/src/swapLayer/state/index.ts @@ -1,3 +1,4 @@ export * from "./Custodian"; export * from "./Peer"; export * from "./StagedInbound"; +export * from "./StagedOutbound"; diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__swapLayer.ts index c702821b..158577c2 100644 --- a/solana/ts/tests/01__swapLayer.ts +++ b/solana/ts/tests/01__swapLayer.ts @@ -4,6 +4,7 @@ import { ComputeBudgetProgram, Connection, Keypair, + LAMPORTS_PER_SOL, PublicKey, SystemProgram, TransactionInstruction, @@ -12,6 +13,7 @@ import { CctpTokenBurnMessage } from "@wormhole-foundation/example-liquidity-lay import { LiquidityLayerDeposit, LiquidityLayerMessage, + uint64ToBN, } from "@wormhole-foundation/example-liquidity-layer-solana/common"; import { CircleAttester, @@ -29,36 +31,29 @@ import { postLiquidityLayerVaa, toUniversalAddress, } from "@wormhole-foundation/example-liquidity-layer-solana/testing"; -import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; import { PreparedOrder } from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter/state"; import { ChainId, toChain, toChainId } from "@wormhole-foundation/sdk-base"; import { UniversalAddress } from "@wormhole-foundation/sdk-definitions"; -import { use as chaiUse, expect } from "chai"; +import { assert } from "chai"; import { AddPeerArgs, Custodian, + OutputToken, Peer, + RedeemOption, RelayParams, StagedInbound, + StagedOutbound, SwapLayerProgram, U32_MAX, UpdateRelayParametersArgs, calculateRelayerFee, denormalizeGasDropOff, + encodeOutputToken, encodeSwapLayerMessage, localnet, - encodeOutputToken, - OutputToken, } from "../src/swapLayer"; -import { - FEE_UPDATER_KEYPAIR, - REGISTERED_PEERS, - createLut, - hackedExpectDeepEqual, - tryNativeToUint8Array, -} from "./helpers"; - -chaiUse(require("chai-as-promised")); +import { FEE_UPDATER_KEYPAIR, REGISTERED_PEERS, createLut, tryNativeToUint8Array } from "./helpers"; const SOLANA_CHAIN_ID = toChainId("Solana"); @@ -86,17 +81,13 @@ describe("Swap Layer", () => { // Program SDKs const swapLayer = new SwapLayerProgram(connection, localnet(), USDC_MINT_ADDRESS); - const tokenRouter = new tokenRouterSdk.TokenRouterProgram( - connection, - tokenRouterSdk.localnet(), - USDC_MINT_ADDRESS, - ); + const tokenRouter = swapLayer.tokenRouterProgram(); let tokenRouterLkupTable: PublicKey; const relayParamsForTest: RelayParams = { baseFee: 100000, - nativeTokenPrice: new BN(1000000), + nativeTokenPrice: uint64ToBN(1000000), maxGasDropoff: 500000, gasDropoffMargin: 10000, executionParams: { @@ -107,6 +98,10 @@ describe("Swap Layer", () => { }, }; + let testCctpNonce = 2n ** 64n - 20n * 6400n; + + let wormholeSequence = 2000n; + describe("Admin", () => { describe("Initialize", () => { it("Initialize", async () => { @@ -121,7 +116,7 @@ describe("Swap Layer", () => { const custodianData = await swapLayer.fetchCustodian(); - hackedExpectDeepEqual( + assert.deepEqual( custodianData, new Custodian( payer.publicKey, @@ -201,7 +196,7 @@ describe("Swap Layer", () => { describe("Peer Registration", () => { const startParams: RelayParams = { baseFee: 200000, - nativeTokenPrice: new BN(4000000), + nativeTokenPrice: uint64ToBN(4000000), maxGasDropoff: 200000, gasDropoffMargin: 50000, executionParams: { @@ -387,9 +382,14 @@ describe("Swap Layer", () => { await expectIxOk(connection, [await createAddPeerIx()], [payer]); const peer = await swapLayer.fetchPeer(foreignChain); - hackedExpectDeepEqual( + const { seeds } = peer; + assert.deepEqual( peer, - new Peer(foreignChain, foreignRecipientAddress, startParams), + new Peer( + { chain: foreignChain, bump: seeds.bump }, + foreignRecipientAddress, + startParams, + ), ); }); }); @@ -538,9 +538,14 @@ describe("Swap Layer", () => { await expectIxOk(connection, [await createUpdatePeerIx()], [payer]); const peer = await swapLayer.fetchPeer(foreignChain); - hackedExpectDeepEqual( + const { seeds } = peer; + assert.deepEqual( peer, - new Peer(foreignChain, foreignSwapLayerAddress, relayParamsForTest), + new Peer( + { chain: foreignChain, bump: seeds.bump }, + foreignSwapLayerAddress, + relayParamsForTest, + ), ); }); }); @@ -582,7 +587,7 @@ describe("Swap Layer", () => { // Confirm that the pending owner variable is set in the owner config. const custodianData = await swapLayer.fetchCustodian(); - hackedExpectDeepEqual(custodianData.pendingOwner, owner.publicKey); + assert.deepEqual(custodianData.pendingOwner, owner.publicKey); }); it("Confirm Ownership Transfer Request as Pending Owner", async function () { @@ -595,8 +600,8 @@ describe("Swap Layer", () => { // Confirm that the custodian reflects the current ownership status. { const custodianData = await swapLayer.fetchCustodian(); - hackedExpectDeepEqual(custodianData.owner, owner.publicKey); - hackedExpectDeepEqual(custodianData.pendingOwner, null); + assert.deepEqual(custodianData.owner, owner.publicKey); + assert.deepEqual(custodianData.pendingOwner, null); } }); @@ -648,7 +653,7 @@ describe("Swap Layer", () => { // Confirm that the pending owner variable is set in the owner config. const custodianData = await swapLayer.fetchCustodian(); - expect(custodianData.pendingOwner).to.eql(feeUpdater.publicKey); + assert.deepEqual(custodianData.pendingOwner, feeUpdater.publicKey); }); it("Cannot Confirm Ownership Transfer Request as Non Pending Owner", async function () { @@ -674,8 +679,8 @@ describe("Swap Layer", () => { // Confirm that the custodian reflects the current ownership status. { const custodianData = await swapLayer.fetchCustodian(); - hackedExpectDeepEqual(custodianData.owner, feeUpdater.publicKey); - hackedExpectDeepEqual(custodianData.pendingOwner, null); + assert.deepEqual(custodianData.owner, feeUpdater.publicKey); + assert.deepEqual(custodianData.pendingOwner, null); } // Set the owner back to the payer key. @@ -699,8 +704,8 @@ describe("Swap Layer", () => { // Confirm that the payer is the owner again. { const custodianData = await swapLayer.fetchCustodian(); - hackedExpectDeepEqual(custodianData.owner, owner.publicKey); - hackedExpectDeepEqual(custodianData.pendingOwner, null); + assert.deepEqual(custodianData.owner, owner.publicKey); + assert.deepEqual(custodianData.pendingOwner, null); } }); @@ -715,7 +720,7 @@ describe("Swap Layer", () => { // Confirm that the pending owner variable is set in the owner config. { const custodianData = await swapLayer.fetchCustodian(); - expect(custodianData.pendingOwner).to.eql(feeUpdater.publicKey); + assert.deepEqual(custodianData.pendingOwner, feeUpdater.publicKey); } // Confirm that the cancel ownership transfer request fails. @@ -736,7 +741,7 @@ describe("Swap Layer", () => { // Confirm the pending owner field was reset. const custodianData = await swapLayer.fetchCustodian(); - expect(custodianData.pendingOwner).to.eql(null); + assert.isNull(custodianData.pendingOwner); }); }); @@ -778,7 +783,7 @@ describe("Swap Layer", () => { // Confirm the assistant field was updated. const custodianData = await swapLayer.fetchCustodian(); - expect(custodianData.ownerAssistant).to.eql(feeUpdater.publicKey); + assert.deepEqual(custodianData.ownerAssistant, feeUpdater.publicKey); // Set the assistant back to the assistant key. await expectIxOk( @@ -827,7 +832,7 @@ describe("Swap Layer", () => { // Confirm the fee updater field was updated. const custodianData = await swapLayer.fetchCustodian(); - hackedExpectDeepEqual(custodianData.feeRecipientToken, feeRecipientToken); + assert.deepEqual(custodianData.feeRecipientToken, feeRecipientToken); // Revert back to original fee updater. await expectIxOk( @@ -863,7 +868,7 @@ describe("Swap Layer", () => { it("Update Fee Recipient as Owner Assistant", async function () { const ix = localVariables.get("ix") as TransactionInstruction; - expect(localVariables.delete("ix")).is.true; + assert.isTrue(localVariables.delete("ix")); await splToken.getOrCreateAssociatedTokenAccount( connection, @@ -875,7 +880,8 @@ describe("Swap Layer", () => { await expectIxOk(connection, [ix], [ownerAssistant]); const custodianData = await swapLayer.fetchCustodian(); - expect(custodianData.feeRecipientToken).to.eql( + assert.deepEqual( + custodianData.feeRecipientToken, splToken.getAssociatedTokenAddressSync(USDC_MINT_ADDRESS, newFeeRecipient), ); }); @@ -906,7 +912,7 @@ describe("Swap Layer", () => { await expectIxOk(connection, [ix], [owner]); const custodianData = await swapLayer.fetchCustodian(); - expect(custodianData.feeRecipientToken).to.eql(feeRecipientToken); + assert.deepEqual(custodianData.feeRecipientToken, feeRecipientToken); }); }); @@ -1055,7 +1061,7 @@ describe("Swap Layer", () => { ); const peer = await swapLayer.fetchPeer(foreignChain); - hackedExpectDeepEqual(peer.relayParams, relayParams); + assert.deepEqual(peer.relayParams, relayParams); }); it("Update Relay Parameters as Owner Assistant", async () => { @@ -1078,7 +1084,7 @@ describe("Swap Layer", () => { ); const peer = await swapLayer.fetchPeer(foreignChain); - hackedExpectDeepEqual(peer.relayParams, relayParams); + assert.deepEqual(peer.relayParams, relayParams); }); it("Update Relay Parameters as Fee Updater", async () => { @@ -1100,144 +1106,490 @@ describe("Swap Layer", () => { ); const peer = await swapLayer.fetchPeer(foreignChain); - hackedExpectDeepEqual(peer.relayParams, relayParams); + assert.deepEqual(peer.relayParams, relayParams); }); }); }); describe("Business Logic", function () { - let testCctpNonce = 2n ** 64n - 20n * 6400n; + describe("Stage Outbound", function () { + const localVariables = new Map(); - let wormholeSequence = 2000n; - describe("USDC Transfer (Relay)", function () { - describe("Outbound", function () { - it("Cannot Initiate Transfer (Invalid Prepared Order)", async function () { - const amountIn = 6900000000n; - const gasDropoff = 100000; - const maxRelayerFee = 9999999999999; + it("Cannot Stage Outbound -- Native SOL In, Direct USDC Out (Sender Required)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; - // Pass the payer key as the prepared order. - const ix = await swapLayer.initiateTransferIx( - { - payer: payer.publicKey, - preparedOrder: payer.publicKey, - }, + const amountIn = 690000n; + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + stagedOutbound, + usdcRefundToken: splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ), + sender: null, + }, + { + transferType: "native", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNull(approveIx); + + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "rror Code: SenderRequired", + ); + }); + + it("Stage Outbound -- Native SOL In, Direct USDC Out", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const senderSigner = Keypair.generate(); + const sender = senderSigner.publicKey; + await expectIxOk( + connection, + [ + SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: sender, + lamports: LAMPORTS_PER_SOL, + }), + ], + [payer], + ); + + const amountIn = 690000n; + const usdcRefundToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + stagedOutbound, + usdcRefundToken, + sender, + }, + { + transferType: "native", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNull(approveIx); + + const balanceBefore = await connection.getBalance(sender).then(BigInt); + await expectIxOk(connection, [ix], [payer, stagedOutboundSigner, senderSigner]); + + const balanceAfter = await connection.getBalance(sender).then(BigInt); + assert.equal(balanceBefore - balanceAfter, amountIn); + + const stagedOutboundData = await swapLayer.fetchStagedOutbound(stagedOutbound); + const { info } = stagedOutboundData; + assert.deepEqual( + stagedOutboundData, + new StagedOutbound( { - amountIn: new BN(amountIn.toString()), + custodyTokenBump: info.custodyTokenBump, + preparedBy: payer.publicKey, + sender, targetChain: foreignChain, - relayOptions: { - gasDropoff: gasDropoff, - maxRelayerFee: new BN(maxRelayerFee), - }, recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), - payload: null, + usdcRefundToken, }, - ); + { direct: {} }, + Buffer.alloc(1), + ), + ); + }); - await expectIxErr(connection, [ix], [payer], "InvalidPreparedOrder"); - }); + it("Stage Outbound -- USDC In, Direct USDC Out", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; - it("Cannot Initiate Transfer (Invalid Peer)", async function () { - const amountIn = 6900000000n; - const gasDropoff = 100000; - const maxRelayerFee = 9999999999999; - const invalidChain = 69; + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNull(approveIx); - const preparedOrder = Keypair.generate(); + const { amount: balanceBefore } = await splToken.getAccount( + connection, + senderToken, + ); + await expectIxOk(connection, [ix], [payer, stagedOutboundSigner]); - // Pass the payer key as the prepared order. - const ix = await swapLayer.initiateTransferIx( - { - payer: payer.publicKey, - preparedOrder: preparedOrder.publicKey, - }, - { - amountIn: new BN(amountIn.toString()), - targetChain: invalidChain, - relayOptions: { - gasDropoff: gasDropoff, - maxRelayerFee: new BN(maxRelayerFee), - }, - recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), - payload: null, - }, - ); + const { amount: balanceAfter } = await splToken.getAccount(connection, senderToken); + assert.equal(balanceBefore - balanceAfter, amountIn); - await expectIxErr( - connection, - [ix], - [payer, preparedOrder], - "AccountNotInitialized", - ); - }); + const stagedOutboundData = await swapLayer.fetchStagedOutbound(stagedOutbound); - it("Cannot Initiate Transfer (Invalid Recipient)", async function () { - const amountIn = 6900000000n; - const gasDropoff = 100000; - const maxRelayerFee = 9999999999999; + // Save for later. + localVariables.set("ix", ix); + localVariables.set("stagedOutboundSigner", stagedOutboundSigner); + }); - const preparedOrder = Keypair.generate(); + it("Cannot Stage Outbound with Existing Staged Outbound Account", async function () { + const ix = localVariables.get("ix") as TransactionInstruction; + assert.isTrue(localVariables.delete("ix")); - // Pass the payer key as the prepared order. - const ix = await swapLayer.initiateTransferIx( - { - payer: payer.publicKey, - preparedOrder: preparedOrder.publicKey, - }, - { - amountIn: new BN(amountIn.toString()), - targetChain: foreignChain, - relayOptions: { - gasDropoff: gasDropoff, - maxRelayerFee: new BN(maxRelayerFee), - }, - recipient: new Array(32).fill(0), - encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), - payload: null, - }, - ); + const stagedOutboundSigner = localVariables.get("stagedOutboundSigner") as Keypair; + assert.isTrue(localVariables.delete("stagedOutboundSigner")); - await expectIxErr(connection, [ix], [payer, preparedOrder], "InvalidRecipient"); - }); + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + `account Address { address: ${stagedOutboundSigner.publicKey.toString()}, base: None } already in use`, + ); + }); - it("Cannot Initiate Transfer (Max Relayer Fee Exceeded)", async function () { - const amountIn = 6900000000n; - const gasDropoff = 100000; + it("Cannot Stage Outbound -- Invalid Recipient", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; - // Set the max relayer fee to the minimum. - const maxRelayerFee = 1; + const amountIn = 690000n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: new Array(32).fill(0), + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, + outputToken: null, + }, + ); - const preparedOrder = Keypair.generate(); + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "Error Code: InvalidRecipient", + ); + }); - // Pass the payer key as the prepared order. - const ix = await swapLayer.initiateTransferIx( - { - payer: payer.publicKey, - preparedOrder: preparedOrder.publicKey, - }, - { - amountIn: new BN(amountIn.toString()), - targetChain: foreignChain, - relayOptions: { - gasDropoff: gasDropoff, - maxRelayerFee: new BN(maxRelayerFee), - }, - recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), - payload: null, - }, + it("Cannot Stage Outbound -- Exceeds Max Relayer Fee", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 690000n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1n } }, + outputToken: null, + }, + ); + + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "Error Code: ExceedsMaxRelayingFee", + ); + }); + + it.skip("Cannot Stage Outbound -- Relaying Disabled", async function () { + // TODO + }); + + it("Cannot Stage Outbound -- USDC In with Program Transfer Authority (Sender Token Required)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 690000n; + const ixs = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken: null, + stagedOutbound, + usdcRefundToken: splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ), + }, + { + transferType: "programTransferAuthority", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNotNull(ixs[0]); + + await expectIxErr( + connection, + [ixs[1]], + [payer, stagedOutboundSigner], + "Error Code: SenderTokenRequired", + ); + }); + + it("Stage Outbound -- USDC In, Direct USDC Out with Program Transfer Authority", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const ixs = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "programTransferAuthority", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNotNull(ixs[0]); + + const { amount: balanceBefore } = await splToken.getAccount( + connection, + senderToken, + ); + await expectIxOk(connection, ixs, [payer, stagedOutboundSigner]); + + const { amount: balanceAfter } = await splToken.getAccount(connection, senderToken); + assert.equal(balanceBefore - balanceAfter, amountIn); + }); + + it("Stage Outbound -- USDC In, Relay USDC Out", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 690000n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, + outputToken: null, + }, + ); + + const { amount: balanceBefore } = await splToken.getAccount( + connection, + senderToken, + ); + await expectIxOk(connection, [ix], [payer, stagedOutboundSigner]); + + const { amount: balanceAfter } = await splToken.getAccount(connection, senderToken); + + const { relayParams } = await swapLayer.fetchPeer(foreignChain); + const expectedRelayerFee = calculateRelayerFee( + relayParams, + denormalizeGasDropOff(gasDropoff), + { type: "Usdc" }, + ); + assert.equal(balanceBefore - balanceAfter, amountIn + expectedRelayerFee); + }); + + it("Cannot Stage Outbound -- USDC In, Relay USDC Out (U64 Overflow)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 2n ** 64n - 1n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, + outputToken: null, + }, + ); + + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "Error Code: U64Overflow", + ); + }); + + it("Stage Outbound -- USDC In, Payload USDC Out", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const ixs = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "programTransferAuthority", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { payload: Buffer.from("All your base are belong to us.") }, + outputToken: null, + }, + ); + assert.isNotNull(ixs[0]); + + const { amount: balanceBefore } = await splToken.getAccount( + connection, + senderToken, + ); + await expectIxOk(connection, ixs, [payer, stagedOutboundSigner]); + + const { amount: balanceAfter } = await splToken.getAccount(connection, senderToken); + assert.equal(balanceBefore - balanceAfter, amountIn); + }); + }); + + describe("USDC Transfer (Relay)", function () { + describe("Outbound", function () { + it("Cannot Initiate Transfer (Non-Existent Peer)", async function () { + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, ); + const { stagedOutbound, stagedCustodyToken } = await stageOutboundForTest({ + payer: payer.publicKey, + senderToken, + }); + + const invalidChain = toChainId("Holesky"); + + const preparedOrder = PublicKey.findProgramAddressSync( + [Buffer.from("prepared-order"), stagedOutbound.toBuffer()], + swapLayer.ID, + )[0]; + + const ix = await swapLayer.program.methods + .initiateTransferNew() + .accounts({ + payer: payer.publicKey, + custodian: swapLayer.checkedCustodianComposite(), + preparedBy: payer.publicKey, + stagedOutbound, + stagedCustodyToken, + usdcRefundToken: senderToken, + targetPeer: swapLayer.registeredPeerComposite({ + chain: invalidChain, + }), + tokenRouterCustodian: tokenRouter.custodianAddress(), + preparedOrder, + preparedCustodyToken: + tokenRouter.preparedCustodyTokenAddress(preparedOrder), + usdc: swapLayer.usdcComposite(), + tokenRouterProgram: tokenRouter.ID, + tokenProgram: splToken.TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }) + .instruction(); + await expectIxErr( connection, [ix], - [payer, preparedOrder], - "ExceedsMaxRelayingFee", + [payer], + "peer. Error Code: AccountNotInitialized", ); }); + it.skip("Cannot Initiate Transfer (Peer Mismatch)", async function () { + // TODO + }); + it("Cannot Initiate Transfer (Relaying Disabled)", async function () { const amountIn = 6900000000n; const gasDropoff = 100000; @@ -1370,7 +1722,7 @@ describe("Swap Layer", () => { // Balance check. const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - expect(payerAfter).to.equal(payerBefore - amountIn - expectedRelayerFee); + assert.equal(payerAfter, payerBefore - amountIn - expectedRelayerFee); // Verify the relevant information in the prepared order. const preparedOrderData = await tokenRouter.fetchPreparedOrder( @@ -1381,7 +1733,7 @@ describe("Swap Layer", () => { info: { preparedCustodyTokenBump }, } = preparedOrderData; - hackedExpectDeepEqual( + assert.deepEqual( preparedOrderData, new PreparedOrder( { @@ -1419,7 +1771,7 @@ describe("Swap Layer", () => { connection, tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), ); - expect(preparedCustodyTokenBalance).equals(amountIn + expectedRelayerFee); + assert.equal(preparedCustodyTokenBalance, amountIn + expectedRelayerFee); }); it("Initiate Transfer Without Gas Dropoff", async function () { @@ -1470,7 +1822,7 @@ describe("Swap Layer", () => { // Balance check. const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - expect(payerAfter).to.equal(payerBefore - amountIn - expectedRelayerFee); + assert.equal(payerAfter, payerBefore - amountIn - expectedRelayerFee); // Verify the relevant information in the prepared order. const preparedOrderData = await tokenRouter.fetchPreparedOrder( @@ -1481,7 +1833,7 @@ describe("Swap Layer", () => { info: { preparedCustodyTokenBump }, } = preparedOrderData; - hackedExpectDeepEqual( + assert.deepEqual( preparedOrderData, new PreparedOrder( { @@ -1519,7 +1871,7 @@ describe("Swap Layer", () => { connection, tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), ); - expect(preparedCustodyTokenBalance).equals(amountIn + expectedRelayerFee); + assert.equal(preparedCustodyTokenBalance, amountIn + expectedRelayerFee); }); it("Initiate Transfer With Gas Dropoff And Target Swap", async function () { @@ -1586,7 +1938,7 @@ describe("Swap Layer", () => { // Balance check. const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - expect(payerAfter).to.equal(payerBefore - amountIn - expectedRelayerFee); + assert.equal(payerAfter, payerBefore - amountIn - expectedRelayerFee); // Verify the relevant information in the prepared order. const preparedOrderData = await tokenRouter.fetchPreparedOrder( @@ -1597,7 +1949,7 @@ describe("Swap Layer", () => { info: { preparedCustodyTokenBump }, } = preparedOrderData; - hackedExpectDeepEqual( + assert.deepEqual( preparedOrderData, new PreparedOrder( { @@ -1635,7 +1987,7 @@ describe("Swap Layer", () => { connection, tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), ); - expect(preparedCustodyTokenBalance).equals(amountIn + expectedRelayerFee); + assert.equal(preparedCustodyTokenBalance, amountIn + expectedRelayerFee); }); it("Initiate Transfer Without Gas Dropoff And Target Swap", async function () { @@ -1702,7 +2054,7 @@ describe("Swap Layer", () => { // Balance check. const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - expect(payerAfter).to.equal(payerBefore - amountIn - expectedRelayerFee); + assert.equal(payerAfter, payerBefore - amountIn - expectedRelayerFee); // Verify the relevant information in the prepared order. const preparedOrderData = await tokenRouter.fetchPreparedOrder( @@ -1713,7 +2065,7 @@ describe("Swap Layer", () => { info: { preparedCustodyTokenBump }, } = preparedOrderData; - hackedExpectDeepEqual( + assert.deepEqual( preparedOrderData, new PreparedOrder( { @@ -1751,18 +2103,13 @@ describe("Swap Layer", () => { connection, tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), ); - expect(preparedCustodyTokenBalance).equals(amountIn + expectedRelayerFee); + assert.equal(preparedCustodyTokenBalance, amountIn + expectedRelayerFee); }); }); describe("Inbound", function () { it("Cannot Complete Transfer (Invalid Fee Recipient)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -1811,11 +2158,6 @@ describe("Swap Layer", () => { const invalidChain = 69; const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -1848,11 +2190,6 @@ describe("Swap Layer", () => { it("Cannot Complete Transfer (Invalid Swap Message)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -1878,11 +2215,6 @@ describe("Swap Layer", () => { it("Cannot Complete Transfer (Invalid Peer)", async function () { // Create a valid transfer but from the wrong sender. const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -1921,11 +2253,6 @@ describe("Swap Layer", () => { it("Cannot Complete Transfer (Invalid Output Token)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -1968,11 +2295,6 @@ describe("Swap Layer", () => { it("Cannot Complete Transfer (Invalid Recipient)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2005,11 +2327,6 @@ describe("Swap Layer", () => { it("Cannot Complete Transfer (Invalid Redeem Mode)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2038,11 +2355,6 @@ describe("Swap Layer", () => { it("Complete Transfer (Payer == Recipient)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2085,11 +2397,9 @@ describe("Swap Layer", () => { const payerLamportAfter = await connection.getBalance(payer.publicKey); const feeRecipientAfter = await getUsdcAtaBalance(connection, feeRecipient); - expect(recipientAfter).to.equal( - recipientBefore + message.deposit!.message.amount, - ); - expect(payerLamportAfter).to.be.lessThan(payerLamportBefore); - expect(feeRecipientAfter).to.equal(feeRecipientBefore); + assert.equal(recipientAfter, recipientBefore + message.deposit!.message.amount); + assert.isBelow(payerLamportAfter, payerLamportBefore); + assert.equal(feeRecipientAfter, feeRecipientBefore); }); it("Complete Transfer With Gas Dropoff", async function () { @@ -2097,11 +2407,6 @@ describe("Swap Layer", () => { const gasAmountDenorm = 690000000; const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2152,16 +2457,13 @@ describe("Swap Layer", () => { const payerLamportAfter = await connection.getBalance(payer.publicKey); const feeRecipientAfter = await getUsdcAtaBalance(connection, feeRecipient); - expect(recipientAfter - recipientBefore).to.equal( + assert.equal( + recipientAfter - recipientBefore, message.deposit!.message.amount - relayerFee, ); - expect(recipientLamportAfter - recipientLamportBefore).to.equal( - Number(gasAmountDenorm), - ); - expect(payerLamportAfter).to.be.lessThan( - payerLamportBefore - Number(gasAmountDenorm), - ); - expect(feeRecipientAfter).to.equal(feeRecipientBefore + relayerFee); + assert.equal(recipientLamportAfter - recipientLamportBefore, gasAmountDenorm); + assert.isBelow(payerLamportAfter, payerLamportBefore - gasAmountDenorm); + assert.equal(feeRecipientAfter, feeRecipientBefore + relayerFee); }); it("Complete Transfer Without Gas Dropoff", async function () { @@ -2169,11 +2471,6 @@ describe("Swap Layer", () => { const gasAmount = 0; const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2224,16 +2521,13 @@ describe("Swap Layer", () => { const payerLamportAfter = await connection.getBalance(payer.publicKey); const feeRecipientAfter = await getUsdcAtaBalance(connection, feeRecipient); - expect(recipientAfter - recipientBefore).to.equal( + assert.equal( + recipientAfter - recipientBefore, message.deposit!.message.amount - relayerFee, ); - expect(recipientLamportAfter - recipientLamportBefore).to.equal( - Number(gasAmount), - ); - expect(payerLamportAfter).to.be.lessThan( - payerLamportBefore - Number(gasAmount), - ); - expect(feeRecipientAfter).to.equal(feeRecipientBefore + relayerFee); + assert.equal(recipientLamportAfter - recipientLamportBefore, gasAmount); + assert.isBelow(payerLamportAfter, payerLamportBefore - gasAmount); + assert.equal(feeRecipientAfter, feeRecipientBefore + relayerFee); }); }); }); @@ -2273,7 +2567,7 @@ describe("Swap Layer", () => { // Balance check. const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - expect(payerAfter).to.equal(payerBefore - amountIn); + assert.equal(payerAfter, payerBefore - amountIn); // Verify the relevant information in the prepared order. const preparedOrderData = await tokenRouter.fetchPreparedOrder( @@ -2284,7 +2578,7 @@ describe("Swap Layer", () => { info: { preparedCustodyTokenBump }, } = preparedOrderData; - hackedExpectDeepEqual( + assert.deepEqual( preparedOrderData, new PreparedOrder( { @@ -2318,18 +2612,13 @@ describe("Swap Layer", () => { connection, tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), ); - expect(preparedCustodyTokenBalance).equals(amountIn); + assert.equal(preparedCustodyTokenBalance, amountIn); }); }); describe("Inbound", function () { it("Cannot Complete Transfer (Invalid Swap Message)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2355,11 +2644,6 @@ describe("Swap Layer", () => { it("Cannot Complete Transfer (Invalid Peer)", async function () { // Create a valid transfer but from the wrong sender. const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2397,11 +2681,6 @@ describe("Swap Layer", () => { it("Cannot Complete Transfer (Peer Doesn't Exist)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2433,11 +2712,6 @@ describe("Swap Layer", () => { it("Cannot Complete Transfer (Invalid Recipient)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2469,11 +2743,6 @@ describe("Swap Layer", () => { it("Cannot Complete Transfer (Invalid Output Token)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2517,11 +2786,6 @@ describe("Swap Layer", () => { it("Complete Transfer (Recipient Not Payer)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2564,19 +2828,12 @@ describe("Swap Layer", () => { const recipientAfter = await getUsdcAtaBalance(connection, recipient.publicKey); const beneficiaryAfter = await connection.getBalance(beneficiary.publicKey); - expect(recipientAfter).to.equal( - recipientBefore + message.deposit!.message.amount, - ); - expect(beneficiaryAfter).to.be.greaterThan(beneficiaryBefore); + assert.equal(recipientAfter, recipientBefore + message.deposit!.message.amount); + assert.isAbove(beneficiaryAfter, beneficiaryBefore); }); it("Complete Transfer (Recipient Is Payer)", async function () { const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2612,10 +2869,8 @@ describe("Swap Layer", () => { const recipientAfter = await getUsdcAtaBalance(connection, payer.publicKey); const beneficiaryAfter = await connection.getBalance(beneficiary.publicKey); - expect(recipientAfter).to.equal( - recipientBefore + message.deposit!.message.amount, - ); - expect(beneficiaryAfter).to.be.greaterThan(beneficiaryBefore); + assert.equal(recipientAfter, recipientBefore + message.deposit!.message.amount); + assert.isAbove(beneficiaryAfter, beneficiaryBefore); }); }); }); @@ -2656,7 +2911,7 @@ describe("Swap Layer", () => { // Balance check. const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - expect(payerAfter).to.equal(payerBefore - amountIn); + assert.equal(payerAfter, payerBefore - amountIn); // Verify the relevant information in the prepared order. const preparedOrderData = await tokenRouter.fetchPreparedOrder( @@ -2667,7 +2922,7 @@ describe("Swap Layer", () => { info: { preparedCustodyTokenBump }, } = preparedOrderData; - hackedExpectDeepEqual( + assert.deepEqual( preparedOrderData, new PreparedOrder( { @@ -2701,7 +2956,7 @@ describe("Swap Layer", () => { connection, tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), ); - expect(preparedCustodyTokenBalance).equals(amountIn); + assert.equal(preparedCustodyTokenBalance, amountIn); }); }); @@ -2712,11 +2967,6 @@ describe("Swap Layer", () => { const payload = Buffer.from("Insert payload here"); const result = await createAndRedeemCctpFillForTest( - connection, - tokenRouter, - swapLayer, - tokenRouterLkupTable, - payer, testCctpNonce++, foreignChain, foreignTokenRouterAddress, @@ -2750,17 +3000,17 @@ describe("Swap Layer", () => { // Balance check. const stagedInbound = swapLayer.stagedInboundAddress(preparedFill); const stagedInboundTokenAddress = - swapLayer.stagedInboundTokenAddress(stagedInbound); + swapLayer.stagedCustodyTokenAddress(stagedInbound); const { amount: balanceAfter } = await splToken.getAccount( connection, stagedInboundTokenAddress, ); - expect(balanceAfter).to.equal(message.deposit!.message.amount); + assert.equal(balanceAfter, message.deposit!.message.amount); // State check. const stagedInboundData = await swapLayer.fetchStagedInbound(stagedInbound); - hackedExpectDeepEqual( + assert.deepEqual( stagedInboundData, new StagedInbound( { @@ -2808,7 +3058,7 @@ describe("Swap Layer", () => { const expectedLamports = await connection .getAccountInfo(stagedInbound) .then((info) => info!.lamports); - const custodyToken = swapLayer.stagedInboundTokenAddress(stagedInbound); + const custodyToken = swapLayer.stagedCustodyTokenAddress(stagedInbound); const { amount: stagedTokenBalance } = await splToken.getAccount( connection, custodyToken, @@ -2829,180 +3079,222 @@ describe("Swap Layer", () => { // Verify that accounts were closed. { const accInfo = await connection.getAccountInfo(stagedInbound); - expect(accInfo).is.null; + assert.isNull(accInfo); } { const accInfo = await connection.getAccountInfo(custodyToken); - expect(accInfo).is.null; + assert.isNull(accInfo); } const { amount: dstTokenBalance } = await splToken.getAccount( connection, dstToken, ); - expect(dstTokenBalance).equals(stagedTokenBalance); + assert.equal(dstTokenBalance, stagedTokenBalance); const beneficiaryBalance = await connection.getBalance(beneficiary.publicKey); - expect(beneficiaryBalance).equals( + assert.equal( + beneficiaryBalance, expectedLamports + expectedCustodyTokenLamports, ); }); }); }); }); -}); -async function createAndRedeemCctpFillForTest( - connection: Connection, - tokenRouter: tokenRouterSdk.TokenRouterProgram, - swapLayer: SwapLayerProgram, - tokenRouterLkupTable: PublicKey, - payer: Keypair, - cctpNonce: bigint, - foreignChain: number, - foreignEndpointAddress: number[], - orderSender: number[], - wormholeSequence: bigint, - redeemerMessage: Buffer | Uint8Array, -): Promise { - const encodedMintRecipient = Array.from(tokenRouter.cctpMintRecipientAddress().toBuffer()); - const sourceCctpDomain = 0; - const amount = 6900000000n; - const burnSource = Array.from(Buffer.alloc(32, "beefdead", "hex")); - const redeemer = swapLayer.custodianAddress(); - - // Concoct a Circle message. - const { destinationCctpDomain, burnMessage, encodedCctpMessage, cctpAttestation } = - await craftCctpTokenBurnMessage( - tokenRouter, - sourceCctpDomain, - cctpNonce, - encodedMintRecipient, - amount, - burnSource, + async function createAndRedeemCctpFillForTest( + cctpNonce: bigint, + foreignChain: number, + foreignEndpointAddress: number[], + orderSender: number[], + wormholeSequence: bigint, + redeemerMessage: Buffer | Uint8Array, + ): Promise { + const encodedMintRecipient = Array.from(tokenRouter.cctpMintRecipientAddress().toBuffer()); + const sourceCctpDomain = 0; + const amount = 6900000000n; + const burnSource = Array.from(Buffer.alloc(32, "beefdead", "hex")); + const redeemer = swapLayer.custodianAddress(); + + // Concoct a Circle message. + const { destinationCctpDomain, burnMessage, encodedCctpMessage, cctpAttestation } = + await craftCctpTokenBurnMessage( + sourceCctpDomain, + cctpNonce, + encodedMintRecipient, + amount, + burnSource, + ); + + const message = new LiquidityLayerMessage({ + deposit: new LiquidityLayerDeposit({ + tokenAddress: toUniversalAddress(burnMessage.burnTokenAddress), + amount, + sourceCctpDomain, + destinationCctpDomain, + cctpNonce, + burnSource: toUniversalAddress(burnSource), + mintRecipient: toUniversalAddress(encodedMintRecipient), + payload: { + id: 1, + sourceChain: toChain(foreignChain), + orderSender: toUniversalAddress(orderSender), + redeemer: toUniversalAddress(redeemer.toBuffer()), + redeemerMessage: Buffer.from(redeemerMessage), + }, + }), + }); + + const vaa = await postLiquidityLayerVaa( + connection, + payer, + MOCK_GUARDIANS, + foreignEndpointAddress, + wormholeSequence++, + message, + { sourceChain: "Ethereum" }, ); - const message = new LiquidityLayerMessage({ - deposit: new LiquidityLayerDeposit({ - tokenAddress: toUniversalAddress(burnMessage.burnTokenAddress), - amount, - sourceCctpDomain, - destinationCctpDomain, - cctpNonce, - burnSource: toUniversalAddress(burnSource), - mintRecipient: toUniversalAddress(encodedMintRecipient), - payload: { - id: 1, - sourceChain: toChain(foreignChain), - orderSender: toUniversalAddress(orderSender), - redeemer: toUniversalAddress(redeemer.toBuffer()), - redeemerMessage: Buffer.from(redeemerMessage), + const ix = await tokenRouter.redeemCctpFillIx( + { + payer: payer.publicKey, + vaa, }, - }), - }); - - const vaa = await postLiquidityLayerVaa( - connection, - payer, - MOCK_GUARDIANS, - foreignEndpointAddress, - wormholeSequence++, - message, - { sourceChain: "Ethereum" }, - ); + { + encodedCctpMessage, + cctpAttestation, + }, + ); - const ix = await tokenRouter.redeemCctpFillIx( - { - payer: payer.publicKey, - vaa, - }, - { - encodedCctpMessage, - cctpAttestation, - }, - ); + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 300_000, + }); - const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ - units: 300_000, - }); + const { value: lookupTableAccount } = await connection.getAddressLookupTable( + tokenRouterLkupTable, + ); - const { value: lookupTableAccount } = await connection.getAddressLookupTable( - tokenRouterLkupTable, - ); + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts: [lookupTableAccount!], + }); - await expectIxOk(connection, [computeIx, ix], [payer], { - addressLookupTableAccounts: [lookupTableAccount!], - }); + return { vaa, message }; + } + + async function craftCctpTokenBurnMessage( + sourceCctpDomain: number, + cctpNonce: bigint, + encodedMintRecipient: number[], + amount: bigint, + burnSource: number[], + overrides: { destinationCctpDomain?: number } = {}, + ) { + let { destinationCctpDomain } = overrides; + + const messageTransmitterProgram = tokenRouter.messageTransmitterProgram(); + const { version, localDomain } = + await messageTransmitterProgram.fetchMessageTransmitterConfig( + messageTransmitterProgram.messageTransmitterConfigAddress(), + ); + destinationCctpDomain ??= localDomain; + + const tokenMessengerMinterProgram = tokenRouter.tokenMessengerMinterProgram(); + const { tokenMessenger: sourceTokenMessenger } = + await tokenMessengerMinterProgram.fetchRemoteTokenMessenger( + tokenMessengerMinterProgram.remoteTokenMessengerAddress(sourceCctpDomain), + ); + + const burnMessage = new CctpTokenBurnMessage( + { + version, + sourceDomain: sourceCctpDomain, + destinationDomain: destinationCctpDomain, + nonce: cctpNonce, + sender: sourceTokenMessenger, + recipient: Array.from(tokenMessengerMinterProgram.ID.toBuffer()), // targetTokenMessenger + targetCaller: Array.from(tokenRouter.custodianAddress().toBuffer()), // targetCaller + }, + 0, + Array.from(tryNativeToUint8Array(ETHEREUM_USDC_ADDRESS, "Ethereum")), // sourceTokenAddress + encodedMintRecipient, + amount, + burnSource, + ); - return { vaa, message }; -} - -async function craftCctpTokenBurnMessage( - tokenRouter: tokenRouterSdk.TokenRouterProgram, - sourceCctpDomain: number, - cctpNonce: bigint, - encodedMintRecipient: number[], - amount: bigint, - burnSource: number[], - overrides: { destinationCctpDomain?: number } = {}, -) { - const { destinationCctpDomain: inputDestinationCctpDomain } = overrides; - - const messageTransmitterProgram = tokenRouter.messageTransmitterProgram(); - const { version, localDomain } = await messageTransmitterProgram.fetchMessageTransmitterConfig( - messageTransmitterProgram.messageTransmitterConfigAddress(), - ); - const destinationCctpDomain = inputDestinationCctpDomain ?? localDomain; + const encodedCctpMessage = burnMessage.encode(); + const cctpAttestation = new CircleAttester().createAttestation(encodedCctpMessage); - const tokenMessengerMinterProgram = tokenRouter.tokenMessengerMinterProgram(); - const { tokenMessenger: sourceTokenMessenger } = - await tokenMessengerMinterProgram.fetchRemoteTokenMessenger( - tokenMessengerMinterProgram.remoteTokenMessengerAddress(sourceCctpDomain), + return { + destinationCctpDomain, + burnMessage, + encodedCctpMessage, + cctpAttestation, + }; + } + + async function updateRelayParamsForTest( + swapLayer: SwapLayerProgram, + foreignChain: ChainId, + relayParams: RelayParams, + feeUpdater: Keypair, + ) { + const ix = await swapLayer.updateRelayParamsIx( + { + feeUpdater: feeUpdater.publicKey, + }, + { + chain: foreignChain, + relayParams, + }, ); - const burnMessage = new CctpTokenBurnMessage( - { - version, - sourceDomain: sourceCctpDomain, - destinationDomain: destinationCctpDomain, - nonce: cctpNonce, - sender: sourceTokenMessenger, - recipient: Array.from(tokenMessengerMinterProgram.ID.toBuffer()), // targetTokenMessenger - targetCaller: Array.from(tokenRouter.custodianAddress().toBuffer()), // targetCaller + await expectIxOk(swapLayer.program.provider.connection, [ix], [feeUpdater]); + } + + async function stageOutboundForTest( + accounts: { + payer: PublicKey; + senderToken: PublicKey; }, - 0, - Array.from(tryNativeToUint8Array(ETHEREUM_USDC_ADDRESS, "Ethereum")), // sourceTokenAddress - encodedMintRecipient, - amount, - burnSource, - ); + opts: { + amountIn?: bigint; + redeemOption?: RedeemOption | null; + outputToken?: OutputToken | null; + } = {}, + ) { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + let { amountIn, redeemOption, outputToken } = opts; + amountIn ??= 690000n; + redeemOption ??= null; + outputToken ??= null; + + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + ...accounts, + stagedOutbound, + usdcRefundToken: accounts.senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNull(approveIx); - const encodedCctpMessage = burnMessage.encode(); - const cctpAttestation = new CircleAttester().createAttestation(encodedCctpMessage); + await expectIxOk(connection, [ix], [payer, stagedOutboundSigner]); - return { - destinationCctpDomain, - burnMessage, - encodedCctpMessage, - cctpAttestation, - }; -} - -async function updateRelayParamsForTest( - swapLayer: SwapLayerProgram, - foreignChain: ChainId, - relayParams: RelayParams, - feeUpdater: Keypair, -) { - const ix = await swapLayer.updateRelayParamsIx( - { - feeUpdater: feeUpdater.publicKey, - }, - { - chain: foreignChain, - relayParams, - }, - ); + const stagedCustodyToken = swapLayer.stagedCustodyTokenAddress(stagedOutbound); + const { amount: custodyBalance } = await splToken.getAccount( + connection, + stagedCustodyToken, + ); - await expectIxOk(swapLayer.program.provider.connection, [ix], [feeUpdater]); -} + return { stagedOutbound, stagedCustodyToken, custodyBalance }; + } +}); diff --git a/solana/ts/tests/10__jupiterTest.ts b/solana/ts/tests/10__jupiterTest.ts index ffa00e54..0ad83d7e 100644 --- a/solana/ts/tests/10__jupiterTest.ts +++ b/solana/ts/tests/10__jupiterTest.ts @@ -83,7 +83,7 @@ describe("Jupiter V6 Testing", () => { describe("Jupiter V6 Setup", function () { before("Generate ATAs", async function () { - for (const mint of [swapLayer.mint, USDT_MINT_ADDRESS, splToken.NATIVE_MINT]) { + for (const mint of [swapLayer.usdcMint, USDT_MINT_ADDRESS, splToken.NATIVE_MINT]) { for (let i = 0; i < 8; ++i) { const authority = jupiterV6.programAuthorityAddress(i); diff --git a/solana/ts/tests/helpers/utils.ts b/solana/ts/tests/helpers/utils.ts index 5e42b3b7..7ca27c77 100644 --- a/solana/ts/tests/helpers/utils.ts +++ b/solana/ts/tests/helpers/utils.ts @@ -1,13 +1,8 @@ import { AddressLookupTableProgram, Connection, Keypair, PublicKey } from "@solana/web3.js"; -import { expect } from "chai"; import { expectIxOk } from "@wormhole-foundation/example-liquidity-layer-solana/testing"; import { Chain } from "@wormhole-foundation/sdk-base"; import { toUniversal } from "@wormhole-foundation/sdk-definitions"; -export function hackedExpectDeepEqual(left: any, right: any) { - expect(JSON.parse(JSON.stringify(left))).to.eql(JSON.parse(JSON.stringify(right))); -} - export function tryNativeToUint8Array(address: string, chain: Chain) { return toUniversal(chain, address).toUint8Array(); } From 5a0e617fbe9e1a1924a97ec9b11ddf15bf95a90a Mon Sep 17 00:00:00 2001 From: Ben Guidarelli Date: Tue, 21 May 2024 15:46:03 -0400 Subject: [PATCH 09/50] bump submodule and sdk versions (#34) * bump submodule and sdk versions * remove root dep, rebuild package-lock * set submodule to main --- .gitmodules | 2 +- evm/ts-sdk/package.json | 6 +- lib/example-liquidity-layer | 2 +- package-lock.json | 7055 ++++++++++++------------------ package.json | 3 - solana/package.json | 10 +- solana/tsconfig.anchor-test.json | 1 - 7 files changed, 2770 insertions(+), 4309 deletions(-) diff --git a/.gitmodules b/.gitmodules index b13e9aa8..124e93af 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "lib/example-liquidity-layer"] path = lib/example-liquidity-layer url = https://github.com/wormhole-foundation/example-liquidity-layer.git - rev = 13f07732f5dde13006d1884cc9a2f7019759905f + rev = 40b328135c95453f41ffb12804cfcce440143c46 diff --git a/evm/ts-sdk/package.json b/evm/ts-sdk/package.json index 09ccf6a3..8ea9a2ce 100644 --- a/evm/ts-sdk/package.json +++ b/evm/ts-sdk/package.json @@ -10,9 +10,9 @@ "author": "", "license": "ISC", "dependencies": { - "@wormhole-foundation/sdk-base": "^0.7.0-beta.3", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.3", - "@wormhole-foundation/sdk-evm": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-evm": "^0.7.0-beta.4", "typescript": "^5.4.5" } } diff --git a/lib/example-liquidity-layer b/lib/example-liquidity-layer index 13f07732..40b32813 160000 --- a/lib/example-liquidity-layer +++ b/lib/example-liquidity-layer @@ -1 +1 @@ -Subproject commit 13f07732f5dde13006d1884cc9a2f7019759905f +Subproject commit 40b328135c95453f41ffb12804cfcce440143c46 diff --git a/package-lock.json b/package-lock.json index 58d9f71a..adc3bde9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,9 +11,6 @@ "evm/ts-sdk", "solana" ], - "dependencies": { - "@wormhole-foundation/sdk": "^0.7.0-beta.3" - }, "devDependencies": { "@types/chai": "^4.3.5", "@types/jest": "^29.5.12", @@ -32,38 +29,12 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@wormhole-foundation/sdk-base": "^0.7.0-beta.3", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.3", - "@wormhole-foundation/sdk-evm": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-evm": "^0.7.0-beta.4", "typescript": "^5.4.5" } }, - "node_modules/@0no-co/graphql.web": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.0.7.tgz", - "integrity": "sha512-E3Qku4mTzdrlwVWGPxklDnME5ANrEGetvYw4i2GCRlppWXXE4QD66j7pwb8HelZwS6LnqEChhrSOGCXpbiu6MQ==", - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "graphql": { - "optional": true - } - } - }, - "node_modules/@0no-co/graphqlsp": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/@0no-co/graphqlsp/-/graphqlsp-1.12.3.tgz", - "integrity": "sha512-U0hV/FmFgm2perV+mrXKe/7Z5F4/9rmOziHJYYQgKLwzUVuN5LQG0qs3cLBGxAqoosG0HfTi2cQkgMKY1CMbYQ==", - "dependencies": { - "@gql.tada/internal": "^1.0.0", - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0" - }, - "peerDependencies": { - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "typescript": "^5.0.0" - } - }, "node_modules/@adraffy/ens-normalize": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/@adraffy/ens-normalize/-/ens-normalize-1.10.1.tgz", @@ -73,6 +44,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -85,6 +57,7 @@ "version": "3.10.4", "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.10.4.tgz", "integrity": "sha512-51gk0xOwN6Ls1EbTG5svFva1kdm2APHYTzmFhaAdvUQoJFDxfc0UwQgDxGptzH84vkPlo1qunY1FuboyF9LI3Q==", + "optional": true, "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", @@ -123,28 +96,6 @@ } } }, - "node_modules/@aptos-labs/aptos-client": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@aptos-labs/aptos-client/-/aptos-client-0.1.0.tgz", - "integrity": "sha512-q3s6pPq8H2buGp+tPuIRInWsYOuhSEwuNJPwd2YnsiID3YSLihn2ug39ktDJAcSOprUcp7Nid8WK7hKqnUmSdA==", - "dependencies": { - "axios": "1.6.2", - "got": "^11.8.6" - }, - "engines": { - "node": ">=15.10.0" - } - }, - "node_modules/@aptos-labs/aptos-client/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/@babel/code-frame": { "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", @@ -457,6 +408,7 @@ "version": "7.24.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.5.tgz", "integrity": "sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==", + "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -747,15 +699,53 @@ "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-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==", + "dependencies": { + "@types/long": "^4.0.2", + "@types/node": "^18.0.3" + } }, - "node_modules/@certusone/wormhole-sdk-proto-web/node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "node_modules/@certusone/wormhole-sdk-wasm/node_modules/@types/node": { + "version": "18.19.33", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", + "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@certusone/wormhole-sdk/node_modules/@solana/spl-token": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.11.tgz", + "integrity": "sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==", + "dependencies": { + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "@solana/spl-token-metadata": "^0.1.2", + "buffer": "^6.0.3" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.88.0" + } + }, + "node_modules/@certusone/wormhole-spydk": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@certusone/wormhole-spydk/-/wormhole-spydk-0.0.1.tgz", + "integrity": "sha512-iBQoY3UnmGoWHcbn0FypA6hKsANhdHKi03UN0GPoDAeMY12j8ly+7r462TfLl5f4hOJVQd3UZ2qviohEmdicmg==", + "dependencies": { + "@grpc/grpc-js": "^1.4.4", + "protobufjs": "^6.11.2" + } + }, + "node_modules/@certusone/wormhole-spydk/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -768,31 +758,157 @@ "@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": "^5.0.0" + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "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/@classic-terra/terra.proto/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "engines": { - "node": ">=12.0.0" + "node": ">=0.1.90" } }, - "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==", + "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": { - "@types/long": "^4.0.2", - "@types/node": "^18.0.3" + "@noble/hashes": "^1.0.0", + "protobufjs": "^6.8.8" } }, - "node_modules/@certusone/wormhole-sdk-wasm/node_modules/@types/node": { - "version": "18.19.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.33.tgz", - "integrity": "sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==", + "node_modules/@confio/ics23/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, + "optional": true, "dependencies": { - "undici-types": "~5.26.4" + "@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/@coral-xyz/anchor": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.0.tgz", + "integrity": "sha512-qreDh5ztiRHVnCbJ+RS70NJ6aSTPBYDAgFeQ7Z5QvaT5DcDIhNyt4onOciVz2ieIE1XWePOJDDu9SbNvPGBkvQ==", + "dependencies": { + "@coral-xyz/borsh": "^0.30.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@coral-xyz/anchor/node_modules/@coral-xyz/borsh": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.0.tgz", + "integrity": "sha512-OrcV+7N10cChhgDRUxM4iEIuwxUHHs52XD85R8cFCUqE0vbLYrcoPPPs+VF6kZ9DhdJGVW2I6DHJOp5TykyZog==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/@coral-xyz/anchor/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@coral-xyz/borsh": { + "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==", @@ -807,7 +923,7 @@ "@solana/web3.js": "^1.2.0" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/amino": { + "node_modules/@cosmjs/amino": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.30.1.tgz", "integrity": "sha512-yNHnzmvAlkETDYIpeCTdVqgvrdt1qgkOXwuRVi8s27UKI5hfqyE9fJ/fuunXE6ZZPnKkjIecDznmuUOMrMvw4w==", @@ -819,7 +935,7 @@ "@cosmjs/utils": "^0.30.1" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/crypto": { + "node_modules/@cosmjs/crypto": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.30.1.tgz", "integrity": "sha512-rAljUlake3MSXs9xAm87mu34GfBLN0h/1uPPV6jEwClWjNkAMotzjC0ab9MARy5FFAvYHL3lWb57bhkbt2GtzQ==", @@ -834,7 +950,7 @@ "libsodium-wrappers": "^0.7.6" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/encoding": { + "node_modules/@cosmjs/encoding": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.30.1.tgz", "integrity": "sha512-rXmrTbgqwihORwJ3xYhIgQFfMSrwLu1s43RIK9I8EBudPx3KmnmyAKzMOVsRDo9edLFNuZ9GIvysUCwQfq3WlQ==", @@ -845,13 +961,13 @@ "readonly-date": "^1.0.0" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/encoding/node_modules/bech32": { + "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/@certusone/wormhole-sdk/node_modules/@cosmjs/json-rpc": { + "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==", @@ -861,7 +977,7 @@ "xstream": "^11.14.0" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/math": { + "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==", @@ -870,7 +986,7 @@ "bn.js": "^5.2.0" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/proto-signing": { + "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==", @@ -885,7 +1001,7 @@ "long": "^4.0.0" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/socket": { + "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==", @@ -897,7 +1013,7 @@ "xstream": "^11.14.0" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/stargate": { + "node_modules/@cosmjs/stargate": { "version": "0.30.1", "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.30.1.tgz", "integrity": "sha512-RdbYKZCGOH8gWebO7r6WvNnQMxHrNXInY/gPHPzMjbQF6UatA6fNM2G2tdgS5j5u7FTqlCI10stNXrknaNdzog==", @@ -917,16 +1033,42 @@ "xstream": "^11.14.0" } }, - "node_modules/@certusone/wormhole-sdk/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==", + "node_modules/@cosmjs/stargate/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, "optional": true, "dependencies": { - "xstream": "^11.14.0" + "@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/@certusone/wormhole-sdk/node_modules/@cosmjs/tendermint-rpc": { + "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==", @@ -944,7 +1086,7 @@ "xstream": "^11.14.0" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/tendermint-rpc/node_modules/axios": { + "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==", @@ -953,1017 +1095,587 @@ "follow-redirects": "^1.14.0" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@cosmjs/utils": { + "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/@certusone/wormhole-sdk/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, + "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==", + "dev": true, "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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/@cspotcode/source-map-support/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==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@injectivelabs/core-proto-ts/node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", - "hasInstallScript": true, - "optional": true, + "node_modules/@dabh/diagnostics": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", "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" - }, + "colorspace": "1.1.x", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=12.0.0" + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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==", + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, "optional": true, - "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "os": [ + "android" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@injectivelabs/indexer-proto-ts/node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", - "hasInstallScript": true, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": 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" - }, + "os": [ + "android" + ], "engines": { - "node": ">=12.0.0" + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, "optional": true, - "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@certusone/wormhole-sdk/node_modules/@injectivelabs/mito-proto-ts/node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", - "hasInstallScript": true, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": 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" - }, + "os": [ + "freebsd" + ], "engines": { - "node": ">=12.0.0" + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": 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" + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": 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" + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, "optional": true, - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": 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" + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, "optional": true, - "dependencies": { - "follow-redirects": "^1.14.0" + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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" - }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16" + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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" - }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=11.0.0" + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/node_modules/aptos/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/" - } - ] - }, - "node_modules/@certusone/wormhole-sdk/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/" - } + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" ], - "dependencies": { - "@noble/hashes": "~1.1.1", - "@scure/base": "~1.1.0" + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@certusone/wormhole-sdk/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/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" } }, - "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==", - "dependencies": { - "follow-redirects": "^1.14.4" - } - }, - "node_modules/@certusone/wormhole-sdk/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/@certusone/wormhole-sdk/node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - }, - "node_modules/@certusone/wormhole-sdk/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/@certusone/wormhole-sdk/node_modules/superstruct": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", - "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@certusone/wormhole-spydk": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/@certusone/wormhole-spydk/-/wormhole-spydk-0.0.1.tgz", - "integrity": "sha512-iBQoY3UnmGoWHcbn0FypA6hKsANhdHKi03UN0GPoDAeMY12j8ly+7r462TfLl5f4hOJVQd3UZ2qviohEmdicmg==", - "dependencies": { - "@grpc/grpc-js": "^1.4.4", - "protobufjs": "^6.11.2" - } - }, - "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/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "engines": { - "node": ">=0.1.90" - } - }, - "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==", - "dependencies": { - "@noble/hashes": "^1.0.0", - "protobufjs": "^6.8.8" - } - }, - "node_modules/@coral-xyz/anchor": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", - "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", - "dependencies": { - "@coral-xyz/borsh": "^0.29.0", - "@noble/hashes": "^1.3.1", - "@solana/web3.js": "^1.68.0", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^6.3.0", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "superstruct": "^0.15.4", - "toml": "^3.0.0" - }, - "engines": { - "node": ">=11" - } - }, - "node_modules/@coral-xyz/borsh": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", - "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", - "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.68.0" - } - }, - "node_modules/@cosmjs/amino": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", - "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", - "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3" - } - }, - "node_modules/@cosmjs/cosmwasm-stargate": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.32.3.tgz", - "integrity": "sha512-pqkt+QsLIPNMTRh9m+igJgIpzXXgn1BxmxfAb9zlC23kvsuzY/12un9M7iAdim1NwKXDFeYw46xC2YkprwQp+g==", - "dependencies": { - "@cosmjs/amino": "^0.32.3", - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/proto-signing": "^0.32.3", - "@cosmjs/stargate": "^0.32.3", - "@cosmjs/tendermint-rpc": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0", - "pako": "^2.0.2" - } - }, - "node_modules/@cosmjs/crypto": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", - "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", - "dependencies": { - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers-sumo": "^0.7.11" - } - }, - "node_modules/@cosmjs/encoding": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", - "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", - "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "node_modules/@cosmjs/json-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/json-rpc/-/json-rpc-0.32.3.tgz", - "integrity": "sha512-JwFRWZa+Y95KrAG8CuEbPVOSnXO2uMSEBcaAB/FBU3Mo4jQnDoUjXvt3vwtFWxfAytrWCn1I4YDFaOAinnEG/Q==", - "dependencies": { - "@cosmjs/stream": "^0.32.3", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/math": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", - "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", - "dependencies": { - "bn.js": "^5.2.0" - } - }, - "node_modules/@cosmjs/proto-signing": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", - "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", - "dependencies": { - "@cosmjs/amino": "^0.32.3", - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0" - } - }, - "node_modules/@cosmjs/socket": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", - "integrity": "sha512-F2WwNmaUPdZ4SsH6Uyreq3wQk7jpaEkb3wfOP951f5Jt6HCW/PxbxhKzHkAAf6+Sqks6SPhkbWoE8XaZpjL2KA==", - "dependencies": { - "@cosmjs/stream": "^0.32.3", - "isomorphic-ws": "^4.0.1", - "ws": "^7", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/stargate": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stargate/-/stargate-0.32.3.tgz", - "integrity": "sha512-OQWzO9YWKerUinPIxrO1MARbe84XkeXJAW0lyMIjXIEikajuXZ+PwftiKA5yA+8OyditVmHVLtPud6Pjna2s5w==", - "dependencies": { - "@confio/ics23": "^0.6.8", - "@cosmjs/amino": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/proto-signing": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/tendermint-rpc": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/stream": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/stream/-/stream-0.32.3.tgz", - "integrity": "sha512-J2zVWDojkynYifAUcRmVczzmp6STEpyiAARq0rSsviqjreGIfspfuws/8rmkPa6qQBZvpQOBQCm2HyZZwYplIw==", - "dependencies": { - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/tendermint-rpc": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.3.tgz", - "integrity": "sha512-xeprW+VR9xKGstqZg0H/KBZoUp8/FfFyS9ljIUTLM/UINjP2MhiwncANPS2KScfJVepGufUKk0/phHUeIBSEkw==", - "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/json-rpc": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/socket": "^0.32.3", - "@cosmjs/stream": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "axios": "^1.6.0", - "readonly-date": "^1.0.0", - "xstream": "^11.14.0" - } - }, - "node_modules/@cosmjs/utils": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", - "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" - }, - "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==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/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==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@ensdomains/ens-validation": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@ensdomains/ens-validation/-/ens-validation-0.1.0.tgz", - "integrity": "sha512-rbDh2K6GfqXvBcJUISaTTYEt3f079WA4ohTE5Lh4/8EaaPAk/9vk3EisMUQV2UVxeFIZQEEyRCIOmRTpqN0W7A==" - }, - "node_modules/@ensdomains/eth-ens-namehash": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/@ensdomains/eth-ens-namehash/-/eth-ens-namehash-2.0.15.tgz", - "integrity": "sha512-JRDFP6+Hczb1E0/HhIg0PONgBYasfGfDheujmfxaZaAv/NAH4jE6Kf48WbqfRZdxt4IZI3jl3Ri7sZ1nP09lgw==" - }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/openbsd-x64": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", - "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ - "ppc64" + "x64" ], "dev": true, "optional": true, "os": [ - "aix" + "openbsd" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-arm": { + "node_modules/@esbuild/sunos-x64": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", - "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ - "arm" + "x64" ], "dev": true, "optional": true, "os": [ - "android" + "sunos" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-arm64": { + "node_modules/@esbuild/win32-arm64": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", - "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], "dev": true, "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/android-x64": { + "node_modules/@esbuild/win32-ia32": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", - "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ - "x64" + "ia32" ], "dev": true, "optional": true, "os": [ - "android" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/darwin-arm64": { + "node_modules/@esbuild/win32-x64": { "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", - "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ - "arm64" + "x64" ], "dev": true, "optional": true, "os": [ - "darwin" + "win32" ], "engines": { "node": ">=12" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", - "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", - "cpu": [ - "x64" - ], - "dev": true, + "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, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" + "dependencies": { + "crc-32": "^1.2.0", + "ethereumjs-util": "^7.1.5" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", - "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", - "cpu": [ - "arm64" - ], - "dev": true, + "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, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" + "dependencies": { + "@ethereumjs/common": "^2.6.4", + "ethereumjs-util": "^7.1.5" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", - "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" + "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" + } ], - "engines": { - "node": ">=12" + "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/@esbuild/linux-arm": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", - "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" + "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" + } ], - "engines": { - "node": ">=12" + "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/@esbuild/linux-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", - "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" + "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" + } ], - "engines": { - "node": ">=12" + "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/@esbuild/linux-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", - "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" + "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" + } ], - "engines": { - "node": ">=12" + "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/@esbuild/linux-loong64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", - "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" + "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" + } ], - "engines": { - "node": ">=12" + "dependencies": { + "@ethersproject/bytes": "^5.7.0" } }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", - "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" + "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" + } ], - "engines": { - "node": ">=12" + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", - "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" + "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" + } ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", - "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", - "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", - "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", - "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", - "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", - "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", - "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", - "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "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" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" } }, - "node_modules/@ethersproject/abi": { + "node_modules/@ethersproject/bytes": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", - "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "funding": [ { "type": "individual", @@ -1975,21 +1687,13 @@ } ], "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/logger": "^5.7.0" } }, - "node_modules/@ethersproject/abstract-provider": { + "node_modules/@ethersproject/constants": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", - "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "funding": [ { "type": "individual", @@ -2001,19 +1705,13 @@ } ], "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/bignumber": "^5.7.0" } }, - "node_modules/@ethersproject/abstract-signer": { + "node_modules/@ethersproject/contracts": { "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==", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "funding": [ { "type": "individual", @@ -2025,17 +1723,22 @@ } ], "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/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" } }, - "node_modules/@ethersproject/address": { + "node_modules/@ethersproject/hash": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", - "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", "funding": [ { "type": "individual", @@ -2047,17 +1750,21 @@ } ], "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/rlp": "^5.7.0" + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, - "node_modules/@ethersproject/base64": { + "node_modules/@ethersproject/hdnode": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", - "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", "funding": [ { "type": "individual", @@ -2069,13 +1776,24 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.7.0" + "@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/basex": { + "node_modules/@ethersproject/json-wallets": { "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", - "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "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", @@ -2087,165 +1805,8 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/properties": "^5.7.0" - } - }, - "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" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "bn.js": "^5.2.1" - } - }, - "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" - } - ], - "dependencies": { - "@ethersproject/logger": "^5.7.0" - } - }, - "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" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.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" - } - ], - "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/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" - } - ], - "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/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" - } - ], - "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/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" - } - ], - "dependencies": { - "@ethersproject/abstract-signer": "^5.7.0", - "@ethersproject/address": "^5.7.0", + "@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", @@ -2385,6 +1946,11 @@ "ws": "7.4.6" } }, + "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==" + }, "node_modules/@ethersproject/providers/node_modules/ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", @@ -2431,2099 +1997,1314 @@ "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/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "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" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/logger": "^5.7.0", - "hash.js": "1.1.7" - } - }, - "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" - } - ], - "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/elliptic": { - "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" - } - }, - "node_modules/@ethersproject/signing-key/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==" - }, - "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" - } - ], - "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/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" - } - ], - "dependencies": { - "@ethersproject/bytes": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "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" - } - ], - "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/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" - } - ], - "dependencies": { - "@ethersproject/bignumber": "^5.7.0", - "@ethersproject/constants": "^5.7.0", - "@ethersproject/logger": "^5.7.0" - } - }, - "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" - } - ], - "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/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" - } - ], - "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/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" - } - ], - "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/@gql.tada/cli-utils": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@gql.tada/cli-utils/-/cli-utils-1.3.9.tgz", - "integrity": "sha512-oRb7SG/+csx9CiypSJTI21KaLfulOUnhX1vxg4FXi2snub9XShkGR2XnnlJVTAOZXY9Vcxti1NutAElxdDkycA==", - "dependencies": { - "@0no-co/graphqlsp": "^1.12.1", - "@gql.tada/internal": "1.0.0", - "@vue/compiler-dom": "^3.4.23", - "@vue/language-core": "^2.0.17", - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "svelte2tsx": "^0.7.6" - }, - "peerDependencies": { - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "typescript": "^5.0.0" - } - }, - "node_modules/@gql.tada/internal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-1.0.0.tgz", - "integrity": "sha512-B55aIYyZn5ewdgMqoJciPAwF5DKYX6HBabTU+ap/dpNH3EgJrLomc8Y8w+MCxCyOx+dXL9OduT6eWnVr7J7Eyg==", - "dependencies": { - "@0no-co/graphql.web": "^1.0.5" - }, - "peerDependencies": { - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "typescript": "^5.0.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==", - "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/@grpc/grpc-js": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz", - "integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==", - "dependencies": { - "@grpc/proto-loader": "^0.7.13", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", - "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@grpc/proto-loader/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@grpc/proto-loader/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/@grpc/proto-loader/node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", - "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/@grpc/proto-loader/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "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/@injectivelabs/core-proto-ts": { - "version": "0.0.21", - "resolved": "https://registry.npmjs.org/@injectivelabs/core-proto-ts/-/core-proto-ts-0.0.21.tgz", - "integrity": "sha512-RBxSkRBCty60R/l55/D1jsSW0Aof5dyGFhCFdN3A010KjMv/SzZGGr+6DZPY/hflyFeaJzDv/VTopCymKNRBvQ==", - "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==" - }, - "node_modules/@injectivelabs/core-proto-ts/node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", - "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/@injectivelabs/dmm-proto-ts": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/@injectivelabs/dmm-proto-ts/-/dmm-proto-ts-1.0.19.tgz", - "integrity": "sha512-2FCzCziy1RhzmnkAVIU+Asby/GXAVQqKt5/o1s52j0LJXfJMpiCrV6soLfnjTebj61T+1WvJBPFoZCCiVYBpcw==", - "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "google-protobuf": "^3.14.0", - "protobufjs": "^7.0.0", - "rxjs": "^7.4.0" - } - }, - "node_modules/@injectivelabs/dmm-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==" - }, - "node_modules/@injectivelabs/dmm-proto-ts/node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", - "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/@injectivelabs/exceptions": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/exceptions/-/exceptions-1.14.6.tgz", - "integrity": "sha512-A+URJwygeDjFPhulGMNVw70z738NtpIiCr0W8q4Kr4Ggg30i+AaVAjViYLm56pSMXXpomu9CYJ/sY6ijQn48IQ==", - "hasInstallScript": true, - "dependencies": { - "@injectivelabs/grpc-web": "^0.0.1", - "@injectivelabs/ts-types": "^1.14.6", - "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==", - "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==", - "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==", - "peerDependencies": { - "@injectivelabs/grpc-web": ">=0.0.1" - } - }, - "node_modules/@injectivelabs/indexer-proto-ts": { - "version": "1.11.36", - "resolved": "https://registry.npmjs.org/@injectivelabs/indexer-proto-ts/-/indexer-proto-ts-1.11.36.tgz", - "integrity": "sha512-s7E3Y28JrkylDwRVfF/AvcPy/zPgz52W+XbQ0FOcsqPof78xp8FvnM3ubVZi0Dad39LgDB5eeiMFPmeuLp8Uew==", - "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==" - }, - "node_modules/@injectivelabs/indexer-proto-ts/node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", - "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/@injectivelabs/mito-proto-ts": { - "version": "1.0.62", - "resolved": "https://registry.npmjs.org/@injectivelabs/mito-proto-ts/-/mito-proto-ts-1.0.62.tgz", - "integrity": "sha512-WtoO80Y597nZiAuE4H+L208I0i3ByWytR+HqABdCaA26uJ7F1LhXw8YXxh3pP9z0LAeW31T+N7bwtOMlVR4riA==", - "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==" - }, - "node_modules/@injectivelabs/mito-proto-ts/node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", - "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/@injectivelabs/networks": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", - "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", - "hasInstallScript": true, - "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" - } - }, - "node_modules/@injectivelabs/sdk-ts": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/@injectivelabs/sdk-ts/-/sdk-ts-1.14.7.tgz", - "integrity": "sha512-Qm8y8jKCMyNfYZGZVI+p0SIGJPtP5M9/DPFyPK+JSR2OOU0J4MX2yS/tQB5ViC/3Bt7yQhw/l3Rop93e7pTZEg==", - "hasInstallScript": true, - "dependencies": { - "@apollo/client": "^3.5.8", - "@cosmjs/amino": "^0.32.2", - "@cosmjs/proto-signing": "^0.32.2", - "@cosmjs/stargate": "^0.32.2", - "@ensdomains/ens-validation": "^0.1.0", - "@ensdomains/eth-ens-namehash": "^2.0.15", - "@ethersproject/bytes": "^5.7.0", - "@injectivelabs/core-proto-ts": "^0.0.21", - "@injectivelabs/dmm-proto-ts": "1.0.19", - "@injectivelabs/exceptions": "^1.14.6", - "@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.11.36", - "@injectivelabs/mito-proto-ts": "1.0.62", - "@injectivelabs/networks": "^1.14.6", - "@injectivelabs/test-utils": "^1.14.3", - "@injectivelabs/token-metadata": "^1.14.7", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "@metamask/eth-sig-util": "^4.0.0", - "axios": "^0.27.2", - "bech32": "^2.0.0", - "bip39": "^3.0.4", - "cosmjs-types": "^0.9.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", - "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==", - "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" - } - }, - "node_modules/@injectivelabs/sdk-ts/node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - }, - "node_modules/@injectivelabs/test-utils": { - "version": "1.14.4", - "resolved": "https://registry.npmjs.org/@injectivelabs/test-utils/-/test-utils-1.14.4.tgz", - "integrity": "sha512-M7UoB5CIVVN7BtdmU26GwZsWKp0BQg9qV5a+YvcdhlwlSIkvt3gKVKBMq/vKClCakOu2AjhCVGDMZVnagIBogg==", - "hasInstallScript": 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==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@injectivelabs/token-metadata": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/@injectivelabs/token-metadata/-/token-metadata-1.14.7.tgz", - "integrity": "sha512-RRRuyirzoThwQ5P8D3STH2YOavGsdnetQy6ZPQ8yA7VUavt00KBB26M92zSLbiUz5VrxhPHDCEEkuJVWx+xtmw==", - "hasInstallScript": true, - "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/networks": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "@injectivelabs/utils": "^1.14.6", - "@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/ts-types": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/ts-types/-/ts-types-1.14.6.tgz", - "integrity": "sha512-/Ax5eCSfE9OhcyUc9wZk/LFKTYhIY9RJIaNT/n92rbHjXSfXRLSX+Bvk62vC9Ej+SEBPp77WYngtrePPA1HEgw==", - "hasInstallScript": true, - "dependencies": { - "link-module-alias": "^1.2.0", - "shx": "^0.3.2" - } - }, - "node_modules/@injectivelabs/utils": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", - "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", - "hasInstallScript": true, - "dependencies": { - "@injectivelabs/exceptions": "^1.14.6", - "@injectivelabs/ts-types": "^1.14.6", - "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==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", - "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@types/node": "*", - "chalk": "^4.0.0", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/core": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", - "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/reporters": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "ansi-escapes": "^4.2.1", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "exit": "^0.1.2", - "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.7.0", - "jest-config": "^29.7.0", - "jest-haste-map": "^29.7.0", - "jest-message-util": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-resolve": "^29.7.0", - "jest-resolve-dependencies": "^29.7.0", - "jest-runner": "^29.7.0", - "jest-runtime": "^29.7.0", - "jest-snapshot": "^29.7.0", - "jest-util": "^29.7.0", - "jest-validate": "^29.7.0", - "jest-watcher": "^29.7.0", - "micromatch": "^4.0.4", - "pretty-format": "^29.7.0", - "slash": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/environment": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", - "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", - "dev": true, - "dependencies": { - "@jest/fake-timers": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/node": "*", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", - "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", - "dev": true, - "dependencies": { - "expect": "^29.7.0", - "jest-snapshot": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", - "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", - "dev": true, - "dependencies": { - "jest-get-type": "^29.6.3" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", - "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", - "dev": true, - "dependencies": { - "@jest/types": "^29.6.3", - "@sinonjs/fake-timers": "^10.0.2", - "@types/node": "*", - "jest-message-util": "^29.7.0", - "jest-mock": "^29.7.0", - "jest-util": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", - "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.7.0", - "@jest/expect": "^29.7.0", - "@jest/types": "^29.6.3", - "jest-mock": "^29.7.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", - "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", - "dev": true, - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.7.0", - "@jest/test-result": "^29.7.0", - "@jest/transform": "^29.7.0", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/node": "*", - "chalk": "^4.0.0", - "collect-v8-coverage": "^1.0.0", - "exit": "^0.1.2", - "glob": "^7.1.3", - "graceful-fs": "^4.2.9", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^4.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.7.0", - "jest-util": "^29.7.0", - "jest-worker": "^29.7.0", - "slash": "^3.0.0", - "string-length": "^4.0.1", - "strip-ansi": "^6.0.0", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", - "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.18", - "callsites": "^3.0.0", - "graceful-fs": "^4.2.9" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", - "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", - "dev": true, - "dependencies": { - "@jest/console": "^29.7.0", - "@jest/types": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "collect-v8-coverage": "^1.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", - "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", - "dev": true, - "dependencies": { - "@jest/test-result": "^29.7.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", - "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", - "dev": true, - "dependencies": { - "@babel/core": "^7.11.6", - "@jest/types": "^29.6.3", - "@jridgewell/trace-mapping": "^0.3.18", - "babel-plugin-istanbul": "^6.1.1", - "chalk": "^4.0.0", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.7.0", - "jest-regex-util": "^29.6.3", - "jest-util": "^29.7.0", - "micromatch": "^4.0.4", - "pirates": "^4.0.4", - "slash": "^3.0.0", - "write-file-atomic": "^4.0.2" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jest/types": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", - "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", - "dev": true, - "dependencies": { - "@jest/schemas": "^29.6.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "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.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" + "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" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" } }, - "node_modules/@jup-ag/api": { - "version": "6.0.22", - "resolved": "https://registry.npmjs.org/@jup-ag/api/-/api-6.0.22.tgz", - "integrity": "sha512-15r5vmY6CZ1VreDao+Y7lQ3gugAuXNH+QfQ76PcMsx+GfqgWLgzINzBZVJFN9Y9B+dwo2EVHlsWNqSH7HaC3jw==" - }, - "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==", + "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" + } + ], "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" + "@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/@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==", + "node_modules/@ethersproject/signing-key/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==", "dependencies": { - "@types/node": "*" + "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/@metamask/eth-sig-util/node_modules/bn.js": { + "node_modules/@ethersproject/signing-key/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==" }, - "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==", + "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" + } + ], "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" + "@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/@mysten/bcs": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@mysten/bcs/-/bcs-0.11.1.tgz", - "integrity": "sha512-xP85isNSYUCHd3O/g+TmZYmg4wK6cU8q/n/MebkIGP4CYVJZz2wU/G24xIZ3wI+0iTop4dfgA5kYrg/DQKCUzA==", + "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" + } + ], "dependencies": { - "bs58": "^5.0.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.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==", + "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" + } + ], "dependencies": { - "base-x": "^4.0.0" + "@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/@mysten/sui.js": { - "version": "0.50.1", - "resolved": "https://registry.npmjs.org/@mysten/sui.js/-/sui.js-0.50.1.tgz", - "integrity": "sha512-AY0wb4n6PMTRsDGygzrrTHUK/m5KwKZ4aQcN9cayiwsq2iIhfjGo7uuqMA7Y5UiqvLCoF+z7Ig14Q5qejQ/S/w==", + "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" + } + ], "dependencies": { - "@graphql-typed-document-node/core": "^3.2.0", - "@mysten/bcs": "0.11.1", - "@noble/curves": "^1.1.0", - "@noble/hashes": "^1.3.1", - "@scure/bip32": "^1.3.1", - "@scure/bip39": "^1.2.1", - "@suchipi/femver": "^1.0.0", - "bech32": "^2.0.0", - "gql.tada": "^1.2.0", - "graphql": "^16.8.1", - "superstruct": "^1.0.3", - "tweetnacl": "^1.0.3" - }, - "engines": { - "node": ">=16" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "node_modules/@mysten/sui.js/node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" + "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" + } + ], + "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/@mysten/sui.js/node_modules/superstruct": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", - "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", - "engines": { - "node": ">=14.0.0" + "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" + } + ], + "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/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "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" + } + ], "dependencies": { - "@noble/hashes": "1.4.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@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/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "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/@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==", + "node_modules/@grpc/grpc-js": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.8.tgz", + "integrity": "sha512-vYVqYzHicDqyKB+NQhAc54I1QWCBLCrYG6unqOIcBTHx+7x8C9lcoLj3KVJXs2VB4lUbpWY+Kk9NipcbXYWmvg==", "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" + "@grpc/proto-loader": "^0.7.13", + "@js-sdsl/ordered-map": "^4.4.2" }, "engines": { - "node": ">=11" + "node": ">=12.10.0" } }, - "node_modules/@project-serum/anchor/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "node_modules/@grpc/proto-loader": { + "version": "0.7.13", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.13.tgz", + "integrity": "sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw==", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, "engines": { "node": ">=6" } }, - "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==", + "node_modules/@grpc/proto-loader/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/@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": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, - "engines": { - "node": ">=10" + "browser-headers": "^0.4.1" }, "peerDependencies": { - "@solana/web3.js": "^1.2.0" + "google-protobuf": "^3.14.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==" - }, - "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==" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", - "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" - }, - "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==", + "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": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.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==" - }, - "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==" - }, - "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==" - }, - "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==" - }, - "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==" - }, - "node_modules/@scure/base": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", - "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", - "funding": { - "url": "https://paulmillr.com/funding/" + "node_modules/@injectivelabs/exceptions": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/exceptions/-/exceptions-1.14.6.tgz", + "integrity": "sha512-A+URJwygeDjFPhulGMNVw70z738NtpIiCr0W8q4Kr4Ggg30i+AaVAjViYLm56pSMXXpomu9CYJ/sY6ijQn48IQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "@injectivelabs/grpc-web": "^0.0.1", + "@injectivelabs/ts-types": "^1.14.6", + "http-status-codes": "^2.2.0", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" } }, - "node_modules/@scure/bip32": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", - "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", + "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": { - "@noble/curves": "~1.4.0", - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" + "browser-headers": "^0.4.1" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "peerDependencies": { + "google-protobuf": "^3.14.0" } }, - "node_modules/@scure/bip39": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", - "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", - "dependencies": { - "@noble/hashes": "~1.4.0", - "@scure/base": "~1.1.6" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "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/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "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/@sindresorhus/is": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", - "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/is?sponsor=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/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, + "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": { - "type-detect": "4.0.8" + "@injectivelabs/grpc-web": "^0.0.1", + "google-protobuf": "^3.14.0", + "protobufjs": "^7.0.0", + "rxjs": "^7.4.0" } }, - "node_modules/@sinonjs/fake-timers": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", - "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", - "dev": true, + "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": { - "@sinonjs/commons": "^3.0.0" + "@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/@solana/buffer-layout": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", - "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", + "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": { - "buffer": "~6.0.3" - }, - "engines": { - "node": ">=5.10" + "@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/@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==", + "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": { - "@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" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" } }, - "node_modules/@solana/codecs": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.2.tgz", - "integrity": "sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==", + "node_modules/@injectivelabs/test-utils": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/@injectivelabs/test-utils/-/test-utils-1.14.4.tgz", + "integrity": "sha512-M7UoB5CIVVN7BtdmU26GwZsWKp0BQg9qV5a+YvcdhlwlSIkvt3gKVKBMq/vKClCakOu2AjhCVGDMZVnagIBogg==", + "hasInstallScript": true, + "optional": true, "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-data-structures": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/codecs-strings": "2.0.0-preview.2", - "@solana/options": "2.0.0-preview.2" + "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/@solana/codecs-core": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz", - "integrity": "sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==", + "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": { - "@solana/errors": "2.0.0-preview.2" + "follow-redirects": "^1.14.0" } }, - "node_modules/@solana/codecs-data-structures": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz", - "integrity": "sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==", + "node_modules/@injectivelabs/token-metadata": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/@injectivelabs/token-metadata/-/token-metadata-1.14.7.tgz", + "integrity": "sha512-RRRuyirzoThwQ5P8D3STH2YOavGsdnetQy6ZPQ8yA7VUavt00KBB26M92zSLbiUz5VrxhPHDCEEkuJVWx+xtmw==", + "hasInstallScript": true, + "optional": true, "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/networks": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "@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/@solana/codecs-numbers": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz", - "integrity": "sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==", + "node_modules/@injectivelabs/token-metadata/node_modules/@injectivelabs/networks": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/networks/-/networks-1.14.6.tgz", + "integrity": "sha512-O1IkPFJl8ThNL6N+k/9OimrgCYsSWQ8A1FtVMXSQge+0QRZsDKSpRmQRwE601otXXauO31nOUct5AaiWPffXVQ==", + "hasInstallScript": true, + "optional": true, "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "@injectivelabs/utils": "^1.14.6", + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" } }, - "node_modules/@solana/codecs-strings": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz", - "integrity": "sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==", + "node_modules/@injectivelabs/token-metadata/node_modules/@injectivelabs/utils": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/utils/-/utils-1.14.6.tgz", + "integrity": "sha512-5I0h4GiLB5PPTl+g2lpevRP+WScvEbntdkoUQVtAdHewl4kutd5p1Kcnoi1Nvpq+sz5N/e9qtBIRuyxG38akOg==", + "hasInstallScript": true, + "optional": true, "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" - }, - "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22" + "@injectivelabs/exceptions": "^1.14.6", + "@injectivelabs/ts-types": "^1.14.6", + "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/@solana/errors": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.2.tgz", - "integrity": "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==", + "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": { - "chalk": "^5.3.0", - "commander": "^12.0.0" - }, - "bin": { - "errors": "bin/cli.js" + "follow-redirects": "^1.14.0" } }, - "node_modules/@solana/errors/node_modules/chalk": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node_modules/@injectivelabs/ts-types": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@injectivelabs/ts-types/-/ts-types-1.14.6.tgz", + "integrity": "sha512-/Ax5eCSfE9OhcyUc9wZk/LFKTYhIY9RJIaNT/n92rbHjXSfXRLSX+Bvk62vC9Ej+SEBPp77WYngtrePPA1HEgw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "link-module-alias": "^1.2.0", + "shx": "^0.3.2" } }, - "node_modules/@solana/errors/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "engines": { - "node": ">=18" + "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/@solana/options": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz", - "integrity": "sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==", + "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": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2" + "follow-redirects": "^1.14.0" } }, - "node_modules/@solana/spl-token": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", - "integrity": "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA==", + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/buffer-layout-utils": "^0.2.0", - "buffer": "^6.0.3" + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" }, "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.47.4" + "node": ">=8" } }, - "node_modules/@solana/spl-token-group": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.4.tgz", - "integrity": "sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", + "dev": true, "dependencies": { - "@solana/codecs": "2.0.0-preview.2", - "@solana/spl-type-length-value": "0.1.0" + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" }, "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.91.6" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@solana/spl-token-metadata": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz", - "integrity": "sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==", + "node_modules/@jest/core": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", + "dev": true, "dependencies": { - "@solana/codecs": "2.0.0-preview.2", - "@solana/spl-type-length-value": "0.1.0" + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", + "micromatch": "^4.0.4", + "pretty-format": "^29.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=16" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "@solana/web3.js": "^1.91.6" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@solana/spl-type-length-value": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz", - "integrity": "sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==", + "node_modules/@jest/environment": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", + "dev": true, "dependencies": { - "buffer": "^6.0.3" + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" }, "engines": { - "node": ">=16" - } - }, - "node_modules/@solana/web3.js": { - "version": "1.91.7", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", - "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", - "dependencies": { - "@babel/runtime": "^7.23.4", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.3", - "@solana/buffer-layout": "^4.0.1", - "agentkeepalive": "^4.5.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.7.0", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" - }, - "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/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "node_modules/@jest/expect": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", + "dev": true, "dependencies": { - "defer-to-connect": "^2.0.0" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { - "node": ">=10" - } - }, - "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==", - "dependencies": { - "google-protobuf": "^3.17.3", - "long": "^4.0.0", - "protobufjs": "~6.11.2" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/@jest/expect-utils": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", + "dev": true, "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" + "jest-get-type": "^29.6.3" }, "engines": { - "node": ">=14" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", + "dev": true, "dependencies": { - "follow-redirects": "^1.14.9", - "form-data": "^4.0.0" + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@terra-money/terra.js/node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - }, - "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==", + "node_modules/@jest/globals": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", + "dev": true, "dependencies": { - "@improbable-eng/grpc-web": "^0.14.1", - "google-protobuf": "^3.17.3", - "long": "^4.0.0", - "protobufjs": "~6.11.2" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "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==", + "node_modules/@jest/reporters": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", + "dev": true, "dependencies": { - "browser-headers": "^0.4.1" + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "slash": "^3.0.0", + "string-length": "^4.0.1", + "strip-ansi": "^6.0.0", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { - "google-protobuf": "^3.14.0" + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "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==", - "dev": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/babel__generator": { - "version": "7.6.8", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", - "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "node_modules/@jest/source-map": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "dependencies": { - "@babel/types": "^7.0.0" + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "node_modules/@jest/test-result": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/babel__traverse": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", - "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7" + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/bn.js": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", - "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", + "node_modules/@jest/transform": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", + "dev": true, "dependencies": { - "@types/node": "*" + "@babel/core": "^7.11.6", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^2.0.0", + "fast-json-stable-stringify": "^2.1.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/cacheable-request": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", - "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==", + "node_modules/@jest/types": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", + "dev": true, "dependencies": { - "@types/http-cache-semantics": "*", - "@types/keyv": "^3.1.4", + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", "@types/node": "*", - "@types/responselike": "^1.0.0" + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/@types/chai": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", - "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", - "dev": true - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dev": true, "dependencies": { - "@types/node": "*" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "peer": true - }, - "node_modules/@types/graceful-fs": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", - "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "dependencies": { - "@types/node": "*" + "engines": { + "node": ">=6.0.0" } }, - "node_modules/@types/http-cache-semantics": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz", - "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==" + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "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==", "dev": true }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@types/istanbul-lib-coverage": "*" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "dependencies": { - "@types/istanbul-lib-report": "*" + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/@types/jest": { - "version": "29.5.12", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", - "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", - "dev": true, + "node_modules/@jup-ag/api": { + "version": "6.0.22", + "resolved": "https://registry.npmjs.org/@jup-ag/api/-/api-6.0.22.tgz", + "integrity": "sha512-15r5vmY6CZ1VreDao+Y7lQ3gugAuXNH+QfQ76PcMsx+GfqgWLgzINzBZVJFN9Y9B+dwo2EVHlsWNqSH7HaC3jw==" + }, + "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": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" + "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/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, - "optional": true - }, - "node_modules/@types/keyv": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", - "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==", + "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/@types/lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==" + "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/@types/lodash.values": { - "version": "4.3.9", - "resolved": "https://registry.npmjs.org/@types/lodash.values/-/lodash.values-4.3.9.tgz", - "integrity": "sha512-IJ20OEfqNwm3k8ENwoM3q0yOs4UMpgtD4GqxB4lwBHToGthHWqhyh5DdSgQjioocz0QK2SSBkJfCq95ZTV8BTw==", + "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/lodash": "*" + "@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/@types/long": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", - "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + "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/@types/mocha": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", - "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", - "dev": true + "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/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "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": { - "undici-types": "~5.26.4" + "base-x": "^4.0.0" } }, - "node_modules/@types/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "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": { - "@types/node": "*", - "form-data": "^4.0.0" + "@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/@types/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "node_modules/@mysten/sui.js/node_modules/superstruct": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", + "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@noble/curves": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", + "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", "dependencies": { - "@types/node": "*" + "@noble/hashes": "1.4.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@types/responselike": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz", - "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==", + "node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "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==", "dependencies": { - "@types/node": "*" + "@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/@types/secp256k1": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", - "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", + "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==", "dependencies": { - "@types/node": "*" + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.2.0" } }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true + "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==" }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + "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==" }, - "node_modules/@types/ws": { - "version": "7.4.7", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", - "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", - "dependencies": { - "@types/node": "*" - } + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" }, - "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", - "dev": true, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "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==", "dependencies": { - "@types/yargs-parser": "*" + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" } }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true + "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==" }, - "node_modules/@ungap/promise-all-settled": { + "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==" + }, + "node_modules/@protobufjs/path": { "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==", - "dev": true + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "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==" + }, + "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==" + }, + "node_modules/@scure/base": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.6.tgz", + "integrity": "sha512-ok9AWwhcgYuGG3Zfhyqg+zwl+Wn5uE+dwC0NV/2qQkx4dABbb/bx96vWu8NSj+BNjjSjno+JRYRjle1jV08k3g==", + "funding": { + "url": "https://paulmillr.com/funding/" + } }, - "node_modules/@volar/language-core": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.4.tgz", - "integrity": "sha512-7As47GndxGxsqqYnbreLrfB5NDUeQioPM2LJKUuB4/34c0NpEJ2byVl3c9KYdjIdiEstWZ9JLtLKNTaPWb5jtA==", + "node_modules/@scure/bip32": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@scure/bip32/-/bip32-1.4.0.tgz", + "integrity": "sha512-sVUpc0Vq3tXCkDGYVWGIZTRfnvu8LoTDaev7vbwh0omSvVORONr960MQWdKqJDCReIEmTj3PAr73O3aoxz7OPg==", "dependencies": { - "@volar/source-map": "2.2.4" + "@noble/curves": "~1.4.0", + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@volar/source-map": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.4.tgz", - "integrity": "sha512-m92FLpR9vB1YEZfiZ+bfgpLrToL/DNkOrorWVep3pffHrwwI4Tx2oIQN+sqHJfKkiT5N3J1owC+8crhAEinfjg==", + "node_modules/@scure/bip39": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@scure/bip39/-/bip39-1.3.0.tgz", + "integrity": "sha512-disdg7gHuTDZtY+ZdkmLpPCk7fxZSu3gBiEGuoC1XYxv9cGx3Z6cpTggCgW6odSOOIXCiDjuGejW+aJKCY/pIQ==", "dependencies": { - "muggle-string": "^0.4.0" + "@noble/hashes": "~1.4.0", + "@scure/base": "~1.1.6" + }, + "funding": { + "url": "https://paulmillr.com/funding/" } }, - "node_modules/@vue/compiler-core": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz", - "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, "dependencies": { - "@babel/parser": "^7.24.4", - "@vue/shared": "3.4.27", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.0" + "type-detect": "4.0.8" } }, - "node_modules/@vue/compiler-dom": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz", - "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==", + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, "dependencies": { - "@vue/compiler-core": "3.4.27", - "@vue/shared": "3.4.27" + "@sinonjs/commons": "^3.0.0" } }, - "node_modules/@vue/language-core": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.19.tgz", - "integrity": "sha512-A9EGOnvb51jOvnCYoRLnMP+CcoPlbZVxI9gZXE/y2GksRWM6j/PrLEIC++pnosWTN08tFpJgxhSS//E9v/Sg+Q==", + "node_modules/@solana/buffer-layout": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", + "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", "dependencies": { - "@volar/language-core": "~2.2.4", - "@vue/compiler-dom": "^3.4.0", - "@vue/shared": "^3.4.0", - "computeds": "^0.0.1", - "minimatch": "^9.0.3", - "path-browserify": "^1.0.1", - "vue-template-compiler": "^2.7.14" - }, - "peerDependencies": { - "typescript": "*" + "buffer": "~6.0.3" }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "engines": { + "node": ">=5.10" } }, - "node_modules/@vue/language-core/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==", + "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==", "dependencies": { - "balanced-match": "^1.0.0" + "@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/@vue/language-core/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "node_modules/@solana/codecs": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.2.tgz", + "integrity": "sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==", "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-data-structures": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/codecs-strings": "2.0.0-preview.2", + "@solana/options": "2.0.0-preview.2" } }, - "node_modules/@vue/shared": { - "version": "3.4.27", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz", - "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA==" + "node_modules/@solana/codecs-core": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz", + "integrity": "sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==", + "dependencies": { + "@solana/errors": "2.0.0-preview.2" + } }, - "node_modules/@wormhole-foundation/example-liquidity-layer-definitions": { - "version": "0.0.1", - "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", - "integrity": "sha512-qoV+IXNvir79vpjS2VcQZkfwVz4YoKaX+yz6evbspzD3bddJpRDxk16dYh4cQUpeQIRTCUYWAt3ojKdFXnCbbQ==", + "node_modules/@solana/codecs-data-structures": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz", + "integrity": "sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==", "dependencies": { - "@wormhole-foundation/sdk": "^0.7.0-beta.3" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" } }, - "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { - "version": "0.0.1", - "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "integrity": "sha512-CyZshOfX+p3EioCPjuCfpLb0+FohPFpohcFPFlSbR5KILCynTHk8SdXGyn2tgkZMJynj6+Boiywkm6Tsx81yyg==", + "node_modules/@solana/codecs-numbers": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz", + "integrity": "sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==", "dependencies": { - "@certusone/wormhole-spydk": "^0.0.1", - "@coral-xyz/anchor": "^0.30.0", - "@solana/spl-token": "^0.4.6", - "@solana/spl-token-group": "^0.0.4", - "@solana/spl-token-metadata": "^0.1.4", - "@solana/web3.js": "^1.91.7", - "@types/node-fetch": "^2.6.11", - "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", - "@wormhole-foundation/sdk": "^0.7.0-beta.3", - "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", - "dotenv": "^16.4.1", - "ethers": "^5.7.2", - "sha3": "^2.1.4", - "winston": "^3.13.0", - "yargs": "^17.7.2" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" } }, - "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@coral-xyz/anchor": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.0.tgz", - "integrity": "sha512-qreDh5ztiRHVnCbJ+RS70NJ6aSTPBYDAgFeQ7Z5QvaT5DcDIhNyt4onOciVz2ieIE1XWePOJDDu9SbNvPGBkvQ==", + "node_modules/@solana/codecs-strings": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz", + "integrity": "sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==", "dependencies": { - "@coral-xyz/borsh": "^0.30.0", - "@noble/hashes": "^1.3.1", - "@solana/web3.js": "^1.68.0", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^6.3.0", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "superstruct": "^0.15.4", - "toml": "^3.0.0" + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2", + "@solana/errors": "2.0.0-preview.2" }, - "engines": { - "node": ">=11" + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22" } }, - "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@coral-xyz/borsh": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.0.tgz", - "integrity": "sha512-OrcV+7N10cChhgDRUxM4iEIuwxUHHs52XD85R8cFCUqE0vbLYrcoPPPs+VF6kZ9DhdJGVW2I6DHJOp5TykyZog==", + "node_modules/@solana/errors": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.2.tgz", + "integrity": "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==", "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" + "chalk": "^5.3.0", + "commander": "^12.0.0" }, + "bin": { + "errors": "bin/cli.js" + } + }, + "node_modules/@solana/errors/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "engines": { - "node": ">=10" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, - "peerDependencies": { - "@solana/web3.js": "^1.68.0" + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@solana/options": { + "version": "2.0.0-preview.2", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz", + "integrity": "sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.2", + "@solana/codecs-numbers": "2.0.0-preview.2" } }, - "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@solana/spl-token": { + "node_modules/@solana/spl-token": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz", "integrity": "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==", @@ -4541,638 +3322,517 @@ "@solana/web3.js": "^1.91.6" } }, - "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "node_modules/@solana/spl-token-group": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.4.tgz", + "integrity": "sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==", "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "@solana/codecs": "2.0.0-preview.2", + "@solana/spl-type-length-value": "0.1.0" }, "engines": { - "node": ">=12" + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" } }, - "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/@solana/spl-token-metadata": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz", + "integrity": "sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "@solana/codecs": "2.0.0-preview.2", + "@solana/spl-type-length-value": "0.1.0" }, "engines": { - "node": ">=12" + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.91.6" } }, - "node_modules/@wormhole-foundation/sdk": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk/-/sdk-0.7.0-beta.3.tgz", - "integrity": "sha512-0hZi2kvhNOWTvk3o0UGQes3xJchH2COXa00BDYZg2aQAmZwB+7cn6BmkSLYJZZ26iu4B34+rjtVOGk/zIfgIaw==", - "dependencies": { - "@wormhole-foundation/sdk-algorand": "0.7.0-beta.3", - "@wormhole-foundation/sdk-algorand-core": "0.7.0-beta.3", - "@wormhole-foundation/sdk-algorand-tokenbridge": "0.7.0-beta.3", - "@wormhole-foundation/sdk-aptos": "0.7.0-beta.3", - "@wormhole-foundation/sdk-aptos-core": "0.7.0-beta.3", - "@wormhole-foundation/sdk-aptos-tokenbridge": "0.7.0-beta.3", - "@wormhole-foundation/sdk-base": "0.7.0-beta.3", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-cosmwasm": "0.7.0-beta.3", - "@wormhole-foundation/sdk-cosmwasm-core": "0.7.0-beta.3", - "@wormhole-foundation/sdk-cosmwasm-ibc": "0.7.0-beta.3", - "@wormhole-foundation/sdk-cosmwasm-tokenbridge": "0.7.0-beta.3", - "@wormhole-foundation/sdk-definitions": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm-cctp": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm-core": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm-portico": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm-tokenbridge": "0.7.0-beta.3", - "@wormhole-foundation/sdk-solana": "0.7.0-beta.3", - "@wormhole-foundation/sdk-solana-cctp": "0.7.0-beta.3", - "@wormhole-foundation/sdk-solana-core": "0.7.0-beta.3", - "@wormhole-foundation/sdk-solana-tokenbridge": "0.7.0-beta.3", - "@wormhole-foundation/sdk-sui": "0.7.0-beta.3", - "@wormhole-foundation/sdk-sui-core": "0.7.0-beta.3", - "@wormhole-foundation/sdk-sui-tokenbridge": "0.7.0-beta.3" + "node_modules/@solana/spl-type-length-value": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz", + "integrity": "sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==", + "dependencies": { + "buffer": "^6.0.3" }, "engines": { "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-algorand": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand/-/sdk-algorand-0.7.0-beta.3.tgz", - "integrity": "sha512-NhMoc783wcbGhaWNIydZalF5Gm4BBqhVg+rtFaT+6fiyeSpoPSv2BJrXK4g9U79II3gwA0LdMbARRMkA3jIuqw==", + "node_modules/@solana/web3.js": { + "version": "1.91.8", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.8.tgz", + "integrity": "sha512-USa6OS1jbh8zOapRJ/CBZImZ8Xb7AJjROZl5adql9TpOoBN9BUzyyouS5oPuZHft7S7eB8uJPuXWYjMi6BHgOw==", + "dependencies": { + "@babel/runtime": "^7.24.5", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.4.0", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.0", + "node-fetch": "^2.7.0", + "rpc-websockets": "^7.11.0", + "superstruct": "^0.14.2" + } + }, + "node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + }, + "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==", + "dependencies": { + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" + } + }, + "node_modules/@terra-money/legacy.proto/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, "dependencies": { - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "algosdk": "2.7.0" + "@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" }, - "engines": { - "node": ">=16" + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" } }, - "node_modules/@wormhole-foundation/sdk-algorand-core": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-core/-/sdk-algorand-core-0.7.0-beta.3.tgz", - "integrity": "sha512-RTMIBkK0GDNfaCf6NNhGTO39Ycvv0K9SeX8agbBv4QQ6V4qzNZUYv+OwO8RdpmNmvuaVP7ID6zp/E3zCBZCjyw==", + "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": { - "@wormhole-foundation/sdk-algorand": "0.7.0-beta.3", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" + "@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": ">=16" + "node": ">=14" } }, - "node_modules/@wormhole-foundation/sdk-algorand-tokenbridge": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-algorand-tokenbridge/-/sdk-algorand-tokenbridge-0.7.0-beta.3.tgz", - "integrity": "sha512-+QvdJlPFnpBDW4m9XsWG02/sm1w39WAIT6jE+wk5ZwRrVOwvZfafVrD8RqnQ/bmOEWC3YxC2l8YCJ34T6YQr9g==", + "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": { - "@wormhole-foundation/sdk-algorand": "0.7.0-beta.3", - "@wormhole-foundation/sdk-algorand-core": "0.7.0-beta.3", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" - }, - "engines": { - "node": ">=16" + "follow-redirects": "^1.14.9", + "form-data": "^4.0.0" } }, - "node_modules/@wormhole-foundation/sdk-aptos": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos/-/sdk-aptos-0.7.0-beta.3.tgz", - "integrity": "sha512-QYtEF499xtKw/V5jf6a9/2Jy7sD6bTrFFrDZV6L6Gw6hPwMPtiPWyzlX5s5beBznojxEfoLv9d4unLCcBxYY2Q==", + "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==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "aptos": "1.21.0" - }, - "engines": { - "node": ">=16" + "@improbable-eng/grpc-web": "^0.14.1", + "google-protobuf": "^3.17.3", + "long": "^4.0.0", + "protobufjs": "~6.11.2" } }, - "node_modules/@wormhole-foundation/sdk-aptos-core": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-core/-/sdk-aptos-core-0.7.0-beta.3.tgz", - "integrity": "sha512-tCpzETyjGtHrimKMou0YO48msExQQJ5+qZhpTSHnQ2hd3XaTIn93Wz+RvV6HRJJs+4RZNA30XeQSEzP2hMWsHQ==", + "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==", "dependencies": { - "@wormhole-foundation/sdk-aptos": "0.7.0-beta.3", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" + "browser-headers": "^0.4.1" }, - "engines": { - "node": ">=16" + "peerDependencies": { + "google-protobuf": "^3.14.0" } }, - "node_modules/@wormhole-foundation/sdk-aptos-tokenbridge": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-aptos-tokenbridge/-/sdk-aptos-tokenbridge-0.7.0-beta.3.tgz", - "integrity": "sha512-HMqKy0Dc2nMCdOhbT/C30xMnreHHTA1WbhzJRZdh3om1yR+EEi/L5pFTuh81WHVpRe6t1UsZWdGW1vjUSWk1PA==", + "node_modules/@terra-money/terra.proto/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "hasInstallScript": true, "dependencies": { - "@wormhole-foundation/sdk-aptos": "0.7.0-beta.3", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" + "@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" }, - "engines": { - "node": ">=16" + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" } }, - "node_modules/@wormhole-foundation/sdk-base": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.7.0-beta.3.tgz", - "integrity": "sha512-L0Dja5eBrvZaYDEWYicvzmLWaoigToqzcVOfjba3QICxzyg50W+cKuOu+qdbOPZF7Y8BUoSJOZFF5whDh2yQ/g==", - "dependencies": { - "@scure/base": "^1.1.3" - } + "node_modules/@tsconfig/node10": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", + "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", + "dev": true }, - "node_modules/@wormhole-foundation/sdk-connect": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.7.0-beta.3.tgz", - "integrity": "sha512-U4dAyrsWRi6vPW0UKlRg9W7aOoKYzJXUBSyC6k1+OOjaTXnP/welmP4DypYwtEniTc1spCzm0tw0GVHWbpyNvQ==", - "dependencies": { - "@wormhole-foundation/sdk-base": "0.7.0-beta.3", - "@wormhole-foundation/sdk-definitions": "0.7.0-beta.3", - "axios": "^1.4.0" - }, - "engines": { - "node": ">=16" - } + "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==", + "dev": true }, - "node_modules/@wormhole-foundation/sdk-cosmwasm": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm/-/sdk-cosmwasm-0.7.0-beta.3.tgz", - "integrity": "sha512-C35Ao74w/V26V7OR7DRIAe8AIotYl22b6f7+VrY7F8ChVgdfs//qwek2j9ZCKmRQksvSiZ80qDXHEpTTqMqhPg==", - "dependencies": { - "@cosmjs/cosmwasm-stargate": "^0.32.0", - "@cosmjs/proto-signing": "^0.32.0", - "@cosmjs/stargate": "^0.32.0", - "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "cosmjs-types": "^0.9.0" - }, - "engines": { - "node": ">=16" - } + "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==", + "dev": true }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-core": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-core/-/sdk-cosmwasm-core-0.7.0-beta.3.tgz", - "integrity": "sha512-Zo4IQeq1Eut4M4/OaPrfysJMeNr48CqodiHwuB0JlEFqeLHZUXAjk0GG8anso4aLmw0h+ziJohXNavZLxfINGg==", - "dependencies": { - "@cosmjs/cosmwasm-stargate": "^0.32.0", - "@cosmjs/stargate": "^0.32.0", - "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-cosmwasm": "0.7.0-beta.3" - }, - "engines": { - "node": ">=16" - } + "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==", + "dev": true }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-ibc": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-ibc/-/sdk-cosmwasm-ibc-0.7.0-beta.3.tgz", - "integrity": "sha512-s3XQPIyypN+u9xkEbyt5Xmeo1Awvb+yFoSdO0V+oyYi/uTtgPtk4wtUb/CiGuGppp6VVg4BNSwX79MF8Gh2HSw==", + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, "dependencies": { - "@cosmjs/cosmwasm-stargate": "^0.32.0", - "@cosmjs/stargate": "^0.32.0", - "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-cosmwasm": "0.7.0-beta.3", - "@wormhole-foundation/sdk-cosmwasm-core": "0.7.0-beta.3", - "cosmjs-types": "^0.9.0" - }, - "engines": { - "node": ">=16" + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "node_modules/@wormhole-foundation/sdk-cosmwasm-tokenbridge": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-cosmwasm-tokenbridge/-/sdk-cosmwasm-tokenbridge-0.7.0-beta.3.tgz", - "integrity": "sha512-LheKQaPAKboF1veOyYZiU3cX1kL+K1cbZmy8uZAW7/9E2v9Af6C8L2bJVhGQSppK74Pp3NmTETEeCAfPQRIBqQ==", + "node_modules/@types/babel__generator": { + "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", + "dev": true, "dependencies": { - "@cosmjs/cosmwasm-stargate": "^0.32.0", - "@injectivelabs/sdk-ts": "^1.14.4", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-cosmwasm": "0.7.0-beta.3" - }, - "engines": { - "node": ">=16" + "@babel/types": "^7.0.0" } }, - "node_modules/@wormhole-foundation/sdk-definitions": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.7.0-beta.3.tgz", - "integrity": "sha512-8Be4R+azLgkFXH7Yw2wi8xpZJRm6pliJTMqD6jusN4Dg6KatRgm5GKpyhZrkIDrDXxIcj/PfLwu32X+rKjmH/Q==", + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, "dependencies": { - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "0.7.0-beta.3" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "node_modules/@wormhole-foundation/sdk-evm": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.7.0-beta.3.tgz", - "integrity": "sha512-Eug8ZN6521u9RzYqDq+ZFcjnq+DibVSvdR5MNqaI7QWobYOhLRjbPude2qXDBQWhmLHpmyD2qQdLhJZPoFTKEw==", + "node_modules/@types/babel__traverse": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz", + "integrity": "sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==", + "dev": true, "dependencies": { - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "ethers": "^6.5.1" - }, - "engines": { - "node": ">=16" + "@babel/types": "^7.20.7" } }, - "node_modules/@wormhole-foundation/sdk-evm-cctp": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-cctp/-/sdk-evm-cctp-0.7.0-beta.3.tgz", - "integrity": "sha512-XdrFpA4ug7l9h1M6DFgwv3z+Zj7Wnb5+nmDiosnK5TCxtIqLdhn/xDqfnM5oFrhl88w4PQtrioVnBoydwuVQpw==", + "node_modules/@types/bn.js": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", + "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", - "ethers": "^6.5.1" - }, - "engines": { - "node": ">=16" + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-evm-cctp/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/@types/chai": { + "version": "4.3.16", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", + "dev": true }, - "node_modules/@wormhole-foundation/sdk-evm-cctp/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/@types/connect": { + "version": "3.4.38", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", + "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "dependencies": { + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-evm-cctp/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "node_modules/@wormhole-foundation/sdk-evm-cctp/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "node_modules/@wormhole-foundation/sdk-evm-cctp/node_modules/ethers": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", - "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", + "dev": true, "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-evm-cctp/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@wormhole-foundation/sdk-evm-cctp/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "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/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" } }, - "node_modules/@wormhole-foundation/sdk-evm-core": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-core/-/sdk-evm-core-0.7.0-beta.3.tgz", - "integrity": "sha512-ZBL4wYCR9GnVILX41EDofOZiEI35XsIMtLSsiAB6XP/WMRKd53yPpri//yIKGpl96jdqngkOeV/RLRKjBERsWA==", + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", + "dev": true, "dependencies": { - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", - "ethers": "^6.5.1" - }, - "engines": { - "node": ">=16" + "@types/istanbul-lib-report": "*" } }, - "node_modules/@wormhole-foundation/sdk-evm-core/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "node_modules/@types/jest": { + "version": "29.5.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.12.tgz", + "integrity": "sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==", + "dev": true, "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "expect": "^29.0.0", + "pretty-format": "^29.0.0" } }, - "node_modules/@wormhole-foundation/sdk-evm-core/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/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "optional": true + }, + "node_modules/@types/lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ==", + "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/@wormhole-foundation/sdk-evm-core/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + "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==" }, - "node_modules/@wormhole-foundation/sdk-evm-core/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true }, - "node_modules/@wormhole-foundation/sdk-evm-core/node_modules/ethers": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", - "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@types/node": { + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" + "undici-types": "~5.26.4" } }, - "node_modules/@wormhole-foundation/sdk-evm-core/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } }, - "node_modules/@wormhole-foundation/sdk-evm-core/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "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/@types/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-uRwJqmiXmh9++aSu1VNEn3iIxWOhd8AHXNSdlaLfdAAdSTY9jYVeGWnzejM3dvrkbqE3/hyQkQQ29IFATEGlew==", + "dependencies": { + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-evm-portico": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-portico/-/sdk-evm-portico-0.7.0-beta.3.tgz", - "integrity": "sha512-/OtMTSr+deYNB1XoVVUNbzvpuUDbRpjXVH+4snAyauGCqKjk0klqZIm63+8UsgUjg01jO+fKI3IS/z49ONo3Qw==", + "node_modules/@types/secp256k1": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", + "integrity": "sha512-hHxJU6PAEUn0TP4S/ZOzuTUvJWuZ6eIKeNKb5RBpODvSl6hp1Wrw4s7ATY50rklRCScUDpHzVA/DQdSjJ3UoYQ==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm-core": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm-tokenbridge": "0.7.0-beta.3", - "ethers": "^6.5.1" - }, - "engines": { - "node": ">=16" + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-evm-portico/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", + "dev": true + }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" + }, + "node_modules/@types/ws": { + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", + "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "@types/node": "*" } }, - "node_modules/@wormhole-foundation/sdk-evm-portico/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/@types/yargs": { + "version": "17.0.32", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", + "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" } }, - "node_modules/@wormhole-foundation/sdk-evm-portico/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", + "dev": true }, - "node_modules/@wormhole-foundation/sdk-evm-portico/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + "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==", + "dev": true }, - "node_modules/@wormhole-foundation/sdk-evm-portico/node_modules/ethers": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", - "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@wormhole-foundation/example-liquidity-layer-definitions": { + "version": "0.0.1", + "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", + "integrity": "sha512-qoV+IXNvir79vpjS2VcQZkfwVz4YoKaX+yz6evbspzD3bddJpRDxk16dYh4cQUpeQIRTCUYWAt3ojKdFXnCbbQ==", + "license": "Apache-2.0", "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" - }, - "engines": { - "node": ">=14.0.0" + "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { + "version": "0.0.1", + "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", + "integrity": "sha512-CyZshOfX+p3EioCPjuCfpLb0+FohPFpohcFPFlSbR5KILCynTHk8SdXGyn2tgkZMJynj6+Boiywkm6Tsx81yyg==", + "dependencies": { + "@certusone/wormhole-spydk": "^0.0.1", + "@coral-xyz/anchor": "^0.30.0", + "@solana/spl-token": "^0.4.6", + "@solana/spl-token-group": "^0.0.4", + "@solana/spl-token-metadata": "^0.1.4", + "@solana/web3.js": "^1.91.7", + "@types/node-fetch": "^2.6.11", + "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-solana": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.4", + "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", + "dotenv": "^16.4.1", + "ethers": "^5.7.2", + "sha3": "^2.1.4", + "winston": "^3.13.0", + "yargs": "^17.7.2" } }, - "node_modules/@wormhole-foundation/sdk-evm-portico/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@wormhole-foundation/sdk-evm-portico/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "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/@wormhole-foundation/sdk-base": { + "version": "0.7.0-beta.4", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.7.0-beta.4.tgz", + "integrity": "sha512-UOMnCvRIsWnfn1jz5SV8YVBu8d7cyp/Z1h6RPcvPuTTR/RUrpQNAdGLSh4tlGUENJEFwNO22p0Vp6xpEekUZbg==", + "dependencies": { + "@scure/base": "^1.1.3" } }, - "node_modules/@wormhole-foundation/sdk-evm-tokenbridge": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm-tokenbridge/-/sdk-evm-tokenbridge-0.7.0-beta.3.tgz", - "integrity": "sha512-64NlZQjR1nvGoL7Q2KjkVhfpjtd5zmD2iWzm3GJLK/bLIn1vUJlKwNPXzjtwVLWzw00BCwrYeQzSAI5qLpQ1VA==", + "node_modules/@wormhole-foundation/sdk-connect": { + "version": "0.7.0-beta.4", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.7.0-beta.4.tgz", + "integrity": "sha512-Kncz0/xozMtw6A/SyD2WRg2XMIyy8G7O8CzfHQdXV8Gao2XSbvFvOxM6t13SJa6ZCIEqy8YNYpbDSFky6oOaTw==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", - "@wormhole-foundation/sdk-evm-core": "0.7.0-beta.3", - "ethers": "^6.5.1" + "@wormhole-foundation/sdk-base": "0.7.0-beta.4", + "@wormhole-foundation/sdk-definitions": "0.7.0-beta.4", + "axios": "^1.4.0" }, "engines": { "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "node_modules/@wormhole-foundation/sdk-connect/node_modules/axios": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.1.tgz", + "integrity": "sha512-+LV37nQcd1EpFalkXksWNBiA17NZ5m5/WspmHGmZmdx1qBOg/VNq/c4eRJiA9VQQHBOs+N0ZhhdU10h2TyNK7Q==", "dependencies": { - "@noble/hashes": "1.3.2" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/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/@wormhole-foundation/sdk-definitions": { + "version": "0.7.0-beta.4", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.7.0-beta.4.tgz", + "integrity": "sha512-F/8okpmZCNO8SVBXsjAMpQmDwTGH0DQopD07dS8gPsNAi8aUFkpOr6fQC69dTs0LeH1GekFCf/iE3ffWR9hkJA==", + "dependencies": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.1", + "@wormhole-foundation/sdk-base": "0.7.0-beta.4" } }, - "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/node_modules/ethers": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", - "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@wormhole-foundation/sdk-evm": { + "version": "0.7.0-beta.4", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.7.0-beta.4.tgz", + "integrity": "sha512-ow3AufZf/+TOH5xwNuxfwp1WJL3tC6C1iz0a2lJnpXRzFB0gB/eKO2O5gCFX87EX0VeVw043Yzr3/ZAjTrSQxQ==", "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.4", + "ethers": "^6.5.1" }, "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" - }, - "node_modules/@wormhole-foundation/sdk-evm-tokenbridge/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "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": ">=16" } }, "node_modules/@wormhole-foundation/sdk-evm/node_modules/@noble/curves": { @@ -5260,103 +3920,203 @@ } }, "node_modules/@wormhole-foundation/sdk-solana": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.7.0-beta.3.tgz", - "integrity": "sha512-bT6RmOlGzmYBtn8sw6xHDe/nROrLhfOOJXGACLE00vmfT+tYCqRDQpEg7QHybqxuFjGl1n/QDQmzqAwoDIU/Kg==", + "version": "0.7.0-beta.4", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.7.0-beta.4.tgz", + "integrity": "sha512-ZDYpPZSFN6fQhP57SzL9K0JkkJaXTjNmd9GsKPoP6BtiqnTgSnaPEDh/yAGR9QevjnAE2M4/Da9MXOFudJNhhA==", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@coral-xyz/borsh": "0.29.0", "@solana/spl-token": "0.3.9", "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.4" }, "engines": { "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-solana-cctp": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-cctp/-/sdk-solana-cctp-0.7.0-beta.3.tgz", - "integrity": "sha512-xa0TOP2Yx35ItuNKNUk5OvIsJcsx0MsVPe9KwC3CQzcrOyR9D5XCn2zneJwMJq+6VFdgB8rE0BQq63NLOkIUrQ==", + "node_modules/@wormhole-foundation/sdk-solana-core": { + "version": "0.7.0-beta.4", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.7.0-beta.4.tgz", + "integrity": "sha512-thqDpn8M4NfoxxBAcrZyXIspFBAHBy2HJi3ERAQTaif1IFlZCgtZla09LjvuVVATEPrSteUOhOiWvhn7AcXv1A==", "dependencies": { "@coral-xyz/anchor": "0.29.0", - "@solana/spl-token": "0.3.9", + "@coral-xyz/borsh": "0.29.0", "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-solana": "0.7.0-beta.3" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.4", + "@wormhole-foundation/sdk-solana": "0.7.0-beta.4" }, "engines": { "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-solana-core": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.7.0-beta.3.tgz", - "integrity": "sha512-vL5/PWXEnXctUMY4ii9ndmoQMqWnAlRBDJ5y+nIEnVkkTEOaoInvmEGdSzGV+z5fOotkPPnItunFTSGLhUsHrA==", + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@coral-xyz/anchor": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", + "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", "dependencies": { - "@coral-xyz/anchor": "0.29.0", - "@coral-xyz/borsh": "0.29.0", - "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-solana": "0.7.0-beta.3" + "@coral-xyz/borsh": "^0.29.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" }, "engines": { - "node": ">=16" + "node": ">=11" } }, - "node_modules/@wormhole-foundation/sdk-solana-tokenbridge": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-tokenbridge/-/sdk-solana-tokenbridge-0.7.0-beta.3.tgz", - "integrity": "sha512-XB0WAZKDASnnR9gJ0IRlZhXf9IKjC7uROeQSfAtggvb8wPQxhNkvIryL/cqF9Sr8QTOcgH6X8yu1qeOn8YjLPw==", + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@coral-xyz/borsh": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", + "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", "dependencies": { - "@coral-xyz/anchor": "0.29.0", - "@solana/spl-token": "0.3.9", - "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-solana": "0.7.0-beta.3", - "@wormhole-foundation/sdk-solana-core": "0.7.0-beta.3" + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@solana/web3.js": { + "version": "1.91.7", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", + "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", + "dependencies": { + "@babel/runtime": "^7.23.4", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.3", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.0", + "node-fetch": "^2.7.0", + "rpc-websockets": "^7.5.1", + "superstruct": "^0.14.2" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + }, + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wormhole-foundation/sdk-solana/node_modules/@coral-xyz/anchor": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", + "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", + "dependencies": { + "@coral-xyz/borsh": "^0.29.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "node_modules/@wormhole-foundation/sdk-solana/node_modules/@coral-xyz/borsh": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", + "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/@wormhole-foundation/sdk-solana/node_modules/@solana/spl-token": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", + "integrity": "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA==", + "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/@wormhole-foundation/sdk-solana/node_modules/@solana/web3.js": { + "version": "1.91.7", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", + "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", + "dependencies": { + "@babel/runtime": "^7.23.4", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.3", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.0", + "node-fetch": "^2.7.0", + "rpc-websockets": "^7.5.1", + "superstruct": "^0.14.2" } }, - "node_modules/@wormhole-foundation/sdk-sui": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui/-/sdk-sui-0.7.0-beta.3.tgz", - "integrity": "sha512-oi2Jb1iRK0+Bpni4NmAWexNXwtaaMSb4oC7YofaEeuPboo90AJg2cV/N/f5kJhK45Qy3jZRpy2UbShZaSDcgIw==", - "dependencies": { - "@mysten/sui.js": "^0.50.1", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3" - }, - "engines": { - "node": ">=16" - } + "node_modules/@wormhole-foundation/sdk-solana/node_modules/@solana/web3.js/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" }, - "node_modules/@wormhole-foundation/sdk-sui-core": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui-core/-/sdk-sui-core-0.7.0-beta.3.tgz", - "integrity": "sha512-+9XcviPpLsfI+KV8xbYyGXqVj0KW1CLftuoRRmpbOzH6oG/Nh9kf0qSs4Bqin+kfj87qYMzEElCb3V3hN6rQrA==", - "dependencies": { - "@mysten/sui.js": "^0.50.1", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-sui": "0.7.0-beta.3" - }, + "node_modules/@wormhole-foundation/sdk-solana/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { - "node": ">=16" - } - }, - "node_modules/@wormhole-foundation/sdk-sui-tokenbridge": { - "version": "0.7.0-beta.3", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-sui-tokenbridge/-/sdk-sui-tokenbridge-0.7.0-beta.3.tgz", - "integrity": "sha512-pSXlGUTMrHIx2mPQo91inZ9bnnUTiF+35qyYCu8WBiSNbD8D2k/CjgbddJFGnffOBrRDrExsl7a+V0EfEDoY2g==", - "dependencies": { - "@mysten/sui.js": "^0.50.1", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.3", - "@wormhole-foundation/sdk-sui": "0.7.0-beta.3", - "@wormhole-foundation/sdk-sui-core": "0.7.0-beta.3" + "node": ">=10" }, - "engines": { - "node": ">=16" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@wormhole-foundation/swap-layer-evm": { @@ -5371,6 +4131,7 @@ "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" }, @@ -5382,6 +4143,7 @@ "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" }, @@ -5393,6 +4155,7 @@ "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" }, @@ -5404,6 +4167,7 @@ "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" }, @@ -5449,15 +4213,11 @@ "follow-redirects": "^1.14.8" } }, - "node_modules/@xpla/xpla.js/node_modules/bech32": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", - "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" - }, "node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -5542,6 +4302,32 @@ "node": ">=11" } }, + "node_modules/anchor-0.29.0/node_modules/@coral-xyz/borsh": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", + "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/anchor-0.29.0/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -5602,14 +4388,13 @@ } }, "node_modules/aptos": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/aptos/-/aptos-1.21.0.tgz", - "integrity": "sha512-PRKjoFgL8tVEc9+oS7eJUv8GNxx8n3+0byH2+m7CP3raYOD6yFKOecuwjVMIJmgfpjp6xH0P0HDMGZAXmSyU0Q==", - "dependencies": { - "@aptos-labs/aptos-client": "^0.1.0", - "@noble/hashes": "1.3.3", - "@scure/bip39": "1.2.1", - "eventemitter3": "^5.0.1", + "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" }, @@ -5618,32 +4403,39 @@ } }, "node_modules/aptos/node_modules/@noble/hashes": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.3.3.tgz", - "integrity": "sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==", - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } + "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/" + } + ] }, "node_modules/aptos/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==", + "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.3.0", + "@noble/hashes": "~1.1.1", "@scure/base": "~1.1.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" } }, - "node_modules/aptos/node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + "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", @@ -5660,15 +4452,6 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "peer": true, - "dependencies": { - "dequal": "^2.0.3" - } - }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -5697,22 +4480,11 @@ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/axios": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.1.tgz", - "integrity": "sha512-+LV37nQcd1EpFalkXksWNBiA17NZ5m5/WspmHGmZmdx1qBOg/VNq/c4eRJiA9VQQHBOs+N0ZhhdU10h2TyNK7Q==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axobject-query": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", - "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", - "peer": true, + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", "dependencies": { - "dequal": "^2.0.3" + "follow-redirects": "^1.14.4" } }, "node_modules/babel-jest": { @@ -5825,7 +4597,8 @@ "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==" + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "devOptional": true }, "node_modules/base-x": { "version": "3.0.9", @@ -5855,9 +4628,9 @@ ] }, "node_modules/bech32": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", - "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-2.0.0.tgz", + "integrity": "sha512-LcknSilhIGatDAsY1ak2I8VtGaHNhgMSYVxFrGLXv+xLHytaKZKcaUJJUE7qmBr7h33o5YQwP55pMI0xmkpJwg==" }, "node_modules/big-integer": { "version": "1.6.36", @@ -5978,18 +4751,19 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "devOptional": true, "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==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -6149,31 +4923,6 @@ "node": ">=6.14.2" } }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, - "node_modules/cacheable-request": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", - "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^4.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^6.0.1", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -6184,14 +4933,11 @@ } }, "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/caniuse-lite": { @@ -6341,24 +5087,16 @@ "dev": true }, "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==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone-response": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz", - "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==", - "dependencies": { - "mimic-response": "^1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=12" } }, "node_modules/co": { @@ -6371,28 +5109,6 @@ "node": ">= 0.12.0" } }, - "node_modules/code-red": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", - "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "peer": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "@types/estree": "^1.0.1", - "acorn": "^8.10.0", - "estree-walker": "^3.0.3", - "periscopic": "^3.1.0" - } - }, - "node_modules/code-red/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "peer": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", @@ -6467,19 +5183,18 @@ } }, "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==" - }, - "node_modules/computeds": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", - "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==" + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "engines": { + "node": ">=18" + } }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "devOptional": true }, "node_modules/convert-source-map": { "version": "2.0.0", @@ -6491,6 +5206,7 @@ "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", @@ -6501,20 +5217,90 @@ "yargs": "^16.1.0" }, "bin": { - "copyfiles": "copyfiles", - "copyup": "copyfiles" + "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/copyfiles/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "optional": true, + "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/cosmjs-types/node_modules/protobufjs": { + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", + "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "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/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" } }, - "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==" - }, - "node_modules/cosmjs-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", - "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" - }, "node_modules/crc-32": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", @@ -6626,24 +5412,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "peer": true, - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==" - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -6661,12 +5429,6 @@ } } }, - "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==", - "dev": true - }, "node_modules/decamelize": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", @@ -6684,31 +5446,6 @@ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" }, - "node_modules/decompress-response": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", - "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "dependencies": { - "mimic-response": "^3.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/decompress-response/node_modules/mimic-response": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", - "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/dedent": { "version": "1.5.3", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz", @@ -6723,11 +5460,6 @@ } } }, - "node_modules/dedent-js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dedent-js/-/dedent-js-1.0.1.tgz", - "integrity": "sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==" - }, "node_modules/deep-eql": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", @@ -6748,18 +5480,11 @@ "node": ">=0.10.0" } }, - "node_modules/defer-to-connect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", - "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", - "engines": { - "node": ">=10" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "optional": true, "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", @@ -6776,6 +5501,7 @@ "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", @@ -6815,15 +5541,6 @@ "node": ">= 0.8" } }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "peer": true, - "engines": { - "node": ">=6" - } - }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -6934,12 +5651,6 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/eccrypto/node_modules/nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "optional": true - }, "node_modules/eccrypto/node_modules/secp256k1": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-3.7.1.tgz", @@ -6961,9 +5672,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.774", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.774.tgz", - "integrity": "sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg==", + "version": "1.4.776", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.776.tgz", + "integrity": "sha512-s694bi3+gUzlliqxjPHpa9NRTlhzTgB34aan+pVKZmOTGy2xoZXl+8E1B8i5p5rtev3PKMK/H4asgNejC+YHNg==", "dev": true }, "node_modules/elliptic": { @@ -7007,25 +5718,6 @@ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -7049,6 +5741,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "optional": true, "dependencies": { "get-intrinsic": "^1.2.4" }, @@ -7060,6 +5753,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "optional": true, "engines": { "node": ">= 0.4" } @@ -7145,11 +5839,6 @@ "node": ">=4" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" - }, "node_modules/eth-crypto": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/eth-crypto/-/eth-crypto-2.6.0.tgz", @@ -7242,6 +5931,7 @@ "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" @@ -7251,6 +5941,7 @@ "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": "*" } @@ -7258,12 +5949,14 @@ "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==" + "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", @@ -7340,6 +6033,7 @@ "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" @@ -7386,18 +6080,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -7468,9 +6150,9 @@ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "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==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -7541,7 +6223,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==" + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "devOptional": true }, "node_modules/fsevents": { "version": "2.3.3", @@ -7561,6 +6244,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "devOptional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -7594,6 +6278,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "optional": true, "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2", @@ -7618,14 +6303,12 @@ } }, "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dependencies": { - "pump": "^3.0.0" - }, + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -7647,6 +6330,7 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "devOptional": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -7687,6 +6371,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "optional": true, "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" @@ -7707,6 +6392,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "optional": true, "dependencies": { "get-intrinsic": "^1.1.3" }, @@ -7714,47 +6400,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/got": { - "version": "11.8.6", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz", - "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, - "node_modules/gql.tada": { - "version": "1.7.5", - "resolved": "https://registry.npmjs.org/gql.tada/-/gql.tada-1.7.5.tgz", - "integrity": "sha512-GepPTee+FWSVVZQ7GiJHzsGNo7gOb59kcn4mUPYLlkbpeJfOUwpuoB05ZNaXG0W4qZVPd1I7R2UgMHBjY1lGlQ==", - "dependencies": { - "@0no-co/graphql.web": "^1.0.5", - "@gql.tada/cli-utils": "1.3.9", - "@gql.tada/internal": "1.0.0" - }, - "bin": { - "gql-tada": "bin/cli.js", - "gql.tada": "bin/cli.js" - }, - "peerDependencies": { - "typescript": "^5.0.0" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -7765,6 +6410,7 @@ "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" } @@ -7773,6 +6419,7 @@ "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" }, @@ -7805,6 +6452,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "optional": true, "dependencies": { "es-define-property": "^1.0.0" }, @@ -7816,6 +6464,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "optional": true, "engines": { "node": ">= 0.4" }, @@ -7827,6 +6476,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "optional": true, "engines": { "node": ">= 0.4" }, @@ -7860,6 +6510,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "devOptional": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -7871,6 +6522,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, "bin": { "he": "bin/he" } @@ -7894,21 +6546,23 @@ "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/hoist-non-react-statics/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/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==" - }, "node_modules/http-errors": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", @@ -7935,19 +6589,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==" - }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", + "optional": true }, "node_modules/human-signals": { "version": "2.1.0", @@ -8017,6 +6660,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -8031,6 +6675,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "optional": true, "engines": { "node": ">= 0.10" } @@ -8057,6 +6702,7 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "devOptional": true, "dependencies": { "hasown": "^2.0.0" }, @@ -8106,6 +6752,7 @@ "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" @@ -8129,15 +6776,6 @@ "node": ">=8" } }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "peer": true, - "dependencies": { - "@types/estree": "*" - } - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -8164,7 +6802,8 @@ "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==" + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "optional": true }, "node_modules/isexe": { "version": "2.0.0", @@ -8288,6 +6927,11 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" }, + "node_modules/jayson/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==" + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -8392,38 +7036,6 @@ } } }, - "node_modules/jest-cli/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/jest-cli/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "dev": true, - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", @@ -8826,6 +7438,18 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, + "node_modules/jest-validate/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", @@ -8898,7 +7522,8 @@ "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==" + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "devOptional": true }, "node_modules/js-yaml": { "version": "3.14.1", @@ -8941,11 +7566,6 @@ "bignumber.js": "^9.0.0" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -8981,6 +7601,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.1.tgz", "integrity": "sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ==", + "optional": true, "engines": { "node": "*" } @@ -9018,20 +7639,13 @@ "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/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", @@ -9061,11 +7675,6 @@ "integrity": "sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw==", "optional": true }, - "node_modules/libsodium-sumo": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/libsodium-sumo/-/libsodium-sumo-0.7.13.tgz", - "integrity": "sha512-zTGdLu4b9zSNLfovImpBCbdAA4xkpkZbMnSQjP8HShyOutnGjRHmSOKlsylh1okao6QhLiz7nG98EGn+04cZjQ==" - }, "node_modules/libsodium-wrappers": { "version": "0.7.13", "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz", @@ -9075,14 +7684,6 @@ "libsodium": "^0.7.13" } }, - "node_modules/libsodium-wrappers-sumo": { - "version": "0.7.13", - "resolved": "https://registry.npmjs.org/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.13.tgz", - "integrity": "sha512-lz4YdplzDRh6AhnLGF2Dj2IUj94xRN6Bh8T0HLNwzYGwPehQJX6c7iYVrFUPZ3QqxE0bqC+K0IIqqZJYWumwSQ==", - "dependencies": { - "libsodium-sumo": "^0.7.13" - } - }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", @@ -9093,6 +7694,7 @@ "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" }, @@ -9107,6 +7709,7 @@ "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==", + "optional": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -9118,6 +7721,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "optional": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -9131,6 +7735,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "optional": true, "dependencies": { "color-name": "1.1.3" } @@ -9138,12 +7743,14 @@ "node_modules/link-module-alias/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==" + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "optional": true }, "node_modules/link-module-alias/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==", + "optional": true, "engines": { "node": ">=0.8.0" } @@ -9152,6 +7759,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "optional": true, "engines": { "node": ">=4" } @@ -9160,6 +7768,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "optional": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -9167,12 +7776,6 @@ "node": ">=4" } }, - "node_modules/locate-character": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", - "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==", - "peer": true - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -9188,7 +7791,8 @@ "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "optional": true }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -9204,7 +7808,8 @@ "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==" + "integrity": "sha512-r0RwvdCv8id9TUblb/O7rYPwVy6lerCbcawrfdo9iC/1t1wsNMJknO79WNBgwkH0hIeJ08jmvvESbFpNb4jH0Q==", + "optional": true }, "node_modules/log-symbols": { "version": "4.1.0", @@ -9247,6 +7852,7 @@ "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" }, @@ -9270,14 +7876,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" - } - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -9287,15 +7885,6 @@ "yallist": "^3.0.2" } }, - "node_modules/magic-string": { - "version": "0.30.10", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", - "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", - "peer": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - } - }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -9342,6 +7931,7 @@ "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" }, @@ -9359,12 +7949,6 @@ "safe-buffer": "^5.1.2" } }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", - "peer": true - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -9372,18 +7956,30 @@ "dev": true }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.6.tgz", + "integrity": "sha512-Y4Ypn3oujJYxJcMacVgcs92wofTHxp9FzfDpQON4msDefoC0lb3ETvQLOdLcbhSwU1bz8HrL/1sygfBIHudrkQ==", "dev": true, "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" + "braces": "^3.0.3", + "picomatch": "^4.0.2" }, "engines": { "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -9412,14 +8008,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -9434,6 +8022,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "devOptional": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9445,6 +8034,7 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "devOptional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -9453,6 +8043,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "optional": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -9509,6 +8100,17 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "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==", + "dev": true, + "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.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -9640,6 +8242,12 @@ "node": ">=10" } }, + "node_modules/mocha/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==", + "dev": true + }, "node_modules/mocha/node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", @@ -9670,6 +8278,24 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "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==", + "dev": 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/mocha/node_modules/yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", @@ -9680,14 +8306,9 @@ } }, "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==" - }, - "node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mustache": { "version": "4.2.0", @@ -9698,9 +8319,9 @@ } }, "node_modules/nan": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.19.0.tgz", - "integrity": "sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==" + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "node_modules/nanoid": { "version": "3.3.1", @@ -9797,6 +8418,7 @@ "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" @@ -9806,6 +8428,7 @@ "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", @@ -9816,7 +8439,8 @@ "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==" + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "optional": true }, "node_modules/normalize-path": { "version": "3.0.0", @@ -9827,17 +8451,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", - "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -9862,6 +8475,7 @@ "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" } @@ -9870,6 +8484,7 @@ "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" } @@ -9878,6 +8493,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "devOptional": true, "dependencies": { "wrappy": "1" } @@ -9909,6 +8525,7 @@ "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", @@ -9920,6 +8537,7 @@ "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" }, @@ -9927,14 +8545,6 @@ "node": ">=8" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -10009,20 +8619,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -10036,6 +8632,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -10052,7 +8649,8 @@ "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==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "devOptional": true }, "node_modules/pathval": { "version": "1.1.1", @@ -10077,26 +8675,6 @@ "node": ">=0.12" } }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "peer": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, - "node_modules/periscopic/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "peer": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, "node_modules/picocolors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", @@ -10177,16 +8755,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-format/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true - }, "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==" + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "optional": true }, "node_modules/prompts": { "version": "2.4.2", @@ -10205,16 +8778,23 @@ "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/prop-types/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/protobufjs": { - "version": "6.11.4", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.4.tgz", - "integrity": "sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", + "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", "hasInstallScript": true, "dependencies": { "@protobufjs/aspromise": "^1.1.2", @@ -10227,29 +8807,23 @@ "@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" + "long": "^5.0.0" }, - "bin": { - "pbjs": "bin/pbjs", - "pbts": "bin/pbts" + "engines": { + "node": ">=12.0.0" } }, + "node_modules/protobufjs/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/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==" }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", @@ -10266,17 +8840,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -10286,9 +8849,10 @@ } }, "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==" + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "dev": true }, "node_modules/readable-stream": { "version": "3.6.2", @@ -10318,12 +8882,14 @@ "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==" + "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" }, @@ -10340,6 +8906,7 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/rehackt/-/rehackt-0.1.0.tgz", "integrity": "sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==", + "optional": true, "peerDependencies": { "@types/react": "*", "react": "*" @@ -10365,6 +8932,7 @@ "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "devOptional": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -10377,11 +8945,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-alpn": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", - "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" - }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", @@ -10425,21 +8988,11 @@ "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/responselike": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", - "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", - "dependencies": { - "lowercase-keys": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -10633,6 +9186,7 @@ "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", @@ -10649,6 +9203,7 @@ "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" @@ -10707,6 +9262,7 @@ "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", @@ -10720,6 +9276,7 @@ "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" }, @@ -10736,14 +9293,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", @@ -10791,7 +9340,8 @@ "node_modules/store2": { "version": "2.14.3", "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz", - "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==" + "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==", + "optional": true }, "node_modules/string_decoder": { "version": "1.3.0", @@ -10860,6 +9410,7 @@ "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" }, @@ -10901,6 +9452,7 @@ "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==", + "devOptional": true, "engines": { "node": ">= 0.4" }, @@ -10908,57 +9460,11 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/svelte": { - "version": "4.2.17", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.17.tgz", - "integrity": "sha512-N7m1YnoXtRf5wya5Gyx3TWuTddI4nAyayyIWFojiWV5IayDYNV5i2mRp/7qNGol4DtxEYxljmrbgp1HM6hUbmQ==", - "peer": true, - "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@jridgewell/sourcemap-codec": "^1.4.15", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/estree": "^1.0.1", - "acorn": "^8.9.0", - "aria-query": "^5.3.0", - "axobject-query": "^4.0.0", - "code-red": "^1.0.3", - "css-tree": "^2.3.1", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.1", - "locate-character": "^3.0.0", - "magic-string": "^0.30.4", - "periscopic": "^3.1.0" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/svelte/node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "peer": true, - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/svelte2tsx": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.8.tgz", - "integrity": "sha512-ABK3RDFcy59AqAiU1N5Kxu1RnKrb1GDMrQjLgNgJfE8Q+coCKpjCAPtUVKQM2HnmuqeNWcT3NqfXbE+ZmN5Pow==", - "dependencies": { - "dedent-js": "^1.0.1", - "pascal-case": "^3.1.1" - }, - "peerDependencies": { - "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", - "typescript": "^4.9.4 || ^5.0.0" - } - }, "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" } @@ -10996,6 +9502,7 @@ "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" @@ -11004,12 +9511,14 @@ "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==" + "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", @@ -11023,12 +9532,14 @@ "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==" + "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" } @@ -11119,6 +9630,7 @@ "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" }, @@ -11127,9 +9639,9 @@ } }, "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.1.3", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.3.tgz", + "integrity": "sha512-6L9qz3ginTd1NKhOxmkP0qU3FyKjj5CPoY+anszfVn6Pmv/RIKzhiMCsH7Yb7UvJR9I2A64rm4zQl531s2F1iw==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -11145,10 +9657,11 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -11158,6 +9671,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -11371,7 +9887,8 @@ "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==" + "integrity": "sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw==", + "optional": true }, "node_modules/type-detect": { "version": "4.0.8", @@ -11424,6 +9941,7 @@ "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" } @@ -11508,15 +10026,6 @@ "resolved": "https://registry.npmjs.org/vlq/-/vlq-2.0.4.tgz", "integrity": "sha512-aodjPa2wPQFkra1G8CzJBTHXhgk3EVSwxSWXNPr1fgdFLUb8kvLV1iEb6rFgasIsjP82HWI6dsb5Io26DDnasA==" }, - "node_modules/vue-template-compiler": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", - "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -11622,7 +10131,8 @@ "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==" + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "devOptional": true }, "node_modules/write-file-atomic": { "version": "4.0.2", @@ -11661,6 +10171,7 @@ "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" @@ -11670,6 +10181,7 @@ "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" } @@ -11678,6 +10190,7 @@ "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" } @@ -11697,20 +10210,20 @@ "dev": true }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { @@ -11736,12 +10249,16 @@ "node": ">=10" } }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "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==", + "dev": true, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/yn": { @@ -11768,12 +10285,14 @@ "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==" + "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" } @@ -11790,11 +10309,11 @@ "@types/node-fetch": "^2.6.11", "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "@wormhole-foundation/sdk-base": "^0.7.0-beta.3", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.3", - "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", - "@wormhole-foundation/sdk-solana": "^0.7.0-beta.3", - "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-evm": "0.7.0-beta.4", + "@wormhole-foundation/sdk-solana": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.4", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", "chai-as-promised": "^7.1.1", "ts-results": "^3.3.0", @@ -11814,60 +10333,6 @@ "tsx": "^4.7.2" } }, - "solana/node_modules/@coral-xyz/anchor": { - "version": "0.30.0", - "license": "(MIT OR Apache-2.0)", - "dependencies": { - "@coral-xyz/borsh": "^0.30.0", - "@noble/hashes": "^1.3.1", - "@solana/web3.js": "^1.68.0", - "bn.js": "^5.1.2", - "bs58": "^4.0.1", - "buffer-layout": "^1.2.2", - "camelcase": "^6.3.0", - "cross-fetch": "^3.1.5", - "crypto-hash": "^1.3.0", - "eventemitter3": "^4.0.7", - "pako": "^2.0.3", - "snake-case": "^3.0.4", - "superstruct": "^0.15.4", - "toml": "^3.0.0" - }, - "engines": { - "node": ">=11" - } - }, - "solana/node_modules/@coral-xyz/borsh": { - "version": "0.30.0", - "license": "Apache-2.0", - "dependencies": { - "bn.js": "^5.1.2", - "buffer-layout": "^1.2.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@solana/web3.js": "^1.68.0" - } - }, - "solana/node_modules/@solana/spl-token": { - "version": "0.4.6", - "license": "Apache-2.0", - "dependencies": { - "@solana/buffer-layout": "^4.0.0", - "@solana/buffer-layout-utils": "^0.2.0", - "@solana/spl-token-group": "^0.0.4", - "@solana/spl-token-metadata": "^0.1.4", - "buffer": "^6.0.3" - }, - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@solana/web3.js": "^1.91.6" - } - }, "solana/node_modules/prettier": { "version": "2.8.8", "dev": true, diff --git a/package.json b/package.json index 1151fc88..cf6ba1a8 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,6 @@ "generate": "npm run generate --workspaces --if-present", "test": "npm run test --workspaces --if-present" }, - "dependencies": { - "@wormhole-foundation/sdk": "^0.7.0-beta.3" - }, "devDependencies": { "typescript": "5.4.5", "@types/chai": "^4.3.5", diff --git a/solana/package.json b/solana/package.json index e68752c3..0184d5f1 100644 --- a/solana/package.json +++ b/solana/package.json @@ -25,11 +25,11 @@ "@types/node-fetch": "^2.6.11", "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "@wormhole-foundation/sdk-base": "^0.7.0-beta.3", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.3", - "@wormhole-foundation/sdk-evm": "0.7.0-beta.3", - "@wormhole-foundation/sdk-solana": "^0.7.0-beta.3", - "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.3", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-evm": "0.7.0-beta.4", + "@wormhole-foundation/sdk-solana": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.4", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", "chai-as-promised": "^7.1.1", "ts-results": "^3.3.0", diff --git a/solana/tsconfig.anchor-test.json b/solana/tsconfig.anchor-test.json index a7f8a03e..ff0605b2 100644 --- a/solana/tsconfig.anchor-test.json +++ b/solana/tsconfig.anchor-test.json @@ -3,7 +3,6 @@ "types": ["mocha", "chai", "node"], "typeRoots": ["./node_modules/@types"], "lib": ["es2020"], - "module": "CommonJs", "target": "es2020", "noEmit": true, "esModuleInterop": true From 4f34ffe61b1f709bc59bc048eeac1d2c2728aa61 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Tue, 21 May 2024 15:18:40 -0500 Subject: [PATCH 10/50] solana: make test quote more usable (#35) Co-authored-by: A5 Pickle --- solana/ts/scripts/testJupiterQuote.ts | 63 ++++++++++++++------------- 1 file changed, 33 insertions(+), 30 deletions(-) diff --git a/solana/ts/scripts/testJupiterQuote.ts b/solana/ts/scripts/testJupiterQuote.ts index 4c11a2de..ecf2104a 100644 --- a/solana/ts/scripts/testJupiterQuote.ts +++ b/solana/ts/scripts/testJupiterQuote.ts @@ -1,70 +1,73 @@ import { - InstructionFromJSON, - createJupiterApiClient, + InstructionToJSON, QuoteGetRequest, + SwapInfoToJSON, SwapInstructionsPostRequest, + SwapInstructionsResponseToJSON, + SwapRequestToJSON, + SwapResponseToJSON, + createJupiterApiClient, } from "@jup-ag/api"; -import * as splToken from "@solana/spl-token"; -import { PublicKey, TransactionInstruction } from "@solana/web3.js"; -import { execSync } from "child_process"; +import { PublicKey } from "@solana/web3.js"; -const USDC_MINT_ADDRESS = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); -const USDT_MINT_ADDRESS = new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"); +const mintKeys = { + usdc: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + usdt: "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB", + wsol: "So11111111111111111111111111111111111111112", + sol: "So11111111111111111111111111111111111111112", +} as const; const ALLOWED_DEXES = [ //"Lifinity V2", // use //"Meteora DLMM", // use - //"Orca V2", "Phoenix", // use - //"Raydium", //"Raydium CLMM", // use - //"Whirlpool", // use + // "Whirlpool", // use ]; -main(); +main(process.argv); + +async function main(argv: string[]) { + const [, , amountIn, inputMint, outputMint] = argv; + if (amountIn === undefined || inputMint === undefined || outputMint === undefined) { + console.error( + "Usage: yarn ts-node testJupiterQuote.ts ", + ); + process.exit(1); + } -async function main() { const jupiter = createJupiterApiClient({ basePath: "https://quote-api.jup.ag/v6", }); - const inputMint = splToken.NATIVE_MINT; - const outputMint = USDC_MINT_ADDRESS; - - const price = 145; - - const quoteRequest = { - inputMint: inputMint.toString(), - outputMint: outputMint.toString(), - amount: 50_000 * Math.floor(1_000_000_000 / price), + const quoteRequest: QuoteGetRequest = { + inputMint: mintKeys[inputMint] || new PublicKey(inputMint).toString(), + outputMint: mintKeys[outputMint] || new PublicKey(outputMint).toString(), + amount: Number(amountIn), slippageBps: 50, autoSlippage: false, computeAutoSlippage: false, onlyDirectRoutes: true, swapMode: "ExactIn", dexes: ALLOWED_DEXES, - } as QuoteGetRequest; + }; console.log({ quoteRequest }); const quoteResponse = await jupiter.quoteGet(quoteRequest); console.log({ quoteResponse }); - const swapLayerProgramId = new PublicKey("SwapLayer1111111111111111111111111111111111"); - const [swapAuthority] = PublicKey.findProgramAddressSync( - [Buffer.from("swap-authority")], - swapLayerProgramId, - ); + const swapAuthority = new PublicKey("Bro1111111111111111111111111111111111111111"); console.log("swap authority:", swapAuthority.toString()); - const swapInstructionRequest = { + const swapInstructionRequest: SwapInstructionsPostRequest = { swapRequest: { userPublicKey: swapAuthority.toString(), useSharedAccounts: true, quoteResponse, }, - } as SwapInstructionsPostRequest; + }; console.log({ swapInstructionRequest }); const swapInstructionResponse = await jupiter.swapInstructionsPost(swapInstructionRequest); - console.log({ swapInstructionResponse }); + console.log(JSON.stringify(swapInstructionResponse.swapInstruction, null, 2)); } From 96c4428f366d390422752a194165621e7cbe60ba Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Tue, 21 May 2024 16:46:28 -0500 Subject: [PATCH 11/50] solana: update outbound USDC tests (#36) * solana: add outbound USDC tests and replace initiate_transfer * solana: address feedback --------- Co-authored-by: gator-boi --- solana/programs/swap-layer/src/lib.rs | 11 +- .../swap-layer/src/processor/initiate/mod.rs | 3 - .../src/processor/initiate/transfer.rs | 13 +- .../swap-layer/src/processor/initiate/usdc.rs | 167 ---- solana/ts/src/swapLayer/index.ts | 64 +- solana/ts/tests/01__swapLayer.ts | 886 +++++++----------- 6 files changed, 386 insertions(+), 758 deletions(-) delete mode 100644 solana/programs/swap-layer/src/processor/initiate/usdc.rs diff --git a/solana/programs/swap-layer/src/lib.rs b/solana/programs/swap-layer/src/lib.rs index b0a2a783..8c3b3974 100644 --- a/solana/programs/swap-layer/src/lib.rs +++ b/solana/programs/swap-layer/src/lib.rs @@ -124,15 +124,8 @@ pub mod swap_layer { processor::stage_outbound(ctx, args) } - pub fn initiate_transfer( - ctx: Context, - args: InitiateTransferArgs, - ) -> Result<()> { - processor::initiate_transfer(ctx, args) - } - - pub fn initiate_transfer_new(ctx: Context) -> Result<()> { - processor::initiate_transfer_new(ctx) + pub fn initiate_transfer(ctx: Context) -> Result<()> { + processor::initiate_transfer(ctx) } pub fn initiate_swap_exact_in<'a, 'b, 'c, 'info>( diff --git a/solana/programs/swap-layer/src/processor/initiate/mod.rs b/solana/programs/swap-layer/src/processor/initiate/mod.rs index 89f99a70..5bcc710a 100644 --- a/solana/programs/swap-layer/src/processor/initiate/mod.rs +++ b/solana/programs/swap-layer/src/processor/initiate/mod.rs @@ -3,6 +3,3 @@ pub use swap::*; mod transfer; pub use transfer::*; - -mod usdc; -pub use usdc::*; diff --git a/solana/programs/swap-layer/src/processor/initiate/transfer.rs b/solana/programs/swap-layer/src/processor/initiate/transfer.rs index f2182be0..afae8bc8 100644 --- a/solana/programs/swap-layer/src/processor/initiate/transfer.rs +++ b/solana/programs/swap-layer/src/processor/initiate/transfer.rs @@ -12,7 +12,7 @@ use swap_layer_messages::{ }; #[derive(Accounts)] -pub struct InitiateTransferNew<'info> { +pub struct InitiateTransfer<'info> { #[account(mut)] payer: Signer<'info>, @@ -90,7 +90,7 @@ pub struct InitiateTransferNew<'info> { system_program: Program<'info, System>, } -pub fn initiate_transfer_new(ctx: Context) -> Result<()> { +pub fn initiate_transfer(ctx: Context) -> Result<()> { // We perform this operation first so we can have an immutable reference to the staged outbound // account. let staged_redeem = std::mem::take(&mut ctx.accounts.staged_outbound.staged_redeem); @@ -169,7 +169,14 @@ pub fn initiate_transfer_new(ctx: Context) -> Result<()> { token_program: token_program.to_account_info(), system_program: ctx.accounts.system_program.to_account_info(), }, - &[Custodian::SIGNER_SEEDS], + &[ + Custodian::SIGNER_SEEDS, + &[ + crate::PREPARED_ORDER_SEED_PREFIX, + staged_outbound.key().as_ref(), + &[ctx.bumps.prepared_order], + ], + ], ), token_router::PrepareMarketOrderArgs { amount_in: custody_token.amount, diff --git a/solana/programs/swap-layer/src/processor/initiate/usdc.rs b/solana/programs/swap-layer/src/processor/initiate/usdc.rs deleted file mode 100644 index e79f6d54..00000000 --- a/solana/programs/swap-layer/src/processor/initiate/usdc.rs +++ /dev/null @@ -1,167 +0,0 @@ -use crate::{ - composite::*, error::SwapLayerError, state::Peer, utils::relayer_fees::calculate_relayer_fee, -}; -use anchor_lang::prelude::*; -use anchor_spl::token; -use common::wormhole_io::{Readable, TypePrefixedPayload}; -use swap_layer_messages::{ - messages::SwapMessageV1, - types::{OutputToken, RedeemMode, Uint48}, -}; - -#[derive(Accounts)] -#[instruction(args: InitiateTransferArgs)] -pub struct InitiateTransfer<'info> { - #[account(mut)] - /// The payer of the transaction. This could either be the recipient or a relayer. - payer: Signer<'info>, - - #[account( - mut, - associated_token::mint = usdc, - associated_token::authority = payer - )] - payer_token: Box>, - - usdc: Usdc<'info>, - - #[account( - seeds = [ - Peer::SEED_PREFIX, - &args.target_chain.to_be_bytes(), - ], - bump - )] - peer: Box>, - - /// CHECK: Token router config. - token_router_custodian: UncheckedAccount<'info>, - - #[account( - mut, - constraint = { - require!(*prepared_order.key != payer.key(), SwapLayerError::InvalidPreparedOrder); - - true - } - )] - prepared_order: Signer<'info>, - - #[account(mut)] - /// CHECK: - prepared_custody_token: UncheckedAccount<'info>, - - token_router_program: Program<'info, token_router::program::TokenRouter>, - token_program: Program<'info, token::Token>, - system_program: Program<'info, System>, -} - -#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)] -pub struct RelayOptions { - pub gas_dropoff: u32, - pub max_relayer_fee: u64, -} - -/// Arguments for [prepare_market_order]. -#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)] -pub struct InitiateTransferArgs { - /// Amount of tokens to transfer. - pub amount_in: u64, - - /// The Wormhole chain ID of the network to transfer tokens to. - pub target_chain: u16, - - /// Optional relay options. If specified, the redeem mode will be set to Relay. - pub relay_options: Option, - - /// The recipient of the transfer. - pub recipient: [u8; 32], - - /// Encoded output token to be included in the redeem message. - pub encoded_output_token: Vec, - - // Optional payload to be included in the redeem message. If a payload - // is specified, the redeem mode will be set to Payload. - pub payload: Option>, -} - -pub fn initiate_transfer(ctx: Context, args: InitiateTransferArgs) -> Result<()> { - require!(args.recipient != [0; 32], SwapLayerError::InvalidRecipient); - - // Decode the output token to verify that it's valid. - let output_token = OutputToken::read(&mut &args.encoded_output_token[..]) - .map_err(|_| SwapLayerError::InvalidOutputToken)?; - - // Save this, we will need to account for the relayer fee. - let mut transfer_amount = args.amount_in; - - let swap_message = if args.relay_options.is_some() { - let relay_options = args.relay_options.unwrap(); - - // Relaying fee must be less than the user-specific maximum. - let relaying_fee = calculate_relayer_fee( - &ctx.accounts.peer.relay_params, - relay_options.gas_dropoff, - &output_token, - )?; - require!( - relaying_fee <= relay_options.max_relayer_fee, - SwapLayerError::ExceedsMaxRelayingFee - ); - - transfer_amount = transfer_amount.saturating_add(relaying_fee); - - SwapMessageV1 { - recipient: args.recipient, - redeem_mode: RedeemMode::Relay { - gas_dropoff: relay_options.gas_dropoff, - relaying_fee: Uint48::try_from(relaying_fee).unwrap(), - }, - output_token, - } - } else if args.payload.is_some() { - SwapMessageV1 { - recipient: args.recipient, - redeem_mode: RedeemMode::Payload(args.payload.unwrap()), - output_token, - } - } else { - SwapMessageV1 { - recipient: args.recipient, - redeem_mode: RedeemMode::Direct, - output_token, - } - }; - - token_router::cpi::prepare_market_order( - CpiContext::new( - ctx.accounts.token_router_program.to_account_info(), - token_router::cpi::accounts::PrepareMarketOrder { - payer: ctx.accounts.payer.to_account_info(), - custodian: token_router::cpi::accounts::CheckedCustodian { - custodian: ctx.accounts.token_router_custodian.to_account_info(), - }, - program_transfer_authority: None, - sender: Some(ctx.accounts.payer.to_account_info()), - prepared_order: ctx.accounts.prepared_order.to_account_info(), - sender_token: ctx.accounts.payer_token.to_account_info(), - refund_token: ctx.accounts.payer_token.to_account_info(), - prepared_custody_token: ctx.accounts.prepared_custody_token.to_account_info(), - usdc: token_router::cpi::accounts::Usdc { - mint: ctx.accounts.usdc.to_account_info(), - }, - token_program: ctx.accounts.token_program.to_account_info(), - system_program: ctx.accounts.system_program.to_account_info(), - }, - ), - token_router::PrepareMarketOrderArgs { - amount_in: transfer_amount, - min_amount_out: None, - target_chain: args.target_chain, - redeemer: ctx.accounts.peer.address, - redeemer_message: swap_message.to_vec(), - }, - )?; - - Ok(()) -} diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index d6f14637..9171b487 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -12,7 +12,7 @@ import { uint64ToBigInt, } from "@wormhole-foundation/example-liquidity-layer-solana/common"; import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; -import { ChainId } from "@wormhole-foundation/sdk-base"; +import { ChainId, toChain } from "@wormhole-foundation/sdk-base"; import { keccak256 } from "@wormhole-foundation/sdk-definitions"; import IDL from "../../../target/idl/swap_layer.json"; import { SwapLayer } from "../../../target/types/swap_layer"; @@ -216,6 +216,12 @@ export class SwapLayerProgram { return StagedInbound.address(this.ID, preparedFill); } + preparedOrderAddress(stagedOutbound: PublicKey) { + return PublicKey.findProgramAddressSync( + [Buffer.from("prepared-order"), stagedOutbound.toBuffer()], + this.ID, + )[0]; + } async fetchStagedInbound(addr: PublicKey): Promise { return this.program.account.stagedInbound.fetch(addr); } @@ -569,30 +575,56 @@ export class SwapLayerProgram { async initiateTransferIx( accounts: { payer: PublicKey; - preparedOrder: PublicKey; // Just generate a keypair - payerToken?: PublicKey; - peer?: PublicKey; + stagedOutbound: PublicKey; + preparedOrder?: PublicKey; + usdcRefundToken?: PublicKey; + stagedCustodyToken?: PublicKey; + preparedBy?: PublicKey; }, - args: InitiateTransferArgs, + opts: { + targetChain?: ChainId; + } = {}, ) { - let { payer, preparedOrder, payerToken, peer } = accounts; + let { + payer, + preparedOrder, + usdcRefundToken, + stagedOutbound, + stagedCustodyToken, + preparedBy, + } = accounts; - payerToken ??= splToken.getAssociatedTokenAddressSync(this.usdcMint, payer); - peer ??= this.peerAddress(args.targetChain as wormholeSdk.ChainId); + let { targetChain } = opts; + if ( + targetChain === undefined || + usdcRefundToken === undefined || + preparedBy === undefined + ) { + const { info } = await this.fetchStagedOutbound(stagedOutbound); + targetChain ??= info.targetChain as ChainId; + usdcRefundToken ??= info.usdcRefundToken; + preparedBy ??= info.preparedBy; + } - const tokenRouter = this.tokenRouterProgram(); + preparedOrder ??= this.preparedOrderAddress(stagedOutbound); + stagedCustodyToken ??= this.stagedCustodyTokenAddress(stagedOutbound); return this.program.methods - .initiateTransfer(args) + .initiateTransfer() .accounts({ payer, - payerToken, - usdc: this.usdcComposite(), - peer, - tokenRouterCustodian: tokenRouter.custodianAddress(), + custodian: this.checkedCustodianComposite(), + preparedBy, + stagedOutbound, + stagedCustodyToken, + usdcRefundToken, + targetPeer: this.registeredPeerComposite({ chain: targetChain }), + tokenRouterCustodian: this.tokenRouterProgram().custodianAddress(), preparedOrder, - preparedCustodyToken: tokenRouter.preparedCustodyTokenAddress(preparedOrder), - tokenRouterProgram: tokenRouter.ID, + preparedCustodyToken: + this.tokenRouterProgram().preparedCustodyTokenAddress(preparedOrder), + usdc: this.usdcComposite(), + tokenRouterProgram: this.tokenRouterProgram().ID, tokenProgram: splToken.TOKEN_PROGRAM_ID, systemProgram: SystemProgram.programId, }) diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__swapLayer.ts index 158577c2..d46b4c94 100644 --- a/solana/ts/tests/01__swapLayer.ts +++ b/solana/ts/tests/01__swapLayer.ts @@ -13,6 +13,7 @@ import { CctpTokenBurnMessage } from "@wormhole-foundation/example-liquidity-lay import { LiquidityLayerDeposit, LiquidityLayerMessage, + Uint64, uint64ToBN, } from "@wormhole-foundation/example-liquidity-layer-solana/common"; import { @@ -1343,8 +1344,92 @@ describe("Swap Layer", () => { ); }); - it.skip("Cannot Stage Outbound -- Relaying Disabled", async function () { - // TODO + it("Cannot Stage Outbound -- Relaying Disabled", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + // Update the relay parameters to disable relaying. + await updateRelayParamsForTest( + swapLayer, + foreignChain, + { + ...relayParamsForTest, + baseFee: U32_MAX, + }, + feeUpdater, + ); + + const amountIn = 690000n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, + outputToken: null, + }, + ); + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "RelayingDisabled", + ); + + // Set the relay parameters back to the original. + await updateRelayParamsForTest( + swapLayer, + foreignChain, + relayParamsForTest, + feeUpdater, + ); + }); + + it("Cannot Stage Outbound -- Invalid Gas Dropoff", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 6900000000n; + const gasDropoff = relayParamsForTest.maxGasDropoff + 1; + const maxRelayerFee = 9999999999999; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee } }, + outputToken: null, + }, + ); + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "InvalidGasDropoff", + ); }); it("Cannot Stage Outbound -- USDC In with Program Transfer Authority (Sender Token Required)", async function () { @@ -1537,7 +1622,7 @@ describe("Swap Layer", () => { describe("USDC Transfer (Relay)", function () { describe("Outbound", function () { - it("Cannot Initiate Transfer (Non-Existent Peer)", async function () { + it("Cannot Initiate Transfer (Invalid Prepared By)", async function () { const senderToken = splToken.getAssociatedTokenAddressSync( swapLayer.usdcMint, payer.publicKey, @@ -1548,563 +1633,236 @@ describe("Swap Layer", () => { senderToken, }); - const invalidChain = toChainId("Holesky"); - - const preparedOrder = PublicKey.findProgramAddressSync( - [Buffer.from("prepared-order"), stagedOutbound.toBuffer()], - swapLayer.ID, - )[0]; - - const ix = await swapLayer.program.methods - .initiateTransferNew() - .accounts({ + const ix = await swapLayer.initiateTransferIx( + { payer: payer.publicKey, - custodian: swapLayer.checkedCustodianComposite(), - preparedBy: payer.publicKey, + preparedOrder: swapLayer.preparedOrderAddress(stagedOutbound), stagedOutbound, stagedCustodyToken, - usdcRefundToken: senderToken, - targetPeer: swapLayer.registeredPeerComposite({ - chain: invalidChain, - }), - tokenRouterCustodian: tokenRouter.custodianAddress(), - preparedOrder, - preparedCustodyToken: - tokenRouter.preparedCustodyTokenAddress(preparedOrder), - usdc: swapLayer.usdcComposite(), - tokenRouterProgram: tokenRouter.ID, - tokenProgram: splToken.TOKEN_PROGRAM_ID, - systemProgram: SystemProgram.programId, - }) - .instruction(); - - await expectIxErr( - connection, - [ix], - [payer], - "peer. Error Code: AccountNotInitialized", + preparedBy: ownerAssistant.publicKey, // Invalid pubkey. + }, + { targetChain: foreignChain }, ); - }); - it.skip("Cannot Initiate Transfer (Peer Mismatch)", async function () { - // TODO + await expectIxErr(connection, [ix], [payer], "Error Code: ConstraintAddress"); }); - it("Cannot Initiate Transfer (Relaying Disabled)", async function () { - const amountIn = 6900000000n; - const gasDropoff = 100000; - const maxRelayerFee = 9999999999999; - - // Update the relay parameters to disable relaying. - await updateRelayParamsForTest( - swapLayer, - foreignChain, - { - ...relayParamsForTest, - baseFee: U32_MAX, - }, - feeUpdater, + it("Cannot Initiate Transfer (Invalid Refund Token)", async function () { + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, ); - const preparedOrder = Keypair.generate(); + const { stagedOutbound, stagedCustodyToken } = await stageOutboundForTest({ + payer: payer.publicKey, + senderToken, + }); - // Pass the payer key as the prepared order. const ix = await swapLayer.initiateTransferIx( { payer: payer.publicKey, - preparedOrder: preparedOrder.publicKey, - }, - { - amountIn: new BN(amountIn.toString()), - targetChain: foreignChain, - relayOptions: { - gasDropoff: gasDropoff, - maxRelayerFee: new BN(maxRelayerFee), - }, - recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), - payload: null, + preparedOrder: swapLayer.preparedOrderAddress(stagedOutbound), + stagedOutbound, + stagedCustodyToken, + usdcRefundToken: ownerAssistant.publicKey, // Invalid pubkey. }, + { targetChain: foreignChain }, ); - await expectIxErr(connection, [ix], [payer, preparedOrder], "RelayingDisabled"); - - // Set the relay parameters back to the original. - await updateRelayParamsForTest( - swapLayer, - foreignChain, - relayParamsForTest, - feeUpdater, - ); + await expectIxErr(connection, [ix], [payer], "Error Code: ConstraintAddress"); }); - it("Cannot Initiate Transfer (Invalid Gas Dropoff)", async function () { - const amountIn = 6900000000n; - const maxRelayerFee = 9999999999999; + it("Cannot Initiate Transfer (Non-Existent Peer)", async function () { + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); - // Set the gas dropoff to a value larger than the max. - const gasDropoff = relayParamsForTest.maxGasDropoff + 1; + const { stagedOutbound, stagedCustodyToken } = await stageOutboundForTest({ + payer: payer.publicKey, + senderToken, + }); - const preparedOrder = Keypair.generate(); + const invalidChain = toChainId("Holesky"); - // Pass the payer key as the prepared order. const ix = await swapLayer.initiateTransferIx( { payer: payer.publicKey, - preparedOrder: preparedOrder.publicKey, - }, - { - amountIn: new BN(amountIn.toString()), - targetChain: foreignChain, - relayOptions: { - gasDropoff: gasDropoff, - maxRelayerFee: new BN(maxRelayerFee), - }, - recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), - payload: null, + preparedOrder: swapLayer.preparedOrderAddress(stagedOutbound), + stagedOutbound, + stagedCustodyToken, }, + { targetChain: invalidChain }, ); await expectIxErr( connection, [ix], - [payer, preparedOrder], - "InvalidGasDropoff", + [payer], + "peer. Error Code: AccountNotInitialized", ); }); - it("Initiate Transfer With Gas Dropoff", async function () { - const amountIn = 6900000000n; - const gasDropoff = 100000; - const maxRelayerFee = 9999999999999; - const outputToken: OutputToken = { type: "Usdc" }; - - // Fetch peer data. - const peer = await swapLayer.fetchPeer(foreignChain); - - const expectedRelayerFee = calculateRelayerFee( - peer.relayParams, - denormalizeGasDropOff(gasDropoff), - outputToken, - ); - - // Balance check. - const payerToken = await splToken.getOrCreateAssociatedTokenAccount( - connection, - payer, - USDC_MINT_ADDRESS, + it("Cannot Initiate Transfer (Invalid Peer)", async function () { + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, payer.publicKey, ); - const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); - - const preparedOrder = Keypair.generate(); - const ix = await swapLayer.initiateTransferIx( - { - payer: payer.publicKey, - preparedOrder: preparedOrder.publicKey, - }, - { - amountIn: new BN(amountIn.toString()), - targetChain: foreignChain, - relayOptions: { - gasDropoff: gasDropoff, - maxRelayerFee: new BN(maxRelayerFee), - }, - recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken(outputToken)), - payload: null, - }, - ); - - await expectIxOk(connection, [ix], [payer, preparedOrder]); - - // Balance check. - const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - assert.equal(payerAfter, payerBefore - amountIn - expectedRelayerFee); - - // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder( - preparedOrder.publicKey, - ); - - const { - info: { preparedCustodyTokenBump }, - } = preparedOrderData; - - assert.deepEqual( - preparedOrderData, - new PreparedOrder( - { - orderSender: payer.publicKey, - preparedBy: payer.publicKey, - orderType: { - market: { - minAmountOut: null, - }, - }, - srcToken: payerToken.address, - refundToken: payerToken.address, - targetChain: foreignChain, - redeemer: foreignSwapLayerAddress, - preparedCustodyTokenBump, - }, - Buffer.from( - encodeSwapLayerMessage({ - recipient: new UniversalAddress( - Uint8Array.from(foreignRecipientAddress), - ), - redeemMode: { - mode: "Relay", - gasDropoff, - relayingFee: expectedRelayerFee, - }, - outputToken, - }), - ), - ), - ); - - // Verify the prepared custody token balance. - const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( - connection, - tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), - ); - assert.equal(preparedCustodyTokenBalance, amountIn + expectedRelayerFee); - }); - - it("Initiate Transfer Without Gas Dropoff", async function () { - const amountIn = 6900000000n; - const gasDropoff = 0; - const maxRelayerFee = 9999999999999; - const outputToken: OutputToken = { type: "Usdc" }; - - // Fetch peer data. - const peer = await swapLayer.fetchPeer(foreignChain); + // Prepare the staged outbound with the foreignChain. + const { stagedOutbound, stagedCustodyToken } = await stageOutboundForTest({ + payer: payer.publicKey, + senderToken, + }); - const expectedRelayerFee = calculateRelayerFee( - peer.relayParams, - denormalizeGasDropOff(gasDropoff), - outputToken, - ); + const holeskyChain = toChainId("Holesky"); - // Balance check. - const payerToken = await splToken.getOrCreateAssociatedTokenAccount( - connection, - payer, - USDC_MINT_ADDRESS, - payer.publicKey, - ); - const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); - - const preparedOrder = Keypair.generate(); + // Need to register a peer for holesky to trigger the invalid peer error. + await addPeerForTest(swapLayer, owner, { + chain: holeskyChain, + address: foreignSwapLayerAddress, + relayParams: relayParamsForTest, + }); const ix = await swapLayer.initiateTransferIx( { payer: payer.publicKey, - preparedOrder: preparedOrder.publicKey, - }, - { - amountIn: new BN(amountIn.toString()), - targetChain: foreignChain, - relayOptions: { - gasDropoff: gasDropoff, - maxRelayerFee: new BN(maxRelayerFee), - }, - recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken(outputToken)), - payload: null, + preparedOrder: swapLayer.preparedOrderAddress(stagedOutbound), + stagedOutbound, + stagedCustodyToken, }, + { targetChain: holeskyChain }, ); - await expectIxOk(connection, [ix], [payer, preparedOrder]); - - // Balance check. - const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - assert.equal(payerAfter, payerBefore - amountIn - expectedRelayerFee); - - // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder( - preparedOrder.publicKey, - ); - - const { - info: { preparedCustodyTokenBump }, - } = preparedOrderData; - - assert.deepEqual( - preparedOrderData, - new PreparedOrder( - { - orderSender: payer.publicKey, - preparedBy: payer.publicKey, - orderType: { - market: { - minAmountOut: null, - }, - }, - srcToken: payerToken.address, - refundToken: payerToken.address, - targetChain: foreignChain, - redeemer: foreignSwapLayerAddress, - preparedCustodyTokenBump, - }, - Buffer.from( - encodeSwapLayerMessage({ - recipient: new UniversalAddress( - Uint8Array.from(foreignRecipientAddress), - ), - redeemMode: { - mode: "Relay", - gasDropoff, - relayingFee: expectedRelayerFee, - }, - outputToken, - }), - ), - ), - ); - - // Verify the prepared custody token balance. - const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( - connection, - tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), - ); - assert.equal(preparedCustodyTokenBalance, amountIn + expectedRelayerFee); + await expectIxErr(connection, [ix], [payer], "InvalidPeer"); }); - it("Initiate Transfer With Gas Dropoff And Target Swap", async function () { - const amountIn = 6900000000n; - const gasDropoff = 100000; - const maxRelayerFee = 9999999999999; - const outputToken: OutputToken = { - type: "Gas", - swap: { - deadline: 0, - limitAmount: 0n, - type: { - id: "UniswapV3", - firstPoolId: 500, - path: [ - { - address: "0x5991A2dF15A8F6A256D3Ec51E99254Cd3fb576A9", - poolId: 500, - }, - ], - }, - }, - }; - - // Fetch peer data. - const peer = await swapLayer.fetchPeer(foreignChain); - - const expectedRelayerFee = calculateRelayerFee( - peer.relayParams, - denormalizeGasDropOff(gasDropoff), - outputToken, - ); - - // Balance check. - const payerToken = await splToken.getOrCreateAssociatedTokenAccount( - connection, - payer, - USDC_MINT_ADDRESS, - payer.publicKey, - ); - const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); - - const preparedOrder = Keypair.generate(); - - const ix = await swapLayer.initiateTransferIx( - { - payer: payer.publicKey, - preparedOrder: preparedOrder.publicKey, - }, - { - amountIn: new BN(amountIn.toString()), - targetChain: foreignChain, - relayOptions: { - gasDropoff: gasDropoff, - maxRelayerFee: new BN(maxRelayerFee), - }, - recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken(outputToken)), - payload: null, - }, - ); - - await expectIxOk(connection, [ix], [payer, preparedOrder]); - - // Balance check. - const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - assert.equal(payerAfter, payerBefore - amountIn - expectedRelayerFee); - - // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder( - preparedOrder.publicKey, - ); - - const { - info: { preparedCustodyTokenBump }, - } = preparedOrderData; + for (const gasDropoff of [0, 500000]) { + for (const isSwap of [true, false]) { + it(`Initiate Transfer ${gasDropoff > 0 ? "With" : "Without"} Gas Dropoff (${ + isSwap ? "With" : "Without" + } Swap)`, async function () { + const amountIn = 6900000000n; + const maxRelayerFee = 9999999999999; + const outputToken: OutputToken = isSwap + ? { type: "Usdc" } + : { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [ + { + address: + "0x5991A2dF15A8F6A256D3Ec51E99254Cd3fb576A9", + poolId: 500, + }, + ], + }, + }, + }; + + // Fetch peer data. + const peer = await swapLayer.fetchPeer(foreignChain); + + const expectedRelayerFee = calculateRelayerFee( + peer.relayParams, + denormalizeGasDropOff(gasDropoff), + outputToken, + ); + + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); - assert.deepEqual( - preparedOrderData, - new PreparedOrder( - { - orderSender: payer.publicKey, - preparedBy: payer.publicKey, - orderType: { - market: { - minAmountOut: null, - }, - }, - srcToken: payerToken.address, - refundToken: payerToken.address, - targetChain: foreignChain, - redeemer: foreignSwapLayerAddress, - preparedCustodyTokenBump, - }, - Buffer.from( - encodeSwapLayerMessage({ - recipient: new UniversalAddress( - Uint8Array.from(foreignRecipientAddress), - ), - redeemMode: { - mode: "Relay", - gasDropoff, - relayingFee: expectedRelayerFee, + const { stagedOutbound, stagedCustodyToken } = + await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken, }, - outputToken, - }), - ), - ), - ); - - // Verify the prepared custody token balance. - const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( - connection, - tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), - ); - assert.equal(preparedCustodyTokenBalance, amountIn + expectedRelayerFee); - }); - - it("Initiate Transfer Without Gas Dropoff And Target Swap", async function () { - const amountIn = 6900000000n; - const gasDropoff = 0; - const maxRelayerFee = 9999999999999; - const outputToken: OutputToken = { - type: "Gas", - swap: { - deadline: 0, - limitAmount: 0n, - type: { - id: "UniswapV3", - firstPoolId: 500, - path: [ { - address: "0x5991A2dF15A8F6A256D3Ec51E99254Cd3fb576A9", - poolId: 500, + amountIn, + redeemOption: { + relay: { + gasDropoff, + maxRelayerFee: new BN(maxRelayerFee), + }, + }, + outputToken, }, - ], - }, - }, - }; - - // Fetch peer data. - const peer = await swapLayer.fetchPeer(foreignChain); - - const expectedRelayerFee = calculateRelayerFee( - peer.relayParams, - denormalizeGasDropOff(gasDropoff), - outputToken, - ); + ); - // Balance check. - const payerToken = await splToken.getOrCreateAssociatedTokenAccount( - connection, - payer, - USDC_MINT_ADDRESS, - payer.publicKey, - ); - const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); - const preparedOrder = Keypair.generate(); + const ix = await swapLayer.initiateTransferIx({ + payer: payer.publicKey, + preparedOrder, + stagedOutbound, + stagedCustodyToken, + }); - const ix = await swapLayer.initiateTransferIx( - { - payer: payer.publicKey, - preparedOrder: preparedOrder.publicKey, - }, - { - amountIn: new BN(amountIn.toString()), - targetChain: foreignChain, - relayOptions: { - gasDropoff: gasDropoff, - maxRelayerFee: new BN(maxRelayerFee), - }, - recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken(outputToken)), - payload: null, - }, - ); + await expectIxOk(connection, [ix], [payer]); - await expectIxOk(connection, [ix], [payer, preparedOrder]); + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder( + preparedOrder, + ); - // Balance check. - const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - assert.equal(payerAfter, payerBefore - amountIn - expectedRelayerFee); + const { + info: { preparedCustodyTokenBump }, + } = preparedOrderData; - // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder( - preparedOrder.publicKey, - ); - - const { - info: { preparedCustodyTokenBump }, - } = preparedOrderData; - - assert.deepEqual( - preparedOrderData, - new PreparedOrder( - { - orderSender: payer.publicKey, - preparedBy: payer.publicKey, - orderType: { - market: { - minAmountOut: null, + assert.deepEqual( + preparedOrderData, + new PreparedOrder( + { + orderSender: swapLayer.custodianAddress(), + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, + }, + srcToken: stagedCustodyToken, + refundToken: senderToken, + targetChain: foreignChain, + redeemer: foreignSwapLayerAddress, + preparedCustodyTokenBump, }, - }, - srcToken: payerToken.address, - refundToken: payerToken.address, - targetChain: foreignChain, - redeemer: foreignSwapLayerAddress, - preparedCustodyTokenBump, - }, - Buffer.from( - encodeSwapLayerMessage({ - recipient: new UniversalAddress( - Uint8Array.from(foreignRecipientAddress), + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + Uint8Array.from(foreignRecipientAddress), + ), + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee: expectedRelayerFee, + }, + outputToken, + }), ), - redeemMode: { - mode: "Relay", - gasDropoff, - relayingFee: expectedRelayerFee, - }, - outputToken, - }), - ), - ), - ); - - // Verify the prepared custody token balance. - const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( - connection, - tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), - ); - assert.equal(preparedCustodyTokenBalance, amountIn + expectedRelayerFee); - }); + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = + await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder), + ); + assert.equal( + preparedCustodyTokenBalance, + amountIn + expectedRelayerFee, + ); + }); + } + } }); describe("Inbound", function () { @@ -2536,43 +2294,38 @@ describe("Swap Layer", () => { describe("Outbound", function () { it("Initiate Transfer", async function () { const amountIn = 6900000000n; + const outputToken: OutputToken = { type: "Usdc" }; - // Balance check. - const payerToken = await splToken.getOrCreateAssociatedTokenAccount( - connection, - payer, - USDC_MINT_ADDRESS, + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, payer.publicKey, ); - const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); - - const preparedOrder = Keypair.generate(); - const ix = await swapLayer.initiateTransferIx( + const { stagedOutbound, stagedCustodyToken } = await stageOutboundForTest( { payer: payer.publicKey, - preparedOrder: preparedOrder.publicKey, + senderToken, }, { - amountIn: new BN(amountIn.toString()), - targetChain: foreignChain, - relayOptions: null, - recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), - payload: null, + amountIn, + redeemOption: null, + outputToken, }, ); - await expectIxOk(connection, [ix], [payer, preparedOrder]); + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); - // Balance check. - const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - assert.equal(payerAfter, payerBefore - amountIn); + const ix = await swapLayer.initiateTransferIx({ + payer: payer.publicKey, + preparedOrder, + stagedOutbound, + stagedCustodyToken, + }); + + await expectIxOk(connection, [ix], [payer]); // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder( - preparedOrder.publicKey, - ); + const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); const { info: { preparedCustodyTokenBump }, @@ -2582,15 +2335,15 @@ describe("Swap Layer", () => { preparedOrderData, new PreparedOrder( { - orderSender: payer.publicKey, + orderSender: swapLayer.custodianAddress(), preparedBy: payer.publicKey, orderType: { market: { minAmountOut: null, }, }, - srcToken: payerToken.address, - refundToken: payerToken.address, + srcToken: stagedCustodyToken, + refundToken: senderToken, targetChain: foreignChain, redeemer: foreignSwapLayerAddress, preparedCustodyTokenBump, @@ -2601,7 +2354,7 @@ describe("Swap Layer", () => { Uint8Array.from(foreignRecipientAddress), ), redeemMode: { mode: "Direct" }, - outputToken: { type: "Usdc" }, + outputToken, }), ), ), @@ -2610,7 +2363,7 @@ describe("Swap Layer", () => { // Verify the prepared custody token balance. const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( connection, - tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), + tokenRouter.preparedCustodyTokenAddress(preparedOrder), ); assert.equal(preparedCustodyTokenBalance, amountIn); }); @@ -2879,44 +2632,39 @@ describe("Swap Layer", () => { describe("Outbound", function () { it("Initiate Transfer", async function () { const amountIn = 6900000000n; + const outputToken: OutputToken = { type: "Usdc" }; const payload = Buffer.from("Insert payload here"); - // Balance check. - const payerToken = await splToken.getOrCreateAssociatedTokenAccount( - connection, - payer, - USDC_MINT_ADDRESS, + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, payer.publicKey, ); - const payerBefore = await getUsdcAtaBalance(connection, payer.publicKey); - const preparedOrder = Keypair.generate(); - - const ix = await swapLayer.initiateTransferIx( + const { stagedOutbound, stagedCustodyToken } = await stageOutboundForTest( { payer: payer.publicKey, - preparedOrder: preparedOrder.publicKey, + senderToken, }, { - amountIn: new BN(amountIn.toString()), - targetChain: foreignChain, - relayOptions: null, - recipient: foreignRecipientAddress, - encodedOutputToken: Buffer.from(encodeOutputToken({ type: "Usdc" })), - payload, + amountIn, + redeemOption: { payload }, + outputToken, }, ); - await expectIxOk(connection, [ix], [payer, preparedOrder]); + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); - // Balance check. - const payerAfter = await getUsdcAtaBalance(connection, payer.publicKey); - assert.equal(payerAfter, payerBefore - amountIn); + const ix = await swapLayer.initiateTransferIx({ + payer: payer.publicKey, + preparedOrder, + stagedOutbound, + stagedCustodyToken, + }); + + await expectIxOk(connection, [ix], [payer]); // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder( - preparedOrder.publicKey, - ); + const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); const { info: { preparedCustodyTokenBump }, @@ -2926,15 +2674,15 @@ describe("Swap Layer", () => { preparedOrderData, new PreparedOrder( { - orderSender: payer.publicKey, + orderSender: swapLayer.custodianAddress(), preparedBy: payer.publicKey, orderType: { market: { minAmountOut: null, }, }, - srcToken: payerToken.address, - refundToken: payerToken.address, + srcToken: stagedCustodyToken, + refundToken: senderToken, targetChain: foreignChain, redeemer: foreignSwapLayerAddress, preparedCustodyTokenBump, @@ -2945,7 +2693,7 @@ describe("Swap Layer", () => { Uint8Array.from(foreignRecipientAddress), ), redeemMode: { mode: "Payload", payload }, - outputToken: { type: "Usdc" }, + outputToken, }), ), ), @@ -2954,7 +2702,7 @@ describe("Swap Layer", () => { // Verify the prepared custody token balance. const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( connection, - tokenRouter.preparedCustodyTokenAddress(preparedOrder.publicKey), + tokenRouter.preparedCustodyTokenAddress(preparedOrder), ); assert.equal(preparedCustodyTokenBalance, amountIn); }); @@ -3258,7 +3006,10 @@ describe("Swap Layer", () => { }, opts: { amountIn?: bigint; - redeemOption?: RedeemOption | null; + redeemOption?: + | { relay: { gasDropoff: number; maxRelayerFee: Uint64 } } + | { payload: Uint8Array | Buffer } + | null; outputToken?: OutputToken | null; } = {}, ) { @@ -3281,8 +3032,8 @@ describe("Swap Layer", () => { amountIn, targetChain: foreignChain, recipient: foreignRecipientAddress, - redeemOption: null, - outputToken: null, + redeemOption, + outputToken, }, ); assert.isNull(approveIx); @@ -3298,3 +3049,18 @@ describe("Swap Layer", () => { return { stagedOutbound, stagedCustodyToken, custodyBalance }; } }); + +async function addPeerForTest( + swapLayer: SwapLayerProgram, + ownerOrAssistant: Keypair, + addPeerArgs: AddPeerArgs, +) { + const ix = await swapLayer.addPeerIx( + { + ownerOrAssistant: ownerOrAssistant.publicKey, + }, + addPeerArgs, + ); + + await expectIxOk(swapLayer.program.provider.connection, [ix], [ownerOrAssistant]); +} From c59ae127be0c4d752777b30ed6796b86fcc880b8 Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Tue, 21 May 2024 22:51:41 -0500 Subject: [PATCH 12/50] solana: add tests for release and stage inbound (#37) Co-authored-by: gator-boi --- solana/ts/src/swapLayer/index.ts | 9 +- solana/ts/tests/01__swapLayer.ts | 506 +++++++++++++++++++++++-------- 2 files changed, 385 insertions(+), 130 deletions(-) diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 9171b487..c962bc8c 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -760,10 +760,13 @@ export class SwapLayerProgram { async releaseInboundIx(accounts: { stagedInbound: PublicKey; recipient: PublicKey; - dstToken: PublicKey; - beneficiary: PublicKey; + dstToken?: PublicKey; + beneficiary?: PublicKey; }): Promise { - const { stagedInbound, recipient, dstToken, beneficiary } = accounts; + let { stagedInbound, recipient, dstToken, beneficiary } = accounts; + + beneficiary ??= recipient; + dstToken ??= splToken.getAssociatedTokenAddressSync(this.usdcMint, recipient); return this.program.methods .releaseInbound() diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__swapLayer.ts index d46b4c94..f3063695 100644 --- a/solana/ts/tests/01__swapLayer.ts +++ b/solana/ts/tests/01__swapLayer.ts @@ -1718,7 +1718,7 @@ describe("Swap Layer", () => { const holeskyChain = toChainId("Holesky"); // Need to register a peer for holesky to trigger the invalid peer error. - await addPeerForTest(swapLayer, owner, { + await addPeerForTest(owner, { chain: holeskyChain, address: foreignSwapLayerAddress, relayParams: relayParamsForTest, @@ -2406,7 +2406,7 @@ describe("Swap Layer", () => { "00000000000000000000000000000000000000000000000000000000deadbeef", "hex", ), - ), // Invalid Address., + ), // Invalid Address wormholeSequence, encodeSwapLayerMessage({ recipient: new UniversalAddress( @@ -2709,142 +2709,340 @@ describe("Swap Layer", () => { }); describe("Inbound", function () { - const localVariables = {}; + const payload = Buffer.from("Insert payload here"); + const validSwapMessage = encodeSwapLayerMessage({ + recipient: new UniversalAddress(recipient.publicKey.toString(), "base58"), + redeemMode: { mode: "Payload", payload }, + outputToken: { type: "Usdc" }, + }); - it("Stage Inbound Transfer", async function () { - const payload = Buffer.from("Insert payload here"); + describe("Stage Inbound", function () { + it("Cannot Stage Inbound (Invalid Output Token)", async function () { + // Try to complete the swap with an invalid output token (include + // swap instructions). + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { + mode: "Payload", + payload: Buffer.from("Insert payload here"), + }, + outputToken: { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "JupiterV6", + dexProgramId: { isSome: false }, + }, + }, + }, + }), + ); + const { vaa } = result!; - const result = await createAndRedeemCctpFillForTest( - testCctpNonce++, - foreignChain, - foreignTokenRouterAddress, - foreignSwapLayerAddress, - wormholeSequence, - encodeSwapLayerMessage({ - recipient: new UniversalAddress( - recipient.publicKey.toString(), - "base58", - ), - redeemMode: { mode: "Payload", payload }, - outputToken: { type: "Usdc" }, - }), - ); - const { vaa, message } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); - const preparedFill = tokenRouter.preparedFillAddress(vaa); - const beneficiary = Keypair.generate(); + const transferIx = await swapLayer.completeTransferPayloadIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + }, + foreignChain, + ); - const transferIx = await swapLayer.completeTransferPayloadIx( - { - payer: payer.publicKey, - beneficiary: beneficiary.publicKey, - preparedFill, - }, - foreignChain, - ); + await expectIxErr(connection, [transferIx], [payer], "InvalidOutputToken"); + }); - await expectIxOk(connection, [transferIx], [payer]); + it("Cannot Stage Inbound (Invalid Swap Message)", async function () { + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + Buffer.from("invalid message"), + ); + const { vaa } = result!; - // Balance check. - const stagedInbound = swapLayer.stagedInboundAddress(preparedFill); - const stagedInboundTokenAddress = - swapLayer.stagedCustodyTokenAddress(stagedInbound); + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); - const { amount: balanceAfter } = await splToken.getAccount( - connection, - stagedInboundTokenAddress, - ); - assert.equal(balanceAfter, message.deposit!.message.amount); + const transferIx = await swapLayer.completeTransferPayloadIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + }, + foreignChain, + ); - // State check. - const stagedInboundData = await swapLayer.fetchStagedInbound(stagedInbound); - assert.deepEqual( - stagedInboundData, - new StagedInbound( + await expectIxErr(connection, [transferIx], [payer], "InvalidSwapMessage"); + }); + + it("Cannot Stage Inbound (Peer Doesn't Exist)", async function () { + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + validSwapMessage, + ); + const { vaa } = result!; + + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); + + const transferIx = await swapLayer.completeTransferPayloadIx( { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, preparedFill, - bump: stagedInboundData.seeds.bump, }, + toChainId("Optimism"), // Invalid chain. + ); + + await expectIxErr( + connection, + [transferIx], + [payer], + "AccountNotInitialized", + ); + }); + + it("Cannot Stage Inbound (Chain Mismatch)", async function () { + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + validSwapMessage, + ); + const { vaa } = result!; + + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); + + const transferIx = await swapLayer.completeTransferPayloadIx( { - stagedCustodyTokenBump: - stagedInboundData.info.stagedCustodyTokenBump, - stagedBy: payer.publicKey, - sourceChain: foreignChain, - recipient: recipient.publicKey, - isNative: false, + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, }, - payload, - ), - ); + toChainId("Holesky"), // Invalid chain. + ); - localVariables["stagedInbound"] = stagedInbound; - }); + await expectIxErr(connection, [transferIx], [payer], "InvalidPeer"); + }); - it("Release Inbound", async function () { - const stagedInbound = localVariables["stagedInbound"]; - const beneficiary = Keypair.generate(); - const dstTokenOwner = Keypair.generate(); + it("Cannot Stage Inbound (Invalid Peer)", async function () { + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + Array.from( + Buffer.alloc( + 32, + "00000000000000000000000000000000000000000000000000000000deadbeef", + "hex", + ), + ), // Invalid Address + wormholeSequence, + validSwapMessage, + ); + const { vaa } = result!; - const dstToken = splToken.getAssociatedTokenAddressSync( - USDC_MINT_ADDRESS, - dstTokenOwner.publicKey, - ); + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); - await expectIxOk( - connection, - [ - splToken.createAssociatedTokenAccountInstruction( - payer.publicKey, - dstToken, - dstTokenOwner.publicKey, - USDC_MINT_ADDRESS, - ), - ], - [payer], - ); + const transferIx = await swapLayer.completeTransferPayloadIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + }, + foreignChain, + ); - const expectedLamports = await connection - .getAccountInfo(stagedInbound) - .then((info) => info!.lamports); - const custodyToken = swapLayer.stagedCustodyTokenAddress(stagedInbound); - const { amount: stagedTokenBalance } = await splToken.getAccount( - connection, - custodyToken, - ); - const expectedCustodyTokenLamports = await connection - .getAccountInfo(custodyToken) - .then((info) => info!.lamports); + await expectIxErr(connection, [transferIx], [payer], "InvalidPeer"); + }); + + it("Cannot Stage Inbound (Invalid Redeem Mode)", async function () { + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { mode: "Direct" }, + outputToken: { type: "Usdc" }, + }), + ); + const { vaa } = result!; + + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); + + const transferIx = await swapLayer.completeTransferPayloadIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + }, + foreignChain, + ); - const consumeIx = await swapLayer.releaseInboundIx({ - recipient: recipient.publicKey, - beneficiary: beneficiary.publicKey, - stagedInbound, - dstToken: dstToken, + await expectIxErr(connection, [transferIx], [payer], "InvalidRedeemMode"); }); - await expectIxOk(connection, [consumeIx], [recipient]); + it("Stage Inbound", async function () { + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + validSwapMessage, + ); + const { vaa, message } = result!; - // Verify that accounts were closed. - { - const accInfo = await connection.getAccountInfo(stagedInbound); - assert.isNull(accInfo); - } - { - const accInfo = await connection.getAccountInfo(custodyToken); - assert.isNull(accInfo); - } + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); - const { amount: dstTokenBalance } = await splToken.getAccount( - connection, - dstToken, - ); - assert.equal(dstTokenBalance, stagedTokenBalance); + const transferIx = await swapLayer.completeTransferPayloadIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + }, + foreignChain, + ); + + await expectIxOk(connection, [transferIx], [payer]); + + // Balance check. + const stagedInbound = swapLayer.stagedInboundAddress(preparedFill); + const stagedInboundTokenAddress = + swapLayer.stagedCustodyTokenAddress(stagedInbound); + + const { amount: balanceAfter } = await splToken.getAccount( + connection, + stagedInboundTokenAddress, + ); + assert.equal(balanceAfter, message.deposit!.message.amount); + + // State check. + const stagedInboundData = await swapLayer.fetchStagedInbound(stagedInbound); + assert.deepEqual( + stagedInboundData, + new StagedInbound( + { + preparedFill, + bump: stagedInboundData.seeds.bump, + }, + { + stagedCustodyTokenBump: + stagedInboundData.info.stagedCustodyTokenBump, + stagedBy: payer.publicKey, + sourceChain: foreignChain, + recipient: recipient.publicKey, + isNative: false, + }, + payload, + ), + ); + }); + }); - const beneficiaryBalance = await connection.getBalance(beneficiary.publicKey); - assert.equal( - beneficiaryBalance, - expectedLamports + expectedCustodyTokenLamports, - ); + describe("Release Inbound", function () { + it("Cannot Release Inbound (Invalid Recipient)", async function () { + const { stagedInbound } = await stageInboundForTest(validSwapMessage, { + payer: payer.publicKey, + }); + + // Pass a different recipient than the one encoded in validSwapMessage. + const consumeIx = await swapLayer.releaseInboundIx({ + recipient: payer.publicKey, + stagedInbound, + }); + + await expectIxErr(connection, [consumeIx], [payer], "ConstraintAddress"); + }); + + it("Release Inbound", async function () { + const { stagedInbound, stagedInboundCustody } = await stageInboundForTest( + validSwapMessage, + { payer: payer.publicKey }, + ); + + const beneficiary = Keypair.generate(); + const dstToken = await createTokenAccountForTest(); + + // Balance check. + const expectedLamports = await connection + .getAccountInfo(stagedInbound) + .then((info) => info!.lamports); + const { amount: stagedTokenBalance } = await splToken.getAccount( + connection, + stagedInboundCustody, + ); + const expectedCustodyTokenLamports = await connection + .getAccountInfo(stagedInboundCustody) + .then((info) => info!.lamports); + + // Consume the staged inbound account. + const consumeIx = await swapLayer.releaseInboundIx({ + recipient: recipient.publicKey, + beneficiary: beneficiary.publicKey, + stagedInbound, + dstToken: dstToken, + }); + + await expectIxOk(connection, [consumeIx], [recipient]); + + // Verify that accounts were closed. + { + const accInfo = await connection.getAccountInfo(stagedInbound); + assert.isNull(accInfo); + } + { + const accInfo = await connection.getAccountInfo(stagedInboundCustody); + assert.isNull(accInfo); + } + + // Verify balance changes. + const { amount: dstTokenBalance } = await splToken.getAccount( + connection, + dstToken, + ); + assert.equal(dstTokenBalance, stagedTokenBalance); + + const beneficiaryBalance = await connection.getBalance( + beneficiary.publicKey, + ); + assert.equal( + beneficiaryBalance, + expectedLamports + expectedCustodyTokenLamports, + ); + }); }); }); }); @@ -3048,19 +3246,73 @@ describe("Swap Layer", () => { return { stagedOutbound, stagedCustodyToken, custodyBalance }; } -}); -async function addPeerForTest( - swapLayer: SwapLayerProgram, - ownerOrAssistant: Keypair, - addPeerArgs: AddPeerArgs, -) { - const ix = await swapLayer.addPeerIx( - { - ownerOrAssistant: ownerOrAssistant.publicKey, + async function stageInboundForTest( + validSwapMessage: Buffer | Uint8Array, + accounts: { + payer: PublicKey; + beneficiary?: PublicKey; }, - addPeerArgs, - ); + ) { + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + validSwapMessage, + ); + const { vaa } = result!; - await expectIxOk(swapLayer.program.provider.connection, [ix], [ownerOrAssistant]); -} + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferPayloadIx( + { + ...accounts, + preparedFill, + }, + foreignChain, + ); + + await expectIxOk(connection, [transferIx], [payer]); + + // Balance check. + const stagedInbound = swapLayer.stagedInboundAddress(preparedFill); + const stagedInboundCustody = swapLayer.stagedCustodyTokenAddress(stagedInbound); + + return { stagedInbound, stagedInboundCustody }; + } + + async function createTokenAccountForTest() { + const tokenOwner = Keypair.generate(); + const token = splToken.getAssociatedTokenAddressSync( + USDC_MINT_ADDRESS, + tokenOwner.publicKey, + ); + await expectIxOk( + connection, + [ + splToken.createAssociatedTokenAccountInstruction( + payer.publicKey, + token, + tokenOwner.publicKey, + USDC_MINT_ADDRESS, + ), + ], + [payer], + ); + + return token; + } + + async function addPeerForTest(ownerOrAssistant: Keypair, addPeerArgs: AddPeerArgs) { + const ix = await swapLayer.addPeerIx( + { + ownerOrAssistant: ownerOrAssistant.publicKey, + }, + addPeerArgs, + ); + + await expectIxOk(swapLayer.program.provider.connection, [ix], [ownerOrAssistant]); + } +}); From 5e8f76b3980f5d546a8c5d1f98dc2c6f85819d06 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Wed, 22 May 2024 12:09:14 -0500 Subject: [PATCH 13/50] solana: fix type (#39) Co-authored-by: A5 Pickle --- solana/ts/src/swapLayer/index.ts | 3 +-- solana/ts/src/swapLayer/state/StagedOutbound.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index c962bc8c..342eab18 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -12,7 +12,7 @@ import { uint64ToBigInt, } from "@wormhole-foundation/example-liquidity-layer-solana/common"; import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; -import { ChainId, toChain } from "@wormhole-foundation/sdk-base"; +import { ChainId } from "@wormhole-foundation/sdk-base"; import { keccak256 } from "@wormhole-foundation/sdk-definitions"; import IDL from "../../../target/idl/swap_layer.json"; import { SwapLayer } from "../../../target/types/swap_layer"; @@ -227,7 +227,6 @@ export class SwapLayerProgram { } async fetchStagedOutbound(addr: PublicKey): Promise { - // @ts-ignore: This works. return this.program.account.stagedOutbound.fetch(addr); } diff --git a/solana/ts/src/swapLayer/state/StagedOutbound.ts b/solana/ts/src/swapLayer/state/StagedOutbound.ts index d9f8bf99..d0105618 100644 --- a/solana/ts/src/swapLayer/state/StagedOutbound.ts +++ b/solana/ts/src/swapLayer/state/StagedOutbound.ts @@ -15,7 +15,7 @@ export type RedeemOption = export type StagedRedeem = | { direct: {} } | { relay: { gasDropoff: number; relayingFee: BN } } - | { payload: [Buffer] }; + | { payload: { 0: Buffer } }; export type StagedOutboundInfo = { custodyTokenBump: number; From eab7b39ddbab70e2d0a3d02423b243faf3904d9d Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Wed, 22 May 2024 12:41:34 -0500 Subject: [PATCH 14/50] solana: restructure staged outbound tests (#40) Co-authored-by: gator-boi --- solana/ts/tests/01__swapLayer.ts | 1134 ++++++++++++++++++------------ 1 file changed, 683 insertions(+), 451 deletions(-) diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__swapLayer.ts index f3063695..b483b806 100644 --- a/solana/ts/tests/01__swapLayer.ts +++ b/solana/ts/tests/01__swapLayer.ts @@ -1114,509 +1114,741 @@ describe("Swap Layer", () => { describe("Business Logic", function () { describe("Stage Outbound", function () { - const localVariables = new Map(); - - it("Cannot Stage Outbound -- Native SOL In, Direct USDC Out (Sender Required)", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; - - const amountIn = 690000n; - const [approveIx, ix] = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, - stagedOutbound, - usdcRefundToken: splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, - ), - sender: null, - }, - { - transferType: "native", - amountIn, - targetChain: foreignChain, - recipient: foreignRecipientAddress, - redeemOption: null, - outputToken: null, - }, - ); - assert.isNull(approveIx); - - await expectIxErr( - connection, - [ix], - [payer, stagedOutboundSigner], - "rror Code: SenderRequired", - ); - }); - - it("Stage Outbound -- Native SOL In, Direct USDC Out", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; + describe("Native", function () { + it("Cannot Stage Outbound (Sender Required)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; - const senderSigner = Keypair.generate(); - const sender = senderSigner.publicKey; - await expectIxOk( - connection, - [ - SystemProgram.transfer({ - fromPubkey: payer.publicKey, - toPubkey: sender, - lamports: LAMPORTS_PER_SOL, - }), - ], - [payer], - ); + const amountIn = 690000n; + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + stagedOutbound, + usdcRefundToken: splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ), + sender: null, + }, + { + transferType: "native", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNull(approveIx); - const amountIn = 690000n; - const usdcRefundToken = splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, - ); - const [approveIx, ix] = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, - stagedOutbound, - usdcRefundToken, - sender, - }, - { - transferType: "native", - amountIn, - targetChain: foreignChain, - recipient: foreignRecipientAddress, - redeemOption: null, - outputToken: null, - }, - ); - assert.isNull(approveIx); + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "rror Code: SenderRequired", + ); + }); - const balanceBefore = await connection.getBalance(sender).then(BigInt); - await expectIxOk(connection, [ix], [payer, stagedOutboundSigner, senderSigner]); + it("Stage Outbound USDC (Direct)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; - const balanceAfter = await connection.getBalance(sender).then(BigInt); - assert.equal(balanceBefore - balanceAfter, amountIn); + const senderSigner = Keypair.generate(); + const sender = senderSigner.publicKey; + await expectIxOk( + connection, + [ + SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: sender, + lamports: LAMPORTS_PER_SOL, + }), + ], + [payer], + ); - const stagedOutboundData = await swapLayer.fetchStagedOutbound(stagedOutbound); - const { info } = stagedOutboundData; - assert.deepEqual( - stagedOutboundData, - new StagedOutbound( + const amountIn = 690000n; + const usdcRefundToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [approveIx, ix] = await swapLayer.stageOutboundIx( { - custodyTokenBump: info.custodyTokenBump, - preparedBy: payer.publicKey, + payer: payer.publicKey, + stagedOutbound, + usdcRefundToken, sender, + }, + { + transferType: "native", + amountIn, targetChain: foreignChain, recipient: foreignRecipientAddress, - usdcRefundToken, + redeemOption: null, + outputToken: null, }, - { direct: {} }, - Buffer.alloc(1), - ), - ); - }); - - it("Stage Outbound -- USDC In, Direct USDC Out", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; - - const amountIn = 690000n; - const senderToken = splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, - ); - const [approveIx, ix] = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, - senderToken, - stagedOutbound, - usdcRefundToken: senderToken, - }, - { - transferType: "sender", - amountIn, - targetChain: foreignChain, - recipient: foreignRecipientAddress, - redeemOption: null, - outputToken: null, - }, - ); - assert.isNull(approveIx); - - const { amount: balanceBefore } = await splToken.getAccount( - connection, - senderToken, - ); - await expectIxOk(connection, [ix], [payer, stagedOutboundSigner]); + ); + assert.isNull(approveIx); - const { amount: balanceAfter } = await splToken.getAccount(connection, senderToken); - assert.equal(balanceBefore - balanceAfter, amountIn); + const balanceBefore = await connection.getBalance(sender).then(BigInt); + await expectIxOk(connection, [ix], [payer, stagedOutboundSigner, senderSigner]); - const stagedOutboundData = await swapLayer.fetchStagedOutbound(stagedOutbound); + const balanceAfter = await connection.getBalance(sender).then(BigInt); + assert.equal(balanceBefore - balanceAfter, amountIn); - // Save for later. - localVariables.set("ix", ix); - localVariables.set("stagedOutboundSigner", stagedOutboundSigner); + const stagedOutboundData = await swapLayer.fetchStagedOutbound(stagedOutbound); + const { info } = stagedOutboundData; + assert.deepEqual( + stagedOutboundData, + new StagedOutbound( + { + custodyTokenBump: info.custodyTokenBump, + preparedBy: payer.publicKey, + sender, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + usdcRefundToken, + }, + { direct: {} }, + Buffer.alloc(1), + ), + ); + }); }); - it("Cannot Stage Outbound with Existing Staged Outbound Account", async function () { - const ix = localVariables.get("ix") as TransactionInstruction; - assert.isTrue(localVariables.delete("ix")); - - const stagedOutboundSigner = localVariables.get("stagedOutboundSigner") as Keypair; - assert.isTrue(localVariables.delete("stagedOutboundSigner")); + describe("Program Transfer Authority", function () { + it("Cannot Stage Outbound (Sender Token Required)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; - await expectIxErr( - connection, - [ix], - [payer, stagedOutboundSigner], - `account Address { address: ${stagedOutboundSigner.publicKey.toString()}, base: None } already in use`, - ); - }); + const amountIn = 690000n; + const ixs = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken: null, + stagedOutbound, + usdcRefundToken: splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ), + }, + { + transferType: "programTransferAuthority", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNotNull(ixs[0]); - it("Cannot Stage Outbound -- Invalid Recipient", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; + await expectIxErr( + connection, + [ixs[1]], + [payer, stagedOutboundSigner], + "Error Code: SenderTokenRequired", + ); + }); - const amountIn = 690000n; - const gasDropoff = 42069; - const senderToken = splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, - ); - const [, ix] = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, - senderToken, - stagedOutbound, - usdcRefundToken: senderToken, - }, - { - transferType: "sender", - amountIn, - targetChain: foreignChain, - recipient: new Array(32).fill(0), - redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, - outputToken: null, - }, - ); + it("Stage Outbound USDC (Direct)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; - await expectIxErr( - connection, - [ix], - [payer, stagedOutboundSigner], - "Error Code: InvalidRecipient", - ); - }); + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const ixs = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "programTransferAuthority", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNotNull(ixs[0]); - it("Cannot Stage Outbound -- Exceeds Max Relayer Fee", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; + const { amount: balanceBefore } = await splToken.getAccount( + connection, + senderToken, + ); + await expectIxOk(connection, ixs, [payer, stagedOutboundSigner]); - const amountIn = 690000n; - const gasDropoff = 42069; - const senderToken = splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, - ); - const [, ix] = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, + const { amount: balanceAfter } = await splToken.getAccount( + connection, senderToken, - stagedOutbound, - usdcRefundToken: senderToken, - }, - { - transferType: "sender", - amountIn, - targetChain: foreignChain, - recipient: foreignRecipientAddress, - redeemOption: { relay: { gasDropoff, maxRelayerFee: 1n } }, - outputToken: null, - }, - ); + ); + assert.equal(balanceBefore - balanceAfter, amountIn); - await expectIxErr( - connection, - [ix], - [payer, stagedOutboundSigner], - "Error Code: ExceedsMaxRelayingFee", - ); - }); + const stagedOutboundData = await swapLayer.fetchStagedOutbound(stagedOutbound); + const { info } = stagedOutboundData; + assert.deepEqual( + stagedOutboundData, + new StagedOutbound( + { + custodyTokenBump: info.custodyTokenBump, + preparedBy: payer.publicKey, + sender: payer.publicKey, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + usdcRefundToken: senderToken, + }, + { direct: {} }, + Buffer.alloc(1), + ), + ); + }); - it("Cannot Stage Outbound -- Relaying Disabled", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; + it("Stage Outbound USDC (Payload)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; - // Update the relay parameters to disable relaying. - await updateRelayParamsForTest( - swapLayer, - foreignChain, - { - ...relayParamsForTest, - baseFee: U32_MAX, - }, - feeUpdater, - ); + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const ixs = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "programTransferAuthority", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { + payload: Buffer.from("All your base are belong to us."), + }, + outputToken: null, + }, + ); + assert.isNotNull(ixs[0]); - const amountIn = 690000n; - const gasDropoff = 42069; - const senderToken = splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, - ); - const [, ix] = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, + const { amount: balanceBefore } = await splToken.getAccount( + connection, senderToken, - stagedOutbound, - usdcRefundToken: senderToken, - }, - { - transferType: "sender", - amountIn, - targetChain: foreignChain, - recipient: foreignRecipientAddress, - redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, - outputToken: null, - }, - ); - await expectIxErr( - connection, - [ix], - [payer, stagedOutboundSigner], - "RelayingDisabled", - ); - - // Set the relay parameters back to the original. - await updateRelayParamsForTest( - swapLayer, - foreignChain, - relayParamsForTest, - feeUpdater, - ); - }); - - it("Cannot Stage Outbound -- Invalid Gas Dropoff", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; + ); + await expectIxOk(connection, ixs, [payer, stagedOutboundSigner]); - const amountIn = 6900000000n; - const gasDropoff = relayParamsForTest.maxGasDropoff + 1; - const maxRelayerFee = 9999999999999; - const senderToken = splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, - ); - const [, ix] = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, + const { amount: balanceAfter } = await splToken.getAccount( + connection, senderToken, - stagedOutbound, - usdcRefundToken: senderToken, - }, - { - transferType: "sender", - amountIn, - targetChain: foreignChain, - recipient: foreignRecipientAddress, - redeemOption: { relay: { gasDropoff, maxRelayerFee } }, - outputToken: null, - }, - ); - await expectIxErr( - connection, - [ix], - [payer, stagedOutboundSigner], - "InvalidGasDropoff", - ); - }); + ); + assert.equal(balanceBefore - balanceAfter, amountIn); - it("Cannot Stage Outbound -- USDC In with Program Transfer Authority (Sender Token Required)", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; + const stagedOutboundData = await swapLayer.fetchStagedOutbound(stagedOutbound); + const { info } = stagedOutboundData; - const amountIn = 690000n; - const ixs = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, - senderToken: null, - stagedOutbound, - usdcRefundToken: splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, + assert.deepEqual( + stagedOutboundData, + new StagedOutbound( + { + custodyTokenBump: info.custodyTokenBump, + preparedBy: payer.publicKey, + sender: payer.publicKey, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + usdcRefundToken: senderToken, + }, + { payload: { "0": Buffer.from("All your base are belong to us.") } }, + Buffer.alloc(1), ), - }, - { - transferType: "programTransferAuthority", - amountIn, - targetChain: foreignChain, - recipient: foreignRecipientAddress, - redeemOption: null, - outputToken: null, - }, - ); - assert.isNotNull(ixs[0]); + ); + }); + }); - await expectIxErr( - connection, - [ixs[1]], - [payer, stagedOutboundSigner], - "Error Code: SenderTokenRequired", - ); - }); + describe("Sender", function () { + it("Cannot Stage Outbound (Existing Staged Outbound Account)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; - it("Stage Outbound -- USDC In, Direct USDC Out with Program Transfer Authority", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNull(approveIx); - const amountIn = 690000n; - const senderToken = splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, - ); - const ixs = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, - senderToken, - stagedOutbound, - usdcRefundToken: senderToken, - }, - { - transferType: "programTransferAuthority", - amountIn, - targetChain: foreignChain, - recipient: foreignRecipientAddress, - redeemOption: null, - outputToken: null, - }, - ); - assert.isNotNull(ixs[0]); + await expectIxOk(connection, [ix], [payer, stagedOutboundSigner]); - const { amount: balanceBefore } = await splToken.getAccount( - connection, - senderToken, - ); - await expectIxOk(connection, ixs, [payer, stagedOutboundSigner]); + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + `account Address { address: ${stagedOutboundSigner.publicKey.toString()}, base: None } already in use`, + ); + }); - const { amount: balanceAfter } = await splToken.getAccount(connection, senderToken); - assert.equal(balanceBefore - balanceAfter, amountIn); - }); + it("Cannot Stage Outbound (Invalid Target Chain)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + const baseChain = toChainId("Base"); - it("Stage Outbound -- USDC In, Relay USDC Out", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; + // Register a new target chain. + await addPeerForTest(owner, { + chain: baseChain, + address: foreignSwapLayerAddress, + relayParams: relayParamsForTest, + }); - const amountIn = 690000n; - const gasDropoff = 42069; - const senderToken = splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, - ); - const [, ix] = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + peer: swapLayer.peerAddress(baseChain), + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNull(approveIx); + + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + `InvalidTargetChain`, + ); + }); + + it("Cannot Stage Outbound (Invalid Recipient)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 690000n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: new Array(32).fill(0), + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, + outputToken: null, + }, + ); + + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "Error Code: InvalidRecipient", + ); + }); + + it("Cannot Stage Outbound (Exceeds Max Relayer Fee)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 690000n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1n } }, + outputToken: null, + }, + ); + + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "Error Code: ExceedsMaxRelayingFee", + ); + }); + + it("Cannot Stage Outbound (Relaying Disabled)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + // Update the relay parameters to disable relaying. + await updateRelayParamsForTest( + swapLayer, + foreignChain, + { + ...relayParamsForTest, + baseFee: U32_MAX, + }, + feeUpdater, + ); + + const amountIn = 690000n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, + outputToken: null, + }, + ); + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "RelayingDisabled", + ); + + // Set the relay parameters back to the original. + await updateRelayParamsForTest( + swapLayer, + foreignChain, + relayParamsForTest, + feeUpdater, + ); + }); + + it("Cannot Stage Outbound (Invalid Gas Dropoff)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 6900000000n; + const gasDropoff = relayParamsForTest.maxGasDropoff + 1; + const maxRelayerFee = 9999999999999; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee } }, + outputToken: null, + }, + ); + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "InvalidGasDropoff", + ); + }); + + it("Cannot Stage Outbound (U64 Overflow)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 2n ** 64n - 1n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, + outputToken: null, + }, + ); + + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "Error Code: U64Overflow", + ); + }); + + it("Stage Outbound USDC (Relay)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 690000n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, + outputToken: null, + }, + ); + + const { amount: balanceBefore } = await splToken.getAccount( + connection, senderToken, - stagedOutbound, - usdcRefundToken: senderToken, - }, - { - transferType: "sender", - amountIn, - targetChain: foreignChain, - recipient: foreignRecipientAddress, - redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, - outputToken: null, - }, - ); + ); + await expectIxOk(connection, [ix], [payer, stagedOutboundSigner]); - const { amount: balanceBefore } = await splToken.getAccount( - connection, - senderToken, - ); - await expectIxOk(connection, [ix], [payer, stagedOutboundSigner]); + const { amount: balanceAfter } = await splToken.getAccount( + connection, + senderToken, + ); - const { amount: balanceAfter } = await splToken.getAccount(connection, senderToken); + const { relayParams } = await swapLayer.fetchPeer(foreignChain); + const expectedRelayerFee = calculateRelayerFee( + relayParams, + denormalizeGasDropOff(gasDropoff), + { type: "Usdc" }, + ); + assert.equal(balanceBefore - balanceAfter, amountIn + expectedRelayerFee); - const { relayParams } = await swapLayer.fetchPeer(foreignChain); - const expectedRelayerFee = calculateRelayerFee( - relayParams, - denormalizeGasDropOff(gasDropoff), - { type: "Usdc" }, - ); - assert.equal(balanceBefore - balanceAfter, amountIn + expectedRelayerFee); - }); + const stagedOutboundData = await swapLayer.fetchStagedOutbound(stagedOutbound); + const { info } = stagedOutboundData; + + assert.deepEqual( + stagedOutboundData, + new StagedOutbound( + { + custodyTokenBump: info.custodyTokenBump, + preparedBy: payer.publicKey, + sender: payer.publicKey, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + usdcRefundToken: senderToken, + }, + { + relay: { + gasDropoff: gasDropoff, + relayingFee: uint64ToBN(expectedRelayerFee), + }, + }, + Buffer.alloc(1), + ), + ); + }); - it("Cannot Stage Outbound -- USDC In, Relay USDC Out (U64 Overflow)", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; + it("Stage Outbound USDC (Direct)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; - const amountIn = 2n ** 64n - 1n; - const gasDropoff = 42069; - const senderToken = splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, - ); - const [, ix] = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNull(approveIx); + + const { amount: balanceBefore } = await splToken.getAccount( + connection, senderToken, - stagedOutbound, - usdcRefundToken: senderToken, - }, - { - transferType: "sender", - amountIn, - targetChain: foreignChain, - recipient: foreignRecipientAddress, - redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, - outputToken: null, - }, - ); + ); + await expectIxOk(connection, [ix], [payer, stagedOutboundSigner]); - await expectIxErr( - connection, - [ix], - [payer, stagedOutboundSigner], - "Error Code: U64Overflow", - ); - }); + const { amount: balanceAfter } = await splToken.getAccount( + connection, + senderToken, + ); + assert.equal(balanceBefore - balanceAfter, amountIn); - it("Stage Outbound -- USDC In, Payload USDC Out", async function () { - const stagedOutboundSigner = Keypair.generate(); - const stagedOutbound = stagedOutboundSigner.publicKey; + const stagedOutboundData = await swapLayer.fetchStagedOutbound(stagedOutbound); + const { info } = stagedOutboundData; + assert.deepEqual( + stagedOutboundData, + new StagedOutbound( + { + custodyTokenBump: info.custodyTokenBump, + preparedBy: payer.publicKey, + sender: payer.publicKey, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + usdcRefundToken: senderToken, + }, + { direct: {} }, + Buffer.alloc(1), + ), + ); + }); - const amountIn = 690000n; - const senderToken = splToken.getAssociatedTokenAddressSync( - swapLayer.usdcMint, - payer.publicKey, - ); - const ixs = await swapLayer.stageOutboundIx( - { - payer: payer.publicKey, + it("Stage Outbound Other (Direct)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 690000n; + const outputToken: OutputToken = { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [ + { + address: "0x5991A2dF15A8F6A256D3Ec51E99254Cd3fb576A9", + poolId: 500, + }, + ], + }, + }, + }; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken, + }, + ); + assert.isNull(approveIx); + + const { amount: balanceBefore } = await splToken.getAccount( + connection, senderToken, - stagedOutbound, - usdcRefundToken: senderToken, - }, - { - transferType: "programTransferAuthority", - amountIn, - targetChain: foreignChain, - recipient: foreignRecipientAddress, - redeemOption: { payload: Buffer.from("All your base are belong to us.") }, - outputToken: null, - }, - ); - assert.isNotNull(ixs[0]); + ); + await expectIxOk(connection, [ix], [payer, stagedOutboundSigner]); - const { amount: balanceBefore } = await splToken.getAccount( - connection, - senderToken, - ); - await expectIxOk(connection, ixs, [payer, stagedOutboundSigner]); + const { amount: balanceAfter } = await splToken.getAccount( + connection, + senderToken, + ); + assert.equal(balanceBefore - balanceAfter, amountIn); - const { amount: balanceAfter } = await splToken.getAccount(connection, senderToken); - assert.equal(balanceBefore - balanceAfter, amountIn); + const stagedOutboundData = await swapLayer.fetchStagedOutbound(stagedOutbound); + const { info } = stagedOutboundData; + assert.deepEqual( + stagedOutboundData, + new StagedOutbound( + { + custodyTokenBump: info.custodyTokenBump, + preparedBy: payer.publicKey, + sender: payer.publicKey, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + usdcRefundToken: senderToken, + }, + { direct: {} }, + Buffer.from(encodeOutputToken(outputToken)), + ), + ); + }); }); }); From e2df3eb3c8af9d67f53f42334f39403e0fc75e6d Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Wed, 22 May 2024 14:54:50 -0500 Subject: [PATCH 15/50] solana: initiate swap (exact in) (#41) * some clean-up * solana: initiate swap works * solana: add token interface for 2022 support * solana: add tests; reorganize * solana: more token interface * solana: remove console.log * solana: and another one --------- Co-authored-by: A5 Pickle --- solana/Anchor.toml | 7 +- .../programs/swap-layer/src/composite/mod.rs | 29 +- .../src/processor/complete/other/direct.rs | 170 +- .../src/processor/initiate/swap/exact_in.rs | 202 ++- .../src/processor/stage_outbound.rs | 25 +- .../swap-layer/src/state/staged/outbound.rs | 26 +- solana/ts/src/jupiterV6/index.ts | 21 +- solana/ts/src/swapLayer/index.ts | 168 +- solana/ts/tests/10__jupiterTest.ts | 992 ----------- solana/ts/tests/10__swap.ts | 1577 +++++++++++++++++ ...upiter_lut1.json => jupiter_v6_lut_1.json} | 0 .../accounts/jupiter/jupiter_v6_lut_2.json | 14 + solana/ts/tests/helpers/utils.ts | 5 + universal/rs/messages/src/types/mod.rs | 20 +- 14 files changed, 2027 insertions(+), 1229 deletions(-) delete mode 100644 solana/ts/tests/10__jupiterTest.ts create mode 100644 solana/ts/tests/10__swap.ts rename solana/ts/tests/accounts/jupiter/{jupiter_lut1.json => jupiter_v6_lut_1.json} (100%) create mode 100644 solana/ts/tests/accounts/jupiter/jupiter_v6_lut_2.json diff --git a/solana/Anchor.toml b/solana/Anchor.toml index 62b40e07..72b61306 100644 --- a/solana/Anchor.toml +++ b/solana/Anchor.toml @@ -197,7 +197,12 @@ filename = "ts/tests/accounts/jupiter/jupiter_usdt_custody_token.json" ### Jupiter V6 -- LUT #1 [[test.validator.account]] address = "GxS6FiQ3mNnAar9HGQ6mxP7t6FcwmHkU7peSeQDUHmpN" -filename = "ts/tests/accounts/jupiter/jupiter_lut1.json" +filename = "ts/tests/accounts/jupiter/jupiter_v6_lut_1.json" + +### Jupiter V6 -- LUT #1 +[[test.validator.account]] +address = "HsLPzBjqK3SUKQZwHdd2QHVc9cioPrsHNw9GcUDs7WL7" +filename = "ts/tests/accounts/jupiter/jupiter_v6_lut_2.json" ### Whirlpool Program [[test.genesis]] diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs index 4b2adebf..91b22627 100644 --- a/solana/programs/swap-layer/src/composite/mod.rs +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -4,12 +4,13 @@ use crate::{ error::SwapLayerError, state::{Custodian, Peer}, utils::{ + self, jupiter_v6::{self, cpi::SharedAccountsRouteArgs, JUPITER_V6_PROGRAM_ID}, AnchorInstructionData, }, }; use anchor_lang::prelude::*; -use anchor_spl::{associated_token, token}; +use anchor_spl::{associated_token, token, token_interface}; use common::{ admin::utils::{ assistant::{self, only_authorized}, @@ -345,16 +346,17 @@ pub struct CompleteSwap<'info> { associated_token::mint = dst_mint, associated_token::authority = authority )] - pub dst_swap_token: Box>, + pub dst_swap_token: Box>, /// This account must be verified as the source mint for the swap. pub usdc: Usdc<'info>, /// This account must be verified as the destination mint for the swap. #[account(constraint = usdc.key() != dst_mint.key() @ SwapLayerError::SameMint)] - pub dst_mint: Box>, + pub dst_mint: Box>, pub token_program: Program<'info, token::Token>, + pub dst_token_program: Interface<'info, token_interface::TokenInterface>, associated_token_program: Program<'info, associated_token::AssociatedToken>, system_program: Program<'info, System>, } @@ -398,7 +400,7 @@ impl<'info> CompleteSwap<'info> { ))?; token::close_account(CpiContext::new_with_signer( - self.token_program.to_account_info(), + self.dst_token_program.to_account_info(), token::CloseAccount { account: self.dst_swap_token.to_account_info(), destination, @@ -520,12 +522,15 @@ impl<'info> JupiterV6SharedAccountsRoute<'info> { Ok((accounts, args, cpi_account_infos.to_vec())) } - pub fn invoke_cpi( + pub fn swap_exact_in( &self, args: SharedAccountsRouteArgs, signer_seeds: &[&[u8]], cpi_remaining_accounts: Vec>, - ) -> Result<()> { + limit_amount: Option, + ) -> Result { + let limit_amount = limit_amount.unwrap_or(utils::jupiter_v6::compute_min_amount_out(&args)); + jupiter_v6::cpi::shared_accounts_route( CpiContext::new_with_signer( self.jupiter_v6_program.to_account_info(), @@ -548,6 +553,18 @@ impl<'info> JupiterV6SharedAccountsRoute<'info> { ) .with_remaining_accounts(cpi_remaining_accounts), args, + )?; + + // After the swap, we reload the destination token account to get the correct amount. + let amount_out = token::TokenAccount::try_deserialize_unchecked( + &mut &self.dst_custody_token.data.borrow()[..], ) + .map(|token| token.amount)?; + + // Rarely do I use the gte macro, but this is a good use case for it. I want to display the + // amounts if the limit amount is not met. + require_gte!(amount_out, limit_amount, SwapLayerError::SwapFailed); + + Ok(amount_out) } } diff --git a/solana/programs/swap-layer/src/processor/complete/other/direct.rs b/solana/programs/swap-layer/src/processor/complete/other/direct.rs index 6988ee8b..1ccd22ca 100644 --- a/solana/programs/swap-layer/src/processor/complete/other/direct.rs +++ b/solana/programs/swap-layer/src/processor/complete/other/direct.rs @@ -1,4 +1,4 @@ -use crate::{composite::*, error::SwapLayerError, utils}; +use crate::{composite::*, error::SwapLayerError}; use anchor_lang::prelude::*; use anchor_spl::{associated_token, token}; use swap_layer_messages::{ @@ -120,106 +120,90 @@ where &[ctx.bumps.complete_swap.authority], ]; - // Handle Jupiter V6 swap. - let limit_amount = { - let (shared_accounts_route, mut swap_args, cpi_remaining_accounts) = - JupiterV6SharedAccountsRoute::set_up(ctx.remaining_accounts, &ix_data[..])?; + let (shared_accounts_route, mut swap_args, cpi_remaining_accounts) = + JupiterV6SharedAccountsRoute::set_up(ctx.remaining_accounts, &ix_data[..])?; + + // Verify remaining accounts. + { + require_keys_eq!( + shared_accounts_route.transfer_authority.key(), + swap_authority.key(), + SwapLayerError::InvalidSwapAuthority + ); + require_keys_eq!( + shared_accounts_route.src_custody_token.key(), + ctx.accounts.complete_swap.src_swap_token.key(), + SwapLayerError::InvalidSourceSwapToken + ); + require_keys_eq!( + shared_accounts_route.dst_custody_token.key(), + ctx.accounts.complete_swap.dst_swap_token.key(), + SwapLayerError::InvalidDestinationSwapToken + ); + require_keys_eq!( + shared_accounts_route.src_mint.key(), + common::USDC_MINT, + SwapLayerError::InvalidSourceMint + ); + require_keys_eq!( + shared_accounts_route.dst_mint.key(), + ctx.accounts.complete_swap.dst_mint.key(), + SwapLayerError::InvalidDestinationMint + ); + } - // Verify remaining accounts. - { - require_keys_eq!( - shared_accounts_route.transfer_authority.key(), - swap_authority.key(), - SwapLayerError::InvalidSwapAuthority - ); - require_keys_eq!( - shared_accounts_route.src_custody_token.key(), - ctx.accounts.complete_swap.src_swap_token.key(), - SwapLayerError::InvalidSourceSwapToken - ); - require_keys_eq!( - shared_accounts_route.dst_custody_token.key(), - ctx.accounts.complete_swap.dst_swap_token.key(), - SwapLayerError::InvalidDestinationSwapToken + let limit_amount = match limit_and_params { + // If the limit amount is some value (meaning that the OutputToken is Gas or Other), we + // will override the instruction arguments with the limit amount and slippage == 0 bps. + // Otherwise we will compute the limit amount using the given swap args. + Some((limit_amount, swap_params)) => { + msg!( + "Override in_amount: {}, quoted_out_amount: {}, slippage_bps: {}", + swap_args.in_amount, + swap_args.quoted_out_amount, + swap_args.slippage_bps ); - require_keys_eq!( - shared_accounts_route.src_mint.key(), - common::USDC_MINT, - SwapLayerError::InvalidSourceMint - ); - require_keys_eq!( - shared_accounts_route.dst_mint.key(), - ctx.accounts.complete_swap.dst_mint.key(), - SwapLayerError::InvalidDestinationMint - ); - } - - let limit_amount = match limit_and_params { - // If the limit amount is some value (meaning that the OutputToken is Gas or Other), we - // will override the instruction arguments with the limit amount and slippage == 0 bps. - // Otherwise we will compute the limit amount using the given swap args. - Some((limit_amount, swap_params)) => { - msg!( - "Override in_amount: {}, quoted_out_amount: {}, slippage_bps: {}", - swap_args.in_amount, - swap_args.quoted_out_amount, - swap_args.slippage_bps - ); - swap_args.in_amount = in_amount; - swap_args.quoted_out_amount = limit_amount; - swap_args.slippage_bps = 0; - - // Peek into the head of remaining accounts. This account will be the dex program that Jupiter - // V6 interacts with. If the swap params specify a specific dex program, we need to ensure that - // the one passed into this instruction handler is that. - if let Some(dex_program_id) = swap_params.dex_program_id { - require_eq!( - swap_args.route_plan.len(), - 1, - SwapLayerError::NotJupiterV6DirectRoute - ); - require_keys_eq!( - cpi_remaining_accounts[0].key(), - Pubkey::from(dex_program_id), - SwapLayerError::JupiterV6DexProgramMismatch - ); - } - - limit_amount - } - None => { - // Fetched swap args should have the same in amount as the prepared (fast) fill. + swap_args.in_amount = in_amount; + swap_args.quoted_out_amount = limit_amount; + swap_args.slippage_bps = 0; + + // Peek into the head of remaining accounts. This account will be the dex program that Jupiter + // V6 interacts with. If the swap params specify a specific dex program, we need to ensure that + // the one passed into this instruction handler is that. + if let Some(dex_program_id) = swap_params.dex_program_id { require_eq!( - swap_args.in_amount, - in_amount, - SwapLayerError::InvalidSwapInAmount + swap_args.route_plan.len(), + 1, + SwapLayerError::NotJupiterV6DirectRoute + ); + require_keys_eq!( + cpi_remaining_accounts[0].key(), + Pubkey::from(dex_program_id), + SwapLayerError::JupiterV6DexProgramMismatch ); - - utils::jupiter_v6::compute_min_amount_out(&swap_args) } - }; - // Execute swap. - shared_accounts_route.invoke_cpi( - swap_args, - swap_authority_seeds, - cpi_remaining_accounts, - )?; + limit_amount.into() + } + None => { + // Fetched swap args should have the same in amount as the prepared (fast) fill. + require_eq!( + swap_args.in_amount, + in_amount, + SwapLayerError::InvalidSwapInAmount + ); - limit_amount + None + } }; - // After the swap, we reload the destination token account to get the correct amount. - ctx.accounts.complete_swap.dst_swap_token.reload()?; - let dst_swap_token = &ctx.accounts.complete_swap.dst_swap_token; - - // Rarely do I use the gte macro, but this is a good use case for it. I want to display the - // amounts if the limit amount is not met. - require_gte!( - dst_swap_token.amount, + // Execute swap. + let amount_out = shared_accounts_route.swap_exact_in( + swap_args, + swap_authority_seeds, + cpi_remaining_accounts, limit_amount, - SwapLayerError::SwapFailed - ); + )?; let recipient = &ctx.accounts.recipient; @@ -243,13 +227,13 @@ where CpiContext::new_with_signer( ctx.accounts.complete_swap.token_program.to_account_info(), token::Transfer { - from: dst_swap_token.to_account_info(), + from: ctx.accounts.complete_swap.dst_swap_token.to_account_info(), to: ctx.accounts.recipient_token.to_account_info(), authority: swap_authority.to_account_info(), }, &[swap_authority_seeds], ), - dst_swap_token.amount, + amount_out, )?; } diff --git a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs index 4ef874f7..522cabdf 100644 --- a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs +++ b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs @@ -1,16 +1,12 @@ use crate::{ composite::*, error::SwapLayerError, - state::{Custodian, Peer, StagedOutbound, StagedRedeem}, - utils, + state::{Custodian, Peer, StagedOutbound}, + PREPARED_ORDER_SEED_PREFIX, }; use anchor_lang::prelude::*; -use anchor_spl::{associated_token, token}; -use common::wormhole_io::{Readable, TypePrefixedPayload}; -use swap_layer_messages::{ - messages::SwapMessageV1, - types::{OutputToken, RedeemMode, Uint48}, -}; +use anchor_spl::{associated_token, token, token_interface}; +use common::wormhole_io::TypePrefixedPayload; #[derive(Accounts)] pub struct InitiateSwapExactIn<'info> { @@ -45,7 +41,7 @@ pub struct InitiateSwapExactIn<'info> { ], bump = staged_outbound.info.custody_token_bump, )] - staged_custody_token: Account<'info, token::TokenAccount>, + staged_custody_token: Box>, /// CHECK: This account must equal the usdc refund token encoded in the staged outbound account. #[account(address = staged_outbound.usdc_refund_token)] @@ -65,14 +61,25 @@ pub struct InitiateSwapExactIn<'info> { )] target_peer: RegisteredPeer<'info>, - /// CHECK: Seeds must be \["swap-authority", staged_outbound.key()\]. + /// CHECK: Mutable, seeds must be \["prepared-order", staged_outbound.key()\] #[account( + mut, seeds = [ - crate::SWAP_AUTHORITY_SEED_PREFIX, + PREPARED_ORDER_SEED_PREFIX, staged_outbound.key().as_ref(), ], bump, )] + prepared_order: UncheckedAccount<'info>, + + /// CHECK: Seeds must be \["swap-authority", prepared_order.key()\]. + #[account( + seeds = [ + crate::SWAP_AUTHORITY_SEED_PREFIX, + prepared_order.key().as_ref(), + ], + bump, + )] swap_authority: UncheckedAccount<'info>, /// Temporary swap token account to receive source mint from the staged custody token. This @@ -83,7 +90,7 @@ pub struct InitiateSwapExactIn<'info> { associated_token::mint = src_mint, associated_token::authority = swap_authority )] - src_swap_token: Box>, + src_swap_token: Box>, /// Temporary swap token account to receive destination mint after the swap. This account will /// be closed at the end of this instruction. @@ -97,7 +104,7 @@ pub struct InitiateSwapExactIn<'info> { /// This account must be verified as the source mint for the swap. #[account(address = staged_custody_token.mint)] - src_mint: Box>, + src_mint: Box>, /// This account must be verified as the destination mint for the swap. #[account(constraint = src_mint.key() != usdc.key() @ SwapLayerError::SameMint)] @@ -106,23 +113,13 @@ pub struct InitiateSwapExactIn<'info> { /// CHECK: Token router config. token_router_custodian: UncheckedAccount<'info>, - /// CHECK: Mutable, seeds must be \["prepared-order", staged_outbound.key()\] - #[account( - mut, - seeds = [ - crate::PREPARED_ORDER_SEED_PREFIX, - staged_outbound.key().as_ref(), - ], - bump, - )] - prepared_order: UncheckedAccount<'info>, - /// CHECK: Mutable, seeds must be \["prepared-custody", prepared_order.key()\] #[account(mut)] prepared_custody_token: UncheckedAccount<'info>, token_router_program: Program<'info, token_router::program::TokenRouter>, associated_token_program: Program<'info, associated_token::AssociatedToken>, + src_token_program: Interface<'info, token_interface::TokenInterface>, token_program: Program<'info, token::Token>, system_program: Program<'info, System>, } @@ -134,6 +131,42 @@ pub fn initiate_swap_exact_in<'a, 'b, 'c, 'info>( where 'c: 'info, { + let src_token_program = &ctx.accounts.src_token_program; + let custody_token = &ctx.accounts.staged_custody_token; + + let peer = &ctx.accounts.target_peer; + let peer_signer_seeds = &[ + Peer::SEED_PREFIX, + &peer.seeds.chain.to_be_bytes(), + &[peer.seeds.bump], + ]; + + let src_mint = &ctx.accounts.src_mint; + token_interface::transfer_checked( + CpiContext::new_with_signer( + src_token_program.to_account_info(), + token_interface::TransferChecked { + from: custody_token.to_account_info(), + to: ctx.accounts.src_swap_token.to_account_info(), + authority: peer.to_account_info(), + mint: src_mint.to_account_info(), + }, + &[peer_signer_seeds], + ), + custody_token.amount, + src_mint.decimals, + )?; + + token_interface::close_account(CpiContext::new_with_signer( + src_token_program.to_account_info(), + token_interface::CloseAccount { + account: custody_token.to_account_info(), + destination: ctx.accounts.prepared_by.to_account_info(), + authority: peer.to_account_info(), + }, + &[peer_signer_seeds], + ))?; + let (shared_accounts_route, swap_args, cpi_remaining_accounts) = JupiterV6SharedAccountsRoute::set_up(ctx.remaining_accounts, &instruction_data[..])?; @@ -168,89 +201,66 @@ where ); } - // We perform this operation first so we can have an immutable reference to the staged outbound - // account. - let staged_redeem = std::mem::take(&mut ctx.accounts.staged_outbound.staged_redeem); + let redeemer_message = ctx + .accounts + .staged_outbound + .to_swap_message_v1() + .map(|msg| msg.to_vec())?; + let staged_outbound = &ctx.accounts.staged_outbound; + let prepared_order = &ctx.accounts.prepared_order; - let staged_outbound_key = staged_outbound.key(); + let prepared_order_key = prepared_order.key(); let swap_authority_seeds = &[ crate::SWAP_AUTHORITY_SEED_PREFIX, - staged_outbound_key.as_ref(), + prepared_order_key.as_ref(), &[ctx.bumps.swap_authority], ]; - let limit_amount = utils::jupiter_v6::compute_min_amount_out(&swap_args); - // Execute swap. - shared_accounts_route.invoke_cpi(swap_args, swap_authority_seeds, cpi_remaining_accounts)?; + let usdc_amount_out = shared_accounts_route.swap_exact_in( + swap_args, + swap_authority_seeds, + cpi_remaining_accounts, + Default::default(), + )?; - // After the swap, we reload the destination token account to get the correct amount. - ctx.accounts.dst_swap_token.reload()?; - let dst_swap_token = &ctx.accounts.dst_swap_token; + let payer = &ctx.accounts.payer; - require_gte!( - dst_swap_token.amount, - limit_amount, - SwapLayerError::SwapFailed - ); + // Close the source swap token account. + token_interface::close_account(CpiContext::new_with_signer( + src_token_program.to_account_info(), + token_interface::CloseAccount { + account: ctx.accounts.src_swap_token.to_account_info(), + destination: payer.to_account_info(), + authority: swap_authority.to_account_info(), + }, + &[swap_authority_seeds], + ))?; let token_program = &ctx.accounts.token_program; + let dst_swap_token = &ctx.accounts.dst_swap_token; let custodian = &ctx.accounts.custodian; - // Change the custody token authority from target peer to custodian. - let peer_seeds = &ctx.accounts.target_peer.seeds; - token::set_authority( + token::approve( CpiContext::new_with_signer( token_program.to_account_info(), - token::SetAuthority { - current_authority: ctx.accounts.target_peer.to_account_info(), - account_or_mint: dst_swap_token.to_account_info(), + token::Approve { + to: dst_swap_token.to_account_info(), + delegate: custodian.to_account_info(), + authority: swap_authority.to_account_info(), }, - &[&[ - Peer::SEED_PREFIX, - &peer_seeds.chain.to_be_bytes(), - &[peer_seeds.bump], - ]], + &[swap_authority_seeds], ), - token::spl_token::instruction::AuthorityType::AccountOwner, - custodian.key().into(), + usdc_amount_out, )?; - // Decode the output token to verify that it's valid. - let output_token = OutputToken::read(&mut &staged_outbound.encoded_output_token[..]) - .map_err(|_| SwapLayerError::InvalidOutputToken)?; - - let swap_message = match staged_redeem { - StagedRedeem::Direct => SwapMessageV1 { - recipient: staged_outbound.info.recipient, - redeem_mode: RedeemMode::Direct, - output_token, - }, - StagedRedeem::Relay { - gas_dropoff, - relaying_fee, - } => SwapMessageV1 { - recipient: staged_outbound.info.recipient, - redeem_mode: RedeemMode::Relay { - gas_dropoff, - relaying_fee: Uint48::try_from(relaying_fee).unwrap(), - }, - output_token, - }, - StagedRedeem::Payload(payload) => SwapMessageV1 { - recipient: staged_outbound.info.recipient, - redeem_mode: RedeemMode::Payload(payload), - output_token, - }, - }; - // Prepare market order as custodian. token_router::cpi::prepare_market_order( CpiContext::new_with_signer( ctx.accounts.token_router_program.to_account_info(), token_router::cpi::accounts::PrepareMarketOrder { - payer: ctx.accounts.payer.to_account_info(), + payer: payer.to_account_info(), custodian: token_router::cpi::accounts::CheckedCustodian { custodian: ctx.accounts.token_router_custodian.to_account_info(), }, @@ -266,29 +276,25 @@ where token_program: token_program.to_account_info(), system_program: ctx.accounts.system_program.to_account_info(), }, - &[Custodian::SIGNER_SEEDS], + &[ + Custodian::SIGNER_SEEDS, + &[ + PREPARED_ORDER_SEED_PREFIX, + staged_outbound.key().as_ref(), + &[ctx.bumps.prepared_order], + ], + ], ), token_router::PrepareMarketOrderArgs { - amount_in: dst_swap_token.amount, - min_amount_out: None, + amount_in: usdc_amount_out, + min_amount_out: Default::default(), target_chain: staged_outbound.target_chain, redeemer: ctx.accounts.target_peer.address, - redeemer_message: swap_message.to_vec(), + redeemer_message, }, )?; - let payer = &ctx.accounts.payer; - - // Finally close swap token accounts. - token::close_account(CpiContext::new_with_signer( - token_program.to_account_info(), - token::CloseAccount { - account: ctx.accounts.src_swap_token.to_account_info(), - destination: payer.to_account_info(), - authority: swap_authority.to_account_info(), - }, - &[swap_authority_seeds], - ))?; + // Finally close the destination swap token account. token::close_account(CpiContext::new_with_signer( token_program.to_account_info(), token::CloseAccount { diff --git a/solana/programs/swap-layer/src/processor/stage_outbound.rs b/solana/programs/swap-layer/src/processor/stage_outbound.rs index 35926b5c..058ae20d 100644 --- a/solana/programs/swap-layer/src/processor/stage_outbound.rs +++ b/solana/programs/swap-layer/src/processor/stage_outbound.rs @@ -5,7 +5,7 @@ use crate::{ utils, TRANSFER_AUTHORITY_SEED_PREFIX, }; use anchor_lang::{prelude::*, system_program}; -use anchor_spl::token; +use anchor_spl::{token, token_interface}; use common::wormhole_io::{Readable, Writeable}; use solana_program::keccak; use swap_layer_messages::types::OutputToken; @@ -88,7 +88,7 @@ pub struct StageOutbound<'info> { ], bump, )] - staged_custody_token: Account<'info, token::TokenAccount>, + staged_custody_token: Box>, #[account( mut, @@ -97,9 +97,10 @@ pub struct StageOutbound<'info> { usdc_refund_token: Box>, /// Mint can either be USDC or whichever mint is used to swap into USDC. - src_mint: Account<'info, token::Mint>, + src_mint: Box>, token_program: Program<'info, token::Token>, + src_token_program: Interface<'info, token_interface::TokenInterface>, system_program: Program<'info, System>, } @@ -185,7 +186,7 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R None => (amount_in, StagedRedeem::Direct), }; - let token_program = &ctx.accounts.token_program; + let src_token_program = &ctx.accounts.token_program; let custody_token = &ctx.accounts.staged_custody_token; let sender = match &ctx.accounts.sender_token { @@ -194,16 +195,20 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R &ctx.accounts.program_transfer_authority, ) { (Some(sender), None) => { - token::transfer( + let src_mint = &ctx.accounts.src_mint; + + token_interface::transfer_checked( CpiContext::new( - token_program.to_account_info(), - token::Transfer { + src_token_program.to_account_info(), + token_interface::TransferChecked { from: sender_token.to_account_info(), to: custody_token.to_account_info(), authority: sender.to_account_info(), + mint: src_mint.to_account_info(), }, ), transfer_amount, + src_mint.decimals, )?; sender.key() @@ -254,9 +259,9 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R )?; let peer_seeds = &ctx.accounts.target_peer.seeds; - token::sync_native(CpiContext::new_with_signer( - token_program.to_account_info(), - token::SyncNative { + token_interface::sync_native(CpiContext::new_with_signer( + src_token_program.to_account_info(), + token_interface::SyncNative { account: custody_token.to_account_info(), }, &[&[ diff --git a/solana/programs/swap-layer/src/state/staged/outbound.rs b/solana/programs/swap-layer/src/state/staged/outbound.rs index 6a4edd3f..56cc33ab 100644 --- a/solana/programs/swap-layer/src/state/staged/outbound.rs +++ b/solana/programs/swap-layer/src/state/staged/outbound.rs @@ -1,7 +1,7 @@ use crate::error::SwapLayerError; use anchor_lang::prelude::*; use common::wormhole_io::Readable; -use swap_layer_messages::types::OutputToken; +use swap_layer_messages::{messages::SwapMessageV1, types::OutputToken}; #[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)] pub enum RedeemOption { @@ -85,6 +85,30 @@ impl StagedOutbound { None => 5, // len + OutputToken::Usdc, })) } + + pub fn to_swap_message_v1(&mut self) -> Result { + let Self { + info, + staged_redeem, + encoded_output_token, + } = self; + + let staged_redeem = std::mem::take(staged_redeem); + + Ok(SwapMessageV1 { + recipient: info.recipient, + redeem_mode: match staged_redeem { + StagedRedeem::Direct => Default::default(), + StagedRedeem::Payload(payload) => payload.into(), + StagedRedeem::Relay { + gas_dropoff, + relaying_fee, + } => (gas_dropoff, relaying_fee).try_into().unwrap(), + }, + output_token: Readable::read(&mut &encoded_output_token[..]) + .map_err(|_| SwapLayerError::InvalidOutputToken)?, + }) + } } impl std::ops::Deref for StagedOutbound { diff --git a/solana/ts/src/jupiterV6/index.ts b/solana/ts/src/jupiterV6/index.ts index 853e0179..9b3def2b 100644 --- a/solana/ts/src/jupiterV6/index.ts +++ b/solana/ts/src/jupiterV6/index.ts @@ -2,7 +2,7 @@ export * from "./layouts"; import * as jupAg from "@jup-ag/api"; import * as splToken from "@solana/spl-token"; -import { PublicKey, TransactionInstruction } from "@solana/web3.js"; +import { Connection, PublicKey, TransactionInstruction } from "@solana/web3.js"; import { decodeSharedAccountsRouteArgs, encodeSharedAccountsRouteArgs } from "./layouts"; export const JUPITER_V6_PROGRAM_ID = new PublicKey("JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4"); @@ -24,6 +24,8 @@ export type ModifySharedAccountsRouteOpts = { quotedOutAmount?: bigint; slippageBps?: number; cpi?: boolean; + srcTokenProgram?: PublicKey; + dstTokenProgram?: PublicKey; }; export type ModifiedSharedAccountsRoute = { @@ -35,13 +37,14 @@ export type ModifiedSharedAccountsRoute = { minAmountOut: bigint; }; -export function modifySharedAccountsRouteInstruction( +export async function modifySharedAccountsRouteInstruction( + connection: Connection, instruction: jupAg.Instruction, tokenOwner: PublicKey, opts: ModifySharedAccountsRouteOpts, -): ModifiedSharedAccountsRoute { +): Promise { const { inAmount, quotedOutAmount, slippageBps } = opts; - let { cpi } = opts; + let { cpi, srcTokenProgram, dstTokenProgram } = opts; cpi ??= false; const ix = toTransactionInstruction(instruction); @@ -52,12 +55,21 @@ export function modifySharedAccountsRouteInstruction( ix.keys[userTransferAuthorityIdx].isSigner = !cpi; const sourceMint = ix.keys[7].pubkey; + if (srcTokenProgram === undefined) { + const accInfo = await connection.getAccountInfo(sourceMint); + srcTokenProgram = accInfo.owner; + } const destinationMint = ix.keys[8].pubkey; + if (dstTokenProgram === undefined) { + const accInfo = await connection.getAccountInfo(destinationMint); + dstTokenProgram = accInfo.owner; + } const sourceToken = splToken.getAssociatedTokenAddressSync( sourceMint, tokenOwner, true, // allowOwnerOffCurve + srcTokenProgram, ); ix.keys[3].pubkey = sourceToken; @@ -65,6 +77,7 @@ export function modifySharedAccountsRouteInstruction( destinationMint, tokenOwner, true, // allowOwnerOffCurve + dstTokenProgram, ); ix.keys[6].pubkey = destinationToken; diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 342eab18..09fbe739 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -190,25 +190,55 @@ export class SwapLayerProgram { }; } - swapAuthorityAddress(preparedFill: PublicKey): PublicKey { + swapAuthorityAddress(preparedSource: PublicKey): PublicKey { return PublicKey.findProgramAddressSync( - [Buffer.from("swap-authority"), preparedFill.toBuffer()], + [Buffer.from("swap-authority"), preparedSource.toBuffer()], this.ID, )[0]; } - swapComposite(accounts: { - preparedFill: PublicKey; + async swapAccounts(accounts: { + preparedSource: PublicKey; sourceMint: PublicKey; destinationMint: PublicKey; - }) { - const { preparedFill, sourceMint, destinationMint } = accounts; + srcTokenProgram?: PublicKey; + dstTokenProgram?: PublicKey; + }): Promise<{ + swapAuthority: PublicKey; + srcSwapToken: PublicKey; + dstSwapToken: PublicKey; + srcTokenProgram: PublicKey; + dstTokenProgram: PublicKey; + }> { + const { preparedSource, sourceMint, destinationMint } = accounts; + + let { srcTokenProgram, dstTokenProgram } = accounts; + if (srcTokenProgram === undefined) { + const accInfo = await this.connection().getAccountInfo(sourceMint); + srcTokenProgram = accInfo.owner; + } + if (dstTokenProgram === undefined) { + const accInfo = await this.connection().getAccountInfo(destinationMint); + dstTokenProgram = accInfo.owner; + } - const authority = this.swapAuthorityAddress(preparedFill); + const swapAuthority = this.swapAuthorityAddress(preparedSource); return { - authority, - srcSwapToken: splToken.getAssociatedTokenAddressSync(sourceMint, authority, true), - dstSwapToken: splToken.getAssociatedTokenAddressSync(destinationMint, authority, true), + swapAuthority, + srcSwapToken: splToken.getAssociatedTokenAddressSync( + sourceMint, + swapAuthority, + true, + srcTokenProgram, + ), + dstSwapToken: splToken.getAssociatedTokenAddressSync( + destinationMint, + swapAuthority, + true, + dstTokenProgram, + ), + srcTokenProgram, + dstTokenProgram, }; } @@ -446,6 +476,7 @@ export class SwapLayerProgram { senderToken?: PublicKey | null; programTransferAuthority?: PublicKey | null; srcMint?: PublicKey; + srcTokenProgram?: PublicKey; peer?: PublicKey; }, args: { @@ -463,8 +494,12 @@ export class SwapLayerProgram { const { payer, stagedOutbound, usdcRefundToken, peer } = accounts; const { transferType, amountIn, redeemOption: inputRedeemOption, outputToken } = args; - let { sender, senderToken, programTransferAuthority, srcMint } = accounts; + let { sender, senderToken, programTransferAuthority, srcMint, srcTokenProgram } = accounts; srcMint ??= transferType === "native" ? splToken.NATIVE_MINT : this.usdcMint; + if (srcTokenProgram === undefined) { + const accInfo = await this.connection().getAccountInfo(srcMint); + srcTokenProgram = accInfo.owner; + } const redeemOption = ((): RedeemOption | null => { if (inputRedeemOption === null) { @@ -534,6 +569,7 @@ export class SwapLayerProgram { stagedCustodyToken: this.stagedCustodyTokenAddress(stagedOutbound), usdcRefundToken, srcMint, + srcTokenProgram, tokenProgram: splToken.TOKEN_PROGRAM_ID, systemProgram: SystemProgram.programId, }; @@ -630,6 +666,90 @@ export class SwapLayerProgram { .instruction(); } + async initiateSwapExactInIx( + accounts: { + payer: PublicKey; + stagedOutbound: PublicKey; + stagedCustodyToken?: PublicKey; + preparedOrder?: PublicKey; + srcMint?: PublicKey; + srcTokenProgram?: PublicKey; + preparedBy?: PublicKey; + usdcRefundToken?: PublicKey; + }, + args: { + cpiInstruction: TransactionInstruction; + targetChain?: ChainId; + }, + ): Promise { + const { payer, stagedOutbound } = accounts; + const { cpiInstruction } = args; + + let { + stagedCustodyToken, + preparedOrder, + srcMint, + srcTokenProgram, + preparedBy, + usdcRefundToken, + } = accounts; + srcMint ??= splToken.NATIVE_MINT; + + let { targetChain } = args; + if ( + targetChain === undefined || + usdcRefundToken === undefined || + preparedBy === undefined + ) { + const { info } = await this.fetchStagedOutbound(stagedOutbound); + targetChain ??= info.targetChain as ChainId; + usdcRefundToken ??= info.usdcRefundToken; + preparedBy ??= info.preparedBy; + } + + preparedOrder ??= this.preparedOrderAddress(stagedOutbound); + stagedCustodyToken ??= this.stagedCustodyTokenAddress(stagedOutbound); + + const swapAccounts = await this.swapAccounts({ + preparedSource: preparedOrder, + sourceMint: srcMint, + destinationMint: this.usdcMint, + srcTokenProgram, + dstTokenProgram: splToken.TOKEN_PROGRAM_ID, + }); + const { swapAuthority, srcSwapToken, dstSwapToken } = swapAccounts; + srcTokenProgram ??= swapAccounts.srcTokenProgram; + + const tokenRouter = this.tokenRouterProgram(); + + return this.program.methods + .initiateSwapExactIn(cpiInstruction.data) + .accounts({ + payer, + custodian: this.checkedCustodianComposite(), + preparedBy, + stagedOutbound, + stagedCustodyToken: this.stagedCustodyTokenAddress(stagedOutbound), + usdcRefundToken, + targetPeer: this.registeredPeerComposite({ chain: targetChain }), + preparedOrder, + swapAuthority, + srcSwapToken, + dstSwapToken, + srcMint, + usdc: this.usdcComposite(), + tokenRouterCustodian: tokenRouter.custodianAddress(), + preparedCustodyToken: tokenRouter.preparedCustodyTokenAddress(preparedOrder), + tokenRouterProgram: tokenRouter.ID, + associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, + srcTokenProgram, + tokenProgram: splToken.TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }) + .remainingAccounts(cpiInstruction.keys) + .instruction(); + } + async completeTransferRelayIx( accounts: { payer: PublicKey; @@ -787,6 +907,7 @@ export class SwapLayerProgram { recipient: PublicKey; dstMint?: PublicKey; beneficiary?: PublicKey; + dstTokenProgram?: PublicKey; }, args: { cpiInstruction: TransactionInstruction; @@ -795,11 +916,19 @@ export class SwapLayerProgram { const { payer, preparedFill, recipient } = accounts; const { cpiInstruction } = args; - let { beneficiary, dstMint } = accounts; + let { beneficiary, dstMint, dstTokenProgram } = accounts; beneficiary ??= payer; dstMint ??= splToken.NATIVE_MINT; - const swapAuthority = this.swapAuthorityAddress(preparedFill); + const swapAccounts = await this.swapAccounts({ + preparedSource: preparedFill, + sourceMint: this.usdcMint, + destinationMint: dstMint, + srcTokenProgram: splToken.TOKEN_PROGRAM_ID, + dstTokenProgram, + }); + const { swapAuthority, srcSwapToken, dstSwapToken } = swapAccounts; + dstTokenProgram ??= swapAccounts.dstTokenProgram; return this.program.methods .completeSwapDirect(cpiInstruction.data) @@ -811,20 +940,13 @@ export class SwapLayerProgram { beneficiary, }), authority: swapAuthority, - srcSwapToken: splToken.getAssociatedTokenAddressSync( - this.usdcMint, - swapAuthority, - true, // allowOwnerOffCurve - ), - dstSwapToken: splToken.getAssociatedTokenAddressSync( - dstMint, - swapAuthority, - true, // allowOwnerOffCurve - ), + srcSwapToken, + dstSwapToken, usdc: this.usdcComposite(), dstMint, associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, tokenProgram: splToken.TOKEN_PROGRAM_ID, + dstTokenProgram, systemProgram: SystemProgram.programId, }, recipientToken: splToken.getAssociatedTokenAddressSync(dstMint, recipient), diff --git a/solana/ts/tests/10__jupiterTest.ts b/solana/ts/tests/10__jupiterTest.ts deleted file mode 100644 index 0ad83d7e..00000000 --- a/solana/ts/tests/10__jupiterTest.ts +++ /dev/null @@ -1,992 +0,0 @@ -import * as splToken from "@solana/spl-token"; -import { - ComputeBudgetProgram, - Connection, - Keypair, - PublicKey, - Signer, - SystemProgram, - TransactionInstruction, -} from "@solana/web3.js"; -import { CctpTokenBurnMessage } from "@wormhole-foundation/example-liquidity-layer-solana/cctp"; -import { - LiquidityLayerDeposit, - LiquidityLayerMessage, -} from "@wormhole-foundation/example-liquidity-layer-solana/common"; -import * as matchingEngineSdk from "@wormhole-foundation/example-liquidity-layer-solana/matchingEngine"; -import { - CHAIN_TO_DOMAIN, - CircleAttester, - ETHEREUM_USDC_ADDRESS, - LOCALHOST, - MOCK_GUARDIANS, - OWNER_ASSISTANT_KEYPAIR, - OWNER_KEYPAIR, - PAYER_KEYPAIR, - REGISTERED_TOKEN_ROUTERS, - USDC_MINT_ADDRESS, - expectIxErr, - expectIxOk, - getBlockTime, - postLiquidityLayerVaa, - toUniversalAddress, -} from "@wormhole-foundation/example-liquidity-layer-solana/testing"; -import { VaaAccount } from "@wormhole-foundation/example-liquidity-layer-solana/wormhole"; -import { Chain, toChainId } from "@wormhole-foundation/sdk-base"; -import { toUniversal } from "@wormhole-foundation/sdk-definitions"; -import { assert } from "chai"; -import * as fs from "fs"; -import * as jupiterV6 from "../src/jupiterV6"; -import { - OutputToken, - RedeemMode, - SwapLayerMessage, - SwapLayerProgram, - decodeSwapLayerMessage, - encodeSwapLayerMessage, - localnet, -} from "../src/swapLayer"; -import { - FEE_UPDATER_KEYPAIR, - REGISTERED_PEERS, - USDT_MINT_ADDRESS, - createLut, - tryNativeToUint8Array, -} from "./helpers"; -import { - FastMarketOrder, - SlowOrderResponse, -} from "@wormhole-foundation/example-liquidity-layer-definitions"; - -describe("Jupiter V6 Testing", () => { - const connection = new Connection(LOCALHOST, "processed"); - - const payer = PAYER_KEYPAIR; - const relayer = Keypair.generate(); - const owner = OWNER_KEYPAIR; - const ownerAssistant = OWNER_ASSISTANT_KEYPAIR; - const feeUpdater = FEE_UPDATER_KEYPAIR; - - // Program SDKs - const swapLayer = new SwapLayerProgram(connection, localnet(), USDC_MINT_ADDRESS); - const tokenRouter = swapLayer.tokenRouterProgram(); - const matchingEngine = tokenRouter.matchingEngineProgram(); - - const luts: [PublicKey, PublicKey] = [PublicKey.default, PublicKey.default]; - - let testCctpNonce = 2n ** 64n - 1n; - - // Hack to prevent math overflow error when invoking CCTP programs. - testCctpNonce -= 100n * 6400n; - - let wormholeSequence = 10000n; - - describe("Jupiter V6 Setup", function () { - before("Generate ATAs", async function () { - for (const mint of [swapLayer.usdcMint, USDT_MINT_ADDRESS, splToken.NATIVE_MINT]) { - for (let i = 0; i < 8; ++i) { - const authority = jupiterV6.programAuthorityAddress(i); - - await splToken.getOrCreateAssociatedTokenAccount( - connection, - payer, - mint, - authority, - true, // allowOwnerOffCurve - ); - } - } - - const payerWsol = splToken.getAssociatedTokenAddressSync( - splToken.NATIVE_MINT, - payer.publicKey, - ); - - await expectIxOk( - connection, - [ - splToken.createAssociatedTokenAccountInstruction( - payer.publicKey, - payerWsol, - payer.publicKey, - splToken.NATIVE_MINT, - ), - SystemProgram.transfer({ - fromPubkey: payer.publicKey, - toPubkey: payerWsol, - lamports: 2_000_000_000_000n, - }), - splToken.createSyncNativeInstruction(payerWsol), - ], - [payer], - ); - }); - - after("Setup Lookup Tables", async function () { - luts[0] = await createLut( - connection, - payer, - await tokenRouter - .commonAccounts() - .then((accounts) => Object.values(accounts).filter((key) => key !== undefined)), - ); - - luts[1] = await createLut( - connection, - payer, - await matchingEngine - .commonAccounts() - .then((accounts) => Object.values(accounts).filter((key) => key !== undefined)), - ); - }); - - it("User Swap USDC to USDT From Simulated Quote -- Whirlpool", async function () { - await invokeSharedAccountsRouteAsUser( - modifyUsdcToUsdtSwapResponseForTest(payer.publicKey, { - inAmount: 100_000_000n, - quotedOutAmount: 100_000_000n, - slippageBps: 50, - }), - ); - }); - - it("User Swap USDT to USDC From Simulated Quote -- Whirlpool", async function () { - await invokeSharedAccountsRouteAsUser( - modifyUsdtToUsdcSwapResponseForTest(payer.publicKey, { - inAmount: 50_000_000n, - quotedOutAmount: 50_000_000n, - slippageBps: 50, - }), - ); - }); - - it("User Swap USDC to WSOL From Simulated Quote -- Phoenix V1", async function () { - await invokeSharedAccountsRouteAsUser( - modifyUsdcToWsolSwapResponseForTest(payer.publicKey, { - inAmount: 150_000_000n, - quotedOutAmount: 1_000_000_000n, - slippageBps: 200, - }), - ); - }); - - it("User Swap WSOL to USDC From Simulated Quote -- Phoenix V1", async function () { - await invokeSharedAccountsRouteAsUser( - modifyWsolToUsdcSwapResponseForTest(payer.publicKey, { - inAmount: 1_000_000_000n, - quotedOutAmount: 150_000_000n, - slippageBps: 200, - }), - ); - }); - - async function invokeSharedAccountsRouteAsUser( - modifyArgs: jupiterV6.ModifiedSharedAccountsRoute, - ) { - const { - instruction: ix, - sourceToken: srcToken, - destinationToken: dstToken, - minAmountOut, - } = modifyArgs; - - const { amount: srcBalanceBefore } = await splToken.getAccount(connection, srcToken); - const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); - - await expectIxOk(connection, [ix], [payer]); - - const decodedIxData = jupiterV6.decodeSharedAccountsRouteArgs(ix.data); - - const { amount: srcBalanceAfter } = await splToken.getAccount(connection, srcToken); - assert.strictEqual(srcBalanceBefore - srcBalanceAfter, decodedIxData.inAmount); - - const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); - assert.isTrue(dstBalanceAfter - dstBalanceBefore >= minAmountOut); - } - }); - - describe("Complete Swap -- Direct", function () { - const emittedEvents: EmittedFilledLocalFastOrder[] = []; - let listenerId: number | null; - - before("Start Event Listener", async function () { - listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { - emittedEvents.push({ event, slot, signature }); - }); - }); - - after("Stop Event Listener", async function () { - if (listenerId !== null) { - matchingEngine.program.removeEventListener(listenerId!); - } - }); - - function newQuotedSwapOutputToken(opts: { - quotedAmountOut: bigint; - dstMint?: PublicKey | null; - slippageBps?: number; - deadline?: number; - dexProgramId?: PublicKey | null; - }) { - const { quotedAmountOut } = opts; - - let { dstMint, slippageBps, deadline, dexProgramId } = opts; - dstMint ??= null; - slippageBps ??= 0; - deadline ??= 0; - dexProgramId ??= null; - - const limitAmount = (quotedAmountOut * (10000n - BigInt(slippageBps))) / 10000n; - const swap = { - deadline, - limitAmount, - type: { - id: "JupiterV6", - dexProgramId: - dexProgramId === null - ? { isSome: false } - : { - isSome: true, - address: toUniversal("Solana", dexProgramId.toString()), - }, - }, - }; - return { - limitAmount, - outputToken: (dstMint === null - ? { type: "Gas", swap } - : { - type: "Other", - address: toUniversal("Solana", dstMint.toString()), - swap, - }) as OutputToken, - }; - } - - it("Other -- USDT via Whirlpool", async function () { - const dstMint = USDT_MINT_ADDRESS; - const { limitAmount, outputToken } = newQuotedSwapOutputToken({ - quotedAmountOut: 198_800_000n, - dstMint, - slippageBps: 15, - }); - - const amountIn = 200_000_000n; - const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( - { payer: payer.publicKey }, - emittedEvents, - { - dstMint, - outputToken, - amountIn, - }, - ); - - await completeSwapDirectForTest( - { - payer: payer.publicKey, - preparedFill, - recipient, - dstMint, - }, - { - limitAmount, - swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, - }, - ); - }); - - it("Other -- WSOL via Phoenix V1", async function () { - const dstMint = splToken.NATIVE_MINT; - const { limitAmount, outputToken } = newQuotedSwapOutputToken({ - quotedAmountOut: 2_000_000_000n, - dstMint, - slippageBps: 150, - }); - - const amountIn = 300_000_000n; - const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( - { payer: payer.publicKey }, - emittedEvents, - { - dstMint, - outputToken, - amountIn, - }, - ); - - await completeSwapDirectForTest( - { - payer: payer.publicKey, - preparedFill, - recipient, - dstMint, - }, - { - limitAmount, - swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, - }, - ); - }); - - it("Gas via Phoenix V1", async function () { - const { limitAmount, outputToken } = newQuotedSwapOutputToken({ - quotedAmountOut: 2_000_000_000n, - slippageBps: 150, - }); - - const amountIn = 300_000_000n; - const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( - { payer: payer.publicKey }, - emittedEvents, - { - outputToken, - amountIn, - }, - ); - - await completeSwapDirectForTest( - { - payer: payer.publicKey, - preparedFill, - recipient, - }, - { - limitAmount, - swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, - }, - ); - }); - }); - - async function completeSwapDirectForTest( - accounts: { - payer: PublicKey; - preparedFill: PublicKey; - recipient: PublicKey; - dstMint?: PublicKey; - }, - opts: ForTestOpts & { - limitAmount: bigint; - swapResponseModifier: ( - tokenOwner: PublicKey, - opts: jupiterV6.ModifySharedAccountsRouteOpts, - ) => jupiterV6.ModifiedSharedAccountsRoute; - }, - ): Promise { - const [{ signers, errorMsg }, otherOpts] = setDefaultForTestOpts(opts); - const { limitAmount, swapResponseModifier } = otherOpts; - - const { instruction: cpiInstruction, destinationMint } = swapResponseModifier( - swapLayer.swapAuthorityAddress(accounts.preparedFill), - { - cpi: true, - }, - ); - const expectedDstMint = accounts.dstMint ?? splToken.NATIVE_MINT; - assert.deepEqual(destinationMint, expectedDstMint); - - const ix = await swapLayer.completeSwapDirectIx(accounts, { cpiInstruction }); - - const ixs = [ - ComputeBudgetProgram.setComputeUnitLimit({ - units: 420_000, - }), - ix, - ]; - - const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { - const resp = await connection.getAddressLookupTable(lookupTableAddress); - return resp.value; - }), - ); - - if (errorMsg !== null) { - await expectIxErr(connection, ixs, signers, errorMsg, { - addressLookupTableAccounts, - }); - return; - } - - const { redeemerMessage } = await tokenRouter.fetchPreparedFill(accounts.preparedFill); - const outputToken = decodeSwapLayerMessage(redeemerMessage).outputToken; - - if (outputToken.type === "Gas") { - const balanceBefore = await connection.getBalance(accounts.recipient).then(BigInt); - - await expectIxOk(connection, ixs, signers, { - addressLookupTableAccounts, - }); - - const balanceAfter = await connection.getBalance(accounts.recipient).then(BigInt); - assert.isTrue(balanceAfter - balanceBefore >= limitAmount); - } else if (outputToken.type === "Other") { - const dstToken = splToken.getAssociatedTokenAddressSync( - expectedDstMint, - accounts.recipient, - ); - const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); - - await expectIxOk(connection, ixs, signers, { - addressLookupTableAccounts, - }); - - const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); - assert.isTrue(dstBalanceAfter - dstBalanceBefore >= limitAmount); - } else { - assert.fail("Invalid output token type"); - } - } - - async function redeemSwapLayerFastFillForTest( - accounts: { payer: PublicKey }, - emittedEvents: EmittedFilledLocalFastOrder[], - opts: ObserveCctpOrderVaasOpts & { - dstMint?: PublicKey; - recipient?: PublicKey; - redeemMode?: RedeemMode; - outputToken?: OutputToken; - }, - ) { - let { dstMint, recipient, redeemMode, outputToken } = opts; - dstMint ??= splToken.NATIVE_MINT; - recipient ??= Keypair.generate().publicKey; - redeemMode ??= { mode: "Direct" }; - outputToken ??= { - type: "Gas", - swap: { - deadline: 0, - limitAmount: 0n, - type: { - id: "JupiterV6", - dexProgramId: { isSome: false }, - }, - }, - }; - - // Generate a new token account for recipient. - const recipientToken = splToken.getAssociatedTokenAddressSync(dstMint, recipient); - - await expectIxOk( - connection, - [ - splToken.createAssociatedTokenAccountInstruction( - payer.publicKey, - recipientToken, - recipient, - dstMint, - ), - ], - [payer], - ); - - const msg = { - recipient: toUniversal("Solana", recipient.toString()), - redeemMode, - outputToken, - } as SwapLayerMessage; - - // Override redeemer message if undefined. - if (opts.redeemerMessage === undefined) { - opts.redeemerMessage = encodeSwapLayerMessage(msg); - } - - const settleResult = await settleAuctionNoneLocalForTest( - { payer: payer.publicKey }, - emittedEvents, - opts, - ); - const { - event: { - seeds: { sourceChain, orderSender, sequence }, - }, - } = settleResult!; - - const fastFill = matchingEngine.fastFillAddress( - toChainId(sourceChain), - orderSender, - sequence, - ); - - const ix = await tokenRouter.redeemFastFillIx({ - ...accounts, - fastFill, - }); - - await expectIxOk(connection, [ix], [payer]); - - const preparedFill = tokenRouter.preparedFillAddress(fastFill); - const { redeemerMessage } = await tokenRouter.fetchPreparedFill(preparedFill); - assert.deepEqual(decodeSwapLayerMessage(redeemerMessage), msg); - - return { preparedFill, recipient }; - } - - function modifyUsdcToUsdtSwapResponseForTest( - tokenOwner: PublicKey, - opts: jupiterV6.ModifySharedAccountsRouteOpts, - ): jupiterV6.ModifiedSharedAccountsRoute { - const response = JSON.parse( - fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/whirlpool_usdc_to_usdt.json`, { - encoding: "utf-8", - }), - ); - - return jupiterV6.modifySharedAccountsRouteInstruction(response, tokenOwner, opts); - } - - function modifyUsdtToUsdcSwapResponseForTest( - tokenOwner: PublicKey, - opts: jupiterV6.ModifySharedAccountsRouteOpts, - ): jupiterV6.ModifiedSharedAccountsRoute { - const response = JSON.parse( - fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/whirlpool_usdt_to_usdc.json`, { - encoding: "utf-8", - }), - ); - - return jupiterV6.modifySharedAccountsRouteInstruction(response, tokenOwner, opts); - } - - function modifyUsdcToWsolSwapResponseForTest( - tokenOwner: PublicKey, - opts: jupiterV6.ModifySharedAccountsRouteOpts, - ): jupiterV6.ModifiedSharedAccountsRoute { - const response = JSON.parse( - fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/phoenix_v1_usdc_to_wsol.json`, { - encoding: "utf-8", - }), - ); - - return jupiterV6.modifySharedAccountsRouteInstruction(response, tokenOwner, opts); - } - - function modifyWsolToUsdcSwapResponseForTest( - tokenOwner: PublicKey, - opts: jupiterV6.ModifySharedAccountsRouteOpts, - ): jupiterV6.ModifiedSharedAccountsRoute { - const response = JSON.parse( - fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/phoenix_v1_wsol_to_usdc.json`, { - encoding: "utf-8", - }), - ); - - return jupiterV6.modifySharedAccountsRouteInstruction(response, tokenOwner, opts); - } - - type PrepareOrderResponseForTestOptionalOpts = { - args?: matchingEngineSdk.CctpMessageArgs; - }; - - async function prepareOrderResponseCctpForTest( - accounts: { - payer: PublicKey; - }, - opts: ObserveCctpOrderVaasOpts & PrepareOrderResponseForTestOptionalOpts, - ): Promise< - | undefined - | { - fastVaa: PublicKey; - finalizedVaa: PublicKey; - args: matchingEngineSdk.CctpMessageArgs; - preparedOrderResponse: PublicKey; - prepareOrderResponseInstruction?: TransactionInstruction; - } - > { - let { args } = opts; - - const { fastVaa, fastVaaAccount, finalizedVaa } = await (async () => { - const { fast, finalized } = await observeCctpOrderVaas(opts); - args ??= finalized!.cctp; - - return { - fastVaa: fast.vaa, - fastVaaAccount: fast.vaaAccount, - finalizedVaa: finalized!.vaa, - }; - })(); - - const ix = await matchingEngine.prepareOrderResponseCctpIx( - { - payer: accounts.payer, - fastVaa, - finalizedVaa, - }, - args!, - ); - - const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ - units: 280_000, - }); - - const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { - const { value } = await connection.getAddressLookupTable(lookupTableAddress); - - return value; - }), - ); - await expectIxOk(connection, [computeIx, ix], [payer], { - addressLookupTableAccounts, - }); - - return { - fastVaa, - finalizedVaa, - args: args!, - preparedOrderResponse: matchingEngine.preparedOrderResponseAddress( - fastVaaAccount.digest(), - ), - }; - } - - async function reserveFastFillSequenceNoAuctionForTest( - accounts: { - payer: PublicKey; - fastVaa?: PublicKey; - auction?: PublicKey; - preparedOrderResponse?: PublicKey; - }, - opts: ObserveCctpOrderVaasOpts, - ): Promise< - | undefined - | { - fastVaa: PublicKey; - fastVaaAccount: VaaAccount; - reservedSequence: PublicKey; - finalizedVaa?: PublicKey; - finalizedVaaAccount?: VaaAccount; - } - > { - let preparedOrderResponse: PublicKey | undefined; - const { fastVaa, fastVaaAccount, finalizedVaa, finalizedVaaAccount } = await (async () => { - if (accounts.preparedOrderResponse === undefined) { - const result = await prepareOrderResponseCctpForTest( - { - payer: accounts.payer, - }, - opts, - ); - const { fastVaa, finalizedVaa } = result!; - preparedOrderResponse = result!.preparedOrderResponse; - - return { - fastVaa, - fastVaaAccount: await VaaAccount.fetch(connection, fastVaa), - finalizedVaa: finalizedVaa, - finalizedVaaAccount: await VaaAccount.fetch(connection, finalizedVaa), - }; - } else if (accounts.fastVaa !== undefined) { - preparedOrderResponse = accounts.preparedOrderResponse; - return { - fastVaa: accounts.fastVaa, - fastVaaAccount: await VaaAccount.fetch(connection, accounts.fastVaa), - }; - } else { - throw new Error("fastVaa must be defined if preparedOrderResponse is defined"); - } - })(); - - const ix = await matchingEngine.reserveFastFillSequenceNoAuctionIx({ - ...accounts, - fastVaa: accounts.fastVaa ?? fastVaa, - preparedOrderResponse, - }); - - await expectIxOk(connection, [ix], [payer]); - - return { - fastVaa, - fastVaaAccount, - reservedSequence: matchingEngine.reservedFastFillSequenceAddress( - fastVaaAccount.digest(), - ), - finalizedVaa, - finalizedVaaAccount, - }; - } - - type EmittedFilledLocalFastOrder = { - event: matchingEngineSdk.LocalFastOrderFilled; - slot: number; - signature: string; - }; - - async function settleAuctionNoneLocalForTest( - accounts: { - payer: PublicKey; - reservedSequence?: PublicKey; - }, - emittedEvents: EmittedFilledLocalFastOrder[], - opts: ObserveCctpOrderVaasOpts, - ): Promise { - const reserveResult = await reserveFastFillSequenceNoAuctionForTest( - { - payer: accounts.payer, - }, - opts, - ); - - const ix = await matchingEngine.settleAuctionNoneLocalIx({ - ...accounts, - reservedSequence: reserveResult!.reservedSequence, - }); - - await expectIxOk(connection, [ix], [payer]); - - // Check event. - while (emittedEvents.length == 0) { - console.log("waiting..."); - await new Promise((resolve) => setTimeout(resolve, 200)); - } - - return emittedEvents.shift()!; - } - - type ForTestOpts = { - signers?: Signer[]; - errorMsg?: string | null; - }; - - function setDefaultForTestOpts( - opts: T, - overrides: { - signers?: Signer[]; - } = {}, - ): [{ signers: Signer[]; errorMsg: string | null }, Omit] { - let { signers, errorMsg } = opts; - signers ??= overrides.signers ?? [payer]; - delete opts.signers; - - errorMsg ??= null; - delete opts.errorMsg; - - return [{ signers, errorMsg }, { ...opts }]; - } - - function newFastMarketOrder(args: { - redeemerMessage?: Uint8Array; - sender?: Array; - amountIn?: bigint; - minAmountOut?: bigint; - initAuctionFee?: bigint; - targetChain?: Chain; - maxFee?: bigint; - deadline?: number; - }): FastMarketOrder { - const { - amountIn, - targetChain, - minAmountOut, - maxFee, - initAuctionFee, - deadline, - redeemerMessage, - sender, - } = args; - - return { - amountIn: amountIn ?? 1_000_000_000n, - minAmountOut: minAmountOut ?? 0n, - targetChain: targetChain ?? "Solana", - redeemer: toUniversalAddress(swapLayer.custodianAddress().toBuffer()), - sender: toUniversalAddress(sender ?? REGISTERED_PEERS["Ethereum"]!), - refundAddress: toUniversalAddress(new Array(32).fill(3)), - maxFee: maxFee ?? 42069n, - initAuctionFee: initAuctionFee ?? 1_250_000n, - deadline: deadline ?? 0, - redeemerMessage: Buffer.from(redeemerMessage ?? Uint8Array.from([4, 20, 69])), - }; - } - - function newSlowOrderResponse(args: { baseFee?: bigint } = {}): SlowOrderResponse { - const { baseFee } = args; - - return { - baseFee: baseFee ?? 420n, - }; - } - - type VaaResult = { - vaa: PublicKey; - vaaAccount: VaaAccount; - }; - - type FastObservedResult = VaaResult & { - fastMarketOrder: FastMarketOrder; - }; - - type FinalizedObservedResult = VaaResult & { - slowOrderResponse: SlowOrderResponse; - cctp: matchingEngineSdk.CctpMessageArgs; - }; - - type ObserveCctpOrderVaasOpts = { - amountIn: bigint; - redeemerMessage?: Uint8Array; - sourceChain?: Chain; - emitter?: Array; - vaaTimestamp?: number; - fastMarketOrder?: FastMarketOrder; - finalized?: boolean; - slowOrderResponse?: SlowOrderResponse; - finalizedSourceChain?: Chain; - finalizedEmitter?: Array; - finalizedSequence?: bigint; - finalizedVaaTimestamp?: number; - }; - - async function observeCctpOrderVaas(opts: ObserveCctpOrderVaasOpts): Promise<{ - fast: FastObservedResult; - finalized?: FinalizedObservedResult; - }> { - let { - sourceChain, - emitter, - vaaTimestamp, - fastMarketOrder, - finalized, - slowOrderResponse, - finalizedSourceChain, - finalizedEmitter, - finalizedSequence, - finalizedVaaTimestamp, - } = opts; - sourceChain ??= "Ethereum"; - emitter ??= REGISTERED_TOKEN_ROUTERS[sourceChain] ?? new Array(32).fill(0); - vaaTimestamp ??= await getBlockTime(connection); - fastMarketOrder ??= newFastMarketOrder(opts); - finalized ??= true; - slowOrderResponse ??= newSlowOrderResponse(); - finalizedSourceChain ??= sourceChain; - finalizedEmitter ??= emitter; - finalizedSequence ??= finalized ? wormholeSequence++ : 0n; - finalizedVaaTimestamp ??= vaaTimestamp; - - const sourceCctpDomain = CHAIN_TO_DOMAIN[sourceChain]; - if (sourceCctpDomain === undefined) { - throw new Error(`Invalid source chain: ${sourceChain}`); - } - - const fastVaa = await postLiquidityLayerVaa( - connection, - payer, - MOCK_GUARDIANS, - emitter, - wormholeSequence++, - new LiquidityLayerMessage({ - fastMarketOrder, - }), - { sourceChain, timestamp: vaaTimestamp }, - ); - const fastVaaAccount = await VaaAccount.fetch(connection, fastVaa); - const fast = { fastMarketOrder, vaa: fastVaa, vaaAccount: fastVaaAccount }; - - if (finalized) { - const { amountIn: amount } = fastMarketOrder; - const cctpNonce = testCctpNonce++; - - // Concoct a Circle message. - const { destinationCctpDomain, burnMessage, encodedCctpMessage, cctpAttestation } = - await craftCctpTokenBurnMessage(sourceCctpDomain, cctpNonce, amount); - - const finalizedMessage = new LiquidityLayerMessage({ - deposit: new LiquidityLayerDeposit({ - tokenAddress: toUniversalAddress(burnMessage.burnTokenAddress), - amount, - sourceCctpDomain, - destinationCctpDomain, - cctpNonce, - burnSource: toUniversalAddress(Buffer.alloc(32, "beefdead", "hex")), - mintRecipient: toUniversalAddress( - matchingEngine.cctpMintRecipientAddress().toBuffer(), - ), - payload: { id: 2, ...slowOrderResponse }, - }), - }); - - const finalizedVaa = await postLiquidityLayerVaa( - connection, - payer, - MOCK_GUARDIANS, - finalizedEmitter, - finalizedSequence, - finalizedMessage, - { sourceChain: finalizedSourceChain, timestamp: finalizedVaaTimestamp }, - ); - const finalizedVaaAccount = await VaaAccount.fetch(connection, finalizedVaa); - return { - fast, - finalized: { - slowOrderResponse, - vaa: finalizedVaa, - vaaAccount: finalizedVaaAccount, - cctp: { - encodedCctpMessage, - cctpAttestation, - }, - }, - }; - } else { - return { fast }; - } - } - - async function craftCctpTokenBurnMessage( - sourceCctpDomain: number, - cctpNonce: bigint, - amount: bigint, - overrides: { destinationCctpDomain?: number } = {}, - ) { - const { destinationCctpDomain: inputDestinationCctpDomain } = overrides; - - const messageTransmitterProgram = matchingEngine.messageTransmitterProgram(); - const { version, localDomain } = - await messageTransmitterProgram.fetchMessageTransmitterConfig( - messageTransmitterProgram.messageTransmitterConfigAddress(), - ); - const destinationCctpDomain = inputDestinationCctpDomain ?? localDomain; - - const tokenMessengerMinterProgram = matchingEngine.tokenMessengerMinterProgram(); - const { tokenMessenger: sourceTokenMessenger } = - await tokenMessengerMinterProgram.fetchRemoteTokenMessenger( - tokenMessengerMinterProgram.remoteTokenMessengerAddress(sourceCctpDomain), - ); - - const burnMessage = new CctpTokenBurnMessage( - { - version, - sourceDomain: sourceCctpDomain, - destinationDomain: destinationCctpDomain, - nonce: cctpNonce, - sender: sourceTokenMessenger, - recipient: Array.from(tokenMessengerMinterProgram.ID.toBuffer()), // targetTokenMessenger - targetCaller: Array.from(matchingEngine.custodianAddress().toBuffer()), // targetCaller - }, - 0, - Array.from(tryNativeToUint8Array(ETHEREUM_USDC_ADDRESS, "Ethereum")), // sourceTokenAddress - Array.from(matchingEngine.cctpMintRecipientAddress().toBuffer()), // mint recipient - amount, - new Array(32).fill(0), // burnSource - ); - - const encodedCctpMessage = burnMessage.encode(); - const cctpAttestation = new CircleAttester().createAttestation(encodedCctpMessage); - - return { - destinationCctpDomain, - burnMessage, - encodedCctpMessage, - cctpAttestation, - }; - } -}); - -// TODO: look into shared account swap w/ token ledger -const JUPITER_V6_TOKEN_LEDGERS = [ - new PublicKey("HtncvpUBGhSrs48KtC58ntJcTDw53sn78Lpq71zVwiez"), - new PublicKey("HxTk98CmBcxmtkrBWqRszYxrnDpqAsbitQBc2QjVBG3j"), - new PublicKey("CnUPHtfUVw3D2s4FB8H6QBuLwoes8YxauVgDtFybm7rz"), - new PublicKey("FhLPkpFmszHtSyyayj7KsXNZeBTqfQbUPmvgWAyJHBXh"), -]; diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts new file mode 100644 index 00000000..555e4c91 --- /dev/null +++ b/solana/ts/tests/10__swap.ts @@ -0,0 +1,1577 @@ +import * as splToken from "@solana/spl-token"; +import { + ComputeBudgetProgram, + Connection, + Keypair, + PublicKey, + Signer, + SystemProgram, + TransactionInstruction, +} from "@solana/web3.js"; +import { + FastMarketOrder, + SlowOrderResponse, +} from "@wormhole-foundation/example-liquidity-layer-definitions"; +import { CctpTokenBurnMessage } from "@wormhole-foundation/example-liquidity-layer-solana/cctp"; +import { + LiquidityLayerDeposit, + LiquidityLayerMessage, + Uint64, + uint64ToBigInt, +} from "@wormhole-foundation/example-liquidity-layer-solana/common"; +import * as matchingEngineSdk from "@wormhole-foundation/example-liquidity-layer-solana/matchingEngine"; +import { + CHAIN_TO_DOMAIN, + CircleAttester, + ETHEREUM_USDC_ADDRESS, + LOCALHOST, + MOCK_GUARDIANS, + OWNER_ASSISTANT_KEYPAIR, + OWNER_KEYPAIR, + PAYER_KEYPAIR, + REGISTERED_TOKEN_ROUTERS, + USDC_MINT_ADDRESS, + expectIxErr, + expectIxOk, + getBlockTime, + postLiquidityLayerVaa, + toUniversalAddress, +} from "@wormhole-foundation/example-liquidity-layer-solana/testing"; +import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; +import { VaaAccount } from "@wormhole-foundation/example-liquidity-layer-solana/wormhole"; +import { Chain, ChainId, toChainId } from "@wormhole-foundation/sdk-base"; +import { UniversalAddress, toUniversal } from "@wormhole-foundation/sdk-definitions"; +import { assert } from "chai"; +import * as fs from "fs"; +import * as jupiterV6 from "../src/jupiterV6"; +import { + OutputToken, + RedeemMode, + StagedOutboundInfo, + SwapLayerMessage, + SwapLayerProgram, + calculateRelayerFee, + decodeSwapLayerMessage, + denormalizeGasDropOff, + encodeOutputToken, + encodeSwapLayerMessage, + localnet, +} from "../src/swapLayer"; +import { + FEE_UPDATER_KEYPAIR, + REGISTERED_PEERS, + USDT_MINT_ADDRESS, + createLut, + tryNativeToUint8Array, + whichTokenProgram, +} from "./helpers"; + +const JUPITER_V6_LUT_ADDRESSES = [ + new PublicKey("GxS6FiQ3mNnAar9HGQ6mxP7t6FcwmHkU7peSeQDUHmpN"), + new PublicKey("HsLPzBjqK3SUKQZwHdd2QHVc9cioPrsHNw9GcUDs7WL7"), +]; + +describe("Jupiter V6 Testing", () => { + const connection = new Connection(LOCALHOST, "processed"); + + const payer = PAYER_KEYPAIR; + const relayer = Keypair.generate(); + const owner = OWNER_KEYPAIR; + const ownerAssistant = OWNER_ASSISTANT_KEYPAIR; + const feeUpdater = FEE_UPDATER_KEYPAIR; + + // Program SDKs + const swapLayer = new SwapLayerProgram(connection, localnet(), USDC_MINT_ADDRESS); + const tokenRouter = swapLayer.tokenRouterProgram(); + const matchingEngine = tokenRouter.matchingEngineProgram(); + + const luts: [PublicKey, PublicKey, PublicKey, PublicKey] = [ + PublicKey.default, + PublicKey.default, + JUPITER_V6_LUT_ADDRESSES[0], + JUPITER_V6_LUT_ADDRESSES[1], + ]; + + let testCctpNonce = 2n ** 64n - 1n; + + // Hack to prevent math overflow error when invoking CCTP programs. + testCctpNonce -= 100n * 6400n; + + let wormholeSequence = 10000n; + + describe("Jupiter V6 Setup", function () { + before("Generate ATAs", async function () { + for (const mint of [swapLayer.usdcMint, USDT_MINT_ADDRESS, splToken.NATIVE_MINT]) { + for (let i = 0; i < 8; ++i) { + const authority = jupiterV6.programAuthorityAddress(i); + + await expectIxOk( + connection, + [ + splToken.createAssociatedTokenAccountIdempotentInstruction( + payer.publicKey, + splToken.getAssociatedTokenAddressSync(mint, authority, true), + authority, + mint, + splToken.TOKEN_PROGRAM_ID, + ), + ], + [payer], + ); + } + } + + const payerWsol = splToken.getAssociatedTokenAddressSync( + splToken.NATIVE_MINT, + payer.publicKey, + false, + splToken.TOKEN_PROGRAM_ID, + ); + + await expectIxOk( + connection, + [ + splToken.createAssociatedTokenAccountInstruction( + payer.publicKey, + payerWsol, + payer.publicKey, + splToken.NATIVE_MINT, + splToken.TOKEN_PROGRAM_ID, + ), + SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: payerWsol, + lamports: 2_000_000_000_000n, + }), + splToken.createSyncNativeInstruction(payerWsol, splToken.TOKEN_PROGRAM_ID), + ], + [payer], + ); + }); + + after("Setup Lookup Tables", async function () { + luts[0] = await createLut( + connection, + payer, + await tokenRouter + .commonAccounts() + .then((accounts) => Object.values(accounts).filter((key) => key !== undefined)), + ); + + luts[1] = await createLut( + connection, + payer, + await matchingEngine + .commonAccounts() + .then((accounts) => Object.values(accounts).filter((key) => key !== undefined)), + ); + }); + + it("User Swap USDC to USDT From Simulated Quote -- Whirlpool", async function () { + await modifyUsdcToUsdtSwapResponseForTest(payer.publicKey, { + inAmount: 100_000_000n, + quotedOutAmount: 100_000_000n, + slippageBps: 50, + }).then(invokeSharedAccountsRouteAsUser); + }); + + it("User Swap USDT to USDC From Simulated Quote -- Whirlpool", async function () { + await modifyUsdtToUsdcSwapResponseForTest(payer.publicKey, { + inAmount: 50_000_000n, + quotedOutAmount: 50_000_000n, + slippageBps: 50, + }).then(invokeSharedAccountsRouteAsUser); + }); + + it("User Swap USDC to WSOL From Simulated Quote -- Phoenix V1", async function () { + await modifyUsdcToWsolSwapResponseForTest(payer.publicKey, { + inAmount: 150_000_000n, + quotedOutAmount: 1_000_000_000n, + slippageBps: 200, + }).then(invokeSharedAccountsRouteAsUser); + }); + + it("User Swap WSOL to USDC From Simulated Quote -- Phoenix V1", async function () { + await modifyWsolToUsdcSwapResponseForTest(payer.publicKey, { + inAmount: 1_000_000_000n, + quotedOutAmount: 150_000_000n, + slippageBps: 200, + }).then(invokeSharedAccountsRouteAsUser); + }); + + async function invokeSharedAccountsRouteAsUser( + modifyArgs: jupiterV6.ModifiedSharedAccountsRoute, + ) { + const { + instruction: ix, + sourceToken: srcToken, + destinationToken: dstToken, + minAmountOut, + } = modifyArgs; + + const { amount: srcBalanceBefore } = await splToken.getAccount(connection, srcToken); + const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); + + await expectIxOk(connection, [ix], [payer]); + + const decodedIxData = jupiterV6.decodeSharedAccountsRouteArgs(ix.data); + + const { amount: srcBalanceAfter } = await splToken.getAccount(connection, srcToken); + assert.strictEqual(srcBalanceBefore - srcBalanceAfter, decodedIxData.inAmount); + + const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); + assert.isTrue(dstBalanceAfter - dstBalanceBefore >= minAmountOut); + } + }); + + describe("USDC Transfer (Relay)", function () { + it("Outbound (USDT via Whirlpool)", async function () { + const srcMint = USDT_MINT_ADDRESS; + + const { + stagedOutbound, + stagedCustodyToken, + custodyBalance: inAmount, + stagedOutboundInfo, + redeemMode, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }, + { + redeemOption: { + relay: { gasDropoff: 500000, maxRelayerFee: 9999999999999n }, + }, + }, + ); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { + instruction: cpiInstruction, + sourceToken, + destinationToken, + sourceMint, + destinationMint, + minAmountOut, + } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 50, + cpi: true, + }); + assert.deepEqual(sourceMint, srcMint); + assert.deepEqual(destinationMint, swapLayer.usdcMint); + + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } + + const ix = await swapLayer.initiateSwapExactInIx( + { + payer: payer.publicKey, + stagedOutbound, + srcMint, + }, + { + cpiInstruction, + }, + ); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 360_000, + }); + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts, + }); + + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + stagedOutbound, + stagedCustodyToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } + + const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; + const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); + + const { info } = preparedOrderData; + assert.deepEqual( + preparedOrderData, + new tokenRouterSdk.PreparedOrder( + { + orderSender: swapLayer.custodianAddress(), + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, + }, + srcToken: destinationToken, + refundToken: usdcRefundToken, + targetChain, + redeemer, + preparedCustodyTokenBump: info.preparedCustodyTokenBump, + }, + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress(Uint8Array.from(recipient)), + redeemMode, + outputToken, + }), + ), + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder), + ); + assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + }); + + describe("Inbound", function () { + const emittedEvents: EmittedFilledLocalFastOrder[] = []; + let listenerId: number | null; + + before("Start Event Listener", async function () { + listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { + emittedEvents.push({ event, slot, signature }); + }); + }); + + after("Stop Event Listener", async function () { + if (listenerId !== null) { + matchingEngine.program.removeEventListener(listenerId!); + } + }); + }); + }); + + describe("USDC Transfer (Direct)", function () { + it("Outbound (USDT via Whirlpool)", async function () { + const srcMint = USDT_MINT_ADDRESS; + + const { + stagedOutbound, + stagedCustodyToken, + custodyBalance: inAmount, + stagedOutboundInfo, + redeemMode, + outputToken, + } = await stageOutboundForTest({ + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { + instruction: cpiInstruction, + sourceToken, + destinationToken, + sourceMint, + destinationMint, + minAmountOut, + } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 50, + cpi: true, + }); + assert.deepEqual(sourceMint, srcMint); + assert.deepEqual(destinationMint, swapLayer.usdcMint); + + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } + + const ix = await swapLayer.initiateSwapExactInIx( + { + payer: payer.publicKey, + stagedOutbound, + srcMint, + }, + { + cpiInstruction, + }, + ); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 360_000, + }); + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + await expectIxOk(connection, [computeIx, ix], [payer], { addressLookupTableAccounts }); + + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + stagedOutbound, + stagedCustodyToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } + + const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; + const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); + + const { info } = preparedOrderData; + assert.deepEqual( + preparedOrderData, + new tokenRouterSdk.PreparedOrder( + { + orderSender: swapLayer.custodianAddress(), + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, + }, + srcToken: destinationToken, + refundToken: usdcRefundToken, + targetChain, + redeemer, + preparedCustodyTokenBump: info.preparedCustodyTokenBump, + }, + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress(Uint8Array.from(recipient)), + redeemMode, + outputToken, + }), + ), + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder), + ); + assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + }); + + describe("Inbound", function () { + const emittedEvents: EmittedFilledLocalFastOrder[] = []; + let listenerId: number | null; + + before("Start Event Listener", async function () { + listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { + emittedEvents.push({ event, slot, signature }); + }); + }); + + after("Stop Event Listener", async function () { + if (listenerId !== null) { + matchingEngine.program.removeEventListener(listenerId!); + } + }); + + it("Other (USDT) via Whirlpool", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 15, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + amountIn, + }, + ); + + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + }, + ); + }); + + it("Other (WSOL) via Phoenix V1", async function () { + const dstMint = splToken.NATIVE_MINT; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + dstMint, + slippageBps: 150, + }); + + const amountIn = 300_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + amountIn, + }, + ); + + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + ); + }); + + it("Gas via Phoenix V1", async function () { + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + slippageBps: 150, + }); + + const amountIn = 300_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + outputToken, + amountIn, + }, + ); + + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + ); + }); + }); + + describe("USDC Transfer (Payload)", function () { + it("Outbound (USDT via Whirlpool)", async function () { + const srcMint = USDT_MINT_ADDRESS; + + const { + stagedOutbound, + stagedCustodyToken, + custodyBalance: inAmount, + stagedOutboundInfo, + redeemMode, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }, + { + redeemOption: { + payload: Buffer.from("All your base are belong to us."), + }, + }, + ); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { + instruction: cpiInstruction, + sourceToken, + destinationToken, + sourceMint, + destinationMint, + minAmountOut, + } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 50, + cpi: true, + }); + assert.deepEqual(sourceMint, srcMint); + assert.deepEqual(destinationMint, swapLayer.usdcMint); + + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } + + const ix = await swapLayer.initiateSwapExactInIx( + { + payer: payer.publicKey, + stagedOutbound, + srcMint, + }, + { + cpiInstruction, + }, + ); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 360_000, + }); + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts, + }); + + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + stagedOutbound, + stagedCustodyToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } + + const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; + const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); + + const { info } = preparedOrderData; + assert.deepEqual( + preparedOrderData, + new tokenRouterSdk.PreparedOrder( + { + orderSender: swapLayer.custodianAddress(), + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, + }, + srcToken: destinationToken, + refundToken: usdcRefundToken, + targetChain, + redeemer, + preparedCustodyTokenBump: info.preparedCustodyTokenBump, + }, + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress(Uint8Array.from(recipient)), + redeemMode, + outputToken, + }), + ), + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder), + ); + assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + }); + + describe("Inbound", function () { + const emittedEvents: EmittedFilledLocalFastOrder[] = []; + let listenerId: number | null; + + before("Start Event Listener", async function () { + listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { + emittedEvents.push({ event, slot, signature }); + }); + }); + + after("Stop Event Listener", async function () { + if (listenerId !== null) { + matchingEngine.program.removeEventListener(listenerId!); + } + }); + }); + }); + }); + + function newQuotedSwapOutputToken(opts: { + quotedAmountOut: bigint; + dstMint?: PublicKey | null; + slippageBps?: number; + deadline?: number; + dexProgramId?: PublicKey | null; + }) { + const { quotedAmountOut } = opts; + + let { dstMint, slippageBps, deadline, dexProgramId } = opts; + dstMint ??= null; + slippageBps ??= 0; + deadline ??= 0; + dexProgramId ??= null; + + const limitAmount = (quotedAmountOut * (10000n - BigInt(slippageBps))) / 10000n; + const swap = { + deadline, + limitAmount, + type: { + id: "JupiterV6", + dexProgramId: + dexProgramId === null + ? { isSome: false } + : { + isSome: true, + address: toUniversal("Solana", dexProgramId.toString()), + }, + }, + }; + return { + limitAmount, + outputToken: (dstMint === null + ? { type: "Gas", swap } + : { + type: "Other", + address: toUniversal("Solana", dstMint.toString()), + swap, + }) as OutputToken, + }; + } + + async function completeSwapDirectForTest( + accounts: { + payer: PublicKey; + preparedFill: PublicKey; + recipient: PublicKey; + dstMint?: PublicKey; + }, + opts: ForTestOpts & { + limitAmount: bigint; + swapResponseModifier: ( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ) => Promise; + }, + ): Promise { + const [{ signers, errorMsg }, otherOpts] = setDefaultForTestOpts(opts); + const { limitAmount, swapResponseModifier } = otherOpts; + + const { instruction: cpiInstruction, destinationMint } = await swapResponseModifier( + swapLayer.swapAuthorityAddress(accounts.preparedFill), + { + cpi: true, + }, + ); + const expectedDstMint = accounts.dstMint ?? splToken.NATIVE_MINT; + assert.deepEqual(destinationMint, expectedDstMint); + + const ix = await swapLayer.completeSwapDirectIx(accounts, { cpiInstruction }); + + const ixs = [ + ComputeBudgetProgram.setComputeUnitLimit({ + units: 420_000, + }), + ix, + ]; + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + if (errorMsg !== null) { + await expectIxErr(connection, ixs, signers, errorMsg, { + addressLookupTableAccounts, + }); + return; + } + + const { redeemerMessage } = await tokenRouter.fetchPreparedFill(accounts.preparedFill); + const outputToken = decodeSwapLayerMessage(redeemerMessage).outputToken; + + if (outputToken.type === "Gas") { + const balanceBefore = await connection.getBalance(accounts.recipient).then(BigInt); + + await expectIxOk(connection, ixs, signers, { + addressLookupTableAccounts, + }); + + const balanceAfter = await connection.getBalance(accounts.recipient).then(BigInt); + assert.isTrue(balanceAfter - balanceBefore >= limitAmount); + } else if (outputToken.type === "Other") { + const dstToken = splToken.getAssociatedTokenAddressSync( + expectedDstMint, + accounts.recipient, + false, + await whichTokenProgram(connection, expectedDstMint), + ); + const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); + + await expectIxOk(connection, ixs, signers, { + addressLookupTableAccounts, + }); + + const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); + assert.isTrue(dstBalanceAfter - dstBalanceBefore >= limitAmount); + } else { + assert.fail("Invalid output token type"); + } + } + + async function redeemSwapLayerFastFillForTest( + accounts: { payer: PublicKey }, + emittedEvents: EmittedFilledLocalFastOrder[], + opts: ObserveCctpOrderVaasOpts & { + dstMint?: PublicKey; + recipient?: PublicKey; + redeemMode?: RedeemMode; + outputToken?: OutputToken; + }, + ) { + let { dstMint, recipient, redeemMode, outputToken } = opts; + dstMint ??= splToken.NATIVE_MINT; + recipient ??= Keypair.generate().publicKey; + redeemMode ??= { mode: "Direct" }; + outputToken ??= { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "JupiterV6", + dexProgramId: { isSome: false }, + }, + }, + }; + + // Generate a new token account for recipient. + const tokenProgram = await whichTokenProgram(connection, dstMint); + const recipientToken = splToken.getAssociatedTokenAddressSync( + dstMint, + recipient, + false, + tokenProgram, + ); + + await expectIxOk( + connection, + [ + splToken.createAssociatedTokenAccountInstruction( + payer.publicKey, + recipientToken, + recipient, + dstMint, + tokenProgram, + ), + ], + [payer], + ); + + const msg = { + recipient: toUniversal("Solana", recipient.toString()), + redeemMode, + outputToken, + } as SwapLayerMessage; + + // Override redeemer message if undefined. + if (opts.redeemerMessage === undefined) { + opts.redeemerMessage = encodeSwapLayerMessage(msg); + } + + const settleResult = await settleAuctionNoneLocalForTest( + { payer: payer.publicKey }, + emittedEvents, + opts, + ); + const { + event: { + seeds: { sourceChain, orderSender, sequence }, + }, + } = settleResult!; + + const fastFill = matchingEngine.fastFillAddress( + toChainId(sourceChain), + orderSender, + sequence, + ); + + const ix = await tokenRouter.redeemFastFillIx({ + ...accounts, + fastFill, + }); + + await expectIxOk(connection, [ix], [payer]); + + const preparedFill = tokenRouter.preparedFillAddress(fastFill); + const { redeemerMessage } = await tokenRouter.fetchPreparedFill(preparedFill); + assert.deepEqual(decodeSwapLayerMessage(redeemerMessage), msg); + + return { preparedFill, recipient }; + } + + async function modifyUsdcToUsdtSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): Promise { + const response = JSON.parse( + fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/whirlpool_usdc_to_usdt.json`, { + encoding: "utf-8", + }), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction( + connection, + response, + tokenOwner, + opts, + ); + } + + async function modifyUsdtToUsdcSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): Promise { + const response = JSON.parse( + fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/whirlpool_usdt_to_usdc.json`, { + encoding: "utf-8", + }), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction( + connection, + response, + tokenOwner, + opts, + ); + } + + async function modifyUsdcToWsolSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): Promise { + const response = JSON.parse( + fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/phoenix_v1_usdc_to_wsol.json`, { + encoding: "utf-8", + }), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction( + connection, + response, + tokenOwner, + opts, + ); + } + + async function modifyWsolToUsdcSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): Promise { + const response = JSON.parse( + fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/phoenix_v1_wsol_to_usdc.json`, { + encoding: "utf-8", + }), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction( + connection, + response, + tokenOwner, + opts, + ); + } + + type PrepareOrderResponseForTestOptionalOpts = { + args?: matchingEngineSdk.CctpMessageArgs; + }; + + async function prepareOrderResponseCctpForTest( + accounts: { + payer: PublicKey; + }, + opts: ObserveCctpOrderVaasOpts & PrepareOrderResponseForTestOptionalOpts, + ): Promise< + | undefined + | { + fastVaa: PublicKey; + finalizedVaa: PublicKey; + args: matchingEngineSdk.CctpMessageArgs; + preparedOrderResponse: PublicKey; + prepareOrderResponseInstruction?: TransactionInstruction; + } + > { + let { args } = opts; + + const { fastVaa, fastVaaAccount, finalizedVaa } = await (async () => { + const { fast, finalized } = await observeCctpOrderVaas(opts); + args ??= finalized!.cctp; + + return { + fastVaa: fast.vaa, + fastVaaAccount: fast.vaaAccount, + finalizedVaa: finalized!.vaa, + }; + })(); + + const ix = await matchingEngine.prepareOrderResponseCctpIx( + { + payer: accounts.payer, + fastVaa, + finalizedVaa, + }, + args!, + ); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 280_000, + }); + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const { value } = await connection.getAddressLookupTable(lookupTableAddress); + + return value; + }), + ); + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts, + }); + + return { + fastVaa, + finalizedVaa, + args: args!, + preparedOrderResponse: matchingEngine.preparedOrderResponseAddress( + fastVaaAccount.digest(), + ), + }; + } + + async function reserveFastFillSequenceNoAuctionForTest( + accounts: { + payer: PublicKey; + fastVaa?: PublicKey; + auction?: PublicKey; + preparedOrderResponse?: PublicKey; + }, + opts: ObserveCctpOrderVaasOpts, + ): Promise< + | undefined + | { + fastVaa: PublicKey; + fastVaaAccount: VaaAccount; + reservedSequence: PublicKey; + finalizedVaa?: PublicKey; + finalizedVaaAccount?: VaaAccount; + } + > { + let preparedOrderResponse: PublicKey | undefined; + const { fastVaa, fastVaaAccount, finalizedVaa, finalizedVaaAccount } = await (async () => { + if (accounts.preparedOrderResponse === undefined) { + const result = await prepareOrderResponseCctpForTest( + { + payer: accounts.payer, + }, + opts, + ); + const { fastVaa, finalizedVaa } = result!; + preparedOrderResponse = result!.preparedOrderResponse; + + return { + fastVaa, + fastVaaAccount: await VaaAccount.fetch(connection, fastVaa), + finalizedVaa: finalizedVaa, + finalizedVaaAccount: await VaaAccount.fetch(connection, finalizedVaa), + }; + } else if (accounts.fastVaa !== undefined) { + preparedOrderResponse = accounts.preparedOrderResponse; + return { + fastVaa: accounts.fastVaa, + fastVaaAccount: await VaaAccount.fetch(connection, accounts.fastVaa), + }; + } else { + throw new Error("fastVaa must be defined if preparedOrderResponse is defined"); + } + })(); + + const ix = await matchingEngine.reserveFastFillSequenceNoAuctionIx({ + ...accounts, + fastVaa: accounts.fastVaa ?? fastVaa, + preparedOrderResponse, + }); + + await expectIxOk(connection, [ix], [payer]); + + return { + fastVaa, + fastVaaAccount, + reservedSequence: matchingEngine.reservedFastFillSequenceAddress( + fastVaaAccount.digest(), + ), + finalizedVaa, + finalizedVaaAccount, + }; + } + + type EmittedFilledLocalFastOrder = { + event: matchingEngineSdk.LocalFastOrderFilled; + slot: number; + signature: string; + }; + + async function settleAuctionNoneLocalForTest( + accounts: { + payer: PublicKey; + reservedSequence?: PublicKey; + }, + emittedEvents: EmittedFilledLocalFastOrder[], + opts: ObserveCctpOrderVaasOpts, + ): Promise { + const reserveResult = await reserveFastFillSequenceNoAuctionForTest( + { + payer: accounts.payer, + }, + opts, + ); + + const ix = await matchingEngine.settleAuctionNoneLocalIx({ + ...accounts, + reservedSequence: reserveResult!.reservedSequence, + }); + + await expectIxOk(connection, [ix], [payer]); + + // Check event. + while (emittedEvents.length == 0) { + console.log("waiting..."); + await new Promise((resolve) => setTimeout(resolve, 200)); + } + + return emittedEvents.shift()!; + } + + type ForTestOpts = { + signers?: Signer[]; + errorMsg?: string | null; + }; + + function setDefaultForTestOpts( + opts: T, + overrides: { + signers?: Signer[]; + } = {}, + ): [{ signers: Signer[]; errorMsg: string | null }, Omit] { + let { signers, errorMsg } = opts; + signers ??= overrides.signers ?? [payer]; + delete opts.signers; + + errorMsg ??= null; + delete opts.errorMsg; + + return [{ signers, errorMsg }, { ...opts }]; + } + + function newFastMarketOrder(args: { + redeemerMessage?: Uint8Array; + sender?: Array; + amountIn?: bigint; + minAmountOut?: bigint; + initAuctionFee?: bigint; + targetChain?: Chain; + maxFee?: bigint; + deadline?: number; + }): FastMarketOrder { + const { + amountIn, + targetChain, + minAmountOut, + maxFee, + initAuctionFee, + deadline, + redeemerMessage, + sender, + } = args; + + return { + amountIn: amountIn ?? 1_000_000_000n, + minAmountOut: minAmountOut ?? 0n, + targetChain: targetChain ?? "Solana", + redeemer: toUniversalAddress(swapLayer.custodianAddress().toBuffer()), + sender: toUniversalAddress(sender ?? REGISTERED_PEERS["Ethereum"]!), + refundAddress: toUniversalAddress(new Array(32).fill(3)), + maxFee: maxFee ?? 42069n, + initAuctionFee: initAuctionFee ?? 1_250_000n, + deadline: deadline ?? 0, + redeemerMessage: Buffer.from(redeemerMessage ?? Uint8Array.from([4, 20, 69])), + }; + } + + function newSlowOrderResponse(args: { baseFee?: bigint } = {}): SlowOrderResponse { + const { baseFee } = args; + + return { + baseFee: baseFee ?? 420n, + }; + } + + type VaaResult = { + vaa: PublicKey; + vaaAccount: VaaAccount; + }; + + type FastObservedResult = VaaResult & { + fastMarketOrder: FastMarketOrder; + }; + + type FinalizedObservedResult = VaaResult & { + slowOrderResponse: SlowOrderResponse; + cctp: matchingEngineSdk.CctpMessageArgs; + }; + + type ObserveCctpOrderVaasOpts = { + amountIn: bigint; + redeemerMessage?: Uint8Array; + sourceChain?: Chain; + emitter?: Array; + vaaTimestamp?: number; + fastMarketOrder?: FastMarketOrder; + finalized?: boolean; + slowOrderResponse?: SlowOrderResponse; + finalizedSourceChain?: Chain; + finalizedEmitter?: Array; + finalizedSequence?: bigint; + finalizedVaaTimestamp?: number; + }; + + async function observeCctpOrderVaas(opts: ObserveCctpOrderVaasOpts): Promise<{ + fast: FastObservedResult; + finalized?: FinalizedObservedResult; + }> { + let { + sourceChain, + emitter, + vaaTimestamp, + fastMarketOrder, + finalized, + slowOrderResponse, + finalizedSourceChain, + finalizedEmitter, + finalizedSequence, + finalizedVaaTimestamp, + } = opts; + sourceChain ??= "Ethereum"; + emitter ??= REGISTERED_TOKEN_ROUTERS[sourceChain] ?? new Array(32).fill(0); + vaaTimestamp ??= await getBlockTime(connection); + fastMarketOrder ??= newFastMarketOrder(opts); + finalized ??= true; + slowOrderResponse ??= newSlowOrderResponse(); + finalizedSourceChain ??= sourceChain; + finalizedEmitter ??= emitter; + finalizedSequence ??= finalized ? wormholeSequence++ : 0n; + finalizedVaaTimestamp ??= vaaTimestamp; + + const sourceCctpDomain = CHAIN_TO_DOMAIN[sourceChain]; + if (sourceCctpDomain === undefined) { + throw new Error(`Invalid source chain: ${sourceChain}`); + } + + const fastVaa = await postLiquidityLayerVaa( + connection, + payer, + MOCK_GUARDIANS, + emitter, + wormholeSequence++, + new LiquidityLayerMessage({ + fastMarketOrder, + }), + { sourceChain, timestamp: vaaTimestamp }, + ); + const fastVaaAccount = await VaaAccount.fetch(connection, fastVaa); + const fast = { fastMarketOrder, vaa: fastVaa, vaaAccount: fastVaaAccount }; + + if (finalized) { + const { amountIn: amount } = fastMarketOrder; + const cctpNonce = testCctpNonce++; + + // Concoct a Circle message. + const { destinationCctpDomain, burnMessage, encodedCctpMessage, cctpAttestation } = + await craftCctpTokenBurnMessage(sourceCctpDomain, cctpNonce, amount); + + const finalizedMessage = new LiquidityLayerMessage({ + deposit: new LiquidityLayerDeposit({ + tokenAddress: toUniversalAddress(burnMessage.burnTokenAddress), + amount, + sourceCctpDomain, + destinationCctpDomain, + cctpNonce, + burnSource: toUniversalAddress(Buffer.alloc(32, "beefdead", "hex")), + mintRecipient: toUniversalAddress( + matchingEngine.cctpMintRecipientAddress().toBuffer(), + ), + payload: { id: 2, ...slowOrderResponse }, + }), + }); + + const finalizedVaa = await postLiquidityLayerVaa( + connection, + payer, + MOCK_GUARDIANS, + finalizedEmitter, + finalizedSequence, + finalizedMessage, + { sourceChain: finalizedSourceChain, timestamp: finalizedVaaTimestamp }, + ); + const finalizedVaaAccount = await VaaAccount.fetch(connection, finalizedVaa); + return { + fast, + finalized: { + slowOrderResponse, + vaa: finalizedVaa, + vaaAccount: finalizedVaaAccount, + cctp: { + encodedCctpMessage, + cctpAttestation, + }, + }, + }; + } else { + return { fast }; + } + } + + async function craftCctpTokenBurnMessage( + sourceCctpDomain: number, + cctpNonce: bigint, + amount: bigint, + overrides: { destinationCctpDomain?: number } = {}, + ) { + const { destinationCctpDomain: inputDestinationCctpDomain } = overrides; + + const messageTransmitterProgram = matchingEngine.messageTransmitterProgram(); + const { version, localDomain } = + await messageTransmitterProgram.fetchMessageTransmitterConfig( + messageTransmitterProgram.messageTransmitterConfigAddress(), + ); + const destinationCctpDomain = inputDestinationCctpDomain ?? localDomain; + + const tokenMessengerMinterProgram = matchingEngine.tokenMessengerMinterProgram(); + const { tokenMessenger: sourceTokenMessenger } = + await tokenMessengerMinterProgram.fetchRemoteTokenMessenger( + tokenMessengerMinterProgram.remoteTokenMessengerAddress(sourceCctpDomain), + ); + + const burnMessage = new CctpTokenBurnMessage( + { + version, + sourceDomain: sourceCctpDomain, + destinationDomain: destinationCctpDomain, + nonce: cctpNonce, + sender: sourceTokenMessenger, + recipient: Array.from(tokenMessengerMinterProgram.ID.toBuffer()), // targetTokenMessenger + targetCaller: Array.from(matchingEngine.custodianAddress().toBuffer()), // targetCaller + }, + 0, + Array.from(tryNativeToUint8Array(ETHEREUM_USDC_ADDRESS, "Ethereum")), // sourceTokenAddress + Array.from(matchingEngine.cctpMintRecipientAddress().toBuffer()), // mint recipient + amount, + new Array(32).fill(0), // burnSource + ); + + const encodedCctpMessage = burnMessage.encode(); + const cctpAttestation = new CircleAttester().createAttestation(encodedCctpMessage); + + return { + destinationCctpDomain, + burnMessage, + encodedCctpMessage, + cctpAttestation, + }; + } + + async function stageOutboundForTest( + accounts: { + payer: PublicKey; + senderToken: PublicKey; + srcMint: PublicKey; + }, + opts: { + amountIn?: bigint; + targetChain?: ChainId; + redeemOption?: + | { relay: { gasDropoff: number; maxRelayerFee: Uint64 } } + | { payload: Uint8Array | Buffer } + | null; + outputToken?: OutputToken | null; + } = {}, + ): Promise<{ + amountIn: bigint; + stagedOutbound: PublicKey; + stagedCustodyToken: PublicKey; + custodyBalance: bigint; + stagedOutboundInfo: StagedOutboundInfo; + redeemMode: RedeemMode; + outputToken: OutputToken; + }> { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + let { amountIn, targetChain, redeemOption, outputToken } = opts; + amountIn ??= 690000n; + targetChain ??= toChainId("Ethereum"); + redeemOption ??= null; + outputToken ??= null; + + const { owner: sender } = await splToken.getAccount(connection, accounts.senderToken); + const usdcRefundToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + sender, + false, + splToken.TOKEN_PROGRAM_ID, + ); + + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + ...accounts, + stagedOutbound, + usdcRefundToken, + }, + { + transferType: "sender", + amountIn, + targetChain, + recipient: Array.from(Buffer.alloc(32, "deadbeef")), + redeemOption, + outputToken, + }, + ); + assert.isNull(approveIx); + + await expectIxOk(connection, [ix], [payer, stagedOutboundSigner]); + + const stagedCustodyToken = swapLayer.stagedCustodyTokenAddress(stagedOutbound); + const { amount: custodyBalance } = await splToken.getAccount( + connection, + stagedCustodyToken, + ); + + const { info: stagedOutboundInfo } = await swapLayer.fetchStagedOutbound(stagedOutbound); + + // Fix output token if null. + outputToken = outputToken === null ? { type: "Usdc" } : outputToken; + + const redeemMode = await (async (): Promise => { + if (redeemOption === null) { + return { mode: "Direct" }; + } else if ("relay" in redeemOption) { + const { gasDropoff } = redeemOption.relay; + + const { relayParams } = await swapLayer.fetchPeer(targetChain); + const expectedRelayerFee = calculateRelayerFee( + relayParams, + denormalizeGasDropOff(gasDropoff), + outputToken, + ); + + return { + mode: "Relay", + gasDropoff, + relayingFee: expectedRelayerFee, + }; + } else if ("payload" in redeemOption) { + return { + mode: "Payload", + payload: redeemOption.payload, + }; + } else { + throw new Error("Invalid redeem option"); + } + })(); + + return { + amountIn, + stagedOutbound, + stagedCustodyToken, + custodyBalance, + stagedOutboundInfo, + redeemMode, + outputToken, + }; + } +}); + +// TODO: look into shared account swap w/ token ledger +const JUPITER_V6_TOKEN_LEDGERS = [ + new PublicKey("HtncvpUBGhSrs48KtC58ntJcTDw53sn78Lpq71zVwiez"), + new PublicKey("HxTk98CmBcxmtkrBWqRszYxrnDpqAsbitQBc2QjVBG3j"), + new PublicKey("CnUPHtfUVw3D2s4FB8H6QBuLwoes8YxauVgDtFybm7rz"), + new PublicKey("FhLPkpFmszHtSyyayj7KsXNZeBTqfQbUPmvgWAyJHBXh"), +]; diff --git a/solana/ts/tests/accounts/jupiter/jupiter_lut1.json b/solana/ts/tests/accounts/jupiter/jupiter_v6_lut_1.json similarity index 100% rename from solana/ts/tests/accounts/jupiter/jupiter_lut1.json rename to solana/ts/tests/accounts/jupiter/jupiter_v6_lut_1.json diff --git a/solana/ts/tests/accounts/jupiter/jupiter_v6_lut_2.json b/solana/ts/tests/accounts/jupiter/jupiter_v6_lut_2.json new file mode 100644 index 00000000..8c071a37 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter/jupiter_v6_lut_2.json @@ -0,0 +1,14 @@ +{ + "pubkey": "HsLPzBjqK3SUKQZwHdd2QHVc9cioPrsHNw9GcUDs7WL7", + "account": { + "lamports": 57628800, + "data": [ + "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", + "base64" + ], + "owner": "AddressLookupTab1e1111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 8152 + } +} \ No newline at end of file diff --git a/solana/ts/tests/helpers/utils.ts b/solana/ts/tests/helpers/utils.ts index 7ca27c77..6b5e5f56 100644 --- a/solana/ts/tests/helpers/utils.ts +++ b/solana/ts/tests/helpers/utils.ts @@ -33,3 +33,8 @@ export async function createLut(connection: Connection, payer: Keypair, addresse return lookupTable; } + +export async function whichTokenProgram(connection: Connection, interfaceAccount: PublicKey) { + const accInfo = await connection.getAccountInfo(interfaceAccount); + return accInfo.owner; +} diff --git a/universal/rs/messages/src/types/mod.rs b/universal/rs/messages/src/types/mod.rs index 8263bf21..3e8a5bd4 100644 --- a/universal/rs/messages/src/types/mod.rs +++ b/universal/rs/messages/src/types/mod.rs @@ -14,9 +14,10 @@ use crate::wormhole_io::{Readable, Writeable, WriteableBytes}; #[cfg(feature = "anchor")] use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; -#[derive(Debug, Clone, PartialEq, Eq)] +#[derive(Debug, Default, Clone, PartialEq, Eq)] #[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] pub enum RedeemMode { + #[default] Direct, Payload(Vec), Relay { @@ -48,6 +49,23 @@ impl RedeemMode { } } +impl TryFrom<(u32, u64)> for RedeemMode { + type Error = >::Error; + + fn try_from((gas_dropoff, relaying_fee): (u32, u64)) -> Result { + Ok(Self::Relay { + gas_dropoff, + relaying_fee: relaying_fee.try_into()?, + }) + } +} + +impl From> for RedeemMode { + fn from(payload: Vec) -> Self { + Self::Payload(payload) + } +} + impl Readable for RedeemMode { fn read(reader: &mut R) -> io::Result where From 4ce0a942bd69141a7bbc88c8e6cfa3015ea6c887 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Thu, 23 May 2024 09:11:51 -0500 Subject: [PATCH 16/50] fix clippy (#45) * universal/rs: fix Cargo.toml * set working-directory --------- Co-authored-by: A5 Pickle --- .github/workflows/universal-rs.yml | 12 ++++++++---- universal/rs/Cargo.toml | 2 +- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/universal-rs.yml b/.github/workflows/universal-rs.yml index 5d191caf..bae8cc27 100644 --- a/.github/workflows/universal-rs.yml +++ b/.github/workflows/universal-rs.yml @@ -26,7 +26,8 @@ jobs: toolchain: ${{ matrix.rust }} - uses: Swatinem/rust-cache@v2 - name: test - run: cd universal/rs && cargo test --workspace --all-features + run: cargo test --all-features + working-directory: ./universal/rs clippy: name: clippy @@ -37,7 +38,8 @@ jobs: with: submodules: recursive - uses: dtolnay/rust-toolchain@clippy - - run: cd universal/rs && cargo clippy --workspace --all-targets --all-features + - run: cargo clippy --all-targets --all-features + working-directory: ./universal/rs env: RUSTFLAGS: -Dwarnings @@ -52,7 +54,8 @@ jobs: - uses: dtolnay/rust-toolchain@nightly with: components: rust-docs - - run: cd universal/rs && cargo doc --workspace --no-deps --document-private-items + - run: cargo doc --no-deps --document-private-items + working-directory: ./universal/rs env: RUSTDOCFLAGS: "--cfg docsrs -D warnings" @@ -67,4 +70,5 @@ jobs: - uses: dtolnay/rust-toolchain@nightly with: components: rustfmt - - run: cd universal/rs && cargo fmt --all --check \ No newline at end of file + - run: cargo fmt --all --check + working-directory: ./universal/rs \ No newline at end of file diff --git a/universal/rs/Cargo.toml b/universal/rs/Cargo.toml index 57e1784b..cdc27231 100644 --- a/universal/rs/Cargo.toml +++ b/universal/rs/Cargo.toml @@ -23,7 +23,7 @@ anchor-lang = "0.30.0" solana-program = "1.18.11" [workspace.lints.clippy] -correctness = { level = "warn"} +correctness = { level = "warn", priority = -1 } arithmetic_side_effects = "deny" as_conversions = "deny" From e114e9e55e540d439d124ddaf45eb772e165e7c8 Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Thu, 23 May 2024 09:36:13 -0500 Subject: [PATCH 17/50] solana: inbound swap with relay (#44) * solana: add instruction for inbound swaps with relay * solana: add self redeem tests --------- Co-authored-by: gator-boi --- .../programs/swap-layer/src/composite/mod.rs | 4 +- solana/programs/swap-layer/src/lib.rs | 10 + .../src/processor/complete/other/mod.rs | 3 + .../src/processor/complete/other/relay.rs | 292 ++++++++ solana/ts/src/swapLayer/index.ts | 59 ++ solana/ts/src/swapLayer/relayerFees.ts | 9 - solana/ts/tests/10__swap.ts | 675 ++++++++++++++---- 7 files changed, 888 insertions(+), 164 deletions(-) create mode 100644 solana/programs/swap-layer/src/processor/complete/other/relay.rs diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs index 91b22627..08c1ba96 100644 --- a/solana/programs/swap-layer/src/composite/mod.rs +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -316,7 +316,7 @@ pub struct CompleteSwap<'info> { true } )] - consume_swap_layer_fill: ConsumeSwapLayerFill<'info>, + pub consume_swap_layer_fill: ConsumeSwapLayerFill<'info>, /// CHECK: Seeds must be \["swap-authority", prepared_fill.key()\]. #[account( @@ -358,7 +358,7 @@ pub struct CompleteSwap<'info> { pub token_program: Program<'info, token::Token>, pub dst_token_program: Interface<'info, token_interface::TokenInterface>, associated_token_program: Program<'info, associated_token::AssociatedToken>, - system_program: Program<'info, System>, + pub system_program: Program<'info, System>, } impl<'info> CompleteSwap<'info> { diff --git a/solana/programs/swap-layer/src/lib.rs b/solana/programs/swap-layer/src/lib.rs index 8c3b3974..aa53fee1 100644 --- a/solana/programs/swap-layer/src/lib.rs +++ b/solana/programs/swap-layer/src/lib.rs @@ -147,4 +147,14 @@ pub mod swap_layer { { processor::complete_swap_direct(ctx, instruction_data) } + + pub fn complete_swap_relay<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapRelay<'info>>, + instruction_data: Vec, + ) -> Result<()> + where + 'c: 'info, + { + processor::complete_swap_relay(ctx, instruction_data) + } } diff --git a/solana/programs/swap-layer/src/processor/complete/other/mod.rs b/solana/programs/swap-layer/src/processor/complete/other/mod.rs index 6eab6471..b1a7d687 100644 --- a/solana/programs/swap-layer/src/processor/complete/other/mod.rs +++ b/solana/programs/swap-layer/src/processor/complete/other/mod.rs @@ -1,2 +1,5 @@ mod direct; pub use direct::*; + +mod relay; +pub use relay::*; diff --git a/solana/programs/swap-layer/src/processor/complete/other/relay.rs b/solana/programs/swap-layer/src/processor/complete/other/relay.rs new file mode 100644 index 00000000..129a4635 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/complete/other/relay.rs @@ -0,0 +1,292 @@ +use crate::utils::gas_dropoff; +use crate::{composite::*, error::SwapLayerError}; +use anchor_lang::prelude::*; +use anchor_spl::{associated_token, token}; +use swap_layer_messages::{ + messages::SwapMessageV1, + types::{JupiterV6SwapParameters, OutputSwap, OutputToken, RedeemMode, SwapType}, +}; + +#[derive(Accounts)] +pub struct CompleteSwapRelay<'info> { + complete_swap: CompleteSwap<'info>, + + #[account( + mut, + address = associated_token::get_associated_token_address( + &recipient.key(), + &complete_swap.dst_mint.key() + ) + )] + /// Recipient associated token account. The recipient authority check is necessary to ensure + /// that the recipient is the intended recipient of the bridged tokens. + /// + /// If OutputToken::Other, this account will be deserialized to ensure that the recipient is + /// the owner of this token account. + /// + /// CHECK: Mutable ATA whose owner is the recipient and mint is the destination mint. + recipient_token: UncheckedAccount<'info>, + + /// CHECK: This account must be the owner of the recipient token account. The recipient token + /// account must be encoded in the prepared fill. + #[account(mut)] + recipient: UncheckedAccount<'info>, + + #[account( + mut, + address = complete_swap.consume_swap_layer_fill.custodian.fee_recipient_token, + )] + fee_recipient_token: Account<'info, token::TokenAccount>, +} + +pub fn complete_swap_relay<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapRelay<'info>>, + instruction_data: Vec, +) -> Result<()> +where + 'c: 'info, +{ + let swap_msg = ctx.accounts.complete_swap.read_message_unchecked(); + + match swap_msg.redeem_mode { + RedeemMode::Relay { + gas_dropoff, + relaying_fee, + } => handle_complete_swap_relay( + ctx, + instruction_data, + swap_msg, + gas_dropoff::denormalize_gas_dropoff(gas_dropoff), + relaying_fee.into(), + ), + _ => err!(SwapLayerError::InvalidRedeemMode), + } +} + +pub fn handle_complete_swap_relay<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapRelay<'info>>, + instruction_data: Vec, + swap_msg: SwapMessageV1, + gas_dropoff: u64, + relaying_fee: u64, +) -> Result<()> +where + 'c: 'info, +{ + let SwapMessageV1 { + recipient: encoded_recipient, + redeem_mode: _, + output_token, + } = swap_msg; + + // Consume prepared fill. + let fill_amount = ctx.accounts.complete_swap.consume_prepared_fill()?; + let payer = &ctx.accounts.complete_swap.payer; + let recipient = &ctx.accounts.recipient; + + require_keys_eq!( + recipient.key(), + Pubkey::from(encoded_recipient), + SwapLayerError::InvalidRecipient + ); + + // Handle the relayer fee and gas dropoff. Override the relaying fee to zero + // if the payer is the recipient (self redemption). + let in_amount = { + if payer.key() == recipient.key() { + fill_amount + } else { + if gas_dropoff > 0 { + anchor_lang::system_program::transfer( + CpiContext::new( + ctx.accounts.complete_swap.system_program.to_account_info(), + anchor_lang::system_program::Transfer { + from: payer.to_account_info(), + to: recipient.to_account_info(), + }, + ), + gas_dropoff, + )?; + } + + if relaying_fee > 0 { + // Transfer eligible USDC to the fee recipient. + anchor_spl::token::transfer( + CpiContext::new_with_signer( + ctx.accounts.complete_swap.token_program.to_account_info(), + anchor_spl::token::Transfer { + from: ctx.accounts.complete_swap.src_swap_token.to_account_info(), + to: ctx.accounts.fee_recipient_token.to_account_info(), + authority: ctx.accounts.complete_swap.authority.to_account_info(), + }, + &[&[ + crate::SWAP_AUTHORITY_SEED_PREFIX, + &ctx.accounts.complete_swap.prepared_fill_key().as_ref(), + &[ctx.bumps.complete_swap.authority], + ]], + ), + relaying_fee, + )?; + } + + fill_amount + .checked_sub(relaying_fee) + .ok_or(SwapLayerError::InvalidRelayerFee)? + } + }; + + match output_token { + OutputToken::Gas(OutputSwap { + deadline: _, + limit_amount, + swap_type: SwapType::JupiterV6(swap_params), + }) => handle_complete_swap_direct_jup_v6( + ctx, + instruction_data, + (limit_amount.try_into().unwrap(), swap_params), + in_amount, + true, + ), + OutputToken::Other { + address: _, + swap: + OutputSwap { + deadline: _, + limit_amount, + swap_type: SwapType::JupiterV6(swap_params), + }, + } => handle_complete_swap_direct_jup_v6( + ctx, + instruction_data, + (limit_amount.try_into().unwrap(), swap_params), + in_amount, + false, + ), + _ => err!(SwapLayerError::InvalidOutputToken), + } +} + +fn handle_complete_swap_direct_jup_v6<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapRelay<'info>>, + ix_data: Vec, + limit_and_params: (u64, JupiterV6SwapParameters), + in_amount: u64, + is_native: bool, +) -> Result<()> +where + 'c: 'info, +{ + let swap_authority = &ctx.accounts.complete_swap.authority; + + let prepared_fill_key = &ctx.accounts.complete_swap.prepared_fill_key(); + let swap_authority_seeds = &[ + crate::SWAP_AUTHORITY_SEED_PREFIX, + prepared_fill_key.as_ref(), + &[ctx.bumps.complete_swap.authority], + ]; + + let (shared_accounts_route, mut swap_args, cpi_remaining_accounts) = + JupiterV6SharedAccountsRoute::set_up(ctx.remaining_accounts, &ix_data[..])?; + + // Verify remaining accounts. + { + require_keys_eq!( + shared_accounts_route.transfer_authority.key(), + swap_authority.key(), + SwapLayerError::InvalidSwapAuthority + ); + require_keys_eq!( + shared_accounts_route.src_custody_token.key(), + ctx.accounts.complete_swap.src_swap_token.key(), + SwapLayerError::InvalidSourceSwapToken + ); + require_keys_eq!( + shared_accounts_route.dst_custody_token.key(), + ctx.accounts.complete_swap.dst_swap_token.key(), + SwapLayerError::InvalidDestinationSwapToken + ); + require_keys_eq!( + shared_accounts_route.src_mint.key(), + common::USDC_MINT, + SwapLayerError::InvalidSourceMint + ); + require_keys_eq!( + shared_accounts_route.dst_mint.key(), + ctx.accounts.complete_swap.dst_mint.key(), + SwapLayerError::InvalidDestinationMint + ); + } + + msg!( + "Override in_amount: {}, quoted_out_amount: {}, slippage_bps: {}", + swap_args.in_amount, + swap_args.quoted_out_amount, + swap_args.slippage_bps + ); + swap_args.in_amount = in_amount; + swap_args.quoted_out_amount = limit_and_params.0; + swap_args.slippage_bps = 0; + + // Peek into the head of remaining accounts. This account will be the dex program that Jupiter + // V6 interacts with. If the swap params specify a specific dex program, we need to ensure that + // the one passed into this instruction handler is that. + if let Some(dex_program_id) = limit_and_params.1.dex_program_id { + require_eq!( + swap_args.route_plan.len(), + 1, + SwapLayerError::NotJupiterV6DirectRoute + ); + require_keys_eq!( + cpi_remaining_accounts[0].key(), + Pubkey::from(dex_program_id), + SwapLayerError::JupiterV6DexProgramMismatch + ); + } + + // Execute swap. + let amount_out = shared_accounts_route.swap_exact_in( + swap_args, + swap_authority_seeds, + cpi_remaining_accounts, + Some(limit_and_params.0), + )?; + + let recipient = &ctx.accounts.recipient; + + // We perform a token transfer if the output token is not gas. + if !is_native { + // Verify that the encoded owner is the actual owner. ATAs are no different from other token + // accounts, so anyone can set the authority of an ATA to be someone else. + { + let mut acc_data: &[_] = &ctx.accounts.recipient_token.data.borrow(); + let recipient_token_owner = + token::TokenAccount::try_deserialize(&mut acc_data).map(|token| token.owner)?; + require_keys_eq!( + recipient_token_owner, + recipient.key(), + ErrorCode::ConstraintTokenOwner, + ); + } + + // Transfer destination tokens to recipient. + token::transfer( + CpiContext::new_with_signer( + ctx.accounts.complete_swap.token_program.to_account_info(), + token::Transfer { + from: ctx.accounts.complete_swap.dst_swap_token.to_account_info(), + to: ctx.accounts.recipient_token.to_account_info(), + authority: swap_authority.to_account_info(), + }, + &[swap_authority_seeds], + ), + amount_out, + )?; + } + + // NOTE: If the output token is gas, lamports reflecting the WSOL amount will be transferred to + // the recipient's account. + ctx.accounts.complete_swap.close_swap_accounts( + &ctx.bumps.complete_swap, + ctx.accounts.recipient.to_account_info(), + ) +} diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 09fbe739..53ad98dc 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -956,6 +956,65 @@ export class SwapLayerProgram { .instruction(); } + async completeSwapRelayIx( + accounts: { + payer: PublicKey; + preparedFill: PublicKey; + recipient: PublicKey; + dstMint?: PublicKey; + beneficiary?: PublicKey; + dstTokenProgram?: PublicKey; + feeRecipientToken?: PublicKey; + }, + args: { + cpiInstruction: TransactionInstruction; + }, + ): Promise { + const { payer, preparedFill, recipient } = accounts; + const { cpiInstruction } = args; + + let { beneficiary, dstMint, dstTokenProgram, feeRecipientToken } = accounts; + beneficiary ??= payer; + dstMint ??= splToken.NATIVE_MINT; + feeRecipientToken ??= await this.fetchCustodian().then((c) => c.feeRecipientToken); + + const swapAccounts = await this.swapAccounts({ + preparedSource: preparedFill, + sourceMint: this.usdcMint, + destinationMint: dstMint, + srcTokenProgram: splToken.TOKEN_PROGRAM_ID, + dstTokenProgram, + }); + const { swapAuthority, srcSwapToken, dstSwapToken } = swapAccounts; + dstTokenProgram ??= swapAccounts.dstTokenProgram; + + return this.program.methods + .completeSwapRelay(cpiInstruction.data) + .accounts({ + completeSwap: { + payer, + consumeSwapLayerFill: await this.consumeSwapLayerFillComposite({ + preparedFill, + beneficiary, + }), + authority: swapAuthority, + srcSwapToken, + dstSwapToken, + usdc: this.usdcComposite(), + dstMint, + associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, + tokenProgram: splToken.TOKEN_PROGRAM_ID, + dstTokenProgram, + systemProgram: SystemProgram.programId, + }, + recipientToken: splToken.getAssociatedTokenAddressSync(dstMint, recipient), + recipient, + feeRecipientToken, + }) + .remainingAccounts(cpiInstruction.keys) + .instruction(); + } + tokenRouterProgram(): tokenRouterSdk.TokenRouterProgram { switch (this._programId) { case localnet(): { diff --git a/solana/ts/src/swapLayer/relayerFees.ts b/solana/ts/src/swapLayer/relayerFees.ts index eca73f0b..73494384 100644 --- a/solana/ts/src/swapLayer/relayerFees.ts +++ b/solana/ts/src/swapLayer/relayerFees.ts @@ -17,15 +17,6 @@ const GAS_DROPOFF_SCALAR = 1_000n; export const U32_MAX = 4294967295; const MAX_BPS = 1_000_000n; -// TODO: Need to implement serde for the following types. For now, we will use a dummy -// type to represent the swap type. -export type DestinationSwapType = { - none?: {}; - uniswapV3?: {}; - traderJoe?: {}; - jupiterV6?: {}; -}; - export function denormalizeGasDropOff(gasDropOff: number): bigint { return BigInt(gasDropOff) * GAS_DROPOFF_SCALAR; } diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index 555e4c91..bef9bf5c 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -34,12 +34,13 @@ import { expectIxErr, expectIxOk, getBlockTime, + getUsdcAtaBalance, postLiquidityLayerVaa, toUniversalAddress, } from "@wormhole-foundation/example-liquidity-layer-solana/testing"; import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; import { VaaAccount } from "@wormhole-foundation/example-liquidity-layer-solana/wormhole"; -import { Chain, ChainId, toChainId } from "@wormhole-foundation/sdk-base"; +import { Chain, ChainId, toChain, toChainId } from "@wormhole-foundation/sdk-base"; import { UniversalAddress, toUniversal } from "@wormhole-foundation/sdk-definitions"; import { assert } from "chai"; import * as fs from "fs"; @@ -75,10 +76,7 @@ describe("Jupiter V6 Testing", () => { const connection = new Connection(LOCALHOST, "processed"); const payer = PAYER_KEYPAIR; - const relayer = Keypair.generate(); - const owner = OWNER_KEYPAIR; - const ownerAssistant = OWNER_ASSISTANT_KEYPAIR; - const feeUpdater = FEE_UPDATER_KEYPAIR; + const testRecipient = Keypair.generate(); // Program SDKs const swapLayer = new SwapLayerProgram(connection, localnet(), USDC_MINT_ADDRESS); @@ -143,6 +141,11 @@ describe("Jupiter V6 Testing", () => { toPubkey: payerWsol, lamports: 2_000_000_000_000n, }), + SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: testRecipient.publicKey, + lamports: 2_000_000_000_000n, + }), splToken.createSyncNativeInstruction(payerWsol, splToken.TOKEN_PROGRAM_ID), ], [payer], @@ -224,7 +227,7 @@ describe("Jupiter V6 Testing", () => { } }); - describe("USDC Transfer (Relay)", function () { + describe("USDC Swap (Relay)", function () { it("Outbound (USDT via Whirlpool)", async function () { const srcMint = USDT_MINT_ADDRESS; @@ -372,10 +375,262 @@ describe("Jupiter V6 Testing", () => { matchingEngine.program.removeEventListener(listenerId!); } }); + + it("Other (USDT) via Whirlpool", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 100, + }); + + const gasDropoff = 100_000; // .1 SOL (10,000 * 1e3) + const relayingFee = 690000n; // .69 USDC + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee, + }, + amountIn, + }, + ); + + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + relayingFee, + denormGasDropoff: denormalizeGasDropOff(gasDropoff), + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + }, + ); + }); + + it("Other (USDT) via Whirlpool (Self Redeem)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 100, + }); + + const gasDropoff = 100_000; // .1 SOL (10,000 * 1e3) + const relayingFee = 690000n; // .69 USDC + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + recipient: testRecipient.publicKey, + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee, + }, + amountIn, + }, + ); + + // Use recipient as the payer. + await completeSwapRelayForTest( + { + payer: recipient, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + relayingFee, + denormGasDropoff: denormalizeGasDropOff(gasDropoff), + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + }, + { signers: [testRecipient] }, + ); + }); + + it("Other (WSOL) via Phoenix V1", async function () { + const dstMint = splToken.NATIVE_MINT; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + dstMint, + slippageBps: 150, + }); + + const gasDropoff = 100_000; // .1 SOL (10,000 * 1e3) + const relayingFee = 690000n; // .69 USDC + const amountIn = 300_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee, + }, + amountIn, + }, + ); + + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + relayingFee, + denormGasDropoff: denormalizeGasDropOff(gasDropoff), + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + ); + }); + + it("Other (WSOL) via Phoenix V1 (Self Redeem)", async function () { + const dstMint = splToken.NATIVE_MINT; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + dstMint, + slippageBps: 150, + }); + + const gasDropoff = 100_000; // .1 SOL (10,000 * 1e3) + const relayingFee = 690000n; // .69 USDC + const amountIn = 300_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + recipient: testRecipient.publicKey, + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee, + }, + amountIn, + }, + ); + + await completeSwapRelayForTest( + { + payer: recipient, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + relayingFee, + denormGasDropoff: denormalizeGasDropOff(gasDropoff), + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + { signers: [testRecipient] }, + ); + }); + + it("Gas via Phoenix V1", async function () { + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + slippageBps: 150, + }); + + const gasDropoff = 100_000; // .1 SOL (10,000 * 1e3) + const relayingFee = 690000n; // .69 USDC + const amountIn = 300_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee, + }, + amountIn, + }, + ); + + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + }, + { + limitAmount, + relayingFee, + denormGasDropoff: denormalizeGasDropOff(gasDropoff), + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + ); + }); + + it("Gas via Phoenix V1 (Self Redeem)", async function () { + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + slippageBps: 150, + }); + + const gasDropoff = 100_000; // .1 SOL (10,000 * 1e3) + const relayingFee = 690000n; // .69 USDC + const amountIn = 300_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + outputToken, + recipient: testRecipient.publicKey, + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee, + }, + amountIn, + }, + false, + ); + + await completeSwapRelayForTest( + { + payer: recipient, + preparedFill, + recipient, + }, + { + limitAmount, + relayingFee, + denormGasDropoff: denormalizeGasDropOff(gasDropoff), + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + { signers: [testRecipient] }, + ); + }); }); }); - describe("USDC Transfer (Direct)", function () { + describe("USDC Swap (Direct)", function () { it("Outbound (USDT via Whirlpool)", async function () { const srcMint = USDT_MINT_ADDRESS; @@ -610,155 +865,155 @@ describe("Jupiter V6 Testing", () => { ); }); }); + }); - describe("USDC Transfer (Payload)", function () { - it("Outbound (USDT via Whirlpool)", async function () { - const srcMint = USDT_MINT_ADDRESS; + describe("USDC Transfer (Payload)", function () { + it("Outbound (USDT via Whirlpool)", async function () { + const srcMint = USDT_MINT_ADDRESS; - const { - stagedOutbound, - stagedCustodyToken, - custodyBalance: inAmount, - stagedOutboundInfo, - redeemMode, - outputToken, - } = await stageOutboundForTest( - { - payer: payer.publicKey, - senderToken: splToken.getAssociatedTokenAddressSync( - srcMint, - payer.publicKey, - false, - await whichTokenProgram(connection, srcMint), - ), + const { + stagedOutbound, + stagedCustodyToken, + custodyBalance: inAmount, + stagedOutboundInfo, + redeemMode, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }, + { + redeemOption: { + payload: Buffer.from("All your base are belong to us."), }, - { - redeemOption: { - payload: Buffer.from("All your base are belong to us."), - }, - }, - ); + }, + ); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { + instruction: cpiInstruction, + sourceToken, + destinationToken, + sourceMint, + destinationMint, + minAmountOut, + } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 50, + cpi: true, + }); + assert.deepEqual(sourceMint, srcMint); + assert.deepEqual(destinationMint, swapLayer.usdcMint); - const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); - const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); - const { - instruction: cpiInstruction, + { + const accInfos = await connection.getMultipleAccountsInfo([ sourceToken, destinationToken, - sourceMint, - destinationMint, - minAmountOut, - } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { - inAmount, - quotedOutAmount: inAmount, // stable swap - slippageBps: 50, - cpi: true, - }); - assert.deepEqual(sourceMint, srcMint); - assert.deepEqual(destinationMint, swapLayer.usdcMint); + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } + const ix = await swapLayer.initiateSwapExactInIx( { - const accInfos = await connection.getMultipleAccountsInfo([ - sourceToken, - destinationToken, - ]); - assert.isTrue(accInfos.every((info) => info === null)); - } + payer: payer.publicKey, + stagedOutbound, + srcMint, + }, + { + cpiInstruction, + }, + ); - const ix = await swapLayer.initiateSwapExactInIx( - { - payer: payer.publicKey, - stagedOutbound, - srcMint, - }, - { - cpiInstruction, - }, - ); + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 360_000, + }); - const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ - units: 360_000, - }); + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); - const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { - const resp = await connection.getAddressLookupTable(lookupTableAddress); - return resp.value; - }), - ); + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts, + }); - await expectIxOk(connection, [computeIx, ix], [payer], { - addressLookupTableAccounts, - }); + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + stagedOutbound, + stagedCustodyToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } - { - const accInfos = await connection.getMultipleAccountsInfo([ - sourceToken, - destinationToken, - stagedOutbound, - stagedCustodyToken, - ]); - assert.isTrue(accInfos.every((info) => info === null)); - } + const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; + const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); - const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; - const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); - - // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); - - const { info } = preparedOrderData; - assert.deepEqual( - preparedOrderData, - new tokenRouterSdk.PreparedOrder( - { - orderSender: swapLayer.custodianAddress(), - preparedBy: payer.publicKey, - orderType: { - market: { - minAmountOut: null, - }, + const { info } = preparedOrderData; + assert.deepEqual( + preparedOrderData, + new tokenRouterSdk.PreparedOrder( + { + orderSender: swapLayer.custodianAddress(), + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, }, - srcToken: destinationToken, - refundToken: usdcRefundToken, - targetChain, - redeemer, - preparedCustodyTokenBump: info.preparedCustodyTokenBump, }, - Buffer.from( - encodeSwapLayerMessage({ - recipient: new UniversalAddress(Uint8Array.from(recipient)), - redeemMode, - outputToken, - }), - ), + srcToken: destinationToken, + refundToken: usdcRefundToken, + targetChain, + redeemer, + preparedCustodyTokenBump: info.preparedCustodyTokenBump, + }, + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress(Uint8Array.from(recipient)), + redeemMode, + outputToken, + }), ), - ); + ), + ); - // Verify the prepared custody token balance. - const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( - connection, - tokenRouter.preparedCustodyTokenAddress(preparedOrder), - ); - assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); - }); + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder), + ); + assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + }); - describe("Inbound", function () { - const emittedEvents: EmittedFilledLocalFastOrder[] = []; - let listenerId: number | null; + describe("Inbound", function () { + const emittedEvents: EmittedFilledLocalFastOrder[] = []; + let listenerId: number | null; - before("Start Event Listener", async function () { - listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { - emittedEvents.push({ event, slot, signature }); - }); + before("Start Event Listener", async function () { + listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { + emittedEvents.push({ event, slot, signature }); }); + }); - after("Stop Event Listener", async function () { - if (listenerId !== null) { - matchingEngine.program.removeEventListener(listenerId!); - } - }); + after("Stop Event Listener", async function () { + if (listenerId !== null) { + matchingEngine.program.removeEventListener(listenerId!); + } }); }); }); @@ -887,6 +1142,118 @@ describe("Jupiter V6 Testing", () => { } } + async function completeSwapRelayForTest( + accounts: { + payer: PublicKey; + preparedFill: PublicKey; + recipient: PublicKey; + dstMint?: PublicKey; + }, + opts: ForTestOpts & { + limitAmount: bigint; + relayingFee: bigint; + denormGasDropoff: bigint; + swapResponseModifier: ( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ) => Promise; + }, + overrides?: { signers: Signer[] }, + ): Promise { + const [{ signers, errorMsg }, otherOpts] = setDefaultForTestOpts(opts, overrides); + const { limitAmount, relayingFee, denormGasDropoff, swapResponseModifier } = otherOpts; + + const { instruction: cpiInstruction, destinationMint } = await swapResponseModifier( + swapLayer.swapAuthorityAddress(accounts.preparedFill), + { + cpi: true, + }, + ); + const expectedDstMint = accounts.dstMint ?? splToken.NATIVE_MINT; + assert.deepEqual(destinationMint, expectedDstMint); + + const ix = await swapLayer.completeSwapRelayIx(accounts, { cpiInstruction }); + + const ixs = [ + ComputeBudgetProgram.setComputeUnitLimit({ + units: 420_000, + }), + ix, + ]; + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + if (errorMsg !== null) { + await expectIxErr(connection, ixs, signers, errorMsg, { + addressLookupTableAccounts, + }); + return; + } + + const { redeemerMessage } = await tokenRouter.fetchPreparedFill(accounts.preparedFill); + const swapMsg = decodeSwapLayerMessage(redeemerMessage); + const selfRedeem = accounts.payer == accounts.recipient; + + // Fetch the balance of the fee recipient before the swap. + const feeRecipientToken = await swapLayer + .fetchCustodian() + .then((acc) => acc.feeRecipientToken); + const { amount: feeRecipientBefore } = await splToken.getAccount( + connection, + feeRecipientToken, + ); + + if (swapMsg.outputToken.type === "Gas") { + const balanceBefore = await connection.getBalance(accounts.recipient).then(BigInt); + + await expectIxOk(connection, ixs, signers, { + addressLookupTableAccounts, + }); + + const balanceAfter = await connection.getBalance(accounts.recipient).then(BigInt); + assert.isTrue( + balanceAfter - balanceBefore >= + (selfRedeem ? limitAmount : limitAmount + denormGasDropoff), + ); + } else if (swapMsg.outputToken.type === "Other") { + const dstToken = splToken.getAssociatedTokenAddressSync( + expectedDstMint, + accounts.recipient, + false, + await whichTokenProgram(connection, expectedDstMint), + ); + const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); + const balanceBefore = await connection.getBalance(accounts.recipient).then(BigInt); + + await expectIxOk(connection, ixs, signers, { + addressLookupTableAccounts, + }); + + const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); + + assert.isTrue(dstBalanceAfter - dstBalanceBefore >= limitAmount); + + if (!selfRedeem) { + const balanceAfter = await connection.getBalance(accounts.recipient).then(BigInt); + // TODO: Can we do a more accurate check? + assert.isTrue(balanceAfter - balanceBefore >= denormGasDropoff); + } + } else { + assert.fail("Invalid output token type"); + } + + const { amount: feeRecipientAfter } = await splToken.getAccount( + connection, + feeRecipientToken, + ); + assert.equal(feeRecipientAfter - feeRecipientBefore, selfRedeem ? 0 : relayingFee); + } + async function redeemSwapLayerFastFillForTest( accounts: { payer: PublicKey }, emittedEvents: EmittedFilledLocalFastOrder[], @@ -896,6 +1263,7 @@ describe("Jupiter V6 Testing", () => { redeemMode?: RedeemMode; outputToken?: OutputToken; }, + createRecipientAta = true, ) { let { dstMint, recipient, redeemMode, outputToken } = opts; dstMint ??= splToken.NATIVE_MINT; @@ -915,26 +1283,28 @@ describe("Jupiter V6 Testing", () => { // Generate a new token account for recipient. const tokenProgram = await whichTokenProgram(connection, dstMint); - const recipientToken = splToken.getAssociatedTokenAddressSync( - dstMint, - recipient, - false, - tokenProgram, - ); + if (createRecipientAta) { + const recipientToken = splToken.getAssociatedTokenAddressSync( + dstMint, + recipient, + false, + tokenProgram, + ); - await expectIxOk( - connection, - [ - splToken.createAssociatedTokenAccountInstruction( - payer.publicKey, - recipientToken, - recipient, - dstMint, - tokenProgram, - ), - ], - [payer], - ); + await expectIxOk( + connection, + [ + splToken.createAssociatedTokenAccountInstruction( + payer.publicKey, + recipientToken, + recipient, + dstMint, + tokenProgram, + ), + ], + [payer], + ); + } const msg = { recipient: toUniversal("Solana", recipient.toString()), @@ -1212,7 +1582,6 @@ describe("Jupiter V6 Testing", () => { // Check event. while (emittedEvents.length == 0) { - console.log("waiting..."); await new Promise((resolve) => setTimeout(resolve, 200)); } From 1957cffb7a40c440c4bd489122345440ebb8a9e0 Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Thu, 23 May 2024 13:06:17 -0500 Subject: [PATCH 18/50] solana: add time check for usdc relay (#47) Co-authored-by: gator-boi --- .../programs/swap-layer/src/composite/mod.rs | 2 +- solana/programs/swap-layer/src/error.rs | 2 + .../src/processor/complete/usdc/relay.rs | 39 +++++-- solana/programs/swap-layer/src/state/peer.rs | 12 ++ .../swap-layer/src/utils/relayer_fees.rs | 6 +- solana/ts/src/swapLayer/state/Peer.ts | 6 + solana/ts/tests/01__swapLayer.ts | 109 +++++++++++++++++- solana/ts/tests/10__swap.ts | 109 +++++++++++++++++- 8 files changed, 271 insertions(+), 14 deletions(-) diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs index 08c1ba96..868c50e0 100644 --- a/solana/programs/swap-layer/src/composite/mod.rs +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -196,7 +196,7 @@ pub struct ConsumeSwapLayerFill<'info> { #[account(mut)] fill_custody_token: Box>, - associated_peer: RegisteredPeer<'info>, + pub associated_peer: RegisteredPeer<'info>, /// CHECK: Recipient of lamports from closing the prepared_fill account. #[account(mut)] diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs index 2da3ec0d..5c45a58f 100644 --- a/solana/programs/swap-layer/src/error.rs +++ b/solana/programs/swap-layer/src/error.rs @@ -29,6 +29,8 @@ pub enum SwapLayerError { InvalidPreparedOrder = 0x112, InvalidFeeRecipient = 0x113, PayloadTooLarge = 0x114, + UnsupportedFillType = 0x115, + SwapTimeLimitNotExceeded = 0x116, // EVM Execution Param errors InvalidBaseFee = 0x200, diff --git a/solana/programs/swap-layer/src/processor/complete/usdc/relay.rs b/solana/programs/swap-layer/src/processor/complete/usdc/relay.rs index 47f11c99..21a66893 100644 --- a/solana/programs/swap-layer/src/processor/complete/usdc/relay.rs +++ b/solana/programs/swap-layer/src/processor/complete/usdc/relay.rs @@ -7,6 +7,7 @@ use crate::{ use anchor_lang::prelude::*; use anchor_spl::token; use swap_layer_messages::types::{OutputToken, RedeemMode}; +use token_router::state::FillType; #[derive(Accounts)] pub struct CompleteTransferRelay<'info> { @@ -24,13 +25,37 @@ pub struct CompleteTransferRelay<'info> { SwapLayerError::InvalidRecipient ); - require!( - matches!( - swap_msg.output_token, - OutputToken::Usdc - ), - SwapLayerError::InvalidOutputToken - ); + match swap_msg.output_token { + OutputToken::Usdc => {} + OutputToken::Gas(_) | OutputToken::Other { + address: _, + swap: _, + } => { + let time_diff = Clock::get()? + .unix_timestamp + .saturating_sub(consume_swap_layer_fill.fill.timestamp); + let swap_time_limit = &consume_swap_layer_fill + .associated_peer + .relay_params + .swap_time_limit; + + match consume_swap_layer_fill.fill.fill_type { + FillType::FastFill => { + require!( + time_diff > i64::from(swap_time_limit.fast_limit), + SwapLayerError::SwapTimeLimitNotExceeded + ); + } + FillType::WormholeCctpDeposit => { + require!( + time_diff > i64::from(swap_time_limit.finalized_limit), + SwapLayerError::SwapTimeLimitNotExceeded + ); + } + FillType::Unset => return Err(SwapLayerError::UnsupportedFillType.into()), + } + } + } true } diff --git a/solana/programs/swap-layer/src/state/peer.rs b/solana/programs/swap-layer/src/state/peer.rs index ac7a8432..753bba98 100644 --- a/solana/programs/swap-layer/src/state/peer.rs +++ b/solana/programs/swap-layer/src/state/peer.rs @@ -12,6 +12,14 @@ pub enum ExecutionParams { }, } +#[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize, InitSpace)] +pub struct SwapTimeLimit { + // Limit in seconds for fast fills. + pub fast_limit: u16, + // Limit in seconds for finalized fills. + pub finalized_limit: u16, +} + #[derive(Debug, Clone, InitSpace, AnchorSerialize, AnchorDeserialize)] pub struct RelayParams { // Atomic usdc (i.e. 6 decimals -> 1e6 = 1 usdc), max=disabled @@ -25,6 +33,10 @@ pub struct RelayParams { pub gas_dropoff_margin: u32, // Execution parameters specific to the target chain's execution environment. pub execution_params: ExecutionParams, + // Time limits for fast and finalized fills. If this timer is exceeded, the + // relayer will be allowed to execute the `complete_transfer_relay` for a + // message that is inteded to perform a swap. + pub swap_time_limit: SwapTimeLimit, } #[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize, InitSpace)] diff --git a/solana/programs/swap-layer/src/utils/relayer_fees.rs b/solana/programs/swap-layer/src/utils/relayer_fees.rs index a533c1fd..35452c31 100644 --- a/solana/programs/swap-layer/src/utils/relayer_fees.rs +++ b/solana/programs/swap-layer/src/utils/relayer_fees.rs @@ -182,7 +182,7 @@ mod test { UniswapSwapParameters, UniswapSwapPath, }; - use crate::state::{ExecutionParams, RelayParams}; + use crate::state::{ExecutionParams, RelayParams, SwapTimeLimit}; use super::*; @@ -355,6 +355,10 @@ mod test { gas_price: 10_000, // 10 GWEI gas_price_margin: 250_000, // 25% }, + swap_time_limit: SwapTimeLimit { + fast_limit: 10, + finalized_limit: 30, + }, } } } diff --git a/solana/ts/src/swapLayer/state/Peer.ts b/solana/ts/src/swapLayer/state/Peer.ts index 2857e5fd..d2ac9dca 100644 --- a/solana/ts/src/swapLayer/state/Peer.ts +++ b/solana/ts/src/swapLayer/state/Peer.ts @@ -15,6 +15,12 @@ export type RelayParams = { maxGasDropoff: number; gasDropoffMargin: number; executionParams: ExecutionParams; + swapTimeLimit: SwapTimeLimit; +}; + +export type SwapTimeLimit = { + fastLimit: number; + finalizedLimit: number; }; export type PeerSeeds = { diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__swapLayer.ts index b483b806..7ae19efe 100644 --- a/solana/ts/tests/01__swapLayer.ts +++ b/solana/ts/tests/01__swapLayer.ts @@ -41,7 +41,6 @@ import { Custodian, OutputToken, Peer, - RedeemOption, RelayParams, StagedInbound, StagedOutbound, @@ -97,6 +96,10 @@ describe("Swap Layer", () => { gasPriceMargin: 10000, }, }, + swapTimeLimit: { + fastLimit: 2, + finalizedLimit: 2, + }, }; let testCctpNonce = 2n ** 64n - 20n * 6400n; @@ -206,6 +209,10 @@ describe("Swap Layer", () => { gasPriceMargin: 50000, }, }, + swapTimeLimit: { + fastLimit: 420, + finalizedLimit: 690, + }, }; describe("Add", () => { @@ -929,6 +936,10 @@ describe("Swap Layer", () => { gasPriceMargin: 50000, }, }, + swapTimeLimit: { + fastLimit: 2, + finalizedLimit: 69, + }, }; const createUpdateRelayParamsIx = (opts?: { @@ -2241,7 +2252,8 @@ describe("Swap Layer", () => { await expectIxErr(connection, [transferIx], [payer], "InvalidPeer"); }); - it("Cannot Complete Transfer (Invalid Output Token)", async function () { + it("Cannot Complete Transfer (Swap Time Limit Not Exceeded)", async function () { + const currTime = await connection.getBlockTime(await connection.getSlot()); const result = await createAndRedeemCctpFillForTest( testCctpNonce++, foreignChain, @@ -2267,6 +2279,10 @@ describe("Swap Layer", () => { }, }, }), + { + vaaTimestamp: + currTime - relayParamsForTest.swapTimeLimit.finalizedLimit + 5, + }, ); const { vaa } = result!; const preparedFill = tokenRouter.preparedFillAddress(vaa); @@ -2280,7 +2296,12 @@ describe("Swap Layer", () => { foreignChain, ); - await expectIxErr(connection, [transferIx], [payer], "InvalidOutputToken"); + await expectIxErr( + connection, + [transferIx], + [payer], + "SwapTimeLimitNotExceeded", + ); }); it("Cannot Complete Transfer (Invalid Recipient)", async function () { @@ -2519,6 +2540,85 @@ describe("Swap Layer", () => { assert.isBelow(payerLamportAfter, payerLamportBefore - gasAmount); assert.equal(feeRecipientAfter, feeRecipientBefore + relayerFee); }); + + it("Complete Transfer With Gas Dropoff (Failed Encoded Swap)", async function () { + const relayerFee = 1000000n; + const gasAmountDenorm = 690000000; + const currTime = await connection.getBlockTime(await connection.getSlot()); + + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { + mode: "Relay", + gasDropoff: gasAmountDenorm / 1000, + relayingFee: relayerFee, + }, + outputToken: { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "JupiterV6", + dexProgramId: { isSome: false }, + }, + }, + }, + }), + { + vaaTimestamp: + currTime - relayParamsForTest.swapTimeLimit.finalizedLimit - 1, + }, + ); + const { vaa, message } = result!; + + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); + + // Balance check. + const recipientBefore = await getUsdcAtaBalance( + connection, + recipient.publicKey, + ); + const recipientLamportBefore = await connection.getBalance(recipient.publicKey); + const payerLamportBefore = await connection.getBalance(payer.publicKey); + const feeRecipientBefore = await getUsdcAtaBalance(connection, feeRecipient); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + recipient: recipient.publicKey, + }, + foreignChain, + ); + + await expectIxOk(connection, [transferIx], [payer]); + + // Balance check. + const recipientAfter = await getUsdcAtaBalance(connection, recipient.publicKey); + const recipientLamportAfter = await connection.getBalance(recipient.publicKey); + const payerLamportAfter = await connection.getBalance(payer.publicKey); + const feeRecipientAfter = await getUsdcAtaBalance(connection, feeRecipient); + + assert.equal( + recipientAfter - recipientBefore, + message.deposit!.message.amount - relayerFee, + ); + assert.equal(recipientLamportAfter - recipientLamportBefore, gasAmountDenorm); + assert.isBelow(payerLamportAfter, payerLamportBefore - gasAmountDenorm); + assert.equal(feeRecipientAfter, feeRecipientBefore + relayerFee); + }); }); }); @@ -3287,6 +3387,7 @@ describe("Swap Layer", () => { orderSender: number[], wormholeSequence: bigint, redeemerMessage: Buffer | Uint8Array, + args?: { vaaTimestamp?: number }, ): Promise { const encodedMintRecipient = Array.from(tokenRouter.cctpMintRecipientAddress().toBuffer()); const sourceCctpDomain = 0; @@ -3330,7 +3431,7 @@ describe("Swap Layer", () => { foreignEndpointAddress, wormholeSequence++, message, - { sourceChain: "Ethereum" }, + { sourceChain: "Ethereum", timestamp: args?.vaaTimestamp }, ); const ix = await tokenRouter.redeemCctpFillIx( diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index bef9bf5c..f3f693d3 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -376,6 +376,49 @@ describe("Jupiter V6 Testing", () => { } }); + it("Cannot Redeem USDC (Swap Time Limit Not Exceeded)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 100, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 0n, + }, + amountIn, + }, + ); + + await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + recipient, + ); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient, + }, + toChainId("Ethereum"), + ); + + await expectIxErr(connection, [transferIx], [payer], "SwapTimeLimitNotExceeded"); + }); + it("Other (USDT) via Whirlpool", async function () { const dstMint = USDT_MINT_ADDRESS; const { limitAmount, outputToken } = newQuotedSwapOutputToken({ @@ -627,6 +670,67 @@ describe("Jupiter V6 Testing", () => { { signers: [testRecipient] }, ); }); + + it("Redeem USDC (Failed Swap)", async function () { + // NOTE: This test assumes that the relayParams swapTimeLimit.fastLimit is set to + // 2 seconds. If that value changes for any reason, make sure to update this test. + + const dstMint = USDT_MINT_ADDRESS; + const { outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 100, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 0n, + }, + amountIn, + initAuctionFee: 0n, + baseFee: 0n, + }, + ); + + // Sleep for 3 seconds. + await new Promise((resolve) => setTimeout(resolve, 3000)); + + await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + recipient, + ); + + const beneficiary = Keypair.generate(); + + // Balance check. + const recipientBefore = await getUsdcAtaBalance(connection, recipient); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + recipient: recipient, + }, + toChainId("Ethereum"), + ); + + await expectIxOk(connection, [transferIx], [payer]); + + // Balance check. + const recipientAfter = await getUsdcAtaBalance(connection, recipient); + assert.equal(recipientAfter - recipientBefore, amountIn); + }); }); }); @@ -1668,6 +1772,8 @@ describe("Jupiter V6 Testing", () => { type ObserveCctpOrderVaasOpts = { amountIn: bigint; + baseFee?: bigint; + initAuctionFee?: bigint; redeemerMessage?: Uint8Array; sourceChain?: Chain; emitter?: Array; @@ -1686,6 +1792,7 @@ describe("Jupiter V6 Testing", () => { finalized?: FinalizedObservedResult; }> { let { + baseFee, sourceChain, emitter, vaaTimestamp, @@ -1702,7 +1809,7 @@ describe("Jupiter V6 Testing", () => { vaaTimestamp ??= await getBlockTime(connection); fastMarketOrder ??= newFastMarketOrder(opts); finalized ??= true; - slowOrderResponse ??= newSlowOrderResponse(); + slowOrderResponse ??= newSlowOrderResponse({ baseFee }); finalizedSourceChain ??= sourceChain; finalizedEmitter ??= emitter; finalizedSequence ??= finalized ? wormholeSequence++ : 0n; From 3caf161e2c96d1d19229c2f275b36abd67a57acb Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Thu, 23 May 2024 15:38:12 -0500 Subject: [PATCH 19/50] solana: complete swap payload (#48) * solana: fix bugs * solana: complete swap payload * solana: tomfoolery with staged inbound * solana: fix comment * solana: rename test file * solana: priority = -1 * solana: refactor complete swap * solana: propagate gas dropoff * solana: fix merge conflict; reorganize * solana: refactor again * solana: fix clippy * solana: as_ref * solana: clean up * solana: avoid needless transfer --------- Co-authored-by: A5 Pickle --- solana/Cargo.toml | 2 +- .../programs/swap-layer/src/composite/mod.rs | 535 +++++++++--- solana/programs/swap-layer/src/lib.rs | 10 + .../swap-layer/src/processor/complete/mod.rs | 8 +- .../src/processor/complete/other/direct.rs | 246 ------ .../src/processor/complete/other/relay.rs | 292 ------- .../src/processor/complete/swap/direct.rs | 59 ++ .../processor/complete/{usdc => swap}/mod.rs | 6 +- .../src/processor/complete/swap/payload.rs | 132 +++ .../src/processor/complete/swap/relay.rs | 120 +++ .../complete/{usdc => transfer}/direct.rs | 4 +- .../complete/{other => transfer}/mod.rs | 3 + .../complete/{usdc => transfer}/payload.rs | 23 +- .../complete/{usdc => transfer}/relay.rs | 8 +- .../src/processor/initiate/swap/exact_in.rs | 3 +- .../src/processor/release_inbound.rs | 8 +- .../src/processor/stage_outbound.rs | 22 +- .../swap-layer/src/state/staged/inbound.rs | 26 +- solana/ts/src/swapLayer/index.ts | 78 +- .../ts/src/swapLayer/state/StagedInbound.ts | 2 +- .../{01__swapLayer.ts => 01__transfer.ts} | 3 +- solana/ts/tests/10__swap.ts | 814 +++++++++++------- 22 files changed, 1342 insertions(+), 1062 deletions(-) delete mode 100644 solana/programs/swap-layer/src/processor/complete/other/direct.rs delete mode 100644 solana/programs/swap-layer/src/processor/complete/other/relay.rs create mode 100644 solana/programs/swap-layer/src/processor/complete/swap/direct.rs rename solana/programs/swap-layer/src/processor/complete/{usdc => swap}/mod.rs (100%) create mode 100644 solana/programs/swap-layer/src/processor/complete/swap/payload.rs create mode 100644 solana/programs/swap-layer/src/processor/complete/swap/relay.rs rename solana/programs/swap-layer/src/processor/complete/{usdc => transfer}/direct.rs (93%) rename solana/programs/swap-layer/src/processor/complete/{other => transfer}/mod.rs (64%) rename solana/programs/swap-layer/src/processor/complete/{usdc => transfer}/payload.rs (80%) rename solana/programs/swap-layer/src/processor/complete/{usdc => transfer}/relay.rs (97%) rename solana/ts/tests/{01__swapLayer.ts => 01__transfer.ts} (99%) diff --git a/solana/Cargo.toml b/solana/Cargo.toml index 32b644af..1ecf3dc6 100644 --- a/solana/Cargo.toml +++ b/solana/Cargo.toml @@ -52,7 +52,7 @@ incremental = false codegen-units = 1 [workspace.lints.clippy] -correctness = { level = "warn"} +correctness = { level = "warn", priority = -1 } arithmetic_side_effects = "deny" as_conversions = "deny" diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs index 868c50e0..127ddfb0 100644 --- a/solana/programs/swap-layer/src/composite/mod.rs +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -9,7 +9,7 @@ use crate::{ AnchorInstructionData, }, }; -use anchor_lang::prelude::*; +use anchor_lang::{prelude::*, system_program}; use anchor_spl::{associated_token, token, token_interface}; use common::{ admin::utils::{ @@ -187,7 +187,7 @@ pub struct ConsumeSwapLayerFill<'info> { true } )] - pub fill: Account<'info, PreparedFill>, + pub fill: Box>, /// Custody token account. This account will be closed at the end of this instruction. It just /// acts as a conduit to allow this program to be the transfer initiator in the CCTP message. @@ -210,37 +210,92 @@ impl<'info> ConsumeSwapLayerFill<'info> { SwapMessageV1::read_slice(&self.fill.redeemer_message).unwrap() } - // pub fn read_message_unchecked_boxed(&self) -> Box { - // SwapMessageV1::read_slice(&self.fill.redeemer_message) - // .map(Box::new) - // .unwrap() - // } - pub fn prepared_fill_key(&self) -> Pubkey { self.fill.key() } pub fn consume_prepared_fill( &self, - dst_token: AccountInfo<'info>, - token_program: AccountInfo<'info>, + dst_token: &AccountInfo<'info>, + token_program: &AccountInfo<'info>, ) -> Result { - let amount = self.fill_custody_token.amount; - token_router::cpi::consume_prepared_fill(CpiContext::new_with_signer( self.token_router_program.to_account_info(), token_router::cpi::accounts::ConsumePreparedFill { redeemer: self.custodian.to_account_info(), beneficiary: self.beneficiary.to_account_info(), prepared_fill: self.fill.to_account_info(), - dst_token, + dst_token: dst_token.to_account_info(), prepared_custody_token: self.fill_custody_token.to_account_info(), - token_program, + token_program: token_program.to_account_info(), }, &[Custodian::SIGNER_SEEDS], ))?; - Ok(amount) + // Because the destination token account could have been created already, someone can send + // some arbitrary amount to it. If this token account is meant to be closed sometime after + // invoking this method, we want to make sure the amount we return will reflect however much + // exists in the token account after consuming the prepared fill. + token::TokenAccount::try_deserialize_unchecked(&mut &dst_token.data.borrow()[..]) + .map(|token| token.amount) + } + + /// Ensure that the output token is a swap token for Jupiter V6. If swap is not encoded, we + /// allow the recipient to perform the swap himself in a direct transfer. + /// + /// NOTE: The recipient must be equal to the payer if OutputToken::Usdc! This check is not + /// performed here, but should be performed with the account context composing with this + /// composite. + pub fn is_valid_output_swap(&self, dst_mint: &AccountInfo) -> Result { + let swap_msg = self.read_message_unchecked(); + + let (expected_dst_mint, swap) = match swap_msg.output_token { + OutputToken::Usdc => { + require!( + matches!(swap_msg.redeem_mode, RedeemMode::Direct), + SwapLayerError::InvalidRedeemMode, + ); + + (Default::default(), None) + } + OutputToken::Gas(swap) => (token::spl_token::native_mint::id(), swap.into()), + OutputToken::Other { address, swap } => (address.into(), swap.into()), + }; + + if let Some(swap) = swap { + // Verify the address matches the destination mint. + require_keys_eq!( + dst_mint.key(), + expected_dst_mint, + SwapLayerError::InvalidDestinationMint + ); + + let OutputSwap { + limit_amount, + deadline, + swap_type, + } = swap; + + require!( + matches!(swap_type, SwapType::JupiterV6(_)), + SwapLayerError::InvalidSwapType, + ); + + // Check the deadline for the swap. There may not be a deadline check with the + // dex that this instruction composes with, so we will check it here. + // + // TODO: Do we accept deadline == 0? + require!( + deadline == 0 || Clock::get().unwrap().unix_timestamp <= i64::from(deadline), + SwapLayerError::SwapPastDeadline, + ); + + // Just in case the encoded limit amount exceeds u64, we have nothing to do if + // this message were misconfigured. + u64::try_from(limit_amount).map_err(|_| SwapLayerError::InvalidLimitAmount)?; + } + + Ok(true) } } @@ -257,66 +312,8 @@ pub struct CompleteSwap<'info> { #[account(mut)] pub payer: Signer<'info>, - #[account( - constraint = { - let swap_msg = consume_swap_layer_fill.read_message_unchecked(); - - // Ensure that the output token is a swap token for Jupiter V6. If swap is not encoded, - // we allow the recipient to perform the swap himself in a direct transfer. - // - // NOTE: The recipient must be equal to the payer if OutputToken::Usdc! This check is - // not performed here, but should be performed with the account context composing with - // this composite. - let (expected_dst_mint, swap) = match &swap_msg.output_token { - OutputToken::Usdc => { - require!( - matches!(swap_msg.redeem_mode, RedeemMode::Direct), - SwapLayerError::InvalidRedeemMode, - ); - - (Default::default(), None) - }, - OutputToken::Gas(swap) => (token::spl_token::native_mint::id(), swap.into()), - OutputToken::Other { address, swap } => (Pubkey::from(*address), swap.into()), - }; - - if let Some(swap) = swap { - // Verify the address matches the destination mint. - require_keys_eq!( - dst_mint.key(), - expected_dst_mint, - SwapLayerError::InvalidDestinationMint - ); - - let OutputSwap { - limit_amount, - deadline, - swap_type, - } = swap; - - require!( - matches!(swap_type, SwapType::JupiterV6(_)), - SwapLayerError::InvalidSwapType, - ); - - // Check the deadline for the swap. There may not be a deadline check with the - // dex that this instruction composes with, so we will check it here. - // - // TODO: Do we accept deadline == 0? - require!( - *deadline == 0 || Clock::get().unwrap().unix_timestamp <= i64::from(*deadline), - SwapLayerError::SwapPastDeadline, - ); - - // Just in case the encoded limit amount exceeds u64, we have nothing to do if - // this message were misconfigured. - u64::try_from(*limit_amount).map_err(|_| SwapLayerError::InvalidLimitAmount)?; - } - - true - } - )] - pub consume_swap_layer_fill: ConsumeSwapLayerFill<'info>, + #[account(constraint = consume_swap_layer_fill.is_valid_output_swap(&dst_mint)?)] + consume_swap_layer_fill: ConsumeSwapLayerFill<'info>, /// CHECK: Seeds must be \["swap-authority", prepared_fill.key()\]. #[account( @@ -334,7 +331,8 @@ pub struct CompleteSwap<'info> { init_if_needed, payer = payer, associated_token::mint = usdc, - associated_token::authority = authority + associated_token::authority = authority, + associated_token::token_program = token_program )] pub src_swap_token: Box>, @@ -344,16 +342,17 @@ pub struct CompleteSwap<'info> { init_if_needed, payer = payer, associated_token::mint = dst_mint, - associated_token::authority = authority + associated_token::authority = authority, + associated_token::token_program = dst_token_program )] pub dst_swap_token: Box>, /// This account must be verified as the source mint for the swap. pub usdc: Usdc<'info>, - /// This account must be verified as the destination mint for the swap. + /// CHECK: This account must be verified as the destination mint for the swap. #[account(constraint = usdc.key() != dst_mint.key() @ SwapLayerError::SameMint)] - pub dst_mint: Box>, + pub dst_mint: UncheckedAccount<'info>, pub token_program: Program<'info, token::Token>, pub dst_token_program: Interface<'info, token_interface::TokenInterface>, @@ -361,53 +360,26 @@ pub struct CompleteSwap<'info> { pub system_program: Program<'info, System>, } -impl<'info> CompleteSwap<'info> { - pub fn consume_prepared_fill(&mut self) -> Result { - // Consume prepared fill. - self.consume_swap_layer_fill.consume_prepared_fill( - self.src_swap_token.to_account_info(), - self.token_program.to_account_info(), - )?; - - // Because the source swap account is an ATA, someone could create this account and sent some - // arbitrary amount to it to disrupt the flow of this instruction. To be safe, we will reload - // the source swap token account to grab its amount. - self.src_swap_token.reload()?; +pub struct HandleCompleteSwap<'ctx, 'info> { + pub payer: &'ctx Signer<'info>, + pub consume_swap_layer_fill: &'ctx ConsumeSwapLayerFill<'info>, + pub authority: &'ctx AccountInfo<'info>, + pub src_swap_token: &'ctx Account<'info, token::TokenAccount>, + pub dst_swap_token: &'ctx InterfaceAccount<'info, token_interface::TokenAccount>, + pub dst_mint: &'ctx UncheckedAccount<'info>, + pub token_program: &'ctx Program<'info, token::Token>, + pub dst_token_program: &'ctx Interface<'info, token_interface::TokenInterface>, + pub system_program: &'ctx Program<'info, System>, +} - Ok(self.src_swap_token.amount) +impl<'info> CompleteSwap<'info> { + pub fn custodian(&self) -> &CheckedCustodian<'info> { + &self.consume_swap_layer_fill.custodian } - pub fn close_swap_accounts( - &self, - bumps: &CompleteSwapBumps, - destination: AccountInfo<'info>, - ) -> Result<()> { - let prepared_key = self.prepared_fill_key(); - let swap_authority_seeds = &[ - crate::SWAP_AUTHORITY_SEED_PREFIX, - prepared_key.as_ref(), - &[bumps.authority], - ]; - - token::close_account(CpiContext::new_with_signer( - self.token_program.to_account_info(), - token::CloseAccount { - account: self.src_swap_token.to_account_info(), - destination: destination.to_account_info(), - authority: self.authority.to_account_info(), - }, - &[swap_authority_seeds], - ))?; - - token::close_account(CpiContext::new_with_signer( - self.dst_token_program.to_account_info(), - token::CloseAccount { - account: self.dst_swap_token.to_account_info(), - destination, - authority: self.authority.to_account_info(), - }, - &[swap_authority_seeds], - )) + pub fn consume_prepared_fill(&mut self) -> Result { + self.consume_swap_layer_fill + .consume_prepared_fill(self.src_swap_token.as_ref().as_ref(), &self.token_program) } } @@ -419,6 +391,323 @@ impl<'info> Deref for CompleteSwap<'info> { } } +#[allow(clippy::too_many_arguments)] +pub(crate) fn complete_swap_jup_v6<'info>( + complete_swap: &CompleteSwap<'info>, + bumps: &CompleteSwapBumps, + remaining_accounts: &'info [AccountInfo<'info>], + ix_data: Vec, + in_amount: u64, + swap_message: SwapMessageV1, + recipient: &AccountInfo<'info>, + recipient_token: &AccountInfo<'info>, + gas_dropoff: Option, +) -> Result<()> { + let CompleteSwap { + payer, + consume_swap_layer_fill, + authority, + src_swap_token, + dst_swap_token, + dst_mint, + token_program, + dst_token_program, + system_program, + .. + } = &complete_swap; + + handle_complete_swap_jup_v6( + HandleCompleteSwap { + payer, + consume_swap_layer_fill, + authority, + src_swap_token, + dst_swap_token, + dst_mint, + token_program, + dst_token_program, + system_program, + }, + crate::SWAP_AUTHORITY_SEED_PREFIX, + bumps.authority, + remaining_accounts, + ix_data, + in_amount, + swap_message, + RecipientAccounts { + recipient, + recipient_token, + } + .into(), + gas_dropoff, + ) +} + +pub struct RecipientAccounts<'ctx, 'info> { + pub recipient: &'ctx AccountInfo<'info>, + pub recipient_token: &'ctx AccountInfo<'info>, +} + +#[allow(clippy::too_many_arguments)] +pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( + accounts: HandleCompleteSwap<'ctx, 'info>, + swap_authority_seed_prefix: &'static [u8], + swap_authority_bump_seed: u8, + remaining_accounts: &'info [AccountInfo<'info>], + ix_data: Vec, + in_amount: u64, + swap_message: SwapMessageV1, + recipient: Option>, + gas_dropoff: Option, +) -> Result<()> { + let SwapMessageV1 { + recipient: expected_recipient, + output_token, + redeem_mode: _, + } = swap_message; + + let recipient_key = recipient.as_ref().map(|accounts| accounts.recipient.key()); + if let Some(recipient_key) = recipient_key { + require_keys_eq!( + recipient_key, + Pubkey::from(expected_recipient), + SwapLayerError::InvalidRecipient + ); + } + + let (limit_and_params, is_native) = match output_token { + OutputToken::Usdc => match recipient_key { + Some(recipient_key) => { + // In this case, we require that the signer of the instruction (the payer) is the + // recipient himself. + require_keys_eq!( + accounts.payer.key(), + recipient_key, + SwapLayerError::InvalidRecipient + ); + + (Default::default(), Default::default()) + } + None => return err!(SwapLayerError::InvalidOutputToken), + }, + OutputToken::Gas(OutputSwap { + deadline: _, + limit_amount, + swap_type: SwapType::JupiterV6(swap_params), + }) => ((limit_amount.try_into().unwrap(), swap_params).into(), true), + OutputToken::Other { + address: _, + swap: + OutputSwap { + deadline: _, + limit_amount, + swap_type: SwapType::JupiterV6(swap_params), + }, + } => ( + (limit_amount.try_into().unwrap(), swap_params).into(), + false, + ), + _ => return err!(SwapLayerError::InvalidOutputToken), + }; + + let swap_authority = accounts.authority; + + let prepared_fill_key = accounts.consume_swap_layer_fill.prepared_fill_key(); + let swap_authority_seeds = &[ + swap_authority_seed_prefix, + prepared_fill_key.as_ref(), + &[swap_authority_bump_seed], + ]; + + let (shared_accounts_route, mut swap_args, cpi_remaining_accounts) = + JupiterV6SharedAccountsRoute::set_up(remaining_accounts, &ix_data[..])?; + + // Verify remaining accounts. + { + require_keys_eq!( + shared_accounts_route.transfer_authority.key(), + swap_authority.key(), + SwapLayerError::InvalidSwapAuthority + ); + require_keys_eq!( + shared_accounts_route.src_custody_token.key(), + accounts.src_swap_token.key(), + SwapLayerError::InvalidSourceSwapToken + ); + require_keys_eq!( + shared_accounts_route.dst_custody_token.key(), + accounts.dst_swap_token.key(), + SwapLayerError::InvalidDestinationSwapToken + ); + require_keys_eq!( + shared_accounts_route.src_mint.key(), + common::USDC_MINT, + SwapLayerError::InvalidSourceMint + ); + require_keys_eq!( + shared_accounts_route.dst_mint.key(), + accounts.dst_mint.key(), + SwapLayerError::InvalidDestinationMint + ); + } + + let limit_amount = match limit_and_params { + // If the limit amount is some value (meaning that the OutputToken is Gas or Other), we + // will override the instruction arguments with the limit amount and slippage == 0 bps. + // Otherwise we will compute the limit amount using the given swap args. + Some((limit_amount, swap_params)) => { + msg!( + "Override in_amount: {}, quoted_out_amount: {}, slippage_bps: {}", + swap_args.in_amount, + swap_args.quoted_out_amount, + swap_args.slippage_bps + ); + swap_args.in_amount = in_amount; + swap_args.quoted_out_amount = limit_amount; + swap_args.slippage_bps = 0; + + // Peek into the head of remaining accounts. This account will be the dex program that Jupiter + // V6 interacts with. If the swap params specify a specific dex program, we need to ensure that + // the one passed into this instruction handler is that. + if let Some(dex_program_id) = swap_params.dex_program_id { + require_eq!( + swap_args.route_plan.len(), + 1, + SwapLayerError::NotJupiterV6DirectRoute + ); + require_keys_eq!( + cpi_remaining_accounts[0].key(), + Pubkey::from(dex_program_id), + SwapLayerError::JupiterV6DexProgramMismatch + ); + } + + limit_amount.into() + } + None => { + // Fetched swap args should have the same in amount as the prepared (fast) fill. + require_eq!( + swap_args.in_amount, + in_amount, + SwapLayerError::InvalidSwapInAmount + ); + + None + } + }; + + // Execute swap. + let amount_out = shared_accounts_route.swap_exact_in( + swap_args, + swap_authority_seeds, + cpi_remaining_accounts, + limit_amount, + )?; + + let payer = accounts.payer; + + token::close_account(CpiContext::new_with_signer( + accounts.token_program.to_account_info(), + token::CloseAccount { + account: accounts.src_swap_token.to_account_info(), + destination: payer.to_account_info(), + authority: accounts.authority.to_account_info(), + }, + &[swap_authority_seeds], + ))?; + + if let Some(RecipientAccounts { + recipient, + recipient_token, + }) = recipient + { + // We perform a token transfer if the output token is not gas. + if is_native { + // NOTE: If the output token is gas, lamports reflecting the WSOL amount will be transferred to + // the recipient's account. We first close and send all lamports to the payer. + token_interface::close_account(CpiContext::new_with_signer( + accounts.dst_token_program.to_account_info(), + token_interface::CloseAccount { + account: accounts.dst_swap_token.to_account_info(), + destination: payer.to_account_info(), + authority: accounts.authority.to_account_info(), + }, + &[swap_authority_seeds], + ))?; + + // Then transfer amount_out to recipient. + system_program::transfer( + CpiContext::new( + accounts.system_program.to_account_info(), + system_program::Transfer { + from: payer.to_account_info(), + to: recipient.to_account_info(), + }, + ), + amount_out + .checked_add(gas_dropoff.unwrap_or_default()) + .ok_or(SwapLayerError::U64Overflow)?, + )? + } else { + // Verify that the encoded owner is the actual owner. ATAs are no different from other token + // accounts, so anyone can set the authority of an ATA to be someone else. + { + let recipient_token_owner = + token::TokenAccount::try_deserialize(&mut &recipient_token.data.borrow()[..]) + .map(|token| token.owner)?; + require_keys_eq!( + recipient_token_owner, + recipient.key(), + ErrorCode::ConstraintTokenOwner, + ); + } + + // Transfer destination tokens to recipient. + token::transfer( + CpiContext::new_with_signer( + accounts.token_program.to_account_info(), + token::Transfer { + from: accounts.dst_swap_token.to_account_info(), + to: recipient_token.to_account_info(), + authority: swap_authority.to_account_info(), + }, + &[swap_authority_seeds], + ), + amount_out, + )?; + + // Close the destination swap token account. + token_interface::close_account(CpiContext::new_with_signer( + accounts.dst_token_program.to_account_info(), + token_interface::CloseAccount { + account: accounts.dst_swap_token.to_account_info(), + destination: payer.to_account_info(), + authority: accounts.authority.to_account_info(), + }, + &[swap_authority_seeds], + ))?; + + // If there is a gas dropoff, transfer it to the recipient. + match gas_dropoff { + Some(gas_dropoff) if gas_dropoff > 0 => system_program::transfer( + CpiContext::new( + accounts.system_program.to_account_info(), + system_program::Transfer { + from: payer.to_account_info(), + to: recipient.to_account_info(), + }, + ), + gas_dropoff, + )?, + _ => (), + } + } + } + + // Done. + Ok(()) +} + //////////////////////////////////////////////////////////////////////////////////////////////////// // // Jupiter V6 handling. diff --git a/solana/programs/swap-layer/src/lib.rs b/solana/programs/swap-layer/src/lib.rs index aa53fee1..f9f67d66 100644 --- a/solana/programs/swap-layer/src/lib.rs +++ b/solana/programs/swap-layer/src/lib.rs @@ -157,4 +157,14 @@ pub mod swap_layer { { processor::complete_swap_relay(ctx, instruction_data) } + + pub fn complete_swap_payload<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapPayload<'info>>, + instruction_data: Vec, + ) -> Result<()> + where + 'c: 'info, + { + processor::complete_swap_payload(ctx, instruction_data) + } } diff --git a/solana/programs/swap-layer/src/processor/complete/mod.rs b/solana/programs/swap-layer/src/processor/complete/mod.rs index 2871918e..5bcc710a 100644 --- a/solana/programs/swap-layer/src/processor/complete/mod.rs +++ b/solana/programs/swap-layer/src/processor/complete/mod.rs @@ -1,5 +1,5 @@ -mod other; -pub use other::*; +mod swap; +pub use swap::*; -mod usdc; -pub use usdc::*; +mod transfer; +pub use transfer::*; diff --git a/solana/programs/swap-layer/src/processor/complete/other/direct.rs b/solana/programs/swap-layer/src/processor/complete/other/direct.rs deleted file mode 100644 index 1ccd22ca..00000000 --- a/solana/programs/swap-layer/src/processor/complete/other/direct.rs +++ /dev/null @@ -1,246 +0,0 @@ -use crate::{composite::*, error::SwapLayerError}; -use anchor_lang::prelude::*; -use anchor_spl::{associated_token, token}; -use swap_layer_messages::{ - messages::SwapMessageV1, - types::{JupiterV6SwapParameters, OutputSwap, OutputToken, RedeemMode, SwapType}, -}; - -#[derive(Accounts)] -pub struct CompleteSwapDirect<'info> { - complete_swap: CompleteSwap<'info>, - - #[account( - mut, - address = associated_token::get_associated_token_address( - &recipient.key(), - &complete_swap.dst_mint.key() - ) - )] - /// Recipient associated token account. The recipient authority check is necessary to ensure - /// that the recipient is the intended recipient of the bridged tokens. - /// - /// If OutputToken::Other, this account will be deserialized to ensure that the recipient is - /// the owner of this token account. - /// - /// CHECK: Mutable ATA whose owner is the recipient and mint is the destination mint. - recipient_token: UncheckedAccount<'info>, - - /// CHECK: This account must be the owner of the recipient token account. The recipient token - /// account must be encoded in the prepared fill. - #[account(mut)] - recipient: UncheckedAccount<'info>, -} - -pub fn complete_swap_direct<'a, 'b, 'c, 'info>( - ctx: Context<'a, 'b, 'c, 'info, CompleteSwapDirect<'info>>, - instruction_data: Vec, -) -> Result<()> -where - 'c: 'info, -{ - let SwapMessageV1 { - recipient, - redeem_mode, - output_token, - } = ctx.accounts.complete_swap.read_message_unchecked(); - - require_keys_eq!( - ctx.accounts.recipient.key(), - Pubkey::from(recipient), - SwapLayerError::InvalidRecipient - ); - - match redeem_mode { - RedeemMode::Direct => match output_token { - OutputToken::Usdc => { - // In this case, we require that the signer of the instruction (the payer) is the - // recipient himself. - require_keys_eq!( - ctx.accounts.complete_swap.payer.key(), - ctx.accounts.recipient.key(), - SwapLayerError::InvalidRecipient - ); - - handle_complete_swap_direct_jup_v6( - ctx, - instruction_data, - Default::default(), - Default::default(), - ) - } - OutputToken::Gas(OutputSwap { - deadline: _, - limit_amount, - swap_type: SwapType::JupiterV6(swap_params), - }) => handle_complete_swap_direct_jup_v6( - ctx, - instruction_data, - (limit_amount.try_into().unwrap(), swap_params).into(), - true, - ), - OutputToken::Other { - address: _, - swap: - OutputSwap { - deadline: _, - limit_amount, - swap_type: SwapType::JupiterV6(swap_params), - }, - } => handle_complete_swap_direct_jup_v6( - ctx, - instruction_data, - (limit_amount.try_into().unwrap(), swap_params).into(), - false, - ), - _ => err!(SwapLayerError::InvalidOutputToken), - }, - _ => err!(SwapLayerError::InvalidRedeemMode), - } -} - -pub fn handle_complete_swap_direct_jup_v6<'a, 'b, 'c, 'info>( - ctx: Context<'a, 'b, 'c, 'info, CompleteSwapDirect<'info>>, - ix_data: Vec, - limit_and_params: Option<(u64, JupiterV6SwapParameters)>, - is_native: bool, -) -> Result<()> -where - 'c: 'info, -{ - // Consume prepared fill. - let in_amount = ctx.accounts.complete_swap.consume_prepared_fill()?; - - let swap_authority = &ctx.accounts.complete_swap.authority; - - let prepared_fill_key = &ctx.accounts.complete_swap.prepared_fill_key(); - let swap_authority_seeds = &[ - crate::SWAP_AUTHORITY_SEED_PREFIX, - prepared_fill_key.as_ref(), - &[ctx.bumps.complete_swap.authority], - ]; - - let (shared_accounts_route, mut swap_args, cpi_remaining_accounts) = - JupiterV6SharedAccountsRoute::set_up(ctx.remaining_accounts, &ix_data[..])?; - - // Verify remaining accounts. - { - require_keys_eq!( - shared_accounts_route.transfer_authority.key(), - swap_authority.key(), - SwapLayerError::InvalidSwapAuthority - ); - require_keys_eq!( - shared_accounts_route.src_custody_token.key(), - ctx.accounts.complete_swap.src_swap_token.key(), - SwapLayerError::InvalidSourceSwapToken - ); - require_keys_eq!( - shared_accounts_route.dst_custody_token.key(), - ctx.accounts.complete_swap.dst_swap_token.key(), - SwapLayerError::InvalidDestinationSwapToken - ); - require_keys_eq!( - shared_accounts_route.src_mint.key(), - common::USDC_MINT, - SwapLayerError::InvalidSourceMint - ); - require_keys_eq!( - shared_accounts_route.dst_mint.key(), - ctx.accounts.complete_swap.dst_mint.key(), - SwapLayerError::InvalidDestinationMint - ); - } - - let limit_amount = match limit_and_params { - // If the limit amount is some value (meaning that the OutputToken is Gas or Other), we - // will override the instruction arguments with the limit amount and slippage == 0 bps. - // Otherwise we will compute the limit amount using the given swap args. - Some((limit_amount, swap_params)) => { - msg!( - "Override in_amount: {}, quoted_out_amount: {}, slippage_bps: {}", - swap_args.in_amount, - swap_args.quoted_out_amount, - swap_args.slippage_bps - ); - swap_args.in_amount = in_amount; - swap_args.quoted_out_amount = limit_amount; - swap_args.slippage_bps = 0; - - // Peek into the head of remaining accounts. This account will be the dex program that Jupiter - // V6 interacts with. If the swap params specify a specific dex program, we need to ensure that - // the one passed into this instruction handler is that. - if let Some(dex_program_id) = swap_params.dex_program_id { - require_eq!( - swap_args.route_plan.len(), - 1, - SwapLayerError::NotJupiterV6DirectRoute - ); - require_keys_eq!( - cpi_remaining_accounts[0].key(), - Pubkey::from(dex_program_id), - SwapLayerError::JupiterV6DexProgramMismatch - ); - } - - limit_amount.into() - } - None => { - // Fetched swap args should have the same in amount as the prepared (fast) fill. - require_eq!( - swap_args.in_amount, - in_amount, - SwapLayerError::InvalidSwapInAmount - ); - - None - } - }; - - // Execute swap. - let amount_out = shared_accounts_route.swap_exact_in( - swap_args, - swap_authority_seeds, - cpi_remaining_accounts, - limit_amount, - )?; - - let recipient = &ctx.accounts.recipient; - - // We perform a token transfer if the output token is not gas. - if !is_native { - // Verify that the encoded owner is the actual owner. ATAs are no different from other token - // accounts, so anyone can set the authority of an ATA to be someone else. - { - let mut acc_data: &[_] = &ctx.accounts.recipient_token.data.borrow(); - let recipient_token_owner = - token::TokenAccount::try_deserialize(&mut acc_data).map(|token| token.owner)?; - require_keys_eq!( - recipient_token_owner, - recipient.key(), - ErrorCode::ConstraintTokenOwner, - ); - } - - // Transfer destination tokens to recipient. - token::transfer( - CpiContext::new_with_signer( - ctx.accounts.complete_swap.token_program.to_account_info(), - token::Transfer { - from: ctx.accounts.complete_swap.dst_swap_token.to_account_info(), - to: ctx.accounts.recipient_token.to_account_info(), - authority: swap_authority.to_account_info(), - }, - &[swap_authority_seeds], - ), - amount_out, - )?; - } - - // NOTE: If the output token is gas, lamports reflecting the WSOL amount will be transferred to - // the recipient's account. - ctx.accounts.complete_swap.close_swap_accounts( - &ctx.bumps.complete_swap, - ctx.accounts.recipient.to_account_info(), - ) -} diff --git a/solana/programs/swap-layer/src/processor/complete/other/relay.rs b/solana/programs/swap-layer/src/processor/complete/other/relay.rs deleted file mode 100644 index 129a4635..00000000 --- a/solana/programs/swap-layer/src/processor/complete/other/relay.rs +++ /dev/null @@ -1,292 +0,0 @@ -use crate::utils::gas_dropoff; -use crate::{composite::*, error::SwapLayerError}; -use anchor_lang::prelude::*; -use anchor_spl::{associated_token, token}; -use swap_layer_messages::{ - messages::SwapMessageV1, - types::{JupiterV6SwapParameters, OutputSwap, OutputToken, RedeemMode, SwapType}, -}; - -#[derive(Accounts)] -pub struct CompleteSwapRelay<'info> { - complete_swap: CompleteSwap<'info>, - - #[account( - mut, - address = associated_token::get_associated_token_address( - &recipient.key(), - &complete_swap.dst_mint.key() - ) - )] - /// Recipient associated token account. The recipient authority check is necessary to ensure - /// that the recipient is the intended recipient of the bridged tokens. - /// - /// If OutputToken::Other, this account will be deserialized to ensure that the recipient is - /// the owner of this token account. - /// - /// CHECK: Mutable ATA whose owner is the recipient and mint is the destination mint. - recipient_token: UncheckedAccount<'info>, - - /// CHECK: This account must be the owner of the recipient token account. The recipient token - /// account must be encoded in the prepared fill. - #[account(mut)] - recipient: UncheckedAccount<'info>, - - #[account( - mut, - address = complete_swap.consume_swap_layer_fill.custodian.fee_recipient_token, - )] - fee_recipient_token: Account<'info, token::TokenAccount>, -} - -pub fn complete_swap_relay<'a, 'b, 'c, 'info>( - ctx: Context<'a, 'b, 'c, 'info, CompleteSwapRelay<'info>>, - instruction_data: Vec, -) -> Result<()> -where - 'c: 'info, -{ - let swap_msg = ctx.accounts.complete_swap.read_message_unchecked(); - - match swap_msg.redeem_mode { - RedeemMode::Relay { - gas_dropoff, - relaying_fee, - } => handle_complete_swap_relay( - ctx, - instruction_data, - swap_msg, - gas_dropoff::denormalize_gas_dropoff(gas_dropoff), - relaying_fee.into(), - ), - _ => err!(SwapLayerError::InvalidRedeemMode), - } -} - -pub fn handle_complete_swap_relay<'a, 'b, 'c, 'info>( - ctx: Context<'a, 'b, 'c, 'info, CompleteSwapRelay<'info>>, - instruction_data: Vec, - swap_msg: SwapMessageV1, - gas_dropoff: u64, - relaying_fee: u64, -) -> Result<()> -where - 'c: 'info, -{ - let SwapMessageV1 { - recipient: encoded_recipient, - redeem_mode: _, - output_token, - } = swap_msg; - - // Consume prepared fill. - let fill_amount = ctx.accounts.complete_swap.consume_prepared_fill()?; - let payer = &ctx.accounts.complete_swap.payer; - let recipient = &ctx.accounts.recipient; - - require_keys_eq!( - recipient.key(), - Pubkey::from(encoded_recipient), - SwapLayerError::InvalidRecipient - ); - - // Handle the relayer fee and gas dropoff. Override the relaying fee to zero - // if the payer is the recipient (self redemption). - let in_amount = { - if payer.key() == recipient.key() { - fill_amount - } else { - if gas_dropoff > 0 { - anchor_lang::system_program::transfer( - CpiContext::new( - ctx.accounts.complete_swap.system_program.to_account_info(), - anchor_lang::system_program::Transfer { - from: payer.to_account_info(), - to: recipient.to_account_info(), - }, - ), - gas_dropoff, - )?; - } - - if relaying_fee > 0 { - // Transfer eligible USDC to the fee recipient. - anchor_spl::token::transfer( - CpiContext::new_with_signer( - ctx.accounts.complete_swap.token_program.to_account_info(), - anchor_spl::token::Transfer { - from: ctx.accounts.complete_swap.src_swap_token.to_account_info(), - to: ctx.accounts.fee_recipient_token.to_account_info(), - authority: ctx.accounts.complete_swap.authority.to_account_info(), - }, - &[&[ - crate::SWAP_AUTHORITY_SEED_PREFIX, - &ctx.accounts.complete_swap.prepared_fill_key().as_ref(), - &[ctx.bumps.complete_swap.authority], - ]], - ), - relaying_fee, - )?; - } - - fill_amount - .checked_sub(relaying_fee) - .ok_or(SwapLayerError::InvalidRelayerFee)? - } - }; - - match output_token { - OutputToken::Gas(OutputSwap { - deadline: _, - limit_amount, - swap_type: SwapType::JupiterV6(swap_params), - }) => handle_complete_swap_direct_jup_v6( - ctx, - instruction_data, - (limit_amount.try_into().unwrap(), swap_params), - in_amount, - true, - ), - OutputToken::Other { - address: _, - swap: - OutputSwap { - deadline: _, - limit_amount, - swap_type: SwapType::JupiterV6(swap_params), - }, - } => handle_complete_swap_direct_jup_v6( - ctx, - instruction_data, - (limit_amount.try_into().unwrap(), swap_params), - in_amount, - false, - ), - _ => err!(SwapLayerError::InvalidOutputToken), - } -} - -fn handle_complete_swap_direct_jup_v6<'a, 'b, 'c, 'info>( - ctx: Context<'a, 'b, 'c, 'info, CompleteSwapRelay<'info>>, - ix_data: Vec, - limit_and_params: (u64, JupiterV6SwapParameters), - in_amount: u64, - is_native: bool, -) -> Result<()> -where - 'c: 'info, -{ - let swap_authority = &ctx.accounts.complete_swap.authority; - - let prepared_fill_key = &ctx.accounts.complete_swap.prepared_fill_key(); - let swap_authority_seeds = &[ - crate::SWAP_AUTHORITY_SEED_PREFIX, - prepared_fill_key.as_ref(), - &[ctx.bumps.complete_swap.authority], - ]; - - let (shared_accounts_route, mut swap_args, cpi_remaining_accounts) = - JupiterV6SharedAccountsRoute::set_up(ctx.remaining_accounts, &ix_data[..])?; - - // Verify remaining accounts. - { - require_keys_eq!( - shared_accounts_route.transfer_authority.key(), - swap_authority.key(), - SwapLayerError::InvalidSwapAuthority - ); - require_keys_eq!( - shared_accounts_route.src_custody_token.key(), - ctx.accounts.complete_swap.src_swap_token.key(), - SwapLayerError::InvalidSourceSwapToken - ); - require_keys_eq!( - shared_accounts_route.dst_custody_token.key(), - ctx.accounts.complete_swap.dst_swap_token.key(), - SwapLayerError::InvalidDestinationSwapToken - ); - require_keys_eq!( - shared_accounts_route.src_mint.key(), - common::USDC_MINT, - SwapLayerError::InvalidSourceMint - ); - require_keys_eq!( - shared_accounts_route.dst_mint.key(), - ctx.accounts.complete_swap.dst_mint.key(), - SwapLayerError::InvalidDestinationMint - ); - } - - msg!( - "Override in_amount: {}, quoted_out_amount: {}, slippage_bps: {}", - swap_args.in_amount, - swap_args.quoted_out_amount, - swap_args.slippage_bps - ); - swap_args.in_amount = in_amount; - swap_args.quoted_out_amount = limit_and_params.0; - swap_args.slippage_bps = 0; - - // Peek into the head of remaining accounts. This account will be the dex program that Jupiter - // V6 interacts with. If the swap params specify a specific dex program, we need to ensure that - // the one passed into this instruction handler is that. - if let Some(dex_program_id) = limit_and_params.1.dex_program_id { - require_eq!( - swap_args.route_plan.len(), - 1, - SwapLayerError::NotJupiterV6DirectRoute - ); - require_keys_eq!( - cpi_remaining_accounts[0].key(), - Pubkey::from(dex_program_id), - SwapLayerError::JupiterV6DexProgramMismatch - ); - } - - // Execute swap. - let amount_out = shared_accounts_route.swap_exact_in( - swap_args, - swap_authority_seeds, - cpi_remaining_accounts, - Some(limit_and_params.0), - )?; - - let recipient = &ctx.accounts.recipient; - - // We perform a token transfer if the output token is not gas. - if !is_native { - // Verify that the encoded owner is the actual owner. ATAs are no different from other token - // accounts, so anyone can set the authority of an ATA to be someone else. - { - let mut acc_data: &[_] = &ctx.accounts.recipient_token.data.borrow(); - let recipient_token_owner = - token::TokenAccount::try_deserialize(&mut acc_data).map(|token| token.owner)?; - require_keys_eq!( - recipient_token_owner, - recipient.key(), - ErrorCode::ConstraintTokenOwner, - ); - } - - // Transfer destination tokens to recipient. - token::transfer( - CpiContext::new_with_signer( - ctx.accounts.complete_swap.token_program.to_account_info(), - token::Transfer { - from: ctx.accounts.complete_swap.dst_swap_token.to_account_info(), - to: ctx.accounts.recipient_token.to_account_info(), - authority: swap_authority.to_account_info(), - }, - &[swap_authority_seeds], - ), - amount_out, - )?; - } - - // NOTE: If the output token is gas, lamports reflecting the WSOL amount will be transferred to - // the recipient's account. - ctx.accounts.complete_swap.close_swap_accounts( - &ctx.bumps.complete_swap, - ctx.accounts.recipient.to_account_info(), - ) -} diff --git a/solana/programs/swap-layer/src/processor/complete/swap/direct.rs b/solana/programs/swap-layer/src/processor/complete/swap/direct.rs new file mode 100644 index 00000000..876d54f0 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/complete/swap/direct.rs @@ -0,0 +1,59 @@ +use crate::{composite::*, error::SwapLayerError}; +use anchor_lang::prelude::*; +use anchor_spl::associated_token; +use swap_layer_messages::types::RedeemMode; + +#[derive(Accounts)] +pub struct CompleteSwapDirect<'info> { + complete_swap: CompleteSwap<'info>, + + #[account( + mut, + address = associated_token::get_associated_token_address( + &recipient.key(), + &complete_swap.dst_mint.key() + ) + )] + /// Recipient associated token account. The recipient authority check is necessary to ensure + /// that the recipient is the intended recipient of the bridged tokens. + /// + /// If OutputToken::Other, this account will be deserialized to ensure that the recipient is + /// the owner of this token account. + /// + /// CHECK: Mutable ATA whose owner is the recipient and mint is the destination mint. + recipient_token: UncheckedAccount<'info>, + + /// CHECK: This account must be the owner of the recipient token account. The recipient token + /// account must be encoded in the prepared fill. + #[account(mut)] + recipient: UncheckedAccount<'info>, +} + +pub fn complete_swap_direct<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapDirect<'info>>, + instruction_data: Vec, +) -> Result<()> +where + 'c: 'info, +{ + let complete_swap_accounts = &mut ctx.accounts.complete_swap; + + // Read message to determine redeem mode and consume prepared fill. + let swap_msg = complete_swap_accounts.read_message_unchecked(); + let in_amount = complete_swap_accounts.consume_prepared_fill()?; + + match &swap_msg.redeem_mode { + RedeemMode::Direct => complete_swap_jup_v6( + complete_swap_accounts, + &ctx.bumps.complete_swap, + ctx.remaining_accounts, + instruction_data, + in_amount, + swap_msg, + &ctx.accounts.recipient, + &ctx.accounts.recipient_token, + Default::default(), + ), + _ => err!(SwapLayerError::InvalidRedeemMode), + } +} diff --git a/solana/programs/swap-layer/src/processor/complete/usdc/mod.rs b/solana/programs/swap-layer/src/processor/complete/swap/mod.rs similarity index 100% rename from solana/programs/swap-layer/src/processor/complete/usdc/mod.rs rename to solana/programs/swap-layer/src/processor/complete/swap/mod.rs index d0674765..19e75509 100644 --- a/solana/programs/swap-layer/src/processor/complete/usdc/mod.rs +++ b/solana/programs/swap-layer/src/processor/complete/swap/mod.rs @@ -1,8 +1,8 @@ -mod relay; -pub use relay::*; - mod direct; pub use direct::*; mod payload; pub use payload::*; + +mod relay; +pub use relay::*; diff --git a/solana/programs/swap-layer/src/processor/complete/swap/payload.rs b/solana/programs/swap-layer/src/processor/complete/swap/payload.rs new file mode 100644 index 00000000..4370b9d5 --- /dev/null +++ b/solana/programs/swap-layer/src/processor/complete/swap/payload.rs @@ -0,0 +1,132 @@ +use crate::{ + composite::*, + error::SwapLayerError, + state::{StagedInbound, StagedInboundInfo, StagedInboundSeeds}, +}; +use anchor_lang::prelude::*; +use anchor_spl::{associated_token, token, token_interface}; +use swap_layer_messages::types::{OutputToken, RedeemMode}; + +#[derive(Accounts)] +pub struct CompleteSwapPayload<'info> { + #[account(mut)] + payer: Signer<'info>, + + #[account(constraint = consume_swap_layer_fill.is_valid_output_swap(&dst_mint)?)] + consume_swap_layer_fill: ConsumeSwapLayerFill<'info>, + + #[account( + init_if_needed, + payer = payer, + space = StagedInbound::try_compute_size_if_needed( + staged_inbound, + consume_swap_layer_fill.read_message_unchecked() + )?, + seeds = [ + StagedInbound::SEED_PREFIX, + consume_swap_layer_fill.prepared_fill_key().as_ref(), + ], + bump + )] + staged_inbound: Box>, + + /// Temporary swap token account to receive USDC from the prepared fill. This account will be + /// closed at the end of this instruction. + #[account( + init_if_needed, + payer = payer, + associated_token::mint = usdc, + associated_token::authority = staged_inbound, + associated_token::token_program = token_program + )] + src_swap_token: Box>, + + /// Temporary swap token account to receive destination mint after the swap. This account will + /// be closed at the end of this instruction. + #[account( + init_if_needed, + payer = payer, + associated_token::mint = dst_mint, + associated_token::authority = staged_inbound, + associated_token::token_program = dst_token_program + )] + dst_swap_token: Box>, + + /// This account must be verified as the source mint for the swap. + usdc: Usdc<'info>, + + /// CHECK: This account must be verified as the destination mint for the swap. + #[account(constraint = usdc.key() != dst_mint.key() @ SwapLayerError::SameMint)] + dst_mint: UncheckedAccount<'info>, + + token_program: Program<'info, token::Token>, + dst_token_program: Interface<'info, token_interface::TokenInterface>, + associated_token_program: Program<'info, associated_token::AssociatedToken>, + system_program: Program<'info, System>, +} + +pub fn complete_swap_payload<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapPayload<'info>>, + instruction_data: Vec, +) -> Result<()> +where + 'c: 'info, +{ + // Set the staged transfer if it hasn't been set yet. + if ctx.accounts.staged_inbound.staged_by == Pubkey::default() { + let in_amount = ctx.accounts.consume_swap_layer_fill.consume_prepared_fill( + ctx.accounts.src_swap_token.as_ref().as_ref(), + &ctx.accounts.token_program, + )?; + + let mut swap_msg = ctx + .accounts + .consume_swap_layer_fill + .read_message_unchecked(); + + let recipient_payload = match &mut swap_msg.redeem_mode { + RedeemMode::Payload(payload) => std::mem::take(payload), + _ => return Err(SwapLayerError::InvalidRedeemMode.into()), + }; + + ctx.accounts.staged_inbound.set_inner(StagedInbound { + seeds: StagedInboundSeeds { + prepared_fill: ctx.accounts.consume_swap_layer_fill.prepared_fill_key(), + bump: ctx.bumps.staged_inbound, + }, + info: StagedInboundInfo { + custody_token: ctx.accounts.dst_swap_token.key(), + staged_by: ctx.accounts.payer.key(), + source_chain: ctx.accounts.consume_swap_layer_fill.fill.source_chain, + recipient: swap_msg.recipient.into(), + is_native: matches!(swap_msg.output_token, OutputToken::Gas(_)), + }, + recipient_payload, + }); + + handle_complete_swap_jup_v6( + HandleCompleteSwap { + payer: &ctx.accounts.payer, + consume_swap_layer_fill: &ctx.accounts.consume_swap_layer_fill, + authority: ctx.accounts.staged_inbound.as_ref().as_ref(), + src_swap_token: &ctx.accounts.src_swap_token, + dst_swap_token: &ctx.accounts.dst_swap_token, + dst_mint: &ctx.accounts.dst_mint, + token_program: &ctx.accounts.token_program, + system_program: &ctx.accounts.system_program, + dst_token_program: &ctx.accounts.dst_token_program, + }, + StagedInbound::SEED_PREFIX, + ctx.bumps.staged_inbound, + ctx.remaining_accounts, + instruction_data, + in_amount, + swap_msg, + Default::default(), + Default::default(), + )?; + } + + // Done. + Ok(()) +} diff --git a/solana/programs/swap-layer/src/processor/complete/swap/relay.rs b/solana/programs/swap-layer/src/processor/complete/swap/relay.rs new file mode 100644 index 00000000..17d6995e --- /dev/null +++ b/solana/programs/swap-layer/src/processor/complete/swap/relay.rs @@ -0,0 +1,120 @@ +use crate::utils::gas_dropoff; +use crate::{composite::*, error::SwapLayerError}; +use anchor_lang::prelude::*; +use anchor_spl::{associated_token, token}; +use swap_layer_messages::{messages::SwapMessageV1, types::RedeemMode}; + +#[derive(Accounts)] +pub struct CompleteSwapRelay<'info> { + complete_swap: CompleteSwap<'info>, + + #[account( + mut, + address = associated_token::get_associated_token_address( + &recipient.key(), + &complete_swap.dst_mint.key() + ) + )] + /// Recipient associated token account. The recipient authority check is necessary to ensure + /// that the recipient is the intended recipient of the bridged tokens. + /// + /// If OutputToken::Other, this account will be deserialized to ensure that the recipient is + /// the owner of this token account. + /// + /// CHECK: Mutable ATA whose owner is the recipient and mint is the destination mint. + recipient_token: UncheckedAccount<'info>, + + /// CHECK: This account must be the owner of the recipient token account. The recipient token + /// account must be encoded in the prepared fill. + #[account(mut)] + recipient: UncheckedAccount<'info>, + + #[account( + mut, + address = complete_swap.custodian().fee_recipient_token, + )] + fee_recipient_token: Account<'info, token::TokenAccount>, +} + +pub fn complete_swap_relay<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapRelay<'info>>, + instruction_data: Vec, +) -> Result<()> +where + 'c: 'info, +{ + let swap_msg = ctx.accounts.complete_swap.read_message_unchecked(); + + match swap_msg.redeem_mode { + RedeemMode::Relay { + gas_dropoff, + relaying_fee, + } => handle_complete_swap_relay( + ctx, + instruction_data, + swap_msg, + gas_dropoff::denormalize_gas_dropoff(gas_dropoff), + relaying_fee.into(), + ), + _ => err!(SwapLayerError::InvalidRedeemMode), + } +} + +pub fn handle_complete_swap_relay<'a, 'b, 'c, 'info>( + ctx: Context<'a, 'b, 'c, 'info, CompleteSwapRelay<'info>>, + instruction_data: Vec, + swap_msg: SwapMessageV1, + gas_dropoff: u64, + relaying_fee: u64, +) -> Result<()> +where + 'c: 'info, +{ + // Consume prepared fill. + let fill_amount = ctx.accounts.complete_swap.consume_prepared_fill()?; + let payer = &ctx.accounts.complete_swap.payer; + let recipient = &ctx.accounts.recipient; + + // Handle the relayer fee and gas dropoff. Override the relaying fee to zero + // if the payer is the recipient (self redemption). + let (in_amount, gas_dropoff) = if payer.key() != recipient.key() && relaying_fee > 0 { + // Transfer eligible USDC to the fee recipient. + anchor_spl::token::transfer( + CpiContext::new_with_signer( + ctx.accounts.complete_swap.token_program.to_account_info(), + anchor_spl::token::Transfer { + from: ctx.accounts.complete_swap.src_swap_token.to_account_info(), + to: ctx.accounts.fee_recipient_token.to_account_info(), + authority: ctx.accounts.complete_swap.authority.to_account_info(), + }, + &[&[ + crate::SWAP_AUTHORITY_SEED_PREFIX, + ctx.accounts.complete_swap.prepared_fill_key().as_ref(), + &[ctx.bumps.complete_swap.authority], + ]], + ), + relaying_fee, + )?; + + ( + fill_amount + .checked_sub(relaying_fee) + .ok_or(SwapLayerError::InvalidRelayerFee)?, + gas_dropoff.into(), + ) + } else { + (fill_amount, None) + }; + + complete_swap_jup_v6( + &ctx.accounts.complete_swap, + &ctx.bumps.complete_swap, + ctx.remaining_accounts, + instruction_data, + in_amount, + swap_msg, + &ctx.accounts.recipient, + &ctx.accounts.recipient_token, + gas_dropoff, + ) +} diff --git a/solana/programs/swap-layer/src/processor/complete/usdc/direct.rs b/solana/programs/swap-layer/src/processor/complete/transfer/direct.rs similarity index 93% rename from solana/programs/swap-layer/src/processor/complete/usdc/direct.rs rename to solana/programs/swap-layer/src/processor/complete/transfer/direct.rs index 82e846c1..4e63d087 100644 --- a/solana/programs/swap-layer/src/processor/complete/usdc/direct.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/direct.rs @@ -56,8 +56,8 @@ pub fn complete_transfer_direct(ctx: Context) -> Result< .accounts .consume_swap_layer_fill .consume_prepared_fill( - ctx.accounts.recipient_token_account.to_account_info(), - ctx.accounts.token_program.to_account_info(), + ctx.accounts.recipient_token_account.as_ref().as_ref(), + &ctx.accounts.token_program, ) .map(|_| ()), _ => err!(SwapLayerError::InvalidRedeemMode), diff --git a/solana/programs/swap-layer/src/processor/complete/other/mod.rs b/solana/programs/swap-layer/src/processor/complete/transfer/mod.rs similarity index 64% rename from solana/programs/swap-layer/src/processor/complete/other/mod.rs rename to solana/programs/swap-layer/src/processor/complete/transfer/mod.rs index b1a7d687..19e75509 100644 --- a/solana/programs/swap-layer/src/processor/complete/other/mod.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/mod.rs @@ -1,5 +1,8 @@ mod direct; pub use direct::*; +mod payload; +pub use payload::*; + mod relay; pub use relay::*; diff --git a/solana/programs/swap-layer/src/processor/complete/usdc/payload.rs b/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs similarity index 80% rename from solana/programs/swap-layer/src/processor/complete/usdc/payload.rs rename to solana/programs/swap-layer/src/processor/complete/transfer/payload.rs index 05b50d75..ea324b04 100644 --- a/solana/programs/swap-layer/src/processor/complete/usdc/payload.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs @@ -34,7 +34,10 @@ pub struct CompleteTransferPayload<'info> { #[account( init_if_needed, payer = payer, - space = try_compute_staged_inbound_size(&consume_swap_layer_fill.read_message_unchecked())?, + space = StagedInbound::try_compute_size_if_needed( + staged_inbound, + consume_swap_layer_fill.read_message_unchecked() + )?, seeds = [ StagedInbound::SEED_PREFIX, consume_swap_layer_fill.prepared_fill_key().as_ref(), @@ -69,8 +72,8 @@ pub fn complete_transfer_payload(ctx: Context) -> Resul if staged_inbound.staged_by == Pubkey::default() { // Consume the prepared fill, and send the tokens to the staged custody account. ctx.accounts.consume_swap_layer_fill.consume_prepared_fill( - ctx.accounts.staged_custody_token.to_account_info(), - ctx.accounts.token_program.to_account_info(), + ctx.accounts.staged_custody_token.as_ref().as_ref(), + &ctx.accounts.token_program, )?; let swap_msg = ctx @@ -84,7 +87,7 @@ pub fn complete_transfer_payload(ctx: Context) -> Resul bump: ctx.bumps.staged_inbound, }, info: StagedInboundInfo { - staged_custody_token_bump: ctx.bumps.staged_custody_token, + custody_token: ctx.accounts.staged_custody_token.key(), staged_by: ctx.accounts.payer.key(), source_chain: ctx.accounts.consume_swap_layer_fill.fill.source_chain, recipient: Pubkey::from(swap_msg.recipient), @@ -97,18 +100,6 @@ pub fn complete_transfer_payload(ctx: Context) -> Resul Ok(()) } -fn try_compute_staged_inbound_size(swap_msg: &SwapMessageV1) -> Result { - // Match on Payload redeem type. - match &swap_msg.redeem_mode { - RedeemMode::Payload(payload) => { - let payload_size = payload.len(); - StagedInbound::checked_compute_size(payload_size) - .ok_or(error!(SwapLayerError::PayloadTooLarge)) - } - _ => Err(SwapLayerError::InvalidRedeemMode.into()), - } -} - fn get_swap_message_payload(swap_msg: &SwapMessageV1) -> Result<&[u8]> { match &swap_msg.redeem_mode { RedeemMode::Payload(payload) => Ok(payload), diff --git a/solana/programs/swap-layer/src/processor/complete/usdc/relay.rs b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs similarity index 97% rename from solana/programs/swap-layer/src/processor/complete/usdc/relay.rs rename to solana/programs/swap-layer/src/processor/complete/transfer/relay.rs index 21a66893..5eace2ea 100644 --- a/solana/programs/swap-layer/src/processor/complete/usdc/relay.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs @@ -132,10 +132,10 @@ fn handle_complete_transfer_relay( let token_program = &ctx.accounts.token_program; // CPI Call token router. - let fill_amount = ctx.accounts.consume_swap_layer_fill.consume_prepared_fill( - complete_token.to_account_info(), - token_program.to_account_info(), - )?; + let fill_amount = ctx + .accounts + .consume_swap_layer_fill + .consume_prepared_fill(complete_token.as_ref(), token_program)?; let custodian = &ctx.accounts.consume_swap_layer_fill.custodian; let payer = &ctx.accounts.payer; diff --git a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs index 522cabdf..51733e23 100644 --- a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs +++ b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs @@ -88,7 +88,8 @@ pub struct InitiateSwapExactIn<'info> { init_if_needed, payer = payer, associated_token::mint = src_mint, - associated_token::authority = swap_authority + associated_token::authority = swap_authority, + associated_token::token_program = src_token_program )] src_swap_token: Box>, diff --git a/solana/programs/swap-layer/src/processor/release_inbound.rs b/solana/programs/swap-layer/src/processor/release_inbound.rs index c5844509..f602c99d 100644 --- a/solana/programs/swap-layer/src/processor/release_inbound.rs +++ b/solana/programs/swap-layer/src/processor/release_inbound.rs @@ -31,15 +31,9 @@ pub struct ReleaseInbound<'info> { dst_token: UncheckedAccount<'info>, /// Staged custody token account. This account will be closed at the end of this instruction. - /// - /// CHECK: Mutable. Seeds must be \["staged-custody-token"\]. #[account( mut, - seeds = [ - crate::STAGED_CUSTODY_TOKEN_SEED_PREFIX, - staged_inbound.key().as_ref(), - ], - bump = staged_inbound.staged_custody_token_bump, + address = staged_inbound.custody_token, )] staged_custody_token: Account<'info, token::TokenAccount>, diff --git a/solana/programs/swap-layer/src/processor/stage_outbound.rs b/solana/programs/swap-layer/src/processor/stage_outbound.rs index 058ae20d..4e85c4d9 100644 --- a/solana/programs/swap-layer/src/processor/stage_outbound.rs +++ b/solana/programs/swap-layer/src/processor/stage_outbound.rs @@ -38,8 +38,9 @@ pub struct StageOutbound<'info> { #[account( mut, token::mint = src_mint, + token::token_program = src_token_program, )] - sender_token: Option>, + sender_token: Option>, /// Peer used to determine whether assets are sent to a valid destination. The registered peer /// will also act as the authority over the staged custody token account. @@ -82,6 +83,7 @@ pub struct StageOutbound<'info> { payer = payer, token::mint = src_mint, token::authority = target_peer, + token::token_program = src_token_program, seeds = [ crate::STAGED_CUSTODY_TOKEN_SEED_PREFIX, staged_outbound.key().as_ref(), @@ -92,15 +94,16 @@ pub struct StageOutbound<'info> { #[account( mut, - token::mint = common::USDC_MINT, + token::mint = common::USDC_MINT )] usdc_refund_token: Box>, /// Mint can either be USDC or whichever mint is used to swap into USDC. + #[account(token::token_program = src_token_program)] src_mint: Box>, - token_program: Program<'info, token::Token>, src_token_program: Interface<'info, token_interface::TokenInterface>, + token_program: Program<'info, token::Token>, system_program: Program<'info, System>, } @@ -186,8 +189,9 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R None => (amount_in, StagedRedeem::Direct), }; - let src_token_program = &ctx.accounts.token_program; + let src_token_program = &ctx.accounts.src_token_program; let custody_token = &ctx.accounts.staged_custody_token; + let src_mint = &ctx.accounts.src_mint; let sender = match &ctx.accounts.sender_token { Some(sender_token) => match ( @@ -195,8 +199,6 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R &ctx.accounts.program_transfer_authority, ) { (Some(sender), None) => { - let src_mint = &ctx.accounts.src_mint; - token_interface::transfer_checked( CpiContext::new( src_token_program.to_account_info(), @@ -224,13 +226,14 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R let (hashed_args, authority_bump) = last_transfer_authority_signer_seeds.unwrap(); - token::transfer( + token_interface::transfer_checked( CpiContext::new_with_signer( - ctx.accounts.token_program.to_account_info(), - token::Transfer { + src_token_program.to_account_info(), + token_interface::TransferChecked { from: sender_token.to_account_info(), to: custody_token.to_account_info(), authority: program_transfer_authority.to_account_info(), + mint: src_mint.to_account_info(), }, &[&[ crate::TRANSFER_AUTHORITY_SEED_PREFIX, @@ -239,6 +242,7 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R ]], ), transfer_amount, + src_mint.decimals, )?; sender_token.owner diff --git a/solana/programs/swap-layer/src/state/staged/inbound.rs b/solana/programs/swap-layer/src/state/staged/inbound.rs index dc12eb87..2b1825b0 100644 --- a/solana/programs/swap-layer/src/state/staged/inbound.rs +++ b/solana/programs/swap-layer/src/state/staged/inbound.rs @@ -1,4 +1,7 @@ use anchor_lang::prelude::*; +use swap_layer_messages::{messages::SwapMessageV1, types::RedeemMode}; + +use crate::error::SwapLayerError; #[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, InitSpace)] pub struct StagedInboundSeeds { @@ -8,7 +11,7 @@ pub struct StagedInboundSeeds { #[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, InitSpace)] pub struct StagedInboundInfo { - pub staged_custody_token_bump: u8, + pub custody_token: Pubkey, // Payer that created this StagedInbound. pub staged_by: Pubkey, @@ -36,14 +39,31 @@ pub struct StagedInbound { impl StagedInbound { pub const SEED_PREFIX: &'static [u8] = b"staged-inbound"; - pub fn checked_compute_size(payload_len: usize) -> Option { + pub fn try_compute_size(swap_msg: SwapMessageV1) -> Result { const FIXED: usize = 8 // DISCRIMINATOR + StagedInboundSeeds::INIT_SPACE + StagedInboundInfo::INIT_SPACE + 4 // payload len ; - payload_len.checked_add(FIXED) + match swap_msg.redeem_mode { + RedeemMode::Payload(payload) => payload + .len() + .checked_add(FIXED) + .ok_or(error!(SwapLayerError::PayloadTooLarge)), + _ => err!(SwapLayerError::InvalidRedeemMode), + } + } + + pub fn try_compute_size_if_needed( + acc_info: &AccountInfo, + swap_msg: SwapMessageV1, + ) -> Result { + if acc_info.data_is_empty() { + Self::try_compute_size(swap_msg) + } else { + Ok(acc_info.data_len()) + } } } diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 53ad98dc..eb153a0c 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -198,19 +198,18 @@ export class SwapLayerProgram { } async swapAccounts(accounts: { - preparedSource: PublicKey; + authority: PublicKey; sourceMint: PublicKey; destinationMint: PublicKey; srcTokenProgram?: PublicKey; dstTokenProgram?: PublicKey; }): Promise<{ - swapAuthority: PublicKey; srcSwapToken: PublicKey; dstSwapToken: PublicKey; srcTokenProgram: PublicKey; dstTokenProgram: PublicKey; }> { - const { preparedSource, sourceMint, destinationMint } = accounts; + const { authority, sourceMint, destinationMint } = accounts; let { srcTokenProgram, dstTokenProgram } = accounts; if (srcTokenProgram === undefined) { @@ -222,18 +221,16 @@ export class SwapLayerProgram { dstTokenProgram = accInfo.owner; } - const swapAuthority = this.swapAuthorityAddress(preparedSource); return { - swapAuthority, srcSwapToken: splToken.getAssociatedTokenAddressSync( sourceMint, - swapAuthority, + authority, true, srcTokenProgram, ), dstSwapToken: splToken.getAssociatedTokenAddressSync( destinationMint, - swapAuthority, + authority, true, dstTokenProgram, ), @@ -710,14 +707,15 @@ export class SwapLayerProgram { preparedOrder ??= this.preparedOrderAddress(stagedOutbound); stagedCustodyToken ??= this.stagedCustodyTokenAddress(stagedOutbound); + const swapAuthority = this.swapAuthorityAddress(preparedOrder); const swapAccounts = await this.swapAccounts({ - preparedSource: preparedOrder, + authority: swapAuthority, sourceMint: srcMint, destinationMint: this.usdcMint, srcTokenProgram, dstTokenProgram: splToken.TOKEN_PROGRAM_ID, }); - const { swapAuthority, srcSwapToken, dstSwapToken } = swapAccounts; + const { srcSwapToken, dstSwapToken } = swapAccounts; srcTokenProgram ??= swapAccounts.srcTokenProgram; const tokenRouter = this.tokenRouterProgram(); @@ -920,14 +918,15 @@ export class SwapLayerProgram { beneficiary ??= payer; dstMint ??= splToken.NATIVE_MINT; + const swapAuthority = this.swapAuthorityAddress(preparedFill); const swapAccounts = await this.swapAccounts({ - preparedSource: preparedFill, + authority: swapAuthority, sourceMint: this.usdcMint, destinationMint: dstMint, srcTokenProgram: splToken.TOKEN_PROGRAM_ID, dstTokenProgram, }); - const { swapAuthority, srcSwapToken, dstSwapToken } = swapAccounts; + const { srcSwapToken, dstSwapToken } = swapAccounts; dstTokenProgram ??= swapAccounts.dstTokenProgram; return this.program.methods @@ -978,14 +977,15 @@ export class SwapLayerProgram { dstMint ??= splToken.NATIVE_MINT; feeRecipientToken ??= await this.fetchCustodian().then((c) => c.feeRecipientToken); + const swapAuthority = this.swapAuthorityAddress(preparedFill); const swapAccounts = await this.swapAccounts({ - preparedSource: preparedFill, + authority: swapAuthority, sourceMint: this.usdcMint, destinationMint: dstMint, srcTokenProgram: splToken.TOKEN_PROGRAM_ID, dstTokenProgram, }); - const { swapAuthority, srcSwapToken, dstSwapToken } = swapAccounts; + const { srcSwapToken, dstSwapToken } = swapAccounts; dstTokenProgram ??= swapAccounts.dstTokenProgram; return this.program.methods @@ -1015,6 +1015,58 @@ export class SwapLayerProgram { .instruction(); } + async completeSwapPayloadIx( + accounts: { + payer: PublicKey; + preparedFill: PublicKey; + dstMint?: PublicKey; + beneficiary?: PublicKey; + dstTokenProgram?: PublicKey; + }, + args: { + cpiInstruction: TransactionInstruction; + }, + ): Promise { + const { payer, preparedFill } = accounts; + const { cpiInstruction } = args; + + let { beneficiary, dstMint, dstTokenProgram } = accounts; + beneficiary ??= payer; + dstMint ??= splToken.NATIVE_MINT; + + const stagedInbound = this.stagedInboundAddress(preparedFill); + const swapAccounts = await this.swapAccounts({ + authority: stagedInbound, + sourceMint: this.usdcMint, + destinationMint: dstMint, + srcTokenProgram: splToken.TOKEN_PROGRAM_ID, + dstTokenProgram, + }); + const { srcSwapToken, dstSwapToken } = swapAccounts; + dstTokenProgram ??= swapAccounts.dstTokenProgram; + + return this.program.methods + .completeSwapPayload(cpiInstruction.data) + .accounts({ + payer, + consumeSwapLayerFill: await this.consumeSwapLayerFillComposite({ + preparedFill, + beneficiary, + }), + stagedInbound, + srcSwapToken, + dstSwapToken, + usdc: this.usdcComposite(), + dstMint, + associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, + tokenProgram: splToken.TOKEN_PROGRAM_ID, + dstTokenProgram, + systemProgram: SystemProgram.programId, + }) + .remainingAccounts(cpiInstruction.keys) + .instruction(); + } + tokenRouterProgram(): tokenRouterSdk.TokenRouterProgram { switch (this._programId) { case localnet(): { diff --git a/solana/ts/src/swapLayer/state/StagedInbound.ts b/solana/ts/src/swapLayer/state/StagedInbound.ts index dc37107a..366257a8 100644 --- a/solana/ts/src/swapLayer/state/StagedInbound.ts +++ b/solana/ts/src/swapLayer/state/StagedInbound.ts @@ -6,7 +6,7 @@ export type StagedInboundSeeds = { }; export type StagedInboundInfo = { - stagedCustodyTokenBump: number; + custodyToken: PublicKey; stagedBy: PublicKey; sourceChain: number; recipient: PublicKey; diff --git a/solana/ts/tests/01__swapLayer.ts b/solana/ts/tests/01__transfer.ts similarity index 99% rename from solana/ts/tests/01__swapLayer.ts rename to solana/ts/tests/01__transfer.ts index 7ae19efe..89202505 100644 --- a/solana/ts/tests/01__swapLayer.ts +++ b/solana/ts/tests/01__transfer.ts @@ -3291,8 +3291,7 @@ describe("Swap Layer", () => { bump: stagedInboundData.seeds.bump, }, { - stagedCustodyTokenBump: - stagedInboundData.info.stagedCustodyTokenBump, + custodyToken: stagedInboundTokenAddress, stagedBy: payer.publicKey, sourceChain: foreignChain, recipient: recipient.publicKey, diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index f3f693d3..bd9d4302 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -17,7 +17,6 @@ import { LiquidityLayerDeposit, LiquidityLayerMessage, Uint64, - uint64ToBigInt, } from "@wormhole-foundation/example-liquidity-layer-solana/common"; import * as matchingEngineSdk from "@wormhole-foundation/example-liquidity-layer-solana/matchingEngine"; import { @@ -26,8 +25,6 @@ import { ETHEREUM_USDC_ADDRESS, LOCALHOST, MOCK_GUARDIANS, - OWNER_ASSISTANT_KEYPAIR, - OWNER_KEYPAIR, PAYER_KEYPAIR, REGISTERED_TOKEN_ROUTERS, USDC_MINT_ADDRESS, @@ -40,26 +37,25 @@ import { } from "@wormhole-foundation/example-liquidity-layer-solana/testing"; import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; import { VaaAccount } from "@wormhole-foundation/example-liquidity-layer-solana/wormhole"; -import { Chain, ChainId, toChain, toChainId } from "@wormhole-foundation/sdk-base"; -import { UniversalAddress, toUniversal } from "@wormhole-foundation/sdk-definitions"; +import { Chain, ChainId, toChainId } from "@wormhole-foundation/sdk-base"; +import { UniversalAddress, toNative, toUniversal } from "@wormhole-foundation/sdk-definitions"; import { assert } from "chai"; import * as fs from "fs"; import * as jupiterV6 from "../src/jupiterV6"; import { OutputToken, RedeemMode, + StagedInbound, StagedOutboundInfo, SwapLayerMessage, SwapLayerProgram, calculateRelayerFee, decodeSwapLayerMessage, denormalizeGasDropOff, - encodeOutputToken, encodeSwapLayerMessage, localnet, } from "../src/swapLayer"; import { - FEE_UPDATER_KEYPAIR, REGISTERED_PEERS, USDT_MINT_ADDRESS, createLut, @@ -228,136 +224,138 @@ describe("Jupiter V6 Testing", () => { }); describe("USDC Swap (Relay)", function () { - it("Outbound (USDT via Whirlpool)", async function () { - const srcMint = USDT_MINT_ADDRESS; + describe("Outbound", function () { + it("USDT via Whirlpool", async function () { + const srcMint = USDT_MINT_ADDRESS; - const { - stagedOutbound, - stagedCustodyToken, - custodyBalance: inAmount, - stagedOutboundInfo, - redeemMode, - outputToken, - } = await stageOutboundForTest( - { - payer: payer.publicKey, - senderToken: splToken.getAssociatedTokenAddressSync( + const { + stagedOutbound, + stagedCustodyToken, + custodyBalance: inAmount, + stagedOutboundInfo, + redeemMode, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), srcMint, - payer.publicKey, - false, - await whichTokenProgram(connection, srcMint), - ), - srcMint, - }, - { - redeemOption: { - relay: { gasDropoff: 500000, maxRelayerFee: 9999999999999n }, }, - }, - ); - - const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); - const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); - const { - instruction: cpiInstruction, - sourceToken, - destinationToken, - sourceMint, - destinationMint, - minAmountOut, - } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { - inAmount, - quotedOutAmount: inAmount, // stable swap - slippageBps: 50, - cpi: true, - }); - assert.deepEqual(sourceMint, srcMint); - assert.deepEqual(destinationMint, swapLayer.usdcMint); + { + redeemOption: { + relay: { gasDropoff: 500000, maxRelayerFee: 9999999999999n }, + }, + }, + ); - { - const accInfos = await connection.getMultipleAccountsInfo([ + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { + instruction: cpiInstruction, sourceToken, destinationToken, - ]); - assert.isTrue(accInfos.every((info) => info === null)); - } + sourceMint, + destinationMint, + minAmountOut, + } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 50, + cpi: true, + }); + assert.deepEqual(sourceMint, srcMint); + assert.deepEqual(destinationMint, swapLayer.usdcMint); - const ix = await swapLayer.initiateSwapExactInIx( - { - payer: payer.publicKey, - stagedOutbound, - srcMint, - }, { - cpiInstruction, - }, - ); - - const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ - units: 360_000, - }); + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } - const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { - const resp = await connection.getAddressLookupTable(lookupTableAddress); - return resp.value; - }), - ); + const ix = await swapLayer.initiateSwapExactInIx( + { + payer: payer.publicKey, + stagedOutbound, + srcMint, + }, + { + cpiInstruction, + }, + ); - await expectIxOk(connection, [computeIx, ix], [payer], { - addressLookupTableAccounts, - }); + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 360_000, + }); - { - const accInfos = await connection.getMultipleAccountsInfo([ - sourceToken, - destinationToken, - stagedOutbound, - stagedCustodyToken, - ]); - assert.isTrue(accInfos.every((info) => info === null)); - } + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); - const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; - const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts, + }); - // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + stagedOutbound, + stagedCustodyToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } - const { info } = preparedOrderData; - assert.deepEqual( - preparedOrderData, - new tokenRouterSdk.PreparedOrder( - { - orderSender: swapLayer.custodianAddress(), - preparedBy: payer.publicKey, - orderType: { - market: { - minAmountOut: null, + const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; + const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); + + const { info } = preparedOrderData; + assert.deepEqual( + preparedOrderData, + new tokenRouterSdk.PreparedOrder( + { + orderSender: swapLayer.custodianAddress(), + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, }, + srcToken: destinationToken, + refundToken: usdcRefundToken, + targetChain, + redeemer, + preparedCustodyTokenBump: info.preparedCustodyTokenBump, }, - srcToken: destinationToken, - refundToken: usdcRefundToken, - targetChain, - redeemer, - preparedCustodyTokenBump: info.preparedCustodyTokenBump, - }, - Buffer.from( - encodeSwapLayerMessage({ - recipient: new UniversalAddress(Uint8Array.from(recipient)), - redeemMode, - outputToken, - }), + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress(Uint8Array.from(recipient)), + redeemMode, + outputToken, + }), + ), ), - ), - ); + ); - // Verify the prepared custody token balance. - const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( - connection, - tokenRouter.preparedCustodyTokenAddress(preparedOrder), - ); - assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder), + ); + assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + }); }); describe("Inbound", function () { @@ -735,127 +733,131 @@ describe("Jupiter V6 Testing", () => { }); describe("USDC Swap (Direct)", function () { - it("Outbound (USDT via Whirlpool)", async function () { - const srcMint = USDT_MINT_ADDRESS; + describe("Outbound", function () { + it("USDT via Whirlpool", async function () { + const srcMint = USDT_MINT_ADDRESS; - const { - stagedOutbound, - stagedCustodyToken, - custodyBalance: inAmount, - stagedOutboundInfo, - redeemMode, - outputToken, - } = await stageOutboundForTest({ - payer: payer.publicKey, - senderToken: splToken.getAssociatedTokenAddressSync( + const { + stagedOutbound, + stagedCustodyToken, + custodyBalance: inAmount, + stagedOutboundInfo, + redeemMode, + outputToken, + } = await stageOutboundForTest({ + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), srcMint, - payer.publicKey, - false, - await whichTokenProgram(connection, srcMint), - ), - srcMint, - }); - - const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); - const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); - const { - instruction: cpiInstruction, - sourceToken, - destinationToken, - sourceMint, - destinationMint, - minAmountOut, - } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { - inAmount, - quotedOutAmount: inAmount, // stable swap - slippageBps: 50, - cpi: true, - }); - assert.deepEqual(sourceMint, srcMint); - assert.deepEqual(destinationMint, swapLayer.usdcMint); + }); - { - const accInfos = await connection.getMultipleAccountsInfo([ + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { + instruction: cpiInstruction, sourceToken, destinationToken, - ]); - assert.isTrue(accInfos.every((info) => info === null)); - } + sourceMint, + destinationMint, + minAmountOut, + } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 50, + cpi: true, + }); + assert.deepEqual(sourceMint, srcMint); + assert.deepEqual(destinationMint, swapLayer.usdcMint); - const ix = await swapLayer.initiateSwapExactInIx( - { - payer: payer.publicKey, - stagedOutbound, - srcMint, - }, { - cpiInstruction, - }, - ); - - const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ - units: 360_000, - }); + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } - const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { - const resp = await connection.getAddressLookupTable(lookupTableAddress); - return resp.value; - }), - ); + const ix = await swapLayer.initiateSwapExactInIx( + { + payer: payer.publicKey, + stagedOutbound, + srcMint, + }, + { + cpiInstruction, + }, + ); - await expectIxOk(connection, [computeIx, ix], [payer], { addressLookupTableAccounts }); + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 360_000, + }); - { - const accInfos = await connection.getMultipleAccountsInfo([ - sourceToken, - destinationToken, - stagedOutbound, - stagedCustodyToken, - ]); - assert.isTrue(accInfos.every((info) => info === null)); - } + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); - const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; - const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts, + }); - // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + stagedOutbound, + stagedCustodyToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } - const { info } = preparedOrderData; - assert.deepEqual( - preparedOrderData, - new tokenRouterSdk.PreparedOrder( - { - orderSender: swapLayer.custodianAddress(), - preparedBy: payer.publicKey, - orderType: { - market: { - minAmountOut: null, + const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; + const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); + + const { info } = preparedOrderData; + assert.deepEqual( + preparedOrderData, + new tokenRouterSdk.PreparedOrder( + { + orderSender: swapLayer.custodianAddress(), + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, }, + srcToken: destinationToken, + refundToken: usdcRefundToken, + targetChain, + redeemer, + preparedCustodyTokenBump: info.preparedCustodyTokenBump, }, - srcToken: destinationToken, - refundToken: usdcRefundToken, - targetChain, - redeemer, - preparedCustodyTokenBump: info.preparedCustodyTokenBump, - }, - Buffer.from( - encodeSwapLayerMessage({ - recipient: new UniversalAddress(Uint8Array.from(recipient)), - redeemMode, - outputToken, - }), + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress(Uint8Array.from(recipient)), + redeemMode, + outputToken, + }), + ), ), - ), - ); + ); - // Verify the prepared custody token balance. - const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( - connection, - tokenRouter.preparedCustodyTokenAddress(preparedOrder), - ); - assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder), + ); + assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + }); }); describe("Inbound", function () { @@ -972,142 +974,146 @@ describe("Jupiter V6 Testing", () => { }); describe("USDC Transfer (Payload)", function () { - it("Outbound (USDT via Whirlpool)", async function () { - const srcMint = USDT_MINT_ADDRESS; + describe("Outbound", function () { + it("USDT via Whirlpool", async function () { + const srcMint = USDT_MINT_ADDRESS; - const { - stagedOutbound, - stagedCustodyToken, - custodyBalance: inAmount, - stagedOutboundInfo, - redeemMode, - outputToken, - } = await stageOutboundForTest( - { - payer: payer.publicKey, - senderToken: splToken.getAssociatedTokenAddressSync( + const { + stagedOutbound, + stagedCustodyToken, + custodyBalance: inAmount, + stagedOutboundInfo, + redeemMode, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), srcMint, - payer.publicKey, - false, - await whichTokenProgram(connection, srcMint), - ), - srcMint, - }, - { - redeemOption: { - payload: Buffer.from("All your base are belong to us."), }, - }, - ); - - const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); - const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); - const { - instruction: cpiInstruction, - sourceToken, - destinationToken, - sourceMint, - destinationMint, - minAmountOut, - } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { - inAmount, - quotedOutAmount: inAmount, // stable swap - slippageBps: 50, - cpi: true, - }); - assert.deepEqual(sourceMint, srcMint); - assert.deepEqual(destinationMint, swapLayer.usdcMint); + { + redeemOption: { + payload: Buffer.from("All your base are belong to us."), + }, + }, + ); - { - const accInfos = await connection.getMultipleAccountsInfo([ + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { + instruction: cpiInstruction, sourceToken, destinationToken, - ]); - assert.isTrue(accInfos.every((info) => info === null)); - } + sourceMint, + destinationMint, + minAmountOut, + } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 50, + cpi: true, + }); + assert.deepEqual(sourceMint, srcMint); + assert.deepEqual(destinationMint, swapLayer.usdcMint); - const ix = await swapLayer.initiateSwapExactInIx( - { - payer: payer.publicKey, - stagedOutbound, - srcMint, - }, { - cpiInstruction, - }, - ); - - const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ - units: 360_000, - }); + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } - const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { - const resp = await connection.getAddressLookupTable(lookupTableAddress); - return resp.value; - }), - ); + const ix = await swapLayer.initiateSwapExactInIx( + { + payer: payer.publicKey, + stagedOutbound, + srcMint, + }, + { + cpiInstruction, + }, + ); - await expectIxOk(connection, [computeIx, ix], [payer], { - addressLookupTableAccounts, - }); + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 360_000, + }); - { - const accInfos = await connection.getMultipleAccountsInfo([ - sourceToken, - destinationToken, - stagedOutbound, - stagedCustodyToken, - ]); - assert.isTrue(accInfos.every((info) => info === null)); - } + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); - const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; - const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts, + }); - // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + stagedOutbound, + stagedCustodyToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } - const { info } = preparedOrderData; - assert.deepEqual( - preparedOrderData, - new tokenRouterSdk.PreparedOrder( - { - orderSender: swapLayer.custodianAddress(), - preparedBy: payer.publicKey, - orderType: { - market: { - minAmountOut: null, + const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; + const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); + + const { info } = preparedOrderData; + assert.deepEqual( + preparedOrderData, + new tokenRouterSdk.PreparedOrder( + { + orderSender: swapLayer.custodianAddress(), + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, }, + srcToken: destinationToken, + refundToken: usdcRefundToken, + targetChain, + redeemer, + preparedCustodyTokenBump: info.preparedCustodyTokenBump, }, - srcToken: destinationToken, - refundToken: usdcRefundToken, - targetChain, - redeemer, - preparedCustodyTokenBump: info.preparedCustodyTokenBump, - }, - Buffer.from( - encodeSwapLayerMessage({ - recipient: new UniversalAddress(Uint8Array.from(recipient)), - redeemMode, - outputToken, - }), + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress(Uint8Array.from(recipient)), + redeemMode, + outputToken, + }), + ), ), - ), - ); + ); - // Verify the prepared custody token balance. - const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( - connection, - tokenRouter.preparedCustodyTokenAddress(preparedOrder), - ); - assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder), + ); + assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + }); }); describe("Inbound", function () { const emittedEvents: EmittedFilledLocalFastOrder[] = []; let listenerId: number | null; + const localVariables = new Map(); + before("Start Event Listener", async function () { listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { emittedEvents.push({ event, slot, signature }); @@ -1119,6 +1125,45 @@ describe("Jupiter V6 Testing", () => { matchingEngine.program.removeEventListener(listenerId!); } }); + + it("Other (USDT) via Whirlpool", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 15, + }); + + const amountIn = 200_000_000n; + const { preparedFill } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + redeemMode: { + mode: "Payload", + payload: Buffer.from("All your base are belong to us."), + }, + outputToken, + amountIn, + }, + ); + + await completeSwapPayloadForTest( + { + payer: payer.publicKey, + preparedFill, + dstMint, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + }, + ); + + // Save for later. + localVariables.set("preparedFill", preparedFill); + }); }); }); @@ -1358,6 +1403,105 @@ describe("Jupiter V6 Testing", () => { assert.equal(feeRecipientAfter - feeRecipientBefore, selfRedeem ? 0 : relayingFee); } + async function completeSwapPayloadForTest( + accounts: { + payer: PublicKey; + preparedFill: PublicKey; + dstMint?: PublicKey; + }, + opts: ForTestOpts & { + limitAmount: bigint; + swapResponseModifier: ( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ) => Promise; + }, + ): Promise { + const [{ signers, errorMsg }, otherOpts] = setDefaultForTestOpts(opts); + const { limitAmount, swapResponseModifier } = otherOpts; + + const stagedInbound = swapLayer.stagedInboundAddress(accounts.preparedFill); + const { + instruction: cpiInstruction, + destinationMint, + destinationToken, + } = await swapResponseModifier(stagedInbound, { + cpi: true, + }); + + const expectedDstMint = accounts.dstMint ?? splToken.NATIVE_MINT; + assert.deepEqual(destinationMint, expectedDstMint); + assert.deepEqual( + destinationToken, + splToken.getAssociatedTokenAddressSync( + expectedDstMint, + stagedInbound, + true, + await whichTokenProgram(connection, expectedDstMint), + ), + ); + + const ix = await swapLayer.completeSwapPayloadIx(accounts, { cpiInstruction }); + + const ixs = [ + ComputeBudgetProgram.setComputeUnitLimit({ + units: 420_000, + }), + ix, + ]; + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + if (errorMsg !== null) { + await expectIxErr(connection, ixs, signers, errorMsg, { + addressLookupTableAccounts, + }); + return; + } + + const { info: preparedFillInfo, redeemerMessage } = await tokenRouter.fetchPreparedFill( + accounts.preparedFill, + ); + + await expectIxOk(connection, ixs, signers, { + addressLookupTableAccounts, + }); + + const { recipient, redeemMode, outputToken } = decodeSwapLayerMessage(redeemerMessage); + if (redeemMode.mode !== "Payload") { + assert.fail("Not in payload mode"); + } + + const stagedInboundData = await swapLayer.fetchStagedInbound(stagedInbound); + const { seeds } = stagedInboundData; + assert.deepEqual( + stagedInboundData, + new StagedInbound( + { preparedFill: accounts.preparedFill, bump: seeds.bump }, + { + custodyToken: destinationToken, + stagedBy: accounts.payer, + sourceChain: preparedFillInfo.sourceChain, + recipient: toNative("Solana", recipient).address, + isNative: outputToken.type === "Gas", + }, + Buffer.from(redeemMode.payload), + ), + ); + + if (outputToken.type === "Gas" || outputToken.type === "Other") { + const { amount } = await splToken.getAccount(connection, destinationToken); + assert.isTrue(amount >= limitAmount); + } else { + assert.fail("Invalid output token type"); + } + } + async function redeemSwapLayerFastFillForTest( accounts: { payer: PublicKey }, emittedEvents: EmittedFilledLocalFastOrder[], From 154d494e5ee1d493800c5e0dd54fda1487c39840 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Fri, 24 May 2024 09:00:21 -0500 Subject: [PATCH 20/50] fix `RedeemMode::Payload` encoding (#50) * add sender * universal/rs: remove anchor-lang * universal/rs: reorganize * universal/rs: payload len u32 -> u16; clean up * solana: uptick solana-program --------- Co-authored-by: A5 Pickle --- .github/workflows/solana.yml | 2 +- package-lock.json | 5 +- solana/Anchor.toml | 2 +- solana/Cargo.lock | 29 ++--- solana/Cargo.toml | 2 +- solana/programs/swap-layer/Cargo.toml | 1 - .../src/processor/complete/swap/payload.rs | 53 ++++---- .../processor/complete/transfer/payload.rs | 40 +++--- .../src/processor/initiate/transfer.rs | 47 ++----- .../swap-layer/src/state/staged/inbound.rs | 14 +- .../swap-layer/src/state/staged/outbound.rs | 17 ++- solana/ts/src/swapLayer/messages/layouts.ts | 8 +- .../ts/src/swapLayer/state/StagedInbound.ts | 1 + solana/ts/tests/00__messages.ts | 8 +- solana/ts/tests/01__transfer.ts | 41 ++++-- solana/ts/tests/10__swap.ts | 17 ++- universal/rs/Cargo.toml | 1 - universal/rs/messages/Cargo.toml | 4 - universal/rs/messages/src/messages/mod.rs | 15 ++- universal/rs/messages/src/types/mod.rs | 121 +----------------- .../src/types/{output.rs => output_token.rs} | 5 - .../rs/messages/src/types/redeem_mode.rs | 92 +++++++++++++ .../src/types/swap_type/evm/trader_joe.rs | 6 - .../src/types/swap_type/evm/uniswap_v3.rs | 5 - .../rs/messages/src/types/swap_type/mod.rs | 4 - .../src/types/swap_type/solana/jupiter_v6.rs | 4 - universal/rs/messages/src/types/uint.rs | 119 ----------------- 27 files changed, 261 insertions(+), 402 deletions(-) rename universal/rs/messages/src/types/{output.rs => output_token.rs} (91%) create mode 100644 universal/rs/messages/src/types/redeem_mode.rs diff --git a/.github/workflows/solana.yml b/.github/workflows/solana.yml index a8facb96..f12bee54 100644 --- a/.github/workflows/solana.yml +++ b/.github/workflows/solana.yml @@ -58,7 +58,7 @@ jobs: - uses: metadaoproject/setup-anchor@v2 with: node-version: "20.11.0" - solana-cli-version: "1.18.11" + solana-cli-version: "1.18.14" anchor-version: "0.30.0" - name: Set default Rust toolchain run: rustup default stable diff --git a/package-lock.json b/package-lock.json index adc3bde9..f21bc414 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3750,8 +3750,7 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-definitions": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", - "integrity": "sha512-qoV+IXNvir79vpjS2VcQZkfwVz4YoKaX+yz6evbspzD3bddJpRDxk16dYh4cQUpeQIRTCUYWAt3ojKdFXnCbbQ==", - "license": "Apache-2.0", + "integrity": "sha512-4x514GY7qszuo+9v3oHbytDXOi9M0/q1Ox46qI/ILuHaAPFrh9tEk2E7oXOXF7A6PpVBg2wXf4io1m8sAW60YQ==", "dependencies": { "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4" @@ -3760,7 +3759,7 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "integrity": "sha512-CyZshOfX+p3EioCPjuCfpLb0+FohPFpohcFPFlSbR5KILCynTHk8SdXGyn2tgkZMJynj6+Boiywkm6Tsx81yyg==", + "integrity": "sha512-bv3GnsZP5GWVHTlnB+6DriV7NRWoL3PgWaGYHelTOEppYBhuJW6WPsbNNr3b7TMKNizPNNn0tkCWqVwglyU2gA==", "dependencies": { "@certusone/wormhole-spydk": "^0.0.1", "@coral-xyz/anchor": "^0.30.0", diff --git a/solana/Anchor.toml b/solana/Anchor.toml index 72b61306..daccf25f 100644 --- a/solana/Anchor.toml +++ b/solana/Anchor.toml @@ -1,6 +1,6 @@ [toolchain] anchor_version = "0.30.0" # CLI -solana_version = "1.18.11" +solana_version = "1.18.14" [features] resolution = false diff --git a/solana/Cargo.lock b/solana/Cargo.lock index 9b3cb1c0..18ad5a0d 100644 --- a/solana/Cargo.lock +++ b/solana/Cargo.lock @@ -1887,9 +1887,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "solana-frozen-abi" -version = "1.18.11" +version = "1.18.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b8177685ab2bc8cc8b3bf63aa1eaa0580d5af850ecefac323ca1c2473085d77" +checksum = "d353eac7a178cd8a2ceaf5d304719d4a30c1d3f24f303145d5b029b8cc7c35f0" dependencies = [ "block-buffer 0.10.4", "bs58 0.4.0", @@ -1912,9 +1912,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.18.11" +version = "1.18.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a68241cad17b74c6034a68ba4890632d409a2c886e7bead9c1e1432befdb7c9" +checksum = "bc87189dcb2d2da407831fc983e4f05e70c58be12b5c713e9a05f873edb42637" dependencies = [ "proc-macro2", "quote", @@ -1924,9 +1924,9 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.18.11" +version = "1.18.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fea560989ef67ba4a1a0fd62a248721f1aa5bac8fa5ede9ccf4fe9ee484ccadf" +checksum = "8d857a115710eeb1c5ac98a340141f0c49cc31854168767d0c5b855e212632a5" dependencies = [ "env_logger", "lazy_static", @@ -1935,9 +1935,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.18.11" +version = "1.18.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bddf573103c890b4ab8f9a6641d4f969d4148bce9a451c263f4a62afa949fae" +checksum = "ad73ff4d5c8d4943988ef18924f5fbd96881410ab20d5a0bfa32bb44d7d4cfce" dependencies = [ "ark-bn254", "ark-ec", @@ -1990,9 +1990,9 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.18.11" +version = "1.18.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08b24b06fa176209ddb2a2f8172a00b07e8a3b18229fbfc49f1eb3ce6ad11ff1" +checksum = "4f518a377209223b09a0fb62abd53add4a11313a1e85f535f559fbcc0227117a" dependencies = [ "assert_matches", "base64 0.21.7", @@ -2045,9 +2045,9 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.18.11" +version = "1.18.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "869483c05f18d37d4d95a08d9e05e00a4f76a8c8349aeedeee9ba2d013cbacde" +checksum = "2975b2c2ed6f06d2ffbb2e6b3e7fdd9ca6b2570a76d49a2173f393e6e84c9c71" dependencies = [ "bs58 0.4.0", "proc-macro2", @@ -2064,9 +2064,9 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-zk-token-sdk" -version = "1.18.11" +version = "1.18.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "459c27f7b954798677d8243aa53b8080cfb314ecfecbf8889a5a65c91ad11fee" +checksum = "7cefc9878a202bf9606745e56712f7d56878ea31b29f2f89785b4b801b264322" dependencies = [ "aes-gcm-siv", "base64 0.21.7", @@ -2330,7 +2330,6 @@ dependencies = [ name = "swap-layer-messages" version = "0.0.0" dependencies = [ - "anchor-lang", "liquidity-layer-messages", "ruint", "wormhole-io", diff --git a/solana/Cargo.toml b/solana/Cargo.toml index 1ecf3dc6..1c74142b 100644 --- a/solana/Cargo.toml +++ b/solana/Cargo.toml @@ -30,7 +30,7 @@ path = "../universal/rs/messages" [workspace.dependencies] anchor-lang = "=0.30.0" anchor-spl = "=0.30.0" -solana-program = "=1.18.11" +solana-program = "=1.18.14" hex = "0.4.3" ruint = "1.9.0" cfg-if = "1.0" diff --git a/solana/programs/swap-layer/Cargo.toml b/solana/programs/swap-layer/Cargo.toml index d1955bf8..37fc503c 100644 --- a/solana/programs/swap-layer/Cargo.toml +++ b/solana/programs/swap-layer/Cargo.toml @@ -21,7 +21,6 @@ integration-test = ["localnet"] idl-build = [ "localnet", "token-router/idl-build", - "swap-layer-messages/idl-build", "anchor-lang/idl-build", "anchor-spl/idl-build" ] diff --git a/solana/programs/swap-layer/src/processor/complete/swap/payload.rs b/solana/programs/swap-layer/src/processor/complete/swap/payload.rs index 4370b9d5..f48f2f6e 100644 --- a/solana/programs/swap-layer/src/processor/complete/swap/payload.rs +++ b/solana/programs/swap-layer/src/processor/complete/swap/payload.rs @@ -5,7 +5,7 @@ use crate::{ }; use anchor_lang::prelude::*; use anchor_spl::{associated_token, token, token_interface}; -use swap_layer_messages::types::{OutputToken, RedeemMode}; +use swap_layer_messages::{messages::SwapMessageV1, types::RedeemMode}; #[derive(Accounts)] pub struct CompleteSwapPayload<'info> { @@ -72,38 +72,43 @@ pub fn complete_swap_payload<'a, 'b, 'c, 'info>( where 'c: 'info, { + let staged_inbound = &mut ctx.accounts.staged_inbound; + // Set the staged transfer if it hasn't been set yet. - if ctx.accounts.staged_inbound.staged_by == Pubkey::default() { + if staged_inbound.staged_by == Pubkey::default() { let in_amount = ctx.accounts.consume_swap_layer_fill.consume_prepared_fill( ctx.accounts.src_swap_token.as_ref().as_ref(), &ctx.accounts.token_program, )?; - let mut swap_msg = ctx + let SwapMessageV1 { + recipient, + redeem_mode, + output_token, + } = ctx .accounts .consume_swap_layer_fill .read_message_unchecked(); - let recipient_payload = match &mut swap_msg.redeem_mode { - RedeemMode::Payload(payload) => std::mem::take(payload), - _ => return Err(SwapLayerError::InvalidRedeemMode.into()), + match redeem_mode { + RedeemMode::Payload { sender, buf } => staged_inbound.set_inner(StagedInbound { + seeds: StagedInboundSeeds { + prepared_fill: ctx.accounts.consume_swap_layer_fill.prepared_fill_key(), + bump: ctx.bumps.staged_inbound, + }, + info: StagedInboundInfo { + custody_token: ctx.accounts.dst_swap_token.key(), + staged_by: ctx.accounts.payer.key(), + source_chain: ctx.accounts.consume_swap_layer_fill.fill.source_chain, + sender, + recipient: Pubkey::from(recipient), + is_native: false, + }, + recipient_payload: buf.into(), + }), + _ => return err!(SwapLayerError::InvalidRedeemMode), }; - ctx.accounts.staged_inbound.set_inner(StagedInbound { - seeds: StagedInboundSeeds { - prepared_fill: ctx.accounts.consume_swap_layer_fill.prepared_fill_key(), - bump: ctx.bumps.staged_inbound, - }, - info: StagedInboundInfo { - custody_token: ctx.accounts.dst_swap_token.key(), - staged_by: ctx.accounts.payer.key(), - source_chain: ctx.accounts.consume_swap_layer_fill.fill.source_chain, - recipient: swap_msg.recipient.into(), - is_native: matches!(swap_msg.output_token, OutputToken::Gas(_)), - }, - recipient_payload, - }); - handle_complete_swap_jup_v6( HandleCompleteSwap { payer: &ctx.accounts.payer, @@ -121,7 +126,11 @@ where ctx.remaining_accounts, instruction_data, in_amount, - swap_msg, + SwapMessageV1 { + recipient, + redeem_mode: Default::default(), // RedeemMode is not handled in this method. + output_token, + }, Default::default(), Default::default(), )?; diff --git a/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs b/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs index ea324b04..455b65eb 100644 --- a/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs @@ -5,7 +5,6 @@ use crate::{ }; use anchor_lang::prelude::*; use anchor_spl::token; -use swap_layer_messages::messages::SwapMessageV1; use swap_layer_messages::types::{OutputToken, RedeemMode}; #[derive(Accounts)] @@ -81,28 +80,25 @@ pub fn complete_transfer_payload(ctx: Context) -> Resul .consume_swap_layer_fill .read_message_unchecked(); - staged_inbound.set_inner(StagedInbound { - seeds: StagedInboundSeeds { - prepared_fill: ctx.accounts.consume_swap_layer_fill.prepared_fill_key(), - bump: ctx.bumps.staged_inbound, - }, - info: StagedInboundInfo { - custody_token: ctx.accounts.staged_custody_token.key(), - staged_by: ctx.accounts.payer.key(), - source_chain: ctx.accounts.consume_swap_layer_fill.fill.source_chain, - recipient: Pubkey::from(swap_msg.recipient), - is_native: false, - }, - recipient_payload: get_swap_message_payload(&swap_msg)?.to_vec(), - }); + match swap_msg.redeem_mode { + RedeemMode::Payload { sender, buf } => staged_inbound.set_inner(StagedInbound { + seeds: StagedInboundSeeds { + prepared_fill: ctx.accounts.consume_swap_layer_fill.prepared_fill_key(), + bump: ctx.bumps.staged_inbound, + }, + info: StagedInboundInfo { + custody_token: ctx.accounts.staged_custody_token.key(), + staged_by: ctx.accounts.payer.key(), + source_chain: ctx.accounts.consume_swap_layer_fill.fill.source_chain, + sender, + recipient: Pubkey::from(swap_msg.recipient), + is_native: false, + }, + recipient_payload: buf.into(), + }), + _ => return err!(SwapLayerError::InvalidRedeemMode), + }; } Ok(()) } - -fn get_swap_message_payload(swap_msg: &SwapMessageV1) -> Result<&[u8]> { - match &swap_msg.redeem_mode { - RedeemMode::Payload(payload) => Ok(payload), - _ => Err(SwapLayerError::InvalidRedeemMode.into()), - } -} diff --git a/solana/programs/swap-layer/src/processor/initiate/transfer.rs b/solana/programs/swap-layer/src/processor/initiate/transfer.rs index afae8bc8..f418900a 100644 --- a/solana/programs/swap-layer/src/processor/initiate/transfer.rs +++ b/solana/programs/swap-layer/src/processor/initiate/transfer.rs @@ -1,15 +1,11 @@ use crate::{ composite::*, error::SwapLayerError, - state::{Custodian, Peer, StagedOutbound, StagedRedeem}, + state::{Custodian, Peer, StagedOutbound}, }; use anchor_lang::prelude::*; use anchor_spl::token; -use common::wormhole_io::{Readable, TypePrefixedPayload}; -use swap_layer_messages::{ - messages::SwapMessageV1, - types::{OutputToken, RedeemMode, Uint48}, -}; +use common::wormhole_io::TypePrefixedPayload; #[derive(Accounts)] pub struct InitiateTransfer<'info> { @@ -91,41 +87,14 @@ pub struct InitiateTransfer<'info> { } pub fn initiate_transfer(ctx: Context) -> Result<()> { - // We perform this operation first so we can have an immutable reference to the staged outbound - // account. - let staged_redeem = std::mem::take(&mut ctx.accounts.staged_outbound.staged_redeem); + let redeemer_message = ctx + .accounts + .staged_outbound + .to_swap_message_v1() + .map(|msg| msg.to_vec())?; let staged_outbound = &ctx.accounts.staged_outbound; let custody_token = &ctx.accounts.staged_custody_token; - - // Decode the output token to verify that it's valid. - let output_token = OutputToken::read(&mut &staged_outbound.encoded_output_token[..]) - .map_err(|_| SwapLayerError::InvalidOutputToken)?; - - let swap_message = match staged_redeem { - StagedRedeem::Direct => SwapMessageV1 { - recipient: staged_outbound.info.recipient, - redeem_mode: RedeemMode::Direct, - output_token, - }, - StagedRedeem::Relay { - gas_dropoff, - relaying_fee, - } => SwapMessageV1 { - recipient: staged_outbound.info.recipient, - redeem_mode: RedeemMode::Relay { - gas_dropoff, - relaying_fee: Uint48::try_from(relaying_fee).unwrap(), - }, - output_token, - }, - StagedRedeem::Payload(payload) => SwapMessageV1 { - recipient: staged_outbound.info.recipient, - redeem_mode: RedeemMode::Payload(payload), - output_token, - }, - }; - let token_program = &ctx.accounts.token_program; let custodian = &ctx.accounts.custodian; @@ -183,7 +152,7 @@ pub fn initiate_transfer(ctx: Context) -> Result<()> { min_amount_out: None, target_chain: staged_outbound.target_chain, redeemer: ctx.accounts.target_peer.address, - redeemer_message: swap_message.to_vec(), + redeemer_message, }, )?; diff --git a/solana/programs/swap-layer/src/state/staged/inbound.rs b/solana/programs/swap-layer/src/state/staged/inbound.rs index 2b1825b0..146d3480 100644 --- a/solana/programs/swap-layer/src/state/staged/inbound.rs +++ b/solana/programs/swap-layer/src/state/staged/inbound.rs @@ -13,18 +13,19 @@ pub struct StagedInboundSeeds { pub struct StagedInboundInfo { pub custody_token: Pubkey, - // Payer that created this StagedInbound. + /// Payer that created this StagedInbound. pub staged_by: Pubkey, - // Exposed out of convenience for the receiving program. + /// Exposed out of convenience for the receiving program. pub source_chain: u16, - // pub payload_sender: [u8; 32], + /// The sender of the swap message. + pub sender: [u8; 32], - // The encoded recipient must be the caller. + /// The encoded recipient must be the caller. pub recipient: Pubkey, - // Indicates whether the output token type is Gas. + /// Indicates whether the output token type is Gas. pub is_native: bool, } @@ -43,11 +44,12 @@ impl StagedInbound { const FIXED: usize = 8 // DISCRIMINATOR + StagedInboundSeeds::INIT_SPACE + StagedInboundInfo::INIT_SPACE + + 32 // sender + 4 // payload len ; match swap_msg.redeem_mode { - RedeemMode::Payload(payload) => payload + RedeemMode::Payload { sender: _, buf } => buf .len() .checked_add(FIXED) .ok_or(error!(SwapLayerError::PayloadTooLarge)), diff --git a/solana/programs/swap-layer/src/state/staged/outbound.rs b/solana/programs/swap-layer/src/state/staged/outbound.rs index 56cc33ab..fb839401 100644 --- a/solana/programs/swap-layer/src/state/staged/outbound.rs +++ b/solana/programs/swap-layer/src/state/staged/outbound.rs @@ -1,7 +1,10 @@ use crate::error::SwapLayerError; use anchor_lang::prelude::*; use common::wormhole_io::Readable; -use swap_layer_messages::{messages::SwapMessageV1, types::OutputToken}; +use swap_layer_messages::{ + messages::SwapMessageV1, + types::{OutputToken, RedeemMode}, +}; #[derive(Debug, Clone, AnchorSerialize, AnchorDeserialize)] pub enum RedeemOption { @@ -99,11 +102,19 @@ impl StagedOutbound { recipient: info.recipient, redeem_mode: match staged_redeem { StagedRedeem::Direct => Default::default(), - StagedRedeem::Payload(payload) => payload.into(), + StagedRedeem::Payload(buf) => RedeemMode::Payload { + sender: info.sender.to_bytes(), + buf: buf + .try_into() + .map_err(|_| SwapLayerError::PayloadTooLarge)?, + }, StagedRedeem::Relay { gas_dropoff, relaying_fee, - } => (gas_dropoff, relaying_fee).try_into().unwrap(), + } => RedeemMode::Relay { + gas_dropoff, + relaying_fee: relaying_fee.try_into().unwrap(), + }, }, output_token: Readable::read(&mut &encoded_output_token[..]) .map_err(|_| SwapLayerError::InvalidOutputToken)?, diff --git a/solana/ts/src/swapLayer/messages/layouts.ts b/solana/ts/src/swapLayer/messages/layouts.ts index ce95b552..2d4d81e3 100644 --- a/solana/ts/src/swapLayer/messages/layouts.ts +++ b/solana/ts/src/swapLayer/messages/layouts.ts @@ -68,7 +68,13 @@ const redeemModeItem = { idTag: "mode", layouts: [ [[0, "Direct"], []], - [[1, "Payload"], [{ name: "payload", binary: "bytes", lengthSize: 4 }]], + [ + [1, "Payload"], + [ + { name: "sender", ...layoutItems.universalAddressItem }, + { name: "buf", binary: "bytes", lengthSize: 2 }, + ], + ], [ [2, "Relay"], [ diff --git a/solana/ts/src/swapLayer/state/StagedInbound.ts b/solana/ts/src/swapLayer/state/StagedInbound.ts index 366257a8..8d0bd091 100644 --- a/solana/ts/src/swapLayer/state/StagedInbound.ts +++ b/solana/ts/src/swapLayer/state/StagedInbound.ts @@ -9,6 +9,7 @@ export type StagedInboundInfo = { custodyToken: PublicKey; stagedBy: PublicKey; sourceChain: number; + sender: Array; recipient: PublicKey; isNative: boolean; }; diff --git a/solana/ts/tests/00__messages.ts b/solana/ts/tests/00__messages.ts index 61967ac9..6f6246a6 100644 --- a/solana/ts/tests/00__messages.ts +++ b/solana/ts/tests/00__messages.ts @@ -66,13 +66,17 @@ describe("Swap Layer Messages", () => { it("USDC Payload", function () { const encoded = encoding.hex.decode( - "010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000004deadbeef00", + "010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000000000000000000000000000000000000000000000000000000000ba5ed0004deadbeef00", ); const decoded = decodeSwapLayerMessage(encoded); expect(decoded).to.eql({ recipient: toUniversal("Ethereum", "0x6ca6d1e2d5347bfab1d91e883f1915560e09129d"), - redeemMode: { mode: "Payload", payload: Buffer.from("deadbeef", "hex") }, + redeemMode: { + mode: "Payload", + sender: toUniversal("Ethereum", "0x00000000000000000000000000000000000ba5ed"), + buf: Buffer.from("deadbeef", "hex"), + }, outputToken: { type: "Usdc" }, } as SwapLayerMessage); expect(encodeSwapLayerMessage(decoded)).to.eql(encoded); diff --git a/solana/ts/tests/01__transfer.ts b/solana/ts/tests/01__transfer.ts index 89202505..5a1f917b 100644 --- a/solana/ts/tests/01__transfer.ts +++ b/solana/ts/tests/01__transfer.ts @@ -34,7 +34,7 @@ import { } from "@wormhole-foundation/example-liquidity-layer-solana/testing"; import { PreparedOrder } from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter/state"; import { ChainId, toChain, toChainId } from "@wormhole-foundation/sdk-base"; -import { UniversalAddress } from "@wormhole-foundation/sdk-definitions"; +import { UniversalAddress, toUniversal } from "@wormhole-foundation/sdk-definitions"; import { assert } from "chai"; import { AddPeerArgs, @@ -2052,9 +2052,8 @@ describe("Swap Layer", () => { await expectIxOk(connection, [ix], [payer]); // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder( - preparedOrder, - ); + const preparedOrderData = + await tokenRouter.fetchPreparedOrder(preparedOrder); const { info: { preparedCustodyTokenBump }, @@ -3024,7 +3023,11 @@ describe("Swap Layer", () => { recipient: new UniversalAddress( Uint8Array.from(foreignRecipientAddress), ), - redeemMode: { mode: "Payload", payload }, + redeemMode: { + mode: "Payload", + sender: toUniversal("Solana", payer.publicKey.toBytes()), + buf: payload, + }, outputToken, }), ), @@ -3043,8 +3046,15 @@ describe("Swap Layer", () => { describe("Inbound", function () { const payload = Buffer.from("Insert payload here"); const validSwapMessage = encodeSwapLayerMessage({ - recipient: new UniversalAddress(recipient.publicKey.toString(), "base58"), - redeemMode: { mode: "Payload", payload }, + recipient: toUniversal("Solana", recipient.publicKey.toBytes()), + redeemMode: { + mode: "Payload", + sender: toUniversal( + "Ethereum", + "0x000000000000000000000000000000000000d00d", + ), + buf: payload, + }, outputToken: { type: "Usdc" }, }); @@ -3065,7 +3075,11 @@ describe("Swap Layer", () => { ), redeemMode: { mode: "Payload", - payload: Buffer.from("Insert payload here"), + sender: toUniversal( + "Ethereum", + "0x000000000000000000000000000000000000d00d", + ), + buf: Buffer.from("Insert payload here"), }, outputToken: { type: "Gas", @@ -3294,6 +3308,12 @@ describe("Swap Layer", () => { custodyToken: stagedInboundTokenAddress, stagedBy: payer.publicKey, sourceChain: foreignChain, + sender: Array.from( + toUniversal( + "Ethereum", + "0x000000000000000000000000000000000000d00d", + ).toUint8Array(), + ), recipient: recipient.publicKey, isNative: false, }, @@ -3448,9 +3468,8 @@ describe("Swap Layer", () => { units: 300_000, }); - const { value: lookupTableAccount } = await connection.getAddressLookupTable( - tokenRouterLkupTable, - ); + const { value: lookupTableAccount } = + await connection.getAddressLookupTable(tokenRouterLkupTable); await expectIxOk(connection, [computeIx, ix], [payer], { addressLookupTableAccounts: [lookupTableAccount!], diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index bd9d4302..2f58c24a 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -1142,7 +1142,11 @@ describe("Jupiter V6 Testing", () => { dstMint, redeemMode: { mode: "Payload", - payload: Buffer.from("All your base are belong to us."), + sender: toUniversal( + "Ethereum", + "0x000000000000000000000000000000000000d00d", + ), + buf: Buffer.from("All your base are belong to us."), }, outputToken, amountIn, @@ -1487,10 +1491,16 @@ describe("Jupiter V6 Testing", () => { custodyToken: destinationToken, stagedBy: accounts.payer, sourceChain: preparedFillInfo.sourceChain, + sender: Array.from( + toUniversal( + "Ethereum", + "0x000000000000000000000000000000000000d00d", + ).toUint8Array(), + ), recipient: toNative("Solana", recipient).address, isNative: outputToken.type === "Gas", }, - Buffer.from(redeemMode.payload), + Buffer.from(redeemMode.buf), ), ); @@ -2169,7 +2179,8 @@ describe("Jupiter V6 Testing", () => { } else if ("payload" in redeemOption) { return { mode: "Payload", - payload: redeemOption.payload, + sender: toUniversal("Solana", sender.toBytes()), + buf: redeemOption.payload, }; } else { throw new Error("Invalid redeem option"); diff --git a/universal/rs/Cargo.toml b/universal/rs/Cargo.toml index cdc27231..c6357fe4 100644 --- a/universal/rs/Cargo.toml +++ b/universal/rs/Cargo.toml @@ -19,7 +19,6 @@ path = "../../lib/example-liquidity-layer/universal/rs/messages" wormhole-io = "0.3.0-alpha.1" ruint = "1.9.0" hex-literal = "0.4.1" -anchor-lang = "0.30.0" solana-program = "1.18.11" [workspace.lints.clippy] diff --git a/universal/rs/messages/Cargo.toml b/universal/rs/messages/Cargo.toml index db43233c..b8d67f1b 100644 --- a/universal/rs/messages/Cargo.toml +++ b/universal/rs/messages/Cargo.toml @@ -9,16 +9,12 @@ repository.workspace = true [features] default = [] -anchor = ["dep:anchor-lang"] -idl-build = ["anchor", "anchor-lang/idl-build"] [dependencies] liquidity-layer-messages.workspace = true wormhole-io.workspace = true ruint.workspace = true -anchor-lang = { workspace = true, optional = true } - [dev-dependencies] hex-literal.workspace = true solana-program.workspace = true diff --git a/universal/rs/messages/src/messages/mod.rs b/universal/rs/messages/src/messages/mod.rs index 79d6e228..800a10b9 100644 --- a/universal/rs/messages/src/messages/mod.rs +++ b/universal/rs/messages/src/messages/mod.rs @@ -5,11 +5,7 @@ use crate::{ wormhole_io::{Readable, TypePrefixedPayload, Writeable}, }; -#[cfg(feature = "anchor")] -use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; - #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] pub struct SwapMessageV1 { pub recipient: [u8; 32], pub redeem_mode: RedeemMode, @@ -171,10 +167,10 @@ mod test { #[test] pub fn test_swap_message_v1_usdc_payload() { - let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a002b010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000004deadbeef00"); + let encoded_fill = hex!("01f00f0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f62849f9a0b5bf2913b396098f7c7019b51a820a0049010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000000000000000000000000000000000000000000000000000000000ba5ed0004deadbeef00"); let redeemer_message = - hex!("010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000004deadbeef00"); + hex!("010000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d0100000000000000000000000000000000000000000000000000000000000ba5ed0004deadbeef00"); let fill = liquidity_layer_messages::Fill::read_slice(&encoded_fill).unwrap(); assert_eq!( @@ -194,7 +190,12 @@ mod test { swap_message, SwapMessageV1 { recipient: hex!("0000000000000000000000006ca6d1e2d5347bfab1d91e883f1915560e09129d"), - redeem_mode: RedeemMode::Payload(hex!("deadbeef").to_vec()), + redeem_mode: RedeemMode::Payload { + sender: hex!( + "00000000000000000000000000000000000000000000000000000000000ba5ed" + ), + buf: hex!("deadbeef").to_vec().try_into().unwrap() + }, output_token: OutputToken::Usdc, } ); diff --git a/universal/rs/messages/src/types/mod.rs b/universal/rs/messages/src/types/mod.rs index 3e8a5bd4..2b020910 100644 --- a/universal/rs/messages/src/types/mod.rs +++ b/universal/rs/messages/src/types/mod.rs @@ -1,122 +1,11 @@ -mod output; -pub use output::*; +mod output_token; +pub use output_token::*; + +mod redeem_mode; +pub use redeem_mode::*; mod swap_type; pub use swap_type::*; mod uint; pub use uint::*; - -use std::io; - -use crate::wormhole_io::{Readable, Writeable, WriteableBytes}; - -#[cfg(feature = "anchor")] -use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; - -#[derive(Debug, Default, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] -pub enum RedeemMode { - #[default] - Direct, - Payload(Vec), - Relay { - gas_dropoff: u32, - relaying_fee: crate::types::Uint48, - }, -} - -impl RedeemMode { - const DIRECT: u8 = 0; - const PAYLOAD: u8 = 1; - const RELAY: u8 = 2; - - pub fn written_size(&self) -> usize { - match self { - Self::Direct => 1, - Self::Payload(payload) => payload.len().saturating_add( - 1 // discriminant - + 4, // payload len - ), - Self::Relay { .. } => { - const FIXED: usize = 1 // discriminant - + 4 // gas_dropoff - + Uint48::BYTES; // relaying_fee - - FIXED - } - } - } -} - -impl TryFrom<(u32, u64)> for RedeemMode { - type Error = >::Error; - - fn try_from((gas_dropoff, relaying_fee): (u32, u64)) -> Result { - Ok(Self::Relay { - gas_dropoff, - relaying_fee: relaying_fee.try_into()?, - }) - } -} - -impl From> for RedeemMode { - fn from(payload: Vec) -> Self { - Self::Payload(payload) - } -} - -impl Readable for RedeemMode { - fn read(reader: &mut R) -> io::Result - where - Self: Sized, - R: io::Read, - { - match u8::read(reader)? { - Self::DIRECT => Ok(Self::Direct), - Self::PAYLOAD => Ok(Self::Payload( - WriteableBytes::::read(reader).map(Into::into)?, - )), - Self::RELAY => Ok(Self::Relay { - gas_dropoff: Readable::read(reader)?, - relaying_fee: Readable::read(reader)?, - }), - _ => Err(io::Error::new( - io::ErrorKind::InvalidData, - "Invalid RedeemMode", - )), - } - } -} - -impl Writeable for RedeemMode { - fn write(&self, writer: &mut W) -> io::Result<()> - where - W: io::Write, - { - match self { - Self::Direct => Self::DIRECT.write(writer), - Self::Payload(payload) => { - Self::PAYLOAD.write(writer)?; - - let writeable = unsafe_writeable_bytes_ref(payload); - - // Check whether length can be encoded. - writeable.try_encoded_len()?; - writeable.write(writer) - } - Self::Relay { - gas_dropoff, - relaying_fee, - } => { - Self::RELAY.write(writer)?; - gas_dropoff.write(writer)?; - relaying_fee.write(writer) - } - } - } -} - -fn unsafe_writeable_bytes_ref(bytes: &Vec) -> &WriteableBytes { - unsafe { std::mem::transmute::<&Vec, &WriteableBytes>(bytes) } -} diff --git a/universal/rs/messages/src/types/output.rs b/universal/rs/messages/src/types/output_token.rs similarity index 91% rename from universal/rs/messages/src/types/output.rs rename to universal/rs/messages/src/types/output_token.rs index 7e68a24c..40e24272 100644 --- a/universal/rs/messages/src/types/output.rs +++ b/universal/rs/messages/src/types/output_token.rs @@ -2,13 +2,9 @@ use std::io; use crate::wormhole_io::{Readable, Writeable}; -#[cfg(feature = "anchor")] -use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; - use super::SwapType; #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] pub enum OutputToken { Usdc, Gas(OutputSwap), @@ -74,7 +70,6 @@ impl Writeable for OutputToken { } #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] pub struct OutputSwap { pub deadline: u32, pub limit_amount: u128, diff --git a/universal/rs/messages/src/types/redeem_mode.rs b/universal/rs/messages/src/types/redeem_mode.rs new file mode 100644 index 00000000..5b759a31 --- /dev/null +++ b/universal/rs/messages/src/types/redeem_mode.rs @@ -0,0 +1,92 @@ +use std::io; + +use crate::{ + types::Uint48, + wormhole_io::{Readable, Writeable, WriteableBytes}, +}; + +#[derive(Debug, Default, Clone, PartialEq, Eq)] +pub enum RedeemMode { + #[default] + Direct, + Payload { + sender: [u8; 32], + buf: WriteableBytes, + }, + Relay { + gas_dropoff: u32, + relaying_fee: crate::types::Uint48, + }, +} + +impl RedeemMode { + const DIRECT: u8 = 0; + const PAYLOAD: u8 = 1; + const RELAY: u8 = 2; + + pub fn written_size(&self) -> usize { + match self { + Self::Direct => 1, + Self::Payload { sender: _, buf } => buf.len().saturating_add( + 1 // discriminant + + 32 // sender + + 4, // payload len + ), + Self::Relay { .. } => { + const FIXED: usize = 1 // discriminant + + 4 // gas_dropoff + + Uint48::BYTES; // relaying_fee + + FIXED + } + } + } +} + +impl Readable for RedeemMode { + fn read(reader: &mut R) -> io::Result + where + Self: Sized, + R: io::Read, + { + match u8::read(reader)? { + Self::DIRECT => Ok(Self::Direct), + Self::PAYLOAD => Ok(Self::Payload { + sender: Readable::read(reader)?, + buf: Readable::read(reader)?, + }), + Self::RELAY => Ok(Self::Relay { + gas_dropoff: Readable::read(reader)?, + relaying_fee: Readable::read(reader)?, + }), + _ => Err(io::Error::new( + io::ErrorKind::InvalidData, + "Invalid RedeemMode", + )), + } + } +} + +impl Writeable for RedeemMode { + fn write(&self, writer: &mut W) -> io::Result<()> + where + W: io::Write, + { + match self { + Self::Direct => Self::DIRECT.write(writer), + Self::Payload { sender, buf } => { + Self::PAYLOAD.write(writer)?; + sender.write(writer)?; + buf.write(writer) + } + Self::Relay { + gas_dropoff, + relaying_fee, + } => { + Self::RELAY.write(writer)?; + gas_dropoff.write(writer)?; + relaying_fee.write(writer) + } + } + } +} diff --git a/universal/rs/messages/src/types/swap_type/evm/trader_joe.rs b/universal/rs/messages/src/types/swap_type/evm/trader_joe.rs index 659ed347..37fa5a27 100644 --- a/universal/rs/messages/src/types/swap_type/evm/trader_joe.rs +++ b/universal/rs/messages/src/types/swap_type/evm/trader_joe.rs @@ -2,11 +2,7 @@ use std::io::{self, ErrorKind}; use crate::wormhole_io::{Readable, Writeable}; -#[cfg(feature = "anchor")] -use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; - #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] pub struct TraderJoeSwapParameters { pub first_pool_id: TraderJoePoolId, pub path: Vec, @@ -61,7 +57,6 @@ impl Writeable for TraderJoeSwapParameters { } #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] pub struct TraderJoeSwapPath { pub evm_address: [u8; 20], pub pool_id: TraderJoePoolId, @@ -94,7 +89,6 @@ impl Writeable for TraderJoeSwapPath { } #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] pub struct TraderJoePoolId { pub version: u8, pub bin_size: u16, diff --git a/universal/rs/messages/src/types/swap_type/evm/uniswap_v3.rs b/universal/rs/messages/src/types/swap_type/evm/uniswap_v3.rs index 6722cef1..e06141a1 100644 --- a/universal/rs/messages/src/types/swap_type/evm/uniswap_v3.rs +++ b/universal/rs/messages/src/types/swap_type/evm/uniswap_v3.rs @@ -3,11 +3,7 @@ use std::io::{self, ErrorKind}; use crate::types::Uint24; use crate::wormhole_io::{Readable, Writeable}; -#[cfg(feature = "anchor")] -use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; - #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] pub struct UniswapSwapParameters { pub first_leg_fee: Uint24, pub path: Vec, @@ -62,7 +58,6 @@ impl Writeable for UniswapSwapParameters { } #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] pub struct UniswapSwapPath { pub evm_address: [u8; 20], pub fee: Uint24, diff --git a/universal/rs/messages/src/types/swap_type/mod.rs b/universal/rs/messages/src/types/swap_type/mod.rs index d4b6b7ea..f882f0d0 100644 --- a/universal/rs/messages/src/types/swap_type/mod.rs +++ b/universal/rs/messages/src/types/swap_type/mod.rs @@ -8,11 +8,7 @@ use std::io; use crate::wormhole_io::{Readable, Writeable}; -#[cfg(feature = "anchor")] -use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; - #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] pub enum SwapType { Invalid, UniswapV3(UniswapSwapParameters), diff --git a/universal/rs/messages/src/types/swap_type/solana/jupiter_v6.rs b/universal/rs/messages/src/types/swap_type/solana/jupiter_v6.rs index b28b8984..9683c715 100644 --- a/universal/rs/messages/src/types/swap_type/solana/jupiter_v6.rs +++ b/universal/rs/messages/src/types/swap_type/solana/jupiter_v6.rs @@ -2,11 +2,7 @@ use std::io; use crate::wormhole_io::{Readable, Writeable}; -#[cfg(feature = "anchor")] -use anchor_lang::prelude::{borsh, AnchorDeserialize, AnchorSerialize}; - #[derive(Debug, Clone, PartialEq, Eq)] -#[cfg_attr(feature = "anchor", derive(AnchorSerialize, AnchorDeserialize))] pub struct JupiterV6SwapParameters { pub dex_program_id: Option<[u8; 32]>, } diff --git a/universal/rs/messages/src/types/uint.rs b/universal/rs/messages/src/types/uint.rs index 852bf2d7..d50bd2cd 100644 --- a/universal/rs/messages/src/types/uint.rs +++ b/universal/rs/messages/src/types/uint.rs @@ -3,11 +3,6 @@ use std::{io, ops::Deref}; use crate::wormhole_io::{Readable, Writeable}; use ruint::{ToUintError, Uint}; -#[cfg(feature = "idl-build")] -use anchor_lang::prelude::IdlBuild; -#[cfg(feature = "anchor")] -use anchor_lang::prelude::{AnchorDeserialize, AnchorSerialize}; - /// New type for a 3-byte unsigned integer. #[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub struct Uint24(Uint<24, 1>); @@ -109,27 +104,6 @@ impl Writeable for Uint24 { } } -#[cfg(feature = "anchor")] -impl AnchorDeserialize for Uint24 { - fn deserialize_reader(reader: &mut R) -> io::Result { - let mut bytes = <[u8; Self::BYTES]>::default(); - reader.read_exact(&mut bytes)?; - Ok(Self::from_le_bytes(bytes)) - } -} - -#[cfg(feature = "anchor")] -impl AnchorSerialize for Uint24 { - fn serialize(&self, writer: &mut W) -> io::Result<()> { - writer.write_all(&self.to_le_bytes()) - } -} - -#[cfg(feature = "idl-build")] -impl IdlBuild for Uint24 { - // TODO -} - /// New type for a 6-byte unsigned integer. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct Uint48(Uint<48, 1>); @@ -229,27 +203,6 @@ impl Writeable for Uint48 { } } -#[cfg(feature = "anchor")] -impl AnchorDeserialize for Uint48 { - fn deserialize_reader(reader: &mut R) -> io::Result { - let mut bytes = <[u8; Self::BYTES]>::default(); - reader.read_exact(&mut bytes)?; - Ok(Self::from_le_bytes(bytes)) - } -} - -#[cfg(feature = "anchor")] -impl AnchorSerialize for Uint48 { - fn serialize(&self, writer: &mut W) -> io::Result<()> { - writer.write_all(&self.to_le_bytes()) - } -} - -#[cfg(feature = "idl-build")] -impl IdlBuild for Uint48 { - // TODO -} - #[cfg(test)] mod test { use hex_literal::hex; @@ -273,24 +226,6 @@ mod test { assert_eq!(written, encoded); } - #[test] - #[cfg(feature = "anchor")] - fn test_uint24_small_le() { - const EXPECTED: u64 = 69; - - let encoded = hex!("450000"); - let value = Uint24::from_le_bytes(encoded); - assert_eq!(value.0, Uint::from(EXPECTED)); - assert_eq!(value.to_le_bytes(), encoded); - - let value = ::deserialize(&mut &encoded[..]).unwrap(); - assert_eq!(value.0, Uint::from(EXPECTED)); - - let mut written = [0u8; 3]; - value.serialize(&mut written.as_mut_slice()).unwrap(); - assert_eq!(written, encoded); - } - #[test] fn test_uint24_large_be() { const EXPECTED: u64 = 4408389; @@ -308,24 +243,6 @@ mod test { assert_eq!(written, encoded); } - #[test] - #[cfg(feature = "anchor")] - fn test_uint24_large_le() { - const EXPECTED: u64 = 4408389; - - let encoded = hex!("454443"); - let value = Uint24::from_le_bytes(encoded); - assert_eq!(value.0, Uint::from(EXPECTED)); - assert_eq!(value.to_le_bytes(), encoded); - - let value = ::deserialize(&mut &encoded[..]).unwrap(); - assert_eq!(value.0, Uint::from(EXPECTED)); - - let mut written = [0u8; 3]; - value.serialize(&mut written.as_mut_slice()).unwrap(); - assert_eq!(written, encoded); - } - #[test] fn test_uint48_small_be() { const EXPECTED: u64 = 69; @@ -343,24 +260,6 @@ mod test { assert_eq!(written, encoded); } - #[test] - #[cfg(feature = "anchor")] - fn test_uint48_small_le() { - const EXPECTED: u64 = 69; - - let encoded = hex!("450000000000"); - let value = Uint48::from_le_bytes(encoded); - assert_eq!(value.0, Uint::from(EXPECTED)); - assert_eq!(value.to_le_bytes(), encoded); - - let value = ::deserialize(&mut &encoded[..]).unwrap(); - assert_eq!(value.0, Uint::from(EXPECTED)); - - let mut written = [0u8; 6]; - value.serialize(&mut written.as_mut_slice()).unwrap(); - assert_eq!(written, encoded); - } - #[test] fn test_uint48_large_be() { const EXPECTED: u64 = 70649028756549; @@ -377,22 +276,4 @@ mod test { value.write(&mut written.as_mut_slice()).unwrap(); assert_eq!(written, encoded); } - - #[test] - #[cfg(feature = "anchor")] - fn test_uint48_large_le() { - const EXPECTED: u64 = 70649028756549; - - let encoded = hex!("454443424140"); - let value = Uint48::from_le_bytes(encoded); - assert_eq!(value.0, Uint::from(EXPECTED)); - assert_eq!(value.to_le_bytes(), encoded); - - let value = ::deserialize(&mut &encoded[..]).unwrap(); - assert_eq!(value.0, Uint::from(EXPECTED)); - - let mut written = [0u8; 6]; - value.serialize(&mut written.as_mut_slice()).unwrap(); - assert_eq!(written, encoded); - } } From 94819b2e7faac6d55ee85c4e5585b4df096eab58 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Fri, 24 May 2024 09:01:29 -0500 Subject: [PATCH 21/50] solana: fix `compute_min_amount_out` (#54) * solana: fix math operations * solana: impl trait --------- Co-authored-by: A5 Pickle --- .../swap-layer/src/utils/jupiter_v6/mod.rs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs b/solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs index de7202de..e0e8d6aa 100644 --- a/solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs +++ b/solana/programs/swap-layer/src/utils/jupiter_v6/mod.rs @@ -32,10 +32,7 @@ impl JupiterV6SwapExactIn for cpi::SharedAccountsRouteArgs { } } -pub fn compute_min_amount_out(swap_args: &T) -> u64 -where - T: JupiterV6SwapExactIn, -{ +pub fn compute_min_amount_out(swap_args: &impl JupiterV6SwapExactIn) -> u64 { let quoted_out_amount = swap_args.quoted_out_amount(); // In case the slippage bps is configured to be greater than the max, we will set it to the max @@ -45,12 +42,6 @@ where // Only upcast to u128 if the quoted out amount * 10_000 will overflow u64. if quoted_out_amount > MAX_QUOTED_OUT_AMOUNT { - // There are no side effects here because MAX_SLIPPAGE_BPS is not zero. - #[allow(clippy::arithmetic_side_effects)] - quoted_out_amount - .saturating_mul(after_slippage_bps.into()) - .saturating_div(MAX_SLIPPAGE_BPS.into()) - } else { // There will be no side effects with this operation. And because MAX_SLIPPAGE_BPS is // greater than slippage_bps, the result will always be less than or equal to u64::MAX. #[allow(clippy::arithmetic_side_effects)] @@ -61,5 +52,12 @@ where .saturating_div(MAX_SLIPPAGE_BPS.into()) as u64; limit_amount + } else { + // There are no side effects here because MAX_SLIPPAGE_BPS is not zero. + #[allow(clippy::arithmetic_side_effects)] + quoted_out_amount + .checked_mul(after_slippage_bps.into()) + .unwrap() // Panic here in case of overflow (which should be impossible). + .saturating_div(MAX_SLIPPAGE_BPS.into()) } } From a2290c51c65d09ab09c4d559531f1b9146f0abf7 Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Mon, 27 May 2024 21:25:26 -0500 Subject: [PATCH 22/50] solana: add swap tests (#55) * solana: add negative tests for swap and relay * solana: fix relayer fee tests * solana: add relayer fee check for exact_in * solana: add negative tests for relay exact in * solana: add inbound negative tests for direct * solana: add tests for direct override swap --------- Co-authored-by: gator-boi --- solana/programs/swap-layer/src/error.rs | 1 + .../src/processor/complete/swap/relay.rs | 37 +- .../src/processor/complete/transfer/relay.rs | 4 +- .../src/processor/initiate/swap/exact_in.rs | 22 +- .../swap-layer/src/utils/relayer_fees.rs | 22 +- solana/ts/src/swapLayer/consts.ts | 19 + solana/ts/src/swapLayer/index.ts | 13 +- solana/ts/src/swapLayer/relayerFees.ts | 12 +- solana/ts/tests/01__transfer.ts | 52 +- solana/ts/tests/10__swap.ts | 1318 +++++++++++++++-- 10 files changed, 1336 insertions(+), 164 deletions(-) create mode 100644 solana/ts/src/swapLayer/consts.ts diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs index 5c45a58f..5e52da75 100644 --- a/solana/programs/swap-layer/src/error.rs +++ b/solana/programs/swap-layer/src/error.rs @@ -53,6 +53,7 @@ pub enum SwapLayerError { SwapPastDeadline = 0x300, InvalidLimitAmount = 0x302, InvalidSwapType = 0x304, + AmountOutTooSmall = 0x306, // Jupiter V6 #[msg("Jupiter V6 Authority ID must be >= 0 and < 8")] diff --git a/solana/programs/swap-layer/src/processor/complete/swap/relay.rs b/solana/programs/swap-layer/src/processor/complete/swap/relay.rs index 17d6995e..442db579 100644 --- a/solana/programs/swap-layer/src/processor/complete/swap/relay.rs +++ b/solana/programs/swap-layer/src/processor/complete/swap/relay.rs @@ -77,25 +77,26 @@ where // Handle the relayer fee and gas dropoff. Override the relaying fee to zero // if the payer is the recipient (self redemption). - let (in_amount, gas_dropoff) = if payer.key() != recipient.key() && relaying_fee > 0 { + let (in_amount, gas_dropoff) = if payer.key() != recipient.key() { // Transfer eligible USDC to the fee recipient. - anchor_spl::token::transfer( - CpiContext::new_with_signer( - ctx.accounts.complete_swap.token_program.to_account_info(), - anchor_spl::token::Transfer { - from: ctx.accounts.complete_swap.src_swap_token.to_account_info(), - to: ctx.accounts.fee_recipient_token.to_account_info(), - authority: ctx.accounts.complete_swap.authority.to_account_info(), - }, - &[&[ - crate::SWAP_AUTHORITY_SEED_PREFIX, - ctx.accounts.complete_swap.prepared_fill_key().as_ref(), - &[ctx.bumps.complete_swap.authority], - ]], - ), - relaying_fee, - )?; - + if relaying_fee > 0 { + anchor_spl::token::transfer( + CpiContext::new_with_signer( + ctx.accounts.complete_swap.token_program.to_account_info(), + anchor_spl::token::Transfer { + from: ctx.accounts.complete_swap.src_swap_token.to_account_info(), + to: ctx.accounts.fee_recipient_token.to_account_info(), + authority: ctx.accounts.complete_swap.authority.to_account_info(), + }, + &[&[ + crate::SWAP_AUTHORITY_SEED_PREFIX, + ctx.accounts.complete_swap.prepared_fill_key().as_ref(), + &[ctx.bumps.complete_swap.authority], + ]], + ), + relaying_fee, + )?; + } ( fill_amount .checked_sub(relaying_fee) diff --git a/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs index 5eace2ea..76ffc5fe 100644 --- a/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs @@ -42,13 +42,13 @@ pub struct CompleteTransferRelay<'info> { match consume_swap_layer_fill.fill.fill_type { FillType::FastFill => { require!( - time_diff > i64::from(swap_time_limit.fast_limit), + time_diff >= i64::from(swap_time_limit.fast_limit), SwapLayerError::SwapTimeLimitNotExceeded ); } FillType::WormholeCctpDeposit => { require!( - time_diff > i64::from(swap_time_limit.finalized_limit), + time_diff >= i64::from(swap_time_limit.finalized_limit), SwapLayerError::SwapTimeLimitNotExceeded ); } diff --git a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs index 51733e23..c6d4efa6 100644 --- a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs +++ b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs @@ -7,6 +7,7 @@ use crate::{ use anchor_lang::prelude::*; use anchor_spl::{associated_token, token, token_interface}; use common::wormhole_io::TypePrefixedPayload; +use swap_layer_messages::types::RedeemMode; #[derive(Accounts)] pub struct InitiateSwapExactIn<'info> { @@ -202,11 +203,7 @@ where ); } - let redeemer_message = ctx - .accounts - .staged_outbound - .to_swap_message_v1() - .map(|msg| msg.to_vec())?; + let swap_msg = ctx.accounts.staged_outbound.to_swap_message_v1()?; let staged_outbound = &ctx.accounts.staged_outbound; let prepared_order = &ctx.accounts.prepared_order; @@ -226,6 +223,19 @@ where Default::default(), )?; + // Verify that the usdc_amount_out is larger than the encoded relaying fee + // if the staged outbound is a relay. + if let RedeemMode::Relay { + gas_dropoff: _, + relaying_fee, + } = swap_msg.redeem_mode + { + require!( + usdc_amount_out > relaying_fee.into(), + SwapLayerError::AmountOutTooSmall + ); + } + let payer = &ctx.accounts.payer; // Close the source swap token account. @@ -291,7 +301,7 @@ where min_amount_out: Default::default(), target_chain: staged_outbound.target_chain, redeemer: ctx.accounts.target_peer.address, - redeemer_message, + redeemer_message: swap_msg.to_vec(), }, )?; diff --git a/solana/programs/swap-layer/src/utils/relayer_fees.rs b/solana/programs/swap-layer/src/utils/relayer_fees.rs index 35452c31..b1d0129c 100644 --- a/solana/programs/swap-layer/src/utils/relayer_fees.rs +++ b/solana/programs/swap-layer/src/utils/relayer_fees.rs @@ -9,12 +9,12 @@ use swap_layer_messages::types::{ }; // EVM gas overheads in gas units. -const EVM_GAS_OVERHEAD: u64 = 100_000; -const DROPOFF_GAS_OVERHEAD: u64 = 10_000; -const UNISWAP_GAS_OVERHEAD: u64 = 100_000; -const UNISWAP_GAS_PER_SWAP: u64 = 100_000; -const TRADERJOE_GAS_OVERHEAD: u64 = 100_000; -const TRADERJOE_GAS_PER_SWAP: u64 = 100_000; +const EVM_GAS_OVERHEAD: u64 = 280_000; +const DROPOFF_GAS_OVERHEAD: u64 = 32_000; +const UNISWAP_GAS_OVERHEAD: u64 = 10_000; +const UNISWAP_GAS_PER_SWAP: u64 = 120_000; +const TRADERJOE_GAS_OVERHEAD: u64 = 30_000; +const TRADERJOE_GAS_PER_SWAP: u64 = 80_000; const ONE_SOL: u64 = 1_000_000_000; const GAS_PRICE_SCALAR: u32 = 1_000_000; @@ -229,7 +229,7 @@ mod test { }); let gas_overhead = calculate_evm_swap_overhead(swap_type); - assert_eq!(gas_overhead, Some(200_000)); + assert_eq!(gas_overhead, Some(130_000)); } #[test] @@ -243,7 +243,7 @@ mod test { }); let gas_overhead = calculate_evm_swap_overhead(swap_type); - assert_eq!(gas_overhead, Some(200_000)); + assert_eq!(gas_overhead, Some(110_000)); } #[test] @@ -279,7 +279,7 @@ mod test { let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, output_token); - assert_eq!(relayer_fee.unwrap(), 16775000); + assert_eq!(relayer_fee.unwrap(), 17280000); } #[test] @@ -312,7 +312,7 @@ mod test { let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, &output_token); - assert_eq!(relayer_fee.unwrap(), 18025000); + assert_eq!(relayer_fee.unwrap(), 18505000); } #[test] @@ -340,7 +340,7 @@ mod test { let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, &output_token); - assert_eq!(relayer_fee.unwrap(), 17525000); + assert_eq!(relayer_fee.unwrap(), 17755000); } // TODO: Add boundary tests. diff --git a/solana/ts/src/swapLayer/consts.ts b/solana/ts/src/swapLayer/consts.ts new file mode 100644 index 00000000..e049918a --- /dev/null +++ b/solana/ts/src/swapLayer/consts.ts @@ -0,0 +1,19 @@ +import { RelayParams } from "./state"; +import { uint64ToBN } from "@wormhole-foundation/example-liquidity-layer-solana/common"; + +export const TEST_RELAY_PARAMS: RelayParams = { + baseFee: 100000, + nativeTokenPrice: uint64ToBN(1000000), + maxGasDropoff: 500000, + gasDropoffMargin: 10000, + executionParams: { + evm: { + gasPrice: 100000, + gasPriceMargin: 10000, + }, + }, + swapTimeLimit: { + fastLimit: 2, + finalizedLimit: 2, + }, +}; diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index eb153a0c..251d3b0b 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -1,6 +1,7 @@ export * from "./messages"; export * from "./relayerFees"; export * from "./state"; +export * from "./consts"; import * as wormholeSdk from "@certusone/wormhole-sdk"; import { BN, Program } from "@coral-xyz/anchor"; @@ -904,6 +905,7 @@ export class SwapLayerProgram { preparedFill: PublicKey; recipient: PublicKey; dstMint?: PublicKey; + recipientToken?: PublicKey; beneficiary?: PublicKey; dstTokenProgram?: PublicKey; }, @@ -914,9 +916,10 @@ export class SwapLayerProgram { const { payer, preparedFill, recipient } = accounts; const { cpiInstruction } = args; - let { beneficiary, dstMint, dstTokenProgram } = accounts; + let { beneficiary, dstMint, dstTokenProgram, recipientToken } = accounts; beneficiary ??= payer; dstMint ??= splToken.NATIVE_MINT; + recipientToken ??= splToken.getAssociatedTokenAddressSync(dstMint, recipient); const swapAuthority = this.swapAuthorityAddress(preparedFill); const swapAccounts = await this.swapAccounts({ @@ -948,7 +951,7 @@ export class SwapLayerProgram { dstTokenProgram, systemProgram: SystemProgram.programId, }, - recipientToken: splToken.getAssociatedTokenAddressSync(dstMint, recipient), + recipientToken, recipient, }) .remainingAccounts(cpiInstruction.keys) @@ -964,6 +967,7 @@ export class SwapLayerProgram { beneficiary?: PublicKey; dstTokenProgram?: PublicKey; feeRecipientToken?: PublicKey; + recipientToken?: PublicKey; }, args: { cpiInstruction: TransactionInstruction; @@ -972,10 +976,11 @@ export class SwapLayerProgram { const { payer, preparedFill, recipient } = accounts; const { cpiInstruction } = args; - let { beneficiary, dstMint, dstTokenProgram, feeRecipientToken } = accounts; + let { beneficiary, dstMint, dstTokenProgram, feeRecipientToken, recipientToken } = accounts; beneficiary ??= payer; dstMint ??= splToken.NATIVE_MINT; feeRecipientToken ??= await this.fetchCustodian().then((c) => c.feeRecipientToken); + recipientToken ??= splToken.getAssociatedTokenAddressSync(dstMint, recipient); const swapAuthority = this.swapAuthorityAddress(preparedFill); const swapAccounts = await this.swapAccounts({ @@ -1007,7 +1012,7 @@ export class SwapLayerProgram { dstTokenProgram, systemProgram: SystemProgram.programId, }, - recipientToken: splToken.getAssociatedTokenAddressSync(dstMint, recipient), + recipientToken, recipient, feeRecipientToken, }) diff --git a/solana/ts/src/swapLayer/relayerFees.ts b/solana/ts/src/swapLayer/relayerFees.ts index 73494384..b901f1ca 100644 --- a/solana/ts/src/swapLayer/relayerFees.ts +++ b/solana/ts/src/swapLayer/relayerFees.ts @@ -1,12 +1,12 @@ import { OutputToken, RelayParams } from "."; // Gas overheads for EVM. -const EVM_GAS_OVERHEAD = 100_000n; -const DROPOFF_GAS_OVERHEAD = 10_000n; -const UNISWAP_GAS_OVERHEAD = 100_000n; -const UNISWAP_GAS_PER_SWAP = 100_000n; -const TRADERJOE_GAS_OVERHEAD = 100_000n; -const TRADERJOE_GAS_PER_SWAP = 100_000n; +const EVM_GAS_OVERHEAD = 280_000n; +const DROPOFF_GAS_OVERHEAD = 32_000n; +const UNISWAP_GAS_OVERHEAD = 10_000n; +const UNISWAP_GAS_PER_SWAP = 120_000n; +const TRADERJOE_GAS_OVERHEAD = 30_000n; +const TRADERJOE_GAS_PER_SWAP = 80_000n; const ONE_ETHER = 1_000_000_000_000_000_000n; // Solana specific constants. diff --git a/solana/ts/tests/01__transfer.ts b/solana/ts/tests/01__transfer.ts index 5a1f917b..cd8177c5 100644 --- a/solana/ts/tests/01__transfer.ts +++ b/solana/ts/tests/01__transfer.ts @@ -52,6 +52,7 @@ import { encodeOutputToken, encodeSwapLayerMessage, localnet, + TEST_RELAY_PARAMS, } from "../src/swapLayer"; import { FEE_UPDATER_KEYPAIR, REGISTERED_PEERS, createLut, tryNativeToUint8Array } from "./helpers"; @@ -85,23 +86,6 @@ describe("Swap Layer", () => { let tokenRouterLkupTable: PublicKey; - const relayParamsForTest: RelayParams = { - baseFee: 100000, - nativeTokenPrice: uint64ToBN(1000000), - maxGasDropoff: 500000, - gasDropoffMargin: 10000, - executionParams: { - evm: { - gasPrice: 100000, - gasPriceMargin: 10000, - }, - }, - swapTimeLimit: { - fastLimit: 2, - finalizedLimit: 2, - }, - }; - let testCctpNonce = 2n ** 64n - 20n * 6400n; let wormholeSequence = 2000n; @@ -411,7 +395,7 @@ describe("Swap Layer", () => { opts?.args ?? { chain: foreignChain, address: foreignSwapLayerAddress, - relayParams: relayParamsForTest, + relayParams: TEST_RELAY_PARAMS, }, ); @@ -449,7 +433,7 @@ describe("Swap Layer", () => { args: { chain: foreignChain, address: foreignSwapLayerAddress, - relayParams: { ...relayParamsForTest, baseFee: 0 }, + relayParams: { ...TEST_RELAY_PARAMS, baseFee: 0 }, }, }), ], @@ -467,7 +451,7 @@ describe("Swap Layer", () => { chain: foreignChain, address: foreignSwapLayerAddress, relayParams: { - ...relayParamsForTest, + ...TEST_RELAY_PARAMS, nativeTokenPrice: new BN(0), }, }, @@ -487,7 +471,7 @@ describe("Swap Layer", () => { chain: foreignChain, address: foreignSwapLayerAddress, relayParams: { - ...relayParamsForTest, + ...TEST_RELAY_PARAMS, gasDropoffMargin: 4294967295, }, }, @@ -507,7 +491,7 @@ describe("Swap Layer", () => { chain: foreignChain, address: foreignSwapLayerAddress, relayParams: { - ...relayParamsForTest, + ...TEST_RELAY_PARAMS, executionParams: { evm: { gasPrice: 0, gasPriceMargin: 69 }, }, @@ -529,7 +513,7 @@ describe("Swap Layer", () => { chain: foreignChain, address: foreignSwapLayerAddress, relayParams: { - ...relayParamsForTest, + ...TEST_RELAY_PARAMS, executionParams: { evm: { gasPrice: 10000, gasPriceMargin: 4294967295 }, }, @@ -552,7 +536,7 @@ describe("Swap Layer", () => { new Peer( { chain: foreignChain, bump: seeds.bump }, foreignSwapLayerAddress, - relayParamsForTest, + TEST_RELAY_PARAMS, ), ); }); @@ -1055,7 +1039,7 @@ describe("Swap Layer", () => { it("Update Relay Parameters as Owner", async () => { let relayParams = { - ...relayParamsForTest, + ...TEST_RELAY_PARAMS, baseFee: 69, }; await expectIxOk( @@ -1078,7 +1062,7 @@ describe("Swap Layer", () => { it("Update Relay Parameters as Owner Assistant", async () => { let relayParams = { - ...relayParamsForTest, + ...TEST_RELAY_PARAMS, baseFee: 690, }; await expectIxOk( @@ -1101,7 +1085,7 @@ describe("Swap Layer", () => { it("Update Relay Parameters as Fee Updater", async () => { let relayParams = { - ...relayParamsForTest, + ...TEST_RELAY_PARAMS, }; await expectIxOk( connection, @@ -1429,7 +1413,7 @@ describe("Swap Layer", () => { await addPeerForTest(owner, { chain: baseChain, address: foreignSwapLayerAddress, - relayParams: relayParamsForTest, + relayParams: TEST_RELAY_PARAMS, }); const amountIn = 690000n; @@ -1543,7 +1527,7 @@ describe("Swap Layer", () => { swapLayer, foreignChain, { - ...relayParamsForTest, + ...TEST_RELAY_PARAMS, baseFee: U32_MAX, }, feeUpdater, @@ -1582,7 +1566,7 @@ describe("Swap Layer", () => { await updateRelayParamsForTest( swapLayer, foreignChain, - relayParamsForTest, + TEST_RELAY_PARAMS, feeUpdater, ); }); @@ -1592,7 +1576,7 @@ describe("Swap Layer", () => { const stagedOutbound = stagedOutboundSigner.publicKey; const amountIn = 6900000000n; - const gasDropoff = relayParamsForTest.maxGasDropoff + 1; + const gasDropoff = TEST_RELAY_PARAMS.maxGasDropoff + 1; const maxRelayerFee = 9999999999999; const senderToken = splToken.getAssociatedTokenAddressSync( swapLayer.usdcMint, @@ -1964,7 +1948,7 @@ describe("Swap Layer", () => { await addPeerForTest(owner, { chain: holeskyChain, address: foreignSwapLayerAddress, - relayParams: relayParamsForTest, + relayParams: TEST_RELAY_PARAMS, }); const ix = await swapLayer.initiateTransferIx( @@ -2280,7 +2264,7 @@ describe("Swap Layer", () => { }), { vaaTimestamp: - currTime - relayParamsForTest.swapTimeLimit.finalizedLimit + 5, + currTime - TEST_RELAY_PARAMS.swapTimeLimit.finalizedLimit + 5, }, ); const { vaa } = result!; @@ -2575,7 +2559,7 @@ describe("Swap Layer", () => { }), { vaaTimestamp: - currTime - relayParamsForTest.swapTimeLimit.finalizedLimit - 1, + currTime - TEST_RELAY_PARAMS.swapTimeLimit.finalizedLimit - 1, }, ); const { vaa, message } = result!; diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index 2f58c24a..97991a3b 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -54,6 +54,7 @@ import { denormalizeGasDropOff, encodeSwapLayerMessage, localnet, + TEST_RELAY_PARAMS, } from "../src/swapLayer"; import { REGISTERED_PEERS, @@ -61,6 +62,7 @@ import { createLut, tryNativeToUint8Array, whichTokenProgram, + FEE_UPDATER_KEYPAIR, } from "./helpers"; const JUPITER_V6_LUT_ADDRESSES = [ @@ -73,6 +75,7 @@ describe("Jupiter V6 Testing", () => { const payer = PAYER_KEYPAIR; const testRecipient = Keypair.generate(); + const feeUpdater = FEE_UPDATER_KEYPAIR; // Program SDKs const swapLayer = new SwapLayerProgram(connection, localnet(), USDC_MINT_ADDRESS); @@ -225,6 +228,313 @@ describe("Jupiter V6 Testing", () => { describe("USDC Swap (Relay)", function () { describe("Outbound", function () { + it("Cannot Swap (Amount Out Doesn't Cover Relayer Fee)", async function () { + const srcMint = USDT_MINT_ADDRESS; + const gasDropoff = 500000; + + const { + stagedOutbound, + custodyBalance: inAmount, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }, + { + amountIn: 100n, // Reduce the amountIn. + redeemOption: { + relay: { gasDropoff, maxRelayerFee: 9999999999999n }, + }, + }, + ); + + const expectedRelayerFee = calculateRelayerFee( + TEST_RELAY_PARAMS, + denormalizeGasDropOff(gasDropoff), + outputToken, + ); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { instruction: cpiInstruction, minAmountOut } = + await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 10000, + cpi: true, + }); + assert.isTrue(minAmountOut < expectedRelayerFee); + + await swapExactInForTest( + { payer: payer.publicKey, stagedOutbound, srcMint }, + { cpiInstruction }, + "AmountOutTooSmall", + ); + }); + + it("Cannot Swap (Invalid Prepared By)", async function () { + const srcMint = USDT_MINT_ADDRESS; + + const { + stagedOutbound, + custodyBalance: inAmount, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }, + { + redeemOption: { + relay: { gasDropoff: 500000, maxRelayerFee: 9999999999999n }, + }, + }, + ); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { instruction: cpiInstruction } = await modifyUsdtToUsdcSwapResponseForTest( + swapAuthority, + { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 10000, + cpi: true, + }, + ); + + await swapExactInForTest( + { + payer: payer.publicKey, + stagedOutbound, + srcMint, + preparedBy: testRecipient.publicKey, + }, + { cpiInstruction }, + "prepared_by. Error Code: ConstraintAddress", + ); + }); + + it("Cannot Swap (Invalid USDC Refund Token)", async function () { + const srcMint = USDT_MINT_ADDRESS; + + const { + stagedOutbound, + custodyBalance: inAmount, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }, + { + redeemOption: { + relay: { gasDropoff: 500000, maxRelayerFee: 9999999999999n }, + }, + }, + ); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { instruction: cpiInstruction } = await modifyUsdtToUsdcSwapResponseForTest( + swapAuthority, + { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 10000, + cpi: true, + }, + ); + + const invalidToken = await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + testRecipient.publicKey, + ); + + await swapExactInForTest( + { + payer: payer.publicKey, + stagedOutbound, + srcMint, + usdcRefundToken: invalidToken.address, + }, + { cpiInstruction }, + "usdc_refund_token. Error Code: ConstraintAddress", + ); + }); + + it("Cannot Swap (Invalid Target Chain)", async function () { + const srcMint = USDT_MINT_ADDRESS; + + const { + stagedOutbound, + custodyBalance: inAmount, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }, + { + redeemOption: { + relay: { gasDropoff: 500000, maxRelayerFee: 9999999999999n }, + }, + }, + ); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { instruction: cpiInstruction } = await modifyUsdtToUsdcSwapResponseForTest( + swapAuthority, + { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 10000, + cpi: true, + }, + ); + + // Pass a chain id for a peer that has been registered, but is not the + // target chain for the swap. + await swapExactInForTest( + { + payer: payer.publicKey, + stagedOutbound, + srcMint, + }, + { cpiInstruction, targetChain: toChainId("Holesky") }, + "InvalidTargetChain", + ); + }); + + it("Cannot Swap (Invalid Source Mint)", async function () { + const srcMint = USDT_MINT_ADDRESS; + + const { + stagedOutbound, + custodyBalance: inAmount, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }, + { + redeemOption: { + relay: { gasDropoff: 500000, maxRelayerFee: 9999999999999n }, + }, + }, + ); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { instruction: cpiInstruction } = await modifyUsdtToUsdcSwapResponseForTest( + swapAuthority, + { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 10000, + cpi: true, + }, + ); + + // Pass a chain id for a peer that has been registered, but is not the + // target chain for the swap. + await swapExactInForTest( + { + payer: payer.publicKey, + stagedOutbound, + srcMint: USDC_MINT_ADDRESS, + }, + { cpiInstruction }, + "src_mint. Error Code: ConstraintAddress", + ); + }); + + it("Cannot Swap (Same Mint)", async function () { + const srcMint = USDC_MINT_ADDRESS; + + const { + stagedOutbound, + custodyBalance: inAmount, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }, + { + redeemOption: { + relay: { gasDropoff: 500000, maxRelayerFee: 9999999999999n }, + }, + }, + ); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { instruction: cpiInstruction } = await modifyUsdtToUsdcSwapResponseForTest( + swapAuthority, + { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 10000, + cpi: true, + }, + ); + + // Pass a chain id for a peer that has been registered, but is not the + // target chain for the swap. + await swapExactInForTest( + { + payer: payer.publicKey, + stagedOutbound, + srcMint: USDC_MINT_ADDRESS, + stagedCustodyToken: swapLayer.stagedCustodyTokenAddress(stagedOutbound), + }, + { cpiInstruction }, + "SameMint", + ); + }); + it("USDT via Whirlpool", async function () { const srcMint = USDT_MINT_ADDRESS; @@ -279,32 +589,11 @@ describe("Jupiter V6 Testing", () => { assert.isTrue(accInfos.every((info) => info === null)); } - const ix = await swapLayer.initiateSwapExactInIx( - { - payer: payer.publicKey, - stagedOutbound, - srcMint, - }, - { - cpiInstruction, - }, - ); - - const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ - units: 360_000, - }); - - const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { - const resp = await connection.getAddressLookupTable(lookupTableAddress); - return resp.value; - }), + await swapExactInForTest( + { payer: payer.publicKey, stagedOutbound, srcMint }, + { cpiInstruction }, ); - await expectIxOk(connection, [computeIx, ix], [payer], { - addressLookupTableAccounts, - }); - { const accInfos = await connection.getMultipleAccountsInfo([ sourceToken, @@ -339,44 +628,375 @@ describe("Jupiter V6 Testing", () => { redeemer, preparedCustodyTokenBump: info.preparedCustodyTokenBump, }, - Buffer.from( - encodeSwapLayerMessage({ - recipient: new UniversalAddress(Uint8Array.from(recipient)), - redeemMode, - outputToken, - }), - ), - ), + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress(Uint8Array.from(recipient)), + redeemMode, + outputToken, + }), + ), + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder), + ); + assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + }); + }); + + describe("Inbound", function () { + const emittedEvents: EmittedFilledLocalFastOrder[] = []; + let listenerId: number | null; + + before("Start Event Listener", async function () { + listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { + emittedEvents.push({ event, slot, signature }); + }); + }); + + after("Stop Event Listener", async function () { + if (listenerId !== null) { + matchingEngine.program.removeEventListener(listenerId!); + } + }); + + it("Cannot Redeem USDC (Swap Time Limit Not Exceeded)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 100, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 0n, + }, + amountIn, + }, + ); + + await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + recipient, + ); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient, + }, + toChainId("Ethereum"), + ); + + await expectIxErr(connection, [transferIx], [payer], "SwapTimeLimitNotExceeded"); + + // Update the swap time limit to 0 seconds so that the following tests run quickly. + const ix = await swapLayer.updateRelayParamsIx( + { + feeUpdater: feeUpdater.publicKey, + }, + { + chain: toChainId("Ethereum"), + relayParams: { + ...TEST_RELAY_PARAMS, + swapTimeLimit: { fastLimit: 0, finalizedLimit: 0 }, + }, + }, + ); + + await expectIxOk(swapLayer.program.provider.connection, [ix], [feeUpdater]); + }); + + it("Cannot Swap (Invalid Redeem Mode)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 100, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { mode: "Direct" }, + amountIn, + }, + ); + + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient, + dstMint, + }, + { + limitAmount, + relayingFee: 0n, + denormGasDropoff: 0n, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "InvalidRedeemMode", + }, + ); + }); + + it("Cannot Swap (Invalid Destination Mint)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 100, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 0n, + }, + amountIn, + }, + ); + + const recipientToken = await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + recipient, + ); + + // Pass in the wrong destination mint. + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient, + dstMint: USDC_MINT_ADDRESS, + recipientToken: recipientToken.address, + }, + { + limitAmount, + relayingFee: 0n, + denormGasDropoff: 0n, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "InvalidDestinationMint", + }, + ); + }); + + it("Cannot Swap (Exceeds Swap Deadline)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + deadline: 1, // Set the deadline to 1 second. + slippageBps: 100, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 0n, + }, + amountIn, + }, + ); + + // Pass in the wrong destination mint. + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient, + dstMint, + }, + { + limitAmount, + relayingFee: 0n, + denormGasDropoff: 0n, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "SwapPastDeadline", + }, + ); + }); + + it("Cannot Swap (Invalid Limit Amount)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000_000_000_000_000_000n, + dstMint, + slippageBps: 100, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 0n, + }, + amountIn, + }, + ); + + // Pass in the wrong destination mint. + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient, + dstMint, + }, + { + limitAmount, + relayingFee: 0n, + denormGasDropoff: 0n, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "InvalidLimitAmount", + }, + ); + }); + + it("Cannot Swap (Same Mint)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint: USDC_MINT_ADDRESS, + slippageBps: 100, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 0n, + }, + amountIn, + }, + ); + + const recipientToken = await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + recipient, + ); + + // Pass in the wrong destination mint. + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient, + dstMint: USDC_MINT_ADDRESS, + recipientToken: recipientToken.address, + }, + { + limitAmount, + relayingFee: 0n, + denormGasDropoff: 0n, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "SameMint", + }, + ); + }); + + it("Cannot Swap (Invalid Recipient ATA)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 100, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 0n, + }, + amountIn, + }, ); - // Verify the prepared custody token balance. - const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + // Pass in payer token account instead. + const payerToken = await splToken.getOrCreateAssociatedTokenAccount( connection, - tokenRouter.preparedCustodyTokenAddress(preparedOrder), + payer, + USDC_MINT_ADDRESS, + payer.publicKey, ); - assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); - }); - }); - - describe("Inbound", function () { - const emittedEvents: EmittedFilledLocalFastOrder[] = []; - let listenerId: number | null; - - before("Start Event Listener", async function () { - listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { - emittedEvents.push({ event, slot, signature }); - }); - }); - after("Stop Event Listener", async function () { - if (listenerId !== null) { - matchingEngine.program.removeEventListener(listenerId!); - } + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient, + recipientToken: payerToken.address, + dstMint, + }, + { + limitAmount, + relayingFee: 0n, + denormGasDropoff: 0n, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "recipient_token. Error Code: ConstraintAddress", + }, + ); }); - it("Cannot Redeem USDC (Swap Time Limit Not Exceeded)", async function () { + it("Cannot Swap (Invalid Fee Recipient)", async function () { const dstMint = USDT_MINT_ADDRESS; - const { outputToken } = newQuotedSwapOutputToken({ + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ quotedAmountOut: 198_800_000n, dstMint, slippageBps: 100, @@ -398,23 +1018,72 @@ describe("Jupiter V6 Testing", () => { }, ); - await splToken.getOrCreateAssociatedTokenAccount( + // Pass in payer token account instead. + const recipientToken = await splToken.getOrCreateAssociatedTokenAccount( connection, payer, USDC_MINT_ADDRESS, recipient, ); - const transferIx = await swapLayer.completeTransferRelayIx( + await completeSwapRelayForTest( { payer: payer.publicKey, preparedFill, recipient: recipient, + feeRecipientToken: recipientToken.address, + dstMint, + }, + { + limitAmount, + relayingFee: 0n, + denormGasDropoff: 0n, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "fee_recipient_token. Error Code: ConstraintAddress", }, - toChainId("Ethereum"), ); + }); - await expectIxErr(connection, [transferIx], [payer], "SwapTimeLimitNotExceeded"); + it("Cannot Swap (Invalid Recipient)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 100, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 0n, + }, + amountIn, + recipientOverride: feeUpdater.publicKey, + }, + ); + + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient: recipient, + dstMint, + }, + { + limitAmount, + relayingFee: 0n, + denormGasDropoff: 0n, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "InvalidRecipient", + }, + ); }); it("Other (USDT) via Whirlpool", async function () { @@ -459,6 +1128,90 @@ describe("Jupiter V6 Testing", () => { ); }); + it("Other (USDT) via Whirlpool (No Relayer Fee)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 100, + }); + + const gasDropoff = 100_000; // .1 SOL (10,000 * 1e3) + const relayingFee = 0n; + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee, + }, + amountIn, + }, + ); + + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + relayingFee, + denormGasDropoff: denormalizeGasDropOff(gasDropoff), + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + }, + ); + }); + + it("Other (USDT) via Whirlpool (No Relayer Fee Or Gas Dropoff)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 100, + }); + + const gasDropoff = 0; + const relayingFee = 0n; + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee, + }, + amountIn, + }, + ); + + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + relayingFee, + denormGasDropoff: denormalizeGasDropOff(gasDropoff), + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + }, + ); + }); + it("Other (USDT) via Whirlpool (Self Redeem)", async function () { const dstMint = USDT_MINT_ADDRESS; const { limitAmount, outputToken } = newQuotedSwapOutputToken({ @@ -578,7 +1331,84 @@ describe("Jupiter V6 Testing", () => { payer: recipient, preparedFill, recipient, - dstMint, + dstMint, + }, + { + limitAmount, + relayingFee, + denormGasDropoff: denormalizeGasDropOff(gasDropoff), + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + { signers: [testRecipient] }, + ); + }); + + it("Gas via Phoenix V1", async function () { + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + slippageBps: 150, + }); + + const gasDropoff = 100_000; // .1 SOL (10,000 * 1e3) + const relayingFee = 690000n; // .69 USDC + const amountIn = 300_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee, + }, + amountIn, + }, + ); + + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + }, + { + limitAmount, + relayingFee, + denormGasDropoff: denormalizeGasDropOff(gasDropoff), + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + ); + }); + + it("Gas via Phoenix V1 (No Relayer Fee)", async function () { + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + slippageBps: 150, + }); + + const gasDropoff = 100_000; // .1 SOL (10,000 * 1e3) + const relayingFee = 0n; + const amountIn = 300_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee, + }, + amountIn, + }, + ); + + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, }, { limitAmount, @@ -586,18 +1416,17 @@ describe("Jupiter V6 Testing", () => { denormGasDropoff: denormalizeGasDropOff(gasDropoff), swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, }, - { signers: [testRecipient] }, ); }); - it("Gas via Phoenix V1", async function () { + it("Gas via Phoenix V1 (No Relayer Fee Or Gas Dropoff)", async function () { const { limitAmount, outputToken } = newQuotedSwapOutputToken({ quotedAmountOut: 2_000_000_000n, slippageBps: 150, }); - const gasDropoff = 100_000; // .1 SOL (10,000 * 1e3) - const relayingFee = 690000n; // .69 USDC + const gasDropoff = 0; + const relayingFee = 0n; const amountIn = 300_000_000n; const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( { payer: payer.publicKey }, @@ -670,9 +1499,8 @@ describe("Jupiter V6 Testing", () => { }); it("Redeem USDC (Failed Swap)", async function () { - // NOTE: This test assumes that the relayParams swapTimeLimit.fastLimit is set to - // 2 seconds. If that value changes for any reason, make sure to update this test. - + // NOTE: The fast limit is set to 0 seconds, so the USDC relay should be allowed + // without any time constraints. const dstMint = USDT_MINT_ADDRESS; const { outputToken } = newQuotedSwapOutputToken({ quotedAmountOut: 198_800_000n, @@ -697,19 +1525,22 @@ describe("Jupiter V6 Testing", () => { baseFee: 0n, }, ); + const beneficiary = Keypair.generate(); - // Sleep for 3 seconds. - await new Promise((resolve) => setTimeout(resolve, 3000)); - - await splToken.getOrCreateAssociatedTokenAccount( + // Create an ATA for the recipient. + await expectIxOk( connection, - payer, - USDC_MINT_ADDRESS, - recipient, + [ + splToken.createAssociatedTokenAccountInstruction( + payer.publicKey, + splToken.getAssociatedTokenAddressSync(USDC_MINT_ADDRESS, recipient), + recipient, + USDC_MINT_ADDRESS, + ), + ], + [payer], ); - const beneficiary = Keypair.generate(); - // Balance check. const recipientBefore = await getUsdcAtaBalance(connection, recipient); @@ -876,6 +1707,269 @@ describe("Jupiter V6 Testing", () => { } }); + it("Cannot Swap (Invalid Recipient ATA)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 15, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + amountIn, + }, + ); + + // Pass in payer token account instead. + const payerToken = await splToken.getOrCreateAssociatedTokenAccount( + connection, + payer, + USDC_MINT_ADDRESS, + payer.publicKey, + ); + + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + recipientToken: payerToken.address, + dstMint, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "recipient_token. Error Code: ConstraintAddress", + }, + ); + }); + + it("Cannot Swap (Invalid Redeem Mode)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 15, + }); + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Payload", + sender: toUniversal( + "Ethereum", + "0x000000000000000000000000000000000000d00d", + ), + buf: Buffer.from("All your base are belong to us."), + }, + amountIn, + }, + ); + + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "InvalidRedeemMode", + }, + ); + }); + + it("Cannot Swap USDC Override (Invalid Recipient)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const { limitAmount } = newQuotedSwapOutputToken({ + quotedAmountOut: 198_800_000n, + dstMint, + slippageBps: 15, + }); + const outputToken: OutputToken = { type: "Usdc" }; + + const amountIn = 200_000_000n; + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + amountIn, + }, + ); + + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + outputTokenOverride: "Other", + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "InvalidRecipient", + }, + ); + }); + + it("Cannot Swap USDC Override (Invalid Redeem Mode)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const quotedAmountOut = 198_800_000n; + const { limitAmount } = newQuotedSwapOutputToken({ + quotedAmountOut, + dstMint, + slippageBps: 15, + }); + const outputToken: OutputToken = { type: "Usdc" }; + const redeemMode: RedeemMode = { + mode: "Payload", + sender: toUniversal("Ethereum", "0x000000000000000000000000000000000000d00d"), + buf: Buffer.from("All your base are belong to us."), + }; + + const amountIn = 200_000_000n; + const { preparedFill } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode, + amountIn, + recipient: payer.publicKey, + }, + false, + ); + + // Fetch amount from prepared fill. + const preparedData = await tokenRouter.preparedCustodyTokenAddress(preparedFill); + const { amount: custodyAmount } = await splToken.getAccount( + connection, + preparedData, + ); + + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient: payer.publicKey, + dstMint, + }, + { + limitAmount, + outputTokenOverride: "Other", + inAmount: custodyAmount, + quotedAmountOut, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "InvalidRedeemMode", + }, + ); + }); + + it("Cannot Swap USDC Override (Invalid Swap In Amount)", async function () { + const dstMint = USDT_MINT_ADDRESS; + const quotedAmountOut = 198_800_000n; + const { limitAmount } = newQuotedSwapOutputToken({ + quotedAmountOut, + dstMint, + slippageBps: 15, + }); + const outputToken: OutputToken = { type: "Usdc" }; + + const amountIn = 200_000_000n; + const { preparedFill } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + amountIn, + recipient: payer.publicKey, + }, + false, + ); + + // NOTE: Don't modify the inAmount. + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient: payer.publicKey, + dstMint, + }, + { + limitAmount, + outputTokenOverride: "Other", + quotedAmountOut, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + errorMsg: "InvalidSwapInAmount", + }, + ); + }); + + it("Other (USDT) USDC Override", async function () { + const dstMint = USDT_MINT_ADDRESS; + const quotedAmountOut = 198_800_000n; + const { limitAmount } = newQuotedSwapOutputToken({ + quotedAmountOut, + dstMint, + slippageBps: 15, + }); + const outputToken: OutputToken = { type: "Usdc" }; + + const amountIn = 200_000_000n; + const { preparedFill } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + amountIn, + recipient: payer.publicKey, + }, + false, + ); + + // Fetch amount from prepared fill. + const preparedData = await tokenRouter.preparedCustodyTokenAddress(preparedFill); + const { amount: custodyAmount } = await splToken.getAccount( + connection, + preparedData, + ); + + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient: payer.publicKey, + dstMint, + }, + { + limitAmount, + outputTokenOverride: "Other", + inAmount: custodyAmount, + quotedAmountOut, + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + }, + ); + }); + it("Other (USDT) via Whirlpool", async function () { const dstMint = USDT_MINT_ADDRESS; const { limitAmount, outputToken } = newQuotedSwapOutputToken({ @@ -1218,10 +2312,14 @@ describe("Jupiter V6 Testing", () => { payer: PublicKey; preparedFill: PublicKey; recipient: PublicKey; + recipientToken?: PublicKey; dstMint?: PublicKey; }, opts: ForTestOpts & { limitAmount: bigint; + outputTokenOverride?: string; + inAmount?: bigint; + quotedAmountOut?: bigint; swapResponseModifier: ( tokenOwner: PublicKey, opts: jupiterV6.ModifySharedAccountsRouteOpts, @@ -1229,12 +2327,14 @@ describe("Jupiter V6 Testing", () => { }, ): Promise { const [{ signers, errorMsg }, otherOpts] = setDefaultForTestOpts(opts); - const { limitAmount, swapResponseModifier } = otherOpts; + const { limitAmount, outputTokenOverride, swapResponseModifier } = otherOpts; const { instruction: cpiInstruction, destinationMint } = await swapResponseModifier( swapLayer.swapAuthorityAddress(accounts.preparedFill), { cpi: true, + inAmount: opts.inAmount, + quotedOutAmount: opts.quotedAmountOut, }, ); const expectedDstMint = accounts.dstMint ?? splToken.NATIVE_MINT; @@ -1266,7 +2366,7 @@ describe("Jupiter V6 Testing", () => { const { redeemerMessage } = await tokenRouter.fetchPreparedFill(accounts.preparedFill); const outputToken = decodeSwapLayerMessage(redeemerMessage).outputToken; - if (outputToken.type === "Gas") { + if (outputToken.type === "Gas" || outputTokenOverride === "Gas") { const balanceBefore = await connection.getBalance(accounts.recipient).then(BigInt); await expectIxOk(connection, ixs, signers, { @@ -1275,7 +2375,7 @@ describe("Jupiter V6 Testing", () => { const balanceAfter = await connection.getBalance(accounts.recipient).then(BigInt); assert.isTrue(balanceAfter - balanceBefore >= limitAmount); - } else if (outputToken.type === "Other") { + } else if (outputToken.type === "Other" || outputTokenOverride === "Other") { const dstToken = splToken.getAssociatedTokenAddressSync( expectedDstMint, accounts.recipient, @@ -1300,6 +2400,8 @@ describe("Jupiter V6 Testing", () => { payer: PublicKey; preparedFill: PublicKey; recipient: PublicKey; + feeRecipientToken?: PublicKey; + recipientToken?: PublicKey; dstMint?: PublicKey; }, opts: ForTestOpts & { @@ -1323,7 +2425,6 @@ describe("Jupiter V6 Testing", () => { }, ); const expectedDstMint = accounts.dstMint ?? splToken.NATIVE_MINT; - assert.deepEqual(destinationMint, expectedDstMint); const ix = await swapLayer.completeSwapRelayIx(accounts, { cpiInstruction }); @@ -1391,10 +2492,13 @@ describe("Jupiter V6 Testing", () => { assert.isTrue(dstBalanceAfter - dstBalanceBefore >= limitAmount); + const balanceAfter = await connection.getBalance(accounts.recipient).then(BigInt); if (!selfRedeem) { - const balanceAfter = await connection.getBalance(accounts.recipient).then(BigInt); - // TODO: Can we do a more accurate check? - assert.isTrue(balanceAfter - balanceBefore >= denormGasDropoff); + assert.isTrue(balanceAfter - balanceBefore == denormGasDropoff); + } else { + // Should be nonzero since token accounts are closed and lamports are sent to + // the payer. + assert.isTrue(balanceAfter - balanceBefore > 0); } } else { assert.fail("Invalid output token type"); @@ -1520,6 +2624,7 @@ describe("Jupiter V6 Testing", () => { recipient?: PublicKey; redeemMode?: RedeemMode; outputToken?: OutputToken; + recipientOverride?: PublicKey; }, createRecipientAta = true, ) { @@ -1564,8 +2669,13 @@ describe("Jupiter V6 Testing", () => { ); } + let encodedRecipient = recipient; + if (opts.recipientOverride !== undefined) { + encodedRecipient = opts.recipientOverride; + } + const msg = { - recipient: toUniversal("Solana", recipient.toString()), + recipient: toUniversal("Solana", encodedRecipient.toString()), redeemMode, outputToken, } as SwapLayerMessage; @@ -2197,6 +3307,48 @@ describe("Jupiter V6 Testing", () => { outputToken, }; } + + async function swapExactInForTest( + accounts: { + payer: PublicKey; + stagedOutbound: PublicKey; + stagedCustodyToken?: PublicKey; + preparedOrder?: PublicKey; + srcMint?: PublicKey; + srcTokenProgram?: PublicKey; + preparedBy?: PublicKey; + usdcRefundToken?: PublicKey; + }, + args: { + cpiInstruction: TransactionInstruction; + targetChain?: ChainId; + }, + err?: string, + ) { + const ix = await swapLayer.initiateSwapExactInIx(accounts, args); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 360_000, + }); + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + if (err !== undefined) { + await expectIxErr(connection, [computeIx, ix], [payer], err, { + addressLookupTableAccounts, + }); + return; + } + + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts, + }); + } }); // TODO: look into shared account swap w/ token ledger From 5d130a102fdc81bc81220fe1ca967e9114674585 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Tue, 28 May 2024 09:03:04 -0500 Subject: [PATCH 23/50] solana: fix complete swap payload (#58) * solana: fix complete swap payload * fix setting `StagedInbound::is_native` * add more happy path tests * solana: remove uninitialized --------- Co-authored-by: A5 Pickle --- .../programs/swap-layer/src/composite/mod.rs | 8 +- .../src/processor/complete/swap/payload.rs | 117 +++++++++--------- .../processor/complete/transfer/payload.rs | 36 +++--- .../src/processor/complete/transfer/relay.rs | 2 +- .../swap-layer/src/state/staged/inbound.rs | 2 +- solana/ts/src/swapLayer/index.ts | 14 +-- solana/ts/tests/10__swap.ts | 79 +++++++++++- 7 files changed, 163 insertions(+), 95 deletions(-) diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs index 127ddfb0..fa0d3068 100644 --- a/solana/programs/swap-layer/src/composite/mod.rs +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -174,13 +174,13 @@ pub struct ConsumeSwapLayerFill<'info> { .map_err(|_| SwapLayerError::InvalidSwapMessage)?; require_eq!( - associated_peer.seeds.chain, + source_peer.seeds.chain, fill.source_chain, SwapLayerError::InvalidPeer, ); require!( - fill.order_sender == associated_peer.address, + fill.order_sender == source_peer.address, SwapLayerError::InvalidPeer ); @@ -194,9 +194,9 @@ pub struct ConsumeSwapLayerFill<'info> { /// /// CHECK: Mutable. Seeds must be \["custody"\, source_chain.to_be_bytes()]. #[account(mut)] - fill_custody_token: Box>, + fill_custody_token: UncheckedAccount<'info>, - pub associated_peer: RegisteredPeer<'info>, + pub source_peer: RegisteredPeer<'info>, /// CHECK: Recipient of lamports from closing the prepared_fill account. #[account(mut)] diff --git a/solana/programs/swap-layer/src/processor/complete/swap/payload.rs b/solana/programs/swap-layer/src/processor/complete/swap/payload.rs index f48f2f6e..ddf13caf 100644 --- a/solana/programs/swap-layer/src/processor/complete/swap/payload.rs +++ b/solana/programs/swap-layer/src/processor/complete/swap/payload.rs @@ -5,7 +5,10 @@ use crate::{ }; use anchor_lang::prelude::*; use anchor_spl::{associated_token, token, token_interface}; -use swap_layer_messages::{messages::SwapMessageV1, types::RedeemMode}; +use swap_layer_messages::{ + messages::SwapMessageV1, + types::{OutputToken, RedeemMode}, +}; #[derive(Accounts)] pub struct CompleteSwapPayload<'info> { @@ -74,68 +77,62 @@ where { let staged_inbound = &mut ctx.accounts.staged_inbound; - // Set the staged transfer if it hasn't been set yet. - if staged_inbound.staged_by == Pubkey::default() { - let in_amount = ctx.accounts.consume_swap_layer_fill.consume_prepared_fill( - ctx.accounts.src_swap_token.as_ref().as_ref(), - &ctx.accounts.token_program, - )?; - - let SwapMessageV1 { - recipient, - redeem_mode, - output_token, - } = ctx - .accounts - .consume_swap_layer_fill - .read_message_unchecked(); + let in_amount = ctx.accounts.consume_swap_layer_fill.consume_prepared_fill( + ctx.accounts.src_swap_token.as_ref().as_ref(), + &ctx.accounts.token_program, + )?; - match redeem_mode { - RedeemMode::Payload { sender, buf } => staged_inbound.set_inner(StagedInbound { - seeds: StagedInboundSeeds { - prepared_fill: ctx.accounts.consume_swap_layer_fill.prepared_fill_key(), - bump: ctx.bumps.staged_inbound, - }, - info: StagedInboundInfo { - custody_token: ctx.accounts.dst_swap_token.key(), - staged_by: ctx.accounts.payer.key(), - source_chain: ctx.accounts.consume_swap_layer_fill.fill.source_chain, - sender, - recipient: Pubkey::from(recipient), - is_native: false, - }, - recipient_payload: buf.into(), - }), - _ => return err!(SwapLayerError::InvalidRedeemMode), - }; + let SwapMessageV1 { + recipient, + redeem_mode, + output_token, + } = ctx + .accounts + .consume_swap_layer_fill + .read_message_unchecked(); - handle_complete_swap_jup_v6( - HandleCompleteSwap { - payer: &ctx.accounts.payer, - consume_swap_layer_fill: &ctx.accounts.consume_swap_layer_fill, - authority: ctx.accounts.staged_inbound.as_ref().as_ref(), - src_swap_token: &ctx.accounts.src_swap_token, - dst_swap_token: &ctx.accounts.dst_swap_token, - dst_mint: &ctx.accounts.dst_mint, - token_program: &ctx.accounts.token_program, - system_program: &ctx.accounts.system_program, - dst_token_program: &ctx.accounts.dst_token_program, + match redeem_mode { + RedeemMode::Payload { sender, buf } => staged_inbound.set_inner(StagedInbound { + seeds: StagedInboundSeeds { + prepared_fill: ctx.accounts.consume_swap_layer_fill.prepared_fill_key(), + bump: ctx.bumps.staged_inbound, }, - StagedInbound::SEED_PREFIX, - ctx.bumps.staged_inbound, - ctx.remaining_accounts, - instruction_data, - in_amount, - SwapMessageV1 { - recipient, - redeem_mode: Default::default(), // RedeemMode is not handled in this method. - output_token, + info: StagedInboundInfo { + custody_token: ctx.accounts.dst_swap_token.key(), + staged_by: ctx.accounts.payer.key(), + source_chain: ctx.accounts.consume_swap_layer_fill.fill.source_chain, + sender, + recipient: Pubkey::from(recipient), + is_native: matches!(&output_token, OutputToken::Gas(_)), }, - Default::default(), - Default::default(), - )?; - } + recipient_payload: buf.into(), + }), + _ => return err!(SwapLayerError::InvalidRedeemMode), + }; - // Done. - Ok(()) + handle_complete_swap_jup_v6( + HandleCompleteSwap { + payer: &ctx.accounts.payer, + consume_swap_layer_fill: &ctx.accounts.consume_swap_layer_fill, + authority: ctx.accounts.staged_inbound.as_ref().as_ref(), + src_swap_token: &ctx.accounts.src_swap_token, + dst_swap_token: &ctx.accounts.dst_swap_token, + dst_mint: &ctx.accounts.dst_mint, + token_program: &ctx.accounts.token_program, + system_program: &ctx.accounts.system_program, + dst_token_program: &ctx.accounts.dst_token_program, + }, + StagedInbound::SEED_PREFIX, + ctx.bumps.staged_inbound, + ctx.remaining_accounts, + instruction_data, + in_amount, + SwapMessageV1 { + recipient, + redeem_mode: Default::default(), // RedeemMode is not handled in this method. + output_token, + }, + Default::default(), + Default::default(), + ) } diff --git a/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs b/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs index 455b65eb..8f132ed3 100644 --- a/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs @@ -67,21 +67,20 @@ pub struct CompleteTransferPayload<'info> { pub fn complete_transfer_payload(ctx: Context) -> Result<()> { let staged_inbound = &mut ctx.accounts.staged_inbound; - // Set the staged transfer if it hasn't been set yet. - if staged_inbound.staged_by == Pubkey::default() { - // Consume the prepared fill, and send the tokens to the staged custody account. - ctx.accounts.consume_swap_layer_fill.consume_prepared_fill( - ctx.accounts.staged_custody_token.as_ref().as_ref(), - &ctx.accounts.token_program, - )?; + // Consume the prepared fill, and send the tokens to the staged custody account. + ctx.accounts.consume_swap_layer_fill.consume_prepared_fill( + ctx.accounts.staged_custody_token.as_ref().as_ref(), + &ctx.accounts.token_program, + )?; - let swap_msg = ctx - .accounts - .consume_swap_layer_fill - .read_message_unchecked(); + let swap_msg = ctx + .accounts + .consume_swap_layer_fill + .read_message_unchecked(); - match swap_msg.redeem_mode { - RedeemMode::Payload { sender, buf } => staged_inbound.set_inner(StagedInbound { + match swap_msg.redeem_mode { + RedeemMode::Payload { sender, buf } => { + staged_inbound.set_inner(StagedInbound { seeds: StagedInboundSeeds { prepared_fill: ctx.accounts.consume_swap_layer_fill.prepared_fill_key(), bump: ctx.bumps.staged_inbound, @@ -95,10 +94,11 @@ pub fn complete_transfer_payload(ctx: Context) -> Resul is_native: false, }, recipient_payload: buf.into(), - }), - _ => return err!(SwapLayerError::InvalidRedeemMode), - }; - } + }); - Ok(()) + // Done. + Ok(()) + } + _ => err!(SwapLayerError::InvalidRedeemMode), + } } diff --git a/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs index 76ffc5fe..0bfee293 100644 --- a/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs @@ -35,7 +35,7 @@ pub struct CompleteTransferRelay<'info> { .unix_timestamp .saturating_sub(consume_swap_layer_fill.fill.timestamp); let swap_time_limit = &consume_swap_layer_fill - .associated_peer + .source_peer .relay_params .swap_time_limit; diff --git a/solana/programs/swap-layer/src/state/staged/inbound.rs b/solana/programs/swap-layer/src/state/staged/inbound.rs index 146d3480..66db62b9 100644 --- a/solana/programs/swap-layer/src/state/staged/inbound.rs +++ b/solana/programs/swap-layer/src/state/staged/inbound.rs @@ -3,7 +3,7 @@ use swap_layer_messages::{messages::SwapMessageV1, types::RedeemMode}; use crate::error::SwapLayerError; -#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, InitSpace)] +#[derive(Debug, AnchorSerialize, AnchorDeserialize, Clone, Default, PartialEq, Eq, InitSpace)] pub struct StagedInboundSeeds { pub prepared_fill: Pubkey, pub bump: u8, diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 251d3b0b..ea6c253b 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -156,20 +156,20 @@ export class SwapLayerProgram { accounts: { preparedFill: PublicKey; beneficiary: PublicKey; - associatedPeer?: PublicKey; + sourcePeer?: PublicKey; }, opts: { sourceChain?: wormholeSdk.ChainId } = {}, ): Promise<{ custodian: CheckedCustodianComposite; fill: PublicKey; fillCustodyToken: PublicKey; - associatedPeer: RegisteredPeerComposite; + sourcePeer: RegisteredPeerComposite; beneficiary: PublicKey; tokenRouterProgram: PublicKey; }> { const { preparedFill, beneficiary } = accounts; - let { associatedPeer: peer } = accounts; + let { sourcePeer: peer } = accounts; let { sourceChain } = opts; const tokenRouter = this.tokenRouterProgram(); @@ -185,7 +185,7 @@ export class SwapLayerProgram { custodian: this.checkedCustodianComposite(), fill: preparedFill, fillCustodyToken: tokenRouter.preparedCustodyTokenAddress(preparedFill), - associatedPeer: { peer }, + sourcePeer: { peer }, beneficiary, tokenRouterProgram: tokenRouter.ID, }; @@ -788,7 +788,7 @@ export class SwapLayerProgram { { preparedFill, beneficiary, - associatedPeer: peer, + sourcePeer: peer, }, { sourceChain }, ), @@ -827,7 +827,7 @@ export class SwapLayerProgram { { preparedFill, beneficiary, - associatedPeer: peer, + sourcePeer: peer, }, { sourceChain }, ), @@ -862,7 +862,7 @@ export class SwapLayerProgram { { preparedFill, beneficiary, - associatedPeer: peer, + sourcePeer: peer, }, { sourceChain }, ), diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index 97991a3b..6f7b0701 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -2206,8 +2206,6 @@ describe("Jupiter V6 Testing", () => { const emittedEvents: EmittedFilledLocalFastOrder[] = []; let listenerId: number | null; - const localVariables = new Map(); - before("Start Event Listener", async function () { listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { emittedEvents.push({ event, slot, signature }); @@ -2258,9 +2256,82 @@ describe("Jupiter V6 Testing", () => { swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, }, ); + }); + + it("Other (WSOL) via Phoenix V1", async function () { + const dstMint = splToken.NATIVE_MINT; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + dstMint, + slippageBps: 150, + }); + + const amountIn = 300_000_000n; + const { preparedFill } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + redeemMode: { + mode: "Payload", + sender: toUniversal( + "Ethereum", + "0x000000000000000000000000000000000000d00d", + ), + buf: Buffer.from("All your base are belong to us."), + }, + outputToken, + amountIn, + }, + ); + + await completeSwapPayloadForTest( + { + payer: payer.publicKey, + preparedFill, + dstMint, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + ); + }); + + it("Gas via Phoenix V1", async function () { + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 2_000_000_000n, + slippageBps: 150, + }); + + const amountIn = 300_000_000n; + const { preparedFill } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + outputToken, + redeemMode: { + mode: "Payload", + sender: toUniversal( + "Ethereum", + "0x000000000000000000000000000000000000d00d", + ), + buf: Buffer.from("All your base are belong to us."), + }, + amountIn, + }, + ); - // Save for later. - localVariables.set("preparedFill", preparedFill); + await completeSwapPayloadForTest( + { + payer: payer.publicKey, + preparedFill, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + ); }); }); }); From 2fdd2c71b4b084cb089ee2695c4811bbd279207a Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Wed, 29 May 2024 19:56:28 -0500 Subject: [PATCH 24/50] solana: add ix to close staged outbound (#59) Co-authored-by: gator-boi --- solana/programs/swap-layer/src/lib.rs | 4 + .../src/processor/close_staged_outbound.rs | 120 ++++++++++++ .../programs/swap-layer/src/processor/mod.rs | 3 + solana/ts/src/swapLayer/index.ts | 48 +++++ solana/ts/tests/01__transfer.ts | 161 +++++++++++++++- solana/ts/tests/10__swap.ts | 182 +++++++++++++++++- 6 files changed, 510 insertions(+), 8 deletions(-) create mode 100644 solana/programs/swap-layer/src/processor/close_staged_outbound.rs diff --git a/solana/programs/swap-layer/src/lib.rs b/solana/programs/swap-layer/src/lib.rs index f9f67d66..c9f24bc6 100644 --- a/solana/programs/swap-layer/src/lib.rs +++ b/solana/programs/swap-layer/src/lib.rs @@ -124,6 +124,10 @@ pub mod swap_layer { processor::stage_outbound(ctx, args) } + pub fn close_staged_outbound(ctx: Context) -> Result<()> { + processor::close_staged_outbound(ctx) + } + pub fn initiate_transfer(ctx: Context) -> Result<()> { processor::initiate_transfer(ctx) } diff --git a/solana/programs/swap-layer/src/processor/close_staged_outbound.rs b/solana/programs/swap-layer/src/processor/close_staged_outbound.rs new file mode 100644 index 00000000..a23d737d --- /dev/null +++ b/solana/programs/swap-layer/src/processor/close_staged_outbound.rs @@ -0,0 +1,120 @@ +use crate::{ + composite::*, + state::{Peer, StagedOutbound}, +}; +use anchor_lang::prelude::*; +use anchor_spl::token; + +#[derive(Accounts)] +pub struct CloseStagedOutbound<'info> { + /// This signer must be the same one encoded in the prepared order. + #[account(mut, address = staged_outbound.sender)] + sender: Signer<'info>, + + /// Acct as the authority over the staged custody token account. + target_peer: RegisteredPeer<'info>, + + /// CHECK: This payer must be the same one encoded in the staged outbound. + #[account( + mut, + address = staged_outbound.prepared_by, + )] + prepared_by: UncheckedAccount<'info>, + + /// Staging for outbound transfer. This instruction closes this account. + #[account( + mut, + close = prepared_by, + )] + staged_outbound: Account<'info, StagedOutbound>, + + /// This custody token account will be closed by the end of the instruction. + #[account( + mut, + token::authority = target_peer, + seeds = [ + crate::STAGED_CUSTODY_TOKEN_SEED_PREFIX, + staged_outbound.key().as_ref(), + ], + bump = staged_outbound.info.custody_token_bump, + )] + staged_custody_token: Account<'info, token::TokenAccount>, + + /// CHECK: Where the refund will be sent after the staged outbound is closed. We + /// already check that the sender is the same as the prepared_by account. + #[account(mut)] + sender_token: Option>, + + token_program: Program<'info, token::Token>, + system_program: Program<'info, System>, +} + +pub fn close_staged_outbound(ctx: Context) -> Result<()> { + let target_peer_signer_seeds = &[ + Peer::SEED_PREFIX, + &ctx.accounts.target_peer.seeds.chain.to_be_bytes(), + &[ctx.accounts.target_peer.seeds.bump], + ]; + + match &ctx.accounts.sender_token { + Some(sender_token) => { + // Transfer the custody token to the sender. + token::transfer( + CpiContext::new_with_signer( + ctx.accounts.token_program.to_account_info(), + token::Transfer { + from: ctx.accounts.staged_custody_token.to_account_info(), + to: sender_token.to_account_info(), + authority: ctx.accounts.target_peer.to_account_info(), + }, + &[target_peer_signer_seeds], + ), + ctx.accounts.staged_custody_token.amount, + )?; + + // Finally close token account. + token::close_account(CpiContext::new_with_signer( + ctx.accounts.token_program.to_account_info(), + token::CloseAccount { + account: ctx.accounts.staged_custody_token.to_account_info(), + destination: ctx.accounts.prepared_by.to_account_info(), + authority: ctx.accounts.target_peer.to_account_info(), + }, + &[target_peer_signer_seeds], + )) + } + None => { + let lamports = + AsRef::::as_ref(&ctx.accounts.staged_custody_token).lamports(); + let sender = ctx.accounts.sender.to_account_info(); + let prepared_by = ctx.accounts.prepared_by.to_account_info(); + + // Finally close token account. + token::close_account(CpiContext::new_with_signer( + ctx.accounts.token_program.to_account_info(), + token::CloseAccount { + account: ctx.accounts.staged_custody_token.to_account_info(), + destination: sender.to_account_info(), + authority: ctx.accounts.target_peer.to_account_info(), + }, + &[target_peer_signer_seeds], + ))?; + + if sender.key() != prepared_by.key() { + // Transfer the lamports to the sender. + anchor_lang::system_program::transfer( + CpiContext::new( + ctx.accounts.system_program.to_account_info(), + anchor_lang::system_program::Transfer { + from: sender.to_account_info(), + to: prepared_by, + }, + ), + lamports.saturating_sub(ctx.accounts.staged_custody_token.amount), + )?; + } + + Ok(()) + } + } +} diff --git a/solana/programs/swap-layer/src/processor/mod.rs b/solana/programs/swap-layer/src/processor/mod.rs index 12901423..f2be950e 100644 --- a/solana/programs/swap-layer/src/processor/mod.rs +++ b/solana/programs/swap-layer/src/processor/mod.rs @@ -12,3 +12,6 @@ pub use release_inbound::*; mod stage_outbound; pub use stage_outbound::*; + +mod close_staged_outbound; +pub use close_staged_outbound::*; diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index ea6c253b..ad3734a6 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -465,6 +465,54 @@ export class SwapLayerProgram { .instruction(); } + async closeStagedOutboundIx( + accounts: { + stagedOutbound: PublicKey; + senderToken: PublicKey; + preparedBy?: PublicKey; + sender?: PublicKey; + }, + targetChain: ChainId, + ): Promise { + const { + stagedOutbound, + preparedBy: inputPreparedBy, + sender: inputSender, + senderToken, + } = accounts; + + const { preparedBy, sender } = await (async () => { + if (inputPreparedBy === undefined || inputSender === undefined) { + const { + info: { preparedBy, sender }, + } = await this.fetchStagedOutbound(stagedOutbound); + return { + preparedBy: inputPreparedBy ?? preparedBy, + sender: inputSender ?? sender, + }; + } else { + return { + preparedBy: inputPreparedBy, + sender: inputSender, + }; + } + })(); + + return this.program.methods + .closeStagedOutbound() + .accounts({ + sender, + targetPeer: this.registeredPeerComposite({ chain: targetChain }), + preparedBy, + stagedOutbound, + stagedCustodyToken: this.stagedCustodyTokenAddress(stagedOutbound), + senderToken, + tokenProgram: splToken.TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }) + .instruction(); + } + async stageOutboundIx( accounts: { payer: PublicKey; diff --git a/solana/ts/tests/01__transfer.ts b/solana/ts/tests/01__transfer.ts index cd8177c5..e0b1f2ca 100644 --- a/solana/ts/tests/01__transfer.ts +++ b/solana/ts/tests/01__transfer.ts @@ -54,7 +54,13 @@ import { localnet, TEST_RELAY_PARAMS, } from "../src/swapLayer"; -import { FEE_UPDATER_KEYPAIR, REGISTERED_PEERS, createLut, tryNativeToUint8Array } from "./helpers"; +import { + FEE_UPDATER_KEYPAIR, + REGISTERED_PEERS, + USDT_MINT_ADDRESS, + createLut, + tryNativeToUint8Array, +} from "./helpers"; const SOLANA_CHAIN_ID = toChainId("Solana"); @@ -1845,6 +1851,148 @@ describe("Swap Layer", () => { ); }); }); + + describe("Close", function () { + it("Cannot Close Staged Outbound (Invalid Sender)", async function () { + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + + // Stage outbound with sender. + const { stagedOutbound } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken, + }, + { amountIn }, + ); + + const ix = await swapLayer.closeStagedOutboundIx( + { stagedOutbound, senderToken, sender: ownerAssistant.publicKey }, + foreignChain, + ); + await expectIxErr( + connection, + [ix], + [ownerAssistant], + "sender. Error Code: ConstraintAddress", + ); + }); + + it("Cannot Close Staged Outbound (Invalid Peer)", async function () { + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + + // Stage outbound with sender. + const { stagedOutbound } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken, + }, + { amountIn }, + ); + + const sepoliaChain = toChainId("Sepolia"); + await addPeerForTest(owner, { + chain: sepoliaChain, + address: foreignSwapLayerAddress, + relayParams: TEST_RELAY_PARAMS, + }); + + const ix = await swapLayer.closeStagedOutboundIx( + { stagedOutbound, senderToken }, + sepoliaChain, + ); + await expectIxErr(connection, [ix], [payer], "ConstraintTokenOwner"); + }); + + it("Cannot Close Staged Outbound (Invalid PreparedBy)", async function () { + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + + // Stage outbound with sender. + const { stagedOutbound } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken, + }, + { amountIn }, + ); + + // Pass invalid preparedBy. + const ix = await swapLayer.closeStagedOutboundIx( + { + stagedOutbound, + sender: payer.publicKey, + preparedBy: ownerAssistant.publicKey, + senderToken, + }, + foreignChain, + ); + await expectIxErr( + connection, + [ix], + [payer], + "prepared_by. Error Code: ConstraintAddress", + ); + }); + + it("Close Staged Outbound (USDC)", async function () { + const amountIn = 690000n; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + + // Stage outbound with sender. + const { stagedOutbound, stagedCustodyToken } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken, + }, + { amountIn }, + ); + + const balanceBefore = await connection.getBalance(payer.publicKey).then(BigInt); + const { amount: tokenBalanceBefore } = await splToken.getAccount( + connection, + senderToken, + ); + + const ix = await swapLayer.closeStagedOutboundIx( + { stagedOutbound, senderToken }, + foreignChain, + ); + await expectIxOk(connection, [ix], [payer]); + + const balanceAfter = await connection.getBalance(payer.publicKey).then(BigInt); + const { amount: tokenBalanceAfter } = await splToken.getAccount( + connection, + senderToken, + ); + + assert.isTrue(balanceAfter > balanceBefore); + assert.equal(tokenBalanceAfter, tokenBalanceBefore + amountIn); + + // Confirm that the staged accounts have been deleted. + { + const accInfo = await connection.getAccountInfo(stagedOutbound); + assert.isNull(accInfo); + } + { + const accInfo = await connection.getAccountInfo(stagedCustodyToken); + assert.isNull(accInfo); + } + }); + }); }); describe("USDC Transfer (Relay)", function () { @@ -2036,8 +2184,9 @@ describe("Swap Layer", () => { await expectIxOk(connection, [ix], [payer]); // Verify the relevant information in the prepared order. - const preparedOrderData = - await tokenRouter.fetchPreparedOrder(preparedOrder); + const preparedOrderData = await tokenRouter.fetchPreparedOrder( + preparedOrder, + ); const { info: { preparedCustodyTokenBump }, @@ -3452,8 +3601,9 @@ describe("Swap Layer", () => { units: 300_000, }); - const { value: lookupTableAccount } = - await connection.getAddressLookupTable(tokenRouterLkupTable); + const { value: lookupTableAccount } = await connection.getAddressLookupTable( + tokenRouterLkupTable, + ); await expectIxOk(connection, [computeIx, ix], [payer], { addressLookupTableAccounts: [lookupTableAccount!], @@ -3536,6 +3686,7 @@ describe("Swap Layer", () => { accounts: { payer: PublicKey; senderToken: PublicKey; + sender?: PublicKey; }, opts: { amountIn?: bigint; diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index 6f7b0701..70715873 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -1564,6 +1564,170 @@ describe("Jupiter V6 Testing", () => { }); describe("USDC Swap (Direct)", function () { + describe("Close Staged Outbound", function () { + it("USDT", async function () { + const amountIn = 690000n; + const srcMint = USDT_MINT_ADDRESS; + const senderToken = splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + ); + + // Stage outbound with sender. + const { stagedOutbound, stagedCustodyToken } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken, + srcMint, + }, + { amountIn }, + ); + + const balanceBefore = await connection.getBalance(payer.publicKey).then(BigInt); + const { amount: tokenBalanceBefore } = await splToken.getAccount( + connection, + senderToken, + ); + + const ix = await swapLayer.closeStagedOutboundIx( + { stagedOutbound, senderToken }, + toChainId("Ethereum"), + ); + await expectIxOk(connection, [ix], [payer]); + + const balanceAfter = await connection.getBalance(payer.publicKey).then(BigInt); + const { amount: tokenBalanceAfter } = await splToken.getAccount( + connection, + senderToken, + ); + + assert.isTrue(balanceAfter > balanceBefore); + assert.equal(tokenBalanceAfter, tokenBalanceBefore + amountIn); + + // Confirm that the staged accounts have been deleted. + { + const accInfo = await connection.getAccountInfo(stagedOutbound); + assert.isNull(accInfo); + } + { + const accInfo = await connection.getAccountInfo(stagedCustodyToken); + assert.isNull(accInfo); + } + }); + + it("Gas (Sender == Prepared By)", async function () { + const amountIn = 690000n; + + // Stage outbound with sender. + const { stagedOutbound, stagedCustodyToken } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: null, + sender: payer.publicKey, + srcMint: splToken.NATIVE_MINT, + }, + { amountIn, transferType: "native" }, + ); + + const balanceBefore = await connection.getBalance(payer.publicKey).then(BigInt); + + const ix = await swapLayer.closeStagedOutboundIx( + { stagedOutbound, senderToken: null }, + toChainId("Ethereum"), + ); + await expectIxOk(connection, [ix], [payer]); + + // Confirm that the staged accounts have been deleted. + { + const accInfo = await connection.getAccountInfo(stagedOutbound); + assert.isNull(accInfo); + } + { + const accInfo = await connection.getAccountInfo(stagedCustodyToken); + assert.isNull(accInfo); + } + + const balanceAfter = await connection.getBalance(payer.publicKey).then(BigInt); + + assert.isTrue(balanceAfter - balanceBefore >= amountIn); + }); + + it("Gas (Sender != Prepared By)", async function () { + const amountIn = 690000n; + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + const sender = feeUpdater; + + const usdcRefundToken = splToken.getAssociatedTokenAddressSync( + USDC_MINT_ADDRESS, + sender.publicKey, + ); + await expectIxOk( + connection, + [ + splToken.createAssociatedTokenAccountInstruction( + sender.publicKey, + usdcRefundToken, + sender.publicKey, + USDC_MINT_ADDRESS, + ), + ], + [sender], + ); + const [approveIx, stageIx] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken: null, + sender: sender.publicKey, + stagedOutbound, + usdcRefundToken, + }, + { + transferType: "native", + amountIn, + targetChain: toChainId("Ethereum"), + recipient: Array.from(Buffer.alloc(32, "deadbeef")), + redeemOption: null, + outputToken: null, + }, + ); + assert.isNull(approveIx); + + await expectIxOk(connection, [stageIx], [payer, sender, stagedOutboundSigner]); + + const senderBefore = await connection.getBalance(sender.publicKey).then(BigInt); + const preparedByBefore = await connection.getBalance(payer.publicKey).then(BigInt); + + const ix = await swapLayer.closeStagedOutboundIx( + { stagedOutbound, senderToken: null, sender: sender.publicKey }, + toChainId("Ethereum"), + ); + const tx = await expectIxOk(connection, [ix], [sender]); + const txDetail = await connection.getParsedTransaction(tx, { + maxSupportedTransactionVersion: 0, + commitment: "confirmed", + }); + + // Confirm that the staged accounts have been deleted. + { + const accInfo = await connection.getAccountInfo(stagedOutbound); + assert.isNull(accInfo); + } + { + const accInfo = await connection.getAccountInfo( + swapLayer.stagedCustodyTokenAddress(stagedOutbound), + ); + assert.isNull(accInfo); + } + + const senderAfter = await connection.getBalance(sender.publicKey).then(BigInt); + const preparedByAfter = await connection.getBalance(payer.publicKey).then(BigInt); + + assert.isTrue(senderAfter - senderBefore == amountIn - BigInt(txDetail.meta.fee)); + assert.isTrue(preparedByAfter > preparedByBefore); + }); + }); + describe("Outbound", function () { it("USDT via Whirlpool", async function () { const srcMint = USDT_MINT_ADDRESS; @@ -3273,6 +3437,7 @@ describe("Jupiter V6 Testing", () => { payer: PublicKey; senderToken: PublicKey; srcMint: PublicKey; + sender?: PublicKey; }, opts: { amountIn?: bigint; @@ -3282,6 +3447,7 @@ describe("Jupiter V6 Testing", () => { | { payload: Uint8Array | Buffer } | null; outputToken?: OutputToken | null; + transferType?: "sender" | "native"; } = {}, ): Promise<{ amountIn: bigint; @@ -3295,13 +3461,23 @@ describe("Jupiter V6 Testing", () => { const stagedOutboundSigner = Keypair.generate(); const stagedOutbound = stagedOutboundSigner.publicKey; - let { amountIn, targetChain, redeemOption, outputToken } = opts; + let { amountIn, targetChain, redeemOption, outputToken, transferType } = opts; amountIn ??= 690000n; targetChain ??= toChainId("Ethereum"); redeemOption ??= null; outputToken ??= null; + transferType ??= "sender"; + + let sender = accounts.sender; + if (sender === undefined) { + if (accounts.senderToken === undefined) { + throw new Error("Sender must be specified if senderToken is null"); + } + + const { owner } = await splToken.getAccount(connection, accounts.senderToken); + sender = owner; + } - const { owner: sender } = await splToken.getAccount(connection, accounts.senderToken); const usdcRefundToken = splToken.getAssociatedTokenAddressSync( swapLayer.usdcMint, sender, @@ -3316,7 +3492,7 @@ describe("Jupiter V6 Testing", () => { usdcRefundToken, }, { - transferType: "sender", + transferType, amountIn, targetChain, recipient: Array.from(Buffer.alloc(32, "deadbeef")), From 0f3276313f3fab326d7c3bbb3db6749afe572031 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Thu, 30 May 2024 09:48:14 -0500 Subject: [PATCH 25/50] solana: fix swaps and use token 2022 mint for tests (#62) * solana: something works * solana: blood, sweat and tears * solana: clean up * solana: more clean up --------- Co-authored-by: A5 Pickle --- solana/Anchor.toml | 314 ++++++++- solana/Makefile | 23 +- .../programs/swap-layer/src/composite/mod.rs | 205 +++--- solana/programs/swap-layer/src/error.rs | 2 + .../src/processor/complete/swap/direct.rs | 5 +- .../src/processor/complete/swap/payload.rs | 13 +- .../src/processor/complete/swap/relay.rs | 32 +- .../src/processor/initiate/swap/exact_in.rs | 116 ++-- .../programs/swap-layer/src/processor/mod.rs | 6 +- .../src/processor/stage_outbound.rs | 7 +- .../jupiter_v6/cpi/shared_accounts_route.rs | 14 +- solana/ts/scripts/collectedToAnchorToml.ts | 14 + solana/ts/scripts/testJupV6QuoteFlipMulti.ts | 134 ++++ solana/ts/src/jupiterV6/index.ts | 27 +- solana/ts/src/jupiterV6/layouts.ts | 23 +- solana/ts/src/swapLayer/index.ts | 31 +- solana/ts/tests/01__transfer.ts | 16 +- solana/ts/tests/10__swap.ts | 630 ++++++++++++++---- solana/ts/tests/accounts/bern_mint_2022.json | 14 + .../jupiter_custody_owner.json | 0 .../jupiter_usdc_custody_token.json | 0 .../jupiter_usdt_custody_token.json | 0 .../jupiter_v6_lut_1.json | 0 .../jupiter_v6_lut_2.json | 0 .../accounts/jupiter_v6/jupiter_v6_lut_3.json | 14 + .../accounts/jupiter_v6/jupiter_v6_lut_4.json | 14 + .../accounts/jupiter_v6/jupiter_v6_lut_5.json | 14 + .../accounts/jupiter_v6/jupiter_v6_lut_6.json | 14 + .../accounts/jupiter_v6/jupiter_v6_lut_7.json | 14 + .../accounts/jupiter_v6/jupiter_v6_lut_8.json | 14 + ...Ye8RB8JpoCDq3i4u6cCNfCG1xicYK7E7f3v6L.json | 14 + ...noGRmTFszBRj3P2GzfARqdGwhpimQthWTGbhn.json | 14 + ...TNeEJa2S539ijVLLeVZt88zuiduSYD7SeSeHN.json | 14 + ...VuzJiaM43uFtutVFdSoWx963AKT8dtizqejTF.json | 14 + ...7vdJ1TLLX2YGZ7fBJ9U96UwAFAjwLK572TJ4h.json | 14 + ...GXEdyRJ74fnSfL7L4tZgXVafirBMsbHqZyCVx.json | 14 + ...cRP3Th3GhKcZk7sUkF3skxV8FdbiG8aKp7qeh.json | 14 + ...ievxAbsMsaT6TS4i6oMitD9jazucuq3X234tC.json | 14 + ...zHKgGBxXW8Rj4neWZT5JHgdAjVRqUDcDk8nF9.json | 14 + ...CFbr4FWYoMwzUjDgoUGC4dzjaLhjR71CrAQpe.json | 14 + ...2uZqWBng69NpL1Ghxi9GaRa3t6vJpB7BZFLZZ.json | 14 + ...fFjBUoxATVGBaULdbwQgmx5CZ9WvX9jC6YZxq.json | 14 + ...KUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx.json | 14 + ...RY6Bh3MiWDHuLqyHywovsRwRpfskPvyeSoHsz.json | 14 + ...6GhwnessH7CvPivqDYauiHZmAdbEFDpXFk9zt.json | 14 + ...C9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ.json | 14 + ...QKW4w4rmWFQLTqCYVuA1rMe9Z2QQ2SZResD9M.json | 14 + ...A1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj.json | 14 + ...pjf1PTTCQCfTRu17EJgvsxo9pVyA9QWwEuX4x.json | 14 + ...WRzJ5AXN55RQ6RrM1dFYz6qzeAUH3i83eTHkM.json | 14 + ...Q2Z7yQRaKneUUwtdt9aF6kg6pxS2waqoJ57mX.json | 14 + ...Bd6XXAbuMZSp9cNqaVreDcAtn5xWgQtPwXap4.json | 14 + ...yrBuQGZ3bjE4Bgjk6tD29TNXcKxT4cq2vawo8.json | 14 + ...TK1qqjpASjokZr5bQzcoMUhGFwCEnqFukYtCg.json | 14 + ...wyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo.json | 14 + ...MUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo.json | 14 + ...CKc2o2RiHVnyhHQVAngtKzyGkQFB3UPqD4HdL.json | 14 + ...TcsGbday27kM21MoQMVzWxEEUk4qZ65qKrwWb.json | 14 + ...bZtvuv7tm4rcAbbWSMX99hnPQvEmDQ2EyGfg3.json | 14 + ...4iKBmnjxGpjw6c1RHfukdeLSnq2LVTfQtAguL.json | 14 + ...fVSStaRxMVZUxwbzE4AXhzxgMruZ5QM9QdEqJ.json | 14 + ...Ju7sypqwR4eiU7C5TMcmmiFoU4HaF5SoD8mRy.json | 14 + ...ntxsjPB9yZBEjUxoFTtgwCLWU7LYGPuvXMpHS.json | 14 + ...5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v.json | 14 + ...WLaQxj2oyK967RgEPbcPypjQCoZ3tpB4fwLsk.json | 14 + ...LgzEvRBvFqSJ687isQRDqNoAS4hPM7iyXQ9gf.json | 14 + ...GW7phzUQWwoDL3ijBuBAE46M2AiPguZKLXUWN.json | 14 + ...zHXYtC6jEoNuY1SzwK95jNfJkNYNk5Qo666Dj.json | 14 + ...qZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG.json | 14 + ...f9m241QDCemXvEZqnrQFud8Af8dEqZMjHD39u.json | 14 + ...WrGaUf1RR2kcXD7LY1jou1qFAuSsQeKp5ow4a.json | 14 + ...55YxsyAHLuFVRNJ4bnZKgnMTKuRoipPSwsHpD.json | 14 + ...KWHHpi4ixfTehtgSGDceS23rCG498zFeAEbDZ.json | 14 + ...cqujYTQDRxRhnb9jznun5kxbr1uu9JNu1ZeiL.json | 14 + ...1111111111111111111111111111111111112.json | 14 + ...JasfiHDT1kNJwYfeEQjwJzPKEwhP5WK13aGMb.json | 14 + ...hXvimx3tfQ8PYCQu6KobCtZjQoerq8a4HjfCh.json | 14 + .../tests/accounts/payer_bern_token_2022.json | 14 + .../ts/tests/accounts/payer_wsol_token.json | 14 - solana/ts/tests/helpers/consts.ts | 2 + solana/ts/tests/helpers/utils.ts | 49 +- .../multi_2022_to_usdc.json | 416 ++++++++++++ .../multi_usdc_to_2022.json | 336 ++++++++++ 83 files changed, 2833 insertions(+), 366 deletions(-) create mode 100644 solana/ts/scripts/collectedToAnchorToml.ts create mode 100644 solana/ts/scripts/testJupV6QuoteFlipMulti.ts create mode 100644 solana/ts/tests/accounts/bern_mint_2022.json rename solana/ts/tests/accounts/{jupiter => jupiter_v6}/jupiter_custody_owner.json (100%) rename solana/ts/tests/accounts/{jupiter => jupiter_v6}/jupiter_usdc_custody_token.json (100%) rename solana/ts/tests/accounts/{jupiter => jupiter_v6}/jupiter_usdt_custody_token.json (100%) rename solana/ts/tests/accounts/{jupiter => jupiter_v6}/jupiter_v6_lut_1.json (100%) rename solana/ts/tests/accounts/{jupiter => jupiter_v6}/jupiter_v6_lut_2.json (100%) create mode 100644 solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_3.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_4.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_5.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_6.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_7.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_8.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/25s6jZQYe8RB8JpoCDq3i4u6cCNfCG1xicYK7E7f3v6L.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/2LizoD7noGRmTFszBRj3P2GzfARqdGwhpimQthWTGbhn.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/2UDdWW9TNeEJa2S539ijVLLeVZt88zuiduSYD7SeSeHN.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/2W7aa5mVuzJiaM43uFtutVFdSoWx963AKT8dtizqejTF.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/2qr4UqV7vdJ1TLLX2YGZ7fBJ9U96UwAFAjwLK572TJ4h.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/39PUs23GXEdyRJ74fnSfL7L4tZgXVafirBMsbHqZyCVx.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/3GbtMs4cRP3Th3GhKcZk7sUkF3skxV8FdbiG8aKp7qeh.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/3MsJXVvievxAbsMsaT6TS4i6oMitD9jazucuq3X234tC.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/3nLYkE5zHKgGBxXW8Rj4neWZT5JHgdAjVRqUDcDk8nF9.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/42xVpYuCFbr4FWYoMwzUjDgoUGC4dzjaLhjR71CrAQpe.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/4h5Ye952uZqWBng69NpL1Ghxi9GaRa3t6vJpB7BZFLZZ.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/5Y117zFfFjBUoxATVGBaULdbwQgmx5CZ9WvX9jC6YZxq.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/6P4tvbzRY6Bh3MiWDHuLqyHywovsRwRpfskPvyeSoHsz.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/6mK4Pxs6GhwnessH7CvPivqDYauiHZmAdbEFDpXFk9zt.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/85VBFQZC9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/8M5rjeDQKW4w4rmWFQLTqCYVuA1rMe9Z2QQ2SZResD9M.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/9iFER3bpjf1PTTCQCfTRu17EJgvsxo9pVyA9QWwEuX4x.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/9keEfR6WRzJ5AXN55RQ6RrM1dFYz6qzeAUH3i83eTHkM.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/AMnF3iSQ2Z7yQRaKneUUwtdt9aF6kg6pxS2waqoJ57mX.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/AMxuPcXBd6XXAbuMZSp9cNqaVreDcAtn5xWgQtPwXap4.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/AxfosPGyrBuQGZ3bjE4Bgjk6tD29TNXcKxT4cq2vawo8.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/BhA6Xc9TK1qqjpASjokZr5bQzcoMUhGFwCEnqFukYtCg.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/CVvxB22CKc2o2RiHVnyhHQVAngtKzyGkQFB3UPqD4HdL.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/DCPM7ynTcsGbday27kM21MoQMVzWxEEUk4qZ65qKrwWb.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/DHqUM3nbZtvuv7tm4rcAbbWSMX99hnPQvEmDQ2EyGfg3.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/DNbwqtq4iKBmnjxGpjw6c1RHfukdeLSnq2LVTfQtAguL.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/DS4251KfVSStaRxMVZUxwbzE4AXhzxgMruZ5QM9QdEqJ.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/DoPuiZfJu7sypqwR4eiU7C5TMcmmiFoU4HaF5SoD8mRy.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/EJcnUbFntxsjPB9yZBEjUxoFTtgwCLWU7LYGPuvXMpHS.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/Ebbpz3PWLaQxj2oyK967RgEPbcPypjQCoZ3tpB4fwLsk.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/FNdKRVxLgzEvRBvFqSJ687isQRDqNoAS4hPM7iyXQ9gf.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/Ft1URsGGW7phzUQWwoDL3ijBuBAE46M2AiPguZKLXUWN.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/FtSs1FxzHXYtC6jEoNuY1SzwK95jNfJkNYNk5Qo666Dj.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/GATnWZVf9m241QDCemXvEZqnrQFud8Af8dEqZMjHD39u.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/GMgh4NtWrGaUf1RR2kcXD7LY1jou1qFAuSsQeKp5ow4a.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/H7TY41Z55YxsyAHLuFVRNJ4bnZKgnMTKuRoipPSwsHpD.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/H7qgBfnKWHHpi4ixfTehtgSGDceS23rCG498zFeAEbDZ.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/JMMtEtcqujYTQDRxRhnb9jznun5kxbr1uu9JNu1ZeiL.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/So11111111111111111111111111111111111111112.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/d64w2PJasfiHDT1kNJwYfeEQjwJzPKEwhP5WK13aGMb.json create mode 100644 solana/ts/tests/accounts/jupiter_v6/multi/gyjtxRhXvimx3tfQ8PYCQu6KobCtZjQoerq8a4HjfCh.json create mode 100644 solana/ts/tests/accounts/payer_bern_token_2022.json delete mode 100644 solana/ts/tests/accounts/payer_wsol_token.json create mode 100644 solana/ts/tests/jupiterV6SwapResponses/multi_2022_to_usdc.json create mode 100644 solana/ts/tests/jupiterV6SwapResponses/multi_usdc_to_2022.json diff --git a/solana/Anchor.toml b/solana/Anchor.toml index daccf25f..03869279 100644 --- a/solana/Anchor.toml +++ b/solana/Anchor.toml @@ -25,7 +25,7 @@ wallet = "ts/tests/keys/pFCBP4bhqdSsrWUVTgqhPsLrfEdChBK17vgFM7TxjxQ.json" test = "npx ts-mocha -p ./tsconfig.anchor-test.json -t 1000000 --bail --exit ts/tests/[0-9]*.ts" [test] -startup_wait = 20000 +startup_wait = 30000 [test.validator] url = "https://api.mainnet-beta.solana.com" @@ -174,35 +174,75 @@ filename = "ts/tests/accounts/payer_usdt_token.json" address = "Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB" filename = "ts/tests/accounts/usdt_mint.json" +### Payer BERN Token-2022 Account +[[test.validator.account]] +address = "5uH9XJQ9gDp8Ym9vyCMVA88W61iVJ7sktBhvyMkNob17" +filename = "ts/tests/accounts/payer_bern_token_2022.json" + +### BERN Mint (2022) +[[test.validator.account]] +address = "CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo" +filename = "ts/tests/accounts/bern_mint_2022.json" + ### Jupiter V6 Program [[test.genesis]] address = "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4" program = "ts/tests/artifacts/mainnet_jupiter_v6.so" ### Jupiter V6 -- Custody Token Owner -[[test.validator.account]] -address = "BQ72nSv9f3PRyRKCBnHLVrerrv37CYTHm5h3s9VSGQDV" -filename = "ts/tests/accounts/jupiter/jupiter_custody_owner.json" +#[[test.validator.account]] +#address = "BQ72nSv9f3PRyRKCBnHLVrerrv37CYTHm5h3s9VSGQDV" +#filename = "ts/tests/accounts/jupiter_v6/jupiter_custody_owner.json" ### Jupiter V6 -- USDC Custody Token -[[test.validator.account]] -address = "7u7cD7NxcZEuzRCBaYo8uVpotRdqZwez47vvuwzCov43" -filename = "ts/tests/accounts/jupiter/jupiter_usdc_custody_token.json" +#[[test.validator.account]] +#address = "7u7cD7NxcZEuzRCBaYo8uVpotRdqZwez47vvuwzCov43" +#filename = "ts/tests/accounts/jupiter_v6/jupiter_usdc_custody_token.json" ### Jupiter V6 -- USDT Custody Token -[[test.validator.account]] -address = "6pXVFSACE5BND2C3ibGRWMG1fNtV7hfynWrfNKtCXhN3" -filename = "ts/tests/accounts/jupiter/jupiter_usdt_custody_token.json" +#[[test.validator.account]] +#address = "6pXVFSACE5BND2C3ibGRWMG1fNtV7hfynWrfNKtCXhN3" +#filename = "ts/tests/accounts/jupiter_v6/jupiter_usdt_custody_token.json" ### Jupiter V6 -- LUT #1 [[test.validator.account]] address = "GxS6FiQ3mNnAar9HGQ6mxP7t6FcwmHkU7peSeQDUHmpN" -filename = "ts/tests/accounts/jupiter/jupiter_v6_lut_1.json" +filename = "ts/tests/accounts/jupiter_v6/jupiter_v6_lut_1.json" -### Jupiter V6 -- LUT #1 +### Jupiter V6 -- LUT #2 [[test.validator.account]] address = "HsLPzBjqK3SUKQZwHdd2QHVc9cioPrsHNw9GcUDs7WL7" -filename = "ts/tests/accounts/jupiter/jupiter_v6_lut_2.json" +filename = "ts/tests/accounts/jupiter_v6/jupiter_v6_lut_2.json" + +### Jupiter V6 -- LUT #3 +[[test.validator.account]] +address = "8Vaso6eE1pWktDHwy2qQBB1fhjmBgwzhoXQKe1sxtFjn" +filename = "ts/tests/accounts/jupiter_v6/jupiter_v6_lut_3.json" + +### Jupiter V6 -- LUT #4 +[[test.validator.account]] +address = "D6XNrxMsDoABJVVY5YyHxJuAB6WGzYCXpZeKyNtqu2v4" +filename = "ts/tests/accounts/jupiter_v6/jupiter_v6_lut_4.json" + +### Jupiter V6 -- LUT #5 +[[test.validator.account]] +address = "2aGZxQimbQhRsvQhjvjXE35vZGJP2ajBSrUggoEwGGy4" +filename = "ts/tests/accounts/jupiter_v6/jupiter_v6_lut_5.json" + +### Jupiter V6 -- LUT #6 +[[test.validator.account]] +address = "BpQ5uMzQNWNgBCRNf6jffChhYMX5XVZuaoM4Rx16NCdf" +filename = "ts/tests/accounts/jupiter_v6/jupiter_v6_lut_6.json" + +### Jupiter V6 -- LUT #7 +[[test.validator.account]] +address = "55ir29U8MrZbGBV63XbbweEDXP9DSx7eNenc7hnTM81E" +filename = "ts/tests/accounts/jupiter_v6/jupiter_v6_lut_7.json" + +### Jupiter V6 -- LUT #8 +[[test.validator.account]] +address = "5ePPDZP3ZAic796eFUDyHGtyYvynyFbpJ8oqTy2ydxvy" +filename = "ts/tests/accounts/jupiter_v6/jupiter_v6_lut_8.json" ### Whirlpool Program [[test.genesis]] @@ -272,4 +312,250 @@ filename = "ts/tests/accounts/phoenix_v1/phoenix_wsol_custody.json" ### Phoenix V1 -- WSOL-USDC Market State [[test.validator.account]] address = "4DoNfFBfF7UokCC2FQzriy7yHK6DY6NVdYpuekQ5pRgg" -filename = "ts/tests/accounts/phoenix_v1/phoenix_wsol_usdc_market_state.json" \ No newline at end of file +filename = "ts/tests/accounts/phoenix_v1/phoenix_wsol_usdc_market_state.json" + + +### Accounts below are auto-generated to perform Token 2022 multi-route swap. These accounts should +### probably be reorganized based on which DEX they belong to. And there are other accounts loaded +### here that may be able to be removed (since the tests create them). + + +### Meteora DLMM Program +[[test.genesis]] +address = "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo" +program = "ts/tests/artifacts/mainnet_meteora_dlmm.so" + +### Crema Program +[[test.genesis]] +address = "CLMM9tUoggJu2wagPkkqs9eFG4BWhVBZWkP1qv3Sp7tR" +program = "ts/tests/artifacts/mainnet_crema.so" + +### FluxBeam Program +[[test.genesis]] +address = "FLUXubRmkEi2q6K3Y9kBPg9248ggaZVsoSFhtJHSrm1X" +program = "ts/tests/artifacts/mainnet_fluxbeam.so" + +### Raydium CLMM Program +[[test.genesis]] +address = "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK" +program = "ts/tests/artifacts/mainnet_raydium_clmm.so" + +### TODO +[[test.validator.account]] +address = "25s6jZQYe8RB8JpoCDq3i4u6cCNfCG1xicYK7E7f3v6L" +filename = "ts/tests/accounts/jupiter_v6/multi/25s6jZQYe8RB8JpoCDq3i4u6cCNfCG1xicYK7E7f3v6L.json" + +### TODO +[[test.validator.account]] +address = "2LizoD7noGRmTFszBRj3P2GzfARqdGwhpimQthWTGbhn" +filename = "ts/tests/accounts/jupiter_v6/multi/2LizoD7noGRmTFszBRj3P2GzfARqdGwhpimQthWTGbhn.json" + +### TODO +[[test.validator.account]] +address = "2UDdWW9TNeEJa2S539ijVLLeVZt88zuiduSYD7SeSeHN" +filename = "ts/tests/accounts/jupiter_v6/multi/2UDdWW9TNeEJa2S539ijVLLeVZt88zuiduSYD7SeSeHN.json" + +### TODO +[[test.validator.account]] +address = "2W7aa5mVuzJiaM43uFtutVFdSoWx963AKT8dtizqejTF" +filename = "ts/tests/accounts/jupiter_v6/multi/2W7aa5mVuzJiaM43uFtutVFdSoWx963AKT8dtizqejTF.json" + +### TODO +[[test.validator.account]] +address = "2qr4UqV7vdJ1TLLX2YGZ7fBJ9U96UwAFAjwLK572TJ4h" +filename = "ts/tests/accounts/jupiter_v6/multi/2qr4UqV7vdJ1TLLX2YGZ7fBJ9U96UwAFAjwLK572TJ4h.json" + +### TODO +[[test.validator.account]] +address = "39PUs23GXEdyRJ74fnSfL7L4tZgXVafirBMsbHqZyCVx" +filename = "ts/tests/accounts/jupiter_v6/multi/39PUs23GXEdyRJ74fnSfL7L4tZgXVafirBMsbHqZyCVx.json" + +### TODO +[[test.validator.account]] +address = "3GbtMs4cRP3Th3GhKcZk7sUkF3skxV8FdbiG8aKp7qeh" +filename = "ts/tests/accounts/jupiter_v6/multi/3GbtMs4cRP3Th3GhKcZk7sUkF3skxV8FdbiG8aKp7qeh.json" + +### TODO +[[test.validator.account]] +address = "3MsJXVvievxAbsMsaT6TS4i6oMitD9jazucuq3X234tC" +filename = "ts/tests/accounts/jupiter_v6/multi/3MsJXVvievxAbsMsaT6TS4i6oMitD9jazucuq3X234tC.json" + +### TODO +[[test.validator.account]] +address = "3nLYkE5zHKgGBxXW8Rj4neWZT5JHgdAjVRqUDcDk8nF9" +filename = "ts/tests/accounts/jupiter_v6/multi/3nLYkE5zHKgGBxXW8Rj4neWZT5JHgdAjVRqUDcDk8nF9.json" + +### TODO +[[test.validator.account]] +address = "42xVpYuCFbr4FWYoMwzUjDgoUGC4dzjaLhjR71CrAQpe" +filename = "ts/tests/accounts/jupiter_v6/multi/42xVpYuCFbr4FWYoMwzUjDgoUGC4dzjaLhjR71CrAQpe.json" + +### TODO +[[test.validator.account]] +address = "4h5Ye952uZqWBng69NpL1Ghxi9GaRa3t6vJpB7BZFLZZ" +filename = "ts/tests/accounts/jupiter_v6/multi/4h5Ye952uZqWBng69NpL1Ghxi9GaRa3t6vJpB7BZFLZZ.json" + +### TODO +[[test.validator.account]] +address = "5Y117zFfFjBUoxATVGBaULdbwQgmx5CZ9WvX9jC6YZxq" +filename = "ts/tests/accounts/jupiter_v6/multi/5Y117zFfFjBUoxATVGBaULdbwQgmx5CZ9WvX9jC6YZxq.json" + +### TODO +[[test.validator.account]] +address = "6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx" +filename = "ts/tests/accounts/jupiter_v6/multi/6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx.json" + +### TODO +[[test.validator.account]] +address = "6P4tvbzRY6Bh3MiWDHuLqyHywovsRwRpfskPvyeSoHsz" +filename = "ts/tests/accounts/jupiter_v6/multi/6P4tvbzRY6Bh3MiWDHuLqyHywovsRwRpfskPvyeSoHsz.json" + +### TODO +[[test.validator.account]] +address = "6mK4Pxs6GhwnessH7CvPivqDYauiHZmAdbEFDpXFk9zt" +filename = "ts/tests/accounts/jupiter_v6/multi/6mK4Pxs6GhwnessH7CvPivqDYauiHZmAdbEFDpXFk9zt.json" + +### TODO +[[test.validator.account]] +address = "85VBFQZC9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ" +filename = "ts/tests/accounts/jupiter_v6/multi/85VBFQZC9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ.json" + +### TODO +[[test.validator.account]] +address = "8M5rjeDQKW4w4rmWFQLTqCYVuA1rMe9Z2QQ2SZResD9M" +filename = "ts/tests/accounts/jupiter_v6/multi/8M5rjeDQKW4w4rmWFQLTqCYVuA1rMe9Z2QQ2SZResD9M.json" + +### TODO +[[test.validator.account]] +address = "8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj" +filename = "ts/tests/accounts/jupiter_v6/multi/8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj.json" + +### TODO +[[test.validator.account]] +address = "9iFER3bpjf1PTTCQCfTRu17EJgvsxo9pVyA9QWwEuX4x" +filename = "ts/tests/accounts/jupiter_v6/multi/9iFER3bpjf1PTTCQCfTRu17EJgvsxo9pVyA9QWwEuX4x.json" + +### TODO +[[test.validator.account]] +address = "9keEfR6WRzJ5AXN55RQ6RrM1dFYz6qzeAUH3i83eTHkM" +filename = "ts/tests/accounts/jupiter_v6/multi/9keEfR6WRzJ5AXN55RQ6RrM1dFYz6qzeAUH3i83eTHkM.json" + +### TODO +[[test.validator.account]] +address = "AMnF3iSQ2Z7yQRaKneUUwtdt9aF6kg6pxS2waqoJ57mX" +filename = "ts/tests/accounts/jupiter_v6/multi/AMnF3iSQ2Z7yQRaKneUUwtdt9aF6kg6pxS2waqoJ57mX.json" + +### TODO +[[test.validator.account]] +address = "AMxuPcXBd6XXAbuMZSp9cNqaVreDcAtn5xWgQtPwXap4" +filename = "ts/tests/accounts/jupiter_v6/multi/AMxuPcXBd6XXAbuMZSp9cNqaVreDcAtn5xWgQtPwXap4.json" + +### TODO +[[test.validator.account]] +address = "AxfosPGyrBuQGZ3bjE4Bgjk6tD29TNXcKxT4cq2vawo8" +filename = "ts/tests/accounts/jupiter_v6/multi/AxfosPGyrBuQGZ3bjE4Bgjk6tD29TNXcKxT4cq2vawo8.json" + +### TODO +[[test.validator.account]] +address = "BhA6Xc9TK1qqjpASjokZr5bQzcoMUhGFwCEnqFukYtCg" +filename = "ts/tests/accounts/jupiter_v6/multi/BhA6Xc9TK1qqjpASjokZr5bQzcoMUhGFwCEnqFukYtCg.json" + +### TODO +[[test.validator.account]] +address = "BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo" +filename = "ts/tests/accounts/jupiter_v6/multi/BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo.json" + +### TODO +[[test.validator.account]] +address = "CVvxB22CKc2o2RiHVnyhHQVAngtKzyGkQFB3UPqD4HdL" +filename = "ts/tests/accounts/jupiter_v6/multi/CVvxB22CKc2o2RiHVnyhHQVAngtKzyGkQFB3UPqD4HdL.json" + +### TODO +[[test.validator.account]] +address = "DCPM7ynTcsGbday27kM21MoQMVzWxEEUk4qZ65qKrwWb" +filename = "ts/tests/accounts/jupiter_v6/multi/DCPM7ynTcsGbday27kM21MoQMVzWxEEUk4qZ65qKrwWb.json" + +### TODO +[[test.validator.account]] +address = "DHqUM3nbZtvuv7tm4rcAbbWSMX99hnPQvEmDQ2EyGfg3" +filename = "ts/tests/accounts/jupiter_v6/multi/DHqUM3nbZtvuv7tm4rcAbbWSMX99hnPQvEmDQ2EyGfg3.json" + +### TODO +[[test.validator.account]] +address = "DNbwqtq4iKBmnjxGpjw6c1RHfukdeLSnq2LVTfQtAguL" +filename = "ts/tests/accounts/jupiter_v6/multi/DNbwqtq4iKBmnjxGpjw6c1RHfukdeLSnq2LVTfQtAguL.json" + +### TODO +[[test.validator.account]] +address = "DS4251KfVSStaRxMVZUxwbzE4AXhzxgMruZ5QM9QdEqJ" +filename = "ts/tests/accounts/jupiter_v6/multi/DS4251KfVSStaRxMVZUxwbzE4AXhzxgMruZ5QM9QdEqJ.json" + +### TODO +[[test.validator.account]] +address = "DoPuiZfJu7sypqwR4eiU7C5TMcmmiFoU4HaF5SoD8mRy" +filename = "ts/tests/accounts/jupiter_v6/multi/DoPuiZfJu7sypqwR4eiU7C5TMcmmiFoU4HaF5SoD8mRy.json" + +### TODO +[[test.validator.account]] +address = "EJcnUbFntxsjPB9yZBEjUxoFTtgwCLWU7LYGPuvXMpHS" +filename = "ts/tests/accounts/jupiter_v6/multi/EJcnUbFntxsjPB9yZBEjUxoFTtgwCLWU7LYGPuvXMpHS.json" + +### TODO +[[test.validator.account]] +address = "Ebbpz3PWLaQxj2oyK967RgEPbcPypjQCoZ3tpB4fwLsk" +filename = "ts/tests/accounts/jupiter_v6/multi/Ebbpz3PWLaQxj2oyK967RgEPbcPypjQCoZ3tpB4fwLsk.json" + +### TODO +[[test.validator.account]] +address = "FNdKRVxLgzEvRBvFqSJ687isQRDqNoAS4hPM7iyXQ9gf" +filename = "ts/tests/accounts/jupiter_v6/multi/FNdKRVxLgzEvRBvFqSJ687isQRDqNoAS4hPM7iyXQ9gf.json" + +### TODO +[[test.validator.account]] +address = "Ft1URsGGW7phzUQWwoDL3ijBuBAE46M2AiPguZKLXUWN" +filename = "ts/tests/accounts/jupiter_v6/multi/Ft1URsGGW7phzUQWwoDL3ijBuBAE46M2AiPguZKLXUWN.json" + +### TODO +[[test.validator.account]] +address = "FtSs1FxzHXYtC6jEoNuY1SzwK95jNfJkNYNk5Qo666Dj" +filename = "ts/tests/accounts/jupiter_v6/multi/FtSs1FxzHXYtC6jEoNuY1SzwK95jNfJkNYNk5Qo666Dj.json" + +### TODO +[[test.validator.account]] +address = "G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG" +filename = "ts/tests/accounts/jupiter_v6/multi/G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG.json" + +### TODO +[[test.validator.account]] +address = "GATnWZVf9m241QDCemXvEZqnrQFud8Af8dEqZMjHD39u" +filename = "ts/tests/accounts/jupiter_v6/multi/GATnWZVf9m241QDCemXvEZqnrQFud8Af8dEqZMjHD39u.json" + +### TODO +[[test.validator.account]] +address = "GMgh4NtWrGaUf1RR2kcXD7LY1jou1qFAuSsQeKp5ow4a" +filename = "ts/tests/accounts/jupiter_v6/multi/GMgh4NtWrGaUf1RR2kcXD7LY1jou1qFAuSsQeKp5ow4a.json" + +### TODO +[[test.validator.account]] +address = "H7TY41Z55YxsyAHLuFVRNJ4bnZKgnMTKuRoipPSwsHpD" +filename = "ts/tests/accounts/jupiter_v6/multi/H7TY41Z55YxsyAHLuFVRNJ4bnZKgnMTKuRoipPSwsHpD.json" + +### TODO +[[test.validator.account]] +address = "H7qgBfnKWHHpi4ixfTehtgSGDceS23rCG498zFeAEbDZ" +filename = "ts/tests/accounts/jupiter_v6/multi/H7qgBfnKWHHpi4ixfTehtgSGDceS23rCG498zFeAEbDZ.json" + +### TODO +[[test.validator.account]] +address = "JMMtEtcqujYTQDRxRhnb9jznun5kxbr1uu9JNu1ZeiL" +filename = "ts/tests/accounts/jupiter_v6/multi/JMMtEtcqujYTQDRxRhnb9jznun5kxbr1uu9JNu1ZeiL.json" + +### TODO +[[test.validator.account]] +address = "d64w2PJasfiHDT1kNJwYfeEQjwJzPKEwhP5WK13aGMb" +filename = "ts/tests/accounts/jupiter_v6/multi/d64w2PJasfiHDT1kNJwYfeEQjwJzPKEwhP5WK13aGMb.json" + +### TODO +[[test.validator.account]] +address = "gyjtxRhXvimx3tfQ8PYCQu6KobCtZjQoerq8a4HjfCh" +filename = "ts/tests/accounts/jupiter_v6/multi/gyjtxRhXvimx3tfQ8PYCQu6KobCtZjQoerq8a4HjfCh.json" \ No newline at end of file diff --git a/solana/Makefile b/solana/Makefile index 638f107d..d7cf8330 100644 --- a/solana/Makefile +++ b/solana/Makefile @@ -4,7 +4,11 @@ CLONED_PROGRAMS=\ ts/tests/artifacts/mainnet_cctp_message_transmitter.so \ ts/tests/artifacts/mainnet_jupiter_v6.so \ ts/tests/artifacts/mainnet_whirlpool.so \ - ts/tests/artifacts/mainnet_phoenix_v1.so + ts/tests/artifacts/mainnet_phoenix_v1.so \ + ts/tests/artifacts/mainnet_meteora_dlmm.so \ + ts/tests/artifacts/mainnet_crema.so \ + ts/tests/artifacts/mainnet_fluxbeam.so \ + ts/tests/artifacts/mainnet_raydium_clmm.so .PHONY: all all: check @@ -40,16 +44,11 @@ cargo-test: fast-transfer-sync .PHONY: anchor-test anchor-test: ../node_modules $(CLONED_PROGRAMS) -# Omitting since node_modules runs the same command -# ifndef SKIP_SUBMODULE_BUILD -# cd .. && $(MAKE) fast-transfer-setup -# endif anchor test -- --features integration-test .PHONY: anchor-build-idl anchor-build-idl: anchor build -- --features localnet -#git diff --exit-code .PHONY: cargo-test-all cargo-test-all: @@ -76,3 +75,15 @@ ts/tests/artifacts/mainnet_whirlpool.so: ts/tests/artifacts ts/tests/artifacts/mainnet_phoenix_v1.so: ts/tests/artifacts solana program dump -u m PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY ts/tests/artifacts/mainnet_phoenix_v1.so + +ts/tests/artifacts/mainnet_meteora_dlmm.so: ts/tests/artifacts + solana program dump -u m LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo ts/tests/artifacts/mainnet_meteora_dlmm.so + +ts/tests/artifacts/mainnet_crema.so: ts/tests/artifacts + solana program dump -u m CLMM9tUoggJu2wagPkkqs9eFG4BWhVBZWkP1qv3Sp7tR ts/tests/artifacts/mainnet_crema.so + +ts/tests/artifacts/mainnet_fluxbeam.so: ts/tests/artifacts + solana program dump -u m FLUXubRmkEi2q6K3Y9kBPg9248ggaZVsoSFhtJHSrm1X ts/tests/artifacts/mainnet_fluxbeam.so + +ts/tests/artifacts/mainnet_raydium_clmm.so: ts/tests/artifacts + solana program dump -u m CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK ts/tests/artifacts/mainnet_raydium_clmm.so \ No newline at end of file diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs index fa0d3068..8f13a45c 100644 --- a/solana/programs/swap-layer/src/composite/mod.rs +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -246,7 +246,10 @@ impl<'info> ConsumeSwapLayerFill<'info> { /// NOTE: The recipient must be equal to the payer if OutputToken::Usdc! This check is not /// performed here, but should be performed with the account context composing with this /// composite. - pub fn is_valid_output_swap(&self, dst_mint: &AccountInfo) -> Result { + pub fn is_valid_output_swap( + &self, + dst_mint: &InterfaceAccount<'info, token_interface::Mint>, + ) -> Result { let swap_msg = self.read_message_unchecked(); let (expected_dst_mint, swap) = match swap_msg.output_token { @@ -347,12 +350,20 @@ pub struct CompleteSwap<'info> { )] pub dst_swap_token: Box>, + /// CHECK: In case the exact in swap does not use all tokens, we send residual back to this + /// token account. + #[account( + mut, + address = consume_swap_layer_fill.custodian.fee_recipient_token, + )] + pub fee_recipient_token: UncheckedAccount<'info>, + /// This account must be verified as the source mint for the swap. pub usdc: Usdc<'info>, /// CHECK: This account must be verified as the destination mint for the swap. #[account(constraint = usdc.key() != dst_mint.key() @ SwapLayerError::SameMint)] - pub dst_mint: UncheckedAccount<'info>, + pub dst_mint: Box>, pub token_program: Program<'info, token::Token>, pub dst_token_program: Interface<'info, token_interface::TokenInterface>, @@ -363,20 +374,17 @@ pub struct CompleteSwap<'info> { pub struct HandleCompleteSwap<'ctx, 'info> { pub payer: &'ctx Signer<'info>, pub consume_swap_layer_fill: &'ctx ConsumeSwapLayerFill<'info>, - pub authority: &'ctx AccountInfo<'info>, + pub swap_authority: &'ctx AccountInfo<'info>, pub src_swap_token: &'ctx Account<'info, token::TokenAccount>, pub dst_swap_token: &'ctx InterfaceAccount<'info, token_interface::TokenAccount>, - pub dst_mint: &'ctx UncheckedAccount<'info>, + pub fee_recipient_token: &'ctx UncheckedAccount<'info>, + pub dst_mint: &'ctx InterfaceAccount<'info, token_interface::Mint>, pub token_program: &'ctx Program<'info, token::Token>, pub dst_token_program: &'ctx Interface<'info, token_interface::TokenInterface>, pub system_program: &'ctx Program<'info, System>, } impl<'info> CompleteSwap<'info> { - pub fn custodian(&self) -> &CheckedCustodian<'info> { - &self.consume_swap_layer_fill.custodian - } - pub fn consume_prepared_fill(&mut self) -> Result { self.consume_swap_layer_fill .consume_prepared_fill(self.src_swap_token.as_ref().as_ref(), &self.token_program) @@ -409,6 +417,7 @@ pub(crate) fn complete_swap_jup_v6<'info>( authority, src_swap_token, dst_swap_token, + fee_recipient_token, dst_mint, token_program, dst_token_program, @@ -420,9 +429,10 @@ pub(crate) fn complete_swap_jup_v6<'info>( HandleCompleteSwap { payer, consume_swap_layer_fill, - authority, + swap_authority: authority, src_swap_token, dst_swap_token, + fee_recipient_token, dst_mint, token_program, dst_token_program, @@ -460,13 +470,28 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( recipient: Option>, gas_dropoff: Option, ) -> Result<()> { + let HandleCompleteSwap { + payer, + consume_swap_layer_fill, + swap_authority, + src_swap_token, + dst_swap_token, + fee_recipient_token, + dst_mint, + token_program, + dst_token_program, + system_program, + } = accounts; + let SwapMessageV1 { recipient: expected_recipient, output_token, redeem_mode: _, } = swap_message; - let recipient_key = recipient.as_ref().map(|accounts| accounts.recipient.key()); + let recipient_key = recipient + .as_ref() + .map(|accts: &RecipientAccounts<'ctx, 'info>| accts.recipient.key()); if let Some(recipient_key) = recipient_key { require_keys_eq!( recipient_key, @@ -480,11 +505,7 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( Some(recipient_key) => { // In this case, we require that the signer of the instruction (the payer) is the // recipient himself. - require_keys_eq!( - accounts.payer.key(), - recipient_key, - SwapLayerError::InvalidRecipient - ); + require_keys_eq!(payer.key(), recipient_key, SwapLayerError::InvalidRecipient); (Default::default(), Default::default()) } @@ -510,16 +531,14 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( _ => return err!(SwapLayerError::InvalidOutputToken), }; - let swap_authority = accounts.authority; - - let prepared_fill_key = accounts.consume_swap_layer_fill.prepared_fill_key(); + let prepared_fill_key = consume_swap_layer_fill.prepared_fill_key(); let swap_authority_seeds = &[ swap_authority_seed_prefix, prepared_fill_key.as_ref(), &[swap_authority_bump_seed], ]; - let (shared_accounts_route, mut swap_args, cpi_remaining_accounts) = + let (shared_accounts_route, mut swap_args, first_dex_program_id) = JupiterV6SharedAccountsRoute::set_up(remaining_accounts, &ix_data[..])?; // Verify remaining accounts. @@ -531,12 +550,12 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( ); require_keys_eq!( shared_accounts_route.src_custody_token.key(), - accounts.src_swap_token.key(), + src_swap_token.key(), SwapLayerError::InvalidSourceSwapToken ); require_keys_eq!( shared_accounts_route.dst_custody_token.key(), - accounts.dst_swap_token.key(), + dst_swap_token.key(), SwapLayerError::InvalidDestinationSwapToken ); require_keys_eq!( @@ -546,7 +565,7 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( ); require_keys_eq!( shared_accounts_route.dst_mint.key(), - accounts.dst_mint.key(), + dst_mint.key(), SwapLayerError::InvalidDestinationMint ); } @@ -576,7 +595,7 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( SwapLayerError::NotJupiterV6DirectRoute ); require_keys_eq!( - cpi_remaining_accounts[0].key(), + first_dex_program_id, Pubkey::from(dex_program_id), SwapLayerError::JupiterV6DexProgramMismatch ); @@ -597,21 +616,37 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( }; // Execute swap. - let amount_out = shared_accounts_route.swap_exact_in( + let (amount_out, usdc_dust) = shared_accounts_route.swap_exact_in( swap_args, swap_authority_seeds, - cpi_remaining_accounts, + remaining_accounts, limit_amount, )?; - let payer = accounts.payer; + // Transfer residual to the fee recipient token if there is any. + if usdc_dust > 0 { + msg!("USDC dust: {}", usdc_dust); + + token::transfer( + CpiContext::new_with_signer( + token_program.to_account_info(), + token::Transfer { + from: src_swap_token.to_account_info(), + to: fee_recipient_token.to_account_info(), + authority: swap_authority.to_account_info(), + }, + &[swap_authority_seeds], + ), + usdc_dust, + )?; + } token::close_account(CpiContext::new_with_signer( - accounts.token_program.to_account_info(), + token_program.to_account_info(), token::CloseAccount { - account: accounts.src_swap_token.to_account_info(), + account: src_swap_token.to_account_info(), destination: payer.to_account_info(), - authority: accounts.authority.to_account_info(), + authority: swap_authority.to_account_info(), }, &[swap_authority_seeds], ))?; @@ -626,11 +661,11 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( // NOTE: If the output token is gas, lamports reflecting the WSOL amount will be transferred to // the recipient's account. We first close and send all lamports to the payer. token_interface::close_account(CpiContext::new_with_signer( - accounts.dst_token_program.to_account_info(), + dst_token_program.to_account_info(), token_interface::CloseAccount { - account: accounts.dst_swap_token.to_account_info(), + account: dst_swap_token.to_account_info(), destination: payer.to_account_info(), - authority: accounts.authority.to_account_info(), + authority: swap_authority.to_account_info(), }, &[swap_authority_seeds], ))?; @@ -638,7 +673,7 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( // Then transfer amount_out to recipient. system_program::transfer( CpiContext::new( - accounts.system_program.to_account_info(), + system_program.to_account_info(), system_program::Transfer { from: payer.to_account_info(), to: recipient.to_account_info(), @@ -653,8 +688,10 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( // accounts, so anyone can set the authority of an ATA to be someone else. { let recipient_token_owner = - token::TokenAccount::try_deserialize(&mut &recipient_token.data.borrow()[..]) - .map(|token| token.owner)?; + token_interface::TokenAccount::try_deserialize_unchecked( + &mut &recipient_token.data.borrow()[..], + ) + .map(|token| token.owner)?; require_keys_eq!( recipient_token_owner, recipient.key(), @@ -663,26 +700,28 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( } // Transfer destination tokens to recipient. - token::transfer( + token_interface::transfer_checked( CpiContext::new_with_signer( - accounts.token_program.to_account_info(), - token::Transfer { - from: accounts.dst_swap_token.to_account_info(), + dst_token_program.to_account_info(), + token_interface::TransferChecked { + from: dst_swap_token.to_account_info(), to: recipient_token.to_account_info(), authority: swap_authority.to_account_info(), + mint: dst_mint.to_account_info(), }, &[swap_authority_seeds], ), amount_out, + dst_mint.decimals, )?; // Close the destination swap token account. token_interface::close_account(CpiContext::new_with_signer( - accounts.dst_token_program.to_account_info(), + dst_token_program.to_account_info(), token_interface::CloseAccount { - account: accounts.dst_swap_token.to_account_info(), + account: dst_swap_token.to_account_info(), destination: payer.to_account_info(), - authority: accounts.authority.to_account_info(), + authority: swap_authority.to_account_info(), }, &[swap_authority_seeds], ))?; @@ -691,7 +730,7 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( match gas_dropoff { Some(gas_dropoff) if gas_dropoff > 0 => system_program::transfer( CpiContext::new( - accounts.system_program.to_account_info(), + system_program.to_account_info(), system_program::Transfer { from: payer.to_account_info(), to: recipient.to_account_info(), @@ -749,19 +788,19 @@ pub struct JupiterV6SharedAccountsRoute<'info> { #[account(mut)] pub src_custody_token: UncheckedAccount<'info>, + /// NOTE: This account may either be the swap authority's or Jupiter's authority's. #[account( mut, - associated_token::mint = src_mint, - associated_token::authority = jupiter_v6_authority, + token::mint = src_mint )] - pub jupiter_v6_src_custody_token: Box>, + pub jupiter_v6_src_custody_token: Box>, + /// NOTE: This account may either be the swap authority's or Jupiter's authority's. #[account( mut, - associated_token::mint = dst_mint, - associated_token::authority = jupiter_v6_authority, + token::mint = dst_mint )] - pub jupiter_v6_dst_custody_token: Box>, + pub jupiter_v6_dst_custody_token: Box>, /// CHECK: This account will be the Swap Layer's destination token account. #[account(mut)] @@ -779,6 +818,12 @@ pub struct JupiterV6SharedAccountsRoute<'info> { pub platform_fee_none: UncheckedAccount<'info>, /// CHECK: Token 2022 program is optional. + #[account( + constraint = { + token_2022_program.key() == jupiter_v6::JUPITER_V6_PROGRAM_ID + || token_2022_program.key() == anchor_spl::token_2022::ID + } + )] pub token_2022_program: UncheckedAccount<'info>, /// CHECK: Seeds must be \["__event_authority"\] (Jupiter V6 Program). @@ -793,7 +838,7 @@ impl<'info> JupiterV6SharedAccountsRoute<'info> { pub fn set_up( mut cpi_account_infos: &'info [AccountInfo<'info>], ix_data: &[u8], - ) -> Result<(Self, SharedAccountsRouteArgs, Vec>)> { + ) -> Result<(Self, SharedAccountsRouteArgs, Pubkey)> { // Deserialize Jupiter V6 shared accounts route args. let args = AnchorInstructionData::deserialize_checked(ix_data)?; @@ -808,44 +853,42 @@ impl<'info> JupiterV6SharedAccountsRoute<'info> { &mut Default::default(), )?; - Ok((accounts, args, cpi_account_infos.to_vec())) + Ok((accounts, args, cpi_account_infos[0].key())) } pub fn swap_exact_in( &self, args: SharedAccountsRouteArgs, signer_seeds: &[&[u8]], - cpi_remaining_accounts: Vec>, + account_infos: &'info [AccountInfo<'info>], limit_amount: Option, - ) -> Result { + ) -> Result<(u64, u64)> { let limit_amount = limit_amount.unwrap_or(utils::jupiter_v6::compute_min_amount_out(&args)); - jupiter_v6::cpi::shared_accounts_route( - CpiContext::new_with_signer( - self.jupiter_v6_program.to_account_info(), - jupiter_v6::cpi::SharedAccountsRoute { - token_program: self.token_program.to_account_info(), - program_authority: self.jupiter_v6_authority.to_account_info(), - user_transfer_authority: self.transfer_authority.to_account_info(), - source_token: self.src_custody_token.to_account_info(), - program_source_token: self.jupiter_v6_src_custody_token.to_account_info(), - program_destination_token: self.jupiter_v6_dst_custody_token.to_account_info(), - destination_account: self.dst_custody_token.to_account_info(), - source_mint: self.src_mint.to_account_info(), - destination_mint: self.dst_mint.to_account_info(), - platform_fee: Default::default(), - token_2022_program: self.token_2022_program.to_account_info().into(), - event_authority: self.jupiter_v6_event_authority.to_account_info(), - program: self.jupiter_v6_program.to_account_info(), - }, - &[signer_seeds], - ) - .with_remaining_accounts(cpi_remaining_accounts), - args, + let mut accounts = account_infos + .iter() + .map(|acc| match acc.is_writable { + false => AccountMeta::new_readonly(*acc.key, acc.is_signer), + true => AccountMeta::new(*acc.key, acc.is_signer), + }) + .collect::>(); + accounts[2].is_signer = true; + + solana_program::program::invoke_signed( + &solana_program::instruction::Instruction { + program_id: jupiter_v6::JUPITER_V6_PROGRAM_ID, + accounts, + data: (jupiter_v6::SHARED_ACCOUNTS_ROUTE_SELECTOR, args) + .try_to_vec() + .unwrap(), + }, + account_infos, + &[signer_seeds], )?; - // After the swap, we reload the destination token account to get the correct amount. - let amount_out = token::TokenAccount::try_deserialize_unchecked( + // After the swap, we reload the both token accounts to find any residual in the source + // token account and the swap result in the destination token account. + let amount_out = token_interface::TokenAccount::try_deserialize_unchecked( &mut &self.dst_custody_token.data.borrow()[..], ) .map(|token| token.amount)?; @@ -854,6 +897,12 @@ impl<'info> JupiterV6SharedAccountsRoute<'info> { // amounts if the limit amount is not met. require_gte!(amount_out, limit_amount, SwapLayerError::SwapFailed); - Ok(amount_out) + Ok(( + amount_out, + token_interface::TokenAccount::try_deserialize_unchecked( + &mut &self.src_custody_token.data.borrow()[..], + ) + .map(|token| token.amount)?, + )) } } diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs index 5e52da75..98a1e863 100644 --- a/solana/programs/swap-layer/src/error.rs +++ b/solana/programs/swap-layer/src/error.rs @@ -54,6 +54,8 @@ pub enum SwapLayerError { InvalidLimitAmount = 0x302, InvalidSwapType = 0x304, AmountOutTooSmall = 0x306, + InvalidSourceResidual = 0x308, + SourceResidualMismatch = 0x30a, // Jupiter V6 #[msg("Jupiter V6 Authority ID must be >= 0 and < 8")] diff --git a/solana/programs/swap-layer/src/processor/complete/swap/direct.rs b/solana/programs/swap-layer/src/processor/complete/swap/direct.rs index 876d54f0..e467f836 100644 --- a/solana/programs/swap-layer/src/processor/complete/swap/direct.rs +++ b/solana/programs/swap-layer/src/processor/complete/swap/direct.rs @@ -9,9 +9,10 @@ pub struct CompleteSwapDirect<'info> { #[account( mut, - address = associated_token::get_associated_token_address( + address = associated_token::get_associated_token_address_with_program_id( &recipient.key(), - &complete_swap.dst_mint.key() + &complete_swap.dst_mint.key(), + &complete_swap.dst_token_program.key() ) )] /// Recipient associated token account. The recipient authority check is necessary to ensure diff --git a/solana/programs/swap-layer/src/processor/complete/swap/payload.rs b/solana/programs/swap-layer/src/processor/complete/swap/payload.rs index ddf13caf..f3fad41e 100644 --- a/solana/programs/swap-layer/src/processor/complete/swap/payload.rs +++ b/solana/programs/swap-layer/src/processor/complete/swap/payload.rs @@ -55,12 +55,20 @@ pub struct CompleteSwapPayload<'info> { )] dst_swap_token: Box>, + /// CHECK: In case the exact in swap does not use all tokens, we send residual back to this + /// token account. + #[account( + mut, + address = consume_swap_layer_fill.custodian.fee_recipient_token, + )] + fee_recipient_token: UncheckedAccount<'info>, + /// This account must be verified as the source mint for the swap. usdc: Usdc<'info>, /// CHECK: This account must be verified as the destination mint for the swap. #[account(constraint = usdc.key() != dst_mint.key() @ SwapLayerError::SameMint)] - dst_mint: UncheckedAccount<'info>, + dst_mint: Box>, token_program: Program<'info, token::Token>, dst_token_program: Interface<'info, token_interface::TokenInterface>, @@ -114,9 +122,10 @@ where HandleCompleteSwap { payer: &ctx.accounts.payer, consume_swap_layer_fill: &ctx.accounts.consume_swap_layer_fill, - authority: ctx.accounts.staged_inbound.as_ref().as_ref(), + swap_authority: ctx.accounts.staged_inbound.as_ref().as_ref(), src_swap_token: &ctx.accounts.src_swap_token, dst_swap_token: &ctx.accounts.dst_swap_token, + fee_recipient_token: &ctx.accounts.fee_recipient_token, dst_mint: &ctx.accounts.dst_mint, token_program: &ctx.accounts.token_program, system_program: &ctx.accounts.system_program, diff --git a/solana/programs/swap-layer/src/processor/complete/swap/relay.rs b/solana/programs/swap-layer/src/processor/complete/swap/relay.rs index 442db579..ac8716bb 100644 --- a/solana/programs/swap-layer/src/processor/complete/swap/relay.rs +++ b/solana/programs/swap-layer/src/processor/complete/swap/relay.rs @@ -1,7 +1,7 @@ use crate::utils::gas_dropoff; use crate::{composite::*, error::SwapLayerError}; use anchor_lang::prelude::*; -use anchor_spl::{associated_token, token}; +use anchor_spl::associated_token; use swap_layer_messages::{messages::SwapMessageV1, types::RedeemMode}; #[derive(Accounts)] @@ -10,9 +10,10 @@ pub struct CompleteSwapRelay<'info> { #[account( mut, - address = associated_token::get_associated_token_address( + address = associated_token::get_associated_token_address_with_program_id( &recipient.key(), - &complete_swap.dst_mint.key() + &complete_swap.dst_mint.key(), + &complete_swap.dst_token_program.key() ) )] /// Recipient associated token account. The recipient authority check is necessary to ensure @@ -28,12 +29,6 @@ pub struct CompleteSwapRelay<'info> { /// account must be encoded in the prepared fill. #[account(mut)] recipient: UncheckedAccount<'info>, - - #[account( - mut, - address = complete_swap.custodian().fee_recipient_token, - )] - fee_recipient_token: Account<'info, token::TokenAccount>, } pub fn complete_swap_relay<'a, 'b, 'c, 'info>( @@ -78,25 +73,6 @@ where // Handle the relayer fee and gas dropoff. Override the relaying fee to zero // if the payer is the recipient (self redemption). let (in_amount, gas_dropoff) = if payer.key() != recipient.key() { - // Transfer eligible USDC to the fee recipient. - if relaying_fee > 0 { - anchor_spl::token::transfer( - CpiContext::new_with_signer( - ctx.accounts.complete_swap.token_program.to_account_info(), - anchor_spl::token::Transfer { - from: ctx.accounts.complete_swap.src_swap_token.to_account_info(), - to: ctx.accounts.fee_recipient_token.to_account_info(), - authority: ctx.accounts.complete_swap.authority.to_account_info(), - }, - &[&[ - crate::SWAP_AUTHORITY_SEED_PREFIX, - ctx.accounts.complete_swap.prepared_fill_key().as_ref(), - &[ctx.bumps.complete_swap.authority], - ]], - ), - relaying_fee, - )?; - } ( fill_amount .checked_sub(relaying_fee) diff --git a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs index c6d4efa6..05386b9c 100644 --- a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs +++ b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs @@ -26,40 +26,30 @@ pub struct InitiateSwapExactIn<'info> { /// Staging for outbound transfer. This account has all of the instructions needed to initiate /// the transfer. /// - /// This account will be closed by the end of the instruction. - #[account( - mut, - close = prepared_by, - )] + /// This account may be closed by the end of the instruction if there is no dust after the swap. + #[account(mut)] staged_outbound: Account<'info, StagedOutbound>, - /// This custody token account will be closed by the end of the instruction. + /// This custody token account may be closed by the end of the instruction if there is no dust + /// after the swap. #[account( mut, + token::mint = src_mint, + token::authority = target_peer, + token::token_program = src_token_program, seeds = [ crate::STAGED_CUSTODY_TOKEN_SEED_PREFIX, staged_outbound.key().as_ref(), ], bump = staged_outbound.info.custody_token_bump, )] - staged_custody_token: Box>, + staged_custody_token: Box>, /// CHECK: This account must equal the usdc refund token encoded in the staged outbound account. #[account(address = staged_outbound.usdc_refund_token)] usdc_refund_token: UncheckedAccount<'info>, /// Peer used to determine whether assets are sent to a valid destination. - #[account( - constraint = { - require_eq!( - staged_outbound.info.target_chain, - target_peer.seeds.chain, - SwapLayerError::InvalidTargetChain, - ); - - true - } - )] target_peer: RegisteredPeer<'info>, /// CHECK: Mutable, seeds must be \["prepared-order", staged_outbound.key()\] @@ -105,7 +95,6 @@ pub struct InitiateSwapExactIn<'info> { dst_swap_token: Box>, /// This account must be verified as the source mint for the swap. - #[account(address = staged_custody_token.mint)] src_mint: Box>, /// This account must be verified as the destination mint for the swap. @@ -159,17 +148,7 @@ where src_mint.decimals, )?; - token_interface::close_account(CpiContext::new_with_signer( - src_token_program.to_account_info(), - token_interface::CloseAccount { - account: custody_token.to_account_info(), - destination: ctx.accounts.prepared_by.to_account_info(), - authority: peer.to_account_info(), - }, - &[peer_signer_seeds], - ))?; - - let (shared_accounts_route, swap_args, cpi_remaining_accounts) = + let (shared_accounts_route, swap_args, _) = JupiterV6SharedAccountsRoute::set_up(ctx.remaining_accounts, &instruction_data[..])?; let swap_authority = &ctx.accounts.swap_authority; @@ -215,11 +194,11 @@ where &[ctx.bumps.swap_authority], ]; - // Execute swap. - let usdc_amount_out = shared_accounts_route.swap_exact_in( + // Execute swap. Keep in mind that exact in is not really exact in... so there may be residual. + let (usdc_amount_out, src_dust) = shared_accounts_route.swap_exact_in( swap_args, swap_authority_seeds, - cpi_remaining_accounts, + ctx.remaining_accounts, Default::default(), )?; @@ -237,17 +216,7 @@ where } let payer = &ctx.accounts.payer; - - // Close the source swap token account. - token_interface::close_account(CpiContext::new_with_signer( - src_token_program.to_account_info(), - token_interface::CloseAccount { - account: ctx.accounts.src_swap_token.to_account_info(), - destination: payer.to_account_info(), - authority: swap_authority.to_account_info(), - }, - &[swap_authority_seeds], - ))?; + let src_swap_token = &ctx.accounts.src_swap_token; let token_program = &ctx.accounts.token_program; let dst_swap_token = &ctx.accounts.dst_swap_token; @@ -305,7 +274,7 @@ where }, )?; - // Finally close the destination swap token account. + // Close the destination swap token account. token::close_account(CpiContext::new_with_signer( token_program.to_account_info(), token::CloseAccount { @@ -314,5 +283,60 @@ where authority: swap_authority.to_account_info(), }, &[swap_authority_seeds], - )) + ))?; + + // If there is residual, we keep the staged accounts open. + if src_dust > 0 { + msg!("Staged dust: {}", src_dust); + + // Transfer dust back to the custody token. + token_interface::transfer_checked( + CpiContext::new_with_signer( + src_token_program.to_account_info(), + token_interface::TransferChecked { + from: src_swap_token.to_account_info(), + to: custody_token.to_account_info(), + authority: swap_authority.to_account_info(), + mint: src_mint.to_account_info(), + }, + &[swap_authority_seeds], + ), + src_dust, + src_mint.decimals, + )?; + } + + // Close the source swap token account. + token_interface::close_account(CpiContext::new_with_signer( + src_token_program.to_account_info(), + token_interface::CloseAccount { + account: src_swap_token.to_account_info(), + destination: payer.to_account_info(), + authority: swap_authority.to_account_info(), + }, + &[swap_authority_seeds], + ))?; + + if src_dust == 0 { + let prepared_by = &ctx.accounts.prepared_by; + + // Close the custody token account. + token_interface::close_account(CpiContext::new_with_signer( + src_token_program.to_account_info(), + token_interface::CloseAccount { + account: custody_token.to_account_info(), + destination: prepared_by.to_account_info(), + authority: peer.to_account_info(), + }, + &[peer_signer_seeds], + ))?; + + // Close the staged outbound account. + ctx.accounts + .staged_outbound + .close(prepared_by.to_account_info())?; + } + + // Done. + Ok(()) } diff --git a/solana/programs/swap-layer/src/processor/mod.rs b/solana/programs/swap-layer/src/processor/mod.rs index f2be950e..3bcfcfdd 100644 --- a/solana/programs/swap-layer/src/processor/mod.rs +++ b/solana/programs/swap-layer/src/processor/mod.rs @@ -1,6 +1,9 @@ mod admin; pub use admin::*; +mod close_staged_outbound; +pub use close_staged_outbound::*; + mod complete; pub use complete::*; @@ -12,6 +15,3 @@ pub use release_inbound::*; mod stage_outbound; pub use stage_outbound::*; - -mod close_staged_outbound; -pub use close_staged_outbound::*; diff --git a/solana/programs/swap-layer/src/processor/stage_outbound.rs b/solana/programs/swap-layer/src/processor/stage_outbound.rs index 4e85c4d9..d748ce79 100644 --- a/solana/programs/swap-layer/src/processor/stage_outbound.rs +++ b/solana/programs/swap-layer/src/processor/stage_outbound.rs @@ -146,6 +146,8 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R }); let output_token = OutputToken::read(&mut &encoded_output_token[..]).unwrap(); + let is_usdc = ctx.accounts.src_mint.key() == common::USDC_MINT; + // We need to determine the relayer fee. This fee will either be paid for right now if // StagedInput::Usdc or will be deducted from the USDC after a resulting swap from the source // mint. @@ -171,7 +173,7 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R ); ( - if ctx.accounts.src_mint.key() == common::USDC_MINT { + if is_usdc { relaying_fee .checked_add(amount_in) .ok_or(SwapLayerError::U64Overflow)? @@ -192,8 +194,9 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R let src_token_program = &ctx.accounts.src_token_program; let custody_token = &ctx.accounts.staged_custody_token; let src_mint = &ctx.accounts.src_mint; + let sender_token = ctx.accounts.sender_token.as_ref(); - let sender = match &ctx.accounts.sender_token { + let sender = match sender_token { Some(sender_token) => match ( &ctx.accounts.sender, &ctx.accounts.program_transfer_authority, diff --git a/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs b/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs index 2f5f3d0a..f292f82a 100644 --- a/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs +++ b/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs @@ -4,6 +4,8 @@ use anchor_lang::prelude::*; pub const SHARED_ACCOUNTS_ROUTE_SELECTOR: AnchorSelector = AnchorSelector([193, 32, 155, 51, 65, 214, 156, 129]); +/// NOTE: Currently performing CPI using a CpiContext uses an excessive amount of heap memory. So +/// this will stay just in case CPI calls via Anchor become more memory efficient. pub struct SharedAccountsRoute<'info> { pub token_program: AccountInfo<'info>, pub program_authority: AccountInfo<'info>, @@ -97,15 +99,3 @@ impl AnchorInstructionData for SharedAccountsRouteArgs { Ok(()) } } - -/// NOTE: This requires remaining accounts, which are the accounts required to -/// perform swap routes. -pub fn shared_accounts_route<'info>( - ctx: CpiContext<'_, '_, '_, 'info, SharedAccountsRoute<'info>>, - args: SharedAccountsRouteArgs, -) -> Result<()> { - wormhole_solana_utils::cpi::invoke_data_with_context( - (SHARED_ACCOUNTS_ROUTE_SELECTOR, args), - ctx, - ) -} diff --git a/solana/ts/scripts/collectedToAnchorToml.ts b/solana/ts/scripts/collectedToAnchorToml.ts new file mode 100644 index 00000000..6a2b26c1 --- /dev/null +++ b/solana/ts/scripts/collectedToAnchorToml.ts @@ -0,0 +1,14 @@ +import * as fs from "fs"; + +main(); + +async function main() { + fs.readdirSync("collected").forEach((fn) => { + const address = fn.slice(0, -5); + console.log(` +### TODO +[[test.validator.account]] +address = "${address}" +filename = "collected/${address}.json"`); + }); +} diff --git a/solana/ts/scripts/testJupV6QuoteFlipMulti.ts b/solana/ts/scripts/testJupV6QuoteFlipMulti.ts new file mode 100644 index 00000000..6b5e6771 --- /dev/null +++ b/solana/ts/scripts/testJupV6QuoteFlipMulti.ts @@ -0,0 +1,134 @@ +import { createJupiterApiClient } from "@jup-ag/api"; +import { Connection, Keypair, PublicKey, TransactionInstruction } from "@solana/web3.js"; +import { execSync } from "child_process"; +import { argv } from "process"; + +const USDC_MINT_ADDRESS = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); + +const visitedKeys = new Set(); + +main(argv); + +async function main(argv: string[]) { + const connection = new Connection("https://api.mainnet-beta.solana.com"); + + const price = 0.0045; + const slippageBps = 500; + + const jupiter = createJupiterApiClient({ + basePath: "https://quote-api.jup.ag/v6", + }); + + const inputMint = new PublicKey("CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo"); + const outputMint = USDC_MINT_ADDRESS; + + const swapLayerProgramId = new PublicKey("SwapLayer1111111111111111111111111111111111"); + const preparedFill = Keypair.generate().publicKey; + const [swapAuthority] = PublicKey.findProgramAddressSync( + [Buffer.from("swap-authority"), preparedFill.toBuffer()], + swapLayerProgramId, + ); + console.log("swapAuthority", swapAuthority.toString()); + + { + const quoteResponse = await jupiter.quoteGet({ + inputMint: inputMint.toString(), + outputMint: outputMint.toString(), + amount: 1_000 * Math.floor(100_000 / price), + slippageBps, + // onlyDirectRoutes: true, + restrictIntermediateTokens: true, + swapMode: "ExactIn", + excludeDexes: ["Whirlpool", "Phoenix"], + // dexes: ALLOWED_DEXES, + }); + console.log( + "XYZ -> USDC, quoteResponse out amounts", + quoteResponse.outAmount, + quoteResponse.otherAmountThreshold, + ); + + const ixResponse = await jupiter.swapInstructionsPost({ + swapRequest: { + userPublicKey: swapAuthority.toString(), + quoteResponse, + }, + }); + console.log("ixResponse", JSON.stringify(ixResponse.swapInstruction, null, 2)); + console.log("luts", ixResponse.addressLookupTableAddresses); + for (let i = 13; i < ixResponse.swapInstruction.accounts.length; i++) { + await getAccount(connection, ixResponse.swapInstruction.accounts[i].pubkey); + } + } + + { + const quoteResponse = await jupiter.quoteGet({ + inputMint: outputMint.toString(), + outputMint: inputMint.toString(), + amount: 1_000, + slippageBps, + // onlyDirectRoutes: true, + restrictIntermediateTokens: true, + swapMode: "ExactIn", + // dexes: ALLOWED_DEXES, + }); + console.log( + "USDC -> XYZ, quoteResponse out amounts", + quoteResponse.outAmount, + quoteResponse.otherAmountThreshold, + ); + + const ixResponse = await jupiter.swapInstructionsPost({ + swapRequest: { + userPublicKey: swapAuthority.toString(), + quoteResponse, + }, + }); + console.log("ixResponse", JSON.stringify(ixResponse.swapInstruction, null, 2)); + console.log("luts", ixResponse.addressLookupTableAddresses); + for (let i = 13; i < ixResponse.swapInstruction.accounts.length; i++) { + await getAccount(connection, ixResponse.swapInstruction.accounts[i].pubkey); + } + } +} + +function deserializeInstruction(instruction: any) { + return new TransactionInstruction({ + programId: new PublicKey(instruction.programId), + keys: instruction.accounts.map((key: any) => ({ + pubkey: new PublicKey(key.pubkey), + isSigner: key.isSigner, + isWritable: key.isWritable, + })), + data: Buffer.from(instruction.data, "base64"), + }); +} + +async function getAccount(connection: Connection, account: string) { + if (visitedKeys.has(account)) { + return; + } + + visitedKeys.add(account); + + // sleep for 4 seconds + await new Promise((resolve) => setTimeout(resolve, 4000)); + + const accInfo = await connection.getAccountInfo(new PublicKey(account), { + commitment: "confirmed", + dataSlice: { offset: 0, length: 8 }, + }); + + if (accInfo === null || accInfo.executable) { + console.log("skipping", account); + return; + } + + const cmd = `solana account -u m -o collected/${account}.json --output json ${account}`; + console.log(cmd); + try { + execSync(cmd); + } catch (_) { + console.log("uh oh, failed"); + } +} diff --git a/solana/ts/src/jupiterV6/index.ts b/solana/ts/src/jupiterV6/index.ts index 9b3def2b..99cdc3db 100644 --- a/solana/ts/src/jupiterV6/index.ts +++ b/solana/ts/src/jupiterV6/index.ts @@ -35,6 +35,8 @@ export type ModifiedSharedAccountsRoute = { sourceMint: PublicKey; destinationMint: PublicKey; minAmountOut: bigint; + sourceTokenProgram: PublicKey; + destinationTokenProgram: PublicKey; }; export async function modifySharedAccountsRouteInstruction( @@ -51,8 +53,13 @@ export async function modifySharedAccountsRouteInstruction( // Adjust accounts. const userTransferAuthorityIdx = 2; - ix.keys[userTransferAuthorityIdx].pubkey = tokenOwner; - ix.keys[userTransferAuthorityIdx].isSigner = !cpi; + const oldUserTransferAuthority = ix.keys[userTransferAuthorityIdx].pubkey; + for (let i = 0; i < ix.keys.length; ++i) { + if (ix.keys[i].pubkey.equals(oldUserTransferAuthority)) { + ix.keys[i].pubkey = tokenOwner; + ix.keys[i].isSigner = !cpi; + } + } const sourceMint = ix.keys[7].pubkey; if (srcTokenProgram === undefined) { @@ -65,21 +72,31 @@ export async function modifySharedAccountsRouteInstruction( dstTokenProgram = accInfo.owner; } + const oldSourceToken = ix.keys[3].pubkey; const sourceToken = splToken.getAssociatedTokenAddressSync( sourceMint, tokenOwner, true, // allowOwnerOffCurve srcTokenProgram, ); - ix.keys[3].pubkey = sourceToken; + for (let i = 0; i < ix.keys.length; ++i) { + if (ix.keys[i].pubkey.equals(oldSourceToken)) { + ix.keys[i].pubkey = sourceToken; + } + } + const oldDestinationToken = ix.keys[6].pubkey; const destinationToken = splToken.getAssociatedTokenAddressSync( destinationMint, tokenOwner, true, // allowOwnerOffCurve dstTokenProgram, ); - ix.keys[6].pubkey = destinationToken; + for (let i = 0; i < ix.keys.length; ++i) { + if (ix.keys[i].pubkey.equals(oldDestinationToken)) { + ix.keys[i].pubkey = destinationToken; + } + } // Deserialize to modify args. const args = decodeSharedAccountsRouteArgs(ix.data) as any; @@ -105,6 +122,8 @@ export async function modifySharedAccountsRouteInstruction( sourceMint, destinationMint, minAmountOut, + sourceTokenProgram: srcTokenProgram, + destinationTokenProgram: dstTokenProgram, }; } diff --git a/solana/ts/src/jupiterV6/layouts.ts b/solana/ts/src/jupiterV6/layouts.ts index 5066ed84..5b048e59 100644 --- a/solana/ts/src/jupiterV6/layouts.ts +++ b/solana/ts/src/jupiterV6/layouts.ts @@ -7,6 +7,7 @@ import { deserializeLayout, serializeLayout, } from "@wormhole-foundation/sdk-base"; +import { endianness } from "os"; export type SharedAccountsRouteArgs = LayoutToType; @@ -67,7 +68,25 @@ const swapItem = { [[26, "RaydiumClmm"], []], [[27, "Openbook"], [{ name: "side", ...sideItem }]], [[28, "Phoenix"], [{ name: "side", ...sideItem }]], - // TODO: add more? + [ + [29, "Symmetry"], + [ + { name: "fromTokenId", binary: "uint", size: 8, endianness: "little" }, + { name: "toTokenId", binary: "uint", size: 8, endianness: "little" }, + ], + ], + [[30, "FluxBeam"], []], + [[31, "HeliumTreasuryManagementRedeemV0"], []], + [[32, "StakeDexStakeWrappedSol"], []], + [ + [33, "StakeDexSwapViaStake"], + [{ name: "bridgeStakeSeed", binary: "uint", size: 4, endianness: "little" }], + ], + [[34, "GooseFXV2"], []], + [[35, "Perps"], []], + [[36, "PerpsAddLiquidity"], []], + [[37, "PerpsRemoveLiquidity"], []], + [[38, "MeteoraDlmm"], []], ], } as const satisfies SwitchLayoutItem; @@ -85,7 +104,7 @@ export const selectorItem = (selector: AnchorSelector) => name: "prefix", binary: "bytes", custom: Uint8Array.from(selector), - }) as const; + } as const); const sharedAccountsRouteArgsLayout = [ selectorItem([193, 32, 155, 51, 65, 214, 156, 129]), diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index ad3734a6..afd9f3a8 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -1,7 +1,7 @@ +export * from "./consts"; export * from "./messages"; export * from "./relayerFees"; export * from "./state"; -export * from "./consts"; import * as wormholeSdk from "@certusone/wormhole-sdk"; import { BN, Program } from "@coral-xyz/anchor"; @@ -926,13 +926,12 @@ export class SwapLayerProgram { async releaseInboundIx(accounts: { stagedInbound: PublicKey; recipient: PublicKey; - dstToken?: PublicKey; + dstToken: PublicKey; beneficiary?: PublicKey; }): Promise { let { stagedInbound, recipient, dstToken, beneficiary } = accounts; beneficiary ??= recipient; - dstToken ??= splToken.getAssociatedTokenAddressSync(this.usdcMint, recipient); return this.program.methods .releaseInbound() @@ -956,6 +955,7 @@ export class SwapLayerProgram { recipientToken?: PublicKey; beneficiary?: PublicKey; dstTokenProgram?: PublicKey; + feeRecipientToken?: PublicKey; }, args: { cpiInstruction: TransactionInstruction; @@ -964,10 +964,10 @@ export class SwapLayerProgram { const { payer, preparedFill, recipient } = accounts; const { cpiInstruction } = args; - let { beneficiary, dstMint, dstTokenProgram, recipientToken } = accounts; + let { beneficiary, dstMint, dstTokenProgram, recipientToken, feeRecipientToken } = accounts; beneficiary ??= payer; dstMint ??= splToken.NATIVE_MINT; - recipientToken ??= splToken.getAssociatedTokenAddressSync(dstMint, recipient); + feeRecipientToken ??= await this.fetchCustodian().then((c) => c.feeRecipientToken); const swapAuthority = this.swapAuthorityAddress(preparedFill); const swapAccounts = await this.swapAccounts({ @@ -979,6 +979,12 @@ export class SwapLayerProgram { }); const { srcSwapToken, dstSwapToken } = swapAccounts; dstTokenProgram ??= swapAccounts.dstTokenProgram; + recipientToken ??= splToken.getAssociatedTokenAddressSync( + dstMint, + recipient, + true, + dstTokenProgram, + ); return this.program.methods .completeSwapDirect(cpiInstruction.data) @@ -992,6 +998,7 @@ export class SwapLayerProgram { authority: swapAuthority, srcSwapToken, dstSwapToken, + feeRecipientToken, usdc: this.usdcComposite(), dstMint, associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, @@ -1028,7 +1035,6 @@ export class SwapLayerProgram { beneficiary ??= payer; dstMint ??= splToken.NATIVE_MINT; feeRecipientToken ??= await this.fetchCustodian().then((c) => c.feeRecipientToken); - recipientToken ??= splToken.getAssociatedTokenAddressSync(dstMint, recipient); const swapAuthority = this.swapAuthorityAddress(preparedFill); const swapAccounts = await this.swapAccounts({ @@ -1040,6 +1046,12 @@ export class SwapLayerProgram { }); const { srcSwapToken, dstSwapToken } = swapAccounts; dstTokenProgram ??= swapAccounts.dstTokenProgram; + recipientToken ??= splToken.getAssociatedTokenAddressSync( + dstMint, + recipient, + true, + dstTokenProgram, + ); return this.program.methods .completeSwapRelay(cpiInstruction.data) @@ -1053,6 +1065,7 @@ export class SwapLayerProgram { authority: swapAuthority, srcSwapToken, dstSwapToken, + feeRecipientToken, usdc: this.usdcComposite(), dstMint, associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, @@ -1062,7 +1075,6 @@ export class SwapLayerProgram { }, recipientToken, recipient, - feeRecipientToken, }) .remainingAccounts(cpiInstruction.keys) .instruction(); @@ -1075,6 +1087,7 @@ export class SwapLayerProgram { dstMint?: PublicKey; beneficiary?: PublicKey; dstTokenProgram?: PublicKey; + feeRecipientToken?: PublicKey; }, args: { cpiInstruction: TransactionInstruction; @@ -1083,7 +1096,7 @@ export class SwapLayerProgram { const { payer, preparedFill } = accounts; const { cpiInstruction } = args; - let { beneficiary, dstMint, dstTokenProgram } = accounts; + let { beneficiary, dstMint, dstTokenProgram, feeRecipientToken } = accounts; beneficiary ??= payer; dstMint ??= splToken.NATIVE_MINT; @@ -1097,6 +1110,7 @@ export class SwapLayerProgram { }); const { srcSwapToken, dstSwapToken } = swapAccounts; dstTokenProgram ??= swapAccounts.dstTokenProgram; + feeRecipientToken ??= await this.fetchCustodian().then((c) => c.feeRecipientToken); return this.program.methods .completeSwapPayload(cpiInstruction.data) @@ -1109,6 +1123,7 @@ export class SwapLayerProgram { stagedInbound, srcSwapToken, dstSwapToken, + feeRecipientToken, usdc: this.usdcComposite(), dstMint, associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, diff --git a/solana/ts/tests/01__transfer.ts b/solana/ts/tests/01__transfer.ts index e0b1f2ca..a22f041d 100644 --- a/solana/ts/tests/01__transfer.ts +++ b/solana/ts/tests/01__transfer.ts @@ -45,6 +45,7 @@ import { StagedInbound, StagedOutbound, SwapLayerProgram, + TEST_RELAY_PARAMS, U32_MAX, UpdateRelayParametersArgs, calculateRelayerFee, @@ -52,15 +53,8 @@ import { encodeOutputToken, encodeSwapLayerMessage, localnet, - TEST_RELAY_PARAMS, } from "../src/swapLayer"; -import { - FEE_UPDATER_KEYPAIR, - REGISTERED_PEERS, - USDT_MINT_ADDRESS, - createLut, - tryNativeToUint8Array, -} from "./helpers"; +import { FEE_UPDATER_KEYPAIR, REGISTERED_PEERS, createLut, tryNativeToUint8Array } from "./helpers"; const SOLANA_CHAIN_ID = toChainId("Solana"); @@ -3466,6 +3460,10 @@ describe("Swap Layer", () => { const consumeIx = await swapLayer.releaseInboundIx({ recipient: payer.publicKey, stagedInbound, + dstToken: splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ), }); await expectIxErr(connection, [consumeIx], [payer], "ConstraintAddress"); @@ -3497,7 +3495,7 @@ describe("Swap Layer", () => { recipient: recipient.publicKey, beneficiary: beneficiary.publicKey, stagedInbound, - dstToken: dstToken, + dstToken, }); await expectIxOk(connection, [consumeIx], [recipient]); diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index 70715873..ae75a4cf 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -1,5 +1,6 @@ import * as splToken from "@solana/spl-token"; import { + AddressLookupTableAccount, ComputeBudgetProgram, Connection, Keypair, @@ -39,6 +40,7 @@ import * as tokenRouterSdk from "@wormhole-foundation/example-liquidity-layer-so import { VaaAccount } from "@wormhole-foundation/example-liquidity-layer-solana/wormhole"; import { Chain, ChainId, toChainId } from "@wormhole-foundation/sdk-base"; import { UniversalAddress, toNative, toUniversal } from "@wormhole-foundation/sdk-definitions"; +import "@wormhole-foundation/sdk-solana/address"; import { assert } from "chai"; import * as fs from "fs"; import * as jupiterV6 from "../src/jupiterV6"; @@ -49,20 +51,23 @@ import { StagedOutboundInfo, SwapLayerMessage, SwapLayerProgram, + TEST_RELAY_PARAMS, calculateRelayerFee, decodeSwapLayerMessage, denormalizeGasDropOff, encodeSwapLayerMessage, localnet, - TEST_RELAY_PARAMS, } from "../src/swapLayer"; import { + BERN_MINT_ADDRESS, + BONK_MINT_ADDRESS, + FEE_UPDATER_KEYPAIR, REGISTERED_PEERS, USDT_MINT_ADDRESS, + createAta, createLut, tryNativeToUint8Array, whichTokenProgram, - FEE_UPDATER_KEYPAIR, } from "./helpers"; const JUPITER_V6_LUT_ADDRESSES = [ @@ -70,6 +75,14 @@ const JUPITER_V6_LUT_ADDRESSES = [ new PublicKey("HsLPzBjqK3SUKQZwHdd2QHVc9cioPrsHNw9GcUDs7WL7"), ]; +const JUPITER_V6_LUT_ADDRESSES_BERN = [ + new PublicKey("2aGZxQimbQhRsvQhjvjXE35vZGJP2ajBSrUggoEwGGy4"), + new PublicKey("8Vaso6eE1pWktDHwy2qQBB1fhjmBgwzhoXQKe1sxtFjn"), + new PublicKey("BpQ5uMzQNWNgBCRNf6jffChhYMX5XVZuaoM4Rx16NCdf"), + new PublicKey("D6XNrxMsDoABJVVY5YyHxJuAB6WGzYCXpZeKyNtqu2v4"), + new PublicKey("55ir29U8MrZbGBV63XbbweEDXP9DSx7eNenc7hnTM81E"), +]; + describe("Jupiter V6 Testing", () => { const connection = new Connection(LOCALHOST, "processed"); @@ -82,12 +95,10 @@ describe("Jupiter V6 Testing", () => { const tokenRouter = swapLayer.tokenRouterProgram(); const matchingEngine = tokenRouter.matchingEngineProgram(); - const luts: [PublicKey, PublicKey, PublicKey, PublicKey] = [ - PublicKey.default, - PublicKey.default, - JUPITER_V6_LUT_ADDRESSES[0], - JUPITER_V6_LUT_ADDRESSES[1], - ]; + const luts: PublicKey[] = [PublicKey.default]; + for (let i = 0; i < JUPITER_V6_LUT_ADDRESSES.length; ++i) { + luts.push(JUPITER_V6_LUT_ADDRESSES[i]); + } let testCctpNonce = 2n ** 64n - 1n; @@ -96,25 +107,11 @@ describe("Jupiter V6 Testing", () => { let wormholeSequence = 10000n; - describe("Jupiter V6 Setup", function () { + describe("Swap", function () { before("Generate ATAs", async function () { for (const mint of [swapLayer.usdcMint, USDT_MINT_ADDRESS, splToken.NATIVE_MINT]) { for (let i = 0; i < 8; ++i) { - const authority = jupiterV6.programAuthorityAddress(i); - - await expectIxOk( - connection, - [ - splToken.createAssociatedTokenAccountIdempotentInstruction( - payer.publicKey, - splToken.getAssociatedTokenAddressSync(mint, authority, true), - authority, - mint, - splToken.TOKEN_PROGRAM_ID, - ), - ], - [payer], - ); + await createAta(connection, payer, mint, jupiterV6.programAuthorityAddress(i)); } } @@ -152,21 +149,29 @@ describe("Jupiter V6 Testing", () => { }); after("Setup Lookup Tables", async function () { - luts[0] = await createLut( - connection, - payer, - await tokenRouter - .commonAccounts() - .then((accounts) => Object.values(accounts).filter((key) => key !== undefined)), - ); - - luts[1] = await createLut( - connection, - payer, - await matchingEngine - .commonAccounts() - .then((accounts) => Object.values(accounts).filter((key) => key !== undefined)), - ); + const matchingEngineAccounts = await matchingEngine + .commonAccounts() + .then((accounts) => Object.values(accounts).filter((key) => key !== undefined)); + const tokenRouterAccounts = await tokenRouter + .commonAccounts() + .then((accounts) => Object.values(accounts).filter((key) => key !== undefined)); + + const { feeRecipientToken } = await swapLayer.fetchCustodian(); + const addresses = [ + swapLayer.custodianAddress(), + feeRecipientToken, + swapLayer.peerAddress(toChainId("Ethereum")), + splToken.TOKEN_2022_PROGRAM_ID, + splToken.ASSOCIATED_TOKEN_PROGRAM_ID, + splToken.NATIVE_MINT, + USDT_MINT_ADDRESS, + BERN_MINT_ADDRESS, + BONK_MINT_ADDRESS, + ]; + addresses.push(...matchingEngineAccounts); + addresses.push(...tokenRouterAccounts); + + luts[0] = await createLut(connection, payer, addresses); }); it("User Swap USDC to USDT From Simulated Quote -- Whirlpool", async function () { @@ -201,27 +206,95 @@ describe("Jupiter V6 Testing", () => { }).then(invokeSharedAccountsRouteAsUser); }); + it("User Swap USDC to Token-2022 Mint From Simulated Quote -- Multi Route", async function () { + const addressLookupTableAccounts = await Promise.all( + JUPITER_V6_LUT_ADDRESSES_BERN.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + await modifyUsdcTo2022SwapResponseForTest(payer.publicKey, { + inAmount: 10_000_000n, + quotedOutAmount: 200_000_000n, + slippageBps: 1000, + }).then((modifyArgs) => + invokeSharedAccountsRouteAsUser(modifyArgs, addressLookupTableAccounts), + ); + }); + + it("User Swap Token-2022 Mint to USDC From Simulated Quote -- Multi Route", async function () { + const addressLookupTableAccounts = await Promise.all( + JUPITER_V6_LUT_ADDRESSES_BERN.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + await modify2022ToUsdcSwapResponseForTest(payer.publicKey, { + inAmount: 200_000_000n, + quotedOutAmount: 10_000_000n, + slippageBps: 1000, + }).then((modifyArgs) => + invokeSharedAccountsRouteAsUser(modifyArgs, addressLookupTableAccounts), + ); + }); + async function invokeSharedAccountsRouteAsUser( modifyArgs: jupiterV6.ModifiedSharedAccountsRoute, + addressLookupTableAccounts?: AddressLookupTableAccount[], ) { const { instruction: ix, sourceToken: srcToken, destinationToken: dstToken, minAmountOut, + sourceTokenProgram, + destinationTokenProgram, } = modifyArgs; - const { amount: srcBalanceBefore } = await splToken.getAccount(connection, srcToken); - const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); + const { amount: srcBalanceBefore } = await splToken.getAccount( + connection, + srcToken, + undefined, + sourceTokenProgram, + ); + const { amount: dstBalanceBefore } = await splToken.getAccount( + connection, + dstToken, + undefined, + destinationTokenProgram, + ); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 500_000, + }); - await expectIxOk(connection, [ix], [payer]); + await expectIxOk(connection, [computeIx, ix], [payer], { addressLookupTableAccounts }); const decodedIxData = jupiterV6.decodeSharedAccountsRouteArgs(ix.data); - const { amount: srcBalanceAfter } = await splToken.getAccount(connection, srcToken); - assert.strictEqual(srcBalanceBefore - srcBalanceAfter, decodedIxData.inAmount); + const { amount: srcBalanceAfter } = await splToken.getAccount( + connection, + srcToken, + undefined, + sourceTokenProgram, + ); + + // This math makes a crude assumption that the # of routes will result in more rounding + // errors. We can improve this calculation, but the amounts we are dealing with are so + // small. + const numRoutes = BigInt(decodedIxData.routePlan.length); + const srcBalanceChange = srcBalanceBefore - srcBalanceAfter; + assert.isTrue(srcBalanceChange >= decodedIxData.inAmount - numRoutes); + assert.isTrue(srcBalanceChange <= decodedIxData.inAmount); - const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); + const { amount: dstBalanceAfter } = await splToken.getAccount( + connection, + dstToken, + undefined, + destinationTokenProgram, + ); assert.isTrue(dstBalanceAfter - dstBalanceBefore >= minAmountOut); } }); @@ -275,7 +348,7 @@ describe("Jupiter V6 Testing", () => { await swapExactInForTest( { payer: payer.publicKey, stagedOutbound, srcMint }, { cpiInstruction }, - "AmountOutTooSmall", + { errorMsg: "Error Code: AmountOutTooSmall" }, ); }); @@ -324,7 +397,7 @@ describe("Jupiter V6 Testing", () => { preparedBy: testRecipient.publicKey, }, { cpiInstruction }, - "prepared_by. Error Code: ConstraintAddress", + { errorMsg: "prepared_by. Error Code: ConstraintAddress" }, ); }); @@ -365,10 +438,10 @@ describe("Jupiter V6 Testing", () => { }, ); - const invalidToken = await splToken.getOrCreateAssociatedTokenAccount( + const invalidToken = await createAta( connection, payer, - USDC_MINT_ADDRESS, + swapLayer.usdcMint, testRecipient.publicKey, ); @@ -377,10 +450,10 @@ describe("Jupiter V6 Testing", () => { payer: payer.publicKey, stagedOutbound, srcMint, - usdcRefundToken: invalidToken.address, + usdcRefundToken: invalidToken, }, { cpiInstruction }, - "usdc_refund_token. Error Code: ConstraintAddress", + { errorMsg: "usdc_refund_token. Error Code: ConstraintAddress" }, ); }); @@ -430,7 +503,7 @@ describe("Jupiter V6 Testing", () => { srcMint, }, { cpiInstruction, targetChain: toChainId("Holesky") }, - "InvalidTargetChain", + { errorMsg: "Error Code: ConstraintTokenOwner" }, ); }); @@ -480,7 +553,7 @@ describe("Jupiter V6 Testing", () => { srcMint: USDC_MINT_ADDRESS, }, { cpiInstruction }, - "src_mint. Error Code: ConstraintAddress", + { errorMsg: "Error Code: ConstraintTokenMint" }, ); }); @@ -529,9 +602,13 @@ describe("Jupiter V6 Testing", () => { stagedOutbound, srcMint: USDC_MINT_ADDRESS, stagedCustodyToken: swapLayer.stagedCustodyTokenAddress(stagedOutbound), + srcResidual: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + ), }, { cpiInstruction }, - "SameMint", + { errorMsg: "Error Code: SameMint" }, ); }); @@ -645,6 +722,120 @@ describe("Jupiter V6 Testing", () => { ); assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); }); + + it("Token-2022 Mint via Multi-Route", async function () { + const srcMint = BERN_MINT_ADDRESS; + + const { + stagedOutbound, + stagedCustodyToken, + custodyBalance: inAmount, + stagedOutboundInfo, + redeemMode, + outputToken, + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }, + { + amountIn: 100_000_000n, + redeemOption: { + relay: { gasDropoff: 500000, maxRelayerFee: 9999999999999n }, + }, + }, + ); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { + instruction: cpiInstruction, + sourceToken, + destinationToken, + sourceMint, + destinationMint, + minAmountOut, + } = await modify2022ToUsdcSwapResponseForTest(swapAuthority, { + inAmount, + quotedOutAmount: 5_000_000n, // 5 USDC + slippageBps: 1000, + cpi: true, + }); + assert.deepEqual(sourceMint, srcMint); + assert.deepEqual(destinationMint, swapLayer.usdcMint); + + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + ]); + assert.isTrue(accInfos.every((info) => info === null)); + } + + await swapExactInForTest( + { payer: payer.publicKey, stagedOutbound, srcMint }, + { cpiInstruction }, + { additionalLuts: JUPITER_V6_LUT_ADDRESSES_BERN }, + ); + + { + const accInfos = await connection.getMultipleAccountsInfo([ + sourceToken, + destinationToken, + stagedOutbound, + stagedCustodyToken, + ]); + assert.isTrue(accInfos.slice(0, 2).every((info) => info === null)); + assert.isTrue(accInfos.slice(2, 4).every((info) => info !== null)); + } + + const { targetChain, usdcRefundToken, recipient } = stagedOutboundInfo; + const { address: redeemer } = await swapLayer.fetchPeer(targetChain as ChainId); + + // Verify the relevant information in the prepared order. + const preparedOrderData = await tokenRouter.fetchPreparedOrder(preparedOrder); + + const { info } = preparedOrderData; + assert.deepEqual( + preparedOrderData, + new tokenRouterSdk.PreparedOrder( + { + orderSender: swapLayer.custodianAddress(), + preparedBy: payer.publicKey, + orderType: { + market: { + minAmountOut: null, + }, + }, + srcToken: destinationToken, + refundToken: usdcRefundToken, + targetChain, + redeemer, + preparedCustodyTokenBump: info.preparedCustodyTokenBump, + }, + Buffer.from( + encodeSwapLayerMessage({ + recipient: new UniversalAddress(Uint8Array.from(recipient)), + redeemMode, + outputToken, + }), + ), + ), + ); + + // Verify the prepared custody token balance. + const { amount: preparedCustodyTokenBalance } = await splToken.getAccount( + connection, + tokenRouter.preparedCustodyTokenAddress(preparedOrder), + ); + assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); + }); }); describe("Inbound", function () { @@ -687,18 +878,13 @@ describe("Jupiter V6 Testing", () => { }, ); - await splToken.getOrCreateAssociatedTokenAccount( - connection, - payer, - USDC_MINT_ADDRESS, - recipient, - ); + await createAta(connection, payer, swapLayer.usdcMint, recipient); const transferIx = await swapLayer.completeTransferRelayIx( { payer: payer.publicKey, preparedFill, - recipient: recipient, + recipient, }, toChainId("Ethereum"), ); @@ -783,10 +969,10 @@ describe("Jupiter V6 Testing", () => { }, ); - const recipientToken = await splToken.getOrCreateAssociatedTokenAccount( + const recipientToken = await createAta( connection, payer, - USDC_MINT_ADDRESS, + swapLayer.usdcMint, recipient, ); @@ -796,8 +982,8 @@ describe("Jupiter V6 Testing", () => { payer: payer.publicKey, preparedFill, recipient: recipient, - dstMint: USDC_MINT_ADDRESS, - recipientToken: recipientToken.address, + dstMint: swapLayer.usdcMint, + recipientToken, }, { limitAmount, @@ -918,10 +1104,10 @@ describe("Jupiter V6 Testing", () => { }, ); - const recipientToken = await splToken.getOrCreateAssociatedTokenAccount( + const recipientToken = await createAta( connection, payer, - USDC_MINT_ADDRESS, + swapLayer.usdcMint, recipient, ); @@ -932,7 +1118,7 @@ describe("Jupiter V6 Testing", () => { preparedFill, recipient: recipient, dstMint: USDC_MINT_ADDRESS, - recipientToken: recipientToken.address, + recipientToken, }, { limitAmount, @@ -969,10 +1155,8 @@ describe("Jupiter V6 Testing", () => { ); // Pass in payer token account instead. - const payerToken = await splToken.getOrCreateAssociatedTokenAccount( - connection, - payer, - USDC_MINT_ADDRESS, + const payerToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, payer.publicKey, ); @@ -981,7 +1165,7 @@ describe("Jupiter V6 Testing", () => { payer: payer.publicKey, preparedFill, recipient: recipient, - recipientToken: payerToken.address, + recipientToken: payerToken, dstMint, }, { @@ -1019,10 +1203,10 @@ describe("Jupiter V6 Testing", () => { ); // Pass in payer token account instead. - const recipientToken = await splToken.getOrCreateAssociatedTokenAccount( + const recipientToken = await createAta( connection, payer, - USDC_MINT_ADDRESS, + swapLayer.usdcMint, recipient, ); @@ -1031,7 +1215,7 @@ describe("Jupiter V6 Testing", () => { payer: payer.publicKey, preparedFill, recipient: recipient, - feeRecipientToken: recipientToken.address, + feeRecipientToken: recipientToken, dstMint, }, { @@ -1560,6 +1744,49 @@ describe("Jupiter V6 Testing", () => { const recipientAfter = await getUsdcAtaBalance(connection, recipient); assert.equal(recipientAfter - recipientBefore, amountIn); }); + + it("Other (Token-2022 Mint) via Multi-Route", async function () { + const dstMint = BERN_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 200_000_000n, + dstMint, + slippageBps: 500, + }); + + const gasDropoff = 100_000; // .1 SOL (10,000 * 1e3) + const relayingFee = 690000n; // .69 USDC + const amountIn = preFillAmountIn(10_000_000n, relayingFee); + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + redeemMode: { + mode: "Relay", + gasDropoff, + relayingFee, + }, + amountIn, + }, + ); + + await completeSwapRelayForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + relayingFee, + denormGasDropoff: denormalizeGasDropOff(gasDropoff), + swapResponseModifier: modifyUsdcTo2022SwapResponseForTest, + additionalLuts: JUPITER_V6_LUT_ADDRESSES_BERN, + }, + ); + }); }); }); @@ -1891,10 +2118,8 @@ describe("Jupiter V6 Testing", () => { ); // Pass in payer token account instead. - const payerToken = await splToken.getOrCreateAssociatedTokenAccount( - connection, - payer, - USDC_MINT_ADDRESS, + const payerToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, payer.publicKey, ); @@ -1903,7 +2128,7 @@ describe("Jupiter V6 Testing", () => { payer: payer.publicKey, preparedFill, recipient, - recipientToken: payerToken.address, + recipientToken: payerToken, dstMint, }, { @@ -2228,10 +2453,44 @@ describe("Jupiter V6 Testing", () => { }, ); }); + + it("Other (Token-2022 Mint) via Multi-Route", async function () { + const dstMint = BERN_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 200_000_000n, + dstMint, + slippageBps: 500, + }); + + const amountIn = preFillAmountIn(10_000_000n); + const { preparedFill, recipient } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + outputToken, + amountIn, + }, + ); + + await completeSwapDirectForTest( + { + payer: payer.publicKey, + preparedFill, + recipient, + dstMint, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcTo2022SwapResponseForTest, + additionalLuts: JUPITER_V6_LUT_ADDRESSES_BERN, + }, + ); + }); }); }); - describe("USDC Transfer (Payload)", function () { + describe("USDC Swap (Payload)", function () { describe("Outbound", function () { it("USDT via Whirlpool", async function () { const srcMint = USDT_MINT_ADDRESS; @@ -2497,6 +2756,47 @@ describe("Jupiter V6 Testing", () => { }, ); }); + + it("Other (Token-2022 Mint) via Multi-Route", async function () { + const dstMint = BERN_MINT_ADDRESS; + const { limitAmount, outputToken } = newQuotedSwapOutputToken({ + quotedAmountOut: 200_800_000n, + dstMint, + slippageBps: 500, + }); + + const amountIn = preFillAmountIn(10_000_000n); + const { preparedFill } = await redeemSwapLayerFastFillForTest( + { payer: payer.publicKey }, + emittedEvents, + { + dstMint, + redeemMode: { + mode: "Payload", + sender: toUniversal( + "Ethereum", + "0x000000000000000000000000000000000000d00d", + ), + buf: Buffer.from("All your base are belong to us."), + }, + outputToken, + amountIn, + }, + ); + + await completeSwapPayloadForTest( + { + payer: payer.publicKey, + preparedFill, + dstMint, + }, + { + limitAmount, + swapResponseModifier: modifyUsdcTo2022SwapResponseForTest, + additionalLuts: JUPITER_V6_LUT_ADDRESSES_BERN, + }, + ); + }); }); }); @@ -2559,11 +2859,15 @@ describe("Jupiter V6 Testing", () => { tokenOwner: PublicKey, opts: jupiterV6.ModifySharedAccountsRouteOpts, ) => Promise; + additionalLuts?: PublicKey[]; }, ): Promise { const [{ signers, errorMsg }, otherOpts] = setDefaultForTestOpts(opts); const { limitAmount, outputTokenOverride, swapResponseModifier } = otherOpts; + let { additionalLuts } = otherOpts; + additionalLuts ??= []; + const { instruction: cpiInstruction, destinationMint } = await swapResponseModifier( swapLayer.swapAuthorityAddress(accounts.preparedFill), { @@ -2579,13 +2883,13 @@ describe("Jupiter V6 Testing", () => { const ixs = [ ComputeBudgetProgram.setComputeUnitLimit({ - units: 420_000, + units: 700_000, }), ix, ]; const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { + [...luts, ...additionalLuts].map(async (lookupTableAddress) => { const resp = await connection.getAddressLookupTable(lookupTableAddress); return resp.value; }), @@ -2611,19 +2915,30 @@ describe("Jupiter V6 Testing", () => { const balanceAfter = await connection.getBalance(accounts.recipient).then(BigInt); assert.isTrue(balanceAfter - balanceBefore >= limitAmount); } else if (outputToken.type === "Other" || outputTokenOverride === "Other") { + const tokenProgram = await whichTokenProgram(connection, expectedDstMint); const dstToken = splToken.getAssociatedTokenAddressSync( expectedDstMint, accounts.recipient, false, - await whichTokenProgram(connection, expectedDstMint), + tokenProgram, + ); + const { amount: dstBalanceBefore } = await splToken.getAccount( + connection, + dstToken, + undefined, + tokenProgram, ); - const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); await expectIxOk(connection, ixs, signers, { addressLookupTableAccounts, }); - const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); + const { amount: dstBalanceAfter } = await splToken.getAccount( + connection, + dstToken, + undefined, + tokenProgram, + ); assert.isTrue(dstBalanceAfter - dstBalanceBefore >= limitAmount); } else { assert.fail("Invalid output token type"); @@ -2647,12 +2962,16 @@ describe("Jupiter V6 Testing", () => { tokenOwner: PublicKey, opts: jupiterV6.ModifySharedAccountsRouteOpts, ) => Promise; + additionalLuts?: PublicKey[]; }, overrides?: { signers: Signer[] }, ): Promise { const [{ signers, errorMsg }, otherOpts] = setDefaultForTestOpts(opts, overrides); const { limitAmount, relayingFee, denormGasDropoff, swapResponseModifier } = otherOpts; + let { additionalLuts } = otherOpts; + additionalLuts ??= []; + const { instruction: cpiInstruction, destinationMint } = await swapResponseModifier( swapLayer.swapAuthorityAddress(accounts.preparedFill), { @@ -2665,13 +2984,13 @@ describe("Jupiter V6 Testing", () => { const ixs = [ ComputeBudgetProgram.setComputeUnitLimit({ - units: 420_000, + units: 700_000, }), ix, ]; const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { + [...luts, ...additionalLuts].map(async (lookupTableAddress) => { const resp = await connection.getAddressLookupTable(lookupTableAddress); return resp.value; }), @@ -2689,9 +3008,7 @@ describe("Jupiter V6 Testing", () => { const selfRedeem = accounts.payer == accounts.recipient; // Fetch the balance of the fee recipient before the swap. - const feeRecipientToken = await swapLayer - .fetchCustodian() - .then((acc) => acc.feeRecipientToken); + const { feeRecipientToken } = await swapLayer.fetchCustodian(); const { amount: feeRecipientBefore } = await splToken.getAccount( connection, feeRecipientToken, @@ -2710,20 +3027,31 @@ describe("Jupiter V6 Testing", () => { (selfRedeem ? limitAmount : limitAmount + denormGasDropoff), ); } else if (swapMsg.outputToken.type === "Other") { + const dstTokenProgram = await whichTokenProgram(connection, expectedDstMint); const dstToken = splToken.getAssociatedTokenAddressSync( expectedDstMint, accounts.recipient, false, - await whichTokenProgram(connection, expectedDstMint), + dstTokenProgram, + ); + const { amount: dstBalanceBefore } = await splToken.getAccount( + connection, + dstToken, + undefined, + dstTokenProgram, ); - const { amount: dstBalanceBefore } = await splToken.getAccount(connection, dstToken); const balanceBefore = await connection.getBalance(accounts.recipient).then(BigInt); await expectIxOk(connection, ixs, signers, { addressLookupTableAccounts, }); - const { amount: dstBalanceAfter } = await splToken.getAccount(connection, dstToken); + const { amount: dstBalanceAfter } = await splToken.getAccount( + connection, + dstToken, + undefined, + dstTokenProgram, + ); assert.isTrue(dstBalanceAfter - dstBalanceBefore >= limitAmount); @@ -2758,11 +3086,15 @@ describe("Jupiter V6 Testing", () => { tokenOwner: PublicKey, opts: jupiterV6.ModifySharedAccountsRouteOpts, ) => Promise; + additionalLuts?: PublicKey[]; }, ): Promise { const [{ signers, errorMsg }, otherOpts] = setDefaultForTestOpts(opts); const { limitAmount, swapResponseModifier } = otherOpts; + let { additionalLuts } = otherOpts; + additionalLuts ??= []; + const stagedInbound = swapLayer.stagedInboundAddress(accounts.preparedFill); const { instruction: cpiInstruction, @@ -2788,13 +3120,13 @@ describe("Jupiter V6 Testing", () => { const ixs = [ ComputeBudgetProgram.setComputeUnitLimit({ - units: 420_000, + units: 700_000, }), ix, ]; const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { + [...luts, ...additionalLuts].map(async (lookupTableAddress) => { const resp = await connection.getAddressLookupTable(lookupTableAddress); return resp.value; }), @@ -2844,7 +3176,12 @@ describe("Jupiter V6 Testing", () => { ); if (outputToken.type === "Gas" || outputToken.type === "Other") { - const { amount } = await splToken.getAccount(connection, destinationToken); + const { amount } = await splToken.getAccount( + connection, + destinationToken, + undefined, + await whichTokenProgram(connection, expectedDstMint), + ); assert.isTrue(amount >= limitAmount); } else { assert.fail("Invalid output token type"); @@ -2880,28 +3217,8 @@ describe("Jupiter V6 Testing", () => { }; // Generate a new token account for recipient. - const tokenProgram = await whichTokenProgram(connection, dstMint); if (createRecipientAta) { - const recipientToken = splToken.getAssociatedTokenAddressSync( - dstMint, - recipient, - false, - tokenProgram, - ); - - await expectIxOk( - connection, - [ - splToken.createAssociatedTokenAccountInstruction( - payer.publicKey, - recipientToken, - recipient, - dstMint, - tokenProgram, - ), - ], - [payer], - ); + await createAta(connection, payer, dstMint, recipient); } let encodedRecipient = recipient; @@ -3023,6 +3340,42 @@ describe("Jupiter V6 Testing", () => { ); } + async function modifyUsdcTo2022SwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): Promise { + const response = JSON.parse( + fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/multi_usdc_to_2022.json`, { + encoding: "utf-8", + }), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction( + connection, + response, + tokenOwner, + opts, + ); + } + + async function modify2022ToUsdcSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): Promise { + const response = JSON.parse( + fs.readFileSync(`${__dirname}/jupiterV6SwapResponses/multi_2022_to_usdc.json`, { + encoding: "utf-8", + }), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction( + connection, + response, + tokenOwner, + opts, + ); + } + type PrepareOrderResponseForTestOptionalOpts = { args?: matchingEngineSdk.CctpMessageArgs; }; @@ -3255,6 +3608,10 @@ describe("Jupiter V6 Testing", () => { }; } + function preFillAmountIn(amount: bigint, relayingFee?: bigint): bigint { + return amount + 1_250_000n + 420n + (relayingFee ?? 0n); + } + type VaaResult = { vaa: PublicKey; vaaAccount: VaaAccount; @@ -3468,13 +3825,24 @@ describe("Jupiter V6 Testing", () => { outputToken ??= null; transferType ??= "sender"; + const accInfo = await connection.getAccountInfo(accounts.srcMint); + if (accInfo === null) { + throw new Error("Invalid mint account"); + } + const srcTokenProgram = accInfo.owner; + let sender = accounts.sender; if (sender === undefined) { if (accounts.senderToken === undefined) { throw new Error("Sender must be specified if senderToken is null"); } - const { owner } = await splToken.getAccount(connection, accounts.senderToken); + const { owner } = await splToken.getAccount( + connection, + accounts.senderToken, + undefined, + srcTokenProgram, + ); sender = owner; } @@ -3508,6 +3876,8 @@ describe("Jupiter V6 Testing", () => { const { amount: custodyBalance } = await splToken.getAccount( connection, stagedCustodyToken, + undefined, + srcTokenProgram, ); const { info: stagedOutboundInfo } = await swapLayer.fetchStagedOutbound(stagedOutbound); @@ -3565,34 +3935,42 @@ describe("Jupiter V6 Testing", () => { srcTokenProgram?: PublicKey; preparedBy?: PublicKey; usdcRefundToken?: PublicKey; + srcResidual?: PublicKey; }, args: { cpiInstruction: TransactionInstruction; targetChain?: ChainId; }, - err?: string, + opts: { + additionalLuts?: PublicKey[]; + } & ForTestOpts = {}, ) { + const [{ signers, errorMsg }, otherOpts] = setDefaultForTestOpts(opts); + + let { additionalLuts } = otherOpts; + additionalLuts ??= []; + const ix = await swapLayer.initiateSwapExactInIx(accounts, args); const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ - units: 360_000, + units: 700_000, }); const addressLookupTableAccounts = await Promise.all( - luts.map(async (lookupTableAddress) => { + [...luts, ...additionalLuts].map(async (lookupTableAddress) => { const resp = await connection.getAddressLookupTable(lookupTableAddress); return resp.value; }), ); - if (err !== undefined) { - await expectIxErr(connection, [computeIx, ix], [payer], err, { + if (errorMsg !== null) { + await expectIxErr(connection, [computeIx, ix], signers, errorMsg, { addressLookupTableAccounts, }); return; } - await expectIxOk(connection, [computeIx, ix], [payer], { + await expectIxOk(connection, [computeIx, ix], signers, { addressLookupTableAccounts, }); } diff --git a/solana/ts/tests/accounts/bern_mint_2022.json b/solana/ts/tests/accounts/bern_mint_2022.json new file mode 100644 index 00000000..e11c9a11 --- /dev/null +++ b/solana/ts/tests/accounts/bern_mint_2022.json @@ -0,0 +1,14 @@ +{ + "pubkey": "CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo", + "account": { + "lamports": 10574116480, + "data": [ + "AAAAAF6FlBDp84quKJTnIC3eZq7d8SbOoKlPCfCAsA30E9mWxF7o+eRZAAAFAQEAAABehZQQ6fOKriiU5yAt3mau3fEmzqCpTwnwgLAN9BPZlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAbABehZQQ6fOKriiU5yAt3mau3fEmzqCpTwnwgLAN9BPZll6FlBDp84quKJTnIC3eZq7d8SbOoKlPCfCAsA30E9mWZZZvNgAAAADHAQAAAAAAAACg3sWtyTU2AADJAQAAAAAAAACg3sWtyTU2sgI=", + "base64" + ], + "owner": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 278 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter/jupiter_custody_owner.json b/solana/ts/tests/accounts/jupiter_v6/jupiter_custody_owner.json similarity index 100% rename from solana/ts/tests/accounts/jupiter/jupiter_custody_owner.json rename to solana/ts/tests/accounts/jupiter_v6/jupiter_custody_owner.json diff --git a/solana/ts/tests/accounts/jupiter/jupiter_usdc_custody_token.json b/solana/ts/tests/accounts/jupiter_v6/jupiter_usdc_custody_token.json similarity index 100% rename from solana/ts/tests/accounts/jupiter/jupiter_usdc_custody_token.json rename to solana/ts/tests/accounts/jupiter_v6/jupiter_usdc_custody_token.json diff --git a/solana/ts/tests/accounts/jupiter/jupiter_usdt_custody_token.json b/solana/ts/tests/accounts/jupiter_v6/jupiter_usdt_custody_token.json similarity index 100% rename from solana/ts/tests/accounts/jupiter/jupiter_usdt_custody_token.json rename to solana/ts/tests/accounts/jupiter_v6/jupiter_usdt_custody_token.json diff --git a/solana/ts/tests/accounts/jupiter/jupiter_v6_lut_1.json b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_1.json similarity index 100% rename from solana/ts/tests/accounts/jupiter/jupiter_v6_lut_1.json rename to solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_1.json diff --git a/solana/ts/tests/accounts/jupiter/jupiter_v6_lut_2.json b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_2.json similarity index 100% rename from solana/ts/tests/accounts/jupiter/jupiter_v6_lut_2.json rename to solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_2.json diff --git a/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_3.json b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_3.json new file mode 100644 index 00000000..b09639ca --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_3.json @@ -0,0 +1,14 @@ +{ + "pubkey": "8Vaso6eE1pWktDHwy2qQBB1fhjmBgwzhoXQKe1sxtFjn", + "account": { + "lamports": 30456960, + "data": [ + "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", + "base64" + ], + "owner": "AddressLookupTab1e1111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 4248 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_4.json b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_4.json new file mode 100644 index 00000000..43ac2f4d --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_4.json @@ -0,0 +1,14 @@ +{ + "pubkey": "D6XNrxMsDoABJVVY5YyHxJuAB6WGzYCXpZeKyNtqu2v4", + "account": { + "lamports": 57406080, + "data": [ + "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", + "base64" + ], + "owner": "AddressLookupTab1e1111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 8120 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_5.json b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_5.json new file mode 100644 index 00000000..0daf3b1f --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_5.json @@ -0,0 +1,14 @@ +{ + "pubkey": "2aGZxQimbQhRsvQhjvjXE35vZGJP2ajBSrUggoEwGGy4", + "account": { + "lamports": 57851520, + "data": [ + "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", + "base64" + ], + "owner": "AddressLookupTab1e1111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 8184 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_6.json b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_6.json new file mode 100644 index 00000000..b5c2d0d5 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_6.json @@ -0,0 +1,14 @@ +{ + "pubkey": "BpQ5uMzQNWNgBCRNf6jffChhYMX5XVZuaoM4Rx16NCdf", + "account": { + "lamports": 43374720, + "data": [ + "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", + "base64" + ], + "owner": "AddressLookupTab1e1111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 6104 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_7.json b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_7.json new file mode 100644 index 00000000..d204a8ec --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_7.json @@ -0,0 +1,14 @@ +{ + "pubkey": "55ir29U8MrZbGBV63XbbweEDXP9DSx7eNenc7hnTM81E", + "account": { + "lamports": 56737920, + "data": [ + "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", + "base64" + ], + "owner": "AddressLookupTab1e1111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 8024 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_8.json b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_8.json new file mode 100644 index 00000000..f5708b2f --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/jupiter_v6_lut_8.json @@ -0,0 +1,14 @@ +{ + "pubkey": "5ePPDZP3ZAic796eFUDyHGtyYvynyFbpJ8oqTy2ydxvy", + "account": { + "lamports": 57406080, + "data": [ + "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", + "base64" + ], + "owner": "AddressLookupTab1e1111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 8120 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/25s6jZQYe8RB8JpoCDq3i4u6cCNfCG1xicYK7E7f3v6L.json b/solana/ts/tests/accounts/jupiter_v6/multi/25s6jZQYe8RB8JpoCDq3i4u6cCNfCG1xicYK7E7f3v6L.json new file mode 100644 index 00000000..225d6ea6 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/25s6jZQYe8RB8JpoCDq3i4u6cCNfCG1xicYK7E7f3v6L.json @@ -0,0 +1,14 @@ +{ + "pubkey": "25s6jZQYe8RB8JpoCDq3i4u6cCNfCG1xicYK7E7f3v6L", + "account": { + "lamports": 71437440, + "data": [ + "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", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10136 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/2LizoD7noGRmTFszBRj3P2GzfARqdGwhpimQthWTGbhn.json b/solana/ts/tests/accounts/jupiter_v6/multi/2LizoD7noGRmTFszBRj3P2GzfARqdGwhpimQthWTGbhn.json new file mode 100644 index 00000000..2e2ce5e1 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/2LizoD7noGRmTFszBRj3P2GzfARqdGwhpimQthWTGbhn.json @@ -0,0 +1,14 @@ +{ + "pubkey": "2LizoD7noGRmTFszBRj3P2GzfARqdGwhpimQthWTGbhn", + "account": { + "lamports": 217514247291, + "data": [ + "BpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAFtJurEnd6kpq039jDJgTMkn0m2H8bVuMykeeSEkwavNIvmvKQyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAADwHR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/2UDdWW9TNeEJa2S539ijVLLeVZt88zuiduSYD7SeSeHN.json b/solana/ts/tests/accounts/jupiter_v6/multi/2UDdWW9TNeEJa2S539ijVLLeVZt88zuiduSYD7SeSeHN.json new file mode 100644 index 00000000..31ae20cf --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/2UDdWW9TNeEJa2S539ijVLLeVZt88zuiduSYD7SeSeHN.json @@ -0,0 +1,14 @@ +{ + "pubkey": "2UDdWW9TNeEJa2S539ijVLLeVZt88zuiduSYD7SeSeHN", + "account": { + "lamports": 71437440, + "data": [ + "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", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10136 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/2W7aa5mVuzJiaM43uFtutVFdSoWx963AKT8dtizqejTF.json b/solana/ts/tests/accounts/jupiter_v6/multi/2W7aa5mVuzJiaM43uFtutVFdSoWx963AKT8dtizqejTF.json new file mode 100644 index 00000000..16bc727b --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/2W7aa5mVuzJiaM43uFtutVFdSoWx963AKT8dtizqejTF.json @@ -0,0 +1,14 @@ +{ + "pubkey": "2W7aa5mVuzJiaM43uFtutVFdSoWx963AKT8dtizqejTF", + "account": { + "lamports": 72161280, + "data": [ + "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8uf//CPn28g8EAAAAAAAAAAAAAAj59vIPBAAAAAAAAAAAAAA07gpQKxRQHgAAAAAAAAAAGK8EdvCMgQQAAAAAAAAAANfcLIBkVpkKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD9uf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+uf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/uf//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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", + "base64" + ], + "owner": "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10240 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/2qr4UqV7vdJ1TLLX2YGZ7fBJ9U96UwAFAjwLK572TJ4h.json b/solana/ts/tests/accounts/jupiter_v6/multi/2qr4UqV7vdJ1TLLX2YGZ7fBJ9U96UwAFAjwLK572TJ4h.json new file mode 100644 index 00000000..c4f40d1b --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/2qr4UqV7vdJ1TLLX2YGZ7fBJ9U96UwAFAjwLK572TJ4h.json @@ -0,0 +1,14 @@ +{ + "pubkey": "2qr4UqV7vdJ1TLLX2YGZ7fBJ9U96UwAFAjwLK572TJ4h", + "account": { + "lamports": 71437440, + "data": [ + "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", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10136 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/39PUs23GXEdyRJ74fnSfL7L4tZgXVafirBMsbHqZyCVx.json b/solana/ts/tests/accounts/jupiter_v6/multi/39PUs23GXEdyRJ74fnSfL7L4tZgXVafirBMsbHqZyCVx.json new file mode 100644 index 00000000..c8a3d32e --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/39PUs23GXEdyRJ74fnSfL7L4tZgXVafirBMsbHqZyCVx.json @@ -0,0 +1,14 @@ +{ + "pubkey": "39PUs23GXEdyRJ74fnSfL7L4tZgXVafirBMsbHqZyCVx", + "account": { + "lamports": 2039280, + "data": [ + "aSf9wB6pBvltcTeHTN162tAMo1dkYZMQ5UGWx4HYTVvFq0PU3Ospq/V+UZOp0l7D5ItFOfD65zrOif4rmPEndbdE44YBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/3GbtMs4cRP3Th3GhKcZk7sUkF3skxV8FdbiG8aKp7qeh.json b/solana/ts/tests/accounts/jupiter_v6/multi/3GbtMs4cRP3Th3GhKcZk7sUkF3skxV8FdbiG8aKp7qeh.json new file mode 100644 index 00000000..51170ed9 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/3GbtMs4cRP3Th3GhKcZk7sUkF3skxV8FdbiG8aKp7qeh.json @@ -0,0 +1,14 @@ +{ + "pubkey": "3GbtMs4cRP3Th3GhKcZk7sUkF3skxV8FdbiG8aKp7qeh", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWHkK8xnGUnYYa69/Au7WXIJjm1fT8qU67BuAwUChw5aNwfSCdUWAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/3MsJXVvievxAbsMsaT6TS4i6oMitD9jazucuq3X234tC.json b/solana/ts/tests/accounts/jupiter_v6/multi/3MsJXVvievxAbsMsaT6TS4i6oMitD9jazucuq3X234tC.json new file mode 100644 index 00000000..16addc7b --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/3MsJXVvievxAbsMsaT6TS4i6oMitD9jazucuq3X234tC.json @@ -0,0 +1,14 @@ +{ + "pubkey": "3MsJXVvievxAbsMsaT6TS4i6oMitD9jazucuq3X234tC", + "account": { + "lamports": 363653040, + "data": [ + "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", + "base64" + ], + "owner": "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 52121 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/3nLYkE5zHKgGBxXW8Rj4neWZT5JHgdAjVRqUDcDk8nF9.json b/solana/ts/tests/accounts/jupiter_v6/multi/3nLYkE5zHKgGBxXW8Rj4neWZT5JHgdAjVRqUDcDk8nF9.json new file mode 100644 index 00000000..eabc437e --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/3nLYkE5zHKgGBxXW8Rj4neWZT5JHgdAjVRqUDcDk8nF9.json @@ -0,0 +1,14 @@ +{ + "pubkey": "3nLYkE5zHKgGBxXW8Rj4neWZT5JHgdAjVRqUDcDk8nF9", + "account": { + "lamports": 72161280, + "data": [ + "wJtVzTH5gSp05wCcEx+FajBi2hyyXuwbtRiRc1/fR1bb/Xwn9WYvgCi6//8ouv//B5kpHAAAAAAAAAAAAAAAAAeZKRwAAAAAAAAAAAAAAADOMvH38a9eHgAAAAAAAAAAMoyPKzkGhAQAAAAAAAAAAI5wrSDB0JkKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAquv//SHCJKUEBAAAAAAAAAAAAAEhwiSlBAQAAAAAAAAAAAAAK2GzZ78X/HQAAAAAAAAAA/1VEQwqkcwQAAAAAAAAAAG27+fJxoJYKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAruv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAsuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAtuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAABIuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABJuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABKuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABLuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABMuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNuv//G0eqWEEAAAAAAAAAAAAAABtHqlhBAAAAAAAAAAAAAAAsih1i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", + "base64" + ], + "owner": "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10240 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/42xVpYuCFbr4FWYoMwzUjDgoUGC4dzjaLhjR71CrAQpe.json b/solana/ts/tests/accounts/jupiter_v6/multi/42xVpYuCFbr4FWYoMwzUjDgoUGC4dzjaLhjR71CrAQpe.json new file mode 100644 index 00000000..9d977d3b --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/42xVpYuCFbr4FWYoMwzUjDgoUGC4dzjaLhjR71CrAQpe.json @@ -0,0 +1,14 @@ +{ + "pubkey": "42xVpYuCFbr4FWYoMwzUjDgoUGC4dzjaLhjR71CrAQpe", + "account": { + "lamports": 23385600, + "data": [ + "i8KDs4yz5fQNAAAAAAAAAGQAAAAAAAAAZAAAAAAAAACkhE6e////////////////aJBWZgAAAADekFZmAAAAAOisSp7////////////////hkFZmAAAAAE+RVmYAAAAASaFGnv///////////////1mRVmYAAAAAxpFWZgAAAABlR0Ke////////////////0pFWZgAAAABGklZmAAAAACOTPp7///////////////9KklZmAAAAALOSVmYAAAAAzIQ5nv///////////////9GSVmYAAAAASJNWZgAAAACy0jWe////////////////TJNWZgAAAAC1k1ZmAAAAAFV/MJ7////////////////dk1ZmAAAAAFKUVmYAAAAAFFwsnv///////////////1WUVmYAAAAAzJRWZgAAAAB6OCie////////////////z5RWZgAAAABGlVZmAAAAAOcUJJ7///////////////9JlVZmAAAAAMCVVmYAAAAAzgIgnv///////////////8GVVmYAAAAAOJZWZgAAAABP+Rue////////////////OZZWZgAAAACvllZmAAAAAPwsGp7///////////////+1llZmAAAAAOSWVmYAAAAAY8S7n////////////////29mVmYAAAAA5mZWZgAAAAB7sLef////////////////6WZWZgAAAABeZ1ZmAAAAAHLZs5////////////////9kZ1ZmAAAAAM9nVmYAAAAAVV2vn////////////////9xnVmYAAAAAU2hWZgAAAAA6W6uf////////////////V2hWZgAAAADJaFZmAAAAAKITp5/////////////////QaFZmAAAAAEdpVmYAAAAAYAmjn////////////////0hpVmYAAAAAvmlWZgAAAAAx956f////////////////wGlWZgAAAAA2alZmAAAAAAMIm5////////////////8/alZmAAAAAKpqVmYAAAAA1riWn////////////////71qVmYAAAAAKWtWZgAAAACFEpKf////////////////PGtWZgAAAACya1ZmAAAAALHljZ////////////////+2a1ZmAAAAAC1sVmYAAAAAKp+Jn////////////////zRsVmYAAAAAq2xWZgAAAABdhIWf////////////////rWxWZgAAAAAkbVZmAAAAAOpxgZ////////////////8lbVZmAAAAAJxtVmYAAAAARl99n////////////////51tVmYAAAAAFG5WZgAAAAAFy3qf////////////////GG5WZgAAAABgblZmAAAAAPHedZ////////////////+RblZmAAAAAPFuVmYAAAAACftwn////////////////wpvVmYAAAAAgW9WZgAAAACW52yf////////////////gm9WZgAAAAD5b1ZmAAAAAJOgaJ////////////////8AcFZmAAAAAHdwVmYAAAAAcnNkn////////////////3xwVmYAAAAA8nBWZgAAAABHYGCf////////////////9HBWZgAAAABqcVZmAAAAAIg7XJ////////////////9ucVZmAAAAAORxVmYAAAAAK81Yn////////////////+dxVmYAAAAASXJWZgAAAABhVFOf////////////////c3JWZgAAAADqclZmAAAAAH9AT5/////////////////rclZmAAAAAGJzVmYAAAAAFPBKn////////////////2tzVmYAAAAA4XNWZgAAAAD5uUaf////////////////5nNWZgAAAABddFZmAAAAAKqmQp////////////////9fdFZmAAAAANV0VmYAAAAA2Yo+n////////////////9d0VmYAAAAATnVWZgAAAABudzqf////////////////T3VWZgAAAADGdVZmAAAAAOBiNp/////////////////HdVZmAAAAAD52VmYAAAAAEjwyn////////////////0N2VmYAAAAAuHZWZgAAAAD8oy2f////////////////yHZWZgAAAAA/d1ZmAAAAAMHCKZ////////////////9Ad1ZmAAAAALF3VmYAAAAAeU0ln////////////////713VmYAAAAANHhWZgAAAABZ8yCf////////////////PXhWZgAAAAC0eFZmAAAAAKztHZ////////////////+1eFZmAAAAAA15VmYAAAAATMYcn////////////////y95VmYAAAAAL3lWZgAAAAAifRSf////////////////rnlWZgAAAAAjelZmAAAAAFItEJ////////////////8relZmAAAAAKJ6VmYAAAAArjwMn////////////////6R6VmYAAAAAFntWZgAAAAB7gwef////////////////KntWZgAAAAChe1ZmAAAAAEtvA5////////////////+ie1ZmAAAAABl8VmYAAAAANlv/nv///////////////xp8VmYAAAAAkXxWZgAAAACbT/ue////////////////knxWZgAAAAAIfVZmAAAAADH+9p7///////////////8QfVZmAAAAAId9VmYAAAAAgQPznv///////////////4h9VmYAAAAA/H1WZgAAAADT3e6e////////////////AH5WZgAAAAB2flZmAAAAAEG46p7///////////////96flZmAAAAAPB+VmYAAAAAMZvmnv////////////////J+VmYAAAAAaX9WZgAAAABWkOKe////////////////an9WZgAAAADgf1ZmAAAAAPON3p7////////////////if1ZmAAAAAFaAVmYAAAAAC2Danv///////////////1uAVmYAAAAA0YBWZgAAAACnlNWe////////////////8IBWZgAAAABegVZmAAAAADwW0Z7///////////////9vgVZmAAAAAOKBVmYAAAAA+oXMnv////////////////GBVmYAAAAAaIJWZgAAAACsK8ee////////////////loJWZgAAAAAFg1ZmAAAAALq8wp7///////////////8Rg1ZmAAAAAIeDVmYAAAAAIaW+nv///////////////42DVmYAAAAA/4NWZgAAAABQUbqe////////////////B4RWZgAAAAB+hFZmAAAAAHVDtp7///////////////+BhFZmAAAAAPWEVmYAAAAAyxuynv////////////////qEVmYAAAAAb4VWZgAAAAAiYaqe////////////////24VWZgAAAABShlZmAAAAAC3fpp7///////////////9VhlZmAAAAALmGVmYAAAAAUSyinv///////////////82GVmYAAAAAQ4dWZgAAAAAe9J2e////////////////SIdWZgAAAAC/h1ZmAAAAAB3OmZ7////////////////Gh1ZmAAAAADmIVmYAAAAAWnSVnv///////////////0aIVmYAAAAAuYhWZgAAAABSG5Ge////////////////xohWZgAAAAA5iVZmAAAAAISWjJ7///////////////9HiVZmAAAAAL6JVmYAAAAAzL6Inv///////////////8CJVmYAAAAAL4pWZgAAAADvY4Se////////////////O4pWZgAAAACvilZmAAAAAIQ0gJ7///////////////+0ilZmAAAAACqLVmYAAAAAvA18nv///////////////y2LVmYAAAAApItWZgAAAACkCXie////////////////potWZgAAAAAajFZmAAAAAD/ac57///////////////8fjFZmAAAAAJWMVmYAAAAAw/lvnv///////////////5eMVmYAAAAAB41WZgAAAACIp2ue////////////////EY1WZgAAAACGjVZmAAAAAEZ3Z57///////////////+KjVZmAAAAAAGOVmYAAAAAPWFjnv///////////////wKOVmYAAAAAeY5WZgAAAAC1dl+e////////////////fI5WZgAAAADsjlZmAAAAAEA1W57////////////////4jlZmAAAAAGmPVmYAAAAA1eJWnv///////////////3OPVmYAAAAA6I9WZgAAAADEkFKe////////////////8I9WZgAAAABnkFZmAAAAAA==", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 3232 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/4h5Ye952uZqWBng69NpL1Ghxi9GaRa3t6vJpB7BZFLZZ.json b/solana/ts/tests/accounts/jupiter_v6/multi/4h5Ye952uZqWBng69NpL1Ghxi9GaRa3t6vJpB7BZFLZZ.json new file mode 100644 index 00000000..5423e9d5 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/4h5Ye952uZqWBng69NpL1Ghxi9GaRa3t6vJpB7BZFLZZ.json @@ -0,0 +1,14 @@ +{ + "pubkey": "4h5Ye952uZqWBng69NpL1Ghxi9GaRa3t6vJpB7BZFLZZ", + "account": { + "lamports": 71437440, + "data": [ + "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", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10136 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/5Y117zFfFjBUoxATVGBaULdbwQgmx5CZ9WvX9jC6YZxq.json b/solana/ts/tests/accounts/jupiter_v6/multi/5Y117zFfFjBUoxATVGBaULdbwQgmx5CZ9WvX9jC6YZxq.json new file mode 100644 index 00000000..7f3dcb46 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/5Y117zFfFjBUoxATVGBaULdbwQgmx5CZ9WvX9jC6YZxq.json @@ -0,0 +1,14 @@ +{ + "pubkey": "5Y117zFfFjBUoxATVGBaULdbwQgmx5CZ9WvX9jC6YZxq", + "account": { + "lamports": 23385600, + "data": [ + "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", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 3232 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx.json b/solana/ts/tests/accounts/jupiter_v6/multi/6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx.json new file mode 100644 index 00000000..6df31b92 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx.json @@ -0,0 +1,14 @@ +{ + "pubkey": "6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx", + "account": { + "lamports": 1547852260, + "data": [ + "", + "base64" + ], + "owner": "11111111111111111111111111111111", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 0 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/6P4tvbzRY6Bh3MiWDHuLqyHywovsRwRpfskPvyeSoHsz.json b/solana/ts/tests/accounts/jupiter_v6/multi/6P4tvbzRY6Bh3MiWDHuLqyHywovsRwRpfskPvyeSoHsz.json new file mode 100644 index 00000000..96c79534 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/6P4tvbzRY6Bh3MiWDHuLqyHywovsRwRpfskPvyeSoHsz.json @@ -0,0 +1,14 @@ +{ + "pubkey": "6P4tvbzRY6Bh3MiWDHuLqyHywovsRwRpfskPvyeSoHsz", + "account": { + "lamports": 5713211548090, + "data": [ + "BpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAF05wCcEx+FajBi2hyyXuwbtRiRc1/fR1bb/Xwn9WYvgMrD0jUyBQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAADwHR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/6mK4Pxs6GhwnessH7CvPivqDYauiHZmAdbEFDpXFk9zt.json b/solana/ts/tests/accounts/jupiter_v6/multi/6mK4Pxs6GhwnessH7CvPivqDYauiHZmAdbEFDpXFk9zt.json new file mode 100644 index 00000000..b1b53329 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/6mK4Pxs6GhwnessH7CvPivqDYauiHZmAdbEFDpXFk9zt.json @@ -0,0 +1,14 @@ +{ + "pubkey": "6mK4Pxs6GhwnessH7CvPivqDYauiHZmAdbEFDpXFk9zt", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWF05wCcEx+FajBi2hyyXuwbtRiRc1/fR1bb/Xwn9WYvgLhc08usAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/85VBFQZC9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ.json b/solana/ts/tests/accounts/jupiter_v6/multi/85VBFQZC9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ.json new file mode 100644 index 00000000..33ce0c82 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/85VBFQZC9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ.json @@ -0,0 +1,14 @@ +{ + "pubkey": "85VBFQZC9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ", + "account": { + "lamports": 18170116713, + "data": [ + "AAAAABCld3fc0gx4S2huFRNytc4fgVMvp+uQt3SlMrDXDoaaP24UbvKGIwAGAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 82 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/8M5rjeDQKW4w4rmWFQLTqCYVuA1rMe9Z2QQ2SZResD9M.json b/solana/ts/tests/accounts/jupiter_v6/multi/8M5rjeDQKW4w4rmWFQLTqCYVuA1rMe9Z2QQ2SZResD9M.json new file mode 100644 index 00000000..bc18f139 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/8M5rjeDQKW4w4rmWFQLTqCYVuA1rMe9Z2QQ2SZResD9M.json @@ -0,0 +1,14 @@ +{ + "pubkey": "8M5rjeDQKW4w4rmWFQLTqCYVuA1rMe9Z2QQ2SZResD9M", + "account": { + "lamports": 7182720, + "data": [ + "IQsxYrVlsQ3iBB4AWAKIE8DUAQDgkwQAUiz//67TAAAAAAAAAAAAAIQ8AAB0FQAAUff//wAAAADIllZmAAAAAAAAAAAAAAAA/ggAAFD3//8IAAAB4gQAAAabiFf+q4GE+2h/Y0YYwDXaxDncGus7VZig8AAAAAABxvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWET6TU4FKJPkTdUpPtO4+VskpftUxCjlLz72bPeljoTnbacV8qWmEp93sjHPkyDJMQziSWAnavXd2b+Z6qvTkDoAAAAAAAAAAAAAAAAAAAAAP7zIERSwsjzdXXYp+ML0Up9cSrp+/GpLweE+SsvY2H6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALRNkYlp21SlcoUdMdd98/aoe8K2udufwPw+ElptVtV8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXtTPKR+NNKsFfqaFqQdg/HlsESiTLUfN0H8PJrjVQRAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 904 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj.json b/solana/ts/tests/accounts/jupiter_v6/multi/8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj.json new file mode 100644 index 00000000..d004debd --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj.json @@ -0,0 +1,14 @@ +{ + "pubkey": "8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj", + "account": { + "lamports": 11637120, + "data": [ + "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", + "base64" + ], + "owner": "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 1544 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/9iFER3bpjf1PTTCQCfTRu17EJgvsxo9pVyA9QWwEuX4x.json b/solana/ts/tests/accounts/jupiter_v6/multi/9iFER3bpjf1PTTCQCfTRu17EJgvsxo9pVyA9QWwEuX4x.json new file mode 100644 index 00000000..8619f8e5 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/9iFER3bpjf1PTTCQCfTRu17EJgvsxo9pVyA9QWwEuX4x.json @@ -0,0 +1,14 @@ +{ + "pubkey": "9iFER3bpjf1PTTCQCfTRu17EJgvsxo9pVyA9QWwEuX4x", + "account": { + "lamports": 1705200, + "data": [ + "2vQhaMvLK2/5BAAMQp0XD//kFvH0bshXTH95CgVQFr7cVCJx/Cp2eMCy6cDUAQBkAAAAAQBAnAAAAAAAAN2JaHqSiXZJS7Te58XKrpNlU2qJ9oFAfTjo+MajHRPDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 117 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/9keEfR6WRzJ5AXN55RQ6RrM1dFYz6qzeAUH3i83eTHkM.json b/solana/ts/tests/accounts/jupiter_v6/multi/9keEfR6WRzJ5AXN55RQ6RrM1dFYz6qzeAUH3i83eTHkM.json new file mode 100644 index 00000000..c52785ec --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/9keEfR6WRzJ5AXN55RQ6RrM1dFYz6qzeAUH3i83eTHkM.json @@ -0,0 +1,14 @@ +{ + "pubkey": "9keEfR6WRzJ5AXN55RQ6RrM1dFYz6qzeAUH3i83eTHkM", + "account": { + "lamports": 71437440, + "data": [ + "XI5c3AWURrX//////////wEAAAAAAAAAxatD1NzrKav1flGTqdJew+SLRTnw+uc6zon+K5jxJ3UAAAAAAAAAAAAAAAAAAAAA/01dnegISVoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAF4ELWPa6o1sAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbQmbo1OgA10AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAptfRu/jMaF4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAud5viypV018AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALwem0ntNQ2EAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA5eD3Uc7KuGIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYwmZ+VPiM2QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA35XHZCptGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAGlMkrVg2O2cAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAq4xMcteex2gAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAABRl0UYv5WWoAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAA/zJlkUld8msAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAmrfGJj/hkG0AAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAACULMBPKcNW8AAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAbinzckKo4HAAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAA7sTfZ2wbknIAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAU6Vu6QgPSnQAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAA2b4Ncg+cCHYAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAArMpxW9fbzXcAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAZHW8ThnomXkAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAA1T4ouvDabHsAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAxz9PTN3ORn0AAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAnlsidcTeJ38AAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAl7am7PIlEIEAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAALJ2PPx7A/4IAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAQF7LYWbJ9oQAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAATvAZR1de9YYAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAWpHEgeqb+4gAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAkuqN54ifCYsAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAA5JryPAyHH40AAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAdWfS5sBwPY8AAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAIa6aomd7Y5EAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAlRQLRTfGkZMAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAfs6tf95wyJUAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAtjYdrYWbB5gAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAAGNowpNBmT5oAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAA93YskuDzn5wAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAACNoL3FVk+Z4AAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP2G3AAAAAAA0+gGB1LaW6EAAAAAAAAAAAAAAAAAAAAA/YbcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANaRRQEAAAAAuJJpqHl4x6MAAAAAAAAAAAAAAAAAAAAA1pFFAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL0LmgEAAAAA9svbXPZhPKYAAAAAAAAAAAAAAAAAAAAAvQuaAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO+uBQEAAAAAOSI2x3i6uqgAAAAAAAAAAAAAAAAAAAAA764FAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAO+uBQEAAAAA2+f/ljqmQqsAAAAAAAAAAAAAAAAAAAAA764FAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAYWK0lgBK1K0AAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAndnswRzLb7AAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAwteNY3BPFbMAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAA1l4WPG79xLUAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAV04wsBz8frgAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAArauh/xdzQ7sAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADLsAD9rCcYKAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWVwvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAxvm+hJSKEr4AAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACpfOkacsLoOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFsBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAw0d//GBr7MAAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADhiisZR+IIOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH8s/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAChxT1+g+0cMAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIidLbAFE0wOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxtk+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAATeDfkjYvwcYAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADNnlJQq+xUOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/us9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAT/TBHPZmvMkAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADm/vnPAsOANAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAugE9AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAATBB4PncRw8wAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJqlrE3HM6wNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA7Ro8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAABiWbErBa1c8AAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIjGPkUkeXgNAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAiTc7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAim6Ggz9v89IAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABF8RSPhfaALAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArQs6AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAA4feT0298HdYAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKWUWWJaFPYJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM+s4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAClkSLzmwU9kAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOW/QgxfrXYIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmdU3AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAA5gUZSEQ5ltwAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKT8RZ8p5h8HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZco2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAERRh/OxG5d8AAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArvlZ/Sgu8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJMk1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAQO9IBUUJQeMAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHKK4gXec+MEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbdE0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAUgcqshaxqeYAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJ+9OWIgy/kDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA2eIzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAAWhkoredvH+oAAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMByB9y+uzADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADf0yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSpRAIAAAAA70yiyvt3ou0AAAAAAAAAAAAAAAAAAAAANKlEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIPlhcOhlIYCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArR8yAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzBFgMAAAAAnPlu41f8MvEAAAAAAAAAAAAAAAAAAAAADMEWAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP9MTQACxvkBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaEoxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzBFgMAAAAACYULusQw0fQAAAAAAAAAAAAAAAAAAAAADMEWAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM4xxKLb24gBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA8HwwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzBFgMAAAAAmGnq6tFJffgAAAAAAAAAAAAAAAAAAAAADMEWAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxuH+TtfTIBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/bYvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAzBFgMAAAAAsxYK6Nh8N/wAAAAAAAAAAAAAAAAAAAAADMEWAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKEvs9oSX/UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAR/guAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10136 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/AMnF3iSQ2Z7yQRaKneUUwtdt9aF6kg6pxS2waqoJ57mX.json b/solana/ts/tests/accounts/jupiter_v6/multi/AMnF3iSQ2Z7yQRaKneUUwtdt9aF6kg6pxS2waqoJ57mX.json new file mode 100644 index 00000000..7c32985e --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/AMnF3iSQ2Z7yQRaKneUUwtdt9aF6kg6pxS2waqoJ57mX.json @@ -0,0 +1,14 @@ +{ + "pubkey": "AMnF3iSQ2Z7yQRaKneUUwtdt9aF6kg6pxS2waqoJ57mX", + "account": { + "lamports": 2074080, + "data": [ + "CT6jqF4NrLolwNd6vthlTonE0gaO21Yna303Mxd5hA4I4D3qgXYS/zpvh/e97jafH1tK2X567M4OxfjC0jszQtjCOAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcAAAA=", + "base64" + ], + "owner": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 170 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/AMxuPcXBd6XXAbuMZSp9cNqaVreDcAtn5xWgQtPwXap4.json b/solana/ts/tests/accounts/jupiter_v6/multi/AMxuPcXBd6XXAbuMZSp9cNqaVreDcAtn5xWgQtPwXap4.json new file mode 100644 index 00000000..0de9e3b2 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/AMxuPcXBd6XXAbuMZSp9cNqaVreDcAtn5xWgQtPwXap4.json @@ -0,0 +1,14 @@ +{ + "pubkey": "AMxuPcXBd6XXAbuMZSp9cNqaVreDcAtn5xWgQtPwXap4", + "account": { + "lamports": 23385600, + "data": [ + "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", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 3232 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/AxfosPGyrBuQGZ3bjE4Bgjk6tD29TNXcKxT4cq2vawo8.json b/solana/ts/tests/accounts/jupiter_v6/multi/AxfosPGyrBuQGZ3bjE4Bgjk6tD29TNXcKxT4cq2vawo8.json new file mode 100644 index 00000000..3165a943 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/AxfosPGyrBuQGZ3bjE4Bgjk6tD29TNXcKxT4cq2vawo8.json @@ -0,0 +1,14 @@ +{ + "pubkey": "AxfosPGyrBuQGZ3bjE4Bgjk6tD29TNXcKxT4cq2vawo8", + "account": { + "lamports": 211131645188, + "data": [ + "BpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAHkK8xnGUnYYa69/Au7WXIJjm1fT8qU67BuAwUChw5aNxQfTigxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAADwHR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/BhA6Xc9TK1qqjpASjokZr5bQzcoMUhGFwCEnqFukYtCg.json b/solana/ts/tests/accounts/jupiter_v6/multi/BhA6Xc9TK1qqjpASjokZr5bQzcoMUhGFwCEnqFukYtCg.json new file mode 100644 index 00000000..affcd92e --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/BhA6Xc9TK1qqjpASjokZr5bQzcoMUhGFwCEnqFukYtCg.json @@ -0,0 +1,14 @@ +{ + "pubkey": "BhA6Xc9TK1qqjpASjokZr5bQzcoMUhGFwCEnqFukYtCg", + "account": { + "lamports": 72161280, + "data": [ + "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AAAAAAAAAACUuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACVuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACWuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACXuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACZuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACauv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACbuv//BpwO2vj///////////////pj8SUHAAAAAAAAAAAAAADCLTuFGtwOAAAAAAAAAAAA0wFu9a+HAgAAAAAAAAAAAAeAOLFDhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACcuv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACduv//AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACeuv//LTxKOAAAAAAAAAAAAAAAAC08SjgAAAAAAAAAAAAAAAARmyK6nsAFAAAAAAAAAAAAIXiYVNb5AAAAAAAAAAAAANgK6MssLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACfuv//TKH13Ev+/////////////7ReCiO0AQAAAAAAAAAAAACdTM3l5IcEAAAAAAAAAAAAFh41A5rFAAAAAAAAAAAAAOA1oi4ZJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "base64" + ], + "owner": "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10240 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo.json b/solana/ts/tests/accounts/jupiter_v6/multi/BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo.json new file mode 100644 index 00000000..1c735903 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo.json @@ -0,0 +1,14 @@ +{ + "pubkey": "BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo", + "account": { + "lamports": 8342482, + "data": [ + "BpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAFPS2wOQQj9KmokeOrgrMWdshu07fURwWLPYC0eDAkB++ItYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAADwHR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo.json b/solana/ts/tests/accounts/jupiter_v6/multi/CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo.json new file mode 100644 index 00000000..a46abc2a --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo.json @@ -0,0 +1,14 @@ +{ + "pubkey": "CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo", + "account": { + "lamports": 10574116480, + "data": [ + "AAAAAF6FlBDp84quKJTnIC3eZq7d8SbOoKlPCfCAsA30E9mW3tvl+ORZAAAFAQEAAABehZQQ6fOKriiU5yAt3mau3fEmzqCpTwnwgLAN9BPZlgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAbABehZQQ6fOKriiU5yAt3mau3fEmzqCpTwnwgLAN9BPZll6FlBDp84quKJTnIC3eZq7d8SbOoKlPCfCAsA30E9mWfBQuNwAAAADHAQAAAAAAAACg3sWtyTU2AADJAQAAAAAAAACg3sWtyTU2sgI=", + "base64" + ], + "owner": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 278 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/CVvxB22CKc2o2RiHVnyhHQVAngtKzyGkQFB3UPqD4HdL.json b/solana/ts/tests/accounts/jupiter_v6/multi/CVvxB22CKc2o2RiHVnyhHQVAngtKzyGkQFB3UPqD4HdL.json new file mode 100644 index 00000000..d30e1cd9 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/CVvxB22CKc2o2RiHVnyhHQVAngtKzyGkQFB3UPqD4HdL.json @@ -0,0 +1,14 @@ +{ + "pubkey": "CVvxB22CKc2o2RiHVnyhHQVAngtKzyGkQFB3UPqD4HdL", + "account": { + "lamports": 7182720, + "data": [ + "IQsxYrVlsQ1AHywBsASIE0wdAADwSQIARfL//7sNAAAAAAAAAAAAAAAAAAAAAAAAZgAAAAAAAABRi1ZmAAAAAAAAAAAAAAAA/H0AAGYAAAB9AAAAAAAAAGkn/cAeqQb5bXE3h0zdetrQDKNXZGGTEOVBlseB2E1bBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAHhS9ERtaH05Kok01icnEStgknWWUuwXUVhtYWdx2AKbNWN4ODqZFAl0ylfn8Eo8nAomEVkTsZ84Q+Yl046dmXUAAAAAAAAAAAAAAAAAAAAAFHd+n01qBISSiluOrh5Pt8AxOeitb1p/qhb1PVqqJaHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAixgCMHEGypEJ+IDlqbNuQcURoaDWmhmmvYqY13t2v10AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADWA3veWJ8uzuzK0K7HW+0zyEFXqfL611OhlRFlbln0OwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 904 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/DCPM7ynTcsGbday27kM21MoQMVzWxEEUk4qZ65qKrwWb.json b/solana/ts/tests/accounts/jupiter_v6/multi/DCPM7ynTcsGbday27kM21MoQMVzWxEEUk4qZ65qKrwWb.json new file mode 100644 index 00000000..b35f6946 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/DCPM7ynTcsGbday27kM21MoQMVzWxEEUk4qZ65qKrwWb.json @@ -0,0 +1,14 @@ +{ + "pubkey": "DCPM7ynTcsGbday27kM21MoQMVzWxEEUk4qZ65qKrwWb", + "account": { + "lamports": 71437440, + "data": [ + "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", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10136 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/DHqUM3nbZtvuv7tm4rcAbbWSMX99hnPQvEmDQ2EyGfg3.json b/solana/ts/tests/accounts/jupiter_v6/multi/DHqUM3nbZtvuv7tm4rcAbbWSMX99hnPQvEmDQ2EyGfg3.json new file mode 100644 index 00000000..b6611aae --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/DHqUM3nbZtvuv7tm4rcAbbWSMX99hnPQvEmDQ2EyGfg3.json @@ -0,0 +1,14 @@ +{ + "pubkey": "DHqUM3nbZtvuv7tm4rcAbbWSMX99hnPQvEmDQ2EyGfg3", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWFtJurEnd6kpq039jDJgTMkn0m2H8bVuMykeeSEkwavNKKEY5wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/DNbwqtq4iKBmnjxGpjw6c1RHfukdeLSnq2LVTfQtAguL.json b/solana/ts/tests/accounts/jupiter_v6/multi/DNbwqtq4iKBmnjxGpjw6c1RHfukdeLSnq2LVTfQtAguL.json new file mode 100644 index 00000000..9c24cace --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/DNbwqtq4iKBmnjxGpjw6c1RHfukdeLSnq2LVTfQtAguL.json @@ -0,0 +1,14 @@ +{ + "pubkey": "DNbwqtq4iKBmnjxGpjw6c1RHfukdeLSnq2LVTfQtAguL", + "account": { + "lamports": 2447272018379, + "data": [ + "BpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAHnJJa1TTchD6t2N/cF1fsAP4IIAiEADNpGJRgOnxnToNtjqMw5AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAADwHR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/DS4251KfVSStaRxMVZUxwbzE4AXhzxgMruZ5QM9QdEqJ.json b/solana/ts/tests/accounts/jupiter_v6/multi/DS4251KfVSStaRxMVZUxwbzE4AXhzxgMruZ5QM9QdEqJ.json new file mode 100644 index 00000000..4171c50d --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/DS4251KfVSStaRxMVZUxwbzE4AXhzxgMruZ5QM9QdEqJ.json @@ -0,0 +1,14 @@ +{ + "pubkey": "DS4251KfVSStaRxMVZUxwbzE4AXhzxgMruZ5QM9QdEqJ", + "account": { + "lamports": 71437440, + "data": [ + "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", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10136 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/DoPuiZfJu7sypqwR4eiU7C5TMcmmiFoU4HaF5SoD8mRy.json b/solana/ts/tests/accounts/jupiter_v6/multi/DoPuiZfJu7sypqwR4eiU7C5TMcmmiFoU4HaF5SoD8mRy.json new file mode 100644 index 00000000..f6822a69 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/DoPuiZfJu7sypqwR4eiU7C5TMcmmiFoU4HaF5SoD8mRy.json @@ -0,0 +1,14 @@ +{ + "pubkey": "DoPuiZfJu7sypqwR4eiU7C5TMcmmiFoU4HaF5SoD8mRy", + "account": { + "lamports": 13641600, + "data": [ + "PJYk22GAi5l05wCcEx+FajBi2hyyXuwbtRiRc1/fR1bb/Xwn9WYvgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAEAgAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=", + "base64" + ], + "owner": "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 1832 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/EJcnUbFntxsjPB9yZBEjUxoFTtgwCLWU7LYGPuvXMpHS.json b/solana/ts/tests/accounts/jupiter_v6/multi/EJcnUbFntxsjPB9yZBEjUxoFTtgwCLWU7LYGPuvXMpHS.json new file mode 100644 index 00000000..6a566c68 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/EJcnUbFntxsjPB9yZBEjUxoFTtgwCLWU7LYGPuvXMpHS.json @@ -0,0 +1,14 @@ +{ + "pubkey": "EJcnUbFntxsjPB9yZBEjUxoFTtgwCLWU7LYGPuvXMpHS", + "account": { + "lamports": 7182720, + "data": [ + "IQsxYrVlsQ3QBywBsASIE0wdAADwSQIAjPT//3QLAAAAAAAAAAAAABAnAAAAAAAAIwAAAAAAAABQllZmAAAAAAAAAAAAAAAA/ZYAACQAAACWAAAAAAAAAMb6evO+2606PWXzaqvJdDGxu+TC0vbg5HymAgNFL11haSf9wB6pBvltcTeHTN162tAMo1dkYZMQ5UGWx4HYTVsKPc6k8usiSzS5AIXz2l3c4BankboWZoMu9mdyQemoLh/dcGDmrodF9JQLb8INucXO3Uq5IlEzGJgK9S2Jk6LbAAAAAAAAAAAAAAAAAAAAAFHd+n01qBISSiluOrh5Pt8AxOeitb1p/qhb1PVqqJaHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQ1/BUIr6a8e3bgeWQpT99CfmGYE4vmTXLt0BP+Hjma4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJkQEWWUZR9bRtKV4Cv/vgOX5VHaQwJCLIzYmEMpp5lgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 904 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v.json b/solana/ts/tests/accounts/jupiter_v6/multi/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v.json new file mode 100644 index 00000000..9f19c6ed --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v.json @@ -0,0 +1,14 @@ +{ + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "account": { + "lamports": 261588945306, + "data": [ + "AQAAABzjWe1aAS4E+hQrnHUaHF6Hz9CgFhuchf/TG3jN/Nj2+nA/9WnhCAAGAQEAAAAqnl7btTwEZ5CY/3sSZRcUQ0/AjFYqmjuGEQXmctQicw==", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 82 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/Ebbpz3PWLaQxj2oyK967RgEPbcPypjQCoZ3tpB4fwLsk.json b/solana/ts/tests/accounts/jupiter_v6/multi/Ebbpz3PWLaQxj2oyK967RgEPbcPypjQCoZ3tpB4fwLsk.json new file mode 100644 index 00000000..5ac0a385 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/Ebbpz3PWLaQxj2oyK967RgEPbcPypjQCoZ3tpB4fwLsk.json @@ -0,0 +1,14 @@ +{ + "pubkey": "Ebbpz3PWLaQxj2oyK967RgEPbcPypjQCoZ3tpB4fwLsk", + "account": { + "lamports": 1003145920, + "data": [ + "AQH+Bt324e51j94YQl285GzN2rYa/E2DuQ0n/r35KNihi/zdFMXgLUXEQpI3oPcaUUjFTHwENbUy/5jTEO6x1oDAk7fU9AQYC46SJRkfDjeeTAAp6wSO+JDBglX0v+R2pZ/PCT6jqF4NrLolwNd6vthlTonE0gaO21Yna303Mxd5hA6oOKNkuFwq5UtUGYvpV71L0O9JTuSfVe2QKc62cNcaMAabiFf+q4GE+2h/Y0YYwDXaxDncGus7VZig8AAAAAABiwv0OsRvsYvx6A3k1dGLei0f3kFMG9Ce2d2h7nwf5N4UAAAAAAAAAOgDAAAAAAAABQAAAAAAAADoAwAAAAAAAAAAAAAAAAAA6AMAAAAAAAAUAAAAAAAAAOgDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "FLUXubRmkEi2q6K3Y9kBPg9248ggaZVsoSFhtJHSrm1X", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 324 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/FNdKRVxLgzEvRBvFqSJ687isQRDqNoAS4hPM7iyXQ9gf.json b/solana/ts/tests/accounts/jupiter_v6/multi/FNdKRVxLgzEvRBvFqSJ687isQRDqNoAS4hPM7iyXQ9gf.json new file mode 100644 index 00000000..5b505991 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/FNdKRVxLgzEvRBvFqSJ687isQRDqNoAS4hPM7iyXQ9gf.json @@ -0,0 +1,14 @@ +{ + "pubkey": "FNdKRVxLgzEvRBvFqSJ687isQRDqNoAS4hPM7iyXQ9gf", + "account": { + "lamports": 21403058646, + "data": [ + "BpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAGq2dJcT9N7Ki5XYP/IEWSHXlMspizwuOsWnpy1TXdes+ajmfsEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEAAADwHR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/Ft1URsGGW7phzUQWwoDL3ijBuBAE46M2AiPguZKLXUWN.json b/solana/ts/tests/accounts/jupiter_v6/multi/Ft1URsGGW7phzUQWwoDL3ijBuBAE46M2AiPguZKLXUWN.json new file mode 100644 index 00000000..e06d553b --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/Ft1URsGGW7phzUQWwoDL3ijBuBAE46M2AiPguZKLXUWN.json @@ -0,0 +1,14 @@ +{ + "pubkey": "Ft1URsGGW7phzUQWwoDL3ijBuBAE46M2AiPguZKLXUWN", + "account": { + "lamports": 2157600, + "data": [ + "qDijZLhcKuVLVBmL6Ve9S9DvSU7kn1XtkCnOtnDXGjDnJJa1TTchD6t2N/cF1fsAP4IIAiEADNpGJRgOnxnToKZt7eslCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgcAAAACAAgAMssgSgEAAAA=", + "base64" + ], + "owner": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 182 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/FtSs1FxzHXYtC6jEoNuY1SzwK95jNfJkNYNk5Qo666Dj.json b/solana/ts/tests/accounts/jupiter_v6/multi/FtSs1FxzHXYtC6jEoNuY1SzwK95jNfJkNYNk5Qo666Dj.json new file mode 100644 index 00000000..ae9625f0 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/FtSs1FxzHXYtC6jEoNuY1SzwK95jNfJkNYNk5Qo666Dj.json @@ -0,0 +1,14 @@ +{ + "pubkey": "FtSs1FxzHXYtC6jEoNuY1SzwK95jNfJkNYNk5Qo666Dj", + "account": { + "lamports": 71437440, + "data": [ + "XI5c3AWURrXf/////////wEAAAAAAAAAbSbqxJ3epKatN/YwyYEzJJ9Jth/G1bjMpHnkhJMGrzQAAAAAAAAAAAAAAAAAAAAAf4JI5cf0XCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA0C1rY/g4ZSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABoLTRtp+bSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUuhD6G3GdSgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdveQoLMPfigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdHehyKtahigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUmVuuVanjigAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAz/YCzLT1ligAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIJ58WcZFnygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAqg0Lu4uXpygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwjvwSQXrrygAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZ2aAXzNAuCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10136 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG.json b/solana/ts/tests/accounts/jupiter_v6/multi/G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG.json new file mode 100644 index 00000000..573e38f1 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG.json @@ -0,0 +1,14 @@ +{ + "pubkey": "G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWFPS2wOQQj9KmokeOrgrMWdshu07fURwWLPYC0eDAkB+2mZGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/GATnWZVf9m241QDCemXvEZqnrQFud8Af8dEqZMjHD39u.json b/solana/ts/tests/accounts/jupiter_v6/multi/GATnWZVf9m241QDCemXvEZqnrQFud8Af8dEqZMjHD39u.json new file mode 100644 index 00000000..40a1be59 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/GATnWZVf9m241QDCemXvEZqnrQFud8Af8dEqZMjHD39u.json @@ -0,0 +1,14 @@ +{ + "pubkey": "GATnWZVf9m241QDCemXvEZqnrQFud8Af8dEqZMjHD39u", + "account": { + "lamports": 2039280, + "data": [ + "aSf9wB6pBvltcTeHTN162tAMo1dkYZMQ5UGWx4HYTVuq2dJcT9N7Ki5XYP/IEWSHXlMspizwuOsWnpy1TXdeswjusV8MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/GMgh4NtWrGaUf1RR2kcXD7LY1jou1qFAuSsQeKp5ow4a.json b/solana/ts/tests/accounts/jupiter_v6/multi/GMgh4NtWrGaUf1RR2kcXD7LY1jou1qFAuSsQeKp5ow4a.json new file mode 100644 index 00000000..677cb618 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/GMgh4NtWrGaUf1RR2kcXD7LY1jou1qFAuSsQeKp5ow4a.json @@ -0,0 +1,14 @@ +{ + "pubkey": "GMgh4NtWrGaUf1RR2kcXD7LY1jou1qFAuSsQeKp5ow4a", + "account": { + "lamports": 7182720, + "data": [ + "IQsxYrVlsQ3QBx4AWAKIE8DUAQDgkwQAwqr+/z5VAQAAAAAAAAAAAPUrAADlBAAA5Q0AAAAAAAD5llZmAAAAAAAAAAAAAAAA/QUAAOQNAAAFAAAB0AcAAMb6evO+2606PWXzaqvJdDGxu+TC0vbg5HymAgNFL11hBpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAEhtof6UMhmJtYWlzHNQq5gqj78F2enhxyISpM1VuOgKpP8Adyop4Ga5hS23Tu+/qOGVkB0tEKvkmVUVpsMxhejAAAAAAAAAAAAAAAAAAAAAFHd+n01qBISSiluOrh5Pt8AxOeitb1p/qhb1PVqqJaHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA72J6tOi8JxWx2GV7mjoS7uIc/pCddo/9bBZ6DiP8IsIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACYGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD3yYUukVpDtftnk1CHjn8g0DF09AyRa7h8htdtknRWgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 904 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/H7TY41Z55YxsyAHLuFVRNJ4bnZKgnMTKuRoipPSwsHpD.json b/solana/ts/tests/accounts/jupiter_v6/multi/H7TY41Z55YxsyAHLuFVRNJ4bnZKgnMTKuRoipPSwsHpD.json new file mode 100644 index 00000000..55cf8ff0 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/H7TY41Z55YxsyAHLuFVRNJ4bnZKgnMTKuRoipPSwsHpD.json @@ -0,0 +1,14 @@ +{ + "pubkey": "H7TY41Z55YxsyAHLuFVRNJ4bnZKgnMTKuRoipPSwsHpD", + "account": { + "lamports": 23385600, + "data": [ + "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", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 3232 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/H7qgBfnKWHHpi4ixfTehtgSGDceS23rCG498zFeAEbDZ.json b/solana/ts/tests/accounts/jupiter_v6/multi/H7qgBfnKWHHpi4ixfTehtgSGDceS23rCG498zFeAEbDZ.json new file mode 100644 index 00000000..f4e8c402 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/H7qgBfnKWHHpi4ixfTehtgSGDceS23rCG498zFeAEbDZ.json @@ -0,0 +1,14 @@ +{ + "pubkey": "H7qgBfnKWHHpi4ixfTehtgSGDceS23rCG498zFeAEbDZ", + "account": { + "lamports": 71437440, + "data": [ + "XI5c3AWURrUAAAAAAAAAAAEAAAAAAAAAqtnSXE/TeyouV2D/yBFkh15TLKYs8LjrFp6ctU13XrMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA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", + "base64" + ], + "owner": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 10136 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/JMMtEtcqujYTQDRxRhnb9jznun5kxbr1uu9JNu1ZeiL.json b/solana/ts/tests/accounts/jupiter_v6/multi/JMMtEtcqujYTQDRxRhnb9jznun5kxbr1uu9JNu1ZeiL.json new file mode 100644 index 00000000..f6aeb6d9 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/JMMtEtcqujYTQDRxRhnb9jznun5kxbr1uu9JNu1ZeiL.json @@ -0,0 +1,14 @@ +{ + "pubkey": "JMMtEtcqujYTQDRxRhnb9jznun5kxbr1uu9JNu1ZeiL", + "account": { + "lamports": 2039280, + "data": [ + "aSf9wB6pBvltcTeHTN162tAMo1dkYZMQ5UGWx4HYTVtPS2wOQQj9KmokeOrgrMWdshu07fURwWLPYC0eDAkB+wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/So11111111111111111111111111111111111111112.json b/solana/ts/tests/accounts/jupiter_v6/multi/So11111111111111111111111111111111111111112.json new file mode 100644 index 00000000..54d02038 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/So11111111111111111111111111111111111111112.json @@ -0,0 +1,14 @@ +{ + "pubkey": "So11111111111111111111111111111111111111112", + "account": { + "lamports": 563807019096, + "data": [ + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 82 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/d64w2PJasfiHDT1kNJwYfeEQjwJzPKEwhP5WK13aGMb.json b/solana/ts/tests/accounts/jupiter_v6/multi/d64w2PJasfiHDT1kNJwYfeEQjwJzPKEwhP5WK13aGMb.json new file mode 100644 index 00000000..0f9c1ae6 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/d64w2PJasfiHDT1kNJwYfeEQjwJzPKEwhP5WK13aGMb.json @@ -0,0 +1,14 @@ +{ + "pubkey": "d64w2PJasfiHDT1kNJwYfeEQjwJzPKEwhP5WK13aGMb", + "account": { + "lamports": 1461600, + "data": [ + "AQAAAOcklrVNNyEPq3Y39wXV+wA/gggCIQAM2kYlGA6fGdOg0JBNHgAAAAACAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "base64" + ], + "owner": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 82 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/jupiter_v6/multi/gyjtxRhXvimx3tfQ8PYCQu6KobCtZjQoerq8a4HjfCh.json b/solana/ts/tests/accounts/jupiter_v6/multi/gyjtxRhXvimx3tfQ8PYCQu6KobCtZjQoerq8a4HjfCh.json new file mode 100644 index 00000000..17674612 --- /dev/null +++ b/solana/ts/tests/accounts/jupiter_v6/multi/gyjtxRhXvimx3tfQ8PYCQu6KobCtZjQoerq8a4HjfCh.json @@ -0,0 +1,14 @@ +{ + "pubkey": "gyjtxRhXvimx3tfQ8PYCQu6KobCtZjQoerq8a4HjfCh", + "account": { + "lamports": 2039280, + "data": [ + "xvp6877brTo9ZfNqq8l0MbG75MLS9uDkfKYCA0UvXWHFq0PU3Ospq/V+UZOp0l7D5ItFOfD65zrOif4rmPEndTCds1UAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/payer_bern_token_2022.json b/solana/ts/tests/accounts/payer_bern_token_2022.json new file mode 100644 index 00000000..cc78b217 --- /dev/null +++ b/solana/ts/tests/accounts/payer_bern_token_2022.json @@ -0,0 +1,14 @@ +{ + "pubkey": "5uH9XJQ9gDp8Ym9vyCMVA88W61iVJ7sktBhvyMkNob17", + "account": { + "lamports": 2039280, + "data": [ + "qDijZLhcKuVLVBmL6Ve9S9DvSU7kn1XtkCnOtnDXGjAMGliG/hCT35/EOMKW+fcnW3cYtrwOFW2NM2xY8IOZbQBQfVDBPgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", + "base64" + ], + "owner": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 165 + } +} diff --git a/solana/ts/tests/accounts/payer_wsol_token.json b/solana/ts/tests/accounts/payer_wsol_token.json deleted file mode 100644 index 3bbc4964..00000000 --- a/solana/ts/tests/accounts/payer_wsol_token.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "pubkey": "DxP5ymwEd2wTDw6SMB1mpzxGgeH8uoW4DpC4gJHrHZE8", - "account": { - "lamports": 69000002039280, - "data": [ - "BpuIV/6rgYT7aH9jRhjANdrEOdwa6ztVmKDwAAAAAAEMGliG/hCT35/EOMKW+fcnW3cYtrwOFW2NM2xY8IOZbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAEAAADwHR8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "base64" - ], - "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", - "executable": false, - "rentEpoch": 18446744073709551615, - "space": 165 - } -} diff --git a/solana/ts/tests/helpers/consts.ts b/solana/ts/tests/helpers/consts.ts index 2a51f718..25d41e3e 100644 --- a/solana/ts/tests/helpers/consts.ts +++ b/solana/ts/tests/helpers/consts.ts @@ -12,6 +12,8 @@ export const FEE_UPDATER_KEYPAIR = Keypair.fromSecretKey( ); export const USDT_MINT_ADDRESS = new PublicKey("Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB"); +export const BERN_MINT_ADDRESS = new PublicKey("CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo"); +export const BONK_MINT_ADDRESS = new PublicKey("DezXAZ8z7PnrnRJjz3wXBoRgixCa6xjnB7YaB1pPB263"); export const WHIRLPOOL_PROGRAM_ID = new PublicKey("whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc"); export const WHIRLPOOL_USDC_USDT = new PublicKey("4fuUiYxTQ6QCrdSq9ouBYcTM7bqSwYTSyLueGZLTy4T4"); diff --git a/solana/ts/tests/helpers/utils.ts b/solana/ts/tests/helpers/utils.ts index 6b5e5f56..92234251 100644 --- a/solana/ts/tests/helpers/utils.ts +++ b/solana/ts/tests/helpers/utils.ts @@ -1,3 +1,4 @@ +import * as splToken from "@solana/spl-token"; import { AddressLookupTableProgram, Connection, Keypair, PublicKey } from "@solana/web3.js"; import { expectIxOk } from "@wormhole-foundation/example-liquidity-layer-solana/testing"; import { Chain } from "@wormhole-foundation/sdk-base"; @@ -19,17 +20,17 @@ export async function createLut(connection: Connection, payer: Keypair, addresse await expectIxOk(connection, [createIx], [payer]); - // Extend. - const extendIx = AddressLookupTableProgram.extendLookupTable({ - payer: payer.publicKey, - authority: payer.publicKey, - lookupTable, - addresses, - }); + for (let i = 0; i < addresses.length; i += 20) { + // Extend. + const extendIx = AddressLookupTableProgram.extendLookupTable({ + payer: payer.publicKey, + authority: payer.publicKey, + lookupTable, + addresses: addresses.slice(i, i + 20), + }); - await expectIxOk(connection, [extendIx], [payer], { - confirmOptions: { commitment: "finalized" }, - }); + await expectIxOk(connection, [extendIx], [payer]); + } return lookupTable; } @@ -38,3 +39,31 @@ export async function whichTokenProgram(connection: Connection, interfaceAccount const accInfo = await connection.getAccountInfo(interfaceAccount); return accInfo.owner; } + +export async function createAta( + connection: Connection, + payer: Keypair, + mint: PublicKey, + owner: PublicKey, +) { + const accInfo = await connection.getAccountInfo(mint); + const tokenProgram = accInfo.owner; + + const recipientToken = splToken.getAssociatedTokenAddressSync(mint, owner, true, tokenProgram); + + await expectIxOk( + connection, + [ + splToken.createAssociatedTokenAccountIdempotentInstruction( + payer.publicKey, + recipientToken, + owner, + mint, + tokenProgram, + ), + ], + [payer], + ); + + return recipientToken; +} diff --git a/solana/ts/tests/jupiterV6SwapResponses/multi_2022_to_usdc.json b/solana/ts/tests/jupiterV6SwapResponses/multi_2022_to_usdc.json new file mode 100644 index 00000000..b01458b3 --- /dev/null +++ b/solana/ts/tests/jupiterV6SwapResponses/multi_2022_to_usdc.json @@ -0,0 +1,416 @@ +{ + "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "accounts": [ + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "9ftQzKtkvAjDCxFyh1ZSwsGPC9uiaoDmKeKCYaHoqDES", + "isSigner": true, + "isWritable": false + }, + { + "pubkey": "Eug3qhZisEKKyvMGq1Y1Xg194UpeHCmQRWNo9cGXDdRe", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "Eug3qhZisEKKyvMGq1Y1Xg194UpeHCmQRWNo9cGXDdRe", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "9VUCa3uTUH1qhm9wbnNSv4rEvR7x6p7ocWXHRtaM9Nq1", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "FLUXubRmkEi2q6K3Y9kBPg9248ggaZVsoSFhtJHSrm1X", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "Ebbpz3PWLaQxj2oyK967RgEPbcPypjQCoZ3tpB4fwLsk", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "GZHYAsikiCAAeMzJ6wX2oUx8Z9eh78wKUA9WyabB53tB", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "9ftQzKtkvAjDCxFyh1ZSwsGPC9uiaoDmKeKCYaHoqDES", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "Eug3qhZisEKKyvMGq1Y1Xg194UpeHCmQRWNo9cGXDdRe", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "Ft1URsGGW7phzUQWwoDL3ijBuBAE46M2AiPguZKLXUWN", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "DNbwqtq4iKBmnjxGpjw6c1RHfukdeLSnq2LVTfQtAguL", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "d64w2PJasfiHDT1kNJwYfeEQjwJzPKEwhP5WK13aGMb", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "AMnF3iSQ2Z7yQRaKneUUwtdt9aF6kg6pxS2waqoJ57mX", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "So11111111111111111111111111111111111111112", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "8M5rjeDQKW4w4rmWFQLTqCYVuA1rMe9Z2QQ2SZResD9M", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "2LizoD7noGRmTFszBRj3P2GzfARqdGwhpimQthWTGbhn", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "DHqUM3nbZtvuv7tm4rcAbbWSMX99hnPQvEmDQ2EyGfg3", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "So11111111111111111111111111111111111111112", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "42xVpYuCFbr4FWYoMwzUjDgoUGC4dzjaLhjR71CrAQpe", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "DS4251KfVSStaRxMVZUxwbzE4AXhzxgMruZ5QM9QdEqJ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "FtSs1FxzHXYtC6jEoNuY1SzwK95jNfJkNYNk5Qo666Dj", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "GMgh4NtWrGaUf1RR2kcXD7LY1jou1qFAuSsQeKp5ow4a", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "3GbtMs4cRP3Th3GhKcZk7sUkF3skxV8FdbiG8aKp7qeh", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "AxfosPGyrBuQGZ3bjE4Bgjk6tD29TNXcKxT4cq2vawo8", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "So11111111111111111111111111111111111111112", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "H7TY41Z55YxsyAHLuFVRNJ4bnZKgnMTKuRoipPSwsHpD", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "25s6jZQYe8RB8JpoCDq3i4u6cCNfCG1xicYK7E7f3v6L", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "DCPM7ynTcsGbday27kM21MoQMVzWxEEUk4qZ65qKrwWb", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "4h5Ye952uZqWBng69NpL1Ghxi9GaRa3t6vJpB7BZFLZZ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "9iFER3bpjf1PTTCQCfTRu17EJgvsxo9pVyA9QWwEuX4x", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "6P4tvbzRY6Bh3MiWDHuLqyHywovsRwRpfskPvyeSoHsz", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "6mK4Pxs6GhwnessH7CvPivqDYauiHZmAdbEFDpXFk9zt", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "3MsJXVvievxAbsMsaT6TS4i6oMitD9jazucuq3X234tC", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "BhA6Xc9TK1qqjpASjokZr5bQzcoMUhGFwCEnqFukYtCg", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "DoPuiZfJu7sypqwR4eiU7C5TMcmmiFoU4HaF5SoD8mRy", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "3nLYkE5zHKgGBxXW8Rj4neWZT5JHgdAjVRqUDcDk8nF9", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "2W7aa5mVuzJiaM43uFtutVFdSoWx963AKT8dtizqejTF", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + } + ], + "data": "wSCbM0HWnIEHBAAAAB5kAAEmCQEEJjIBBBopAQSwMowsBQAAAP0OXTcAAAAA9AEA" +} diff --git a/solana/ts/tests/jupiterV6SwapResponses/multi_usdc_to_2022.json b/solana/ts/tests/jupiterV6SwapResponses/multi_usdc_to_2022.json new file mode 100644 index 00000000..45dde514 --- /dev/null +++ b/solana/ts/tests/jupiterV6SwapResponses/multi_usdc_to_2022.json @@ -0,0 +1,336 @@ +{ + "programId": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "accounts": [ + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "9ftQzKtkvAjDCxFyh1ZSwsGPC9uiaoDmKeKCYaHoqDES", + "isSigner": true, + "isWritable": false + }, + { + "pubkey": "9VUCa3uTUH1qhm9wbnNSv4rEvR7x6p7ocWXHRtaM9Nq1", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "Eug3qhZisEKKyvMGq1Y1Xg194UpeHCmQRWNo9cGXDdRe", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "Eug3qhZisEKKyvMGq1Y1Xg194UpeHCmQRWNo9cGXDdRe", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D8cy77BBepLMngZx6ZukaTff5hCt1HrWyKk3Hnd9oitf", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "EJcnUbFntxsjPB9yZBEjUxoFTtgwCLWU7LYGPuvXMpHS", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "gyjtxRhXvimx3tfQ8PYCQu6KobCtZjQoerq8a4HjfCh", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "39PUs23GXEdyRJ74fnSfL7L4tZgXVafirBMsbHqZyCVx", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "G4CD7aqqZZ6QKCNHrc1MPdS9Aw8BWmQ5ZkDd54W6mAEG", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "JMMtEtcqujYTQDRxRhnb9jznun5kxbr1uu9JNu1ZeiL", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "85VBFQZC9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "5Y117zFfFjBUoxATVGBaULdbwQgmx5CZ9WvX9jC6YZxq", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "2UDdWW9TNeEJa2S539ijVLLeVZt88zuiduSYD7SeSeHN", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "9keEfR6WRzJ5AXN55RQ6RrM1dFYz6qzeAUH3i83eTHkM", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "CVvxB22CKc2o2RiHVnyhHQVAngtKzyGkQFB3UPqD4HdL", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "GATnWZVf9m241QDCemXvEZqnrQFud8Af8dEqZMjHD39u", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "FNdKRVxLgzEvRBvFqSJ687isQRDqNoAS4hPM7iyXQ9gf", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "JMMtEtcqujYTQDRxRhnb9jznun5kxbr1uu9JNu1ZeiL", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "85VBFQZC9TZkfaptBWjvUw7YbZjy52A6mjtPGjstQAmQ", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "So11111111111111111111111111111111111111112", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "AMxuPcXBd6XXAbuMZSp9cNqaVreDcAtn5xWgQtPwXap4", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "D1ZN9Wj1fRSUQfCjhvnu1hqDMT7hzjzBBpi12nVniYD6", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "2qr4UqV7vdJ1TLLX2YGZ7fBJ9U96UwAFAjwLK572TJ4h", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "H7qgBfnKWHHpi4ixfTehtgSGDceS23rCG498zFeAEbDZ", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "FLUXubRmkEi2q6K3Y9kBPg9248ggaZVsoSFhtJHSrm1X", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "Ebbpz3PWLaQxj2oyK967RgEPbcPypjQCoZ3tpB4fwLsk", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "GZHYAsikiCAAeMzJ6wX2oUx8Z9eh78wKUA9WyabB53tB", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "6LXutJvKUw8Q5ue2gCgKHQdAN4suWW8awzFVC6XCguFx", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "BuqEDKUwyAotZuK37V4JYEykZVKY8qo1zKbpfU9gkJMo", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "DNbwqtq4iKBmnjxGpjw6c1RHfukdeLSnq2LVTfQtAguL", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "Ft1URsGGW7phzUQWwoDL3ijBuBAE46M2AiPguZKLXUWN", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "Eug3qhZisEKKyvMGq1Y1Xg194UpeHCmQRWNo9cGXDdRe", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "d64w2PJasfiHDT1kNJwYfeEQjwJzPKEwhP5WK13aGMb", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "AMnF3iSQ2Z7yQRaKneUUwtdt9aF6kg6pxS2waqoJ57mX", + "isSigner": false, + "isWritable": true + }, + { + "pubkey": "So11111111111111111111111111111111111111112", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "CKfatsPMUf8SkiURsDXs7eK6GWb4Jsd6UDbs7twMCWxo", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "isSigner": false, + "isWritable": false + }, + { + "pubkey": "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", + "isSigner": false, + "isWritable": false + } + ], + "data": "wSCbM0HWnIEHAwAAACZkAAEmZAECHmQCA+gDAAAAAAAAqU0AAAAAAAD0AQA=" +} From c74ec9aa00ee6be2f0aaf7b62d703875ca7196d3 Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Thu, 30 May 2024 09:50:47 -0500 Subject: [PATCH 26/50] solana: add docstrings (#61) Co-authored-by: gator-boi --- solana/programs/swap-layer/src/lib.rs | 135 +++++++++++++++++- .../src/processor/complete/transfer/direct.rs | 3 +- .../processor/complete/transfer/payload.rs | 7 +- .../src/processor/complete/transfer/relay.rs | 2 + 4 files changed, 139 insertions(+), 8 deletions(-) diff --git a/solana/programs/swap-layer/src/lib.rs b/solana/programs/swap-layer/src/lib.rs index c9f24bc6..99b04379 100644 --- a/solana/programs/swap-layer/src/lib.rs +++ b/solana/programs/swap-layer/src/lib.rs @@ -28,75 +28,127 @@ const MAX_BPS: u32 = 1_000_000; // 10,000.00 bps (100%) pub mod swap_layer { use super::*; + /// Initializes the swap layer. This instruction must be called once after + /// the program is deployed. This instruction initializes the `Custodian` + /// account and sets the `owner`, `fee_recipient`, `owner_assistant`, and + /// `fee_updater` fields. + /// fields. + /// + /// # Arguments + /// + /// * `ctx` - The context for the initialization. pub fn initialize(ctx: Context) -> Result<()> { processor::initialize(ctx) } + /// Adds a peer to the swap layer. The peer is identified by the `chain` and + /// `address` fields. The `relay_params` field is used to configure the relay + /// parameters for the peer (i.e., the gas dropoff and relaying fee) as well + /// as the execution parameters for the peer (i.e., chain specific execution costs). + /// + /// # Arguments + /// + /// * `ctx` - The context for adding the peer. + /// * `args` - The arguments for adding the peer. pub fn add_peer(ctx: Context, args: AddPeerArgs) -> Result<()> { processor::add_peer(ctx, args) } + /// Updates a peer in the swap layer. This allows the `owner` to update + /// the peer address and relay parameters. + /// + /// # Arguments + /// + /// * `ctx` - The context for updating the peer. + /// * `args` - The arguments for updating the peer. pub fn update_peer(ctx: Context, args: AddPeerArgs) -> Result<()> { processor::update_peer(ctx, args) } + /// Submits an ownership transfer request. + /// /// This instruction sets the `pending_owner` field in the `Custodian` account. This instruction /// can only be called by the `owner`. The `pending_owner` address must be valid, meaning it /// cannot be the zero address or the current owner. + /// /// # Arguments /// - /// * `ctx` - `SubmitOwnershipTransferRequest` context. + /// * `ctx` - The context for submitting the ownership transfer request. pub fn submit_ownership_transfer_request( ctx: Context, ) -> Result<()> { processor::submit_ownership_transfer_request(ctx) } + /// Confirms an ownership transfer request. + /// /// This instruction confirms the ownership transfer request and sets the new `owner` in the /// `Custodian` account. This instruction can only be called by the `pending_owner`. The /// `pending_owner` must be the same as the `pending_owner` in the `Custodian` account. + /// /// # Arguments /// - /// * `ctx` - `ConfirmOwnershipTransferRequest` context. + /// * `ctx` - The context for confirming the ownership transfer request. pub fn confirm_ownership_transfer_request( ctx: Context, ) -> Result<()> { processor::confirm_ownership_transfer_request(ctx) } + /// Cancels an ownership transfer request. + /// /// This instruction cancels an ownership transfer request by resetting the `pending_owner` field /// in the `Custodian` account. This instruction can only be called by the `owner`. + /// /// # Arguments /// - /// * `ctx` - `CancelOwnershipTransferRequest` context. + /// * `ctx` - The context for canceling the ownership transfer request. pub fn cancel_ownership_transfer_request( ctx: Context, ) -> Result<()> { processor::cancel_ownership_transfer_request(ctx) } + /// Updates the `fee_recipient` field in the `Custodian` account. + /// /// This instruction is used to update the `fee_recipient` field in the `Custodian` account. This - /// instruction can only be called by the `owner`. + /// instruction can only be called by the `owner`. The `fee_recipient` must be a valid token + /// account. The `fee_recipient` receives any relayer fees received by the swap layer. + /// /// # Arguments /// - /// * `ctx` - `UpdateFeeRecipient` context. + /// * `ctx` - The context for updating the fee recipient. pub fn update_fee_recipient(ctx: Context) -> Result<()> { processor::update_fee_recipient(ctx) } + /// Updates the `owner_assistant` field in the `Custodian` account. + /// /// This instruction is used to update the `owner_assistant` field in the `Custodian` account. This /// instruction can only be called by the `owner`. + /// /// # Arguments /// - /// * `ctx` - `UpdateOwnerAssistant` context. + /// * `ctx` - The context for updating the owner assistant. pub fn update_owner_assistant(ctx: Context) -> Result<()> { processor::update_owner_assistant(ctx) } + /// Updates the `fee_updater` field in the `Custodian` account. + /// + /// # Arguments + /// + /// * `ctx` - The context for updating the fee updater. pub fn update_fee_updater(ctx: Context) -> Result<()> { processor::update_fee_updater(ctx) } + /// Updates the relay parameters in the swap layer. + /// + /// # Arguments + /// + /// * `ctx` - The context for updating the relay parameters. + /// * `args` - The arguments for updating the relay parameters. pub fn update_relay_parameters( ctx: Context, args: UpdateRelayParametersArgs, @@ -104,34 +156,84 @@ pub mod swap_layer { processor::update_relay_parameters(ctx, args) } + /// Completes a transfer with relay in the swap layer. If gas dropoff is + /// specified, the program will transfer the requested number of lamports + /// from the payer to the relayer. In return, the program will transfer + /// the specified number of USDC to the `fee_recipient_token` account. + /// + /// # Arguments + /// + /// * `ctx` - The context for completing the transfer relay. pub fn complete_transfer_relay(ctx: Context) -> Result<()> { processor::complete_transfer_relay(ctx) } + /// Completes a direct transfer in the swap layer. + /// + /// # Arguments + /// + /// * `ctx` - The context for completing the direct transfer. pub fn complete_transfer_direct(ctx: Context) -> Result<()> { processor::complete_transfer_direct(ctx) } + /// Completes a payload transfer in the swap layer. This instruction stages + /// the inbound transfer and creates a custody token account for the inbound + /// transfer. The arbitrary payload is stored in the `staged_inbound` account. + /// + /// # Arguments + /// + /// * `ctx` - The context for completing the payload transfer. pub fn complete_transfer_payload(ctx: Context) -> Result<()> { processor::complete_transfer_payload(ctx) } + /// Releases an inbound transfer in the swap layer. Only the encoded + /// recipient can release the inbound transfer. + /// + /// # Arguments + /// + /// * `ctx` - The context for releasing the inbound transfer. pub fn release_inbound(ctx: Context) -> Result<()> { processor::release_inbound(ctx) } + /// Stages an outbound transfer or swap in the swap layer. + /// + /// # Arguments + /// + /// * `ctx` - The context for staging the outbound transfer. + /// * `args` - The arguments for staging the outbound transfer. pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> Result<()> { processor::stage_outbound(ctx, args) } + /// Closes the `staged_outbound` account in the swap layer. This should be executed + /// when the user decides to cancel the staged outbound transfer. This could be the + /// result of a failed swap when initiating an outbound swap. + /// + /// # Arguments + /// + /// * `ctx` - The context for closing the staged outbound. pub fn close_staged_outbound(ctx: Context) -> Result<()> { processor::close_staged_outbound(ctx) } + /// Initiates a USDC transfer in the swap layer. + /// + /// # Arguments + /// + /// * `ctx` - The context for initiating the transfer. pub fn initiate_transfer(ctx: Context) -> Result<()> { processor::initiate_transfer(ctx) } + /// Initiates a swap with exact input in the swap layer. + /// + /// # Arguments + /// + /// * `ctx` - The context for initiating the swap. + /// * `instruction_data` - The instruction data for initiating the swap. pub fn initiate_swap_exact_in<'a, 'b, 'c, 'info>( ctx: Context<'a, 'b, 'c, 'info, InitiateSwapExactIn<'info>>, instruction_data: Vec, @@ -142,6 +244,12 @@ pub mod swap_layer { processor::initiate_swap_exact_in(ctx, instruction_data) } + /// Completes a direct swap in the swap layer. + /// + /// # Arguments + /// + /// * `ctx` - The context for completing the swap. + /// * `instruction_data` - The instruction data for completing the swap. pub fn complete_swap_direct<'a, 'b, 'c, 'info>( ctx: Context<'a, 'b, 'c, 'info, CompleteSwapDirect<'info>>, instruction_data: Vec, @@ -152,6 +260,15 @@ pub mod swap_layer { processor::complete_swap_direct(ctx, instruction_data) } + /// Completes a relay swap in the swap layer. If gas dropoff is + /// specified, the program will transfer the requested number of lamports + /// from the payer to the relayer. In return, the program will transfer + /// the specified number of USDC to the `fee_recipient_token` account. + /// + /// # Arguments + /// + /// * `ctx` - The context for completing the swap. + /// * `instruction_data` - The instruction data for completing the swap. pub fn complete_swap_relay<'a, 'b, 'c, 'info>( ctx: Context<'a, 'b, 'c, 'info, CompleteSwapRelay<'info>>, instruction_data: Vec, @@ -162,6 +279,12 @@ pub mod swap_layer { processor::complete_swap_relay(ctx, instruction_data) } + /// Completes a payload swap in the swap layer. + /// + /// # Arguments + /// + /// * `ctx` - The context for completing the swap. + /// * `instruction_data` - The instruction data for completing the swap. pub fn complete_swap_payload<'a, 'b, 'c, 'info>( ctx: Context<'a, 'b, 'c, 'info, CompleteSwapPayload<'info>>, instruction_data: Vec, diff --git a/solana/programs/swap-layer/src/processor/complete/transfer/direct.rs b/solana/programs/swap-layer/src/processor/complete/transfer/direct.rs index 4e63d087..0f3b890c 100644 --- a/solana/programs/swap-layer/src/processor/complete/transfer/direct.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/direct.rs @@ -39,7 +39,8 @@ pub struct CompleteTransferDirect<'info> { recipient_token_account: Box>, /// CHECK: This account must be the owner of the recipient token account. The - /// recipient token account must be encoded in the prepared fill. + /// recipient token account must be encoded in the prepared fill. This recipient + /// must also be encoded in the swap message. recipient: UncheckedAccount<'info>, token_program: Program<'info, token::Token>, diff --git a/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs b/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs index 8f132ed3..09f5cf02 100644 --- a/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs @@ -10,7 +10,6 @@ use swap_layer_messages::types::{OutputToken, RedeemMode}; #[derive(Accounts)] pub struct CompleteTransferPayload<'info> { #[account(mut)] - /// The payer of the transaction. payer: Signer<'info>, #[account( @@ -43,6 +42,9 @@ pub struct CompleteTransferPayload<'info> { ], bump )] + /// The staged inbound account that will be created to hold the arbitrary + /// payload that the recipient will receive. This account also warehouses + /// the seeds necessary to derive the staged custody token account. staged_inbound: Account<'info, StagedInbound>, #[account( @@ -56,6 +58,9 @@ pub struct CompleteTransferPayload<'info> { ], bump, )] + /// The staged custody token account that will be created to hold the USDC + /// that the recipient will receive. This account is derived from the staged + /// inbound account. staged_custody_token: Box>, usdc: Usdc<'info>, diff --git a/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs index 0bfee293..697def56 100644 --- a/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs @@ -25,6 +25,8 @@ pub struct CompleteTransferRelay<'info> { SwapLayerError::InvalidRecipient ); + // Ensure that the swap time limit has been exceeded if the + // relayer is attempting to redeem an output token that is not USDC. match swap_msg.output_token { OutputToken::Usdc => {} OutputToken::Gas(_) | OutputToken::Other { From 41eba977d767d54657b365a591e58eac0119bb48 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Thu, 6 Jun 2024 11:23:45 -0500 Subject: [PATCH 27/50] solana: clean up initialize (#66) Co-authored-by: A5 Pickle --- solana/programs/swap-layer/src/error.rs | 1 + .../src/processor/admin/initialize.rs | 114 ++++++++---------- solana/ts/src/swapLayer/index.ts | 3 +- 3 files changed, 52 insertions(+), 66 deletions(-) diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs index 98a1e863..4528e361 100644 --- a/solana/programs/swap-layer/src/error.rs +++ b/solana/programs/swap-layer/src/error.rs @@ -31,6 +31,7 @@ pub enum SwapLayerError { PayloadTooLarge = 0x114, UnsupportedFillType = 0x115, SwapTimeLimitNotExceeded = 0x116, + ImmutableProgram = 0x118, // EVM Execution Param errors InvalidBaseFee = 0x200, diff --git a/solana/programs/swap-layer/src/processor/admin/initialize.rs b/solana/programs/swap-layer/src/processor/admin/initialize.rs index a6c384e1..8fb94907 100644 --- a/solana/programs/swap-layer/src/processor/admin/initialize.rs +++ b/solana/programs/swap-layer/src/processor/admin/initialize.rs @@ -1,7 +1,6 @@ -use crate::{composite::*, error::SwapLayerError, state::Custodian}; +use crate::{error::SwapLayerError, state::Custodian}; use anchor_lang::prelude::*; use anchor_spl::token; -//use wormhole_solana_utils::cpi::bpf_loader_upgradeable::{self, BpfLoaderUpgradeable}; #[derive(Accounts)] pub struct Initialize<'info> { @@ -26,22 +25,32 @@ pub struct Initialize<'info> { #[account( owner = Pubkey::default(), constraint = { - owner_assistant.key() != Pubkey::default() - } @ SwapLayerError::AssistantZeroPubkey + require!( + owner_assistant.key() != Pubkey::default(), + SwapLayerError::AssistantZeroPubkey + ); + + true + } )] owner_assistant: UncheckedAccount<'info>, /// CHECK: This account must not be the zero pubkey. #[account( owner = Pubkey::default(), - constraint = ( - fee_recipient.key() != Pubkey::default() - ) @ SwapLayerError::FeeRecipientZeroPubkey + constraint = { + require!( + fee_recipient.key() != Pubkey::default(), + SwapLayerError::FeeRecipientZeroPubkey + ); + + true + } )] fee_recipient: UncheckedAccount<'info>, #[account( - associated_token::mint = usdc, + associated_token::mint = common::USDC_MINT, associated_token::authority = fee_recipient, )] fee_recipient_token: Account<'info, token::TokenAccount>, @@ -50,74 +59,49 @@ pub struct Initialize<'info> { #[account( owner = Pubkey::default(), constraint = { - fee_updater.key() != Pubkey::default() - } @ SwapLayerError::FeeUpdaterZeroPubkey + require!( + fee_updater.key() != Pubkey::default(), + SwapLayerError::FeeUpdaterZeroPubkey + ); + + true + } )] fee_updater: UncheckedAccount<'info>, - usdc: Usdc<'info>, - - // #[account(address = common::USDC_MINT)] - // mint: Account<'info, token::Mint>, /// We use the program data to make sure this owner is the upgrade authority (the true owner, /// who deployed this program). - // #[account( - // mut, - // seeds = [crate::ID.as_ref()], - // bump, - // seeds::program = bpf_loader_upgradeable::id(), - // constraint = { - // program_data.upgrade_authority_address.is_some() - // } @ TokenRouterError::ImmutableProgram - // )] - // program_data: Account<'info, ProgramData>, - - /// CHECK: This program PDA will be the upgrade authority for the Token Router program. - // #[account(address = common::UPGRADE_MANAGER_AUTHORITY)] - // upgrade_manager_authority: UncheckedAccount<'info>, - - /// CHECK: This program must exist. - // #[account( - // executable, - // address = common::UPGRADE_MANAGER_PROGRAM_ID, - // )] - // upgrade_manager_program: UncheckedAccount<'info>, + #[account( + mut, + seeds = [crate::ID.as_ref()], + bump, + seeds::program = solana_program::bpf_loader_upgradeable::id(), + constraint = match program_data.upgrade_authority_address { + Some(upgrade_authority) => { + #[cfg(feature = "integration-test")] + let deployer = Pubkey::default(); + #[cfg(not(feature = "integration-test"))] + let deployer = owner.key(); + + require_keys_eq!( + deployer, + upgrade_authority, + SwapLayerError::OwnerOnly + ); + + true + }, + _ => return err!(SwapLayerError::ImmutableProgram), + } + )] + program_data: Account<'info, ProgramData>, - //bpf_loader_upgradeable_program: Program<'info, BpfLoaderUpgradeable>, system_program: Program<'info, System>, - //token_program: Program<'info, token::Token>, - //associated_token_program: Program<'info, anchor_spl::associated_token::AssociatedToken>, } pub fn initialize(ctx: Context) -> Result<()> { - let owner = ctx.accounts.owner.key(); - - // We need to check that the upgrade authority is the owner passed into the account context. - // #[cfg(not(feature = "integration-test"))] - // { - // require_keys_eq!( - // ctx.accounts.owner.key(), - // ctx.accounts.program_data.upgrade_authority_address.unwrap(), - // TokenRouterError::OwnerOnly - // ); - - // bpf_loader_upgradeable::set_upgrade_authority( - // CpiContext::new( - // ctx.accounts - // .bpf_loader_upgradeable_program - // .to_account_info(), - // bpf_loader_upgradeable::SetUpgradeAuthority { - // program_data: ctx.accounts.program_data.to_account_info(), - // current_authority: ctx.accounts.owner.to_account_info(), - // new_authority: Some(ctx.accounts.upgrade_manager_authority.to_account_info()), - // }, - // ), - // &crate::id(), - // )?; - // } - ctx.accounts.custodian.set_inner(Custodian { - owner, + owner: ctx.accounts.owner.key(), pending_owner: None, owner_assistant: ctx.accounts.owner_assistant.key(), fee_updater: ctx.accounts.fee_updater.key(), diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index afd9f3a8..038e747e 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -19,6 +19,7 @@ import IDL from "../../../target/idl/swap_layer.json"; import { SwapLayer } from "../../../target/types/swap_layer"; import { OutputToken, encodeOutputToken } from "./messages"; import { Custodian, Peer, RedeemOption, RelayParams, StagedInbound, StagedOutbound } from "./state"; +import { programDataAddress } from "./utils"; export const PROGRAM_IDS = ["SwapLayer1111111111111111111111111111111111"] as const; @@ -299,7 +300,7 @@ export class SwapLayerProgram { feeRecipient, ), feeUpdater, - usdc: this.usdcComposite(), + programData: programDataAddress(this.ID), systemProgram: SystemProgram.programId, }) .instruction(); From eadb21d1e4114d0f89966fc5fe2dfb9e1cea2e11 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:38:52 -0500 Subject: [PATCH 28/50] solana: add exact in arg (#68) Co-authored-by: A5 Pickle --- solana/programs/swap-layer/src/error.rs | 4 +- .../src/processor/initiate/swap/exact_in.rs | 7 +- .../src/processor/stage_outbound.rs | 43 ++++- .../swap-layer/src/state/staged/outbound.rs | 3 + solana/ts/src/swapLayer/index.ts | 1 + .../ts/src/swapLayer/state/StagedOutbound.ts | 1 + solana/ts/tests/01__transfer.ts | 177 +++++++++++++++++- solana/ts/tests/10__swap.ts | 6 +- 8 files changed, 228 insertions(+), 14 deletions(-) diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs index 4528e361..63900077 100644 --- a/solana/programs/swap-layer/src/error.rs +++ b/solana/programs/swap-layer/src/error.rs @@ -49,12 +49,14 @@ pub enum SwapLayerError { RelayingFeeExceedsMinAmountOut = 0x260, ZeroMinAmountOut = 0x262, DelegatedAmountMismatch = 0x264, + ExactInRequired = 0x266, + InsufficientAmountIn = 0x268, // Swap SwapPastDeadline = 0x300, InvalidLimitAmount = 0x302, InvalidSwapType = 0x304, - AmountOutTooSmall = 0x306, + InsufficientAmountOut = 0x306, InvalidSourceResidual = 0x308, SourceResidualMismatch = 0x30a, diff --git a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs index 05386b9c..0182ee70 100644 --- a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs +++ b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs @@ -27,7 +27,10 @@ pub struct InitiateSwapExactIn<'info> { /// the transfer. /// /// This account may be closed by the end of the instruction if there is no dust after the swap. - #[account(mut)] + #[account( + mut, + constraint = staged_outbound.info.is_exact_in @ SwapLayerError::ExactInRequired, + )] staged_outbound: Account<'info, StagedOutbound>, /// This custody token account may be closed by the end of the instruction if there is no dust @@ -211,7 +214,7 @@ where { require!( usdc_amount_out > relaying_fee.into(), - SwapLayerError::AmountOutTooSmall + SwapLayerError::InsufficientAmountOut ); } diff --git a/solana/programs/swap-layer/src/processor/stage_outbound.rs b/solana/programs/swap-layer/src/processor/stage_outbound.rs index d748ce79..076fac46 100644 --- a/solana/programs/swap-layer/src/processor/stage_outbound.rs +++ b/solana/programs/swap-layer/src/processor/stage_outbound.rs @@ -99,7 +99,20 @@ pub struct StageOutbound<'info> { usdc_refund_token: Box>, /// Mint can either be USDC or whichever mint is used to swap into USDC. - #[account(token::token_program = src_token_program)] + #[account( + token::token_program = src_token_program, + constraint = { + if sender_token.is_none() { + require_keys_eq!( + src_mint.key(), + token::spl_token::native_mint::ID, + SwapLayerError::InvalidSourceMint, + ); + } + + true + } + )] src_mint: Box>, src_token_program: Interface<'info, token_interface::TokenInterface>, @@ -112,6 +125,13 @@ pub struct StageOutbound<'info> { pub struct StageOutboundArgs { pub amount_in: u64, + /// This argument only applies to relays. If exact in is specified, the relaying fee will be + /// removed from the amount in. Otherwise it will be added to the amount in to guarantee the + /// USDC amount specified above. + /// + /// For swaps, this argument will determine whether which initiate swap instruction to use. + pub is_exact_in: bool, + /// The Wormhole chain ID of the network to transfer tokens to. pub target_chain: u16, @@ -132,6 +152,7 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R let StageOutboundArgs { amount_in, + is_exact_in, target_chain, recipient, redeem_option, @@ -148,6 +169,10 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R let is_usdc = ctx.accounts.src_mint.key() == common::USDC_MINT; + // Swap layer does not support exact out for swaps (yet). We catch this before we reach the + // initiate swap instruction. + require!(is_usdc || is_exact_in, SwapLayerError::ExactInRequired); + // We need to determine the relayer fee. This fee will either be paid for right now if // StagedInput::Usdc or will be deducted from the USDC after a resulting swap from the source // mint. @@ -174,9 +199,18 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R ( if is_usdc { - relaying_fee - .checked_add(amount_in) - .ok_or(SwapLayerError::U64Overflow)? + if is_exact_in { + require!( + amount_in > relaying_fee, + SwapLayerError::InsufficientAmountIn + ); + + amount_in + } else { + amount_in + .checked_add(relaying_fee) + .ok_or(SwapLayerError::U64Overflow)? + } } else { amount_in }, @@ -291,6 +325,7 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R usdc_refund_token: ctx.accounts.usdc_refund_token.key(), sender, target_chain, + is_exact_in, recipient, }, staged_redeem, diff --git a/solana/programs/swap-layer/src/state/staged/outbound.rs b/solana/programs/swap-layer/src/state/staged/outbound.rs index fb839401..b28d1988 100644 --- a/solana/programs/swap-layer/src/state/staged/outbound.rs +++ b/solana/programs/swap-layer/src/state/staged/outbound.rs @@ -45,6 +45,9 @@ pub struct StagedOutboundInfo { /// Intended recipient of the transfer. pub recipient: [u8; 32], + /// This value is only checked for swaps. + pub is_exact_in: bool, + /// The specified token account to refund USDC. This account is required by the Token Router /// program in case a fast order is reverted at the Matching Engine after it has been placed. pub usdc_refund_token: Pubkey, diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 038e747e..4ac81335 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -529,6 +529,7 @@ export class SwapLayerProgram { args: { transferType: "native" | "programTransferAuthority" | "sender"; amountIn: Uint64; + isExactIn: boolean; targetChain: ChainId; recipient: Array; redeemOption: diff --git a/solana/ts/src/swapLayer/state/StagedOutbound.ts b/solana/ts/src/swapLayer/state/StagedOutbound.ts index d0105618..a8d861a1 100644 --- a/solana/ts/src/swapLayer/state/StagedOutbound.ts +++ b/solana/ts/src/swapLayer/state/StagedOutbound.ts @@ -23,6 +23,7 @@ export type StagedOutboundInfo = { sender: PublicKey; targetChain: number; recipient: Array; + isExactIn: boolean; usdcRefundToken: PublicKey; }; diff --git a/solana/ts/tests/01__transfer.ts b/solana/ts/tests/01__transfer.ts index a22f041d..5ef1d7f3 100644 --- a/solana/ts/tests/01__transfer.ts +++ b/solana/ts/tests/01__transfer.ts @@ -58,7 +58,7 @@ import { FEE_UPDATER_KEYPAIR, REGISTERED_PEERS, createLut, tryNativeToUint8Array const SOLANA_CHAIN_ID = toChainId("Solana"); -describe("Swap Layer", () => { +describe("Swap Layer -- Admin and USDC Transfer", () => { const connection = new Connection(LOCALHOST, "processed"); const payer = PAYER_KEYPAIR; const owner = OWNER_KEYPAIR; @@ -1110,6 +1110,40 @@ describe("Swap Layer", () => { describe("Business Logic", function () { describe("Stage Outbound", function () { describe("Native", function () { + it("Cannot Stage Outbound (Exact In Required)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 690000n; + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + stagedOutbound, + usdcRefundToken: splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ), + sender: null, + }, + { + transferType: "native", + amountIn, + isExactIn: false, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNull(approveIx); + + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "Error Code: ExactInRequired", + ); + }); it("Cannot Stage Outbound (Sender Required)", async function () { const stagedOutboundSigner = Keypair.generate(); const stagedOutbound = stagedOutboundSigner.publicKey; @@ -1128,6 +1162,7 @@ describe("Swap Layer", () => { { transferType: "native", amountIn, + isExactIn: true, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: null, @@ -1140,7 +1175,7 @@ describe("Swap Layer", () => { connection, [ix], [payer, stagedOutboundSigner], - "rror Code: SenderRequired", + "Error Code: SenderRequired", ); }); @@ -1177,6 +1212,7 @@ describe("Swap Layer", () => { { transferType: "native", amountIn, + isExactIn: true, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: null, @@ -1202,6 +1238,7 @@ describe("Swap Layer", () => { sender, targetChain: foreignChain, recipient: foreignRecipientAddress, + isExactIn: true, usdcRefundToken, }, { direct: {} }, @@ -1230,6 +1267,7 @@ describe("Swap Layer", () => { { transferType: "programTransferAuthority", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: null, @@ -1265,6 +1303,7 @@ describe("Swap Layer", () => { { transferType: "programTransferAuthority", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: null, @@ -1296,6 +1335,7 @@ describe("Swap Layer", () => { sender: payer.publicKey, targetChain: foreignChain, recipient: foreignRecipientAddress, + isExactIn: false, usdcRefundToken: senderToken, }, { direct: {} }, @@ -1323,6 +1363,7 @@ describe("Swap Layer", () => { { transferType: "programTransferAuthority", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: { @@ -1357,6 +1398,7 @@ describe("Swap Layer", () => { sender: payer.publicKey, targetChain: foreignChain, recipient: foreignRecipientAddress, + isExactIn: false, usdcRefundToken: senderToken, }, { payload: { "0": Buffer.from("All your base are belong to us.") } }, @@ -1386,6 +1428,7 @@ describe("Swap Layer", () => { { transferType: "sender", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: null, @@ -1432,6 +1475,7 @@ describe("Swap Layer", () => { { transferType: "sender", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: null, @@ -1468,6 +1512,7 @@ describe("Swap Layer", () => { { transferType: "sender", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: new Array(32).fill(0), redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, @@ -1503,6 +1548,7 @@ describe("Swap Layer", () => { { transferType: "sender", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: { relay: { gasDropoff, maxRelayerFee: 1n } }, @@ -1549,6 +1595,7 @@ describe("Swap Layer", () => { { transferType: "sender", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, @@ -1592,6 +1639,7 @@ describe("Swap Layer", () => { { transferType: "sender", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: { relay: { gasDropoff, maxRelayerFee } }, @@ -1606,7 +1654,43 @@ describe("Swap Layer", () => { ); }); - it("Cannot Stage Outbound (U64 Overflow)", async function () { + it("Cannot Stage Outbound (Exact-In Amount Too Small)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 1n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + isExactIn: true, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, + outputToken: null, + }, + ); + + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner], + "Error Code: InsufficientAmountIn", + ); + }); + + it("Cannot Stage Outbound (Exact-Out U64 Overflow)", async function () { const stagedOutboundSigner = Keypair.generate(); const stagedOutbound = stagedOutboundSigner.publicKey; @@ -1626,6 +1710,7 @@ describe("Swap Layer", () => { { transferType: "sender", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, @@ -1641,7 +1726,80 @@ describe("Swap Layer", () => { ); }); - it("Stage Outbound USDC (Relay)", async function () { + it("Stage Outbound USDC (Exact-In Relay)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const amountIn = 690000n; + const gasDropoff = 42069; + const senderToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + senderToken, + stagedOutbound, + usdcRefundToken: senderToken, + }, + { + transferType: "sender", + amountIn, + isExactIn: true, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, + outputToken: null, + }, + ); + + const { amount: balanceBefore } = await splToken.getAccount( + connection, + senderToken, + ); + await expectIxOk(connection, [ix], [payer, stagedOutboundSigner]); + + const { amount: balanceAfter } = await splToken.getAccount( + connection, + senderToken, + ); + + const { relayParams } = await swapLayer.fetchPeer(foreignChain); + const expectedRelayerFee = calculateRelayerFee( + relayParams, + denormalizeGasDropOff(gasDropoff), + { type: "Usdc" }, + ); + assert.equal(balanceBefore - balanceAfter, amountIn); + + const stagedOutboundData = await swapLayer.fetchStagedOutbound(stagedOutbound); + const { info } = stagedOutboundData; + + assert.deepEqual( + stagedOutboundData, + new StagedOutbound( + { + custodyTokenBump: info.custodyTokenBump, + preparedBy: payer.publicKey, + sender: payer.publicKey, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + isExactIn: true, + usdcRefundToken: senderToken, + }, + { + relay: { + gasDropoff: gasDropoff, + relayingFee: uint64ToBN(expectedRelayerFee), + }, + }, + Buffer.alloc(1), + ), + ); + }); + + it("Stage Outbound USDC (Exact-Out Relay)", async function () { const stagedOutboundSigner = Keypair.generate(); const stagedOutbound = stagedOutboundSigner.publicKey; @@ -1661,6 +1819,7 @@ describe("Swap Layer", () => { { transferType: "sender", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: { relay: { gasDropoff, maxRelayerFee: 1000000000n } }, @@ -1699,6 +1858,7 @@ describe("Swap Layer", () => { sender: payer.publicKey, targetChain: foreignChain, recipient: foreignRecipientAddress, + isExactIn: false, usdcRefundToken: senderToken, }, { @@ -1731,6 +1891,7 @@ describe("Swap Layer", () => { { transferType: "sender", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: null, @@ -1762,6 +1923,7 @@ describe("Swap Layer", () => { sender: payer.publicKey, targetChain: foreignChain, recipient: foreignRecipientAddress, + isExactIn: false, usdcRefundToken: senderToken, }, { direct: {} }, @@ -1806,6 +1968,7 @@ describe("Swap Layer", () => { { transferType: "sender", amountIn, + isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: null, @@ -1837,6 +2000,7 @@ describe("Swap Layer", () => { sender: payer.publicKey, targetChain: foreignChain, recipient: foreignRecipientAddress, + isExactIn: false, usdcRefundToken: senderToken, }, { direct: {} }, @@ -3688,6 +3852,7 @@ describe("Swap Layer", () => { }, opts: { amountIn?: bigint; + isExactIn?: boolean; redeemOption?: | { relay: { gasDropoff: number; maxRelayerFee: Uint64 } } | { payload: Uint8Array | Buffer } @@ -3698,8 +3863,9 @@ describe("Swap Layer", () => { const stagedOutboundSigner = Keypair.generate(); const stagedOutbound = stagedOutboundSigner.publicKey; - let { amountIn, redeemOption, outputToken } = opts; + let { amountIn, isExactIn, redeemOption, outputToken } = opts; amountIn ??= 690000n; + isExactIn ??= false; redeemOption ??= null; outputToken ??= null; @@ -3712,6 +3878,7 @@ describe("Swap Layer", () => { { transferType: "sender", amountIn, + isExactIn, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption, diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index ae75a4cf..0f015c1a 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -83,7 +83,7 @@ const JUPITER_V6_LUT_ADDRESSES_BERN = [ new PublicKey("55ir29U8MrZbGBV63XbbweEDXP9DSx7eNenc7hnTM81E"), ]; -describe("Jupiter V6 Testing", () => { +describe("Swap Layer -- Jupiter V6", () => { const connection = new Connection(LOCALHOST, "processed"); const payer = PAYER_KEYPAIR; @@ -348,7 +348,7 @@ describe("Jupiter V6 Testing", () => { await swapExactInForTest( { payer: payer.publicKey, stagedOutbound, srcMint }, { cpiInstruction }, - { errorMsg: "Error Code: AmountOutTooSmall" }, + { errorMsg: "Error Code: InsufficientAmountOut" }, ); }); @@ -1912,6 +1912,7 @@ describe("Jupiter V6 Testing", () => { { transferType: "native", amountIn, + isExactIn: true, targetChain: toChainId("Ethereum"), recipient: Array.from(Buffer.alloc(32, "deadbeef")), redeemOption: null, @@ -3862,6 +3863,7 @@ describe("Jupiter V6 Testing", () => { { transferType, amountIn, + isExactIn: true, targetChain, recipient: Array.from(Buffer.alloc(32, "deadbeef")), redeemOption, From 4f5f6c8cf893236da7787b0d8e37e4de86db19bd Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Tue, 11 Jun 2024 14:20:36 -0500 Subject: [PATCH 29/50] solana: token -> token_interface (#69) Co-authored-by: A5 Pickle --- .../src/processor/release_inbound.rs | 20 ++++++++++++------- solana/ts/src/swapLayer/index.ts | 14 +++++++++++-- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/solana/programs/swap-layer/src/processor/release_inbound.rs b/solana/programs/swap-layer/src/processor/release_inbound.rs index f602c99d..e0996005 100644 --- a/solana/programs/swap-layer/src/processor/release_inbound.rs +++ b/solana/programs/swap-layer/src/processor/release_inbound.rs @@ -1,6 +1,6 @@ use crate::state::StagedInbound; use anchor_lang::prelude::*; -use anchor_spl::token; +use anchor_spl::token_interface; /// Accounts required for [consume_inbound]. #[derive(Accounts)] @@ -33,11 +33,14 @@ pub struct ReleaseInbound<'info> { /// Staged custody token account. This account will be closed at the end of this instruction. #[account( mut, + token::mint = mint, address = staged_inbound.custody_token, )] - staged_custody_token: Account<'info, token::TokenAccount>, + staged_custody_token: InterfaceAccount<'info, token_interface::TokenAccount>, - token_program: Program<'info, token::Token>, + mint: InterfaceAccount<'info, token_interface::Mint>, + + token_program: Interface<'info, token_interface::TokenInterface>, } pub fn release_inbound(ctx: Context) -> Result<()> { @@ -51,24 +54,27 @@ pub fn release_inbound(ctx: Context) -> Result<()> { let custody_token = &ctx.accounts.staged_custody_token; let token_program = &ctx.accounts.token_program; + let mint = &ctx.accounts.mint; - token::transfer( + token_interface::transfer_checked( CpiContext::new_with_signer( token_program.to_account_info(), - token::Transfer { + token_interface::TransferChecked { from: custody_token.to_account_info(), to: ctx.accounts.dst_token.to_account_info(), authority: staged_inbound.to_account_info(), + mint: mint.to_account_info(), }, &[staged_inbound_signer_seeds], ), custody_token.amount, + mint.decimals, )?; // Finally close token account. - token::close_account(CpiContext::new_with_signer( + token_interface::close_account(CpiContext::new_with_signer( token_program.to_account_info(), - token::CloseAccount { + token_interface::CloseAccount { account: custody_token.to_account_info(), destination: ctx.accounts.beneficiary.to_account_info(), authority: staged_inbound.to_account_info(), diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 4ac81335..ab29ee1b 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -930,11 +930,20 @@ export class SwapLayerProgram { recipient: PublicKey; dstToken: PublicKey; beneficiary?: PublicKey; + mint?: PublicKey; + tokenProgram?: PublicKey; }): Promise { - let { stagedInbound, recipient, dstToken, beneficiary } = accounts; + const { stagedInbound, recipient, dstToken } = accounts; + let { beneficiary, mint, tokenProgram } = accounts; beneficiary ??= recipient; + if (mint === undefined || tokenProgram === undefined) { + const accInfo = await this.connection().getAccountInfo(dstToken); + tokenProgram ??= accInfo.owner; + mint ??= splToken.unpackAccount(dstToken, accInfo, accInfo.owner).mint; + } + return this.program.methods .releaseInbound() .accounts({ @@ -943,7 +952,8 @@ export class SwapLayerProgram { stagedInbound, dstToken, stagedCustodyToken: this.stagedCustodyTokenAddress(stagedInbound), - tokenProgram: splToken.TOKEN_PROGRAM_ID, + mint, + tokenProgram, }) .instruction(); } From 1f19fdeba94c93217a347a1ab669cd71c78f7377 Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Tue, 11 Jun 2024 16:08:28 -0400 Subject: [PATCH 30/50] Solana <> EVM integration testing (#64) * evm: setup anvil script * e2e: rename directory; fix run_test.sh to use anchor * solana: make anchor-test-setup * evm: update deployment script for e2e * e2e: add dummy solana registrations * e2e: read evm envs * e2e: fix packages * e2e: another attempt * e2e: add function to return swap layer contract * e2e: handle evm setup * e2e: fix deployment and add outbound direct test * e2e: add inbound direct test * e2e: add solana direct test * e2e: add relaying tests * e2e: add gas swaps * e2e: add gas swaps with relay (WIP) * update makefile and package versions to fix import/resolution errors (#67) * updates to make e2e tests use packages instead of direct access * add foundry for solana anchor tests * tmp * remove package-lock from e2e dir * update submodule version, fix import * Remove the submodule completely instead of running its make clean target (#70) * e2e: finish gas swap with relay tests * e2e: add Other (Direct) swap type tests * e2e: refactor tests * solana: add other swap with relay * e2e: update evm interface * Add root make build command, improve clean targets (#71) * e2e: update evm interface * Add root make build command, improve clean targets --------- Co-authored-by: gator-boi --------- Co-authored-by: gator-boi Co-authored-by: A5 Pickle Co-authored-by: Ben Guidarelli --- .github/workflows/solana.yml | 4 + .gitmodules | 2 +- Makefile | 26 +- e2e/.gitignore | 6 + e2e/.prettierignore | 8 + e2e/.prettierrc.json | 15 + e2e/package.json | 33 + e2e/sh/run_test.sh | 28 + e2e/tests/01__setup.ts | 172 ++ e2e/tests/02__swapLayer.ts | 1897 +++++++++++++++++ e2e/tests/helpers/consts.ts | 67 + e2e/tests/helpers/env.ts | 129 ++ e2e/tests/helpers/fork.ts | 146 ++ e2e/tests/helpers/guardians.ts | 108 + e2e/tests/helpers/index.ts | 5 + e2e/tests/helpers/utils.ts | 428 ++++ e2e/tsconfig.anchor-test.json | 8 + evm/Makefile | 4 +- evm/env/localnet/Base.env | 28 + evm/env/localnet/Ethereum.env | 28 + evm/env/testing.env | 9 - evm/src/assets/SwapLayerInitiate.sol | 2 +- evm/test/script/DeploySwapLayerForTest.s.sol | 148 ++ evm/test/script/start_anvil.sh | 51 + evm/ts-sdk/package.json | 9 +- lib/example-liquidity-layer | 2 +- package-lock.json | 1012 +++++++-- package.json | 2 + solana/Anchor.toml | 56 +- solana/Makefile | 5 +- solana/package.json | 14 +- .../cctp/remote_token_messenger_0.json | 14 + .../cctp/remote_token_messenger_1.json | 14 + .../cctp/remote_token_messenger_2.json | 14 + .../cctp/remote_token_messenger_3.json | 14 + .../cctp/remote_token_messenger_6.json | 14 + .../cctp/remote_token_messenger_7.json | 14 + .../accounts/cctp/usdc_token_pair_0.json | 14 + .../accounts/cctp/usdc_token_pair_1.json | 14 + .../accounts/cctp/usdc_token_pair_2.json | 14 + .../accounts/cctp/usdc_token_pair_3.json | 14 + .../accounts/cctp/usdc_token_pair_6.json | 14 + .../accounts/cctp/usdc_token_pair_7.json | 14 + 43 files changed, 4433 insertions(+), 187 deletions(-) create mode 100644 e2e/.gitignore create mode 100644 e2e/.prettierignore create mode 100644 e2e/.prettierrc.json create mode 100644 e2e/package.json create mode 100644 e2e/sh/run_test.sh create mode 100644 e2e/tests/01__setup.ts create mode 100644 e2e/tests/02__swapLayer.ts create mode 100644 e2e/tests/helpers/consts.ts create mode 100644 e2e/tests/helpers/env.ts create mode 100644 e2e/tests/helpers/fork.ts create mode 100644 e2e/tests/helpers/guardians.ts create mode 100644 e2e/tests/helpers/index.ts create mode 100644 e2e/tests/helpers/utils.ts create mode 100644 e2e/tsconfig.anchor-test.json create mode 100644 evm/env/localnet/Base.env create mode 100644 evm/env/localnet/Ethereum.env delete mode 100644 evm/env/testing.env create mode 100644 evm/test/script/DeploySwapLayerForTest.s.sol create mode 100644 evm/test/script/start_anvil.sh create mode 100644 solana/ts/tests/accounts/cctp/remote_token_messenger_0.json create mode 100644 solana/ts/tests/accounts/cctp/remote_token_messenger_1.json create mode 100644 solana/ts/tests/accounts/cctp/remote_token_messenger_2.json create mode 100644 solana/ts/tests/accounts/cctp/remote_token_messenger_3.json create mode 100644 solana/ts/tests/accounts/cctp/remote_token_messenger_6.json create mode 100644 solana/ts/tests/accounts/cctp/remote_token_messenger_7.json create mode 100644 solana/ts/tests/accounts/cctp/usdc_token_pair_0.json create mode 100644 solana/ts/tests/accounts/cctp/usdc_token_pair_1.json create mode 100644 solana/ts/tests/accounts/cctp/usdc_token_pair_2.json create mode 100644 solana/ts/tests/accounts/cctp/usdc_token_pair_3.json create mode 100644 solana/ts/tests/accounts/cctp/usdc_token_pair_6.json create mode 100644 solana/ts/tests/accounts/cctp/usdc_token_pair_7.json diff --git a/.github/workflows/solana.yml b/.github/workflows/solana.yml index f12bee54..0b7ee716 100644 --- a/.github/workflows/solana.yml +++ b/.github/workflows/solana.yml @@ -55,6 +55,10 @@ jobs: - uses: actions/checkout@v4 with: submodules: recursive + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly - uses: metadaoproject/setup-anchor@v2 with: node-version: "20.11.0" diff --git a/.gitmodules b/.gitmodules index 124e93af..72692760 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "lib/example-liquidity-layer"] path = lib/example-liquidity-layer url = https://github.com/wormhole-foundation/example-liquidity-layer.git - rev = 40b328135c95453f41ffb12804cfcce440143c46 + rev = a1763da8aa395c25753a0a5e9781662eb3724e6c diff --git a/Makefile b/Makefile index f95b4001..9cd3fb1c 100644 --- a/Makefile +++ b/Makefile @@ -1,28 +1,40 @@ + +.PHONY: build +build: node_modules + cd evm && $(MAKE) + cd solana && $(MAKE) && $(MAKE) anchor-build-idl + npm run build + .PHONY: clean -clean: - $(MAKE) fast-transfer-clean +clean: fast-transfer-clean + cd evm && $(MAKE) clean + cd solana && $(MAKE) clean + npm run clean rm -rf node_modules .PHONY: fast-transfer-sync fast-transfer-sync: - git submodule update --checkout + git submodule update --init --checkout --recursive git submodule sync --recursive .PHONY: fast-transfer-clean -fast-transfer-clean: fast-transfer-sync - cd lib/example-liquidity-layer/solana && $(MAKE) clean +fast-transfer-clean: + rm -rf lib/example-liquidity-layer + $(MAKE) fast-transfer-sync .PHONY: fast-transfer-setup fast-transfer-setup: fast-transfer-sync cd lib/example-liquidity-layer/solana && $(MAKE) anchor-test-setup + cd lib/example-liquidity-layer/evm && $(MAKE) build .PHONY: fast-transfer-sdk fast-transfer-sdk: fast-transfer-setup cd lib/example-liquidity-layer \ && $(MAKE) build \ - && npm run build -w solana \ - && npm pack -w universal/ts -w solana + && npm run build -w solana -w evm \ + && npm pack -w universal/ts -w solana -w evm node_modules: fast-transfer-sdk npm install -w solana lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-* + npm install -w e2e lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-* npm ci diff --git a/e2e/.gitignore b/e2e/.gitignore new file mode 100644 index 00000000..98217c6a --- /dev/null +++ b/e2e/.gitignore @@ -0,0 +1,6 @@ +.anchor +.env +.private +.vscode +Anchor.toml +target \ No newline at end of file diff --git a/e2e/.prettierignore b/e2e/.prettierignore new file mode 100644 index 00000000..c1a0b75f --- /dev/null +++ b/e2e/.prettierignore @@ -0,0 +1,8 @@ + +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/e2e/.prettierrc.json b/e2e/.prettierrc.json new file mode 100644 index 00000000..b1db937c --- /dev/null +++ b/e2e/.prettierrc.json @@ -0,0 +1,15 @@ +{ + "overrides": [ + { + "files": "*.ts", + "options": { + "printWidth": 100, + "tabWidth": 4, + "useTabs": false, + "singleQuote": false, + "trailingComma": "all", + "bracketSpacing": true + } + } + ] +} diff --git a/e2e/package.json b/e2e/package.json new file mode 100644 index 00000000..7870d2ce --- /dev/null +++ b/e2e/package.json @@ -0,0 +1,33 @@ +{ + "name": "swap-layer-e2e", + "version": "1.0.0", + "description": "Swap Layer EVM <> Solana end-to-end test", + "main": "index.js", + "scripts": { + "test": "bash sh/run_test.sh" + }, + "dependencies": { + "@solana/web3.js": "^1.91.6", + "@types/chai": "^4.3.16", + "@types/mocha": "^10.0.6", + "@types/node": "^20.12.13", + "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", + "@wormhole-foundation/example-liquidity-layer-evm": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", + "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-solana": "^0.7.0-beta.6", + "chai": "^4.3.4", + "dotenv": "^16.4.5", + "mocha": "^9.0.3", + "prettier": "^3.2.5", + "ts-mocha": "^10.0.0" + }, + "devDependencies": { + "@typechain/ethers-v5": "^11.1.2", + "envfile": "^7.1.0", + "ethers": "^5.7.2", + "typechain": "^8.3.2" + } +} diff --git a/e2e/sh/run_test.sh b/e2e/sh/run_test.sh new file mode 100644 index 00000000..85a4cbff --- /dev/null +++ b/e2e/sh/run_test.sh @@ -0,0 +1,28 @@ +#/bin/bash + +ROOT=$(realpath $(dirname $0)/../..) + +rm -f Anchor.toml + +sed 's/\= "ts\//\= "..\/solana\/ts\//' $ROOT/solana/Anchor.toml > Anchor.toml +sed -E -i 's/"programs\/swap-layer"/"..\/solana\/programs\/swap-layer"/' Anchor.toml +sed -E -i 's/^test \= ".+"/test = "npx ts-mocha -p .\/tsconfig.anchor-test.json -t 1000000 --bail --exit tests\/[0-9]*.ts"/' Anchor.toml + +mkdir -p target/deploy + +# start anvil in the evm directory +cd $ROOT/evm +bash test/script/start_anvil.sh + +echo "Anvil instances started successfully." + +cd $ROOT/solana +make anchor-test-setup +anchor build -- --features integration-test +cp target/deploy/swap_layer.so $ROOT/e2e/target/deploy + +cd $ROOT/e2e + +anchor test --skip-build + +pkill anvil diff --git a/e2e/tests/01__setup.ts b/e2e/tests/01__setup.ts new file mode 100644 index 00000000..411cc54d --- /dev/null +++ b/e2e/tests/01__setup.ts @@ -0,0 +1,172 @@ +import { assert } from "chai"; +import * as swapLayerSdk from "../../solana/ts/src/swapLayer"; +import { Connection, SystemProgram } from "@solana/web3.js"; +import { + expectIxOk, + PAYER_KEYPAIR, + CHAIN_TO_DOMAIN, + OWNER_KEYPAIR, + LOCALHOST, +} from "@wormhole-foundation/example-liquidity-layer-solana/testing"; +import { Chain, toChainId } from "@wormhole-foundation/sdk-base"; +import { createAta } from "../../solana/ts/tests/helpers"; +import { toUniversal } from "@wormhole-foundation/sdk-definitions"; +import { + EVM_CONFIG, + USDC_MINT_ADDRESS, + REGISTERED_EVM_CHAINS, + SOLANA_SWAP_LAYER_ID, + overrideCircleAnvil, + overrideWormholeAnvil, + mintUsdcForTest, +} from "./helpers"; + +describe("Setup", () => { + const connection = new Connection(LOCALHOST, "confirmed"); + + const swapLayer = new swapLayerSdk.SwapLayerProgram( + connection, + SOLANA_SWAP_LAYER_ID, + USDC_MINT_ADDRESS, + ); + const tokenRouter = swapLayer.tokenRouterProgram(); + const matchingEngine = tokenRouter.matchingEngineProgram(); + + const payer = PAYER_KEYPAIR; + const owner = OWNER_KEYPAIR; + + describe("Matching Engine", function () { + for (const chain of REGISTERED_EVM_CHAINS.slice(0, 1)) { + it(`Update CCTP Endpoint (${chain})`, async function () { + const cfg = EVM_CONFIG[chain]; + assert.isDefined(cfg); + + await updateMatchingEngineCctpEndpoint( + chain, + toUniversal(chain, cfg.tokenRouter).toUint8Array(), + ); + }); + } + + for (const chain of REGISTERED_EVM_CHAINS.slice(1)) { + it(`Add CCTP Endpoint (${chain})`, async function () { + const cfg = EVM_CONFIG[chain]; + assert.isDefined(cfg); + + const endpoint = Array.from(toUniversal(chain, cfg.tokenRouter).toUint8Array()); + + const ix = await matchingEngine.addCctpRouterEndpointIx( + { + ownerOrAssistant: owner.publicKey, + payer: payer.publicKey, + }, + { + chain: toChainId(chain), + cctpDomain: cfg.cctpDomain, + address: endpoint, + mintRecipient: endpoint, + }, + ); + await expectIxOk(connection, [ix], [payer, owner]); + }); + } + }); + + describe("Swap Layer", function () { + before("Set Up Owner", async function () { + await expectIxOk( + connection, + [ + SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: owner.publicKey, + lamports: 1000000000, + }), + ], + [payer], + ); + await createAta(connection, payer, swapLayer.usdcMint, owner.publicKey); + }); + + it("Initialize", async function () { + const ix = await swapLayer.initializeIx({ + owner: owner.publicKey, + ownerAssistant: owner.publicKey, + feeRecipient: owner.publicKey, + feeUpdater: owner.publicKey, + }); + + await expectIxOk(connection, [ix], [payer, owner]); + }); + + for (const chain of REGISTERED_EVM_CHAINS) { + it(`Add Peer (${chain})`, async function () { + const cfg = EVM_CONFIG[chain]; + assert.isDefined(cfg); + + const ix = await swapLayer.addPeerIx( + { + ownerOrAssistant: owner.publicKey, + payer: payer.publicKey, + }, + { + chain: toChainId(chain), + address: Array.from(toUniversal(chain, cfg.swapLayer).toUint8Array()), + relayParams: cfg.relayParams, + }, + ); + await expectIxOk(connection, [ix], [payer, owner]); + }); + } + }); + + describe("Evm Network Setup", function () { + for (const chain of REGISTERED_EVM_CHAINS) { + it(`Modify Core Bridge (${chain})`, async () => { + await overrideWormholeAnvil(chain, 0); + }); + + it(`Modify Circle Contracts (${chain})`, async () => { + await overrideCircleAnvil(chain); + }); + + it(`Mint USDC (${chain})`, async () => { + await mintUsdcForTest(chain, "69420000000000"); + }); + } + }); + + async function updateMatchingEngineCctpEndpoint( + chain: Chain, + address: Uint8Array | Buffer, + mintRecipient?: Uint8Array | Buffer, + ) { + mintRecipient ??= address; + + const cctpDomain = CHAIN_TO_DOMAIN[chain]; + assert.isDefined(cctpDomain); + + const ix = await matchingEngine.updateCctpRouterEndpointIx( + { + owner: owner.publicKey, + }, + { + chain: toChainId(chain), + cctpDomain, + address: Array.from(address), + mintRecipient: Array.from(mintRecipient), + }, + ); + await expectIxOk(connection, [ix], [payer, owner]); + } + + async function disableMatchingEngineEndpoint(chain: Chain) { + const ix = await matchingEngine.disableRouterEndpointIx( + { + owner: owner.publicKey, + }, + toChainId(chain), + ); + await expectIxOk(connection, [ix], [payer, owner]); + } +}); diff --git a/e2e/tests/02__swapLayer.ts b/e2e/tests/02__swapLayer.ts new file mode 100644 index 00000000..61ba841d --- /dev/null +++ b/e2e/tests/02__swapLayer.ts @@ -0,0 +1,1897 @@ +import { BN } from "@coral-xyz/anchor"; +import * as splToken from "@solana/spl-token"; +import { Connection, Keypair, PublicKey, SystemProgram } from "@solana/web3.js"; +import { + CircleAttester, + LOCALHOST, + OWNER_KEYPAIR, + PAYER_KEYPAIR, + expectIxOk, + getUsdcAtaBalance, +} from "@wormhole-foundation/example-liquidity-layer-solana/testing"; +import { Chain, toChainId } from "@wormhole-foundation/sdk-base"; +import { toUniversal } from "@wormhole-foundation/sdk-definitions"; +import { assert } from "chai"; +import { ethers } from "ethers"; +import * as fs from "fs"; +import { + ATTESTATION_TYPE_LL, + EVM_CONFIG, + EVM_FEE_RECIPIENT, + GUARDIAN_SET_INDEX, + GuardianNetwork, + ONE_ETHER, + ONE_SOL, + SOLANA_SWAP_LAYER_ID, + USDC_MINT_ADDRESS, + USDT_ETH, + completeSwapForTest, + evmSwapLayerConfig, + getUsdtAtaBalance, + getUsdtBalanceEthereum, + initiateOnEvmSwapLayer, + initiateOnSolanaSwapLayer, + postSignedVaa, + redeemFillOnSolana, + usdcContract, + usdtContract, +} from "./helpers"; + +import { InitiateArgs, encodeInitiateArgs, encodeQueriesBatch } from "../../evm/ts-sdk/lib/cjs"; +import * as jupiterV6 from "../../solana/ts/src/jupiterV6"; +import * as swapLayerSdk from "../../solana/ts/src/swapLayer"; +import { USDT_MINT_ADDRESS, createAta, createLut } from "../../solana/ts/tests/helpers"; + +const EVM_CHAIN_PATHWAYS: [Chain, Chain][] = [ + ["Ethereum", "Base"], + ["Base", "Ethereum"], +]; + +describe("Swap Layer", () => { + // Solana. + const solanaPayer = PAYER_KEYPAIR; + const solanaRelayer = Keypair.generate(); + const solanaRecipient = Keypair.generate(); + const solanaFeeRecipient = OWNER_KEYPAIR; + const connection = new Connection(LOCALHOST, "confirmed"); + const solanaSwapLayer = new swapLayerSdk.SwapLayerProgram( + connection, + SOLANA_SWAP_LAYER_ID, + USDC_MINT_ADDRESS, + ); + const solanaTokenRouter = solanaSwapLayer.tokenRouterProgram(); + let tokenRouterLkupTable: PublicKey; + + let localVariables = {}; + + for (const [fromChain, toChain] of EVM_CHAIN_PATHWAYS) { + // From contracts. + const from = evmSwapLayerConfig(fromChain); + const fromConfig = EVM_CONFIG[fromChain]; + const fromUsdc = usdcContract(fromChain); + + // To contracts. + const to = evmSwapLayerConfig(toChain); + const toUsdc = usdcContract(toChain); + + before("Approve Max", async function () { + await fromUsdc.contract + .connect(from.wallet) + .approve(from.contract.address, ethers.constants.MaxUint256) + .then((tx) => tx.wait()); + }); + + describe(`${fromChain} <> ${toChain}`, function () { + describe("Usdc", function () { + describe("Direct", function () { + it("Outbound", async function () { + const amountIn = 20_000_000_000; // 20k USDC + + const output: InitiateArgs = { + transferMode: { + mode: "LiquidityLayer", + }, + redeemMode: { + mode: "Direct", + }, + outputToken: { + type: "Usdc", + }, + isExactIn: true, + inputToken: { + type: "Usdc", + amount: BigInt(amountIn), + acquireMode: { + mode: "Preapproved", + }, + }, + }; + + const balanceBefore = await fromUsdc.contract.balanceOf( + from.wallet.address, + ); + + const { orderResponse } = await initiateOnEvmSwapLayer( + encodeInitiateArgs(output), + toUniversal(fromChain, to.wallet.address), + fromChain, + toChain, + from.contract, + ); + + const balanceAfter = await fromUsdc.contract.balanceOf(from.wallet.address); + assert.equal(balanceBefore.sub(balanceAfter).toNumber(), amountIn); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountIn"] = amountIn; + }); + + it("Inbound", async function () { + const balanceBefore = await toUsdc.contract.balanceOf(to.wallet.address); + const etherBefore = await to.provider.getBalance(to.wallet.address); + + // Perform the direct redeem. + const receipt = await to.contract + .redeem([], localVariables["orderResponse"]) + .then((tx) => tx.wait()); + + const balanceAfter = await toUsdc.contract.balanceOf(to.wallet.address); + const etherAfter = await to.provider.getBalance(to.wallet.address); + + assert.isTrue( + etherBefore + .sub(etherAfter) + .eq(receipt.effectiveGasPrice.mul(receipt.gasUsed)), + ); + assert.equal( + balanceAfter.sub(balanceBefore).toNumber(), + localVariables["amountIn"], + ); + + localVariables = {}; + }); + }); + + describe("Relay", function () { + it("Outbound", async function () { + const amountIn = 20_000_000_000; // 20k USDC + const gasDropoff = BigInt(ONE_ETHER); + + let relayingFee = await from.contract + .batchQueries( + encodeQueriesBatch([ + { + query: "RelayingFee", + chain: toChain, + gasDropoff, + outputToken: { type: "Usdc" }, + }, + ]), + ) + .then((encodedFee) => Number(encodedFee)); + + const output: InitiateArgs = { + transferMode: { + mode: "LiquidityLayer", + }, + redeemMode: { + mode: "Relay", + gasDropoff, + maxRelayingFee: relayingFee, + }, + outputToken: { + type: "Usdc", + }, + isExactIn: false, + inputToken: { + type: "Usdc", + amount: BigInt(amountIn), + acquireMode: { + mode: "Preapproved", + }, + }, + }; + + const balanceBefore = await fromUsdc.contract.balanceOf( + from.wallet.address, + ); + + const { orderResponse } = await initiateOnEvmSwapLayer( + encodeInitiateArgs(output), + toUniversal(fromChain, to.wallet.address), + fromChain, + toChain, + from.contract, + ); + + const balanceAfter = await fromUsdc.contract.balanceOf(from.wallet.address); + assert.equal( + balanceBefore.sub(balanceAfter).toNumber(), + amountIn + relayingFee, + ); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountIn"] = amountIn; + localVariables["relayingFee"] = relayingFee; + localVariables["gasDropoff"] = gasDropoff; + }); + + it("Inbound", async function () { + const balanceBefore = await toUsdc.contract.balanceOf(to.wallet.address); + const etherBefore = await to.provider.getBalance(to.wallet.address); + const relayerBefore = await toUsdc.contract.balanceOf(to.relayer.address); + const feeRecipientBefore = + await toUsdc.contract.balanceOf(EVM_FEE_RECIPIENT); + + // Perform the relay from the relayer wallet. + const receipt = await to.contract + .connect(to.relayer) + .redeem([], localVariables["orderResponse"], { + value: localVariables["gasDropoff"], + }) + .then((tx) => tx.wait()); + + const balanceAfter = await toUsdc.contract.balanceOf(to.wallet.address); + const etherAfter = await to.provider.getBalance(to.wallet.address); + const relayerAfter = await toUsdc.contract.balanceOf(to.relayer.address); + const feeRecipientAfter = + await toUsdc.contract.balanceOf(EVM_FEE_RECIPIENT); + + assert.isTrue( + etherAfter + .sub(etherBefore) + .eq(ethers.BigNumber.from(localVariables["gasDropoff"])), + ); + assert.isTrue( + balanceAfter + .sub(balanceBefore) + .eq(ethers.BigNumber.from(localVariables["amountIn"])), + ); + assert.isTrue(relayerAfter.sub(relayerBefore).eq(ethers.BigNumber.from(0))); + assert.isTrue( + feeRecipientAfter + .sub(feeRecipientBefore) + .eq(ethers.BigNumber.from(localVariables["relayingFee"])), + ); + + localVariables = {}; + }); + }); + }); + + describe("Gas", function () { + describe("Direct", function () { + it("Outbound", async function () { + const amountIn = ethers.utils.parseEther("1"); // 1 Ether + const amountOut = 3_700_000_000n; // 3.7k USDC + const targetAmountOut = BigInt(ethers.utils.parseEther(".75").toString()); // .75 Ether + const currentBlockTime = await from.provider + .getBlock("latest") + .then((b) => b.timestamp); + + const output: InitiateArgs = { + transferMode: { + mode: "LiquidityLayer", + }, + redeemMode: { + mode: "Direct", + }, + outputToken: { + type: "Gas", + swap: { + deadline: currentBlockTime + 60, + limitAmount: targetAmountOut, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }, + isExactIn: true, + inputToken: { + type: "Gas", + swap: { + deadline: currentBlockTime + 60, + limitAmount: amountOut, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }, + }; + + const balanceBefore = await from.wallet.getBalance(); + + const { orderResponse, receipt } = await initiateOnEvmSwapLayer( + encodeInitiateArgs(output), + toUniversal(fromChain, to.wallet.address), + fromChain, + toChain, + from.contract, + { value: amountIn }, + ); + + const balanceAfter = await from.wallet.getBalance(); + assert.isTrue( + balanceBefore + .sub(balanceAfter) + .eq(amountIn.add(receipt.effectiveGasPrice.mul(receipt.gasUsed))), + ); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountOut"] = targetAmountOut; + }); + + it("Inbound", async function () { + const minAmountOut = ethers.BigNumber.from(localVariables["amountOut"]); + const etherBefore = await to.provider.getBalance(to.wallet.address); + + // Perform the direct redeem. + const receipt = await to.contract + .redeem([], localVariables["orderResponse"]) + .then((tx) => tx.wait()); + + const etherAfter = await to.provider.getBalance(to.wallet.address); + + assert.isTrue( + etherAfter + .sub(etherBefore) + .gt( + minAmountOut.sub( + receipt.effectiveGasPrice.mul(receipt.gasUsed), + ), + ), + ); + + localVariables = {}; + }); + }); + + describe("Relay", function () { + it("Outbound", async function () { + const amountIn = ethers.utils.parseEther("1"); // 1 Ether + const amountOut = 3_700_000_000n; // 3.7k USDC + const targetAmountOut = BigInt(ethers.utils.parseEther(".75").toString()); // .75 Ether + const currentBlockTime = await from.provider + .getBlock("latest") + .then((b) => b.timestamp); + + let relayingFee: bigint = await from.contract + .batchQueries( + encodeQueriesBatch([ + { + query: "RelayingFee", + chain: toChain, + gasDropoff: 0n, + outputToken: { + type: "Gas", + swapType: "UniswapV3", + swapCount: 1, + }, + }, + ]), + ) + .then((encodedFee) => BigInt(encodedFee)); + + const output: InitiateArgs = { + transferMode: { + mode: "LiquidityLayer", + }, + redeemMode: { + mode: "Relay", + gasDropoff: 0n, + maxRelayingFee: relayingFee, + }, + outputToken: { + type: "Gas", + swap: { + deadline: currentBlockTime + 60, + limitAmount: targetAmountOut, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }, + isExactIn: true, + inputToken: { + type: "Gas", + swap: { + deadline: currentBlockTime + 60, + limitAmount: amountOut - relayingFee, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }, + }; + + const balanceBefore = await from.wallet.getBalance(); + + const { orderResponse, receipt } = await initiateOnEvmSwapLayer( + encodeInitiateArgs(output), + toUniversal(fromChain, to.wallet.address), + fromChain, + toChain, + from.contract, + { value: amountIn }, + ); + + const balanceAfter = await from.wallet.getBalance(); + assert.isTrue( + balanceBefore + .sub(balanceAfter) + .eq(amountIn.add(receipt.effectiveGasPrice.mul(receipt.gasUsed))), + ); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountOut"] = targetAmountOut; + localVariables["relayingFee"] = relayingFee; + }); + + it("Inbound", async function () { + const minAmountOut = ethers.BigNumber.from(localVariables["amountOut"]); + const etherBefore = await to.provider.getBalance(to.wallet.address); + const feeRecipientBefore = + await toUsdc.contract.balanceOf(EVM_FEE_RECIPIENT); + + // Perform the relay from the relayer wallet. + const receipt = await to.contract + .connect(to.relayer) + .redeem([], localVariables["orderResponse"], { + value: localVariables["gasDropoff"], + }) + .then((tx) => tx.wait()); + + const etherAfter = await to.provider.getBalance(to.wallet.address); + const feeRecipientAfter = + await toUsdc.contract.balanceOf(EVM_FEE_RECIPIENT); + + assert.isTrue(etherAfter.sub(etherBefore).gt(minAmountOut)); + assert.isTrue( + feeRecipientAfter + .sub(feeRecipientBefore) + .eq(ethers.BigNumber.from(localVariables["relayingFee"])), + ); + + localVariables = {}; + }); + }); + }); + }); + } + + before("Set up Token Accounts", async function () { + await splToken.getOrCreateAssociatedTokenAccount( + connection, + solanaPayer, + USDC_MINT_ADDRESS, + solanaRecipient.publicKey, + ); + + await splToken.getOrCreateAssociatedTokenAccount( + connection, + solanaPayer, + USDC_MINT_ADDRESS, + solanaRelayer.publicKey, + ); + + await splToken.getOrCreateAssociatedTokenAccount( + connection, + solanaPayer, + USDC_MINT_ADDRESS, + solanaFeeRecipient.publicKey, + ); + + await splToken.getOrCreateAssociatedTokenAccount( + connection, + solanaPayer, + USDT_MINT_ADDRESS, + solanaRecipient.publicKey, + ); + }); + + before("Setup Lookup Table", async function () { + const usdcCommonAccounts = await solanaTokenRouter.commonAccounts(); + + tokenRouterLkupTable = await createLut( + connection, + solanaPayer, + Object.values(usdcCommonAccounts).filter((key) => key !== undefined), + ); + }); + + before("Transfer Lamports to Relayer", async function () { + await expectIxOk( + connection, + [ + SystemProgram.transfer({ + fromPubkey: solanaPayer.publicKey, + toPubkey: solanaRelayer.publicKey, + lamports: 10000000000, + }), + ], + [solanaPayer], + ); + }); + + before("Generate ATAs", async function () { + for (const mint of [solanaSwapLayer.usdcMint, USDT_MINT_ADDRESS, splToken.NATIVE_MINT]) { + for (let i = 0; i < 8; ++i) { + await createAta( + connection, + solanaPayer, + mint, + jupiterV6.programAuthorityAddress(i), + ); + } + } + + const payerWsol = splToken.getAssociatedTokenAddressSync( + splToken.NATIVE_MINT, + solanaPayer.publicKey, + false, + splToken.TOKEN_PROGRAM_ID, + ); + + await expectIxOk( + connection, + [ + splToken.createAssociatedTokenAccountInstruction( + solanaPayer.publicKey, + payerWsol, + solanaPayer.publicKey, + splToken.NATIVE_MINT, + splToken.TOKEN_PROGRAM_ID, + ), + SystemProgram.transfer({ + fromPubkey: solanaPayer.publicKey, + toPubkey: payerWsol, + lamports: 2_000_000_000_000n, + }), + splToken.createSyncNativeInstruction(payerWsol, splToken.TOKEN_PROGRAM_ID), + ], + [solanaPayer], + ); + }); + + describe("Solana <> Ethereum", function () { + const toChain = "Ethereum"; + + // From contracts. + const to = evmSwapLayerConfig(toChain); + const toUsdc = usdcContract(toChain); + const toUsdt = usdtContract(); + + describe("Usdc", function () { + describe("Direct", function () { + it("Outbound", async function () { + const amountIn = 20_000_000_000n; // 20k USDC + const senderBefore = await getUsdcAtaBalance(connection, solanaPayer.publicKey); + + const orderResponse = await initiateOnSolanaSwapLayer( + solanaSwapLayer, + solanaPayer, + amountIn, + toChain, + toUniversal(toChain, to.wallet.address), + {}, + ); + + // Confirm that the 20k was staged. + const senderAfter = await getUsdcAtaBalance(connection, solanaPayer.publicKey); + assert.equal(senderBefore - senderAfter, amountIn); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountIn"] = amountIn; + }); + + it("Inbound", async function () { + const balanceBefore = await toUsdc.contract.balanceOf(to.wallet.address); + const etherBefore = await to.provider.getBalance(to.wallet.address); + + // Perform the direct redeem. + const receipt = await to.contract + .redeem([], localVariables["orderResponse"]) + .then((tx) => tx.wait()); + + const balanceAfter = await toUsdc.contract.balanceOf(to.wallet.address); + const etherAfter = await to.provider.getBalance(to.wallet.address); + + assert.isTrue( + etherBefore + .sub(etherAfter) + .eq(receipt.effectiveGasPrice.mul(receipt.gasUsed)), + ); + assert.equal( + balanceAfter.sub(balanceBefore).toNumber(), + localVariables["amountIn"], + ); + + localVariables = {}; + }); + }); + + describe("Relay", function () { + it("Outbound", async function () { + const amountIn = 20_000_000_000n; // 20k USDC + const denormGasDropoff = ONE_SOL; + + // Calculate the relayer fee. + const peer = await solanaSwapLayer.fetchPeer(toChainId(toChain)); + const expectedRelayerFee = swapLayerSdk.calculateRelayerFee( + peer.relayParams, + BigInt(denormGasDropoff), + { type: "Usdc" }, + ); + + const senderBefore = await getUsdcAtaBalance(connection, solanaPayer.publicKey); + + const orderResponse = await initiateOnSolanaSwapLayer( + solanaSwapLayer, + solanaPayer, + amountIn, + toChain, + toUniversal(toChain, to.wallet.address), + {}, + { + redeemOption: { + relay: { + gasDropoff: denormGasDropoff / 1000, // normalize by 1e3 + maxRelayerFee: new BN(expectedRelayerFee.toString()), + }, + }, + }, + ); + + // Confirm that the 20k was staged. + const senderAfter = await getUsdcAtaBalance(connection, solanaPayer.publicKey); + assert.equal(senderBefore - senderAfter, BigInt(amountIn) + expectedRelayerFee); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountIn"] = amountIn; + localVariables["gasDropoff"] = denormGasDropoff; + localVariables["relayingFee"] = expectedRelayerFee; + }); + + it("Inbound", async function () { + const balanceBefore = await toUsdc.contract.balanceOf(to.wallet.address); + const etherBefore = await to.provider.getBalance(to.wallet.address); + const relayerBefore = await toUsdc.contract.balanceOf(to.relayer.address); + const feeRecipientBefore = await toUsdc.contract.balanceOf(EVM_FEE_RECIPIENT); + + // Since the gasDropoff was specified on Solana (i.e., in SOL terms) we + // need to multiply by 1e9. + const gasDropoff = BigInt(localVariables["gasDropoff"]) * BigInt(1e9); + + // Perform the relay from the relayer wallet. + await to.contract + .connect(to.relayer) + .redeem([], localVariables["orderResponse"], { value: gasDropoff }) + .then((tx) => tx.wait()); + + const balanceAfter = await toUsdc.contract.balanceOf(to.wallet.address); + const etherAfter = await to.provider.getBalance(to.wallet.address); + const relayerAfter = await toUsdc.contract.balanceOf(to.relayer.address); + const feeRecipientAfter = await toUsdc.contract.balanceOf(EVM_FEE_RECIPIENT); + + assert.isTrue( + etherAfter.sub(etherBefore).eq(ethers.BigNumber.from(gasDropoff)), + ); + assert.isTrue( + balanceAfter + .sub(balanceBefore) + .eq(ethers.BigNumber.from(localVariables["amountIn"])), + ); + assert.isTrue(relayerAfter.sub(relayerBefore).eq(ethers.BigNumber.from(0))); + assert.isTrue( + feeRecipientAfter + .sub(feeRecipientBefore) + .eq(ethers.BigNumber.from(localVariables["relayingFee"])), + ); + + localVariables = {}; + }); + }); + }); + + describe("Gas", function () { + describe("Direct", function () { + it("Outbound", async function () { + const amountIn = 1_000_000_000n; // 1 SOL + const amountOut = 150_000_000n; // 150 USDC + const targetAmountOut = 25_000_000_000_000_000n; // 0.025 ETH + const senderToken = splToken.getAssociatedTokenAddressSync( + splToken.NATIVE_MINT, + solanaPayer.publicKey, + ); + + const currentBlockTime = await to.provider + .getBlock("latest") + .then((b) => b.timestamp); + + const outputToken: swapLayerSdk.OutputToken = { + type: "Gas", + swap: { + deadline: currentBlockTime + 60, + limitAmount: targetAmountOut, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }; + + const orderResponse = await initiateOnSolanaSwapLayer( + solanaSwapLayer, + solanaPayer, + amountIn, + toChain, + toUniversal(toChain, to.wallet.address), + { senderToken, srcMint: splToken.NATIVE_MINT }, + { + transferType: "native", + outputToken: outputToken, + exactIn: true, + inAmount: amountIn, + quotedOutAmount: amountOut, + slippageBps: 200, + swapResponseModifier: modifyWsolToUsdcSwapResponseForTest, + }, + ); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountOut"] = targetAmountOut; + }); + + it("Inbound", async function () { + const minAmountOut = ethers.BigNumber.from(localVariables["amountOut"]); + const etherBefore = await to.provider.getBalance(to.wallet.address); + + // Perform the direct redeem. + const receipt = await to.contract + .redeem([], localVariables["orderResponse"]) + .then((tx) => tx.wait()); + + const etherAfter = await to.provider.getBalance(to.wallet.address); + const gasUsed = receipt.effectiveGasPrice.mul(receipt.gasUsed); + assert.isTrue(etherAfter.add(gasUsed).sub(etherBefore).gt(minAmountOut)); + + localVariables = {}; + }); + }); + + describe("Relay", function () { + it("Outbound", async function () { + const amountIn = 1_000_000_000n; // 1 SOL + const amountOut = 150_000_000n; // 150 USDC + const targetAmountOut = 25_000_000_000_000_000n; // 0.025 ETH + const senderToken = splToken.getAssociatedTokenAddressSync( + splToken.NATIVE_MINT, + solanaPayer.publicKey, + ); + const currentBlockTime = await to.provider + .getBlock("latest") + .then((b) => b.timestamp); + + const outputToken: swapLayerSdk.OutputToken = { + type: "Gas", + swap: { + deadline: currentBlockTime + 60, + limitAmount: targetAmountOut, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }; + + // Calculate the relayer fee. + const peer = await solanaSwapLayer.fetchPeer(toChainId(toChain)); + const expectedRelayerFee = swapLayerSdk.calculateRelayerFee( + peer.relayParams, + 0n, + outputToken, + ); + + const orderResponse = await initiateOnSolanaSwapLayer( + solanaSwapLayer, + solanaPayer, + amountIn, + toChain, + toUniversal(toChain, to.wallet.address), + { senderToken, srcMint: splToken.NATIVE_MINT }, + { + transferType: "native", + outputToken: outputToken, + redeemOption: { + relay: { gasDropoff: 0, maxRelayerFee: expectedRelayerFee }, + }, + exactIn: true, + inAmount: amountIn, + quotedOutAmount: amountOut, + slippageBps: 200, + swapResponseModifier: modifyWsolToUsdcSwapResponseForTest, + }, + ); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountOut"] = targetAmountOut; + localVariables["relayingFee"] = expectedRelayerFee; + }); + + it("Inbound", async function () { + const minAmountOut = ethers.BigNumber.from( + localVariables["amountOut"].toString(), + ); + const etherBefore = await to.provider.getBalance(to.wallet.address); + const feeRecipientBefore = await toUsdc.contract.balanceOf(EVM_FEE_RECIPIENT); + + // Perform the relay from the relayer wallet. + const receipt = await to.contract + .connect(to.relayer) + .redeem([], localVariables["orderResponse"], { + value: localVariables["gasDropoff"], + }) + .then((tx) => tx.wait()); + + const etherAfter = await to.provider.getBalance(to.wallet.address); + const feeRecipientAfter = await toUsdc.contract.balanceOf(EVM_FEE_RECIPIENT); + + assert.isTrue(etherAfter.sub(etherBefore).gt(minAmountOut)); + assert.isTrue( + feeRecipientAfter + .sub(feeRecipientBefore) + .eq(ethers.BigNumber.from(localVariables["relayingFee"])), + ); + + localVariables = {}; + }); + }); + }); + + describe("Other", function () { + describe("Direct", function () { + it("Outbound", async function () { + const amountIn = 50_000_000n; // 50 USDT + const amountOut = 49_800_000n; // 49.8 USDC + const targetAmountOut = 49_600_000n; // 49.6 USDT + const senderToken = splToken.getAssociatedTokenAddressSync( + USDT_MINT_ADDRESS, + solanaPayer.publicKey, + ); + + const currentBlockTime = await to.provider + .getBlock("latest") + .then((b) => b.timestamp); + + const outputToken: swapLayerSdk.OutputToken = { + type: "Other", + address: toUniversal(toChain, USDT_ETH), + swap: { + deadline: currentBlockTime + 60, + limitAmount: targetAmountOut, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }; + + // Fetch usdt balance before. + const senderBefore = await getUsdtAtaBalance(connection, solanaPayer.publicKey); + + const orderResponse = await initiateOnSolanaSwapLayer( + solanaSwapLayer, + solanaPayer, + amountIn, + toChain, + toUniversal(toChain, to.wallet.address), + { senderToken, srcMint: USDT_MINT_ADDRESS }, + { + transferType: "sender", + outputToken: outputToken, + exactIn: true, + inAmount: amountIn, + quotedOutAmount: amountOut, + slippageBps: 50, + swapResponseModifier: modifyUsdtToUsdcSwapResponseForTest, + }, + ); + + const senderAfter = await getUsdtAtaBalance(connection, solanaPayer.publicKey); + assert.equal(senderBefore - senderAfter, amountIn); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountOut"] = targetAmountOut; + }); + + it("Inbound", async function () { + const minAmountOut = ethers.BigNumber.from(localVariables["amountOut"]); + const balanceBefore = await getUsdtBalanceEthereum(to.wallet); + + // Perform the direct redeem. + const receipt = await to.contract + .redeem([], localVariables["orderResponse"]) + .then((tx) => tx.wait()); + + const balanceAfter = await getUsdtBalanceEthereum(to.wallet); + assert.isTrue(balanceAfter.sub(balanceBefore).gte(minAmountOut)); + + localVariables = {}; + }); + }); + + describe("Relay", function () { + it("Outbound", async function () { + const amountIn = 50_000_000n; // 50 USDT + const amountOut = 49_800_000n; // 49.8 USDC + const targetAmountOut = 49_000_000n; // 49.6 USDT (account for relayer fee) + const senderToken = splToken.getAssociatedTokenAddressSync( + USDT_MINT_ADDRESS, + solanaPayer.publicKey, + ); + + const currentBlockTime = await to.provider + .getBlock("latest") + .then((b) => b.timestamp); + + const outputToken: swapLayerSdk.OutputToken = { + type: "Other", + address: toUniversal(toChain, USDT_ETH), + swap: { + deadline: currentBlockTime + 60, + limitAmount: targetAmountOut, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }; + + // Calculate the relayer fee. + const peer = await solanaSwapLayer.fetchPeer(toChainId(toChain)); + const expectedRelayerFee = swapLayerSdk.calculateRelayerFee( + peer.relayParams, + 0n, + outputToken, + ); + + // Fetch usdt balance before. + const senderBefore = await getUsdtAtaBalance(connection, solanaPayer.publicKey); + + const orderResponse = await initiateOnSolanaSwapLayer( + solanaSwapLayer, + solanaPayer, + amountIn, + toChain, + toUniversal(toChain, to.wallet.address), + { senderToken, srcMint: USDT_MINT_ADDRESS }, + { + transferType: "sender", + outputToken: outputToken, + redeemOption: { + relay: { gasDropoff: 0, maxRelayerFee: expectedRelayerFee }, + }, + exactIn: true, + inAmount: amountIn, + quotedOutAmount: amountOut, + slippageBps: 50, + swapResponseModifier: modifyUsdtToUsdcSwapResponseForTest, + }, + ); + + const senderAfter = await getUsdtAtaBalance(connection, solanaPayer.publicKey); + assert.equal(senderBefore - senderAfter, amountIn); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountOut"] = targetAmountOut; + localVariables["relayingFee"] = expectedRelayerFee; + }); + + it("Inbound", async function () { + const minAmountOut = ethers.BigNumber.from( + localVariables["amountOut"].toString(), + ); + const balanceBefore = await toUsdt.contract.balanceOf(to.wallet.address); + const feeRecipientBefore = await toUsdc.contract.balanceOf(EVM_FEE_RECIPIENT); + + // Perform the relay from the relayer wallet. + const receipt = await to.contract + .connect(to.relayer) + .redeem([], localVariables["orderResponse"], { + value: localVariables["gasDropoff"], + }) + .then((tx) => tx.wait()); + + const balanceAfter = await toUsdt.contract.balanceOf(to.wallet.address); + const feeRecipientAfter = await toUsdc.contract.balanceOf(EVM_FEE_RECIPIENT); + + assert.isTrue(balanceAfter.sub(balanceBefore).gt(minAmountOut)); + assert.isTrue( + feeRecipientAfter + .sub(feeRecipientBefore) + .eq(ethers.BigNumber.from(localVariables["relayingFee"])), + ); + + localVariables = {}; + }); + }); + }); + }); + + describe("Ethereum <> Solana", function () { + const fromChain = "Ethereum"; + const toChain = "Solana"; + + // From contracts. + const from = evmSwapLayerConfig(fromChain); + const fromConfig = EVM_CONFIG[fromChain]; + const fromUsdc = usdcContract(fromChain); + + describe("Usdc", function () { + describe("Direct", function () { + it("Outbound", async function () { + const amountIn = 20_000_000_000; // 20k USDC + + const output: InitiateArgs = { + transferMode: { + mode: "LiquidityLayer", + }, + redeemMode: { + mode: "Direct", + }, + outputToken: { + type: "Usdc", + }, + isExactIn: true, + inputToken: { + type: "Usdc", + amount: BigInt(amountIn), + acquireMode: { + mode: "Preapproved", + }, + }, + }; + + const balanceBefore = await fromUsdc.contract.balanceOf(from.wallet.address); + + const { orderResponse } = await initiateOnEvmSwapLayer( + encodeInitiateArgs(output), + toUniversal(toChain, solanaRecipient.publicKey.toBuffer()), + fromChain, + toChain, + from.contract, + ); + + const balanceAfter = await fromUsdc.contract.balanceOf(from.wallet.address); + assert.equal(balanceBefore.sub(balanceAfter).toNumber(), amountIn); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountIn"] = amountIn; + }); + + it("Inbound", async function () { + // Post the Fill on Solana and derive the account. + const vaaKey = await postSignedVaa( + connection, + solanaPayer, + localVariables["orderResponse"].encodedWormholeMessage, + ); + + // Redeem fill on Solana. + const preparedFill = await redeemFillOnSolana( + connection, + solanaPayer, + solanaTokenRouter, + tokenRouterLkupTable, + { + vaa: vaaKey, + }, + { + encodedCctpMessage: localVariables["orderResponse"].circleBridgeMessage, + cctpAttestation: localVariables["orderResponse"].circleAttestation, + }, + ); + + const recipientBefore = await getUsdcAtaBalance( + connection, + solanaRecipient.publicKey, + ); + + const transferIx = await solanaSwapLayer.completeTransferDirectIx( + { + payer: solanaPayer.publicKey, + preparedFill, + recipient: solanaRecipient.publicKey, + }, + toChainId(fromChain), + ); + + await expectIxOk(connection, [transferIx], [solanaPayer]); + + const recipientAfter = await getUsdcAtaBalance( + connection, + solanaRecipient.publicKey, + ); + assert.equal( + recipientAfter, + recipientBefore + BigInt(localVariables["amountIn"]), + ); + + localVariables = {}; + }); + }); + + describe("Relay", function () { + it("Outbound", async function () { + const amountIn = 20_000_000_000; // 20k USDC + const gasDropoff = BigInt(ONE_ETHER); + + let relayingFee = await from.contract + .batchQueries( + encodeQueriesBatch([ + { + query: "RelayingFee", + chain: toChain, + gasDropoff, + outputToken: { type: "Usdc" }, + }, + ]), + ) + .then((encodedFee) => Number(encodedFee)); + + const output: InitiateArgs = { + transferMode: { + mode: "LiquidityLayer", + }, + redeemMode: { + mode: "Relay", + gasDropoff, + maxRelayingFee: relayingFee, + }, + outputToken: { + type: "Usdc", + }, + isExactIn: false, + inputToken: { + type: "Usdc", + amount: BigInt(amountIn), + acquireMode: { + mode: "Preapproved", + }, + }, + }; + + const balanceBefore = await fromUsdc.contract.balanceOf(from.wallet.address); + + const { orderResponse } = await initiateOnEvmSwapLayer( + encodeInitiateArgs(output), + toUniversal(toChain, solanaRecipient.publicKey.toBuffer()), + fromChain, + toChain, + from.contract, + ); + + const balanceAfter = await fromUsdc.contract.balanceOf(from.wallet.address); + assert.equal( + balanceBefore.sub(balanceAfter).toNumber(), + amountIn + relayingFee, + ); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountIn"] = amountIn; + localVariables["relayingFee"] = relayingFee; + localVariables["gasDropoff"] = gasDropoff; + }); + + it("Inbound", async function () { + // Post the Fill on Solana and derive the account. + const vaaKey = await postSignedVaa( + connection, + solanaRelayer, + localVariables["orderResponse"].encodedWormholeMessage, + ); + + // Redeem fill on Solana. + const preparedFill = await redeemFillOnSolana( + connection, + solanaRelayer, + solanaTokenRouter, + tokenRouterLkupTable, + { + vaa: vaaKey, + }, + { + encodedCctpMessage: localVariables["orderResponse"].circleBridgeMessage, + cctpAttestation: localVariables["orderResponse"].circleAttestation, + }, + ); + + const recipientBefore = await getUsdcAtaBalance( + connection, + solanaRecipient.publicKey, + ); + const recipientLamportBefore = await connection.getBalance( + solanaRecipient.publicKey, + ); + const feeRecipientBefore = await getUsdcAtaBalance( + connection, + solanaFeeRecipient.publicKey, + ); + + const transferIx = await solanaSwapLayer.completeTransferRelayIx( + { + payer: solanaRelayer.publicKey, + preparedFill, + recipient: solanaRecipient.publicKey, + }, + toChainId(fromChain), + ); + + await expectIxOk(connection, [transferIx], [solanaRelayer]); + + const recipientAfter = await getUsdcAtaBalance( + connection, + solanaRecipient.publicKey, + ); + const recipientLamportAfter = await connection.getBalance( + solanaRecipient.publicKey, + ); + const feeRecipientAfter = await getUsdcAtaBalance( + connection, + solanaFeeRecipient.publicKey, + ); + + // Confirm the balance changes. Since we're coming from EVM to Solana, + // we need to scale the gas dropoff by 1e9. + const gasDropoff = Number(localVariables["gasDropoff"] / BigInt(1e9)); + const relayingFee = BigInt(localVariables["relayingFee"]); + const amountIn = BigInt(localVariables["amountIn"]); + + assert.equal(recipientAfter - recipientBefore, amountIn); + assert.equal(recipientLamportAfter - recipientLamportBefore, gasDropoff); + assert.equal(feeRecipientAfter, feeRecipientBefore + relayingFee); + }); + }); + }); + + describe("Gas", function () { + describe("Direct", function () { + it("Outbound", async function () { + const amountIn = ethers.utils.parseEther("0.1"); // .1 Ether + const amountOut = 370_000_000n; // 370 USDC + const targetMinAmountOut = 1_900_000_000n; // 1.9 SOL + const currentBlockTime = await from.provider + .getBlock("latest") + .then((b) => b.timestamp); + + const output: InitiateArgs = { + transferMode: { + mode: "LiquidityLayer", + }, + redeemMode: { + mode: "Direct", + }, + outputToken: { + type: "Gas", + swap: { + deadline: 0, + limitAmount: targetMinAmountOut, + type: { + id: "GenericSolana", + dexProgramId: { isSome: false }, + }, + }, + }, + isExactIn: true, + inputToken: { + type: "Gas", + swap: { + deadline: currentBlockTime + 60, + limitAmount: amountOut, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }, + }; + + const balanceBefore = await from.wallet.getBalance(); + + const { orderResponse, receipt } = await initiateOnEvmSwapLayer( + encodeInitiateArgs(output), + toUniversal(toChain, solanaRecipient.publicKey.toBuffer()), + fromChain, + toChain, + from.contract, + { value: amountIn }, + ); + + const balanceAfter = await from.wallet.getBalance(); + assert.isTrue( + balanceBefore + .sub(balanceAfter) + .eq(amountIn.add(receipt.effectiveGasPrice.mul(receipt.gasUsed))), + ); + + localVariables["orderResponse"] = orderResponse; + localVariables["limitAmount"] = targetMinAmountOut; + }); + + it("Inbound", async function () { + // Post the Fill on Solana and derive the account. + const vaaKey = await postSignedVaa( + connection, + solanaRelayer, + localVariables["orderResponse"].encodedWormholeMessage, + ); + + // Redeem fill on Solana. + const preparedFill = await redeemFillOnSolana( + connection, + solanaRelayer, + solanaTokenRouter, + tokenRouterLkupTable, + { + vaa: vaaKey, + }, + { + encodedCctpMessage: localVariables["orderResponse"].circleBridgeMessage, + cctpAttestation: localVariables["orderResponse"].circleAttestation, + }, + ); + + const recipientBefore = await connection.getBalance(solanaRecipient.publicKey); + + await completeSwapForTest( + solanaSwapLayer, + connection, + { + payer: solanaPayer.publicKey, + preparedFill, + recipient: solanaRecipient.publicKey, + }, + { + redeemMode: "direct", + signers: [solanaPayer], + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + ); + + const recipientAfter = await connection.getBalance(solanaRecipient.publicKey); + + assert.isTrue( + recipientAfter - recipientBefore >= Number(localVariables["limitAmount"]), + ); + }); + }); + + describe("Relay", function () { + it("Outbound", async function () { + const amountIn = ethers.utils.parseEther("0.1"); // .1 Ether + const amountOut = 370_000_000n; // 370 USDC + const targetMinAmountOut = 1_900_000_000n; // 1.9 SOL + const currentBlockTime = await from.provider + .getBlock("latest") + .then((b) => b.timestamp); + + let relayingFee: bigint = await from.contract + .batchQueries( + encodeQueriesBatch([ + { + query: "RelayingFee", + chain: toChain, + gasDropoff: 0n, + outputToken: { + type: "Gas", + swapType: "GenericSolana", + swapCount: 1, + }, + }, + ]), + ) + .then((encodedFee) => BigInt(encodedFee)); + + const output: InitiateArgs = { + transferMode: { + mode: "LiquidityLayer", + }, + redeemMode: { + mode: "Relay", + gasDropoff: 0n, + maxRelayingFee: relayingFee, + }, + outputToken: { + type: "Gas", + swap: { + deadline: 0, + limitAmount: targetMinAmountOut, + type: { + id: "GenericSolana", + dexProgramId: { isSome: false }, + }, + }, + }, + isExactIn: true, + inputToken: { + type: "Gas", + swap: { + deadline: currentBlockTime + 60, + limitAmount: amountOut - relayingFee, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }, + }; + + const balanceBefore = await from.wallet.getBalance(); + + const { orderResponse, receipt } = await initiateOnEvmSwapLayer( + encodeInitiateArgs(output), + toUniversal(toChain, solanaRecipient.publicKey.toBuffer()), + fromChain, + toChain, + from.contract, + { value: amountIn }, + ); + + const balanceAfter = await from.wallet.getBalance(); + assert.isTrue( + balanceBefore + .sub(balanceAfter) + .eq(amountIn.add(receipt.effectiveGasPrice.mul(receipt.gasUsed))), + ); + + localVariables["orderResponse"] = orderResponse; + localVariables["limitAmount"] = targetMinAmountOut; + localVariables["relayingFee"] = relayingFee; + }); + + it("Inbound", async function () { + // Post the Fill on Solana and derive the account. + const vaaKey = await postSignedVaa( + connection, + solanaRelayer, + localVariables["orderResponse"].encodedWormholeMessage, + ); + + // Redeem fill on Solana. + const preparedFill = await redeemFillOnSolana( + connection, + solanaRelayer, + solanaTokenRouter, + tokenRouterLkupTable, + { + vaa: vaaKey, + }, + { + encodedCctpMessage: localVariables["orderResponse"].circleBridgeMessage, + cctpAttestation: localVariables["orderResponse"].circleAttestation, + }, + ); + + const recipientBefore = await connection.getBalance(solanaRecipient.publicKey); + const feeRecipientBefore = await getUsdcAtaBalance( + connection, + solanaFeeRecipient.publicKey, + ); + + await completeSwapForTest( + solanaSwapLayer, + connection, + { + payer: solanaRelayer.publicKey, + preparedFill, + recipient: solanaRecipient.publicKey, + }, + { + redeemMode: "relay", + signers: [solanaRelayer], + swapResponseModifier: modifyUsdcToWsolSwapResponseForTest, + }, + ); + + const recipientAfter = await connection.getBalance(solanaRecipient.publicKey); + const feeRecipientAfter = await getUsdcAtaBalance( + connection, + solanaFeeRecipient.publicKey, + ); + + assert.isTrue( + recipientAfter - recipientBefore >= Number(localVariables["limitAmount"]), + ); + assert.equal( + feeRecipientAfter, + feeRecipientBefore + localVariables["relayingFee"], + ); + }); + }); + }); + + describe("Other", function () { + before("Approve Max", async function () { + await usdtContract() + .contract.connect(from.wallet) + .approve(from.contract.address, ethers.constants.MaxUint256) + .then((tx) => tx.wait()); + }); + + describe("Direct", function () { + it("Outbound", async function () { + const amountIn = 49_600_000n; // 49.6 USDT + const amountOut = 49_400_000n; // 49.4 USDC + const targetAmountOut = 49_200_000n; // 49.2 USDT + const currentBlockTime = await from.provider + .getBlock("latest") + .then((b) => b.timestamp); + + const output: InitiateArgs = { + transferMode: { + mode: "LiquidityLayer", + }, + redeemMode: { + mode: "Direct", + }, + outputToken: { + type: "Other", + address: toUniversal(toChain, USDT_MINT_ADDRESS.toString()), + swap: { + deadline: 0, + limitAmount: targetAmountOut, + type: { + id: "GenericSolana", + dexProgramId: { isSome: false }, + }, + }, + }, + isExactIn: true, + inputToken: { + type: "Other", + address: USDT_ETH, + approveCheck: true, + acquireMode: { + mode: "Preapproved", + }, + amount: BigInt(amountIn), + swap: { + deadline: currentBlockTime + 60, + limitAmount: amountOut, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }, + }; + + const balanceBefore = await getUsdtBalanceEthereum(from.wallet); + + const { orderResponse } = await initiateOnEvmSwapLayer( + encodeInitiateArgs(output), + toUniversal(toChain, solanaRecipient.publicKey.toBuffer()), + fromChain, + toChain, + from.contract, + ); + + const balanceAfter = await getUsdtBalanceEthereum(from.wallet); + assert.isTrue( + balanceBefore.sub(balanceAfter).eq(ethers.BigNumber.from(amountIn)), + ); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountOut"] = targetAmountOut; + }); + + it("Inbound", async function () { + // Post the Fill on Solana and derive the account. + const vaaKey = await postSignedVaa( + connection, + solanaRelayer, + localVariables["orderResponse"].encodedWormholeMessage, + ); + + // Redeem fill on Solana. + const preparedFill = await redeemFillOnSolana( + connection, + solanaRelayer, + solanaTokenRouter, + tokenRouterLkupTable, + { + vaa: vaaKey, + }, + { + encodedCctpMessage: localVariables["orderResponse"].circleBridgeMessage, + cctpAttestation: localVariables["orderResponse"].circleAttestation, + }, + ); + + // Fetch usdt balance before. + const recipientBefore = await getUsdtAtaBalance( + connection, + solanaRecipient.publicKey, + ); + + await completeSwapForTest( + solanaSwapLayer, + connection, + { + payer: solanaPayer.publicKey, + preparedFill, + recipient: solanaRecipient.publicKey, + dstMint: USDT_MINT_ADDRESS, + }, + { + redeemMode: "direct", + signers: [solanaPayer], + quotedAmountOut: localVariables["amountOut"], + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + }, + ); + + const recipientAfter = await getUsdtAtaBalance( + connection, + solanaRecipient.publicKey, + ); + assert.isTrue(recipientAfter - recipientBefore >= localVariables["amountOut"]); + }); + }); + + describe("Relay", function () { + it("Outbound", async function () { + const currentBlockTime = await from.provider + .getBlock("latest") + .then((b) => b.timestamp); + + let relayingFee: bigint = await from.contract + .batchQueries( + encodeQueriesBatch([ + { + query: "RelayingFee", + chain: toChain, + gasDropoff: 0n, + outputToken: { + type: "Other", + swapType: "GenericSolana", + swapCount: 1, + }, + }, + ]), + ) + .then((encodedFee) => BigInt(encodedFee)); + + const amountIn = 49_000_000n; // 49 USDT + const targetAmountOut = 47_800_000n; // 47.8 USDT (account for relaying fee) + const amountOut = amountIn - relayingFee - 500_000n; + + const output: InitiateArgs = { + transferMode: { + mode: "LiquidityLayer", + }, + redeemMode: { + mode: "Relay", + gasDropoff: 0n, + maxRelayingFee: relayingFee, + }, + outputToken: { + type: "Other", + address: toUniversal(toChain, USDT_MINT_ADDRESS.toString()), + swap: { + deadline: 0, + limitAmount: targetAmountOut, + type: { + id: "GenericSolana", + dexProgramId: { isSome: false }, + }, + }, + }, + isExactIn: true, + inputToken: { + type: "Other", + address: USDT_ETH, + approveCheck: true, + acquireMode: { + mode: "Preapproved", + }, + amount: BigInt(amountIn), + swap: { + deadline: currentBlockTime + 60, + limitAmount: amountOut, + type: { + id: "UniswapV3", + firstPoolId: 500, + path: [], + }, + }, + }, + }; + + const balanceBefore = await getUsdtBalanceEthereum(from.wallet); + + const { orderResponse } = await initiateOnEvmSwapLayer( + encodeInitiateArgs(output), + toUniversal(toChain, solanaRecipient.publicKey.toBuffer()), + fromChain, + toChain, + from.contract, + ); + + const balanceAfter = await getUsdtBalanceEthereum(from.wallet); + assert.isTrue( + balanceBefore.sub(balanceAfter).eq(ethers.BigNumber.from(amountIn)), + ); + + localVariables["orderResponse"] = orderResponse; + localVariables["amountOut"] = targetAmountOut; + localVariables["relayingFee"] = relayingFee; + }); + + it("Inbound", async function () { + // Post the Fill on Solana and derive the account. + const vaaKey = await postSignedVaa( + connection, + solanaRelayer, + localVariables["orderResponse"].encodedWormholeMessage, + ); + + // Redeem fill on Solana. + const preparedFill = await redeemFillOnSolana( + connection, + solanaRelayer, + solanaTokenRouter, + tokenRouterLkupTable, + { + vaa: vaaKey, + }, + { + encodedCctpMessage: localVariables["orderResponse"].circleBridgeMessage, + cctpAttestation: localVariables["orderResponse"].circleAttestation, + }, + ); + + // Fetch usdt balance before. + const recipientBefore = await getUsdtAtaBalance( + connection, + solanaRecipient.publicKey, + ); + const feeRecipientBefore = await getUsdcAtaBalance( + connection, + solanaFeeRecipient.publicKey, + ); + + await completeSwapForTest( + solanaSwapLayer, + connection, + { + payer: solanaPayer.publicKey, + preparedFill, + recipient: solanaRecipient.publicKey, + dstMint: USDT_MINT_ADDRESS, + }, + { + redeemMode: "relay", + signers: [solanaPayer], + quotedAmountOut: localVariables["amountOut"], + swapResponseModifier: modifyUsdcToUsdtSwapResponseForTest, + }, + ); + + const recipientAfter = await getUsdtAtaBalance( + connection, + solanaRecipient.publicKey, + ); + const feeRecipientAfter = await getUsdcAtaBalance( + connection, + solanaFeeRecipient.publicKey, + ); + assert.isTrue(recipientAfter - recipientBefore >= localVariables["amountOut"]); + assert.equal( + feeRecipientAfter, + feeRecipientBefore + localVariables["relayingFee"], + ); + }); + }); + }); + }); + + async function modifyWsolToUsdcSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): Promise { + const response = JSON.parse( + fs.readFileSync( + `${__dirname}/../../solana/ts/tests/jupiterV6SwapResponses/phoenix_v1_wsol_to_usdc.json`, + { + encoding: "utf-8", + }, + ), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction( + connection, + response, + tokenOwner, + opts, + ); + } + + async function modifyUsdcToWsolSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): Promise { + const response = JSON.parse( + fs.readFileSync( + `${__dirname}/../../solana/ts/tests/jupiterV6SwapResponses/phoenix_v1_usdc_to_wsol.json`, + { + encoding: "utf-8", + }, + ), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction( + connection, + response, + tokenOwner, + opts, + ); + } + + async function modifyUsdtToUsdcSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): Promise { + const response = JSON.parse( + fs.readFileSync( + `${__dirname}/../../solana/ts/tests/jupiterV6SwapResponses/whirlpool_usdt_to_usdc.json`, + { + encoding: "utf-8", + }, + ), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction( + connection, + response, + tokenOwner, + opts, + ); + } + + async function modifyUsdcToUsdtSwapResponseForTest( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ): Promise { + const response = JSON.parse( + fs.readFileSync( + `${__dirname}/../../solana/ts/tests/jupiterV6SwapResponses/whirlpool_usdc_to_usdt.json`, + { + encoding: "utf-8", + }, + ), + ); + + return jupiterV6.modifySharedAccountsRouteInstruction( + connection, + response, + tokenOwner, + opts, + ); + } +}); diff --git a/e2e/tests/helpers/consts.ts b/e2e/tests/helpers/consts.ts new file mode 100644 index 00000000..85d397a4 --- /dev/null +++ b/e2e/tests/helpers/consts.ts @@ -0,0 +1,67 @@ +import { PublicKey } from "@solana/web3.js"; +import { parseSwapLayerEnvFile } from "./"; +import { uint64ToBN } from "@wormhole-foundation/example-liquidity-layer-solana/common"; + +export const GUARDIAN_SET_INDEX = 0; + +export const SOLANA_SWAP_LAYER_ID = "SwapLayer1111111111111111111111111111111111"; +export const USDC_MINT_ADDRESS = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"); + +export const EVM_PRIVATE_KEY = "0x395df67f0c2d2d9fe1ad08d1bc8b6627011959b79c53d7dd6a3536a33ab8a4fd"; +export const RELAYER_PRIVATE_KEY = + "0xe485d098507f54e7733a205420dfddbe58db035fa577fc294ebd14db90767a52"; +export const GUARDIAN_PRIVATE_KEY = + "cfb12303a19cde580bb4dd771639b0d26bc68353645571a8cff516ab2ee113a0"; +export const EVM_FEE_RECIPIENT = "0x22d491Bde2303f2f43325b2108D26f1eAbA1e32b"; + +export const ATTESTATION_TYPE_LL = 0; + +export const ONE_ETHER = 1000000000000000000; +export const ONE_SOL = 1000000000; + +// Avalanche Mainnet Fork +export const EVM_LOCALHOSTS = { + Ethereum: "http://127.0.0.1:8548", + Base: "http://127.0.0.1:8549", +}; + +// USDT tokens on Ethereum. +export const USDT_ETH = "0xdAC17F958D2ee523a2206206994597C13D831ec7"; + +export const REGISTERED_EVM_CHAINS = ["Ethereum", "Base"] as const; +export const EVM_CONFIG = { + Ethereum: { + cctpDomain: 0, + ...parseSwapLayerEnvFile(`${__dirname}/../../../evm/env/localnet/Ethereum.env`), + relayParams: { + baseFee: 250_000, // $0.25 + nativeTokenPrice: uint64ToBN(10_000_000), // $10 + maxGasDropoff: 1_000_000, // 1 SOL + gasDropoffMargin: 10_000, // 1% + executionParams: { + evm: { + gasPrice: 25_000, // 25 Gwei + gasPriceMargin: 250_000, // 25% + }, + }, + swapTimeLimit: { fastLimit: 30, finalizedLimit: 20 * 60 }, + }, + }, + Base: { + cctpDomain: 6, + ...parseSwapLayerEnvFile(`${__dirname}/../../../evm/env/localnet/Base.env`), + relayParams: { + baseFee: 250_000, // $0.25 + nativeTokenPrice: uint64ToBN(10_000_000), // $10 + maxGasDropoff: 1_000_000, // 1 SOL + gasDropoffMargin: 10_000, // 1% + executionParams: { + evm: { + gasPrice: 25_000, // 25 Gwei + gasPriceMargin: 250_000, // 25% + }, + }, + swapTimeLimit: { fastLimit: 30, finalizedLimit: 20 * 60 }, + }, + }, +} as const; diff --git a/e2e/tests/helpers/env.ts b/e2e/tests/helpers/env.ts new file mode 100644 index 00000000..9ccd436d --- /dev/null +++ b/e2e/tests/helpers/env.ts @@ -0,0 +1,129 @@ +import * as fs from "fs"; +import { parse as envParse } from "envfile"; +import { Chain } from "@wormhole-foundation/sdk-base"; +import { EVM_CONFIG, EVM_LOCALHOSTS, EVM_PRIVATE_KEY, RELAYER_PRIVATE_KEY, USDT_ETH } from "./"; +import { ethers } from "ethers"; +import { abi as swapLayerAbi } from "../../../evm/out/ISwapLayer.sol/ISwapLayer.json"; +import { abi as wormholeAbi } from "../../../evm/out/IWormhole.sol/IWormhole.json"; +import { abi as tokenMessengerAbi } from "../../../evm/out/ITokenMessenger.sol/ITokenMessenger.json"; +import { abi as messageTransmitterAbi } from "../../../evm/out/IMessageTransmitter.sol/IMessageTransmitter.json"; + +export type SwapLayerEnv = { + tokenRouter: string; + swapLayer: string; + coreBridge: string; + circleTokenMessenger: string; + usdc: string; +}; + +export function parseSwapLayerEnvFile(envPath: string): SwapLayerEnv { + if (!fs.existsSync(envPath)) { + console.log(envPath); + throw new Error(`${envPath} non-existent`); + } + + const raw = fs.readFileSync(envPath, "utf8"); + const contents = envParse(raw.replace(/export RELEASE_/g, "")); + + const keys = ["TOKEN_ROUTER", "SWAP_LAYER", "TOKEN_MESSENGER", "WORMHOLE", "USDC"]; + for (const key of keys) { + if (!contents[key]) { + throw new Error(`no ${key}`); + } + } + + return { + tokenRouter: contents.TOKEN_ROUTER, + swapLayer: contents.SWAP_LAYER, + coreBridge: contents.WORMHOLE, + circleTokenMessenger: contents.TOKEN_MESSENGER, + usdc: contents.USDC, + }; +} + +export function baseContract( + chain: Chain, + abi: any, + address: string, +): { + provider: ethers.providers.JsonRpcProvider; + wallet: ethers.Wallet; + contract: ethers.Contract; +} { + const provider = new ethers.providers.JsonRpcProvider(EVM_LOCALHOSTS[chain]); + const wallet = new ethers.Wallet(EVM_PRIVATE_KEY, provider); + const contract = new ethers.Contract(address, abi, wallet); + + return { provider, wallet, contract }; +} + +export function evmSwapLayerConfig(chain: Chain): { + provider: ethers.providers.JsonRpcProvider; + wallet: ethers.Wallet; + relayer: ethers.Wallet; + contract: ethers.Contract; +} { + const base = baseContract(chain, swapLayerAbi, EVM_CONFIG[chain].swapLayer); + + return { ...base, relayer: new ethers.Wallet(RELAYER_PRIVATE_KEY, base.provider) }; +} + +export function wormholeContract(chain: Chain): { + provider: ethers.providers.JsonRpcProvider; + wallet: ethers.Wallet; + contract: ethers.Contract; +} { + return baseContract(chain, wormholeAbi, EVM_CONFIG[chain].coreBridge); +} + +export async function circleContract(chain: Chain): Promise<{ + provider: ethers.providers.JsonRpcProvider; + wallet: ethers.Wallet; + tokenMessenger: ethers.Contract; + messageTransmitter: ethers.Contract; +}> { + const { + provider, + wallet, + contract: tokenMessenger, + } = baseContract(chain, tokenMessengerAbi, EVM_CONFIG[chain].circleTokenMessenger); + + // Create a message transmitter contract too. + const messageTransmitterAddress = await tokenMessenger.localMessageTransmitter(); + const messageTransmitter = new ethers.Contract( + messageTransmitterAddress, + messageTransmitterAbi, + wallet, + ); + + return { provider, wallet, tokenMessenger, messageTransmitter }; +} + +export function usdcContract(chain: Chain) { + return baseContract( + chain, + [ + "function allowance(address owner, address spender) external view returns (uint256)", + "function approve(address spender, uint256 amount) returns (bool)", + "function mint(address to, uint256 amount)", + "function balanceOf(address account) external view returns (uint256)", + "function transfer(address recipient, uint256 amount) external returns (bool)", + "function configureMinter(address minter, uint256 minterAllowedAmount)", + "function masterMinter() external view returns (address)", + ], + EVM_CONFIG[chain].usdc, + ); +} + +export function usdtContract() { + return baseContract( + "Ethereum", + [ + "function allowance(address owner, address spender) external view returns (uint256)", + "function approve(address spender, uint256 amount) returns (bool)", + "function balanceOf(address account) external view returns (uint256)", + "function transfer(address recipient, uint256 amount) external returns (bool)", + ], + USDT_ETH, + ); +} diff --git a/e2e/tests/helpers/fork.ts b/e2e/tests/helpers/fork.ts new file mode 100644 index 00000000..e5ef1026 --- /dev/null +++ b/e2e/tests/helpers/fork.ts @@ -0,0 +1,146 @@ +import { ethers } from "ethers"; +import { assert } from "chai"; +import { GUARDIAN_PRIVATE_KEY, circleContract, wormholeContract, usdcContract } from "."; +import { Chain } from "@wormhole-foundation/sdk-base"; + +export async function overrideWormholeAnvil(chain: Chain, guardianSetIndex: number): Promise { + const { provider, contract: coreBridge } = wormholeContract(chain); + + const abiCoder = ethers.utils.defaultAbiCoder; + + const currGuardianSetIndex = await coreBridge.getCurrentGuardianSetIndex(); + if (currGuardianSetIndex != guardianSetIndex) { + await provider.send("anvil_setStorageAt", [ + coreBridge.address, + ethers.utils.hexZeroPad("0x3", 32), + ethers.utils.hexZeroPad("0x0", 32), + ]); + } + + // 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(coreBridge.address, guardianSetSlot) + .then((value) => ethers.BigNumber.from(value).toBigInt()); + for (let i = 1; i < numGuardians; ++i) { + await provider.send("anvil_setStorageAt", [ + coreBridge.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", [ + coreBridge.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", [ + coreBridge.address, + guardianSetSlot, + ethers.utils.hexZeroPad("0x1", 32), + ]); + + // Confirm guardian set override + const guardians = await coreBridge.getGuardianSet(guardianSetIndex).then( + (guardianSet: any) => guardianSet[0], // first element is array of keys + ); + assert( + guardianSetIndex == (await coreBridge.getCurrentGuardianSetIndex()), + "Guardian set index should be set", + ); + assert(guardians.length === 1, "Guardian set length should be 1"); + assert(guardians[0] === devnetGuardian, "Guardian set should be devnet key"); +} + +export async function overrideCircleAnvil(chain: Chain): Promise { + let { provider, messageTransmitter } = await circleContract(chain); + + // fetch attestation manager address + const attesterManager = await messageTransmitter.attesterManager(); + const myAttester = new ethers.Wallet(GUARDIAN_PRIVATE_KEY, provider); + + // start prank (impersonate the attesterManager) + await provider.send("anvil_impersonateAccount", [attesterManager]); + await provider.send("anvil_setBalance", [ + attesterManager, + ethers.BigNumber.from("1000000000000000000")._hex, + ]); + + // update the number of required attestations to one + messageTransmitter = messageTransmitter.connect(provider.getSigner(attesterManager)); + await messageTransmitter.setSignatureThreshold(ethers.BigNumber.from("1")); + + // enable devnet guardian as attester + await messageTransmitter.enableAttester(myAttester.address); + + // 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 messageTransmitter.getEnabledAttester( + numAttesters.sub(ethers.BigNumber.from("1")), + ); + + assert(attester === myAttester.address, "Attester address should be devnet key"); +} + +export async function mintUsdcForTest(chain: Chain, mintAmount: string): Promise { + let { provider, wallet, contract: usdc } = await usdcContract(chain); + + // fetch master minter address + const masterMinter = await usdc.masterMinter(); + + // start prank (impersonate the Circle masterMinter) + await provider.send("anvil_impersonateAccount", [masterMinter]); + await provider.send("anvil_setBalance", [ + masterMinter, + ethers.BigNumber.from("1000000000000000000")._hex, + ]); + + // configure the wallet as a minter + { + usdc = usdc.connect(provider.getSigner(masterMinter)); + await usdc.configureMinter(wallet.address, ethers.constants.MaxUint256); + } + + // stop prank + await provider.send("anvil_stopImpersonatingAccount", [masterMinter]); + + // mint USDC and confirm with a balance check + { + const amount = ethers.utils.parseUnits(mintAmount, 6); + + const balanceBefore = await usdc.balanceOf(wallet.address); + + usdc = usdc.connect(wallet); + await usdc.mint(wallet.address, amount).then((tx) => tx.wait()); + + const balanceAfter = await usdc.balanceOf(wallet.address); + assert(balanceAfter.sub(balanceBefore).eq(amount), "USDC minting failed"); + } +} diff --git a/e2e/tests/helpers/guardians.ts b/e2e/tests/helpers/guardians.ts new file mode 100644 index 00000000..1bfe3679 --- /dev/null +++ b/e2e/tests/helpers/guardians.ts @@ -0,0 +1,108 @@ +import { ethers } from "ethers"; +import { parseEvmEvents, parseEvmEvent } from "@wormhole-foundation/example-liquidity-layer-evm"; +import { GUARDIAN_PRIVATE_KEY } from "./consts"; +import { Chain, contracts, toChain } from "@wormhole-foundation/sdk-base"; +import { VAA, serialize, toUniversal } from "@wormhole-foundation/sdk-definitions"; +import { mocks } from "@wormhole-foundation/sdk-definitions/testing"; +import { Connection, PublicKey } from "@solana/web3.js"; +import { deserializePostMessage } from "@wormhole-foundation/sdk-solana-core"; + +export class GuardianNetwork { + guardians: mocks.MockGuardians; + + constructor(guardianSetIndex: number) { + this.guardians = new mocks.MockGuardians(guardianSetIndex, [GUARDIAN_PRIVATE_KEY]); + } + + async observeSolana(connection: Connection, message: PublicKey) { + const { + emitterAddress, + emitterChain, + sequence, + timestamp, + nonce, + consistencyLevel, + payload, + } = await connection + .getAccountInfo(new PublicKey(message)) + .then((info) => deserializePostMessage(info?.data!)); + + const foreignEmitter = new mocks.MockEmitter( + emitterAddress, + toChain(emitterChain), + sequence, + ); + + const published = foreignEmitter.publishMessage( + nonce, + payload, + consistencyLevel, + timestamp, + ); + + return serialize(this.guardians.addSignatures(published, [0])); + } + + async evmBody( + message: ethers.utils.Result, + provider: ethers.providers.Provider, + chain: Chain, + txReceipt: ethers.ContractReceipt, + ) { + const { sender: emitterAddress, sequence, nonce, payload, consistencyLevel } = message; + + const foreignEmitter = new mocks.MockEmitter( + toUniversal(chain, emitterAddress), + chain, + sequence, + ); + + const block = await provider.getBlock(txReceipt.blockNumber); + const published = foreignEmitter.publishMessage( + nonce, + Buffer.from(payload.substring(2), "hex"), + consistencyLevel, + block.timestamp, + ); + + return published; + } + + async observeEvm( + provider: ethers.providers.Provider, + chain: Chain, + txReceipt: ethers.ContractReceipt, + ) { + const coreBridgeAddress = contracts.coreBridge.get("Mainnet", chain)!; + const message = parseEvmEvent( + txReceipt, + coreBridgeAddress, + "LogMessagePublished(address indexed sender, uint64 sequence, uint32 nonce, bytes payload, uint8 consistencyLevel)", + ); + + const body = await this.evmBody(message, provider, chain, txReceipt); + return serialize(this.guardians.addSignatures(body, [0])); + } + + async observeManyEvm( + provider: ethers.providers.Provider, + chain: Chain, + txReceipt: ethers.ContractReceipt, + ) { + const coreBridgeAddress = contracts.coreBridge.get("Mainnet", chain)!; + const messages = parseEvmEvents( + txReceipt, + coreBridgeAddress, + "LogMessagePublished(address indexed sender, uint64 sequence, uint32 nonce, bytes payload, uint8 consistencyLevel)", + ); + + const signedMessages: VAA[] = []; + + for (const message of messages) { + const body = await this.evmBody(message, provider, chain, txReceipt); + signedMessages.push(this.guardians.addSignatures(body, [0])); + } + + return signedMessages.map((vaa) => serialize(vaa)); + } +} diff --git a/e2e/tests/helpers/index.ts b/e2e/tests/helpers/index.ts new file mode 100644 index 00000000..87075eb3 --- /dev/null +++ b/e2e/tests/helpers/index.ts @@ -0,0 +1,5 @@ +export * from "./env"; +export * from "./consts"; +export * from "./fork"; +export * from "./utils"; +export * from "./guardians"; diff --git a/e2e/tests/helpers/utils.ts b/e2e/tests/helpers/utils.ts new file mode 100644 index 00000000..cdec3fba --- /dev/null +++ b/e2e/tests/helpers/utils.ts @@ -0,0 +1,428 @@ +import { + ComputeBudgetProgram, + Connection, + Keypair, + PublicKey, + Signer, + TransactionInstruction, +} from "@solana/web3.js"; +import * as splToken from "@solana/spl-token"; +import { + OrderResponse, + LiquidityLayerTransactionResult, +} from "@wormhole-foundation/example-liquidity-layer-evm"; +import { UniversalAddress, deserialize, toUniversal } from "@wormhole-foundation/sdk-definitions"; +import { CORE_BRIDGE_PID, USDT_MINT_ADDRESS } from "../../../solana/ts/tests/helpers"; +import { + CircleAttester, + expectIxOk, + postVaa, +} from "@wormhole-foundation/example-liquidity-layer-solana/testing"; +import { utils as coreUtils } from "@wormhole-foundation/sdk-solana-core"; +import { ethers } from "ethers"; +import { TokenRouterProgram } from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; +import { OutputToken, SwapLayerProgram } from "../../../solana/ts/src/swapLayer"; +import { Uint64 } from "@wormhole-foundation/example-liquidity-layer-solana/common"; +import { Chain, toChainId } from "@wormhole-foundation/sdk-base"; +import * as jupiterV6 from "../../../solana/ts/src/jupiterV6"; +import { + EVM_CONFIG, + GUARDIAN_SET_INDEX, + GuardianNetwork, + USDC_MINT_ADDRESS, + circleContract, + usdtContract, +} from "."; + +export async function postSignedVaa( + connection: Connection, + payer: Keypair, + vaa: Uint8Array | Buffer, +) { + await postVaa(connection, payer, Buffer.from(vaa)); + const parsed = deserialize("Uint8Array", vaa); + return coreUtils.derivePostedVaaKey(CORE_BRIDGE_PID, Buffer.from(parsed.hash)); +} + +export async function getCircleMessageSolana( + tokenRouter: TokenRouterProgram, + preparedOrder: PublicKey, +) { + const cctpMessage = tokenRouter.cctpMessageAddress(preparedOrder); + const messageTransmitter = tokenRouter.messageTransmitterProgram(); + const { message } = await messageTransmitter.fetchMessageSent(cctpMessage); + return message; +} + +export async function redeemFillOnSolana( + connection: Connection, + payer: Keypair, + tokenRouter: TokenRouterProgram, + tokenRouterLkupTable: PublicKey, + accounts: { + vaa: PublicKey; + routerEndpoint?: PublicKey; + }, + args: { + encodedCctpMessage: Buffer; + cctpAttestation: Buffer; + }, +) { + const ix = await tokenRouter.redeemCctpFillIx({ payer: payer.publicKey, ...accounts }, args); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 300_000, + }); + + const { value: lookupTableAccount } = + await connection.getAddressLookupTable(tokenRouterLkupTable); + + await expectIxOk(connection, [computeIx, ix], [payer], { + addressLookupTableAccounts: [lookupTableAccount!], + }); + + return tokenRouter.preparedFillAddress(accounts.vaa); +} + +type StageOutboundArgs = { + exactIn?: boolean; + transferType?: "sender" | "native"; + redeemOption?: + | { relay: { gasDropoff: number; maxRelayerFee: Uint64 } } + | { payload: Uint8Array | Buffer } + | null; + outputToken?: OutputToken | null; +}; + +export async function stageOutboundOnSolana( + swapLayer: SwapLayerProgram, + amountIn: bigint, + targetChain: Chain, + foreignRecipientAddress: number[], + payer: Keypair, + accounts: { + senderToken: PublicKey; + sender?: PublicKey; + srcMint?: PublicKey; + usdcRefundToken: PublicKey; + }, + opts: StageOutboundArgs = {}, +) { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + let { redeemOption, outputToken, transferType, exactIn } = opts; + redeemOption ??= null; + outputToken ??= null; + transferType ??= "sender"; + exactIn ??= false; + + const [, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + ...accounts, + stagedOutbound, + }, + { + transferType, + amountIn, + isExactIn: exactIn, + targetChain: toChainId(targetChain), + recipient: foreignRecipientAddress, + redeemOption, + outputToken, + }, + ); + + await expectIxOk(swapLayer.connection(), [ix], [payer, stagedOutboundSigner]); + + const stagedCustodyToken = swapLayer.stagedCustodyTokenAddress(stagedOutbound); + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + + return { stagedOutbound, stagedCustodyToken, preparedOrder }; +} + +const JUPITER_V6_LUT_ADDRESSES = [ + new PublicKey("GxS6FiQ3mNnAar9HGQ6mxP7t6FcwmHkU7peSeQDUHmpN"), + new PublicKey("HsLPzBjqK3SUKQZwHdd2QHVc9cioPrsHNw9GcUDs7WL7"), +]; + +const luts: PublicKey[] = []; +for (let i = 0; i < JUPITER_V6_LUT_ADDRESSES.length; ++i) { + luts.push(JUPITER_V6_LUT_ADDRESSES[i]); +} + +export async function completeSwapForTest( + swapLayer: SwapLayerProgram, + connection: Connection, + accounts: { + payer: PublicKey; + preparedFill: PublicKey; + recipient: PublicKey; + recipientToken?: PublicKey; + dstMint?: PublicKey; + }, + opts: { + redeemMode: "direct" | "relay"; + signers: Signer[]; + inAmount?: bigint; + quotedAmountOut?: bigint; + swapResponseModifier: ( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ) => Promise; + additionalLuts?: PublicKey[]; + }, +): Promise { + let { signers, swapResponseModifier, additionalLuts } = opts; + + additionalLuts ??= []; + + const { instruction: cpiInstruction } = await swapResponseModifier( + swapLayer.swapAuthorityAddress(accounts.preparedFill), + { + cpi: true, + inAmount: opts.inAmount, + quotedOutAmount: opts.quotedAmountOut, + }, + ); + + let ix; + if (opts.redeemMode === "direct") { + ix = await swapLayer.completeSwapDirectIx(accounts, { cpiInstruction }); + } else if (opts.redeemMode === "relay") { + ix = await swapLayer.completeSwapRelayIx(accounts, { cpiInstruction }); + } + + const ixs = [ + ComputeBudgetProgram.setComputeUnitLimit({ + units: 700_000, + }), + ix, + ]; + + const addressLookupTableAccounts = await Promise.all( + [...luts, ...additionalLuts].map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value!; + }), + ); + + await expectIxOk(swapLayer.connection(), ixs, signers, { + addressLookupTableAccounts, + }); +} + +export async function swapExactInForTest( + swapLayer: SwapLayerProgram, + accounts: { + payer: PublicKey; + stagedOutbound: PublicKey; + stagedCustodyToken?: PublicKey; + preparedOrder?: PublicKey; + srcMint?: PublicKey; + srcTokenProgram?: PublicKey; + preparedBy?: PublicKey; + usdcRefundToken?: PublicKey; + srcResidual?: PublicKey; + }, + args: { + cpiInstruction: TransactionInstruction; + }, + opts: { + additionalLuts?: PublicKey[]; + signers: Signer[]; + }, +) { + let { additionalLuts, signers } = opts; + additionalLuts ??= []; + + const ix = await swapLayer.initiateSwapExactInIx(accounts, args); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 700_000, + }); + + const addressLookupTableAccounts = await Promise.all( + [...luts, ...additionalLuts].map(async (lookupTableAddress) => { + const resp = await swapLayer.connection().getAddressLookupTable(lookupTableAddress); + return resp.value!; + }), + ); + + await expectIxOk(swapLayer.connection(), [computeIx, ix], signers, { + addressLookupTableAccounts, + }); +} + +export async function getUsdtAtaBalance(connection, owner) { + return splToken + .getAccount(connection, splToken.getAssociatedTokenAddressSync(USDT_MINT_ADDRESS, owner)) + .then((token) => token.amount) + .catch(() => 0n); +} + +export async function getUsdtBalanceEthereum(wallet: ethers.Wallet): Promise { + const { contract } = usdtContract(); + + return contract.balanceOf(wallet.address); +} + +export async function initiateOnEvmSwapLayer( + encodedArgs: Uint8Array, + recipient: UniversalAddress, + fromChain: Chain, + toChain: Chain, + contract: ethers.Contract, + overrides?: { value: ethers.BigNumber }, +): Promise<{ orderResponse: OrderResponse; receipt: ethers.providers.TransactionReceipt }> { + const guardianNetwork = new GuardianNetwork(GUARDIAN_SET_INDEX); + const circleAttester = new CircleAttester(); + const fromConfig = EVM_CONFIG[fromChain]; + + if (overrides === undefined) { + overrides = { value: ethers.BigNumber.from(0) }; + } + + const receipt = await contract + .initiate(toChainId(toChain), recipient.address, encodedArgs, overrides) + .then((tx) => tx.wait()); + + // Fetch the vaa and cctp attestation. + const result = LiquidityLayerTransactionResult.fromEthersTransactionReceipt( + toChainId(fromChain), + fromConfig.tokenRouter, + fromConfig.coreBridge, + receipt, + await circleContract(fromChain).then((c) => c.messageTransmitter.address), + ); + + // Create a signed VAA and circle attestation. + const fillVaa = await guardianNetwork.observeEvm(contract.provider, fromChain, receipt); + + return { + orderResponse: { + encodedWormholeMessage: Buffer.from(fillVaa), + circleBridgeMessage: result.circleMessage!, + circleAttestation: circleAttester.createAttestation(result.circleMessage!), + }, + receipt, + }; +} + +type SwapArgs = { + swapResponseModifier?: ( + tokenOwner: PublicKey, + opts: jupiterV6.ModifySharedAccountsRouteOpts, + ) => Promise; + slippageBps?: number; + inAmount?: bigint; + quotedOutAmount?: bigint; +}; + +export async function initiateOnSolanaSwapLayer( + swapLayer: SwapLayerProgram, + payer: Keypair, + amountIn: bigint, + toChain: Chain, + recipient: UniversalAddress, + accounts: { + senderToken?: PublicKey; + sender?: PublicKey; + srcMint?: PublicKey; + usdcRefundToken?: PublicKey; + }, + opts: StageOutboundArgs & SwapArgs = {}, +): Promise { + const connection = swapLayer.connection(); + const tokenRouter = swapLayer.tokenRouterProgram(); + const guardianNetwork = new GuardianNetwork(GUARDIAN_SET_INDEX); + const circleAttester = new CircleAttester(); + + // Accounts. + let { senderToken, srcMint, usdcRefundToken } = accounts; + srcMint ??= USDC_MINT_ADDRESS; + senderToken ??= splToken.getAssociatedTokenAddressSync(srcMint, payer.publicKey); + usdcRefundToken ??= splToken.getAssociatedTokenAddressSync(USDC_MINT_ADDRESS, payer.publicKey); + + // Opts. + let { redeemOption, outputToken, transferType, exactIn } = opts; + let { swapResponseModifier, slippageBps, inAmount, quotedOutAmount } = opts; + + // Opts. + const { stagedOutbound, stagedCustodyToken, preparedOrder } = await stageOutboundOnSolana( + swapLayer, + amountIn, + toChain, + Array.from(recipient.address), + payer, + { + senderToken, + usdcRefundToken, + ...accounts, + }, + { + redeemOption, + outputToken, + transferType, + exactIn, + }, + ); + + if (swapResponseModifier === undefined) { + // Send the transfer. + const initiateIx = await swapLayer.initiateTransferIx({ + payer: payer.publicKey, + preparedOrder, + stagedOutbound, + stagedCustodyToken, + }); + await expectIxOk(connection, [initiateIx], [payer]); + } else { + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { instruction: cpiInstruction } = await swapResponseModifier(swapAuthority, { + cpi: true, + inAmount, + quotedOutAmount, + slippageBps, + }); + + await swapExactInForTest( + swapLayer, + { + payer: payer.publicKey, + stagedOutbound, + stagedCustodyToken, + preparedOrder, + srcMint, + }, + { cpiInstruction }, + { signers: [payer] }, + ); + } + + const ix = await swapLayer.tokenRouterProgram().placeMarketOrderCctpIx( + { + payer: payer.publicKey, + preparedOrder: preparedOrder, + }, + { + targetChain: toChainId(toChain), + }, + ); + + await expectIxOk(connection, [ix], [payer]); + + // Create a signed VAA and circle attestation. + const fillVaa = await guardianNetwork.observeSolana( + connection, + tokenRouter.coreMessageAddress(preparedOrder), + ); + const circleMessage = await getCircleMessageSolana(tokenRouter, preparedOrder); + + return { + encodedWormholeMessage: fillVaa, + circleBridgeMessage: circleMessage, + circleAttestation: circleAttester.createAttestation(circleMessage), + }; +} diff --git a/e2e/tsconfig.anchor-test.json b/e2e/tsconfig.anchor-test.json new file mode 100644 index 00000000..6fd4df59 --- /dev/null +++ b/e2e/tsconfig.anchor-test.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "types": ["mocha", "chai", "node"], + "typeRoots": ["./node_modules/@types"], + "noEmit": true, + "esModuleInterop": true, + } +} diff --git a/evm/Makefile b/evm/Makefile index c2f1ea46..7ab1d7f9 100644 --- a/evm/Makefile +++ b/evm/Makefile @@ -33,7 +33,7 @@ LIB_DEPS = foundry-rs/forge-std LIB_DEPS += openzeppelin/openzeppelin-contracts@dc44c9f #4.9.6 LIB_DEPS += Uniswap/permit2@cc56ad0 #latest commit as per 22/04/2024 LIB_DEPS += wormhole-foundation/wormhole-solidity-sdk@b935ddc #post-merged branch -LIB_DEPS += wormhole-foundation/example-liquidity-layer@80aebe9 #main branch +LIB_DEPS += wormhole-foundation/example-liquidity-layer@f57444f #main branch # dynamically generate install rule for each lib dependency and add to depdenencies $(foreach dep,$(LIB_DEPS), $(eval $(call install_lib,$(dep)))) @@ -41,5 +41,5 @@ $(foreach dep,$(LIB_DEPS), $(eval $(call install_lib,$(dep)))) clean: forge clean rm -rf lib + rm -rf node_modules @$(MAKE) -C env clean - diff --git a/evm/env/localnet/Base.env b/evm/env/localnet/Base.env new file mode 100644 index 00000000..b228b75c --- /dev/null +++ b/evm/env/localnet/Base.env @@ -0,0 +1,28 @@ +export RELEASE_RPC=https://mainnet.base.org +export RELEASE_PERMIT_2=0x000000000022D473030F116dDEE9F6B43aC78BA3 +export RELEASE_WETH=0x4200000000000000000000000000000000000006 +export RELEASE_UNIVERSAL_ROUTER=0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD +export RELEASE_USDC=0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 +export RELEASE_WORMHOLE=0xbebdb6C8ddC678FfA9f8748f85C815C556Dd8ac6 +export RELEASE_TOKEN_MESSENGER=0x1682Ae6375C4E4A97e4B583BC394c861A46D8962 + +# Deterministic Deployed Addresses +export RELEASE_TOKEN_ROUTER=0x080f810904c717d445955eE6158177497690f23a +export RELEASE_SWAP_LAYER=0xAA3f5Ec1495bE05dc307E98939788405d2be0421 + +# Matching Engine +export RELEASE_ME_ADDRESS=0x7243437995eade7c714a49f9ef36d8b21cb140533b0a479b44f9b0e0dcab815b +export RELEASE_ME_MINT_RECIPIENT=0x1eed1e571c74baefebf90a81035b5847bffbc5ada32bbbc586256fc513c9fe34 + +# EVM Registrations +export RELEASE_EVM_CHAIN=2 +export RELEASE_EVM_DOMAIN=0 +export RELEASE_EVM_TOKEN_ROUTER=0x00000000000000000000000092E813b6BAf1d17618586118C1a3CffFE2D283Dc +export RELEASE_EVM_SWAP_LAYER=0x000000000000000000000000dA11B3bc8705D84BEae4a796035bDcCc9b59d1ee + +# Solana Registrations +export RELEASE_SOL_CHAIN=1 +export RELEASE_SOL_DOMAIN=5 +export RELEASE_SOL_TOKEN_ROUTER=0xcb0406e59555bf0371b7c4fff1812a11a8d92dad02ad422062971d61dcce2cd0 +export RELEASE_SOL_TOKEN_ROUTER_MINT_RECIPIENT=0x335a0a9bf4b24f8065e22f01c3875e55233d28209bc254985dce206338cf644f +export RELEASE_SOL_SWAP_LAYER=0x9fb9f4f1d72bf9e5bd12c996bb162a33ceed72d2e24e985bca01b09c21663b1e \ No newline at end of file diff --git a/evm/env/localnet/Ethereum.env b/evm/env/localnet/Ethereum.env new file mode 100644 index 00000000..58c56404 --- /dev/null +++ b/evm/env/localnet/Ethereum.env @@ -0,0 +1,28 @@ +export RELEASE_RPC=https://eth-mainnet.public.blastapi.io +export RELEASE_PERMIT_2=0x000000000022D473030F116dDEE9F6B43aC78BA3 +export RELEASE_WETH=0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2 +export RELEASE_UNIVERSAL_ROUTER=0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD +export RELEASE_USDC=0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 +export RELEASE_WORMHOLE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B +export RELEASE_TOKEN_MESSENGER=0xbd3fa81b58ba92a82136038b25adec7066af3155 + +# Deterministic Deployed Addresses +export RELEASE_TOKEN_ROUTER=0x92E813b6BAf1d17618586118C1a3CffFE2D283Dc +export RELEASE_SWAP_LAYER=0xdA11B3bc8705D84BEae4a796035bDcCc9b59d1ee + +# Matching Engine +export RELEASE_ME_ADDRESS=0x7243437995eade7c714a49f9ef36d8b21cb140533b0a479b44f9b0e0dcab815b +export RELEASE_ME_MINT_RECIPIENT=0x1eed1e571c74baefebf90a81035b5847bffbc5ada32bbbc586256fc513c9fe34 + +# EVM Registrations +export RELEASE_EVM_CHAIN=30 +export RELEASE_EVM_DOMAIN=6 +export RELEASE_EVM_TOKEN_ROUTER=0x000000000000000000000000080f810904c717d445955eE6158177497690f23a +export RELEASE_EVM_SWAP_LAYER=0x000000000000000000000000AA3f5Ec1495bE05dc307E98939788405d2be0421 + +# Solana Registrations +export RELEASE_SOL_CHAIN=1 +export RELEASE_SOL_DOMAIN=5 +export RELEASE_SOL_TOKEN_ROUTER=0xcb0406e59555bf0371b7c4fff1812a11a8d92dad02ad422062971d61dcce2cd0 +export RELEASE_SOL_TOKEN_ROUTER_MINT_RECIPIENT=0x335a0a9bf4b24f8065e22f01c3875e55233d28209bc254985dce206338cf644f +export RELEASE_SOL_SWAP_LAYER=0x9fb9f4f1d72bf9e5bd12c996bb162a33ceed72d2e24e985bca01b09c21663b1e \ No newline at end of file diff --git a/evm/env/testing.env b/evm/env/testing.env deleted file mode 100644 index 2a9cc8bc..00000000 --- a/evm/env/testing.env +++ /dev/null @@ -1,9 +0,0 @@ -TEST_RPC=https://rpc.ankr.com/eth -TEST_PERMIT2_ADDRESS=0x000000000022D473030F116dDEE9F6B43aC78BA3 -TEST_WNATIVE_ADDRESS=0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 -TEST_USDC_ADDRESS=0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48 -TEST_CCTP_TOKEN_MESSENGER_ADDRESS=0xbd3fa81b58ba92a82136038b25adec7066af3155 -TEST_UNISWAP_ROUTER_ADDRESS=0x3fC91A3afd70395Cd496C647d5a6CC9D4B2b7FAD -TEST_UNISWAP_V3_POSITION_MANAGER_ADDRESS=0xC36442b4a4522E871399CD717aBDD847Ab11FE88 -TEST_TRADERJOE_ROUTER_ADDRESS=0x9A93a421b74F1c5755b83dD2C211614dC419C44b -TEST_WORMHOLE_ADDRESS=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B diff --git a/evm/src/assets/SwapLayerInitiate.sol b/evm/src/assets/SwapLayerInitiate.sol index acc9106b..3e7f8c2f 100644 --- a/evm/src/assets/SwapLayerInitiate.sol +++ b/evm/src/assets/SwapLayerInitiate.sol @@ -270,4 +270,4 @@ abstract contract SwapLayerInitiate is SwapLayerRelayingFees { return offset; } -} +} \ No newline at end of file diff --git a/evm/test/script/DeploySwapLayerForTest.s.sol b/evm/test/script/DeploySwapLayerForTest.s.sol new file mode 100644 index 00000000..24b84c96 --- /dev/null +++ b/evm/test/script/DeploySwapLayerForTest.s.sol @@ -0,0 +1,148 @@ +// SPDX-License-Identifier: Apache 2 + +pragma solidity ^0.8.24; + +import "forge-std/Script.sol"; +import "forge-std/console2.sol"; + +import "wormhole-sdk/proxy/Proxy.sol"; +import {SwapLayer} from "swap-layer/SwapLayer.sol"; +import {Endpoint, FastTransferParameters} from "liquidity-layer/interfaces/ITokenRouterTypes.sol"; +import {ITokenRouter} from "liquidity-layer/interfaces/ITokenRouter.sol"; +import {TokenRouter} from "liquidity-layer/TokenRouter/TokenRouter.sol"; +import "swap-layer/assets/SwapLayerRelayingFees.sol"; + +import {ERC1967Proxy} from "@openzeppelin/proxy/ERC1967/ERC1967Proxy.sol"; + +contract DeploySwapLayerForTest is Script { + // Anvil pubkeys. Associated private keys: + // - 0x4f3edf983ac636a65a842ce7c78d9aa706d3b113bce9c46f30d7d21715b23b1d + // - 0x6cbed15c793ce57650b9877cf6fa156fbef513c4e6134f022a85b1ffdd59b2a1 + // - 0x6370fd033278c143179d81c5526140625662b8daa446c22ee2d73db3707e620c + address assistant = 0x90F8bf6A479f320ead074411a4B0e7944Ea8c9C1; + address feeUpdater = 0xFFcf8FDEE72ac11b5c542428B35EEF5769C409f0; + address feeRecipient = 0x22d491Bde2303f2f43325b2108D26f1eAbA1e32b; + + // Addresses needed to deploy the SwapLayer and TokenRouter contracts. + address permit2Contract = vm.envAddress("RELEASE_PERMIT_2"); + address wnative = vm.envAddress("RELEASE_WETH"); + address uniswapRouterAddress = vm.envAddress("RELEASE_UNIVERSAL_ROUTER"); + address usdc = vm.envAddress("RELEASE_USDC"); + address wormhole = vm.envAddress("RELEASE_WORMHOLE"); + address cctpTokenMessenger = vm.envAddress("RELEASE_TOKEN_MESSENGER"); + address traderJoeRouterAddress = address(0); + + // Matching Engine. + bytes32 matchingEngineAddress = vm.envBytes32("RELEASE_ME_ADDRESS"); + bytes32 matchingEngineMintRecipient = vm.envBytes32("RELEASE_ME_MINT_RECIPIENT"); + + // EVM addresses for registrations. + uint16 evmChain = uint16(vm.envUint("RELEASE_EVM_CHAIN")); + uint32 evmDomain = uint32(vm.envUint("RELEASE_EVM_DOMAIN")); + bytes32 evmTokenRouter = vm.envBytes32("RELEASE_EVM_TOKEN_ROUTER"); + bytes32 evmSwapLayer = vm.envBytes32("RELEASE_EVM_SWAP_LAYER"); + + // SOL addresses for registrations. + uint16 solChain = uint16(vm.envUint("RELEASE_SOL_CHAIN")); + uint32 solDomain = uint32(vm.envUint("RELEASE_SOL_DOMAIN")); + bytes32 solTokenRouter = vm.envBytes32("RELEASE_SOL_TOKEN_ROUTER"); + bytes32 solTokenRouterMintRecipient = + vm.envBytes32("RELEASE_SOL_TOKEN_ROUTER_MINT_RECIPIENT"); + bytes32 solSwapLayer = vm.envBytes32("RELEASE_SOL_SWAP_LAYER"); + + function configureTokenRouter(address router) internal { + // Register the Evm and Solana Token Routers. + ITokenRouter(router).addRouterEndpoint( + evmChain, + Endpoint(evmTokenRouter, evmTokenRouter), + evmDomain + ); + ITokenRouter(router).addRouterEndpoint( + solChain, + Endpoint(solTokenRouter, solTokenRouterMintRecipient), + solDomain + ); + + // Set the fast transfer parameters. + ITokenRouter(router).updateFastTransferParameters( + FastTransferParameters({ + enabled: true, + maxAmount: 50_000e6, // $50,000 + baseFee: 75e4, // $0.75 + initAuctionFee: 75e4 // $0.75 + }) + ); + + ITokenRouter(router).setCctpAllowance(type(uint256).max); + } + + function deployTokenRouter() public returns (address) { + TokenRouter implementation = new TokenRouter( + usdc, + wormhole, + cctpTokenMessenger, + solChain, + matchingEngineAddress, + matchingEngineMintRecipient, + solDomain + ); + + TokenRouter proxy = + TokenRouter(address(new ERC1967Proxy(address(implementation), ""))); + + proxy.initialize(abi.encodePacked(assistant)); + + address tokenRouterAddress = address(proxy); + console.log("Token router deployed at:", tokenRouterAddress); + + configureTokenRouter(tokenRouterAddress); + + return tokenRouterAddress; + } + + function deploy(address tokenRouter) public { + // Sending to and from Solana won't use these params, so we will use them for + // Solana as a placeholder. + FeeParams feeParams; + feeParams = feeParams.baseFee(25e4); // $0.25 + feeParams = feeParams.gasPrice(GasPriceLib.to(25e10)); // 25 Gwei + feeParams = feeParams.gasPriceMargin(PercentageLib.to(25, 0)); // 25% volatility margin + feeParams = feeParams.maxGasDropoff(GasDropoffLib.to(1 ether)); // 1 SOL/ETH + feeParams = feeParams.gasDropoffMargin(PercentageLib.to(1, 0)); // 1% volatility margin + feeParams = feeParams.gasTokenPrice(1e8); // $100.00 + + address swapLayer = address( + new Proxy( + address( + new SwapLayer( + tokenRouter, + permit2Contract, + wnative, + uniswapRouterAddress, + traderJoeRouterAddress + ) + ), + abi.encodePacked( + msg.sender, + assistant, + feeUpdater, + feeRecipient, + solChain, + solSwapLayer, + feeParams, + evmChain, + evmSwapLayer, + feeParams + ) + ) + ); + + console.log("Swap layer deployed at:", swapLayer); + } + + function run() public { + vm.startBroadcast(); + deploy(deployTokenRouter()); + vm.stopBroadcast(); + } +} diff --git a/evm/test/script/start_anvil.sh b/evm/test/script/start_anvil.sh new file mode 100644 index 00000000..2e8a0f0a --- /dev/null +++ b/evm/test/script/start_anvil.sh @@ -0,0 +1,51 @@ +#/bin/bash + +pgrep anvil > /dev/null +if [ $? -eq 0 ]; then + echo "anvil already running" + exit 1; +fi + +ROOT=$(dirname $0) +ENV=$ROOT/../../env/localnet + +OWNER_PRIVATE_KEY=0x646f1ce2fdad0e6deeeb5c7e8e5543bdde65e86029e2fd9fc169899c440a7913 + +. $ENV/Ethereum.env + +# Ethereum (CCTP). +anvil --port 8548 \ + -m "myth like bonus scare over problem client lizard pioneer submit female collect" \ + --fork-url $RELEASE_RPC \ + --fork-block-number 20034932 \ + > /dev/null & + +sleep 2 + +forge script $ROOT/DeploySwapLayerForTest.s.sol \ + --rpc-url http://localhost:8548 \ + --broadcast \ + --private-key $OWNER_PRIVATE_KEY + +. $ENV/Base.env + +# Base (CCTP). +anvil --port 8549 \ + -m "myth like bonus scare over problem client lizard pioneer submit female collect" \ + --fork-url $RELEASE_RPC \ + --fork-block-number 15456753 \ + > /dev/null & + +sleep 2 + +forge script $ROOT/DeploySwapLayerForTest.s.sol \ + --rpc-url http://localhost:8549 \ + --broadcast \ + --private-key $OWNER_PRIVATE_KEY + +# Double-check number of anvil instances. +if [ "$( pgrep anvil | wc -l )" -ne 2 ]; then + echo "Not all anvil instances are running. Try again." + pkill anvil + exit 1 +fi \ No newline at end of file diff --git a/evm/ts-sdk/package.json b/evm/ts-sdk/package.json index 8ea9a2ce..3b4d0cb7 100644 --- a/evm/ts-sdk/package.json +++ b/evm/ts-sdk/package.json @@ -5,14 +5,15 @@ "main": "lib/cjs/index.js", "module": "lib/esm/index.js", "scripts": { - "build": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json" + "build": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json", + "clean":"rm -rf dist" }, "author": "", "license": "ISC", "dependencies": { - "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-evm": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", "typescript": "^5.4.5" } } diff --git a/lib/example-liquidity-layer b/lib/example-liquidity-layer index 40b32813..a1763da8 160000 --- a/lib/example-liquidity-layer +++ b/lib/example-liquidity-layer @@ -1 +1 @@ -Subproject commit 40b328135c95453f41ffb12804cfcce440143c46 +Subproject commit a1763da8aa395c25753a0a5e9781662eb3724e6c diff --git a/package-lock.json b/package-lock.json index f21bc414..b0c35f57 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "@wormhole-foundation/swap-layer", "version": "0.0.1", "workspaces": [ + "e2e", "evm/ts-sdk", "solana" ], @@ -24,14 +25,364 @@ "typescript": "5.4.5" } }, + "e2e": { + "name": "swap-layer-e2e", + "version": "1.0.0", + "dependencies": { + "@solana/web3.js": "^1.91.6", + "@types/chai": "^4.3.16", + "@types/mocha": "^10.0.6", + "@types/node": "^20.12.13", + "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", + "@wormhole-foundation/example-liquidity-layer-evm": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", + "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-solana": "^0.7.0-beta.6", + "chai": "^4.3.4", + "dotenv": "^16.4.5", + "mocha": "^9.0.3", + "prettier": "^3.2.5", + "ts-mocha": "^10.0.0" + }, + "devDependencies": { + "@typechain/ethers-v5": "^11.1.2", + "envfile": "^7.1.0", + "ethers": "^5.7.2", + "typechain": "^8.3.2" + } + }, + "e2e/node_modules/@solana/web3.js": { + "version": "1.91.7", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", + "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", + "dependencies": { + "@babel/runtime": "^7.23.4", + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.3", + "@solana/buffer-layout": "^4.0.1", + "agentkeepalive": "^4.5.0", + "bigint-buffer": "^1.1.5", + "bn.js": "^5.2.1", + "borsh": "^0.7.0", + "bs58": "^4.0.1", + "buffer": "6.0.3", + "fast-stable-stringify": "^1.0.0", + "jayson": "^4.1.0", + "node-fetch": "^2.7.0", + "rpc-websockets": "^7.5.1", + "superstruct": "^0.14.2" + } + }, + "e2e/node_modules/@types/mocha": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", + "integrity": "sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg==" + }, + "e2e/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==" + }, + "e2e/node_modules/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "e2e/node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "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" + } + }, + "e2e/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" + } + }, + "e2e/node_modules/debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "e2e/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==" + }, + "e2e/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==", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=0.12" + } + }, + "e2e/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==", + "engines": { + "node": ">=0.3.1" + } + }, + "e2e/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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "e2e/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==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "e2e/node_modules/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.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" + } + }, + "e2e/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==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "e2e/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==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "e2e/node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "e2e/node_modules/mocha": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.0.3.tgz", + "integrity": "sha512-hnYFrSefHxYS2XFGtN01x8un0EwNu2bzKvhpRFhgoybIvMaOkkL60IVPmkb5h6XDmUl4IMSB+rT5cIO4/4bJgg==", + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.2", + "debug": "4.3.1", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.1.7", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "3.0.4", + "ms": "2.1.3", + "nanoid": "3.1.23", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "wide-align": "1.1.3", + "workerpool": "6.1.5", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "e2e/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==" + }, + "e2e/node_modules/nanoid": { + "version": "3.1.23", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz", + "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "e2e/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==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "e2e/node_modules/superstruct": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", + "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + }, + "e2e/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "e2e/node_modules/workerpool": { + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", + "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==" + }, + "e2e/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" + } + }, + "e2e/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==", + "engines": { + "node": ">=10" + } + }, "evm/ts-sdk": { "name": "@wormhole-foundation/swap-layer-evm", "version": "1.0.0", "license": "ISC", "dependencies": { - "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-evm": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", "typescript": "^5.4.5" } }, @@ -3535,6 +3886,23 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@typechain/ethers-v5": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-11.1.2.tgz", + "integrity": "sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ==", + "dev": true, + "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.3.2", + "typescript": ">=4.3.0" + } + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -3587,8 +3955,7 @@ "node_modules/@types/chai": { "version": "4.3.16", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", - "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", - "dev": true + "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==" }, "node_modules/@types/connect": { "version": "3.4.38", @@ -3645,7 +4012,6 @@ "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true, "optional": true }, "node_modules/@types/lodash": { @@ -3675,9 +4041,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "version": "20.12.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.13.tgz", + "integrity": "sha512-gBGeanV41c1L171rR7wjbMiEpEI/l5XFQdLLfhr/REwpgDy/4U8y89+i8kRiLzDyZdOkXh+cRaTetUnCYutoXA==", "dependencies": { "undici-types": "~5.26.4" } @@ -3699,6 +4065,12 @@ "@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==", + "dev": true + }, "node_modules/@types/secp256k1": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/@types/secp256k1/-/secp256k1-4.0.6.tgz", @@ -3744,22 +4116,35 @@ "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==", - "dev": true + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==" }, "node_modules/@wormhole-foundation/example-liquidity-layer-definitions": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", - "integrity": "sha512-4x514GY7qszuo+9v3oHbytDXOi9M0/q1Ox46qI/ILuHaAPFrh9tEk2E7oXOXF7A6PpVBg2wXf4io1m8sAW60YQ==", + "integrity": "sha512-4h7gcW5Vz0dP5DzuiFjk5p9NW7JzPTvE4WmrFuFZkigzP7Wr1XEekBWOHaJUBe/TqNdEZNZ2wgQmiriLJSnK7w==", + "license": "Apache-2.0", + "dependencies": { + "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-evm": { + "version": "0.0.1", + "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", + "integrity": "sha512-jKbK4SwPvf15dk6r1wcQ98eF01prXKh7dgO3n8a5YfwlrC6TOYTTFbLZUrR8hBEtU/xehAZa5IHSpTncMbVl/g==", + "license": "Apache-2.0", "dependencies": { - "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4" + "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", + "ethers": "^5.7.2" } }, "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "integrity": "sha512-bv3GnsZP5GWVHTlnB+6DriV7NRWoL3PgWaGYHelTOEppYBhuJW6WPsbNNr3b7TMKNizPNNn0tkCWqVwglyU2gA==", + "integrity": "sha512-3tgXF04mJvVkb1kqgD5GVh3vqZtoM02yi2jnk3ylhtxTDOjd/mM/wFh+dgDDvbU8hosBWNVm7UhTD6CUX+A+YQ==", "dependencies": { "@certusone/wormhole-spydk": "^0.0.1", "@coral-xyz/anchor": "^0.30.0", @@ -3769,11 +4154,12 @@ "@solana/web3.js": "^1.91.7", "@types/node-fetch": "^2.6.11", "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", - "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-solana": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-solana": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.6", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", + "bn.js": "^5.2.1", "dotenv": "^16.4.1", "ethers": "^5.7.2", "sha3": "^2.1.4", @@ -3782,20 +4168,20 @@ } }, "node_modules/@wormhole-foundation/sdk-base": { - "version": "0.7.0-beta.4", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.7.0-beta.4.tgz", - "integrity": "sha512-UOMnCvRIsWnfn1jz5SV8YVBu8d7cyp/Z1h6RPcvPuTTR/RUrpQNAdGLSh4tlGUENJEFwNO22p0Vp6xpEekUZbg==", + "version": "0.7.0-beta.6", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.7.0-beta.6.tgz", + "integrity": "sha512-4kaGW9URQspd6uhMOYo18p8pmUD7cQglXcEFq9lhNlurRr/UV09SFVcH12+HXONRZFGxIt3TH73iEPnwKP0eBQ==", "dependencies": { "@scure/base": "^1.1.3" } }, "node_modules/@wormhole-foundation/sdk-connect": { - "version": "0.7.0-beta.4", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.7.0-beta.4.tgz", - "integrity": "sha512-Kncz0/xozMtw6A/SyD2WRg2XMIyy8G7O8CzfHQdXV8Gao2XSbvFvOxM6t13SJa6ZCIEqy8YNYpbDSFky6oOaTw==", + "version": "0.7.0-beta.6", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.7.0-beta.6.tgz", + "integrity": "sha512-ydoUboOJn8F+PhCCC8ZPzlMolBthjwG6orsyvGzkOj+c4gxCXgh/7DghognUkMTjTIUBwkZLURibbgaCvYwFBg==", "dependencies": { - "@wormhole-foundation/sdk-base": "0.7.0-beta.4", - "@wormhole-foundation/sdk-definitions": "0.7.0-beta.4", + "@wormhole-foundation/sdk-base": "0.7.0-beta.6", + "@wormhole-foundation/sdk-definitions": "0.7.0-beta.6", "axios": "^1.4.0" }, "engines": { @@ -3803,9 +4189,9 @@ } }, "node_modules/@wormhole-foundation/sdk-connect/node_modules/axios": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.1.tgz", - "integrity": "sha512-+LV37nQcd1EpFalkXksWNBiA17NZ5m5/WspmHGmZmdx1qBOg/VNq/c4eRJiA9VQQHBOs+N0ZhhdU10h2TyNK7Q==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -3813,21 +4199,21 @@ } }, "node_modules/@wormhole-foundation/sdk-definitions": { - "version": "0.7.0-beta.4", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.7.0-beta.4.tgz", - "integrity": "sha512-F/8okpmZCNO8SVBXsjAMpQmDwTGH0DQopD07dS8gPsNAi8aUFkpOr6fQC69dTs0LeH1GekFCf/iE3ffWR9hkJA==", + "version": "0.7.0-beta.6", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.7.0-beta.6.tgz", + "integrity": "sha512-Wpy3OHvuq5QMxP+vfcdWvIcVc7iXTnb1MS/RroCdYZ2XdikBp4Qv+iFk8AwO7wKdJiXeTWtW2etS9vcvaz9g6g==", "dependencies": { "@noble/curves": "^1.4.0", "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "0.7.0-beta.4" + "@wormhole-foundation/sdk-base": "0.7.0-beta.6" } }, "node_modules/@wormhole-foundation/sdk-evm": { - "version": "0.7.0-beta.4", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.7.0-beta.4.tgz", - "integrity": "sha512-ow3AufZf/+TOH5xwNuxfwp1WJL3tC6C1iz0a2lJnpXRzFB0gB/eKO2O5gCFX87EX0VeVw043Yzr3/ZAjTrSQxQ==", + "version": "0.7.0-beta.6", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.7.0-beta.6.tgz", + "integrity": "sha512-JXUvnWjngVtBCwFC41fTo4xO7vHb39KSsIUgE/UAcPFscoVv9DmktGR8jDm0jLXri4pUqaXLFEDO6K7AABjB6A==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.7.0-beta.4", + "@wormhole-foundation/sdk-connect": "0.7.0-beta.6", "ethers": "^6.5.1" }, "engines": { @@ -3919,30 +4305,30 @@ } }, "node_modules/@wormhole-foundation/sdk-solana": { - "version": "0.7.0-beta.4", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.7.0-beta.4.tgz", - "integrity": "sha512-ZDYpPZSFN6fQhP57SzL9K0JkkJaXTjNmd9GsKPoP6BtiqnTgSnaPEDh/yAGR9QevjnAE2M4/Da9MXOFudJNhhA==", + "version": "0.7.0-beta.6", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.7.0-beta.6.tgz", + "integrity": "sha512-4+jpskWL6NLQ2d/qwD6k5BFi2dDrLM4V+GJD5/ZYUL4OZDubxS3jImIjfXK/Y/26OquytPpl/cfpahxNdo8pOg==", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@coral-xyz/borsh": "0.29.0", "@solana/spl-token": "0.3.9", "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.4" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.6" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-solana-core": { - "version": "0.7.0-beta.4", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.7.0-beta.4.tgz", - "integrity": "sha512-thqDpn8M4NfoxxBAcrZyXIspFBAHBy2HJi3ERAQTaif1IFlZCgtZla09LjvuVVATEPrSteUOhOiWvhn7AcXv1A==", + "version": "0.7.0-beta.6", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.7.0-beta.6.tgz", + "integrity": "sha512-XtMWuuZXMDZdBKar352bB7C6j6Ua6Ltr5TDEUDElHlK37D+oD4Ss8Z2GXvVOLg4BbC9NWlYWCKrVQVbeQ3SeJw==", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@coral-xyz/borsh": "0.29.0", "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.4", - "@wormhole-foundation/sdk-solana": "0.7.0-beta.4" + "@wormhole-foundation/sdk-connect": "0.7.0-beta.6", + "@wormhole-foundation/sdk-solana": "0.7.0-beta.6" }, "engines": { "node": ">=16" @@ -4331,7 +4717,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, "engines": { "node": ">=6" } @@ -4377,7 +4762,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -4451,11 +4835,19 @@ "sprintf-js": "~1.0.2" } }, + "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4596,8 +4988,7 @@ "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==", - "devOptional": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base-x": { "version": "3.0.9", @@ -4663,7 +5054,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, "engines": { "node": ">=8" }, @@ -4750,7 +5140,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "devOptional": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4760,7 +5149,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -4781,8 +5169,7 @@ "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==", - "dev": true + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" }, "node_modules/browserify-aes": { "version": "1.2.0", @@ -4894,8 +5281,7 @@ "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==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/buffer-layout": { "version": "1.2.2", @@ -4996,7 +5382,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5032,7 +5417,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -5175,10 +5559,129 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dependencies": { - "delayed-stream": "~1.0.0" + "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==", + "dev": true, + "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==", + "dev": true, + "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/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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/command-line-usage/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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/command-line-usage/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==", + "dev": true + }, + "node_modules/command-line-usage/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==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/command-line-usage/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/command-line-usage/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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" } }, "node_modules/commander": { @@ -5192,8 +5695,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "devOptional": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/convert-source-map": { "version": "2.0.0", @@ -5432,7 +5934,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -5470,6 +5971,15 @@ "node": ">=6" } }, + "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==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -5717,6 +6227,21 @@ "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" }, + "node_modules/envfile": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/envfile/-/envfile-7.1.0.tgz", + "integrity": "sha512-dyH4QnnZsArCLhPASr29eqBWDvKpq0GggQFTmysTT/S9TTmt1JrEKNvTBc09Cd7ujVZQful2HBGRMe2agu7Krg==", + "dev": true, + "bin": { + "envfile": "bin.cjs" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://bevry.me/fund" + } + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -6152,7 +6677,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6160,6 +6684,18 @@ "node": ">=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==", + "dev": true, + "dependencies": { + "array-back": "^3.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -6177,7 +6713,6 @@ "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, "bin": { "flat": "cli.js" } @@ -6219,17 +6754,29 @@ "node": ">= 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==", + "dev": true, + "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==", - "devOptional": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -6349,7 +6896,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -6433,7 +6979,6 @@ "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true, "engines": { "node": ">=4.x" } @@ -6442,7 +6987,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -6521,7 +7065,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, "bin": { "he": "bin/he" } @@ -6659,7 +7202,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "devOptional": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -6689,7 +7231,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6713,7 +7254,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6739,7 +7279,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -6761,7 +7300,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -6770,7 +7308,6 @@ "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==", - "dev": true, "engines": { "node": ">=8" } @@ -6790,7 +7327,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, "engines": { "node": ">=10" }, @@ -6807,8 +7343,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isomorphic-ws": { "version": "4.0.1", @@ -7588,6 +8123,15 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jsonparse": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", @@ -7791,7 +8335,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "optional": true + "devOptional": true }, "node_modules/lodash.camelcase": { "version": "4.3.0", @@ -7814,7 +8358,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, "dependencies": { "chalk": "^4.1.0", "is-unicode-supported": "^0.1.0" @@ -7914,8 +8457,7 @@ "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==", - "dev": true + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "node_modules/makeerror": { "version": "1.0.12", @@ -8033,7 +8575,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "devOptional": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8042,7 +8583,7 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "optional": true, + "devOptional": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -8054,7 +8595,6 @@ "version": "9.2.2", "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", @@ -8096,14 +8636,12 @@ "node_modules/mocha/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==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "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==", - "dev": true, "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", @@ -8114,7 +8652,6 @@ "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -8130,14 +8667,12 @@ "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==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mocha/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==", - "dev": true, "engines": { "node": ">=0.3.1" } @@ -8146,7 +8681,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -8158,7 +8692,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -8174,7 +8707,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -8194,7 +8726,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8206,7 +8737,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -8218,7 +8748,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -8233,7 +8762,6 @@ "version": "4.2.1", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -8244,14 +8772,12 @@ "node_modules/mocha/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==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mocha/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==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -8266,7 +8792,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -8281,7 +8806,6 @@ "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", @@ -8299,7 +8823,6 @@ "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, "engines": { "node": ">=10" } @@ -8326,7 +8849,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -8445,7 +8967,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8492,7 +9013,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "devOptional": true, "dependencies": { "wrappy": "1" } @@ -8548,7 +9068,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -8622,7 +9141,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -8631,7 +9149,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -8684,7 +9201,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -8717,7 +9233,6 @@ "version": "3.2.5", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", - "dev": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -8870,7 +9385,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -8896,6 +9410,15 @@ "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==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", @@ -9125,7 +9648,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -9287,7 +9809,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9296,7 +9817,6 @@ "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -9350,6 +9870,12 @@ "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==", + "dev": true + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -9422,7 +9948,6 @@ "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==", - "dev": true, "engines": { "node": ">=8" }, @@ -9439,7 +9964,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -9459,6 +9983,10 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/swap-layer-e2e": { + "resolved": "e2e", + "link": true + }, "node_modules/symbol-observable": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", @@ -9468,6 +9996,39 @@ "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==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -9591,7 +10152,6 @@ "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==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -9625,6 +10185,30 @@ "node": ">= 14.0.0" } }, + "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==", + "dev": true, + "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-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==", + "dev": true, + "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", @@ -9700,7 +10284,6 @@ "version": "10.0.0", "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz", "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==", - "dev": true, "dependencies": { "ts-node": "7.0.1" }, @@ -9721,7 +10304,6 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true, "engines": { "node": ">=0.3.1" } @@ -9730,7 +10312,6 @@ "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, "dependencies": { "minimist": "^1.2.6" }, @@ -9742,7 +10323,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz", "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==", - "dev": true, "dependencies": { "arrify": "^1.0.0", "buffer-from": "^1.1.0", @@ -9764,7 +10344,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==", - "dev": true, "engines": { "node": ">=4" } @@ -9822,7 +10401,6 @@ "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", - "dev": true, "optional": true, "dependencies": { "@types/json5": "^0.0.29", @@ -9835,7 +10413,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, "optional": true, "dependencies": { "minimist": "^1.2.0" @@ -9848,7 +10425,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, "optional": true, "engines": { "node": ">=4" @@ -9909,6 +10485,66 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typechain": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/typechain/-/typechain-8.3.2.tgz", + "integrity": "sha512-x/sQYr5w9K7yv3es7jo4KTX05CLxOf7TRWwoHlrjRh8H82G64g+k7VuWPJlgMo6qrjfCulOdfBjiaDtmhFYD/Q==", + "dev": true, + "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/glob": { + "version": "7.1.7", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "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/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/typeforce": { "version": "1.18.0", "resolved": "https://registry.npmjs.org/typeforce/-/typeforce-1.18.0.tgz", @@ -9926,6 +10562,15 @@ "node": ">=14.17" } }, + "node_modules/typical": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz", + "integrity": "sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/u3": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/u3/-/u3-0.1.1.tgz", @@ -9936,6 +10581,15 @@ "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==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -10052,7 +10706,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -10063,6 +10716,53 @@ "node": ">= 8" } }, + "node_modules/wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dependencies": { + "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/wif": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/wif/-/wif-2.0.6.tgz", @@ -10105,11 +10805,32 @@ "node": ">= 12.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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/workerpool": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -10130,8 +10851,7 @@ "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==", - "devOptional": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", @@ -10237,7 +10957,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", @@ -10252,7 +10971,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, "engines": { "node": ">=10" }, @@ -10273,7 +10991,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, @@ -10307,12 +11024,13 @@ "@solana/web3.js": "^1.91.6", "@types/node-fetch": "^2.6.11", "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", + "@wormhole-foundation/example-liquidity-layer-evm": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-evm": "0.7.0-beta.4", - "@wormhole-foundation/sdk-solana": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-evm": "0.7.0-beta.6", + "@wormhole-foundation/sdk-solana": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.6", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", "chai-as-promised": "^7.1.1", "ts-results": "^3.3.0", diff --git a/package.json b/package.json index cf6ba1a8..caaf99b4 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "main": "index.js", "type": "module", "scripts": { + "clean": "npm run clean --workspaces --if-present", "build": "npm run build --workspaces --if-present", "generate": "npm run generate --workspaces --if-present", "test": "npm run test --workspaces --if-present" @@ -25,6 +26,7 @@ "wormhole" ], "workspaces": [ + "e2e", "evm/ts-sdk", "solana" ] diff --git a/solana/Anchor.toml b/solana/Anchor.toml index 03869279..4de644d1 100644 --- a/solana/Anchor.toml +++ b/solana/Anchor.toml @@ -79,25 +79,65 @@ filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messen address = "72bvEFk2Usi2uYc1SnaTNhBcQPc6tiJWXr9oKk7rkd4C" filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/usdc_local_token.json" -### Circle Token Messenger Minter PDA -- USDC Token Pair +### Circle Token Messenger Minter PDA -- USDC Token Pair (Domain 0) [[test.validator.account]] address = "8d1jdvvMFhJfxSzPXcDGtifcGMTvUxc2EpWFstbNzcTL" -filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/usdc_token_pair.json" +filename = "ts/tests/accounts/cctp/usdc_token_pair_0.json" -### Circle Token Messenger Minter PDA -- Ethereum Remote Token Messenger +### Circle Token Messenger Minter PDA -- Remote Token Messenger (Domain 0) [[test.validator.account]] address = "Hazwi3jFQtLKc2ughi7HFXPkpDeso7DQaMR9Ks4afh3j" -filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/ethereum_remote_token_messenger.json" +filename = "ts/tests/accounts/cctp/remote_token_messenger_0.json" -### Circle Token Messenger Minter PDA -- Arbitrum Remote Token Messenger +### Circle Token Messenger Minter PDA -- USDC Token Pair (Domain 1) +[[test.validator.account]] +address = "9nZDjKDg3CDoYYBk6tTSKgVZigENeztf498b9ZTMNzH2" +filename = "ts/tests/accounts/cctp/usdc_token_pair_1.json" + +### Circle Token Messenger Minter PDA -- Remote Token Messenger (Domain 1) +[[test.validator.account]] +address = "FWFDZqvQx3PVr8Y92d8vp5EQFpZNVPA8G42d9KfkhPk5" +filename = "ts/tests/accounts/cctp/remote_token_messenger_1.json" + +### Circle Token Messenger Minter PDA -- USDC Token Pair (Domain 2) +[[test.validator.account]] +address = "F7yEZhdiMSMCDHtdYErSfLsU3hPr7DsTGjZeFTGo1rUf" +filename = "ts/tests/accounts/cctp/usdc_token_pair_2.json" + +### Circle Token Messenger Minter PDA -- Remote Token Messenger (Domain 2) +[[test.validator.account]] +address = "AcUS9yaMAyyC12RCwMnkJBpbkzQfa5d3ErSYdACBapJw" +filename = "ts/tests/accounts/cctp/remote_token_messenger_2.json" + +### Circle Token Messenger Minter PDA -- USDC Token Pair (Domain 3) +[[test.validator.account]] +address = "3jziQYpnNe67yDduLX4VMNYL1VQai4kVHJKBfGKUHkK6" +filename = "ts/tests/accounts/cctp/usdc_token_pair_3.json" + +### Circle Token Messenger Minter PDA -- Remote Token Messenger (Domain 3) [[test.validator.account]] address = "REzxi9nX3Eqseha5fBiaJhTC6SFJx4qJhP83U4UCrtc" -filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/arbitrum_remote_token_messenger.json" +filename = "ts/tests/accounts/cctp/remote_token_messenger_3.json" + +### Circle Token Messenger Minter PDA -- USDC Token Pair (Domain 6) +[[test.validator.account]] +address = "4N7AAQpL49n6exovi55CSo4rCFz5WxXmA8bziBQsh7Vk" +filename = "ts/tests/accounts/cctp/usdc_token_pair_6.json" -### Circle Token Messenger Minter PDA -- Base Remote Token Messenger +### Circle Token Messenger Minter PDA -- Remote Token Messenger (Domain 6) [[test.validator.account]] address = "BWyFzH6LsnmDAaDWbGsriQ9SiiKq1CF6pbH4Ye3kzSBV" -filename = "../lib/example-liquidity-layer/solana/ts/tests/accounts/token_messenger_minter/misconfigured_remote_token_messenger.json" +filename = "ts/tests/accounts/cctp/remote_token_messenger_6.json" + +### Circle Token Messenger Minter PDA -- USDC Token Pair (Domain 7) +[[test.validator.account]] +address = "2urk1WTiiav7kj8Cn3fZ1crFdxY9xNv7WKsusoMXLJEN" +filename = "ts/tests/accounts/cctp/usdc_token_pair_7.json" + +### Circle Token Messenger Minter PDA -- Remote Token Messenger (Domain 7) +[[test.validator.account]] +address = "HENV19bfgVUXtvnCNxYnVDKhDjer6i34xU5sKrcbgdyt" +filename = "ts/tests/accounts/cctp/remote_token_messenger_7.json" ### Circle Message Transmitter PDA -- Message Transmitter Config [[test.validator.account]] diff --git a/solana/Makefile b/solana/Makefile index d7cf8330..fa140b3b 100644 --- a/solana/Makefile +++ b/solana/Makefile @@ -43,9 +43,12 @@ cargo-test: fast-transfer-sync cargo test --workspace --all-targets --features $(NETWORK) .PHONY: anchor-test -anchor-test: ../node_modules $(CLONED_PROGRAMS) +anchor-test: anchor-test-setup anchor test -- --features integration-test +.PHONY: anchor-test-setup +anchor-test-setup: ../node_modules $(CLONED_PROGRAMS) + .PHONY: anchor-build-idl anchor-build-idl: anchor build -- --features localnet diff --git a/solana/package.json b/solana/package.json index 0184d5f1..83b1781b 100644 --- a/solana/package.json +++ b/solana/package.json @@ -14,7 +14,8 @@ "test": "jest --config ./jest.config.ts --detectOpenHandles", "build:cjs": "tsc -p tsconfig.cjs.json", "build:esm": "tsc -p tsconfig.esm.json", - "build": "tsc -p tsconfig.json" + "build": "tsc -p tsconfig.json", + "clean":"rm -rf dist" }, "dependencies": { "@certusone/wormhole-sdk": "^0.10.10", @@ -24,12 +25,13 @@ "@solana/web3.js": "^1.91.6", "@types/node-fetch": "^2.6.11", "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", + "@wormhole-foundation/example-liquidity-layer-evm": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "@wormhole-foundation/sdk-base": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-evm": "0.7.0-beta.4", - "@wormhole-foundation/sdk-solana": "^0.7.0-beta.4", - "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.4", + "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-evm": "0.7.0-beta.6", + "@wormhole-foundation/sdk-solana": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.6", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", "chai-as-promised": "^7.1.1", "ts-results": "^3.3.0", diff --git a/solana/ts/tests/accounts/cctp/remote_token_messenger_0.json b/solana/ts/tests/accounts/cctp/remote_token_messenger_0.json new file mode 100644 index 00000000..c941623d --- /dev/null +++ b/solana/ts/tests/accounts/cctp/remote_token_messenger_0.json @@ -0,0 +1,14 @@ +{ + "pubkey": "Hazwi3jFQtLKc2ughi7HFXPkpDeso7DQaMR9Ks4afh3j", + "account": { + "lamports": 1197120, + "data": [ + "aXOuIl/pivwAAAAAAAAAAAAAAAAAAAAAvT+oG1i6kqghNgOLJa3scGavMVU=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 44 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/cctp/remote_token_messenger_1.json b/solana/ts/tests/accounts/cctp/remote_token_messenger_1.json new file mode 100644 index 00000000..52636c5b --- /dev/null +++ b/solana/ts/tests/accounts/cctp/remote_token_messenger_1.json @@ -0,0 +1,14 @@ +{ + "pubkey": "FWFDZqvQx3PVr8Y92d8vp5EQFpZNVPA8G42d9KfkhPk5", + "account": { + "lamports": 1197120, + "data": [ + "aXOuIl/pivwBAAAAAAAAAAAAAAAAAAAAayVTLhBgzhDMOwqZ5Wg7kb/eaYI=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 44 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/cctp/remote_token_messenger_2.json b/solana/ts/tests/accounts/cctp/remote_token_messenger_2.json new file mode 100644 index 00000000..0abcbe6b --- /dev/null +++ b/solana/ts/tests/accounts/cctp/remote_token_messenger_2.json @@ -0,0 +1,14 @@ +{ + "pubkey": "AcUS9yaMAyyC12RCwMnkJBpbkzQfa5d3ErSYdACBapJw", + "account": { + "lamports": 1197120, + "data": [ + "aXOuIl/pivwCAAAAAAAAAAAAAAAAAAAAK0BpUXlXc1vgDO4Pra6IomNlUo8=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 44 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/cctp/remote_token_messenger_3.json b/solana/ts/tests/accounts/cctp/remote_token_messenger_3.json new file mode 100644 index 00000000..d08336e2 --- /dev/null +++ b/solana/ts/tests/accounts/cctp/remote_token_messenger_3.json @@ -0,0 +1,14 @@ +{ + "pubkey": "REzxi9nX3Eqseha5fBiaJhTC6SFJx4qJhP83U4UCrtc", + "account": { + "lamports": 1197120, + "data": [ + "aXOuIl/pivwDAAAAAAAAAAAAAAAAAAAAGTMNENnMh1Ehjq9R6IhdBYZC4Io=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 44 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/cctp/remote_token_messenger_6.json b/solana/ts/tests/accounts/cctp/remote_token_messenger_6.json new file mode 100644 index 00000000..721106fb --- /dev/null +++ b/solana/ts/tests/accounts/cctp/remote_token_messenger_6.json @@ -0,0 +1,14 @@ +{ + "pubkey": "BWyFzH6LsnmDAaDWbGsriQ9SiiKq1CF6pbH4Ye3kzSBV", + "account": { + "lamports": 1197120, + "data": [ + "aXOuIl/pivwGAAAAAAAAAAAAAAAAAAAAFoKuY3XE5Kl+S1g7w5TIYaRtiWI=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 44 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/cctp/remote_token_messenger_7.json b/solana/ts/tests/accounts/cctp/remote_token_messenger_7.json new file mode 100644 index 00000000..6bade70e --- /dev/null +++ b/solana/ts/tests/accounts/cctp/remote_token_messenger_7.json @@ -0,0 +1,14 @@ +{ + "pubkey": "HENV19bfgVUXtvnCNxYnVDKhDjer6i34xU5sKrcbgdyt", + "account": { + "lamports": 1197120, + "data": [ + "aXOuIl/pivwHAAAAAAAAAAAAAAAAAAAAna+Mka765QucDmlinT9spAyjs/4=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 44 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/cctp/usdc_token_pair_0.json b/solana/ts/tests/accounts/cctp/usdc_token_pair_0.json new file mode 100644 index 00000000..b98a2bba --- /dev/null +++ b/solana/ts/tests/accounts/cctp/usdc_token_pair_0.json @@ -0,0 +1,14 @@ +{ + "pubkey": "8d1jdvvMFhJfxSzPXcDGtifcGMTvUxc2EpWFstbNzcTL", + "account": { + "lamports": 1426800, + "data": [ + "EdYtsOWVxUcAAAAAAAAAAAAAAAAAAAAAoLhpkcYhizbB0Z1KLp6wzjYG60hZjy8Y6Y4jOy9QMTMaodmv8oz5ObYth/BStPTxPbusEf8=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 77 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/cctp/usdc_token_pair_1.json b/solana/ts/tests/accounts/cctp/usdc_token_pair_1.json new file mode 100644 index 00000000..90d3063a --- /dev/null +++ b/solana/ts/tests/accounts/cctp/usdc_token_pair_1.json @@ -0,0 +1,14 @@ +{ + "pubkey": "9nZDjKDg3CDoYYBk6tTSKgVZigENeztf498b9ZTMNzH2", + "account": { + "lamports": 1426800, + "data": [ + "EdYtsOWVxUcBAAAAAAAAAAAAAAAAAAAAuX7574c0xxkE2AAvi2vGbdnEim5Zjy8Y6Y4jOy9QMTMaodmv8oz5ObYth/BStPTxPbusEf8=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 77 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/cctp/usdc_token_pair_2.json b/solana/ts/tests/accounts/cctp/usdc_token_pair_2.json new file mode 100644 index 00000000..9051cae1 --- /dev/null +++ b/solana/ts/tests/accounts/cctp/usdc_token_pair_2.json @@ -0,0 +1,14 @@ +{ + "pubkey": "F7yEZhdiMSMCDHtdYErSfLsU3hPr7DsTGjZeFTGo1rUf", + "account": { + "lamports": 1426800, + "data": [ + "EdYtsOWVxUcCAAAAAAAAAAAAAAAAAAAACyxjnFM4E/SqnXg3yvYmU9CX/4VZjy8Y6Y4jOy9QMTMaodmv8oz5ObYth/BStPTxPbusEf4=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 77 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/cctp/usdc_token_pair_3.json b/solana/ts/tests/accounts/cctp/usdc_token_pair_3.json new file mode 100644 index 00000000..5c9ab652 --- /dev/null +++ b/solana/ts/tests/accounts/cctp/usdc_token_pair_3.json @@ -0,0 +1,14 @@ +{ + "pubkey": "3jziQYpnNe67yDduLX4VMNYL1VQai4kVHJKBfGKUHkK6", + "account": { + "lamports": 1426800, + "data": [ + "EdYtsOWVxUcDAAAAAAAAAAAAAAAAAAAAr4jQZed8jMIjkyfF7bOkMiaOWDFZjy8Y6Y4jOy9QMTMaodmv8oz5ObYth/BStPTxPbusEf4=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 77 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/cctp/usdc_token_pair_6.json b/solana/ts/tests/accounts/cctp/usdc_token_pair_6.json new file mode 100644 index 00000000..aa16312f --- /dev/null +++ b/solana/ts/tests/accounts/cctp/usdc_token_pair_6.json @@ -0,0 +1,14 @@ +{ + "pubkey": "4N7AAQpL49n6exovi55CSo4rCFz5WxXmA8bziBQsh7Vk", + "account": { + "lamports": 1426800, + "data": [ + "EdYtsOWVxUcGAAAAAAAAAAAAAAAAAAAAgzWJ/NbttuCPTHwy1PcbVL2gKRNZjy8Y6Y4jOy9QMTMaodmv8oz5ObYth/BStPTxPbusEf4=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 77 + } +} \ No newline at end of file diff --git a/solana/ts/tests/accounts/cctp/usdc_token_pair_7.json b/solana/ts/tests/accounts/cctp/usdc_token_pair_7.json new file mode 100644 index 00000000..dc8cc39a --- /dev/null +++ b/solana/ts/tests/accounts/cctp/usdc_token_pair_7.json @@ -0,0 +1,14 @@ +{ + "pubkey": "2urk1WTiiav7kj8Cn3fZ1crFdxY9xNv7WKsusoMXLJEN", + "account": { + "lamports": 1426800, + "data": [ + "EdYtsOWVxUcHAAAAAAAAAAAAAAAAAAAAPEmcVCzvXjgR4Rks5w2MwD1cM1lZjy8Y6Y4jOy9QMTMaodmv8oz5ObYth/BStPTxPbusEf8=", + "base64" + ], + "owner": "CCTPiPYPc6AsJuwueEnWgSgucamXDZwBd53dQ11YiKX3", + "executable": false, + "rentEpoch": 18446744073709551615, + "space": 77 + } +} \ No newline at end of file From 65de8228e964d0e286a2c0a73b8bb63857abeb46 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Thu, 20 Jun 2024 10:27:39 -0500 Subject: [PATCH 31/50] update dependencies (#74) * fix .gitmodules * solana: add clippy.toml * uptick solana =1.18.15 --------- Co-authored-by: A5 Pickle --- .github/workflows/solana.yml | 2 +- .gitmodules | 2 +- lib/example-liquidity-layer | 2 +- package-lock.json | 8 ++---- solana/Anchor.toml | 2 +- solana/Cargo.lock | 28 +++++++++---------- solana/Cargo.toml | 5 +++- solana/clippy.toml | 6 ++++ solana/package.json | 2 +- .../programs/swap-layer/src/composite/mod.rs | 2 +- .../src/processor/complete/swap/relay.rs | 2 +- .../src/processor/complete/transfer/relay.rs | 2 +- .../src/processor/initiate/swap/exact_in.rs | 8 +++++- .../src/processor/initiate/transfer.rs | 8 +++++- .../src/processor/stage_outbound.rs | 2 +- .../swap-layer/src/state/staged/inbound.rs | 2 +- .../jupiter_v6/cpi/shared_accounts_route.rs | 6 ++-- .../swap-layer/src/utils/relayer_fees.rs | 6 ++-- solana/ts/src/swapLayer/index.ts | 15 +++++++--- 19 files changed, 68 insertions(+), 42 deletions(-) create mode 100644 solana/clippy.toml diff --git a/.github/workflows/solana.yml b/.github/workflows/solana.yml index 0b7ee716..46bfc063 100644 --- a/.github/workflows/solana.yml +++ b/.github/workflows/solana.yml @@ -62,7 +62,7 @@ jobs: - uses: metadaoproject/setup-anchor@v2 with: node-version: "20.11.0" - solana-cli-version: "1.18.14" + solana-cli-version: "1.18.15" anchor-version: "0.30.0" - name: Set default Rust toolchain run: rustup default stable diff --git a/.gitmodules b/.gitmodules index 72692760..c26c0f49 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "lib/example-liquidity-layer"] path = lib/example-liquidity-layer url = https://github.com/wormhole-foundation/example-liquidity-layer.git - rev = a1763da8aa395c25753a0a5e9781662eb3724e6c + rev = 63f2b423026ac1ad8b099bc3ecd44ba4fc64aae2 diff --git a/lib/example-liquidity-layer b/lib/example-liquidity-layer index a1763da8..63f2b423 160000 --- a/lib/example-liquidity-layer +++ b/lib/example-liquidity-layer @@ -1 +1 @@ -Subproject commit a1763da8aa395c25753a0a5e9781662eb3724e6c +Subproject commit 63f2b423026ac1ad8b099bc3ecd44ba4fc64aae2 diff --git a/package-lock.json b/package-lock.json index b0c35f57..36e080a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4121,8 +4121,7 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-definitions": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", - "integrity": "sha512-4h7gcW5Vz0dP5DzuiFjk5p9NW7JzPTvE4WmrFuFZkigzP7Wr1XEekBWOHaJUBe/TqNdEZNZ2wgQmiriLJSnK7w==", - "license": "Apache-2.0", + "integrity": "sha512-pIbKViWguC+Hnsf+I6ZdBVEVTt4naxCo2+P398Cb2IEMYi0w4ZfYhY49QLPuJnD1qywZW00Czr5o9ZoghZu1tA==", "dependencies": { "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6" @@ -4131,8 +4130,7 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-evm": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", - "integrity": "sha512-jKbK4SwPvf15dk6r1wcQ98eF01prXKh7dgO3n8a5YfwlrC6TOYTTFbLZUrR8hBEtU/xehAZa5IHSpTncMbVl/g==", - "license": "Apache-2.0", + "integrity": "sha512-B6sAU/vRbxoayT3NIlwtaIOGMQN2ZyNcGvxiE7iK0saqZzv/6b7kcpA5S6OwF4PHykXlTt6RIAN08QZFJl4B6Q==", "dependencies": { "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", @@ -4144,7 +4142,7 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "integrity": "sha512-3tgXF04mJvVkb1kqgD5GVh3vqZtoM02yi2jnk3ylhtxTDOjd/mM/wFh+dgDDvbU8hosBWNVm7UhTD6CUX+A+YQ==", + "integrity": "sha512-AKcVpu/HltfHprv93Q3pWwyZTsfQjtJim+4y8n9mAdrkGDMuPhEQBqp7pmRn0YG/5FD+wRgwVbnwJ1o9VTAluw==", "dependencies": { "@certusone/wormhole-spydk": "^0.0.1", "@coral-xyz/anchor": "^0.30.0", diff --git a/solana/Anchor.toml b/solana/Anchor.toml index 4de644d1..668a8522 100644 --- a/solana/Anchor.toml +++ b/solana/Anchor.toml @@ -1,6 +1,6 @@ [toolchain] anchor_version = "0.30.0" # CLI -solana_version = "1.18.14" +solana_version = "1.18.15" [features] resolution = false diff --git a/solana/Cargo.lock b/solana/Cargo.lock index 18ad5a0d..75124f5b 100644 --- a/solana/Cargo.lock +++ b/solana/Cargo.lock @@ -1887,9 +1887,9 @@ checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "solana-frozen-abi" -version = "1.18.14" +version = "1.18.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d353eac7a178cd8a2ceaf5d304719d4a30c1d3f24f303145d5b029b8cc7c35f0" +checksum = "2c00a6aca244dfa904e2c4a26406ba7b0987344ceaec932f3cda0b35eff0babc" dependencies = [ "block-buffer 0.10.4", "bs58 0.4.0", @@ -1912,9 +1912,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.18.14" +version = "1.18.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc87189dcb2d2da407831fc983e4f05e70c58be12b5c713e9a05f873edb42637" +checksum = "bed58b27b9b8877893f69bc5cfd1c62e984315e0229d83cf8a32ad0933c0d6c9" dependencies = [ "proc-macro2", "quote", @@ -1924,9 +1924,9 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.18.14" +version = "1.18.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d857a115710eeb1c5ac98a340141f0c49cc31854168767d0c5b855e212632a5" +checksum = "bee2daf61ae582edf9634adf8e5021faf002df0d3f69078ecbcd6c7b41bdf833" dependencies = [ "env_logger", "lazy_static", @@ -1935,9 +1935,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.18.14" +version = "1.18.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad73ff4d5c8d4943988ef18924f5fbd96881410ab20d5a0bfa32bb44d7d4cfce" +checksum = "4f4908f360900d0a1aa81c7bad7937c78f0825c3f08ff0b22f1de0e43e5946f2" dependencies = [ "ark-bn254", "ark-ec", @@ -1990,9 +1990,9 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.18.14" +version = "1.18.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f518a377209223b09a0fb62abd53add4a11313a1e85f535f559fbcc0227117a" +checksum = "c50ec330850953d4971b052ff98c74a8e67e7618b4aed9f4971b8d3b68fcd1cd" dependencies = [ "assert_matches", "base64 0.21.7", @@ -2045,9 +2045,9 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.18.14" +version = "1.18.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2975b2c2ed6f06d2ffbb2e6b3e7fdd9ca6b2570a76d49a2173f393e6e84c9c71" +checksum = "95ef2ea49002d1bf52a4a8509570b2c3b88e7b6d0a131b11bbd637ca1e1df0ff" dependencies = [ "bs58 0.4.0", "proc-macro2", @@ -2064,9 +2064,9 @@ checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" [[package]] name = "solana-zk-token-sdk" -version = "1.18.14" +version = "1.18.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cefc9878a202bf9606745e56712f7d56878ea31b29f2f89785b4b801b264322" +checksum = "5cafb3df56516086f65e2a08a8cd03f504236f3b5348299abd45415d1d18ba32" dependencies = [ "aes-gcm-siv", "base64 0.21.7", diff --git a/solana/Cargo.toml b/solana/Cargo.toml index 1c74142b..2013f782 100644 --- a/solana/Cargo.toml +++ b/solana/Cargo.toml @@ -30,7 +30,7 @@ path = "../universal/rs/messages" [workspace.dependencies] anchor-lang = "=0.30.0" anchor-spl = "=0.30.0" -solana-program = "=1.18.14" +solana-program = "=1.18.15" hex = "0.4.3" ruint = "1.9.0" cfg-if = "1.0" @@ -54,6 +54,9 @@ codegen-units = 1 [workspace.lints.clippy] correctness = { level = "warn", priority = -1 } +### See clippy.toml. +unnecessary_lazy_evaluations = "allow" + arithmetic_side_effects = "deny" as_conversions = "deny" cast_abs_to_unsigned = "deny" diff --git a/solana/clippy.toml b/solana/clippy.toml new file mode 100644 index 00000000..f6eac79c --- /dev/null +++ b/solana/clippy.toml @@ -0,0 +1,6 @@ +disallowed-methods = [ + { path = "std::option::Option::and", reason = "prefer `and_then` for lazy evaluation" }, + { path = "std::option::Option::map_or", reason = "prefer `map_or_else` for lazy evaluation" }, + { path = "std::option::Option::ok_or", reason = "prefer `ok_or_else` for lazy evaluation" }, + { path = "std::option::Option::and", reason = "prefer `and_then` for lazy evaluation" }, +] diff --git a/solana/package.json b/solana/package.json index 83b1781b..580e0ac7 100644 --- a/solana/package.json +++ b/solana/package.json @@ -15,7 +15,7 @@ "build:cjs": "tsc -p tsconfig.cjs.json", "build:esm": "tsc -p tsconfig.esm.json", "build": "tsc -p tsconfig.json", - "clean":"rm -rf dist" + "clean": "rm -rf dist" }, "dependencies": { "@certusone/wormhole-sdk": "^0.10.10", diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs index 8f13a45c..e4b82d6e 100644 --- a/solana/programs/swap-layer/src/composite/mod.rs +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -681,7 +681,7 @@ pub(crate) fn handle_complete_swap_jup_v6<'ctx, 'info>( ), amount_out .checked_add(gas_dropoff.unwrap_or_default()) - .ok_or(SwapLayerError::U64Overflow)?, + .ok_or_else(|| SwapLayerError::U64Overflow)?, )? } else { // Verify that the encoded owner is the actual owner. ATAs are no different from other token diff --git a/solana/programs/swap-layer/src/processor/complete/swap/relay.rs b/solana/programs/swap-layer/src/processor/complete/swap/relay.rs index ac8716bb..7aff15d4 100644 --- a/solana/programs/swap-layer/src/processor/complete/swap/relay.rs +++ b/solana/programs/swap-layer/src/processor/complete/swap/relay.rs @@ -76,7 +76,7 @@ where ( fill_amount .checked_sub(relaying_fee) - .ok_or(SwapLayerError::InvalidRelayerFee)?, + .ok_or_else(|| SwapLayerError::InvalidRelayerFee)?, gas_dropoff.into(), ) } else { diff --git a/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs index 697def56..d3b33066 100644 --- a/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs @@ -164,7 +164,7 @@ fn handle_complete_transfer_relay( // Calculate the user amount. fill_amount .checked_sub(relaying_fee) - .ok_or(SwapLayerError::InvalidRelayerFee)? + .ok_or_else(|| SwapLayerError::InvalidRelayerFee)? } }; diff --git a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs index 0182ee70..48fbd141 100644 --- a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs +++ b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs @@ -104,9 +104,12 @@ pub struct InitiateSwapExactIn<'info> { #[account(constraint = src_mint.key() != usdc.key() @ SwapLayerError::SameMint)] usdc: Usdc<'info>, - /// CHECK: Token router config. + /// CHECK: Seeds must be \["emitter"] (Token Router Program). token_router_custodian: UncheckedAccount<'info>, + /// CHECK: Seeds must be \["endpoint"\, target_chain.to_be_bytes()] (Matching Engine Program). + target_router_endpoint: UncheckedAccount<'info>, + /// CHECK: Mutable, seeds must be \["prepared-custody", prepared_order.key()\] #[account(mut)] prepared_custody_token: UncheckedAccount<'info>, @@ -256,6 +259,9 @@ where usdc: token_router::cpi::accounts::Usdc { mint: ctx.accounts.usdc.to_account_info(), }, + target_router_endpoint: token_router::cpi::accounts::RegisteredEndpoint { + endpoint: ctx.accounts.target_router_endpoint.to_account_info(), + }, token_program: token_program.to_account_info(), system_program: ctx.accounts.system_program.to_account_info(), }, diff --git a/solana/programs/swap-layer/src/processor/initiate/transfer.rs b/solana/programs/swap-layer/src/processor/initiate/transfer.rs index f418900a..c218e255 100644 --- a/solana/programs/swap-layer/src/processor/initiate/transfer.rs +++ b/solana/programs/swap-layer/src/processor/initiate/transfer.rs @@ -61,9 +61,12 @@ pub struct InitiateTransfer<'info> { )] target_peer: RegisteredPeer<'info>, - /// CHECK: Token router config. + /// CHECK: Seeds must be \["emitter"] (Token Router Program). token_router_custodian: UncheckedAccount<'info>, + /// CHECK: Seeds must be \["endpoint"\, target_chain.to_be_bytes()] (Matching Engine Program). + target_router_endpoint: UncheckedAccount<'info>, + /// CHECK: Mutable, seeds must be \["prepared-order", staged_outbound.key()\]. #[account( mut, @@ -135,6 +138,9 @@ pub fn initiate_transfer(ctx: Context) -> Result<()> { usdc: token_router::cpi::accounts::Usdc { mint: ctx.accounts.usdc.to_account_info(), }, + target_router_endpoint: token_router::cpi::accounts::RegisteredEndpoint { + endpoint: ctx.accounts.target_router_endpoint.to_account_info(), + }, token_program: token_program.to_account_info(), system_program: ctx.accounts.system_program.to_account_info(), }, diff --git a/solana/programs/swap-layer/src/processor/stage_outbound.rs b/solana/programs/swap-layer/src/processor/stage_outbound.rs index 076fac46..2c006a11 100644 --- a/solana/programs/swap-layer/src/processor/stage_outbound.rs +++ b/solana/programs/swap-layer/src/processor/stage_outbound.rs @@ -209,7 +209,7 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R } else { amount_in .checked_add(relaying_fee) - .ok_or(SwapLayerError::U64Overflow)? + .ok_or_else(|| SwapLayerError::U64Overflow)? } } else { amount_in diff --git a/solana/programs/swap-layer/src/state/staged/inbound.rs b/solana/programs/swap-layer/src/state/staged/inbound.rs index 66db62b9..880674d2 100644 --- a/solana/programs/swap-layer/src/state/staged/inbound.rs +++ b/solana/programs/swap-layer/src/state/staged/inbound.rs @@ -52,7 +52,7 @@ impl StagedInbound { RedeemMode::Payload { sender: _, buf } => buf .len() .checked_add(FIXED) - .ok_or(error!(SwapLayerError::PayloadTooLarge)), + .ok_or_else(|| error!(SwapLayerError::PayloadTooLarge)), _ => err!(SwapLayerError::InvalidRedeemMode), } } diff --git a/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs b/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs index f292f82a..f9243a38 100644 --- a/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs +++ b/solana/programs/swap-layer/src/utils/jupiter_v6/cpi/shared_accounts_route.rs @@ -43,7 +43,7 @@ impl<'info> ToAccountMetas for SharedAccountsRoute<'info> { AccountMeta::new_readonly( self.token_2022_program .as_ref() - .map_or(program_id, |acc_info| *acc_info.key), + .map_or_else(|| program_id, |acc_info| *acc_info.key), false, ), AccountMeta::new_readonly(*self.event_authority.key, false), @@ -68,10 +68,10 @@ impl<'info> ToAccountInfos<'info> for SharedAccountsRoute<'info> { self.destination_mint.clone(), self.platform_fee .as_ref() - .map_or(program.clone(), |acc_info| acc_info.clone()), + .map_or_else(|| program.clone(), |acc_info| acc_info.clone()), self.token_2022_program .as_ref() - .map_or(program.clone(), |acc_info| acc_info.clone()), + .map_or_else(|| program.clone(), |acc_info| acc_info.clone()), self.event_authority.clone(), program.clone(), ] diff --git a/solana/programs/swap-layer/src/utils/relayer_fees.rs b/solana/programs/swap-layer/src/utils/relayer_fees.rs index b1d0129c..582ac8df 100644 --- a/solana/programs/swap-layer/src/utils/relayer_fees.rs +++ b/solana/programs/swap-layer/src/utils/relayer_fees.rs @@ -128,7 +128,7 @@ pub fn calculate_relayer_fee( relay_params.gas_dropoff_margin, relay_params.native_token_price, ) - .ok_or(SwapLayerError::GasDropoffCalculationFailed)?; + .ok_or_else(|| SwapLayerError::GasDropoffCalculationFailed)?; relayer_fee = relayer_fee.saturating_add(gas_dropoff_cost); } @@ -149,7 +149,7 @@ pub fn calculate_relayer_fee( .saturating_add(match output_token { OutputToken::Gas(swap) | OutputToken::Other { address: _, swap } => { calculate_evm_swap_overhead(&swap.swap_type) - .ok_or(SwapLayerError::EvmGasCalculationFailed)? + .ok_or_else(|| SwapLayerError::EvmGasCalculationFailed)? } _ => 0, }); @@ -160,7 +160,7 @@ pub fn calculate_relayer_fee( total_gas, relay_params.native_token_price, ) - .ok_or(SwapLayerError::EvmGasCalculationFailed)?; + .ok_or_else(|| SwapLayerError::EvmGasCalculationFailed)?; relayer_fee = relayer_fee.saturating_add(evm_gas_cost); diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index ab29ee1b..2098875c 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -692,6 +692,8 @@ export class SwapLayerProgram { preparedOrder ??= this.preparedOrderAddress(stagedOutbound); stagedCustodyToken ??= this.stagedCustodyTokenAddress(stagedOutbound); + const tokenRouter = this.tokenRouterProgram(); + return this.program.methods .initiateTransfer() .accounts({ @@ -702,12 +704,14 @@ export class SwapLayerProgram { stagedCustodyToken, usdcRefundToken, targetPeer: this.registeredPeerComposite({ chain: targetChain }), - tokenRouterCustodian: this.tokenRouterProgram().custodianAddress(), + tokenRouterCustodian: tokenRouter.custodianAddress(), + targetRouterEndpoint: tokenRouter + .matchingEngineProgram() + .routerEndpointAddress(targetChain), preparedOrder, - preparedCustodyToken: - this.tokenRouterProgram().preparedCustodyTokenAddress(preparedOrder), + preparedCustodyToken: tokenRouter.preparedCustodyTokenAddress(preparedOrder), usdc: this.usdcComposite(), - tokenRouterProgram: this.tokenRouterProgram().ID, + tokenRouterProgram: tokenRouter.ID, tokenProgram: splToken.TOKEN_PROGRAM_ID, systemProgram: SystemProgram.programId, }) @@ -788,6 +792,9 @@ export class SwapLayerProgram { srcMint, usdc: this.usdcComposite(), tokenRouterCustodian: tokenRouter.custodianAddress(), + targetRouterEndpoint: tokenRouter + .matchingEngineProgram() + .routerEndpointAddress(targetChain), preparedCustodyToken: tokenRouter.preparedCustodyTokenAddress(preparedOrder), tokenRouterProgram: tokenRouter.ID, associatedTokenProgram: splToken.ASSOCIATED_TOKEN_PROGRAM_ID, From feefd55ceee1192d550f5c49ec66fbdcfaa32a28 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Mon, 24 Jun 2024 21:00:37 -0500 Subject: [PATCH 32/50] solana: add upper bound to compound (#72) * solana: add upper bound to compound * solana: fix upper bound in test Co-authored-by: John Saigle <4022790+johnsaigle@users.noreply.github.com> --------- Co-authored-by: A5 Pickle Co-authored-by: John Saigle <4022790+johnsaigle@users.noreply.github.com> --- .../swap-layer/src/utils/relayer_fees.rs | 46 +++++++++++++++++-- 1 file changed, 43 insertions(+), 3 deletions(-) diff --git a/solana/programs/swap-layer/src/utils/relayer_fees.rs b/solana/programs/swap-layer/src/utils/relayer_fees.rs index 582ac8df..5308b009 100644 --- a/solana/programs/swap-layer/src/utils/relayer_fees.rs +++ b/solana/programs/swap-layer/src/utils/relayer_fees.rs @@ -28,7 +28,9 @@ pub fn denormalize_gas_price(gas_price: u32) -> u64 { fn compound(percentage: u32, base: u64) -> Option { if percentage == 0 { - Some(base) + base.into() + } else if percentage > crate::MAX_BPS { + None } else { // NOTE: Upcasting from u32 to u128 is safe here. #[allow(clippy::as_conversions)] @@ -37,7 +39,9 @@ fn compound(percentage: u32, base: u64) -> Option { let base: u128 = u128::from(base); - base.saturating_add(base.saturating_mul(percentage.into()).saturating_div(MAX)) + base.saturating_mul(percentage.into()) + .saturating_div(MAX) + .saturating_add(base) .try_into() .ok() } @@ -213,7 +217,25 @@ mod test { } #[test] - fn test_zero_compound() { + fn test_compound_beyond_max() { + let base = 1_000; + let percentage = 2_000_000; // 200% + let compounded = compound(percentage, base); + + assert_eq!(compounded, None); + } + + #[test] + fn test_compound_at_max_int() { + let base = u64::MAX; + let percentage = 1_000_000; // crate::MAX_BPS + let compounded = compound(percentage, base); + + assert_eq!(compounded, None); + } + + #[test] + fn test_compound_zero_percentage() { let base = 1_000; let percentage = 0; let compounded = compound(percentage, base); @@ -221,6 +243,24 @@ mod test { assert_eq!(compounded, Some(1_000)); } + #[test] + fn test_compound_zero_base() { + let base = 0; + let percentage = 500_000; // 50% + let compounded = compound(percentage, base); + + assert_eq!(compounded, Some(0)); + } + + #[test] + fn test_compound_at_low_values() { + let base = 1; + let percentage = 1; + let compounded = compound(percentage, base); + + assert_eq!(compounded, Some(1)); + } + #[test] fn test_uniswap_gas_overhead_one_swap() { let swap_type = &SwapType::UniswapV3(UniswapSwapParameters { From d698ba946070913bb37e428e83e463b3357c0d97 Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:13:19 -0500 Subject: [PATCH 33/50] solana: add min amount out to stage outbound (#77) Co-authored-by: gator-boi --- solana/programs/swap-layer/src/error.rs | 5 +- .../src/processor/initiate/swap/exact_in.rs | 19 +-- .../src/processor/stage_outbound.rs | 19 +++ .../swap-layer/src/state/staged/outbound.rs | 2 + solana/ts/src/swapLayer/index.ts | 2 + .../ts/src/swapLayer/state/StagedOutbound.ts | 1 + solana/ts/tests/01__transfer.ts | 115 ++++++++++++++++-- solana/ts/tests/10__swap.ts | 114 ++++++++++++----- 8 files changed, 225 insertions(+), 52 deletions(-) diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs index 63900077..4a7edb70 100644 --- a/solana/programs/swap-layer/src/error.rs +++ b/solana/programs/swap-layer/src/error.rs @@ -57,8 +57,9 @@ pub enum SwapLayerError { InvalidLimitAmount = 0x302, InvalidSwapType = 0x304, InsufficientAmountOut = 0x306, - InvalidSourceResidual = 0x308, - SourceResidualMismatch = 0x30a, + MinAmountOutRequired = 0x308, + InvalidSourceResidual = 0x310, + SourceResidualMismatch = 0x312, // Jupiter V6 #[msg("Jupiter V6 Authority ID must be >= 0 and < 8")] diff --git a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs index 48fbd141..fc3ed05e 100644 --- a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs +++ b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs @@ -7,7 +7,6 @@ use crate::{ use anchor_lang::prelude::*; use anchor_spl::{associated_token, token, token_interface}; use common::wormhole_io::TypePrefixedPayload; -use swap_layer_messages::types::RedeemMode; #[derive(Accounts)] pub struct InitiateSwapExactIn<'info> { @@ -208,18 +207,12 @@ where Default::default(), )?; - // Verify that the usdc_amount_out is larger than the encoded relaying fee - // if the staged outbound is a relay. - if let RedeemMode::Relay { - gas_dropoff: _, - relaying_fee, - } = swap_msg.redeem_mode - { - require!( - usdc_amount_out > relaying_fee.into(), - SwapLayerError::InsufficientAmountOut - ); - } + // The `min_amount_out` should always be Some when swapping into USDC, this + // is guaranteed by the stage_outbound instruction. + require!( + usdc_amount_out >= staged_outbound.info.min_amount_out.unwrap(), + SwapLayerError::InsufficientAmountOut + ); let payer = &ctx.accounts.payer; let src_swap_token = &ctx.accounts.src_swap_token; diff --git a/solana/programs/swap-layer/src/processor/stage_outbound.rs b/solana/programs/swap-layer/src/processor/stage_outbound.rs index 2c006a11..9926e6f2 100644 --- a/solana/programs/swap-layer/src/processor/stage_outbound.rs +++ b/solana/programs/swap-layer/src/processor/stage_outbound.rs @@ -71,6 +71,12 @@ pub struct StageOutbound<'info> { // Cannot send to zero address. require!(args.recipient != [0; 32], SwapLayerError::InvalidRecipient); + // Min amount out must be specified for swaps into USDC. + require!( + args.min_amount_out.is_some() || src_mint.key() == common::USDC_MINT, + SwapLayerError::MinAmountOutRequired, + ); + true } )] @@ -125,6 +131,9 @@ pub struct StageOutbound<'info> { pub struct StageOutboundArgs { pub amount_in: u64, + // Must be specified for swaps into USDC. + pub min_amount_out: Option, + /// This argument only applies to relays. If exact in is specified, the relaying fee will be /// removed from the amount in. Otherwise it will be added to the amount in to guarantee the /// USDC amount specified above. @@ -152,6 +161,7 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R let StageOutboundArgs { amount_in, + min_amount_out, is_exact_in, target_chain, recipient, @@ -212,6 +222,14 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R .ok_or_else(|| SwapLayerError::U64Overflow)? } } else { + // Min amount out must cover the relaying fee. This unwrap should + // be fine since we've already checked that min_amount_out is Some + // in the account context. + require!( + min_amount_out.unwrap() > relaying_fee, + SwapLayerError::InsufficientAmountOut + ); + amount_in }, StagedRedeem::Relay { @@ -327,6 +345,7 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R target_chain, is_exact_in, recipient, + min_amount_out, }, staged_redeem, encoded_output_token, diff --git a/solana/programs/swap-layer/src/state/staged/outbound.rs b/solana/programs/swap-layer/src/state/staged/outbound.rs index b28d1988..2b8d2809 100644 --- a/solana/programs/swap-layer/src/state/staged/outbound.rs +++ b/solana/programs/swap-layer/src/state/staged/outbound.rs @@ -51,6 +51,8 @@ pub struct StagedOutboundInfo { /// The specified token account to refund USDC. This account is required by the Token Router /// program in case a fast order is reverted at the Matching Engine after it has been placed. pub usdc_refund_token: Pubkey, + + pub min_amount_out: Option, } #[account] diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 2098875c..8bdefcfe 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -529,6 +529,7 @@ export class SwapLayerProgram { args: { transferType: "native" | "programTransferAuthority" | "sender"; amountIn: Uint64; + minAmountOut?: Uint64; isExactIn: boolean; targetChain: ChainId; recipient: Array; @@ -573,6 +574,7 @@ export class SwapLayerProgram { const ixBuilder = this.program.methods.stageOutbound({ ...args, amountIn: uint64ToBN(amountIn), + minAmountOut: args.minAmountOut === undefined ? null : uint64ToBN(args.minAmountOut), redeemOption, encodedOutputToken, }); diff --git a/solana/ts/src/swapLayer/state/StagedOutbound.ts b/solana/ts/src/swapLayer/state/StagedOutbound.ts index a8d861a1..7a6a0728 100644 --- a/solana/ts/src/swapLayer/state/StagedOutbound.ts +++ b/solana/ts/src/swapLayer/state/StagedOutbound.ts @@ -25,6 +25,7 @@ export type StagedOutboundInfo = { recipient: Array; isExactIn: boolean; usdcRefundToken: PublicKey; + minAmountOut: BN | null; }; export class StagedOutbound { diff --git a/solana/ts/tests/01__transfer.ts b/solana/ts/tests/01__transfer.ts index 5ef1d7f3..c598f000 100644 --- a/solana/ts/tests/01__transfer.ts +++ b/solana/ts/tests/01__transfer.ts @@ -1128,6 +1128,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { { transferType: "native", amountIn, + minAmountOut: 1n, isExactIn: false, targetChain: foreignChain, recipient: foreignRecipientAddress, @@ -1162,6 +1163,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { { transferType: "native", amountIn, + minAmountOut: 1n, isExactIn: true, targetChain: foreignChain, recipient: foreignRecipientAddress, @@ -1179,7 +1181,99 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { ); }); - it("Stage Outbound USDC (Direct)", async function () { + it("Cannot Stage Outbound (Min Amount Out Required)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const senderSigner = Keypair.generate(); + const sender = senderSigner.publicKey; + + const amountIn = 690000n; + const usdcRefundToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + stagedOutbound, + usdcRefundToken, + sender, + }, + { + transferType: "native", + amountIn, + isExactIn: true, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: null, + outputToken: null, + }, + ); + assert.isNull(approveIx); + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner, senderSigner], + "MinAmountOutRequired", + ); + }); + + it("Cannot Stage Outbound (Amount Out Too Small)", async function () { + const stagedOutboundSigner = Keypair.generate(); + const stagedOutbound = stagedOutboundSigner.publicKey; + + const senderSigner = Keypair.generate(); + const sender = senderSigner.publicKey; + + const amountIn = 690000n; + const usdcRefundToken = splToken.getAssociatedTokenAddressSync( + swapLayer.usdcMint, + payer.publicKey, + ); + + const peer = await swapLayer.fetchPeer(foreignChain); + const gasDropoff = 500000; + const outputToken: OutputToken = { type: "Usdc" }; + const expectedRelayerFee = calculateRelayerFee( + peer.relayParams, + denormalizeGasDropOff(gasDropoff), + outputToken, + ); + + const [approveIx, ix] = await swapLayer.stageOutboundIx( + { + payer: payer.publicKey, + stagedOutbound, + usdcRefundToken, + sender, + }, + { + transferType: "native", + amountIn, + minAmountOut: expectedRelayerFee - 1n, + isExactIn: true, + targetChain: foreignChain, + recipient: foreignRecipientAddress, + redeemOption: { + relay: { + gasDropoff, + maxRelayerFee: new BN(9999999999), + }, + }, + outputToken, + }, + ); + assert.isNull(approveIx); + await expectIxErr( + connection, + [ix], + [payer, stagedOutboundSigner, senderSigner], + "InsufficientAmountOut", + ); + }); + + it("Stage Outbound (Direct)", async function () { const stagedOutboundSigner = Keypair.generate(); const stagedOutbound = stagedOutboundSigner.publicKey; @@ -1198,6 +1292,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { ); const amountIn = 690000n; + const minAmountOut = 1n; const usdcRefundToken = splToken.getAssociatedTokenAddressSync( swapLayer.usdcMint, payer.publicKey, @@ -1213,6 +1308,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { transferType: "native", amountIn, isExactIn: true, + minAmountOut, targetChain: foreignChain, recipient: foreignRecipientAddress, redeemOption: null, @@ -1240,6 +1336,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { recipient: foreignRecipientAddress, isExactIn: true, usdcRefundToken, + minAmountOut: uint64ToBN(minAmountOut), }, { direct: {} }, Buffer.alloc(1), @@ -1337,6 +1434,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { recipient: foreignRecipientAddress, isExactIn: false, usdcRefundToken: senderToken, + minAmountOut: null, }, { direct: {} }, Buffer.alloc(1), @@ -1400,6 +1498,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { recipient: foreignRecipientAddress, isExactIn: false, usdcRefundToken: senderToken, + minAmountOut: null, }, { payload: { "0": Buffer.from("All your base are belong to us.") } }, Buffer.alloc(1), @@ -1787,6 +1886,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { recipient: foreignRecipientAddress, isExactIn: true, usdcRefundToken: senderToken, + minAmountOut: null, }, { relay: { @@ -1860,6 +1960,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { recipient: foreignRecipientAddress, isExactIn: false, usdcRefundToken: senderToken, + minAmountOut: null, }, { relay: { @@ -1925,6 +2026,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { recipient: foreignRecipientAddress, isExactIn: false, usdcRefundToken: senderToken, + minAmountOut: null, }, { direct: {} }, Buffer.alloc(1), @@ -2002,6 +2104,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { recipient: foreignRecipientAddress, isExactIn: false, usdcRefundToken: senderToken, + minAmountOut: null, }, { direct: {} }, Buffer.from(encodeOutputToken(outputToken)), @@ -2342,9 +2445,8 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { await expectIxOk(connection, [ix], [payer]); // Verify the relevant information in the prepared order. - const preparedOrderData = await tokenRouter.fetchPreparedOrder( - preparedOrder, - ); + const preparedOrderData = + await tokenRouter.fetchPreparedOrder(preparedOrder); const { info: { preparedCustodyTokenBump }, @@ -3763,9 +3865,8 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { units: 300_000, }); - const { value: lookupTableAccount } = await connection.getAddressLookupTable( - tokenRouterLkupTable, - ); + const { value: lookupTableAccount } = + await connection.getAddressLookupTable(tokenRouterLkupTable); await expectIxOk(connection, [computeIx, ix], [payer], { addressLookupTableAccounts: [lookupTableAccount!], diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index 0f015c1a..2a976a2c 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -301,15 +301,11 @@ describe("Swap Layer -- Jupiter V6", () => { describe("USDC Swap (Relay)", function () { describe("Outbound", function () { - it("Cannot Swap (Amount Out Doesn't Cover Relayer Fee)", async function () { + it("Cannot Swap (Min Amount Out Too Small)", async function () { const srcMint = USDT_MINT_ADDRESS; const gasDropoff = 500000; - const { - stagedOutbound, - custodyBalance: inAmount, - outputToken, - } = await stageOutboundForTest( + const { stagedOutbound, custodyBalance: inAmount } = await stageOutboundForTest( { payer: payer.publicKey, senderToken: splToken.getAssociatedTokenAddressSync( @@ -321,19 +317,14 @@ describe("Swap Layer -- Jupiter V6", () => { srcMint, }, { - amountIn: 100n, // Reduce the amountIn. + amountIn: 100000n, + minAmountOut: 9999999999999n, // Specify a really large min amount out. redeemOption: { relay: { gasDropoff, maxRelayerFee: 9999999999999n }, }, }, ); - const expectedRelayerFee = calculateRelayerFee( - TEST_RELAY_PARAMS, - denormalizeGasDropOff(gasDropoff), - outputToken, - ); - const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); const { instruction: cpiInstruction, minAmountOut } = @@ -343,7 +334,6 @@ describe("Swap Layer -- Jupiter V6", () => { slippageBps: 10000, cpi: true, }); - assert.isTrue(minAmountOut < expectedRelayerFee); await swapExactInForTest( { payer: payer.publicKey, stagedOutbound, srcMint }, @@ -355,11 +345,7 @@ describe("Swap Layer -- Jupiter V6", () => { it("Cannot Swap (Invalid Prepared By)", async function () { const srcMint = USDT_MINT_ADDRESS; - const { - stagedOutbound, - custodyBalance: inAmount, - outputToken, - } = await stageOutboundForTest( + const { stagedOutbound, custodyBalance: inAmount } = await stageOutboundForTest( { payer: payer.publicKey, senderToken: splToken.getAssociatedTokenAddressSync( @@ -576,6 +562,7 @@ describe("Swap Layer -- Jupiter V6", () => { srcMint, }, { + minAmountOut: 1n, redeemOption: { relay: { gasDropoff: 500000, maxRelayerFee: 9999999999999n }, }, @@ -1853,7 +1840,7 @@ describe("Swap Layer -- Jupiter V6", () => { sender: payer.publicKey, srcMint: splToken.NATIVE_MINT, }, - { amountIn, transferType: "native" }, + { amountIn, minAmountOut: 1n, transferType: "native" }, ); const balanceBefore = await connection.getBalance(payer.publicKey).then(BigInt); @@ -1913,6 +1900,7 @@ describe("Swap Layer -- Jupiter V6", () => { transferType: "native", amountIn, isExactIn: true, + minAmountOut: 1n, targetChain: toChainId("Ethereum"), recipient: Array.from(Buffer.alloc(32, "deadbeef")), redeemOption: null, @@ -1957,6 +1945,65 @@ describe("Swap Layer -- Jupiter V6", () => { }); describe("Outbound", function () { + it("Cannot Swap (Min Amount Out Too Small)", async function () { + const srcMint = USDT_MINT_ADDRESS; + + const { stagedOutbound, custodyBalance: inAmount } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), + srcMint, + }, + { minAmountOut: 9999999999999n }, + ); + + const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); + const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); + const { + instruction: cpiInstruction, + sourceMint, + destinationMint, + } = await modifyUsdtToUsdcSwapResponseForTest(swapAuthority, { + inAmount, + quotedOutAmount: inAmount, // stable swap + slippageBps: 50, + cpi: true, + }); + assert.deepEqual(sourceMint, srcMint); + assert.deepEqual(destinationMint, swapLayer.usdcMint); + + const ix = await swapLayer.initiateSwapExactInIx( + { + payer: payer.publicKey, + stagedOutbound, + srcMint, + }, + { + cpiInstruction, + }, + ); + + const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ + units: 360_000, + }); + + const addressLookupTableAccounts = await Promise.all( + luts.map(async (lookupTableAddress) => { + const resp = await connection.getAddressLookupTable(lookupTableAddress); + return resp.value; + }), + ); + + await expectIxErr(connection, [computeIx, ix], [payer], "InsufficientAmountOut", { + addressLookupTableAccounts, + }); + }); + it("USDT via Whirlpool", async function () { const srcMint = USDT_MINT_ADDRESS; @@ -1967,16 +2014,19 @@ describe("Swap Layer -- Jupiter V6", () => { stagedOutboundInfo, redeemMode, outputToken, - } = await stageOutboundForTest({ - payer: payer.publicKey, - senderToken: splToken.getAssociatedTokenAddressSync( + } = await stageOutboundForTest( + { + payer: payer.publicKey, + senderToken: splToken.getAssociatedTokenAddressSync( + srcMint, + payer.publicKey, + false, + await whichTokenProgram(connection, srcMint), + ), srcMint, - payer.publicKey, - false, - await whichTokenProgram(connection, srcMint), - ), - srcMint, - }); + }, + { minAmountOut: 1n }, + ); const preparedOrder = swapLayer.preparedOrderAddress(stagedOutbound); const swapAuthority = swapLayer.swapAuthorityAddress(preparedOrder); @@ -2515,6 +2565,7 @@ describe("Swap Layer -- Jupiter V6", () => { srcMint, }, { + minAmountOut: 1n, redeemOption: { payload: Buffer.from("All your base are belong to us."), }, @@ -3799,6 +3850,7 @@ describe("Swap Layer -- Jupiter V6", () => { }, opts: { amountIn?: bigint; + minAmountOut?: bigint; targetChain?: ChainId; redeemOption?: | { relay: { gasDropoff: number; maxRelayerFee: Uint64 } } @@ -3819,8 +3871,9 @@ describe("Swap Layer -- Jupiter V6", () => { const stagedOutboundSigner = Keypair.generate(); const stagedOutbound = stagedOutboundSigner.publicKey; - let { amountIn, targetChain, redeemOption, outputToken, transferType } = opts; + let { amountIn, minAmountOut, targetChain, redeemOption, outputToken, transferType } = opts; amountIn ??= 690000n; + minAmountOut ??= 680000n; targetChain ??= toChainId("Ethereum"); redeemOption ??= null; outputToken ??= null; @@ -3864,6 +3917,7 @@ describe("Swap Layer -- Jupiter V6", () => { transferType, amountIn, isExactIn: true, + minAmountOut, targetChain, recipient: Array.from(Buffer.alloc(32, "deadbeef")), redeemOption, From 776929d73d985510851a9a41decdc081167b0f04 Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:14:26 -0500 Subject: [PATCH 34/50] solana: fix docs (#78) * solana: fix prepared custody token doc * solana: fix update fee recipient doc --------- Co-authored-by: gator-boi --- solana/programs/swap-layer/src/lib.rs | 4 ++-- .../swap-layer/src/processor/initiate/swap/exact_in.rs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/solana/programs/swap-layer/src/lib.rs b/solana/programs/swap-layer/src/lib.rs index 99b04379..5c860d95 100644 --- a/solana/programs/swap-layer/src/lib.rs +++ b/solana/programs/swap-layer/src/lib.rs @@ -112,8 +112,8 @@ pub mod swap_layer { /// Updates the `fee_recipient` field in the `Custodian` account. /// /// This instruction is used to update the `fee_recipient` field in the `Custodian` account. This - /// instruction can only be called by the `owner`. The `fee_recipient` must be a valid token - /// account. The `fee_recipient` receives any relayer fees received by the swap layer. + /// instruction can only be called by the `owner` and `owner_assistant`. The `fee_recipient` must + /// be a valid token account. The `fee_recipient` receives any relayer fees received by the swap layer. /// /// # Arguments /// diff --git a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs index fc3ed05e..19646c5c 100644 --- a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs +++ b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs @@ -109,7 +109,7 @@ pub struct InitiateSwapExactIn<'info> { /// CHECK: Seeds must be \["endpoint"\, target_chain.to_be_bytes()] (Matching Engine Program). target_router_endpoint: UncheckedAccount<'info>, - /// CHECK: Mutable, seeds must be \["prepared-custody", prepared_order.key()\] + /// CHECK: Mutable. This account is verified by the Token Router Program. #[account(mut)] prepared_custody_token: UncheckedAccount<'info>, From 5e2e8ff8a935dea11425b89ea67726fd0752539c Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:15:12 -0500 Subject: [PATCH 35/50] solana: us unwrap_or_else (#79) Co-authored-by: gator-boi --- solana/programs/swap-layer/src/composite/mod.rs | 3 ++- solana/programs/swap-layer/src/processor/admin/peer/mod.rs | 2 +- solana/programs/swap-layer/src/processor/stage_outbound.rs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs index e4b82d6e..ac8423cd 100644 --- a/solana/programs/swap-layer/src/composite/mod.rs +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -863,7 +863,8 @@ impl<'info> JupiterV6SharedAccountsRoute<'info> { account_infos: &'info [AccountInfo<'info>], limit_amount: Option, ) -> Result<(u64, u64)> { - let limit_amount = limit_amount.unwrap_or(utils::jupiter_v6::compute_min_amount_out(&args)); + let limit_amount = + limit_amount.unwrap_or_else(|| utils::jupiter_v6::compute_min_amount_out(&args)); let mut accounts = account_infos .iter() diff --git a/solana/programs/swap-layer/src/processor/admin/peer/mod.rs b/solana/programs/swap-layer/src/processor/admin/peer/mod.rs index c68032d4..eabeae49 100644 --- a/solana/programs/swap-layer/src/processor/admin/peer/mod.rs +++ b/solana/programs/swap-layer/src/processor/admin/peer/mod.rs @@ -34,7 +34,7 @@ pub fn handle_add_peer( let seeds = PeerSeeds { chain, - bump: bump_seed.unwrap_or(peer.seeds.bump), + bump: bump_seed.unwrap_or_else(|| peer.seeds.bump), }; let expected = Pubkey::create_program_address( &[Peer::SEED_PREFIX, &seeds.chain.to_be_bytes(), &[seeds.bump]], diff --git a/solana/programs/swap-layer/src/processor/stage_outbound.rs b/solana/programs/swap-layer/src/processor/stage_outbound.rs index 9926e6f2..5110f49b 100644 --- a/solana/programs/swap-layer/src/processor/stage_outbound.rs +++ b/solana/programs/swap-layer/src/processor/stage_outbound.rs @@ -170,7 +170,7 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R } = args; // Replace None with OutputToken::USDC encoded. - let encoded_output_token = encoded_output_token.unwrap_or({ + let encoded_output_token = encoded_output_token.unwrap_or_else(|| { let mut buf = Vec::with_capacity(1); OutputToken::Usdc.write(&mut buf).unwrap(); buf From a2258ec1d83f885c4fd8e454171e40a91a55e8f4 Mon Sep 17 00:00:00 2001 From: Reptile <43194093+gator-boi@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:45:23 -0500 Subject: [PATCH 36/50] solana: finish TODOs (#80) * solana: remove stale comment * solana: add additional relayer fee tests --------- Co-authored-by: gator-boi --- .../programs/swap-layer/src/composite/mod.rs | 2 - solana/programs/swap-layer/src/state/peer.rs | 1 - .../swap-layer/src/utils/relayer_fees.rs | 262 +++++++++++++++++- 3 files changed, 258 insertions(+), 7 deletions(-) diff --git a/solana/programs/swap-layer/src/composite/mod.rs b/solana/programs/swap-layer/src/composite/mod.rs index ac8423cd..b876cac4 100644 --- a/solana/programs/swap-layer/src/composite/mod.rs +++ b/solana/programs/swap-layer/src/composite/mod.rs @@ -286,8 +286,6 @@ impl<'info> ConsumeSwapLayerFill<'info> { // Check the deadline for the swap. There may not be a deadline check with the // dex that this instruction composes with, so we will check it here. - // - // TODO: Do we accept deadline == 0? require!( deadline == 0 || Clock::get().unwrap().unix_timestamp <= i64::from(deadline), SwapLayerError::SwapPastDeadline, diff --git a/solana/programs/swap-layer/src/state/peer.rs b/solana/programs/swap-layer/src/state/peer.rs index 753bba98..7bd09ccc 100644 --- a/solana/programs/swap-layer/src/state/peer.rs +++ b/solana/programs/swap-layer/src/state/peer.rs @@ -50,7 +50,6 @@ pub struct PeerSeeds { #[derive(Debug, InitSpace)] /// Foreign Peer account data. pub struct Peer { - /// TODO: add bump seed pub seeds: PeerSeeds, /// Peer address. Cannot be zero address. pub address: [u8; 32], diff --git a/solana/programs/swap-layer/src/utils/relayer_fees.rs b/solana/programs/swap-layer/src/utils/relayer_fees.rs index 5308b009..64a42426 100644 --- a/solana/programs/swap-layer/src/utils/relayer_fees.rs +++ b/solana/programs/swap-layer/src/utils/relayer_fees.rs @@ -198,6 +198,22 @@ mod test { assert_eq!(denorm_gas_price, 1_000_000_000); } + #[test] + fn test_denormalize_gas_price_max() { + let gas_price = u32::MAX; + let denorm_gas_price = denormalize_gas_price(gas_price); + + assert_eq!(denorm_gas_price, 4_294_967_295_000_000); + } + + #[test] + fn test_denormalize_gas_price_zero() { + let gas_price = 0; + let denorm_gas_price = denormalize_gas_price(gas_price); + + assert_eq!(denorm_gas_price, 0); + } + #[test] fn test_compound() { let base = 1_000; @@ -272,6 +288,30 @@ mod test { assert_eq!(gas_overhead, Some(130_000)); } + #[test] + fn test_uniswap_gas_overhead_many_swaps() { + let swap_type = &SwapType::UniswapV3(UniswapSwapParameters { + first_leg_fee: 0.into(), + path: vec![ + UniswapSwapPath { + evm_address: hex!("5991a2df15a8f6a256d3ec51e99254cd3fb576a9"), + fee: 0.into(), + }, + UniswapSwapPath { + evm_address: hex!("5991a2df15a8f6a256d3ec51e99254cd3fb576a9"), + fee: 0.into(), + }, + UniswapSwapPath { + evm_address: hex!("5991a2df15a8f6a256d3ec51e99254cd3fb576a9"), + fee: 0.into(), + }, + ], + }); + let gas_overhead = calculate_evm_swap_overhead(swap_type); + + assert_eq!(gas_overhead, Some(490_000)); + } + #[test] fn test_traderjoe_gas_overhead_one_swap() { let swap_type = &SwapType::TraderJoe(TraderJoeSwapParameters { @@ -286,6 +326,42 @@ mod test { assert_eq!(gas_overhead, Some(110_000)); } + #[test] + fn test_traderjoe_gas_overhead_many_swaps() { + let swap_type = &SwapType::TraderJoe(TraderJoeSwapParameters { + first_pool_id: TraderJoePoolId { + version: 0, + bin_size: 69, + }, + path: vec![ + TraderJoeSwapPath { + evm_address: hex!("5991a2df15a8f6a256d3ec51e99254cd3fb576a9"), + pool_id: TraderJoePoolId { + version: 0, + bin_size: 69, + }, + }, + TraderJoeSwapPath { + evm_address: hex!("5991a2df15a8f6a256d3ec51e99254cd3fb576a9"), + pool_id: TraderJoePoolId { + version: 0, + bin_size: 69, + }, + }, + TraderJoeSwapPath { + evm_address: hex!("5991a2df15a8f6a256d3ec51e99254cd3fb576a9"), + pool_id: TraderJoePoolId { + version: 0, + bin_size: 69, + }, + }, + ], + }); + let gas_overhead = calculate_evm_swap_overhead(swap_type); + + assert_eq!(gas_overhead, Some(350_000)); + } + #[test] fn test_calculate_evm_gas_cost() { let gas_price = 1_000; // 10 GWEI @@ -299,6 +375,58 @@ mod test { assert_eq!(gas_cost, Some(25_000)); } + #[test] + fn test_calculate_evm_gas_cost_high_margin() { + let gas_price = 10_000; // 10 GWEI + let gas_price_margin = crate::MAX_BPS; // 100% + let total_gas = 100_000; + let native_token_price = 2_000_000_000; // ETH price $2000 + + assert_eq!( + calculate_evm_gas_cost(gas_price, gas_price_margin, total_gas, native_token_price), + Some(4_000_000) + ); + } + + #[test] + fn test_calculate_evm_gas_cost_overflow() { + let gas_price = u32::MAX; + let gas_price_margin = crate::MAX_BPS; + let total_gas = u64::MAX; + let native_token_price = u64::MAX; + + assert_eq!( + calculate_evm_gas_cost(gas_price, gas_price_margin, total_gas, native_token_price), + None + ); + } + + #[test] + fn test_calculate_evm_gas_cost_zero_margin() { + let gas_price = 1_000; // 10 GWEI + let gas_price_margin = 0; // 25% + let total_gas = 100_000; + let native_token_price = 200_000_000; // 200 USDC + + let gas_cost = + calculate_evm_gas_cost(gas_price, gas_price_margin, total_gas, native_token_price); + + assert_eq!(gas_cost, Some(20_000)); + } + + #[test] + fn test_calculate_evm_gas_cost_zero_gas_price() { + let gas_price = 0; // + let gas_price_margin = 250_000; // 25% + let total_gas = 100_000; + let native_token_price = 200_000_000; // 200 USDC + + let gas_cost = + calculate_evm_gas_cost(gas_price, gas_price_margin, total_gas, native_token_price); + + assert_eq!(gas_cost, Some(0)); + } + #[test] fn test_calculate_gas_dropoff_cost() { let gas_dropoff = 500_000; // .5 SOL normalized @@ -308,7 +436,67 @@ mod test { let dropoff_cost = calculate_gas_dropoff_cost(gas_dropoff, gas_dropoff_margin, native_token_price); - assert_eq!(dropoff_cost, Some(150000000)); + assert_eq!(dropoff_cost, Some(150_000_000)); + } + + #[test] + fn test_calculate_gas_dropoff_zero_inputs() { + let specified_gas_dropoff = 0; + let gas_dropoff_margin = 0; + let native_token_price = 0; + + let dropoff_cost = calculate_gas_dropoff_cost( + specified_gas_dropoff, + gas_dropoff_margin, + native_token_price, + ); + + assert_eq!(dropoff_cost, Some(0)); + } + + #[test] + fn test_calculate_gas_dropoff_max() { + let specified_gas_dropoff = u32::MAX; + let gas_dropoff_margin = 0; + let native_token_price = 200_000_000; // 200 USDC + + let dropoff_cost = calculate_gas_dropoff_cost( + specified_gas_dropoff, + gas_dropoff_margin, + native_token_price, + ); + + assert_eq!(dropoff_cost, Some(858_993_459_000)); + } + + #[test] + fn test_calculate_gas_dropoff_max_margin() { + let specified_gas_dropoff = 500_000; // 0.5 SOL normalized + let gas_dropoff_margin = crate::MAX_BPS; + let native_token_price = 200_000_000; // 200 USDC + + let dropoff_cost = calculate_gas_dropoff_cost( + specified_gas_dropoff, + gas_dropoff_margin, + native_token_price, + ); + + assert_eq!(dropoff_cost, Some(200_000_000)); + } + + #[test] + fn test_calculate_gas_dropoff_overflow() { + let specified_gas_dropoff = u32::MAX; + let gas_dropoff_margin = crate::MAX_BPS; + let native_token_price = u64::MAX; + + let dropoff_cost = calculate_gas_dropoff_cost( + specified_gas_dropoff, + gas_dropoff_margin, + native_token_price, + ); + + assert_eq!(dropoff_cost, None); // Expected to overflow } #[test] @@ -319,7 +507,75 @@ mod test { let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, output_token); - assert_eq!(relayer_fee.unwrap(), 17280000); + assert_eq!(relayer_fee.unwrap(), 17_280_000); + } + + #[test] + fn test_calculate_relayer_fee_zero_gas_dropoff() { + let relay_params = test_relay_params(); + let gas_dropoff = 0; + let output_token = &OutputToken::Usdc; + + let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, output_token); + + assert_eq!(relayer_fee.unwrap(), 2_200_000); + } + + #[test] + fn test_calculate_relayer_fee_max_base_fee() { + let mut relay_params = test_relay_params(); + relay_params.base_fee = u32::MAX - 1; + let gas_dropoff = 50_000; + let output_token = &OutputToken::Usdc; + + let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, output_token); + + assert!(relayer_fee.is_ok()); + assert!(relayer_fee.unwrap() > u32::MAX.into()); + } + + #[test] + fn test_calculate_relayer_fee_relaying_disabled() { + let mut relay_params = test_relay_params(); + relay_params.base_fee = u32::MAX; + let gas_dropoff = 50_000; + let output_token = &OutputToken::Usdc; + + let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, output_token); + + assert_eq!( + relayer_fee.unwrap_err(), + SwapLayerError::RelayingDisabled.into() + ); + } + + #[test] + fn test_calculate_relayer_fee_invalid_execution_params() { + let mut relay_params = test_relay_params(); + relay_params.execution_params = ExecutionParams::None; + let gas_dropoff = 50_000; + let output_token = &OutputToken::Usdc; + + let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, output_token); + + assert_eq!( + relayer_fee.unwrap_err(), + SwapLayerError::InvalidExecutionParams.into() + ); + } + + #[test] + fn test_calculate_relayer_fee_invalid_gas_dropoff() { + let relay_params = test_relay_params(); + let gas_dropoff = relay_params.max_gas_dropoff + 1; + let output_token = &OutputToken::Usdc; + + let relayer_fee = calculate_relayer_fee(&relay_params, gas_dropoff, output_token); + + assert_eq!( + relayer_fee.unwrap_err(), + SwapLayerError::InvalidGasDropoff.into() + ); } #[test] @@ -383,8 +639,6 @@ mod test { assert_eq!(relayer_fee.unwrap(), 17755000); } - // TODO: Add boundary tests. - fn test_relay_params() -> RelayParams { RelayParams { base_fee: 1_500_000, // 1.5 USDC From c56e5245823d86c49ce70223663bf499dc2c4abb Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Fri, 9 Aug 2024 12:26:29 -0500 Subject: [PATCH 37/50] solana: add `make build` (#83) Co-authored-by: A5 Pickle --- .github/workflows/solana.yml | 28 ++++++++++++++++++++++++++++ solana/.gitignore | 1 + solana/Makefile | 11 +++++++++++ 3 files changed, 40 insertions(+) diff --git a/.github/workflows/solana.yml b/.github/workflows/solana.yml index 46bfc063..c4b884b9 100644 --- a/.github/workflows/solana.yml +++ b/.github/workflows/solana.yml @@ -16,6 +16,7 @@ jobs: uses: styfle/cancel-workflow-action@0.9.1 with: access_token: ${{ github.token }} + make-cargo-test-all: name: make cargo-test-all runs-on: ubuntu-latest @@ -31,6 +32,7 @@ jobs: - name: make cargo-test-all run: make cargo-test-all working-directory: ./solana + make-lint: name: make lint runs-on: ubuntu-latest @@ -46,6 +48,7 @@ jobs: - name: make lint run: make lint working-directory: ./solana + make-anchor-test: name: make anchor-test runs-on: ubuntu-latest @@ -70,3 +73,28 @@ jobs: - name: make anchor-test run: make anchor-test working-directory: ./solana + + make-check-build: + name: make check-build + runs-on: ubuntu-latest + # Anchor Docker image: https://www.anchor-lang.com/docs/verifiable-builds#images + # container: backpackapp/build:v0.30.0 + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + - uses: metadaoproject/setup-anchor@v2 + with: + node-version: "20.11.0" + solana-cli-version: "1.18.15" + anchor-version: "0.30.0" + - name: Set default Rust toolchain + run: rustup default stable + working-directory: ./solana + - name: make check-build + run: make check-build + working-directory: ./solana diff --git a/solana/.gitignore b/solana/.gitignore index 23214334..76a49c8c 100644 --- a/solana/.gitignore +++ b/solana/.gitignore @@ -3,6 +3,7 @@ .DS_Store target **/*.rs.bk +artifacts-* node_modules test-ledger ts/tests/artifacts \ No newline at end of file diff --git a/solana/Makefile b/solana/Makefile index fa140b3b..0568baf3 100644 --- a/solana/Makefile +++ b/solana/Makefile @@ -58,6 +58,17 @@ cargo-test-all: NETWORK=localnet $(MAKE) cargo-test NETWORK=testnet $(MAKE) cargo-test +.PHONY: build +build: fast-transfer-sync + anchor build -- --features $(NETWORK) + mkdir -p artifacts-$(NETWORK) + cp target/deploy/swap_layer.so artifacts-$(NETWORK) + +.PHONY: check-build +check-build: + NETWORK=testnet $(MAKE) build + ls artifacts-testnet/swap_layer.so + ts/tests/artifacts: mkdir ts/tests/artifacts From 3b0cd05dc29946a6705018964dbb873f11c81b01 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Fri, 9 Aug 2024 12:38:14 -0500 Subject: [PATCH 38/50] solana: fix space calc (#82) Co-authored-by: A5 Pickle --- solana/programs/swap-layer/src/state/staged/inbound.rs | 1 - solana/ts/tests/10__swap.ts | 8 ++++---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/solana/programs/swap-layer/src/state/staged/inbound.rs b/solana/programs/swap-layer/src/state/staged/inbound.rs index 880674d2..c4184dad 100644 --- a/solana/programs/swap-layer/src/state/staged/inbound.rs +++ b/solana/programs/swap-layer/src/state/staged/inbound.rs @@ -44,7 +44,6 @@ impl StagedInbound { const FIXED: usize = 8 // DISCRIMINATOR + StagedInboundSeeds::INIT_SPACE + StagedInboundInfo::INIT_SPACE - + 32 // sender + 4 // payload len ; diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index 2a976a2c..f0410f72 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -2935,7 +2935,7 @@ describe("Swap Layer -- Jupiter V6", () => { const ixs = [ ComputeBudgetProgram.setComputeUnitLimit({ - units: 700_000, + units: 750_000, }), ix, ]; @@ -3036,7 +3036,7 @@ describe("Swap Layer -- Jupiter V6", () => { const ixs = [ ComputeBudgetProgram.setComputeUnitLimit({ - units: 700_000, + units: 750_000, }), ix, ]; @@ -3172,7 +3172,7 @@ describe("Swap Layer -- Jupiter V6", () => { const ixs = [ ComputeBudgetProgram.setComputeUnitLimit({ - units: 700_000, + units: 750_000, }), ix, ]; @@ -4009,7 +4009,7 @@ describe("Swap Layer -- Jupiter V6", () => { const ix = await swapLayer.initiateSwapExactInIx(accounts, args); const computeIx = ComputeBudgetProgram.setComputeUnitLimit({ - units: 700_000, + units: 750_000, }); const addressLookupTableAccounts = await Promise.all( From 7cf10fcfb42092681044df1f6aaa88a9bd35a909 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Fri, 9 Aug 2024 12:38:25 -0500 Subject: [PATCH 39/50] solana: add redeemer to complete transfer ixs (#81) Co-authored-by: A5 Pickle --- solana/programs/swap-layer/src/error.rs | 1 + .../src/processor/complete/transfer/direct.rs | 22 ++- .../processor/complete/transfer/payload.rs | 22 ++- .../src/processor/complete/transfer/relay.rs | 77 ++++---- solana/ts/src/swapLayer/index.ts | 33 ++-- solana/ts/tests/01__transfer.ts | 181 ++++++++++++++++-- 6 files changed, 261 insertions(+), 75 deletions(-) diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs index 4a7edb70..1e7644fc 100644 --- a/solana/programs/swap-layer/src/error.rs +++ b/solana/programs/swap-layer/src/error.rs @@ -32,6 +32,7 @@ pub enum SwapLayerError { UnsupportedFillType = 0x115, SwapTimeLimitNotExceeded = 0x116, ImmutableProgram = 0x118, + InvalidRedeemer = 0x11a, // EVM Execution Param errors InvalidBaseFee = 0x200, diff --git a/solana/programs/swap-layer/src/processor/complete/transfer/direct.rs b/solana/programs/swap-layer/src/processor/complete/transfer/direct.rs index 0f3b890c..ff04c404 100644 --- a/solana/programs/swap-layer/src/processor/complete/transfer/direct.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/direct.rs @@ -5,6 +5,11 @@ use swap_layer_messages::types::{OutputToken, RedeemMode}; #[derive(Accounts)] pub struct CompleteTransferDirect<'info> { + /// This redeemer is used to check against the recipient. If the redeemer is the same as the + /// recipient, he is free to redeem his tokens directly as USDC even if swap instructions are + /// encoded. + redeemer: Signer<'info>, + #[account( constraint = { let swap_msg = consume_swap_layer_fill.read_message_unchecked(); @@ -15,13 +20,16 @@ pub struct CompleteTransferDirect<'info> { SwapLayerError::InvalidRecipient ); - require!( - matches!( - swap_msg.output_token, - OutputToken::Usdc - ), - SwapLayerError::InvalidOutputToken - ); + match &swap_msg.output_token { + OutputToken::Usdc => {} + OutputToken::Gas(_) | OutputToken::Other { .. } => { + require_eq!( + redeemer.key(), + recipient.key(), + SwapLayerError::InvalidRedeemer + ); + } + } true } diff --git a/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs b/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs index 09f5cf02..7a925e63 100644 --- a/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/payload.rs @@ -12,17 +12,25 @@ pub struct CompleteTransferPayload<'info> { #[account(mut)] payer: Signer<'info>, + /// This redeemer is used to check against the recipient. If the redeemer is the same as the + /// recipient, he is free to redeem his tokens directly as USDC even if swap instructions are + /// encoded. + redeemer: Signer<'info>, + #[account( constraint = { let swap_msg = consume_swap_layer_fill.read_message_unchecked(); - require!( - matches!( - swap_msg.output_token, - OutputToken::Usdc - ), - SwapLayerError::InvalidOutputToken - ); + match &swap_msg.output_token { + OutputToken::Usdc => {} + OutputToken::Gas(_) | OutputToken::Other { .. } => { + require_eq!( + redeemer.key(), + Pubkey::from(swap_msg.recipient), + SwapLayerError::InvalidRedeemer + ); + } + } true } diff --git a/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs index d3b33066..2f3017b1 100644 --- a/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs +++ b/solana/programs/swap-layer/src/processor/complete/transfer/relay.rs @@ -4,7 +4,7 @@ use crate::{ state::Custodian, utils::{self}, }; -use anchor_lang::prelude::*; +use anchor_lang::{prelude::*, system_program}; use anchor_spl::token; use swap_layer_messages::types::{OutputToken, RedeemMode}; use token_router::state::FillType; @@ -15,6 +15,11 @@ pub struct CompleteTransferRelay<'info> { /// The payer of the transaction. This could either be the recipient or a relayer. payer: Signer<'info>, + /// This redeemer is used to check against the recipient. If the redeemer is the same as the + /// recipient, he is free to redeem his tokens directly as USDC even if swap instructions are + /// encoded. + redeemer: Signer<'info>, + #[account( constraint = { let swap_msg = consume_swap_layer_fill.read_message_unchecked(); @@ -29,32 +34,34 @@ pub struct CompleteTransferRelay<'info> { // relayer is attempting to redeem an output token that is not USDC. match swap_msg.output_token { OutputToken::Usdc => {} - OutputToken::Gas(_) | OutputToken::Other { - address: _, - swap: _, - } => { - let time_diff = Clock::get()? - .unix_timestamp - .saturating_sub(consume_swap_layer_fill.fill.timestamp); - let swap_time_limit = &consume_swap_layer_fill - .source_peer - .relay_params - .swap_time_limit; - - match consume_swap_layer_fill.fill.fill_type { - FillType::FastFill => { - require!( - time_diff >= i64::from(swap_time_limit.fast_limit), - SwapLayerError::SwapTimeLimitNotExceeded - ); - } - FillType::WormholeCctpDeposit => { - require!( - time_diff >= i64::from(swap_time_limit.finalized_limit), - SwapLayerError::SwapTimeLimitNotExceeded - ); + OutputToken::Gas(_) | OutputToken::Other { .. } => { + // If the redeemer is not the recipient, handle these output tokens very + // carefully by checking the time limits. + if redeemer.key() != recipient.key() { + let time_diff = Clock::get() + .unwrap() + .unix_timestamp + .saturating_sub(consume_swap_layer_fill.fill.timestamp); + let swap_time_limit = &consume_swap_layer_fill + .source_peer + .relay_params + .swap_time_limit; + + match consume_swap_layer_fill.fill.fill_type { + FillType::FastFill => { + require!( + time_diff >= i64::from(swap_time_limit.fast_limit), + SwapLayerError::SwapTimeLimitNotExceeded + ); + } + FillType::WormholeCctpDeposit => { + require!( + time_diff >= i64::from(swap_time_limit.finalized_limit), + SwapLayerError::SwapTimeLimitNotExceeded + ); + } + FillType::Unset => return Err(SwapLayerError::UnsupportedFillType.into()), } - FillType::Unset => return Err(SwapLayerError::UnsupportedFillType.into()), } } } @@ -87,7 +94,7 @@ pub struct CompleteTransferRelay<'info> { /// of the bridged tokens. recipient_token_account: Box>, - /// CHECK: recipient may differ from payer if a relayer paid for this + /// CHECK: Recipient may differ from redeemer if a relayer paid for this /// transaction. This instruction verifies that the recipient key /// passed in this context matches the intended recipient in the fill. #[account(mut)] @@ -143,16 +150,16 @@ fn handle_complete_transfer_relay( let payer = &ctx.accounts.payer; let recipient = &ctx.accounts.recipient; - // If the payer is the recipient, just transfer the tokens to the recipient. + // If the redeemer is the recipient, just transfer the tokens to the recipient. let user_amount = { - if payer.key() == recipient.key() { + if ctx.accounts.redeemer.key() == recipient.key() { fill_amount } else { if gas_dropoff > 0 { - anchor_lang::system_program::transfer( + system_program::transfer( CpiContext::new( ctx.accounts.system_program.to_account_info(), - anchor_lang::system_program::Transfer { + system_program::Transfer { from: payer.to_account_info(), to: recipient.to_account_info(), }, @@ -169,10 +176,10 @@ fn handle_complete_transfer_relay( }; // Transfer the tokens to the recipient. - anchor_spl::token::transfer( + token::transfer( CpiContext::new_with_signer( token_program.to_account_info(), - anchor_spl::token::Transfer { + token::Transfer { from: complete_token.to_account_info(), to: ctx.accounts.recipient_token_account.to_account_info(), authority: custodian.to_account_info(), @@ -184,10 +191,10 @@ fn handle_complete_transfer_relay( // Transfer eligible USDC to the fee recipient. if user_amount != fill_amount { - anchor_spl::token::transfer( + token::transfer( CpiContext::new_with_signer( token_program.to_account_info(), - anchor_spl::token::Transfer { + token::Transfer { from: complete_token.to_account_info(), to: ctx.accounts.fee_recipient_token.to_account_info(), authority: custodian.to_account_info(), diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 8bdefcfe..6711897c 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -811,6 +811,7 @@ export class SwapLayerProgram { async completeTransferRelayIx( accounts: { payer: PublicKey; + redeemer?: PublicKey; preparedFill: PublicKey; recipient: PublicKey; peer?: PublicKey; @@ -820,16 +821,11 @@ export class SwapLayerProgram { }, sourceChain?: wormholeSdk.ChainId, ) { - let { - payer, - beneficiary, - preparedFill, - peer, - recipient, - recipientTokenAccount, - feeRecipientToken, - } = accounts; + const { payer, preparedFill, recipient } = accounts; + let { redeemer, beneficiary, peer, recipientTokenAccount, feeRecipientToken } = accounts; + + redeemer ??= payer; beneficiary ??= payer; recipientTokenAccount ??= splToken.getAssociatedTokenAddressSync(this.usdcMint, recipient); @@ -843,6 +839,7 @@ export class SwapLayerProgram { .completeTransferRelay() .accounts({ payer, + redeemer, consumeSwapLayerFill: await this.consumeSwapLayerFillComposite( { preparedFill, @@ -865,23 +862,27 @@ export class SwapLayerProgram { async completeTransferDirectIx( accounts: { payer: PublicKey; + redeemer?: PublicKey; preparedFill: PublicKey; peer?: PublicKey; - recipient?: PublicKey; + recipient: PublicKey; beneficiary?: PublicKey; recipientTokenAccount?: PublicKey; }, sourceChain?: wormholeSdk.ChainId, ) { - let { payer, beneficiary, preparedFill, peer, recipient, recipientTokenAccount } = accounts; + const { payer, preparedFill, recipient } = accounts; + let { redeemer, beneficiary, peer, recipientTokenAccount } = accounts; + + redeemer ??= payer; beneficiary ??= payer; - recipient ??= payer; recipientTokenAccount ??= splToken.getAssociatedTokenAddressSync(this.usdcMint, recipient); return this.program.methods .completeTransferDirect() .accounts({ + redeemer, consumeSwapLayerFill: await this.consumeSwapLayerFillComposite( { preparedFill, @@ -900,14 +901,17 @@ export class SwapLayerProgram { async completeTransferPayloadIx( accounts: { payer: PublicKey; + redeemer?: PublicKey; preparedFill: PublicKey; peer?: PublicKey; beneficiary?: PublicKey; }, sourceChain?: wormholeSdk.ChainId, ) { - let { payer, preparedFill, peer, beneficiary } = accounts; + const { payer, preparedFill } = accounts; + let { redeemer, peer, beneficiary } = accounts; + redeemer ??= payer; beneficiary ??= payer; const stagedInbound = this.stagedInboundAddress(preparedFill); @@ -916,7 +920,8 @@ export class SwapLayerProgram { return this.program.methods .completeTransferPayload() .accounts({ - payer: payer, + payer, + redeemer, consumeSwapLayerFill: await this.consumeSwapLayerFillComposite( { preparedFill, diff --git a/solana/ts/tests/01__transfer.ts b/solana/ts/tests/01__transfer.ts index c598f000..ee0c1a16 100644 --- a/solana/ts/tests/01__transfer.ts +++ b/solana/ts/tests/01__transfer.ts @@ -2644,7 +2644,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { await expectIxErr(connection, [transferIx], [payer], "InvalidPeer"); }); - it("Cannot Complete Transfer (Swap Time Limit Not Exceeded)", async function () { + it("Cannot Complete Transfer with Redeemer != Recipient and Output Token != USDC (Swap Time Limit Not Exceeded)", async function () { const currTime = await connection.getBlockTime(await connection.getSlot()); const result = await createAndRedeemCctpFillForTest( testCctpNonce++, @@ -2679,9 +2679,11 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { const { vaa } = result!; const preparedFill = tokenRouter.preparedFillAddress(vaa); + const redeemer = Keypair.generate(); const transferIx = await swapLayer.completeTransferRelayIx( { payer: payer.publicKey, + redeemer: redeemer.publicKey, preparedFill, recipient: payer.publicKey, }, @@ -2691,11 +2693,58 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { await expectIxErr( connection, [transferIx], - [payer], + [payer, redeemer], "SwapTimeLimitNotExceeded", ); }); + it("Complete Transfer with Redeemer == Recipient and Output Token != USDC", async function () { + const currTime = await connection.getBlockTime(await connection.getSlot()); + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress(payer.publicKey.toString(), "base58"), + redeemMode: { + mode: "Relay", + gasDropoff: 0, + relayingFee: 6900n, + }, + outputToken: { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "JupiterV6", + dexProgramId: { isSome: false }, + }, + }, + }, + }), + { + vaaTimestamp: + currTime - TEST_RELAY_PARAMS.swapTimeLimit.finalizedLimit + 5, + }, + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferRelayIx( + { + payer: payer.publicKey, + preparedFill, + recipient: payer.publicKey, + }, + foreignChain, + ); + + await expectIxOk(connection, [transferIx], [payer]); + }); + it("Cannot Complete Transfer (Invalid Recipient)", async function () { const result = await createAndRedeemCctpFillForTest( testCctpNonce++, @@ -3218,7 +3267,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { await expectIxErr(connection, [transferIx], [payer], "InvalidRecipient"); }); - it("Cannot Complete Transfer (Invalid Output Token)", async function () { + it("Cannot Complete Transfer with Redeemer != Recipient and Output Token != USDC (Invalid Redeemer)", async function () { const result = await createAndRedeemCctpFillForTest( testCctpNonce++, foreignChain, @@ -3258,7 +3307,56 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { foreignChain, ); - await expectIxErr(connection, [transferIx], [payer], "InvalidOutputToken"); + await expectIxErr( + connection, + [transferIx], + [payer], + "Error Code: InvalidRedeemer", + ); + }); + + it("Complete Transfer with Redeemer == Recipient and Output Token != USDC", async function () { + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { + mode: "Direct", + }, + outputToken: { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "JupiterV6", + dexProgramId: { isSome: false }, + }, + }, + }, + }), + ); + const { vaa } = result!; + const preparedFill = tokenRouter.preparedFillAddress(vaa); + + const transferIx = await swapLayer.completeTransferDirectIx( + { + payer: payer.publicKey, + redeemer: recipient.publicKey, + preparedFill, + recipient: recipient.publicKey, + }, + foreignChain, + ); + + await expectIxOk(connection, [transferIx], [payer, recipient]); }); it("Complete Transfer (Recipient Not Payer)", async function () { @@ -3336,6 +3434,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { payer: payer.publicKey, beneficiary: beneficiary.publicKey, preparedFill, + recipient: payer.publicKey, }, foreignChain, ); @@ -3452,7 +3551,64 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { }); describe("Stage Inbound", function () { - it("Cannot Stage Inbound (Invalid Output Token)", async function () { + it("Cannot Complete Transfer with Redeemer != Recipient and Output Token != USDC (Invalid Redeemer)", async function () { + // Try to complete the swap with an invalid output token (include + // swap instructions). + const result = await createAndRedeemCctpFillForTest( + testCctpNonce++, + foreignChain, + foreignTokenRouterAddress, + foreignSwapLayerAddress, + wormholeSequence, + encodeSwapLayerMessage({ + recipient: new UniversalAddress( + recipient.publicKey.toString(), + "base58", + ), + redeemMode: { + mode: "Payload", + sender: toUniversal( + "Ethereum", + "0x000000000000000000000000000000000000d00d", + ), + buf: Buffer.from("Insert payload here"), + }, + outputToken: { + type: "Gas", + swap: { + deadline: 0, + limitAmount: 0n, + type: { + id: "JupiterV6", + dexProgramId: { isSome: false }, + }, + }, + }, + }), + ); + const { vaa } = result!; + + const preparedFill = tokenRouter.preparedFillAddress(vaa); + const beneficiary = Keypair.generate(); + + const transferIx = await swapLayer.completeTransferPayloadIx( + { + payer: payer.publicKey, + beneficiary: beneficiary.publicKey, + preparedFill, + }, + foreignChain, + ); + + await expectIxErr( + connection, + [transferIx], + [payer], + "Error Code: InvalidRedeemer", + ); + }); + + it("Complete Transfer with Redeemer == Recipient and Output Token != USDC", async function () { // Try to complete the swap with an invalid output token (include // swap instructions). const result = await createAndRedeemCctpFillForTest( @@ -3495,16 +3651,17 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { const transferIx = await swapLayer.completeTransferPayloadIx( { payer: payer.publicKey, + redeemer: recipient.publicKey, beneficiary: beneficiary.publicKey, preparedFill, }, foreignChain, ); - await expectIxErr(connection, [transferIx], [payer], "InvalidOutputToken"); + await expectIxOk(connection, [transferIx], [payer, recipient]); }); - it("Cannot Stage Inbound (Invalid Swap Message)", async function () { + it("Cannot Complete Transfer (Invalid Swap Message)", async function () { const result = await createAndRedeemCctpFillForTest( testCctpNonce++, foreignChain, @@ -3530,7 +3687,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { await expectIxErr(connection, [transferIx], [payer], "InvalidSwapMessage"); }); - it("Cannot Stage Inbound (Peer Doesn't Exist)", async function () { + it("Cannot Complete Transfer (Peer Doesn't Exist)", async function () { const result = await createAndRedeemCctpFillForTest( testCctpNonce++, foreignChain, @@ -3561,7 +3718,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { ); }); - it("Cannot Stage Inbound (Chain Mismatch)", async function () { + it("Cannot Complete Transfer (Chain Mismatch)", async function () { const result = await createAndRedeemCctpFillForTest( testCctpNonce++, foreignChain, @@ -3587,7 +3744,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { await expectIxErr(connection, [transferIx], [payer], "InvalidPeer"); }); - it("Cannot Stage Inbound (Invalid Peer)", async function () { + it("Cannot Complete Transfer (Invalid Peer)", async function () { const result = await createAndRedeemCctpFillForTest( testCctpNonce++, foreignChain, @@ -3619,7 +3776,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { await expectIxErr(connection, [transferIx], [payer], "InvalidPeer"); }); - it("Cannot Stage Inbound (Invalid Redeem Mode)", async function () { + it("Cannot Complete Transfer (Invalid Redeem Mode)", async function () { const result = await createAndRedeemCctpFillForTest( testCctpNonce++, foreignChain, @@ -3652,7 +3809,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { await expectIxErr(connection, [transferIx], [payer], "InvalidRedeemMode"); }); - it("Stage Inbound", async function () { + it("Complete Transfer with Output Token == USDC", async function () { const result = await createAndRedeemCctpFillForTest( testCctpNonce++, foreignChain, From ec69f3c6df1f4f7c84a7528c39e8d6ddc8c09964 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Tue, 13 Aug 2024 08:26:40 -0500 Subject: [PATCH 40/50] e2e: fix test (#84) * e2e: add min amount out * workflows: add e2e * solana: skip Token 2022 outbound tests NOTE: Cannot swap via Raydium CLMM now. Need to fix these tests by forking new accounts and possibly excluding this dex. --------- Co-authored-by: A5 Pickle --- .github/workflows/e2e.yml | 38 ++++++++++++++++++++++++++++++ .github/workflows/solana.yml | 11 +-------- .github/workflows/universal-rs.yml | 3 ++- e2e/tests/02__swapLayer.ts | 4 ++-- e2e/tests/helpers/utils.ts | 5 +++- package-lock.json | 2 +- solana/ts/tests/10__swap.ts | 24 +++++++++++++++++-- 7 files changed, 70 insertions(+), 17 deletions(-) create mode 100644 .github/workflows/e2e.yml diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml new file mode 100644 index 00000000..0a3c5ed4 --- /dev/null +++ b/.github/workflows/e2e.yml @@ -0,0 +1,38 @@ +name: e2e +on: + push: + branches: + - main + pull_request: + +env: + RUSTC_VERSION: 1.75.0 +jobs: + test: + name: bash sh/run_test.sh + runs-on: ubuntu-latest + # Anchor Docker image: https://www.anchor-lang.com/docs/verifiable-builds#images + # container: backpackapp/build:v0.30.0 + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + - uses: metadaoproject/setup-anchor@v2 + with: + node-version: "20.11.0" + solana-cli-version: "1.18.15" + anchor-version: "0.30.0" + - name: Set default Rust toolchain + run: rustup default stable + - name: make node_modules + run: make node_modules + - name: make build + run: make build + working-directory: ./evm + - name: bash sh/run_test.sh + run: bash sh/run_test.sh + working-directory: ./e2e \ No newline at end of file diff --git a/.github/workflows/solana.yml b/.github/workflows/solana.yml index c4b884b9..01d6832b 100644 --- a/.github/workflows/solana.yml +++ b/.github/workflows/solana.yml @@ -3,20 +3,11 @@ on: push: branches: - main - - solana/integration - pull_request: null + pull_request: env: RUSTC_VERSION: 1.75.0 jobs: - cancel-previous-runs: - runs-on: ubuntu-latest - steps: - - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.1 - with: - access_token: ${{ github.token }} - make-cargo-test-all: name: make cargo-test-all runs-on: ubuntu-latest diff --git a/.github/workflows/universal-rs.yml b/.github/workflows/universal-rs.yml index bae8cc27..45a5567c 100644 --- a/.github/workflows/universal-rs.yml +++ b/.github/workflows/universal-rs.yml @@ -2,7 +2,8 @@ name: universal-rs on: push: - branches: [main] + branches: + - main pull_request: env: diff --git a/e2e/tests/02__swapLayer.ts b/e2e/tests/02__swapLayer.ts index 61ba841d..94a0beaa 100644 --- a/e2e/tests/02__swapLayer.ts +++ b/e2e/tests/02__swapLayer.ts @@ -705,7 +705,7 @@ describe("Swap Layer", () => { describe("Direct", function () { it("Outbound", async function () { const amountIn = 1_000_000_000n; // 1 SOL - const amountOut = 150_000_000n; // 150 USDC + const amountOut = 140_000_000n; // 140 USDC const targetAmountOut = 25_000_000_000_000_000n; // 0.025 ETH const senderToken = splToken.getAssociatedTokenAddressSync( splToken.NATIVE_MINT, @@ -771,7 +771,7 @@ describe("Swap Layer", () => { describe("Relay", function () { it("Outbound", async function () { const amountIn = 1_000_000_000n; // 1 SOL - const amountOut = 150_000_000n; // 150 USDC + const amountOut = 140_000_000n; // 140 USDC const targetAmountOut = 25_000_000_000_000_000n; // 0.025 ETH const senderToken = splToken.getAssociatedTokenAddressSync( splToken.NATIVE_MINT, diff --git a/e2e/tests/helpers/utils.ts b/e2e/tests/helpers/utils.ts index cdec3fba..049eb068 100644 --- a/e2e/tests/helpers/utils.ts +++ b/e2e/tests/helpers/utils.ts @@ -92,6 +92,7 @@ type StageOutboundArgs = { | { payload: Uint8Array | Buffer } | null; outputToken?: OutputToken | null; + minAmountOut?: bigint; }; export async function stageOutboundOnSolana( @@ -111,7 +112,7 @@ export async function stageOutboundOnSolana( const stagedOutboundSigner = Keypair.generate(); const stagedOutbound = stagedOutboundSigner.publicKey; - let { redeemOption, outputToken, transferType, exactIn } = opts; + let { redeemOption, outputToken, transferType, exactIn, minAmountOut } = opts; redeemOption ??= null; outputToken ??= null; transferType ??= "sender"; @@ -126,6 +127,7 @@ export async function stageOutboundOnSolana( { transferType, amountIn, + minAmountOut, isExactIn: exactIn, targetChain: toChainId(targetChain), recipient: foreignRecipientAddress, @@ -366,6 +368,7 @@ export async function initiateOnSolanaSwapLayer( outputToken, transferType, exactIn, + minAmountOut: quotedOutAmount, }, ); diff --git a/package-lock.json b/package-lock.json index 36e080a6..c3acd0a5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4130,7 +4130,7 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-evm": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", - "integrity": "sha512-B6sAU/vRbxoayT3NIlwtaIOGMQN2ZyNcGvxiE7iK0saqZzv/6b7kcpA5S6OwF4PHykXlTt6RIAN08QZFJl4B6Q==", + "integrity": "sha512-191Y31N9+hxaqr4kH4/C6sQMNsZ2svCfm3grycSSM17MNRlmrsiRGDLESiU3xbOlUF2oIDkXxEmeUoo8JXQgpg==", "dependencies": { "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index f0410f72..a05979e8 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -223,7 +223,17 @@ describe("Swap Layer -- Jupiter V6", () => { ); }); - it("User Swap Token-2022 Mint to USDC From Simulated Quote -- Multi Route", async function () { + // TODO: This test is disabled because Raydium CLMM is now breaking. + // + // Program CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK invoke [3] + // Program log: Instruction: Swap + // Program log: AnchorError thrown in programs/amm/src/instructions/swap.rs:189. Error Code: RequireKeysEqViolated. Error Number: 2502. Error Message: A require_keys_eq expression was violated. + // Program log: Left: + // Program log: FgRFwp3q4XP5heU3LXqhrcR7DVUBZrzW1BCiPdmGVjdK + // Program log: Right: + // Program log: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj + // Program CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK consumed 29907 of 270505 compute units + it.skip("User Swap Token-2022 Mint to USDC From Simulated Quote -- Multi Route", async function () { const addressLookupTableAccounts = await Promise.all( JUPITER_V6_LUT_ADDRESSES_BERN.map(async (lookupTableAddress) => { const resp = await connection.getAddressLookupTable(lookupTableAddress); @@ -710,7 +720,17 @@ describe("Swap Layer -- Jupiter V6", () => { assert.isTrue(preparedCustodyTokenBalance >= minAmountOut); }); - it("Token-2022 Mint via Multi-Route", async function () { + // TODO: This test is disabled because Raydium CLMM is now breaking. + // + // Program CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK invoke [3] + // Program log: Instruction: Swap + // Program log: AnchorError thrown in programs/amm/src/instructions/swap.rs:189. Error Code: RequireKeysEqViolated. Error Number: 2502. Error Message: A require_keys_eq expression was violated. + // Program log: Left: + // Program log: FgRFwp3q4XP5heU3LXqhrcR7DVUBZrzW1BCiPdmGVjdK + // Program log: Right: + // Program log: 8sLbNZoA1cfnvMJLPfp98ZLAnFSYCFApfJKMbiXNLwxj + // Program CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK consumed 29907 of 270505 compute units + it.skip("Token-2022 Mint via Multi-Route", async function () { const srcMint = BERN_MINT_ADDRESS; const { From 71a0a28eba05433989817d389d5e33e02c07db11 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Thu, 29 Aug 2024 15:17:44 -0500 Subject: [PATCH 41/50] update .gitmodules (#87) * uptick rev * solana: uptick anchor 0.30.1 * solana: fix `make lint` --------- Co-authored-by: A5 Pickle --- .github/workflows/e2e.yml | 6 ++-- .github/workflows/solana.yml | 8 ++--- .gitmodules | 2 +- lib/example-liquidity-layer | 2 +- package-lock.json | 28 ++++++++++----- solana/Anchor.toml | 2 +- solana/Cargo.lock | 66 +++++++++++++++++++++--------------- solana/Cargo.toml | 4 +-- solana/Makefile | 5 +-- 9 files changed, 71 insertions(+), 52 deletions(-) diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 0a3c5ed4..9687905c 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -12,7 +12,7 @@ jobs: name: bash sh/run_test.sh runs-on: ubuntu-latest # Anchor Docker image: https://www.anchor-lang.com/docs/verifiable-builds#images - # container: backpackapp/build:v0.30.0 + # container: backpackapp/build:v0.30.1 steps: - uses: actions/checkout@v4 with: @@ -25,7 +25,7 @@ jobs: with: node-version: "20.11.0" solana-cli-version: "1.18.15" - anchor-version: "0.30.0" + anchor-version: "0.30.1" - name: Set default Rust toolchain run: rustup default stable - name: make node_modules @@ -35,4 +35,4 @@ jobs: working-directory: ./evm - name: bash sh/run_test.sh run: bash sh/run_test.sh - working-directory: ./e2e \ No newline at end of file + working-directory: ./e2e diff --git a/.github/workflows/solana.yml b/.github/workflows/solana.yml index 01d6832b..7dae5a63 100644 --- a/.github/workflows/solana.yml +++ b/.github/workflows/solana.yml @@ -43,8 +43,6 @@ jobs: make-anchor-test: name: make anchor-test runs-on: ubuntu-latest - # Anchor Docker image: https://www.anchor-lang.com/docs/verifiable-builds#images - # container: backpackapp/build:v0.30.0 steps: - uses: actions/checkout@v4 with: @@ -57,7 +55,7 @@ jobs: with: node-version: "20.11.0" solana-cli-version: "1.18.15" - anchor-version: "0.30.0" + anchor-version: "0.30.1" - name: Set default Rust toolchain run: rustup default stable working-directory: ./solana @@ -68,8 +66,6 @@ jobs: make-check-build: name: make check-build runs-on: ubuntu-latest - # Anchor Docker image: https://www.anchor-lang.com/docs/verifiable-builds#images - # container: backpackapp/build:v0.30.0 steps: - uses: actions/checkout@v4 with: @@ -82,7 +78,7 @@ jobs: with: node-version: "20.11.0" solana-cli-version: "1.18.15" - anchor-version: "0.30.0" + anchor-version: "0.30.1" - name: Set default Rust toolchain run: rustup default stable working-directory: ./solana diff --git a/.gitmodules b/.gitmodules index c26c0f49..75007f08 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "lib/example-liquidity-layer"] path = lib/example-liquidity-layer url = https://github.com/wormhole-foundation/example-liquidity-layer.git - rev = 63f2b423026ac1ad8b099bc3ecd44ba4fc64aae2 + rev = dcaf657f1efd2805a26efbe9710609d9480c5bd9 diff --git a/lib/example-liquidity-layer b/lib/example-liquidity-layer index 63f2b423..dcaf657f 160000 --- a/lib/example-liquidity-layer +++ b/lib/example-liquidity-layer @@ -1 +1 @@ -Subproject commit 63f2b423026ac1ad8b099bc3ecd44ba4fc64aae2 +Subproject commit dcaf657f1efd2805a26efbe9710609d9480c5bd9 diff --git a/package-lock.json b/package-lock.json index c3acd0a5..dd8c7e23 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1210,11 +1210,12 @@ } }, "node_modules/@coral-xyz/anchor": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.0.tgz", - "integrity": "sha512-qreDh5ztiRHVnCbJ+RS70NJ6aSTPBYDAgFeQ7Z5QvaT5DcDIhNyt4onOciVz2ieIE1XWePOJDDu9SbNvPGBkvQ==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.30.1.tgz", + "integrity": "sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==", "dependencies": { - "@coral-xyz/borsh": "^0.30.0", + "@coral-xyz/anchor-errors": "^0.30.1", + "@coral-xyz/borsh": "^0.30.1", "@noble/hashes": "^1.3.1", "@solana/web3.js": "^1.68.0", "bn.js": "^5.1.2", @@ -1233,10 +1234,18 @@ "node": ">=11" } }, + "node_modules/@coral-xyz/anchor-errors": { + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz", + "integrity": "sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/@coral-xyz/anchor/node_modules/@coral-xyz/borsh": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.0.tgz", - "integrity": "sha512-OrcV+7N10cChhgDRUxM4iEIuwxUHHs52XD85R8cFCUqE0vbLYrcoPPPs+VF6kZ9DhdJGVW2I6DHJOp5TykyZog==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.30.1.tgz", + "integrity": "sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ==", "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" @@ -4142,10 +4151,10 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "integrity": "sha512-AKcVpu/HltfHprv93Q3pWwyZTsfQjtJim+4y8n9mAdrkGDMuPhEQBqp7pmRn0YG/5FD+wRgwVbnwJ1o9VTAluw==", + "integrity": "sha512-rLxZKgL27MWBunz4x7z80cNkVzbxXzkkQHpowr05kojFOZCYYuAEOZr3U9hDchGV0RsV2NHuCEKpfVkUXGa1eg==", "dependencies": { "@certusone/wormhole-spydk": "^0.0.1", - "@coral-xyz/anchor": "^0.30.0", + "@coral-xyz/anchor": "^0.30.1", "@solana/spl-token": "^0.4.6", "@solana/spl-token-group": "^0.0.4", "@solana/spl-token-metadata": "^0.1.4", @@ -4154,6 +4163,7 @@ "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", "@wormhole-foundation/sdk-solana": "^0.7.0-beta.6", "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.6", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", diff --git a/solana/Anchor.toml b/solana/Anchor.toml index 668a8522..edf12bd9 100644 --- a/solana/Anchor.toml +++ b/solana/Anchor.toml @@ -1,5 +1,5 @@ [toolchain] -anchor_version = "0.30.0" # CLI +anchor_version = "0.30.1" # CLI solana_version = "1.18.15" [features] diff --git a/solana/Cargo.lock b/solana/Cargo.lock index 75124f5b..3eebbdd6 100644 --- a/solana/Cargo.lock +++ b/solana/Cargo.lock @@ -72,9 +72,9 @@ dependencies = [ [[package]] name = "anchor-attribute-access-control" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7368e171b3a317885dc08ec0f74eed9d0ad6c726cc819593aed81440dca926" +checksum = "47fe28365b33e8334dd70ae2f34a43892363012fe239cf37d2ee91693575b1f8" dependencies = [ "anchor-syn", "proc-macro2", @@ -84,9 +84,9 @@ dependencies = [ [[package]] name = "anchor-attribute-account" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f527df85a8cba3f2bea04e46ed71b66e525ea378c7fec538aa205f4520b73e31" +checksum = "3c288d496168268d198d9b53ee9f4f9d260a55ba4df9877ea1d4486ad6109e0f" dependencies = [ "anchor-syn", "bs58 0.5.1", @@ -97,9 +97,9 @@ dependencies = [ [[package]] name = "anchor-attribute-constant" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb1dc1845cf8636c2e046a274ca074dabd3884ac8ed11cc4ed64b7e8ef5a318" +checksum = "49b77b6948d0eeaaa129ce79eea5bbbb9937375a9241d909ca8fb9e006bb6e90" dependencies = [ "anchor-syn", "quote", @@ -108,9 +108,9 @@ dependencies = [ [[package]] name = "anchor-attribute-error" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f382e41514c59a77ffa7bb1a47df9a0359564a749b6934485c742c11962e540" +checksum = "4d20bb569c5a557c86101b944721d865e1fd0a4c67c381d31a44a84f07f84828" dependencies = [ "anchor-syn", "quote", @@ -119,9 +119,9 @@ dependencies = [ [[package]] name = "anchor-attribute-event" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "473a122aeed3f6b666438236338d2ef7833ee5fdc5688e1baa80185d61088a53" +checksum = "4cebd8d0671a3a9dc3160c48598d652c34c77de6be4d44345b8b514323284d57" dependencies = [ "anchor-syn", "proc-macro2", @@ -131,9 +131,9 @@ dependencies = [ [[package]] name = "anchor-attribute-program" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f88c7ffe2eb40aeac43ffd0d74a6671581158aedfaa0552330a2ef92fa5c889" +checksum = "efb2a5eb0860e661ab31aff7bb5e0288357b176380e985bade4ccb395981b42d" dependencies = [ "anchor-lang-idl", "anchor-syn", @@ -148,9 +148,9 @@ dependencies = [ [[package]] name = "anchor-derive-accounts" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9b97c99dcec135aae0ff908c14bcfcd3e78cfc16a0c6f245135038f0e6d390" +checksum = "04368b5abef4266250ca8d1d12f4dff860242681e4ec22b885dcfe354fd35aa1" dependencies = [ "anchor-syn", "quote", @@ -159,9 +159,9 @@ dependencies = [ [[package]] name = "anchor-derive-serde" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbece98f6ad9c37070edc0841326c9623a249346cd74f433e7cef69b14f7f31d" +checksum = "e0bb0e0911ad4a70cab880cdd6287fe1e880a1a9d8e4e6defa8e9044b9796a6c" dependencies = [ "anchor-syn", "borsh-derive-internal 0.10.3", @@ -172,9 +172,9 @@ dependencies = [ [[package]] name = "anchor-derive-space" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8badbe2648bc99a85ee05a7a5f9512e5e2af8ffac71476a69350cb278057ac53" +checksum = "5ef415ff156dc82e9ecb943189b0cb241b3a6bfc26a180234dc21bd3ef3ce0cb" dependencies = [ "proc-macro2", "quote", @@ -183,9 +183,9 @@ dependencies = [ [[package]] name = "anchor-lang" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e41feb9c1cd9f4b0fad1c004fc8f289183f3ce27e9db38fa6e434470c716fb1e" +checksum = "6620c9486d9d36a4389cab5e37dc34a42ed0bfaa62e6a75a2999ce98f8f2e373" dependencies = [ "anchor-attribute-access-control", "anchor-attribute-account", @@ -209,22 +209,34 @@ dependencies = [ [[package]] name = "anchor-lang-idl" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b29da81eae478b1bb846749b06b8a2cb9c6f9ed26ca793b0c916793fdf36adab" +checksum = "31cf97b4e6f7d6144a05e435660fcf757dbc3446d38d0e2b851d11ed13625bba" dependencies = [ - "anchor-syn", + "anchor-lang-idl-spec", "anyhow", + "heck", "regex", "serde", "serde_json", + "sha2 0.10.8", +] + +[[package]] +name = "anchor-lang-idl-spec" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838" +dependencies = [ + "anyhow", + "serde", ] [[package]] name = "anchor-spl" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dcee54a30b27ea8317ca647759b5d9701a8c7caaaa0c922c6d3c306a7278a7a" +checksum = "04bd077c34449319a1e4e0bc21cea572960c9ae0d0fefda0dd7c52fcc3c647a3" dependencies = [ "anchor-lang", "spl-associated-token-account", @@ -237,9 +249,9 @@ dependencies = [ [[package]] name = "anchor-syn" -version = "0.30.0" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac53f2378bc08e89e20c2b893c01986ffd34cfbc69a17e35bd6f754753e9fdad" +checksum = "f99daacb53b55cfd37ce14d6c9905929721137fd4c67bbab44a19802aecb622f" dependencies = [ "anyhow", "bs58 0.5.1", diff --git a/solana/Cargo.toml b/solana/Cargo.toml index 2013f782..566b5f38 100644 --- a/solana/Cargo.toml +++ b/solana/Cargo.toml @@ -28,8 +28,8 @@ features = ["no-entrypoint"] path = "../universal/rs/messages" [workspace.dependencies] -anchor-lang = "=0.30.0" -anchor-spl = "=0.30.0" +anchor-lang = "=0.30.1" +anchor-spl = "=0.30.1" solana-program = "=1.18.15" hex = "0.4.3" ruint = "1.9.0" diff --git a/solana/Makefile b/solana/Makefile index 0568baf3..83290195 100644 --- a/solana/Makefile +++ b/solana/Makefile @@ -31,12 +31,13 @@ fast-transfer-sync: .PHONY: clippy clippy: - cargo clippy --workspace --no-deps --all-targets --all-features -- -Dwarnings + cargo clippy --workspace --no-deps --all-targets --features $(NETWORK) -- -Dwarnings .PHONY: lint lint: fast-transfer-sync cargo fmt --check - $(MAKE) clippy + NETWORK=localnet $(MAKE) clippy + NETWORK=testnet $(MAKE) clippy .PHONY: cargo-test cargo-test: fast-transfer-sync From 825fadbc9a20600e70ba8c1160545fdf938e4a04 Mon Sep 17 00:00:00 2001 From: A5 Pickle Date: Mon, 19 Aug 2024 16:51:48 -0600 Subject: [PATCH 42/50] fix package-lock.json --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index dd8c7e23..a1e58f2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4139,7 +4139,7 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-evm": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", - "integrity": "sha512-191Y31N9+hxaqr4kH4/C6sQMNsZ2svCfm3grycSSM17MNRlmrsiRGDLESiU3xbOlUF2oIDkXxEmeUoo8JXQgpg==", + "integrity": "sha512-B6sAU/vRbxoayT3NIlwtaIOGMQN2ZyNcGvxiE7iK0saqZzv/6b7kcpA5S6OwF4PHykXlTt6RIAN08QZFJl4B6Q==", "dependencies": { "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", From 01e411dadbae346165c1ba9b0bcf87c9b54b2d07 Mon Sep 17 00:00:00 2001 From: A5 Pickle Date: Mon, 19 Aug 2024 16:55:19 -0600 Subject: [PATCH 43/50] solana: amount in != 0 --- solana/programs/swap-layer/src/error.rs | 1 + solana/programs/swap-layer/src/processor/stage_outbound.rs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs index 1e7644fc..7fffefc6 100644 --- a/solana/programs/swap-layer/src/error.rs +++ b/solana/programs/swap-layer/src/error.rs @@ -48,6 +48,7 @@ pub enum SwapLayerError { SenderTokenRequired = 0x242, SenderRequired = 0x244, RelayingFeeExceedsMinAmountOut = 0x260, + ZeroAmountIn = 0x261, ZeroMinAmountOut = 0x262, DelegatedAmountMismatch = 0x264, ExactInRequired = 0x266, diff --git a/solana/programs/swap-layer/src/processor/stage_outbound.rs b/solana/programs/swap-layer/src/processor/stage_outbound.rs index 5110f49b..361ae743 100644 --- a/solana/programs/swap-layer/src/processor/stage_outbound.rs +++ b/solana/programs/swap-layer/src/processor/stage_outbound.rs @@ -68,6 +68,9 @@ pub struct StageOutbound<'info> { payer = payer, space = StagedOutbound::try_compute_size(&args.redeem_option, &args.encoded_output_token)?, constraint = { + // Disallow amount in of zero. + require!(args.amount_in != 0, SwapLayerError::ZeroAmountIn); + // Cannot send to zero address. require!(args.recipient != [0; 32], SwapLayerError::InvalidRecipient); From 30f67d8be6d8acbc338c9d3c6b43f1ce581d9451 Mon Sep 17 00:00:00 2001 From: A5 Pickle Date: Mon, 19 Aug 2024 17:06:04 -0600 Subject: [PATCH 44/50] solana: add delegate check --- solana/programs/swap-layer/src/error.rs | 1 + solana/programs/swap-layer/src/processor/stage_outbound.rs | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/solana/programs/swap-layer/src/error.rs b/solana/programs/swap-layer/src/error.rs index 7fffefc6..1576bbfd 100644 --- a/solana/programs/swap-layer/src/error.rs +++ b/solana/programs/swap-layer/src/error.rs @@ -51,6 +51,7 @@ pub enum SwapLayerError { ZeroAmountIn = 0x261, ZeroMinAmountOut = 0x262, DelegatedAmountMismatch = 0x264, + NotProgramTransferAuthority = 0x265, ExactInRequired = 0x266, InsufficientAmountIn = 0x268, diff --git a/solana/programs/swap-layer/src/processor/stage_outbound.rs b/solana/programs/swap-layer/src/processor/stage_outbound.rs index 361ae743..d19a42a2 100644 --- a/solana/programs/swap-layer/src/processor/stage_outbound.rs +++ b/solana/programs/swap-layer/src/processor/stage_outbound.rs @@ -282,6 +282,13 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R SwapLayerError::DelegatedAmountMismatch, ); + // And make sure the delegated authority is the program transfer authority. + require!( + Option::::from(sender_token.delegate) + .is_some_and(|delegate| { delegate == program_transfer_authority.key() }), + SwapLayerError::NotProgramTransferAuthority, + ); + let (hashed_args, authority_bump) = last_transfer_authority_signer_seeds.unwrap(); token_interface::transfer_checked( From 1bc0f385318ca7925805636de5fb29b7b3ec30a5 Mon Sep 17 00:00:00 2001 From: A5 Pickle Date: Wed, 2 Oct 2024 12:14:58 -0500 Subject: [PATCH 45/50] evm: fix wormhole-solidity-sdk commit evm: fix imports --- evm/Makefile | 2 +- evm/foundry.toml | 1 + evm/src/assets/SwapLayerBase.sol | 2 +- evm/src/assets/SwapLayerInitiate.sol | 2 +- evm/test/SLTBase.sol | 5 ++--- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/evm/Makefile b/evm/Makefile index 7ab1d7f9..9df8e018 100644 --- a/evm/Makefile +++ b/evm/Makefile @@ -32,7 +32,7 @@ test: dependencies LIB_DEPS = foundry-rs/forge-std LIB_DEPS += openzeppelin/openzeppelin-contracts@dc44c9f #4.9.6 LIB_DEPS += Uniswap/permit2@cc56ad0 #latest commit as per 22/04/2024 -LIB_DEPS += wormhole-foundation/wormhole-solidity-sdk@b935ddc #post-merged branch +LIB_DEPS += wormhole-foundation/wormhole-solidity-sdk@60fb760 #post-merged branch LIB_DEPS += wormhole-foundation/example-liquidity-layer@f57444f #main branch # dynamically generate install rule for each lib dependency and add to depdenencies diff --git a/evm/foundry.toml b/evm/foundry.toml index 3dc3d920..d4852d16 100644 --- a/evm/foundry.toml +++ b/evm/foundry.toml @@ -13,6 +13,7 @@ remappings = [ "@openzeppelin/=lib/openzeppelin-contracts/contracts/", "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "forge-std/=lib/forge-std/src/", + "permit2/=lib/permit2/src/", "wormhole-sdk/=lib/wormhole-solidity-sdk/src/", "liquidity-layer/=lib/example-liquidity-layer/evm/src/", "local-modules/=lib/example-liquidity-layer/evm/forge/modules/", diff --git a/evm/src/assets/SwapLayerBase.sol b/evm/src/assets/SwapLayerBase.sol index 0bbf03c3..55b6e30a 100644 --- a/evm/src/assets/SwapLayerBase.sol +++ b/evm/src/assets/SwapLayerBase.sol @@ -6,7 +6,7 @@ import "@openzeppelin/token/ERC20/IERC20.sol"; import "@openzeppelin/token/ERC20/utils/SafeERC20.sol"; import "wormhole-sdk/interfaces/IWormhole.sol"; -import "wormhole-sdk/interfaces/token/IPermit2.sol"; +import "permit2/interfaces/IPermit2.sol"; import {IWETH} from "wormhole-sdk/interfaces/token/IWETH.sol"; import "wormhole-sdk/libraries/BytesParsing.sol"; diff --git a/evm/src/assets/SwapLayerInitiate.sol b/evm/src/assets/SwapLayerInitiate.sol index 3e7f8c2f..2f5dcde9 100644 --- a/evm/src/assets/SwapLayerInitiate.sol +++ b/evm/src/assets/SwapLayerInitiate.sol @@ -6,7 +6,7 @@ import "@openzeppelin/token/ERC20/IERC20.sol"; import "@openzeppelin/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/token/ERC20/extensions/IERC20Permit.sol"; -import "wormhole-sdk/interfaces/token/IPermit2.sol"; +import "permit2/interfaces/IPermit2.sol"; import { BytesParsing } from "wormhole-sdk/libraries/BytesParsing.sol"; import { checkAddr } from "./Params.sol"; diff --git a/evm/test/SLTBase.sol b/evm/test/SLTBase.sol index fdc05f23..bea45c34 100644 --- a/evm/test/SLTBase.sol +++ b/evm/test/SLTBase.sol @@ -8,10 +8,9 @@ import { ERC1967Proxy } from "@openzeppelin/proxy/ERC1967/ERC1967Proxy.sol"; import "@openzeppelin/token/ERC20/IERC20.sol"; import "wormhole-sdk/interfaces/IWormhole.sol"; -import "wormhole-sdk/interfaces/token/IWETH.sol"; -import "wormhole-sdk/interfaces/token/IUSDC.sol"; +import { IWETH } from "wormhole-sdk/interfaces/token/IWETH.sol"; import "wormhole-sdk/proxy/Proxy.sol"; -import "wormhole-sdk/testing/UsdcDealer.sol"; +import { IUSDC, UsdcDealer } from "wormhole-sdk/testing/UsdcDealer.sol"; import "wormhole-sdk/testing/WormholeCctpSimulator.sol"; import { ITokenRouter } from "liquidity-layer/interfaces/ITokenRouter.sol"; From 1c1749a136ed28d0e738996b86aaffd29fd55c07 Mon Sep 17 00:00:00 2001 From: A5 Pickle Date: Tue, 1 Oct 2024 16:51:27 -0500 Subject: [PATCH 46/50] solana: add replay protection with dust --- .../src/processor/initiate/swap/exact_in.rs | 19 +++++++++++++++++-- .../swap-layer/src/state/staged/outbound.rs | 4 ++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs index 19646c5c..6f8a58a8 100644 --- a/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs +++ b/solana/programs/swap-layer/src/processor/initiate/swap/exact_in.rs @@ -28,9 +28,21 @@ pub struct InitiateSwapExactIn<'info> { /// This account may be closed by the end of the instruction if there is no dust after the swap. #[account( mut, - constraint = staged_outbound.info.is_exact_in @ SwapLayerError::ExactInRequired, + constraint = { + require!(staged_outbound.info.is_exact_in, SwapLayerError::ExactInRequired); + + // Cannot send to zero address. + // + // NOTE: This zero address check happens at the stage outbound instruction. But this + // instruction sets the recipient to the zero address if there was any dust remaining + // after the swap. So by checking for the zero address here, we prevent a replay of the + // same outbound swap using dust remaining in the custody token account. + require!(staged_outbound.info.recipient != [0; 32], SwapLayerError::InvalidRecipient); + + true + } )] - staged_outbound: Account<'info, StagedOutbound>, + staged_outbound: Box>, /// This custody token account may be closed by the end of the instruction if there is no dust /// after the swap. @@ -337,6 +349,9 @@ where ctx.accounts .staged_outbound .close(prepared_by.to_account_info())?; + } else { + // Override the recipient to prevent replaying the same outbound swap. + ctx.accounts.staged_outbound.info.recipient = Default::default(); } // Done. diff --git a/solana/programs/swap-layer/src/state/staged/outbound.rs b/solana/programs/swap-layer/src/state/staged/outbound.rs index 2b8d2809..44fba950 100644 --- a/solana/programs/swap-layer/src/state/staged/outbound.rs +++ b/solana/programs/swap-layer/src/state/staged/outbound.rs @@ -43,6 +43,10 @@ pub struct StagedOutboundInfo { pub target_chain: u16, /// Intended recipient of the transfer. + /// + /// NOTE: This recipient will be set to the zero address after a swap is completed if there is + /// any dust remaining in the custody token account. Setting this to the zero address will + /// prevent replaying the same outbound swap. pub recipient: [u8; 32], /// This value is only checked for swaps. From 5f49c597e9e954a097fb3a7fcaa09b9ffb8693bb Mon Sep 17 00:00:00 2001 From: A5 Pickle Date: Tue, 1 Oct 2024 17:09:07 -0500 Subject: [PATCH 47/50] solana: remove unnecessary signer seeds --- .../swap-layer/src/processor/stage_outbound.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/solana/programs/swap-layer/src/processor/stage_outbound.rs b/solana/programs/swap-layer/src/processor/stage_outbound.rs index d19a42a2..64ab51c4 100644 --- a/solana/programs/swap-layer/src/processor/stage_outbound.rs +++ b/solana/programs/swap-layer/src/processor/stage_outbound.rs @@ -1,7 +1,7 @@ use crate::{ composite::*, error::SwapLayerError, - state::{Peer, RedeemOption, StagedOutbound, StagedOutboundInfo, StagedRedeem}, + state::{RedeemOption, StagedOutbound, StagedOutboundInfo, StagedRedeem}, utils, TRANSFER_AUTHORITY_SEED_PREFIX, }; use anchor_lang::{prelude::*, system_program}; @@ -327,17 +327,11 @@ pub fn stage_outbound(ctx: Context, args: StageOutboundArgs) -> R transfer_amount, )?; - let peer_seeds = &ctx.accounts.target_peer.seeds; - token_interface::sync_native(CpiContext::new_with_signer( + token_interface::sync_native(CpiContext::new( src_token_program.to_account_info(), token_interface::SyncNative { account: custody_token.to_account_info(), }, - &[&[ - Peer::SEED_PREFIX, - &peer_seeds.chain.to_be_bytes(), - &[peer_seeds.bump], - ]], ))?; sender.key() From 0b6ac7aadf96ecffd9003f63565f5f879b1767cc Mon Sep 17 00:00:00 2001 From: A5 Pickle Date: Tue, 1 Oct 2024 17:09:34 -0500 Subject: [PATCH 48/50] solana: remove redundant allocated space --- solana/programs/swap-layer/src/state/staged/outbound.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/solana/programs/swap-layer/src/state/staged/outbound.rs b/solana/programs/swap-layer/src/state/staged/outbound.rs index 44fba950..ba403eb4 100644 --- a/solana/programs/swap-layer/src/state/staged/outbound.rs +++ b/solana/programs/swap-layer/src/state/staged/outbound.rs @@ -71,7 +71,6 @@ impl StagedOutbound { const BASE_SIZE: usize = 8 // DISCRIMINATOR + StagedOutboundInfo::INIT_SPACE + 1 // StagedRedeem discrimant - + 1 // encoded_output_token === None ; pub fn try_compute_size( From 5daca98ea5f69173f0bfb19b69b6d69f718d7823 Mon Sep 17 00:00:00 2001 From: A5 Pickle Date: Tue, 1 Oct 2024 17:12:14 -0500 Subject: [PATCH 49/50] solana: pay prepared by --- solana/programs/swap-layer/src/processor/initiate/transfer.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/solana/programs/swap-layer/src/processor/initiate/transfer.rs b/solana/programs/swap-layer/src/processor/initiate/transfer.rs index c218e255..99ae051c 100644 --- a/solana/programs/swap-layer/src/processor/initiate/transfer.rs +++ b/solana/programs/swap-layer/src/processor/initiate/transfer.rs @@ -167,7 +167,7 @@ pub fn initiate_transfer(ctx: Context) -> Result<()> { ctx.accounts.token_program.to_account_info(), token::CloseAccount { account: custody_token.to_account_info(), - destination: ctx.accounts.payer.to_account_info(), + destination: ctx.accounts.prepared_by.to_account_info(), authority: ctx.accounts.custodian.to_account_info(), }, &[Custodian::SIGNER_SEEDS], From fbd9516de1d2c92896007d60066cb6916d57ee23 Mon Sep 17 00:00:00 2001 From: A5 Pickle <5342825+a5-pickle@users.noreply.github.com> Date: Thu, 24 Oct 2024 10:15:43 -0500 Subject: [PATCH 50/50] Update submodule (#91) * update submodule * fix Makefile e2e: update deps evm: update deps solana: update deps * e2e: return anchor test exit code * evm: fix clean * workflows: yolo * e2e: fix swap test * evm: fix Makefile * e2e: cp -r solana/target e2e * cmon man * workflow: make consistent --------- Co-authored-by: A5 Pickle --- .github/workflows/e2e.yml | 44 +- .github/workflows/solana.yml | 32 +- .gitmodules | 2 +- Makefile | 3 +- e2e/package.json | 9 +- e2e/sh/run_test.sh | 12 +- e2e/tests/02__swapLayer.ts | 40 +- e2e/tests/helpers/consts.ts | 4 +- evm/Makefile | 8 +- evm/test/script/start_anvil.sh | 12 +- .../config/localTestnet/chains.json | 2 +- evm/ts-scripts/config/localTestnet/temp.json | 4 +- evm/ts-scripts/config/testnet/temp.json | 4 +- evm/ts-sdk/package.json | 8 +- lib/example-liquidity-layer | 2 +- package-lock.json | 1274 +++++++++++++---- package.json | 10 +- solana/package.json | 14 +- solana/ts/scripts/getCctpAccounts.ts | 51 + solana/ts/src/swapLayer/index.ts | 17 +- solana/ts/tests/01__transfer.ts | 12 +- solana/ts/tests/10__swap.ts | 59 +- 22 files changed, 1192 insertions(+), 431 deletions(-) create mode 100644 solana/ts/scripts/getCctpAccounts.ts diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index 9687905c..af94c22e 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -6,13 +6,15 @@ on: pull_request: env: + ANCHOR_VERSION: 0.30.1 + NODE_VERSION: 20.11.0 RUSTC_VERSION: 1.75.0 + SOLANA_VERSION: 1.18.15 jobs: test: name: bash sh/run_test.sh - runs-on: ubuntu-latest - # Anchor Docker image: https://www.anchor-lang.com/docs/verifiable-builds#images - # container: backpackapp/build:v0.30.1 + runs-on: + labels: ubuntu-latest-l steps: - uses: actions/checkout@v4 with: @@ -21,18 +23,36 @@ jobs: uses: foundry-rs/foundry-toolchain@v1 with: version: nightly - - uses: metadaoproject/setup-anchor@v2 + - uses: actions/setup-node@v4 with: - node-version: "20.11.0" - solana-cli-version: "1.18.15" - anchor-version: "0.30.1" - - name: Set default Rust toolchain - run: rustup default stable + node-version: ${{ env.NODE_VERSION }} + - name: Install Solana CLI tools + run: sh -c "$(curl -sSfL https://release.anza.xyz/v${{ env.SOLANA_VERSION }}/install)" + shell: bash + - name: Update PATH + run: echo "/home/runner/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH + shell: bash + - name: Install Anchor + run: npm i -g @coral-xyz/anchor-cli@${{ env.ANCHOR_VERSION }} + shell: bash - name: make node_modules run: make node_modules - - name: make build + - name: cd evm && make build run: make build working-directory: ./evm - - name: bash sh/run_test.sh + - name: cd evm/ts-sdk && npm run build + run: npm run build + working-directory: ./evm/ts-sdk + - name: cd solana && make anchor-test-setup + run: make anchor-test-setup + working-directory: ./solana + - name: cd solana && anchor build -- --features integration-test + run: anchor build -- --features integration-test + working-directory: ./solana + - name: Install toolchain + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ env.RUSTC_VERSION }} + - name: cd e2e && bash sh/run_test.sh run: bash sh/run_test.sh - working-directory: ./e2e + working-directory: ./e2e \ No newline at end of file diff --git a/.github/workflows/solana.yml b/.github/workflows/solana.yml index 7dae5a63..edba04e7 100644 --- a/.github/workflows/solana.yml +++ b/.github/workflows/solana.yml @@ -6,7 +6,10 @@ on: pull_request: env: + ANCHOR_VERSION: 0.30.1 + NODE_VERSION: 20.11.0 RUSTC_VERSION: 1.75.0 + SOLANA_VERSION: 1.18.15 jobs: make-cargo-test-all: name: make cargo-test-all @@ -51,14 +54,22 @@ jobs: uses: foundry-rs/foundry-toolchain@v1 with: version: nightly - - uses: metadaoproject/setup-anchor@v2 + - uses: actions/setup-node@v4 with: - node-version: "20.11.0" - solana-cli-version: "1.18.15" - anchor-version: "0.30.1" - - name: Set default Rust toolchain - run: rustup default stable - working-directory: ./solana + node-version: ${{ env.NODE_VERSION }} + - name: Install Solana CLI tools + run: sh -c "$(curl -sSfL https://release.anza.xyz/v${{ env.SOLANA_VERSION }}/install)" + shell: bash + - name: Update PATH + run: echo "/home/runner/.local/share/solana/install/active_release/bin" >> $GITHUB_PATH + shell: bash + - name: Install Anchor + run: npm i -g @coral-xyz/anchor-cli@${{ env.ANCHOR_VERSION }} + shell: bash + - name: Install toolchain + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ env.RUSTC_VERSION }} - name: make anchor-test run: make anchor-test working-directory: ./solana @@ -79,9 +90,10 @@ jobs: node-version: "20.11.0" solana-cli-version: "1.18.15" anchor-version: "0.30.1" - - name: Set default Rust toolchain - run: rustup default stable - working-directory: ./solana + - name: Install toolchain + uses: dtolnay/rust-toolchain@master + with: + toolchain: ${{ env.RUSTC_VERSION }} - name: make check-build run: make check-build working-directory: ./solana diff --git a/.gitmodules b/.gitmodules index 75007f08..974255c7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "lib/example-liquidity-layer"] path = lib/example-liquidity-layer url = https://github.com/wormhole-foundation/example-liquidity-layer.git - rev = dcaf657f1efd2805a26efbe9710609d9480c5bd9 + branch = v0.3.2 diff --git a/Makefile b/Makefile index 9cd3fb1c..05cb06f9 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,9 @@ build: node_modules .PHONY: clean clean: fast-transfer-clean + rm -rf e2e/node_modules cd evm && $(MAKE) clean - cd solana && $(MAKE) clean + cd solana && $(MAKE) clean npm run clean rm -rf node_modules diff --git a/e2e/package.json b/e2e/package.json index 7870d2ce..eeaf9582 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -14,10 +14,10 @@ "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-evm": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-solana": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-base": "^0.10.9", + "@wormhole-foundation/sdk-definitions": "^0.10.9", + "@wormhole-foundation/sdk-evm": "^0.10.9", + "@wormhole-foundation/sdk-solana": "^0.10.9", "chai": "^4.3.4", "dotenv": "^16.4.5", "mocha": "^9.0.3", @@ -25,7 +25,6 @@ "ts-mocha": "^10.0.0" }, "devDependencies": { - "@typechain/ethers-v5": "^11.1.2", "envfile": "^7.1.0", "ethers": "^5.7.2", "typechain": "^8.3.2" diff --git a/e2e/sh/run_test.sh b/e2e/sh/run_test.sh index 85a4cbff..4c91d334 100644 --- a/e2e/sh/run_test.sh +++ b/e2e/sh/run_test.sh @@ -8,7 +8,8 @@ sed 's/\= "ts\//\= "..\/solana\/ts\//' $ROOT/solana/Anchor.toml > Anchor.toml sed -E -i 's/"programs\/swap-layer"/"..\/solana\/programs\/swap-layer"/' Anchor.toml sed -E -i 's/^test \= ".+"/test = "npx ts-mocha -p .\/tsconfig.anchor-test.json -t 1000000 --bail --exit tests\/[0-9]*.ts"/' Anchor.toml -mkdir -p target/deploy +rm -rf target +cp -r $ROOT/solana/target $ROOT/e2e # start anvil in the evm directory cd $ROOT/evm @@ -16,13 +17,12 @@ bash test/script/start_anvil.sh echo "Anvil instances started successfully." -cd $ROOT/solana -make anchor-test-setup -anchor build -- --features integration-test -cp target/deploy/swap_layer.so $ROOT/e2e/target/deploy - cd $ROOT/e2e anchor test --skip-build +EXIT_CODE=$? + pkill anvil + +exit $EXIT_CODE diff --git a/e2e/tests/02__swapLayer.ts b/e2e/tests/02__swapLayer.ts index 94a0beaa..237d2211 100644 --- a/e2e/tests/02__swapLayer.ts +++ b/e2e/tests/02__swapLayer.ts @@ -88,8 +88,8 @@ describe("Swap Layer", () => { const amountIn = 20_000_000_000; // 20k USDC const output: InitiateArgs = { - transferMode: { - mode: "LiquidityLayer", + fastTransferMode: { + mode: "Disabled", }, redeemMode: { mode: "Direct", @@ -171,8 +171,8 @@ describe("Swap Layer", () => { .then((encodedFee) => Number(encodedFee)); const output: InitiateArgs = { - transferMode: { - mode: "LiquidityLayer", + fastTransferMode: { + mode: "Disabled", }, redeemMode: { mode: "Relay", @@ -270,8 +270,8 @@ describe("Swap Layer", () => { .then((b) => b.timestamp); const output: InitiateArgs = { - transferMode: { - mode: "LiquidityLayer", + fastTransferMode: { + mode: "Disabled", }, redeemMode: { mode: "Direct", @@ -377,8 +377,8 @@ describe("Swap Layer", () => { .then((encodedFee) => BigInt(encodedFee)); const output: InitiateArgs = { - transferMode: { - mode: "LiquidityLayer", + fastTransferMode: { + mode: "Disabled", }, redeemMode: { mode: "Relay", @@ -1045,8 +1045,8 @@ describe("Swap Layer", () => { const amountIn = 20_000_000_000; // 20k USDC const output: InitiateArgs = { - transferMode: { - mode: "LiquidityLayer", + fastTransferMode: { + mode: "Disabled", }, redeemMode: { mode: "Direct", @@ -1152,8 +1152,8 @@ describe("Swap Layer", () => { .then((encodedFee) => Number(encodedFee)); const output: InitiateArgs = { - transferMode: { - mode: "LiquidityLayer", + fastTransferMode: { + mode: "Disabled", }, redeemMode: { mode: "Relay", @@ -1277,8 +1277,8 @@ describe("Swap Layer", () => { .then((b) => b.timestamp); const output: InitiateArgs = { - transferMode: { - mode: "LiquidityLayer", + fastTransferMode: { + mode: "Disabled", }, redeemMode: { mode: "Direct", @@ -1406,8 +1406,8 @@ describe("Swap Layer", () => { .then((encodedFee) => BigInt(encodedFee)); const output: InitiateArgs = { - transferMode: { - mode: "LiquidityLayer", + fastTransferMode: { + mode: "Disabled", }, redeemMode: { mode: "Relay", @@ -1542,8 +1542,8 @@ describe("Swap Layer", () => { .then((b) => b.timestamp); const output: InitiateArgs = { - transferMode: { - mode: "LiquidityLayer", + fastTransferMode: { + mode: "Disabled", }, redeemMode: { mode: "Direct", @@ -1682,8 +1682,8 @@ describe("Swap Layer", () => { const amountOut = amountIn - relayingFee - 500_000n; const output: InitiateArgs = { - transferMode: { - mode: "LiquidityLayer", + fastTransferMode: { + mode: "Disabled", }, redeemMode: { mode: "Relay", diff --git a/e2e/tests/helpers/consts.ts b/e2e/tests/helpers/consts.ts index 85d397a4..39c9721b 100644 --- a/e2e/tests/helpers/consts.ts +++ b/e2e/tests/helpers/consts.ts @@ -21,8 +21,8 @@ export const ONE_SOL = 1000000000; // Avalanche Mainnet Fork export const EVM_LOCALHOSTS = { - Ethereum: "http://127.0.0.1:8548", - Base: "http://127.0.0.1:8549", + Ethereum: "http://127.0.0.1:8545", + Base: "http://127.0.0.1:8546", }; // USDT tokens on Ethereum. diff --git a/evm/Makefile b/evm/Makefile index 9df8e018..658c8f73 100644 --- a/evm/Makefile +++ b/evm/Makefile @@ -23,7 +23,7 @@ endef .PHONY: build test clean dependencies build: dependencies - forge build + forge build --skip test test: dependencies forge test --fork-url $$TEST_RPC -vvv @@ -33,7 +33,7 @@ LIB_DEPS = foundry-rs/forge-std LIB_DEPS += openzeppelin/openzeppelin-contracts@dc44c9f #4.9.6 LIB_DEPS += Uniswap/permit2@cc56ad0 #latest commit as per 22/04/2024 LIB_DEPS += wormhole-foundation/wormhole-solidity-sdk@60fb760 #post-merged branch -LIB_DEPS += wormhole-foundation/example-liquidity-layer@f57444f #main branch +LIB_DEPS += wormhole-foundation/example-liquidity-layer@v0.3.2 #latest build tag # dynamically generate install rule for each lib dependency and add to depdenencies $(foreach dep,$(LIB_DEPS), $(eval $(call install_lib,$(dep)))) @@ -41,5 +41,5 @@ $(foreach dep,$(LIB_DEPS), $(eval $(call install_lib,$(dep)))) clean: forge clean rm -rf lib - rm -rf node_modules - @$(MAKE) -C env clean + cd ts-sdk && npm run clean + @$(MAKE) -C env clean \ No newline at end of file diff --git a/evm/test/script/start_anvil.sh b/evm/test/script/start_anvil.sh index 2e8a0f0a..2e16ce51 100644 --- a/evm/test/script/start_anvil.sh +++ b/evm/test/script/start_anvil.sh @@ -13,8 +13,10 @@ OWNER_PRIVATE_KEY=0x646f1ce2fdad0e6deeeb5c7e8e5543bdde65e86029e2fd9fc169899c440a . $ENV/Ethereum.env +echo $RELEASE_RPC + # Ethereum (CCTP). -anvil --port 8548 \ +anvil --port 8545 \ -m "myth like bonus scare over problem client lizard pioneer submit female collect" \ --fork-url $RELEASE_RPC \ --fork-block-number 20034932 \ @@ -23,14 +25,16 @@ anvil --port 8548 \ sleep 2 forge script $ROOT/DeploySwapLayerForTest.s.sol \ - --rpc-url http://localhost:8548 \ + --rpc-url http://localhost:8545 \ --broadcast \ --private-key $OWNER_PRIVATE_KEY . $ENV/Base.env +echo $RELEASE_RPC + # Base (CCTP). -anvil --port 8549 \ +anvil --port 8546 \ -m "myth like bonus scare over problem client lizard pioneer submit female collect" \ --fork-url $RELEASE_RPC \ --fork-block-number 15456753 \ @@ -39,7 +43,7 @@ anvil --port 8549 \ sleep 2 forge script $ROOT/DeploySwapLayerForTest.s.sol \ - --rpc-url http://localhost:8549 \ + --rpc-url http://localhost:8546 \ --broadcast \ --private-key $OWNER_PRIVATE_KEY diff --git a/evm/ts-scripts/config/localTestnet/chains.json b/evm/ts-scripts/config/localTestnet/chains.json index 16b6c1cf..e75f8789 100644 --- a/evm/ts-scripts/config/localTestnet/chains.json +++ b/evm/ts-scripts/config/localTestnet/chains.json @@ -7,7 +7,7 @@ "description": "Fuji", "evmNetworkId": 43113, "chainId": 6, - "rpc": "http://localhost:8548", + "rpc": "http://localhost:8545", "rpcWs": "wss://avalanche-fuji-c-chain.publicnode.com", "wormholeAddress": "0x7bbcE28e64B3F8b84d876Ab298393c38ad7aac4C", "liquidityLayerAddress": "0x7353B29FDc79435dcC7ECc9Ac9F9b61d83B4E0F4", diff --git a/evm/ts-scripts/config/localTestnet/temp.json b/evm/ts-scripts/config/localTestnet/temp.json index 2bd216df..45d008ac 100644 --- a/evm/ts-scripts/config/localTestnet/temp.json +++ b/evm/ts-scripts/config/localTestnet/temp.json @@ -3,7 +3,7 @@ "description": "Arbitrum goerli", "evmNetworkId": 421613, "chainId": 23, - "rpc": "http://127.0.0.1:8548", + "rpc": "http://127.0.0.1:8545", "rpcWs": "wss://arbitrum-goerli.publicnode.com", "wormholeAddress": "0xC7A204bDBFe983FCD8d8E61D02b475D4073fF97e", "liquidityLayerAddress": "0xe26BDB27d199DD757e28B4F2Ae032b62aF7687d2", @@ -31,7 +31,7 @@ "description": "Optimism goerli", "evmNetworkId": 420, "chainId": 24, - "rpc": "http://127.0.0.1:8549", + "rpc": "http://127.0.0.1:8546", "rpcWs": "wss://optimism-goerli.publicnode.com", "wormholeAddress": "0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35", "liquidityLayerAddress": "0xe26BDB27d199DD757e28B4F2Ae032b62aF7687d2", diff --git a/evm/ts-scripts/config/testnet/temp.json b/evm/ts-scripts/config/testnet/temp.json index 2bd216df..45d008ac 100644 --- a/evm/ts-scripts/config/testnet/temp.json +++ b/evm/ts-scripts/config/testnet/temp.json @@ -3,7 +3,7 @@ "description": "Arbitrum goerli", "evmNetworkId": 421613, "chainId": 23, - "rpc": "http://127.0.0.1:8548", + "rpc": "http://127.0.0.1:8545", "rpcWs": "wss://arbitrum-goerli.publicnode.com", "wormholeAddress": "0xC7A204bDBFe983FCD8d8E61D02b475D4073fF97e", "liquidityLayerAddress": "0xe26BDB27d199DD757e28B4F2Ae032b62aF7687d2", @@ -31,7 +31,7 @@ "description": "Optimism goerli", "evmNetworkId": 420, "chainId": 24, - "rpc": "http://127.0.0.1:8549", + "rpc": "http://127.0.0.1:8546", "rpcWs": "wss://optimism-goerli.publicnode.com", "wormholeAddress": "0x6b9C8671cdDC8dEab9c719bB87cBd3e782bA6a35", "liquidityLayerAddress": "0xe26BDB27d199DD757e28B4F2Ae032b62aF7687d2", diff --git a/evm/ts-sdk/package.json b/evm/ts-sdk/package.json index 3b4d0cb7..367abfa9 100644 --- a/evm/ts-sdk/package.json +++ b/evm/ts-sdk/package.json @@ -6,14 +6,14 @@ "module": "lib/esm/index.js", "scripts": { "build": "tsc -p tsconfig.json && tsc -p tsconfig-cjs.json", - "clean":"rm -rf dist" + "clean": "rm -rf dist lib node_modules" }, "author": "", "license": "ISC", "dependencies": { - "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-base": "^0.10.9", + "@wormhole-foundation/sdk-definitions": "^0.10.9", + "@wormhole-foundation/sdk-evm": "^0.10.9", "typescript": "^5.4.5" } } diff --git a/lib/example-liquidity-layer b/lib/example-liquidity-layer index dcaf657f..b505422d 160000 --- a/lib/example-liquidity-layer +++ b/lib/example-liquidity-layer @@ -1 +1 @@ -Subproject commit dcaf657f1efd2805a26efbe9710609d9480c5bd9 +Subproject commit b505422d4e92558cc2759f1373974d27b4ee43a7 diff --git a/package-lock.json b/package-lock.json index a1e58f2a..8dbf898a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,10 +36,10 @@ "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-evm": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-solana": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-base": "^0.10.9", + "@wormhole-foundation/sdk-definitions": "^0.10.9", + "@wormhole-foundation/sdk-evm": "^0.10.9", + "@wormhole-foundation/sdk-solana": "^0.10.9", "chai": "^4.3.4", "dotenv": "^16.4.5", "mocha": "^9.0.3", @@ -47,34 +47,11 @@ "ts-mocha": "^10.0.0" }, "devDependencies": { - "@typechain/ethers-v5": "^11.1.2", "envfile": "^7.1.0", "ethers": "^5.7.2", "typechain": "^8.3.2" } }, - "e2e/node_modules/@solana/web3.js": { - "version": "1.91.7", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", - "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", - "dependencies": { - "@babel/runtime": "^7.23.4", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.3", - "@solana/buffer-layout": "^4.0.1", - "agentkeepalive": "^4.5.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.7.0", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" - } - }, "e2e/node_modules/@types/mocha": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.6.tgz", @@ -182,6 +159,54 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "e2e/node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "dev": true, + "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" + } + }, "e2e/node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -326,11 +351,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "e2e/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" - }, "e2e/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -380,9 +400,9 @@ "version": "1.0.0", "license": "ISC", "dependencies": { - "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-base": "^0.10.9", + "@wormhole-foundation/sdk-definitions": "^0.10.9", + "@wormhole-foundation/sdk-evm": "^0.10.9", "typescript": "^5.4.5" } }, @@ -945,9 +965,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", - "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz", + "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -2799,6 +2819,54 @@ "form-data": "^4.0.0" } }, + "node_modules/@injectivelabs/sdk-ts/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" + } + ], + "optional": true, + "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/@injectivelabs/test-utils": { "version": "1.14.4", "resolved": "https://registry.npmjs.org/@injectivelabs/test-utils/-/test-utils-1.14.4.tgz", @@ -3581,67 +3649,83 @@ } }, "node_modules/@solana/codecs": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.2.tgz", - "integrity": "sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-rc.1.tgz", + "integrity": "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-data-structures": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/codecs-strings": "2.0.0-preview.2", - "@solana/options": "2.0.0-preview.2" + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-data-structures": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/codecs-strings": "2.0.0-rc.1", + "@solana/options": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/codecs-core": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz", - "integrity": "sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-rc.1.tgz", + "integrity": "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==", "dependencies": { - "@solana/errors": "2.0.0-preview.2" + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/codecs-data-structures": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz", - "integrity": "sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-rc.1.tgz", + "integrity": "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/codecs-numbers": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz", - "integrity": "sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-rc.1.tgz", + "integrity": "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/codecs-strings": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz", - "integrity": "sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-rc.1.tgz", + "integrity": "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2", - "@solana/errors": "2.0.0-preview.2" + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { - "fastestsmallesttextencoderdecoder": "^1.0.22" + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5" } }, "node_modules/@solana/errors": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.2.tgz", - "integrity": "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-rc.1.tgz", + "integrity": "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==", "dependencies": { "chalk": "^5.3.0", - "commander": "^12.0.0" + "commander": "^12.1.0" }, "bin": { - "errors": "bin/cli.js" + "errors": "bin/cli.mjs" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/errors/node_modules/chalk": { @@ -3656,60 +3740,187 @@ } }, "node_modules/@solana/options": { - "version": "2.0.0-preview.2", - "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz", - "integrity": "sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==", + "version": "2.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-rc.1.tgz", + "integrity": "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==", "dependencies": { - "@solana/codecs-core": "2.0.0-preview.2", - "@solana/codecs-numbers": "2.0.0-preview.2" + "@solana/codecs-core": "2.0.0-rc.1", + "@solana/codecs-data-structures": "2.0.0-rc.1", + "@solana/codecs-numbers": "2.0.0-rc.1", + "@solana/codecs-strings": "2.0.0-rc.1", + "@solana/errors": "2.0.0-rc.1" + }, + "peerDependencies": { + "typescript": ">=5" } }, "node_modules/@solana/spl-token": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.6.tgz", - "integrity": "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA==", + "version": "0.4.8", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.8.tgz", + "integrity": "sha512-RO0JD9vPRi4LsAbMUdNbDJ5/cv2z11MGhtAvFeRzT4+hAGE/FUzRi0tkkWtuCfSIU3twC6CtmAihRp/+XXjWsA==", "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", - "@solana/spl-token-group": "^0.0.4", - "@solana/spl-token-metadata": "^0.1.4", + "@solana/spl-token-group": "^0.0.5", + "@solana/spl-token-metadata": "^0.1.3", "buffer": "^6.0.3" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@solana/web3.js": "^1.91.6" + "@solana/web3.js": "^1.94.0" } }, "node_modules/@solana/spl-token-group": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.4.tgz", - "integrity": "sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw==", + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.6.tgz", + "integrity": "sha512-a9prKEvyUH4MLFTjY3ZdrLmhZYtADBPsiYJFsq3jBlaBIYwWUgVyXHG8fPsxTNwtVamVIzVKdrZY7ywivCwNwA==", "dependencies": { - "@solana/codecs": "2.0.0-preview.2", + "@solana/codecs": "2.0.0-rc.1", "@solana/spl-type-length-value": "0.1.0" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@solana/web3.js": "^1.91.6" + "@solana/web3.js": "^1.95.3" } }, "node_modules/@solana/spl-token-metadata": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.4.tgz", - "integrity": "sha512-N3gZ8DlW6NWDV28+vCCDJoTqaCZiF/jDUnk3o8GRkAFzHObiR60Bs1gXHBa8zCPdvOwiG6Z3dg5pg7+RW6XNsQ==", + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.5.tgz", + "integrity": "sha512-DSBlo7vjuLe/xvNn75OKKndDBkFxlqjLdWlq6rf40StnrhRn7TDntHGLZpry1cf3uzQFShqeLROGNPAJwvkPnA==", "dependencies": { - "@solana/codecs": "2.0.0-preview.2", + "@solana/codecs": "2.0.0-rc.1", "@solana/spl-type-length-value": "0.1.0" }, "engines": { "node": ">=16" }, "peerDependencies": { - "@solana/web3.js": "^1.91.6" + "@solana/web3.js": "^1.95.3" + } + }, + "node_modules/@solana/spl-token/node_modules/@solana/codecs": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.4.tgz", + "integrity": "sha512-gLMupqI4i+G4uPi2SGF/Tc1aXcviZF2ybC81x7Q/fARamNSgNOCUUoSCg9nWu1Gid6+UhA7LH80sWI8XjKaRog==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.4", + "@solana/codecs-data-structures": "2.0.0-preview.4", + "@solana/codecs-numbers": "2.0.0-preview.4", + "@solana/codecs-strings": "2.0.0-preview.4", + "@solana/options": "2.0.0-preview.4" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/spl-token/node_modules/@solana/codecs-core": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.4.tgz", + "integrity": "sha512-A0VVuDDA5kNKZUinOqHxJQK32aKTucaVbvn31YenGzHX1gPqq+SOnFwgaEY6pq4XEopSmaK16w938ZQS8IvCnw==", + "dependencies": { + "@solana/errors": "2.0.0-preview.4" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/spl-token/node_modules/@solana/codecs-data-structures": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.4.tgz", + "integrity": "sha512-nt2k2eTeyzlI/ccutPcG36M/J8NAYfxBPI9h/nQjgJ+M+IgOKi31JV8StDDlG/1XvY0zyqugV3I0r3KAbZRJpA==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.4", + "@solana/codecs-numbers": "2.0.0-preview.4", + "@solana/errors": "2.0.0-preview.4" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/spl-token/node_modules/@solana/codecs-numbers": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.4.tgz", + "integrity": "sha512-Q061rLtMadsO7uxpguT+Z7G4UHnjQ6moVIxAQxR58nLxDPCC7MB1Pk106/Z7NDhDLHTcd18uO6DZ7ajHZEn2XQ==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.4", + "@solana/errors": "2.0.0-preview.4" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/spl-token/node_modules/@solana/codecs-strings": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.4.tgz", + "integrity": "sha512-YDbsQePRWm+xnrfS64losSGRg8Wb76cjK1K6qfR8LPmdwIC3787x9uW5/E4icl/k+9nwgbIRXZ65lpF+ucZUnw==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.4", + "@solana/codecs-numbers": "2.0.0-preview.4", + "@solana/errors": "2.0.0-preview.4" + }, + "peerDependencies": { + "fastestsmallesttextencoderdecoder": "^1.0.22", + "typescript": ">=5" + } + }, + "node_modules/@solana/spl-token/node_modules/@solana/errors": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.4.tgz", + "integrity": "sha512-kadtlbRv2LCWr8A9V22On15Us7Nn8BvqNaOB4hXsTB3O0fU40D1ru2l+cReqLcRPij4znqlRzW9Xi0m6J5DIhA==", + "dependencies": { + "chalk": "^5.3.0", + "commander": "^12.1.0" + }, + "bin": { + "errors": "bin/cli.mjs" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/spl-token/node_modules/@solana/options": { + "version": "2.0.0-preview.4", + "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.4.tgz", + "integrity": "sha512-tv2O/Frxql/wSe3jbzi5nVicIWIus/BftH+5ZR+r9r3FO0/htEllZS5Q9XdbmSboHu+St87584JXeDx3xm4jaA==", + "dependencies": { + "@solana/codecs-core": "2.0.0-preview.4", + "@solana/codecs-data-structures": "2.0.0-preview.4", + "@solana/codecs-numbers": "2.0.0-preview.4", + "@solana/codecs-strings": "2.0.0-preview.4", + "@solana/errors": "2.0.0-preview.4" + }, + "peerDependencies": { + "typescript": ">=5" + } + }, + "node_modules/@solana/spl-token/node_modules/@solana/spl-token-group": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.5.tgz", + "integrity": "sha512-CLJnWEcdoUBpQJfx9WEbX3h6nTdNiUzswfFdkABUik7HVwSNA98u5AYvBVK2H93d9PGMOHAak2lHW9xr+zAJGQ==", + "dependencies": { + "@solana/codecs": "2.0.0-preview.4", + "@solana/spl-type-length-value": "0.1.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.94.0" + } + }, + "node_modules/@solana/spl-token/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/@solana/spl-type-length-value": { @@ -3724,12 +3935,12 @@ } }, "node_modules/@solana/web3.js": { - "version": "1.91.8", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.8.tgz", - "integrity": "sha512-USa6OS1jbh8zOapRJ/CBZImZ8Xb7AJjROZl5adql9TpOoBN9BUzyyouS5oPuZHft7S7eB8uJPuXWYjMi6BHgOw==", + "version": "1.95.3", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.95.3.tgz", + "integrity": "sha512-O6rPUN0w2fkNqx/Z3QJMB9L225Ex10PRDH8bTaIUPZXMPV0QP8ZpPvjQnXK+upUczlRgzHzd6SjKIha1p+I6og==", "dependencies": { - "@babel/runtime": "^7.24.5", - "@noble/curves": "^1.4.0", + "@babel/runtime": "^7.25.0", + "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "agentkeepalive": "^4.5.0", @@ -3739,22 +3950,113 @@ "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", + "jayson": "^4.1.1", "node-fetch": "^2.7.0", - "rpc-websockets": "^7.11.0", - "superstruct": "^0.14.2" + "rpc-websockets": "^9.0.2", + "superstruct": "^2.0.2" + } + }, + "node_modules/@solana/web3.js/node_modules/@noble/curves": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", + "dependencies": { + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@solana/web3.js/node_modules/@noble/hashes": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@solana/web3.js/node_modules/@types/ws": { + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@solana/web3.js/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/@solana/web3.js/node_modules/rpc-websockets": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-9.0.4.tgz", + "integrity": "sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==", + "dependencies": { + "@swc/helpers": "^0.5.11", + "@types/uuid": "^8.3.4", + "@types/ws": "^8.2.2", + "buffer": "^6.0.3", + "eventemitter3": "^5.0.1", + "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/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", + "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@solana/web3.js/node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } }, "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/@swc/helpers": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.13.tgz", + "integrity": "sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==", + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@terra-money/legacy.proto": { "name": "@terra-money/terra.proto", "version": "0.1.7", @@ -3895,23 +4197,6 @@ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, - "node_modules/@typechain/ethers-v5": { - "version": "11.1.2", - "resolved": "https://registry.npmjs.org/@typechain/ethers-v5/-/ethers-v5-11.1.2.tgz", - "integrity": "sha512-ID6pqWkao54EuUQa0P5RgjvfA3MYqxUQKpbGKERbsjBW5Ra7EIXvbMlPp2pcP5IAdUkyMCFYsP2SN5q7mPdLDQ==", - "dev": true, - "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.3.2", - "typescript": ">=4.3.0" - } - }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -4099,6 +4384,11 @@ "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==" }, + "node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, "node_modules/@types/ws": { "version": "7.4.7", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", @@ -4130,213 +4420,335 @@ "node_modules/@wormhole-foundation/example-liquidity-layer-definitions": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", - "integrity": "sha512-pIbKViWguC+Hnsf+I6ZdBVEVTt4naxCo2+P398Cb2IEMYi0w4ZfYhY49QLPuJnD1qywZW00Czr5o9ZoghZu1tA==", + "integrity": "sha512-hGwQm8a1YfbvcqJOubvzduzYfl59GkTkI9dKaeI0YdqPoExFHghSmzkghzJvwAhOyT0hjGa+37ayDRygXipoSA==", + "dependencies": { + "@wormhole-foundation/sdk-base": "^0.10.9", + "@wormhole-foundation/sdk-definitions": "^0.10.9" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-definitions/node_modules/@wormhole-foundation/sdk-base": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.10.11.tgz", + "integrity": "sha512-Km1OBJQiUZUrmiZAo42bkWe832WHFyvNdUPBEBOWXDKP5FCBF1CN8dN+ePZYz97qIc+rSM+WGLVFAbtzrvoxNw==", "dependencies": { - "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6" + "@scure/base": "^1.1.3" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-definitions/node_modules/@wormhole-foundation/sdk-definitions": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.10.11.tgz", + "integrity": "sha512-qrZacC4IyiX52K7yEqyJy3RBnuEEgPpV/4BiyBlfcC/VtsPerEmr2d/2U/uBuVF0DbtTwbQB7otkCemzuErcqQ==", + "dependencies": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.1", + "@wormhole-foundation/sdk-base": "0.10.11" } }, "node_modules/@wormhole-foundation/example-liquidity-layer-evm": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", - "integrity": "sha512-B6sAU/vRbxoayT3NIlwtaIOGMQN2ZyNcGvxiE7iK0saqZzv/6b7kcpA5S6OwF4PHykXlTt6RIAN08QZFJl4B6Q==", + "integrity": "sha512-fc6k10EFHZ1OQa5Qw3lkLZAuRXHqZeAy3s+xcJ2krJmLlXiqd7pAkkm9F0Io3E9i6mTxab+YehwdqUHZoSZ91A==", "dependencies": { "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", - "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", - "ethers": "^5.7.2" + "@wormhole-foundation/sdk-base": "^0.10.9", + "@wormhole-foundation/sdk-definitions": "^0.10.9", + "@wormhole-foundation/sdk-evm": "^0.10.9", + "ethers-v5": "npm:ethers@^5.7.2" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-evm/node_modules/@wormhole-foundation/sdk-base": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.10.11.tgz", + "integrity": "sha512-Km1OBJQiUZUrmiZAo42bkWe832WHFyvNdUPBEBOWXDKP5FCBF1CN8dN+ePZYz97qIc+rSM+WGLVFAbtzrvoxNw==", + "dependencies": { + "@scure/base": "^1.1.3" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-evm/node_modules/@wormhole-foundation/sdk-connect": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.10.11.tgz", + "integrity": "sha512-S+2jh32Nf/vDwfLTty2FdcdZr/fd9tdXq0TpOlE7LkvUp5LiWoktjPvicw8/Xndp1AZYbNMMg+PMHCMOhu1cFA==", + "dependencies": { + "@wormhole-foundation/sdk-base": "0.10.11", + "@wormhole-foundation/sdk-definitions": "0.10.11", + "axios": "^1.4.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-evm/node_modules/@wormhole-foundation/sdk-definitions": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.10.11.tgz", + "integrity": "sha512-qrZacC4IyiX52K7yEqyJy3RBnuEEgPpV/4BiyBlfcC/VtsPerEmr2d/2U/uBuVF0DbtTwbQB7otkCemzuErcqQ==", + "dependencies": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.1", + "@wormhole-foundation/sdk-base": "0.10.11" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-evm/node_modules/@wormhole-foundation/sdk-evm": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.10.11.tgz", + "integrity": "sha512-R9ETNK/vtBWTBrJo2pmxJ+XDgPhB8cH8WIM7m9vcsij8jlpPi/vmSBboytlsgdPtCqxV9iif6JW0+s14mUK8QA==", + "dependencies": { + "@wormhole-foundation/sdk-connect": "0.10.11", + "ethers": "^6.5.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-evm/node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, "node_modules/@wormhole-foundation/example-liquidity-layer-solana": { "version": "0.0.1", "resolved": "file:lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "integrity": "sha512-rLxZKgL27MWBunz4x7z80cNkVzbxXzkkQHpowr05kojFOZCYYuAEOZr3U9hDchGV0RsV2NHuCEKpfVkUXGa1eg==", + "integrity": "sha512-yAcH25KeBLqoKVUPoBqsi0MwbaCkXWnd4ONWHrnYZGe+8Hy/o/SAPrMwokRtot5GHsXtnHmKs8DhZ0+F0BAvYA==", "dependencies": { "@certusone/wormhole-spydk": "^0.0.1", "@coral-xyz/anchor": "^0.30.1", - "@solana/spl-token": "^0.4.6", - "@solana/spl-token-group": "^0.0.4", - "@solana/spl-token-metadata": "^0.1.4", - "@solana/web3.js": "^1.91.7", + "@solana/spl-token": "^0.4.8", + "@solana/spl-token-group": "^0.0.6", + "@solana/spl-token-metadata": "^0.1.5", + "@solana/web3.js": "^1.95.3", "@types/node-fetch": "^2.6.11", "@wormhole-foundation/example-liquidity-layer-definitions": "0.0.1", - "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-evm": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-solana": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-base": "^0.10.9", + "@wormhole-foundation/sdk-definitions": "^0.10.9", + "@wormhole-foundation/sdk-evm": "^0.10.9", + "@wormhole-foundation/sdk-solana": "^0.10.9", + "@wormhole-foundation/sdk-solana-core": "^0.10.9", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", "bn.js": "^5.2.1", "dotenv": "^16.4.1", - "ethers": "^5.7.2", "sha3": "^2.1.4", "winston": "^3.13.0", "yargs": "^17.7.2" } }, - "node_modules/@wormhole-foundation/sdk-base": { - "version": "0.7.0-beta.6", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.7.0-beta.6.tgz", - "integrity": "sha512-4kaGW9URQspd6uhMOYo18p8pmUD7cQglXcEFq9lhNlurRr/UV09SFVcH12+HXONRZFGxIt3TH73iEPnwKP0eBQ==", + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@coral-xyz/borsh": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", + "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@wormhole-foundation/sdk-base": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.10.11.tgz", + "integrity": "sha512-Km1OBJQiUZUrmiZAo42bkWe832WHFyvNdUPBEBOWXDKP5FCBF1CN8dN+ePZYz97qIc+rSM+WGLVFAbtzrvoxNw==", "dependencies": { "@scure/base": "^1.1.3" } }, - "node_modules/@wormhole-foundation/sdk-connect": { - "version": "0.7.0-beta.6", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.7.0-beta.6.tgz", - "integrity": "sha512-ydoUboOJn8F+PhCCC8ZPzlMolBthjwG6orsyvGzkOj+c4gxCXgh/7DghognUkMTjTIUBwkZLURibbgaCvYwFBg==", + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@wormhole-foundation/sdk-connect": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.10.11.tgz", + "integrity": "sha512-S+2jh32Nf/vDwfLTty2FdcdZr/fd9tdXq0TpOlE7LkvUp5LiWoktjPvicw8/Xndp1AZYbNMMg+PMHCMOhu1cFA==", "dependencies": { - "@wormhole-foundation/sdk-base": "0.7.0-beta.6", - "@wormhole-foundation/sdk-definitions": "0.7.0-beta.6", + "@wormhole-foundation/sdk-base": "0.10.11", + "@wormhole-foundation/sdk-definitions": "0.10.11", "axios": "^1.4.0" }, "engines": { "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-connect/node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/@wormhole-foundation/sdk-definitions": { - "version": "0.7.0-beta.6", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.7.0-beta.6.tgz", - "integrity": "sha512-Wpy3OHvuq5QMxP+vfcdWvIcVc7iXTnb1MS/RroCdYZ2XdikBp4Qv+iFk8AwO7wKdJiXeTWtW2etS9vcvaz9g6g==", + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@wormhole-foundation/sdk-definitions": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.10.11.tgz", + "integrity": "sha512-qrZacC4IyiX52K7yEqyJy3RBnuEEgPpV/4BiyBlfcC/VtsPerEmr2d/2U/uBuVF0DbtTwbQB7otkCemzuErcqQ==", "dependencies": { "@noble/curves": "^1.4.0", "@noble/hashes": "^1.3.1", - "@wormhole-foundation/sdk-base": "0.7.0-beta.6" + "@wormhole-foundation/sdk-base": "0.10.11" } }, - "node_modules/@wormhole-foundation/sdk-evm": { - "version": "0.7.0-beta.6", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.7.0-beta.6.tgz", - "integrity": "sha512-JXUvnWjngVtBCwFC41fTo4xO7vHb39KSsIUgE/UAcPFscoVv9DmktGR8jDm0jLXri4pUqaXLFEDO6K7AABjB6A==", + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@wormhole-foundation/sdk-evm": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.10.11.tgz", + "integrity": "sha512-R9ETNK/vtBWTBrJo2pmxJ+XDgPhB8cH8WIM7m9vcsij8jlpPi/vmSBboytlsgdPtCqxV9iif6JW0+s14mUK8QA==", "dependencies": { - "@wormhole-foundation/sdk-connect": "0.7.0-beta.6", + "@wormhole-foundation/sdk-connect": "0.10.11", "ethers": "^6.5.1" }, "engines": { "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/@noble/curves": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.2.0.tgz", - "integrity": "sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==", + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@wormhole-foundation/sdk-solana": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.10.11.tgz", + "integrity": "sha512-4GCgABnk/D0hw31AcrKSAX/w+wG38HEsTO7e00sPBgAEFoC/G8hayhKz544+B2TAi3fHcfVXa4QwvnDhWtbQdg==", "dependencies": { - "@noble/hashes": "1.3.2" + "@coral-xyz/anchor": "0.29.0", + "@coral-xyz/borsh": "0.29.0", + "@solana/spl-token": "0.3.9", + "@solana/web3.js": "^1.95.2", + "@wormhole-foundation/sdk-connect": "0.10.11", + "rpc-websockets": "^7.10.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-evm/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" + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@wormhole-foundation/sdk-solana/node_modules/@coral-xyz/anchor": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", + "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", + "dependencies": { + "@coral-xyz/borsh": "^0.29.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" }, - "funding": { - "url": "https://paulmillr.com/funding/" + "engines": { + "node": ">=11" } }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/@types/node": { - "version": "18.15.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.13.tgz", - "integrity": "sha512-N+0kuo9KgrUQ1Sn/ifDXsvg0TTleP7rIy4zOBGECxAljqvqfqpTfzx0Q1NUedOixRMBfe2Whhb056a42cWs26Q==" - }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/aes-js": { - "version": "4.0.0-beta.5", - "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", - "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" - }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/ethers": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.12.1.tgz", - "integrity": "sha512-j6wcVoZf06nqEcBbDWkKg8Fp895SS96dSnTCjiXT+8vt2o02raTn4Lo9ERUuIVU5bAjoPYeA+7ytQFexFmLuVw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/ethers-io/" - }, - { - "type": "individual", - "url": "https://www.buymeacoffee.com/ricmoo" - } - ], + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/@wormhole-foundation/sdk-solana/node_modules/@solana/spl-token": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", + "integrity": "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA==", "dependencies": { - "@adraffy/ens-normalize": "1.10.1", - "@noble/curves": "1.2.0", - "@noble/hashes": "1.3.2", - "@types/node": "18.15.13", - "aes-js": "4.0.0-beta.5", - "tslib": "2.4.0", - "ws": "8.5.0" + "@solana/buffer-layout": "^4.0.0", + "@solana/buffer-layout-utils": "^0.2.0", + "buffer": "^6.0.3" }, "engines": { - "node": ">=14.0.0" + "node": ">=16" + }, + "peerDependencies": { + "@solana/web3.js": "^1.47.4" } }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } }, - "node_modules/@wormhole-foundation/sdk-evm/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "node_modules/@wormhole-foundation/example-liquidity-layer-solana/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "engines": { - "node": ">=10.0.0" + "node": ">=10" }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wormhole-foundation/sdk-base": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.10.9.tgz", + "integrity": "sha512-E56Z7FK1swrHvBvDOgWZBLDcyijpGB27dw10ZAZgesHksTBCIS4ehJY9b2qulo19R3fxRW/reKYzAmjxkpI+sg==", + "dependencies": { + "@scure/base": "^1.1.3" + } + }, + "node_modules/@wormhole-foundation/sdk-connect": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.10.9.tgz", + "integrity": "sha512-UCneSFMDho3p3rUFoxpDV+9zutJWcQJJ78RLLpjya0EivNy2AMTFWbP0sQdx+3kHw0MIJM/JtsUoUhPZZKeD/w==", + "dependencies": { + "@wormhole-foundation/sdk-base": "0.10.9", + "@wormhole-foundation/sdk-definitions": "0.10.9", + "axios": "^1.4.0" }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-connect/node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/@wormhole-foundation/sdk-definitions": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.10.9.tgz", + "integrity": "sha512-9lbMpvcaBL9a2eoyfJ5gauFREO0hqYw+Nplc3L6qzckB/2Sc0nE0vYDRyL+OwaRT4BUffmWOaUukBEDqbc1sGQ==", + "dependencies": { + "@noble/curves": "^1.4.0", + "@noble/hashes": "^1.3.1", + "@wormhole-foundation/sdk-base": "0.10.9" + } + }, + "node_modules/@wormhole-foundation/sdk-evm": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-evm/-/sdk-evm-0.10.9.tgz", + "integrity": "sha512-AM66hZHMAvggv9GwOdyep5AOT0M6JTJ415c+ksmdSw7egyVGwAXWl0khfJE1BHQDDAIsmJaTtPINQwdaki+4Yw==", + "dependencies": { + "@wormhole-foundation/sdk-connect": "0.10.9", + "ethers": "^6.5.1" + }, + "engines": { + "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-solana": { - "version": "0.7.0-beta.6", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.7.0-beta.6.tgz", - "integrity": "sha512-4+jpskWL6NLQ2d/qwD6k5BFi2dDrLM4V+GJD5/ZYUL4OZDubxS3jImIjfXK/Y/26OquytPpl/cfpahxNdo8pOg==", + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.10.9.tgz", + "integrity": "sha512-+dW7jBhTb8sgEcJF7Y2BkfM2QR7OaiL/6m25ungkDt7wFuPIIVGi4NM0Szngg+YyMs910PYdR1lcXd3Ijl/Nrw==", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@coral-xyz/borsh": "0.29.0", "@solana/spl-token": "0.3.9", - "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.6" + "@solana/web3.js": "^1.95.2", + "@wormhole-foundation/sdk-connect": "0.10.9", + "rpc-websockets": "^7.10.0" }, "engines": { "node": ">=16" } }, "node_modules/@wormhole-foundation/sdk-solana-core": { - "version": "0.7.0-beta.6", - "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.7.0-beta.6.tgz", - "integrity": "sha512-XtMWuuZXMDZdBKar352bB7C6j6Ua6Ltr5TDEUDElHlK37D+oD4Ss8Z2GXvVOLg4BbC9NWlYWCKrVQVbeQ3SeJw==", + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.10.11.tgz", + "integrity": "sha512-Aw6ARqchUwLtwxmcPzH4xkH6MZm9FwcKSraVPfyvVrHMevducj8b4bH17zvpy5BN36qHPfLlqbSKJrQpkHd9GQ==", "dependencies": { "@coral-xyz/anchor": "0.29.0", "@coral-xyz/borsh": "0.29.0", - "@solana/web3.js": "1.91.7", - "@wormhole-foundation/sdk-connect": "0.7.0-beta.6", - "@wormhole-foundation/sdk-solana": "0.7.0-beta.6" + "@solana/web3.js": "^1.95.2", + "@wormhole-foundation/sdk-connect": "0.10.11", + "@wormhole-foundation/sdk-solana": "0.10.11" }, "engines": { "node": ">=16" @@ -4381,32 +4793,78 @@ "@solana/web3.js": "^1.68.0" } }, - "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@solana/web3.js": { - "version": "1.91.7", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", - "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@solana/spl-token": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.9.tgz", + "integrity": "sha512-1EXHxKICMnab35MvvY/5DBc/K/uQAOJCYnDZXw83McCAYUAfi+rwq6qfd6MmITmSTEhcfBcl/zYxmW/OSN0RmA==", + "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/@wormhole-foundation/sdk-solana-core/node_modules/@wormhole-foundation/sdk-base": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-base/-/sdk-base-0.10.11.tgz", + "integrity": "sha512-Km1OBJQiUZUrmiZAo42bkWe832WHFyvNdUPBEBOWXDKP5FCBF1CN8dN+ePZYz97qIc+rSM+WGLVFAbtzrvoxNw==", + "dependencies": { + "@scure/base": "^1.1.3" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@wormhole-foundation/sdk-connect": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-connect/-/sdk-connect-0.10.11.tgz", + "integrity": "sha512-S+2jh32Nf/vDwfLTty2FdcdZr/fd9tdXq0TpOlE7LkvUp5LiWoktjPvicw8/Xndp1AZYbNMMg+PMHCMOhu1cFA==", + "dependencies": { + "@wormhole-foundation/sdk-base": "0.10.11", + "@wormhole-foundation/sdk-definitions": "0.10.11", + "axios": "^1.4.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@wormhole-foundation/sdk-definitions": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-definitions/-/sdk-definitions-0.10.11.tgz", + "integrity": "sha512-qrZacC4IyiX52K7yEqyJy3RBnuEEgPpV/4BiyBlfcC/VtsPerEmr2d/2U/uBuVF0DbtTwbQB7otkCemzuErcqQ==", "dependencies": { - "@babel/runtime": "^7.23.4", "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.3", - "@solana/buffer-layout": "^4.0.1", - "agentkeepalive": "^4.5.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.7.0", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" + "@noble/hashes": "^1.3.1", + "@wormhole-foundation/sdk-base": "0.10.11" + } + }, + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@wormhole-foundation/sdk-solana": { + "version": "0.10.11", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana/-/sdk-solana-0.10.11.tgz", + "integrity": "sha512-4GCgABnk/D0hw31AcrKSAX/w+wG38HEsTO7e00sPBgAEFoC/G8hayhKz544+B2TAi3fHcfVXa4QwvnDhWtbQdg==", + "dependencies": { + "@coral-xyz/anchor": "0.29.0", + "@coral-xyz/borsh": "0.29.0", + "@solana/spl-token": "0.3.9", + "@solana/web3.js": "^1.95.2", + "@wormhole-foundation/sdk-connect": "0.10.11", + "rpc-websockets": "^7.10.0" + }, + "engines": { + "node": ">=16" } }, - "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" + "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/axios": { + "version": "1.7.7", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz", + "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } }, "node_modules/@wormhole-foundation/sdk-solana-core/node_modules/camelcase": { "version": "6.3.0", @@ -4474,33 +4932,6 @@ "@solana/web3.js": "^1.47.4" } }, - "node_modules/@wormhole-foundation/sdk-solana/node_modules/@solana/web3.js": { - "version": "1.91.7", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.7.tgz", - "integrity": "sha512-HqljZKDwk6Z4TajKRGhGLlRsbGK4S8EY27DA7v1z6yakewiUY3J7ZKDZRxcqz2MYV/ZXRrJ6wnnpiHFkPdv0WA==", - "dependencies": { - "@babel/runtime": "^7.23.4", - "@noble/curves": "^1.4.0", - "@noble/hashes": "^1.3.3", - "@solana/buffer-layout": "^4.0.1", - "agentkeepalive": "^4.5.0", - "bigint-buffer": "^1.1.5", - "bn.js": "^5.2.1", - "borsh": "^0.7.0", - "bs58": "^4.0.1", - "buffer": "6.0.3", - "fast-stable-stringify": "^1.0.0", - "jayson": "^4.1.0", - "node-fetch": "^2.7.0", - "rpc-websockets": "^7.5.1", - "superstruct": "^0.14.2" - } - }, - "node_modules/@wormhole-foundation/sdk-solana/node_modules/@solana/web3.js/node_modules/superstruct": { - "version": "0.14.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", - "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" - }, "node_modules/@wormhole-foundation/sdk-solana/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", @@ -6410,6 +6841,54 @@ "@types/node": "*" } }, + "node_modules/eth-crypto/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" + } + ], + "optional": true, + "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/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", @@ -6515,6 +6994,34 @@ } }, "node_modules/ethers": { + "version": "6.13.4", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-6.13.4.tgz", + "integrity": "sha512-21YtnZVg4/zKkCQPjrDj38B1r4nQvTZLopUGMLQ1ePU2zV/joCfDC3t3iKQjWRzjjjbzR+mdAIoikeBRNkdllA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/ethers-io/" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@adraffy/ens-normalize": "1.10.1", + "@noble/curves": "1.2.0", + "@noble/hashes": "1.3.2", + "@types/node": "22.7.5", + "aes-js": "4.0.0-beta.5", + "tslib": "2.7.0", + "ws": "8.17.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ethers-v5": { + "name": "ethers", "version": "5.7.2", "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", @@ -6561,6 +7068,66 @@ "@ethersproject/wordlists": "5.7.0" } }, + "node_modules/ethers/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/ethers/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/ethers/node_modules/@types/node": { + "version": "22.7.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/ethers/node_modules/aes-js": { + "version": "4.0.0-beta.5", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-4.0.0-beta.5.tgz", + "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==" + }, + "node_modules/ethers/node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" + }, + "node_modules/ethers/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "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/ethjs-util": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz", @@ -7440,9 +8007,9 @@ } }, "node_modules/jayson": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.0.tgz", - "integrity": "sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.2.tgz", + "integrity": "sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==", "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", @@ -7455,7 +8022,7 @@ "json-stringify-safe": "^5.0.1", "JSONStream": "^1.3.5", "uuid": "^8.3.2", - "ws": "^7.4.5" + "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" @@ -7474,6 +8041,26 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, + "node_modules/jayson/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", @@ -10439,9 +11026,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", + "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" }, "node_modules/tsx": { "version": "4.10.5", @@ -11028,17 +11615,17 @@ "@certusone/wormhole-sdk": "^0.10.10", "@coral-xyz/anchor": "^0.30.0", "@jup-ag/api": "^6.0.20-test", - "@solana/spl-token": "^0.4.3", - "@solana/web3.js": "^1.91.6", + "@solana/spl-token": "^0.4.8", + "@solana/web3.js": "^1.95.3", "@types/node-fetch": "^2.6.11", "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-evm": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-evm": "0.7.0-beta.6", - "@wormhole-foundation/sdk-solana": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-base": "^0.10.9", + "@wormhole-foundation/sdk-definitions": "^0.10.9", + "@wormhole-foundation/sdk-evm": "^0.10.9", + "@wormhole-foundation/sdk-solana": "^0.10.9", + "@wormhole-foundation/sdk-solana-core": "^0.10.9", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", "chai-as-promised": "^7.1.1", "ts-results": "^3.3.0", @@ -11058,6 +11645,71 @@ "tsx": "^4.7.2" } }, + "solana/node_modules/@coral-xyz/borsh": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/borsh/-/borsh-0.29.0.tgz", + "integrity": "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ==", + "dependencies": { + "bn.js": "^5.1.2", + "buffer-layout": "^1.2.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@solana/web3.js": "^1.68.0" + } + }, + "solana/node_modules/@wormhole-foundation/sdk-solana-core": { + "version": "0.10.9", + "resolved": "https://registry.npmjs.org/@wormhole-foundation/sdk-solana-core/-/sdk-solana-core-0.10.9.tgz", + "integrity": "sha512-M+ZZpiZRwTTlm+bn1ZPYecUlcDI+OUwgX8bgwmgcQSADxXJkYtOFPsAB2R8eOcAmQirhkMK4Mjv//+IHrfaTBw==", + "dependencies": { + "@coral-xyz/anchor": "0.29.0", + "@coral-xyz/borsh": "0.29.0", + "@solana/web3.js": "^1.95.2", + "@wormhole-foundation/sdk-connect": "0.10.9", + "@wormhole-foundation/sdk-solana": "0.10.9" + }, + "engines": { + "node": ">=16" + } + }, + "solana/node_modules/@wormhole-foundation/sdk-solana-core/node_modules/@coral-xyz/anchor": { + "version": "0.29.0", + "resolved": "https://registry.npmjs.org/@coral-xyz/anchor/-/anchor-0.29.0.tgz", + "integrity": "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA==", + "dependencies": { + "@coral-xyz/borsh": "^0.29.0", + "@noble/hashes": "^1.3.1", + "@solana/web3.js": "^1.68.0", + "bn.js": "^5.1.2", + "bs58": "^4.0.1", + "buffer-layout": "^1.2.2", + "camelcase": "^6.3.0", + "cross-fetch": "^3.1.5", + "crypto-hash": "^1.3.0", + "eventemitter3": "^4.0.7", + "pako": "^2.0.3", + "snake-case": "^3.0.4", + "superstruct": "^0.15.4", + "toml": "^3.0.0" + }, + "engines": { + "node": ">=11" + } + }, + "solana/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "solana/node_modules/prettier": { "version": "2.8.8", "dev": true, diff --git a/package.json b/package.json index caaf99b4..30828197 100644 --- a/package.json +++ b/package.json @@ -11,16 +11,16 @@ "test": "npm run test --workspaces --if-present" }, "devDependencies": { - "typescript": "5.4.5", "@types/chai": "^4.3.5", "@types/jest": "^29.5.12", "@types/node": "^20.4.1", - "prettier": "^3.0.3", + "chai": "^4.3.7", + "chai-as-promised": "^7.1.1", "jest": "^29.7.0", + "prettier": "^3.0.3", "ts-jest": "^29.1.2", "ts-node": "^10.9.1", - "chai": "^4.3.7", - "chai-as-promised": "^7.1.1" + "typescript": "5.4.5" }, "keywords": [ "wormhole" @@ -30,4 +30,4 @@ "evm/ts-sdk", "solana" ] -} \ No newline at end of file +} diff --git a/solana/package.json b/solana/package.json index 580e0ac7..fc5e0605 100644 --- a/solana/package.json +++ b/solana/package.json @@ -21,17 +21,17 @@ "@certusone/wormhole-sdk": "^0.10.10", "@coral-xyz/anchor": "^0.30.0", "@jup-ag/api": "^6.0.20-test", - "@solana/spl-token": "^0.4.3", - "@solana/web3.js": "^1.91.6", + "@solana/spl-token": "^0.4.8", + "@solana/web3.js": "^1.95.3", "@types/node-fetch": "^2.6.11", "@wormhole-foundation/example-liquidity-layer-definitions": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-definitions-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-evm": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-evm-0.0.1.tgz", "@wormhole-foundation/example-liquidity-layer-solana": "file:../lib/example-liquidity-layer/wormhole-foundation-example-liquidity-layer-solana-0.0.1.tgz", - "@wormhole-foundation/sdk-base": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-definitions": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-evm": "0.7.0-beta.6", - "@wormhole-foundation/sdk-solana": "^0.7.0-beta.6", - "@wormhole-foundation/sdk-solana-core": "^0.7.0-beta.6", + "@wormhole-foundation/sdk-base": "^0.10.9", + "@wormhole-foundation/sdk-definitions": "^0.10.9", + "@wormhole-foundation/sdk-evm": "^0.10.9", + "@wormhole-foundation/sdk-solana": "^0.10.9", + "@wormhole-foundation/sdk-solana-core": "^0.10.9", "anchor-0.29.0": "npm:@coral-xyz/anchor@^0.29.0", "chai-as-promised": "^7.1.1", "ts-results": "^3.3.0", diff --git a/solana/ts/scripts/getCctpAccounts.ts b/solana/ts/scripts/getCctpAccounts.ts new file mode 100644 index 00000000..20e30db4 --- /dev/null +++ b/solana/ts/scripts/getCctpAccounts.ts @@ -0,0 +1,51 @@ +import { Connection } from "@solana/web3.js"; +import { USDC_MINT_ADDRESS } from "@wormhole-foundation/example-liquidity-layer-solana/testing"; +import { TokenRouterProgram } from "@wormhole-foundation/example-liquidity-layer-solana/tokenRouter"; +import { toUniversal } from "@wormhole-foundation/sdk-definitions"; + +const domainToChain = { + 0: { chain: "Ethereum", usdc: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48" }, + 1: { chain: "Avalanche", usdc: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E" }, + 2: { chain: "Optimism", usdc: "0x0b2c639c533813f4aa9d7837caf62653d097ff85" }, + 3: { chain: "Arbitrum", usdc: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831" }, + 6: { chain: "Base", usdc: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913" }, + 7: { chain: "Polygon", usdc: "0x3c499c542cef5e3811e1192ce70d8cc03d5c3359" }, +} as const; + +main(); + +async function main() { + const connection = new Connection("https://api.mainnet-beta.solana.com", "confirmed"); + + const tokenMessenger = new TokenRouterProgram( + connection, + "tD8RmtdcV7bzBeuFgyrFc8wvayj988ChccEzRQzo6md", + USDC_MINT_ADDRESS, + ).tokenMessengerMinterProgram(); + + for (const [domain, cfg] of Object.entries(domainToChain)) { + const usdcAddress = Array.from(toUniversal(cfg.chain, cfg.usdc).toUint8Array()); + + const remoteTokenMessenger = tokenMessenger.remoteTokenMessengerAddress(Number(domain)); + { + const accInfo = await connection.getAccountInfo(remoteTokenMessenger); + if (accInfo === null) { + continue; + } + } + + const tokenPair = tokenMessenger.tokenPairAddress(Number(domain), usdcAddress); + { + const accInfo = await connection.getAccountInfo(tokenPair); + if (accInfo === null) { + continue; + } + } + + console.log({ + domain, + remoteTokenMessenger: remoteTokenMessenger.toString(), + tokenPair: tokenPair.toString(), + }); + } +} diff --git a/solana/ts/src/swapLayer/index.ts b/solana/ts/src/swapLayer/index.ts index 6711897c..008cc30b 100644 --- a/solana/ts/src/swapLayer/index.ts +++ b/solana/ts/src/swapLayer/index.ts @@ -3,7 +3,6 @@ export * from "./messages"; export * from "./relayerFees"; export * from "./state"; -import * as wormholeSdk from "@certusone/wormhole-sdk"; import { BN, Program } from "@coral-xyz/anchor"; import * as splToken from "@solana/spl-token"; import { Connection, PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; @@ -26,7 +25,7 @@ export const PROGRAM_IDS = ["SwapLayer1111111111111111111111111111111111"] as co export type ProgramId = (typeof PROGRAM_IDS)[number]; export type AddPeerArgs = { - chain: wormholeSdk.ChainId; + chain: ChainId; address: Array; relayParams: RelayParams; }; @@ -46,7 +45,7 @@ export type InitiateTransferArgs = { }; export type UpdateRelayParametersArgs = { - chain: wormholeSdk.ChainId; + chain: ChainId; relayParams: RelayParams; }; @@ -89,7 +88,7 @@ export class SwapLayerProgram { return PublicKey.findProgramAddressSync([Buffer.from("custodian")], this.ID)[0]; } - peerAddress(chain: wormholeSdk.ChainId): PublicKey { + peerAddress(chain: ChainId): PublicKey { return Peer.address(this.ID, chain); } @@ -159,7 +158,7 @@ export class SwapLayerProgram { beneficiary: PublicKey; sourcePeer?: PublicKey; }, - opts: { sourceChain?: wormholeSdk.ChainId } = {}, + opts: { sourceChain?: ChainId } = {}, ): Promise<{ custodian: CheckedCustodianComposite; fill: PublicKey; @@ -271,7 +270,7 @@ export class SwapLayerProgram { return this.program.account.custodian.fetch(addr); } - async fetchPeer(input: wormholeSdk.ChainId | { address: PublicKey }): Promise { + async fetchPeer(input: ChainId | { address: PublicKey }): Promise { const addr = typeof input == "object" && "address" in input ? input.address @@ -819,7 +818,7 @@ export class SwapLayerProgram { recipientTokenAccount?: PublicKey; feeRecipientToken?: PublicKey; }, - sourceChain?: wormholeSdk.ChainId, + sourceChain?: ChainId, ) { const { payer, preparedFill, recipient } = accounts; @@ -869,7 +868,7 @@ export class SwapLayerProgram { beneficiary?: PublicKey; recipientTokenAccount?: PublicKey; }, - sourceChain?: wormholeSdk.ChainId, + sourceChain?: ChainId, ) { const { payer, preparedFill, recipient } = accounts; @@ -906,7 +905,7 @@ export class SwapLayerProgram { peer?: PublicKey; beneficiary?: PublicKey; }, - sourceChain?: wormholeSdk.ChainId, + sourceChain?: ChainId, ) { const { payer, preparedFill } = accounts; let { redeemer, peer, beneficiary } = accounts; diff --git a/solana/ts/tests/01__transfer.ts b/solana/ts/tests/01__transfer.ts index ee0c1a16..3a40df27 100644 --- a/solana/ts/tests/01__transfer.ts +++ b/solana/ts/tests/01__transfer.ts @@ -230,6 +230,8 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { [ await createAddPeerIx({ args: { + // @ts-ignore: Override with zero even though this is not a + // valid type. chain: 0, address: foreignSwapLayerAddress, relayParams: startParams, @@ -3518,7 +3520,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { redeemMode: { mode: "Payload", sender: toUniversal("Solana", payer.publicKey.toBytes()), - buf: payload, + buf: Uint8Array.from(payload), }, outputToken, }), @@ -3545,7 +3547,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { "Ethereum", "0x000000000000000000000000000000000000d00d", ), - buf: payload, + buf: Uint8Array.from(payload), }, outputToken: { type: "Usdc" }, }); @@ -3571,7 +3573,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { "Ethereum", "0x000000000000000000000000000000000000d00d", ), - buf: Buffer.from("Insert payload here"), + buf: Uint8Array.from(Buffer.from("Insert payload here")), }, outputToken: { type: "Gas", @@ -3628,7 +3630,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { "Ethereum", "0x000000000000000000000000000000000000d00d", ), - buf: Buffer.from("Insert payload here"), + buf: Uint8Array.from(Buffer.from("Insert payload here")), }, outputToken: { type: "Gas", @@ -3992,7 +3994,7 @@ describe("Swap Layer -- Admin and USDC Transfer", () => { sourceChain: toChain(foreignChain), orderSender: toUniversalAddress(orderSender), redeemer: toUniversalAddress(redeemer.toBuffer()), - redeemerMessage: Buffer.from(redeemerMessage), + redeemerMessage: Uint8Array.from(redeemerMessage), }, }), }); diff --git a/solana/ts/tests/10__swap.ts b/solana/ts/tests/10__swap.ts index a05979e8..d860fe6f 100644 --- a/solana/ts/tests/10__swap.ts +++ b/solana/ts/tests/10__swap.ts @@ -850,8 +850,15 @@ describe("Swap Layer -- Jupiter V6", () => { let listenerId: number | null; before("Start Event Listener", async function () { - listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { - emittedEvents.push({ event, slot, signature }); + listenerId = matchingEngine.onEventCpi((event, slot, signature) => { + const { localFastOrderFilled } = event; + if (localFastOrderFilled !== undefined) { + emittedEvents.push({ + event: localFastOrderFilled, + slot, + signature, + }); + } }); }); @@ -2158,8 +2165,15 @@ describe("Swap Layer -- Jupiter V6", () => { let listenerId: number | null; before("Start Event Listener", async function () { - listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { - emittedEvents.push({ event, slot, signature }); + listenerId = matchingEngine.onEventCpi((event, slot, signature) => { + const { localFastOrderFilled } = event; + if (localFastOrderFilled !== undefined) { + emittedEvents.push({ + event: localFastOrderFilled, + slot, + signature, + }); + } }); }); @@ -2231,7 +2245,7 @@ describe("Swap Layer -- Jupiter V6", () => { "Ethereum", "0x000000000000000000000000000000000000d00d", ), - buf: Buffer.from("All your base are belong to us."), + buf: Uint8Array.from(Buffer.from("All your base are belong to us.")), }, amountIn, }, @@ -2300,7 +2314,7 @@ describe("Swap Layer -- Jupiter V6", () => { const redeemMode: RedeemMode = { mode: "Payload", sender: toUniversal("Ethereum", "0x000000000000000000000000000000000000d00d"), - buf: Buffer.from("All your base are belong to us."), + buf: Uint8Array.from(Buffer.from("All your base are belong to us.")), }; const amountIn = 200_000_000n; @@ -2318,7 +2332,7 @@ describe("Swap Layer -- Jupiter V6", () => { ); // Fetch amount from prepared fill. - const preparedData = await tokenRouter.preparedCustodyTokenAddress(preparedFill); + const preparedData = tokenRouter.preparedCustodyTokenAddress(preparedFill); const { amount: custodyAmount } = await splToken.getAccount( connection, preparedData, @@ -2702,8 +2716,15 @@ describe("Swap Layer -- Jupiter V6", () => { let listenerId: number | null; before("Start Event Listener", async function () { - listenerId = matchingEngine.onFilledLocalFastOrder((event, slot, signature) => { - emittedEvents.push({ event, slot, signature }); + listenerId = matchingEngine.onEventCpi((event, slot, signature) => { + const { localFastOrderFilled } = event; + if (localFastOrderFilled !== undefined) { + emittedEvents.push({ + event: localFastOrderFilled, + slot, + signature, + }); + } }); }); @@ -2733,7 +2754,7 @@ describe("Swap Layer -- Jupiter V6", () => { "Ethereum", "0x000000000000000000000000000000000000d00d", ), - buf: Buffer.from("All your base are belong to us."), + buf: Uint8Array.from(Buffer.from("All your base are belong to us.")), }, outputToken, amountIn, @@ -2773,7 +2794,7 @@ describe("Swap Layer -- Jupiter V6", () => { "Ethereum", "0x000000000000000000000000000000000000d00d", ), - buf: Buffer.from("All your base are belong to us."), + buf: Uint8Array.from(Buffer.from("All your base are belong to us."),) }, outputToken, amountIn, @@ -2811,7 +2832,7 @@ describe("Swap Layer -- Jupiter V6", () => { "Ethereum", "0x000000000000000000000000000000000000d00d", ), - buf: Buffer.from("All your base are belong to us."), + buf: Uint8Array.from(Buffer.from("All your base are belong to us."),) }, amountIn, }, @@ -2849,7 +2870,7 @@ describe("Swap Layer -- Jupiter V6", () => { "Ethereum", "0x000000000000000000000000000000000000d00d", ), - buf: Buffer.from("All your base are belong to us."), + buf: Uint8Array.from(Buffer.from("All your base are belong to us."),) }, outputToken, amountIn, @@ -2975,7 +2996,7 @@ describe("Swap Layer -- Jupiter V6", () => { } const { redeemerMessage } = await tokenRouter.fetchPreparedFill(accounts.preparedFill); - const outputToken = decodeSwapLayerMessage(redeemerMessage).outputToken; + const outputToken = decodeSwapLayerMessage(Uint8Array.from(redeemerMessage)).outputToken; if (outputToken.type === "Gas" || outputTokenOverride === "Gas") { const balanceBefore = await connection.getBalance(accounts.recipient).then(BigInt); @@ -3076,7 +3097,7 @@ describe("Swap Layer -- Jupiter V6", () => { } const { redeemerMessage } = await tokenRouter.fetchPreparedFill(accounts.preparedFill); - const swapMsg = decodeSwapLayerMessage(redeemerMessage); + const swapMsg = decodeSwapLayerMessage(Uint8Array.from(redeemerMessage)); const selfRedeem = accounts.payer == accounts.recipient; // Fetch the balance of the fee recipient before the swap. @@ -3219,7 +3240,7 @@ describe("Swap Layer -- Jupiter V6", () => { addressLookupTableAccounts, }); - const { recipient, redeemMode, outputToken } = decodeSwapLayerMessage(redeemerMessage); + const { recipient, redeemMode, outputToken } = decodeSwapLayerMessage(Uint8Array.from(redeemerMessage)); if (redeemMode.mode !== "Payload") { assert.fail("Not in payload mode"); } @@ -3335,7 +3356,7 @@ describe("Swap Layer -- Jupiter V6", () => { const preparedFill = tokenRouter.preparedFillAddress(fastFill); const { redeemerMessage } = await tokenRouter.fetchPreparedFill(preparedFill); - assert.deepEqual(decodeSwapLayerMessage(redeemerMessage), msg); + assert.deepEqual(decodeSwapLayerMessage(Uint8Array.from(redeemerMessage)), msg); return { preparedFill, recipient }; } @@ -3668,7 +3689,7 @@ describe("Swap Layer -- Jupiter V6", () => { maxFee: maxFee ?? 42069n, initAuctionFee: initAuctionFee ?? 1_250_000n, deadline: deadline ?? 0, - redeemerMessage: Buffer.from(redeemerMessage ?? Uint8Array.from([4, 20, 69])), + redeemerMessage: redeemerMessage ?? Uint8Array.from([4, 20, 69]), }; } @@ -3983,7 +4004,7 @@ describe("Swap Layer -- Jupiter V6", () => { return { mode: "Payload", sender: toUniversal("Solana", sender.toBytes()), - buf: redeemOption.payload, + buf: Uint8Array.from(redeemOption.payload), }; } else { throw new Error("Invalid redeem option");