diff --git a/.github/actions/setup-anchor/action.yml b/.github/actions/setup-anchor/action.yml index 534377f..ac4585d 100644 --- a/.github/actions/setup-anchor/action.yml +++ b/.github/actions/setup-anchor/action.yml @@ -3,13 +3,13 @@ description: "Setup bun and anchor cli" runs: using: "composite" steps: - - uses: oven-sh/setup-bun@v2 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 - name: Cache Anchor CLI - uses: actions/cache@v4 + uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 id: cache-anchor with: path: ~/.cargo/bin/anchor key: anchor-cli-${{ runner.os }}-${{ env.ANCHOR_CLI_VERSION }} - if: steps.cache-anchor.outputs.cache-hit != 'true' - run: cargo install --git https://github.com/coral-xyz/anchor --tag v${{ env.ANCHOR_CLI_VERSION }} anchor-cli --locked + run: cargo install --git https://github.com/otter-sec/anchor --tag v${{ env.ANCHOR_CLI_VERSION }} anchor-cli --locked shell: bash diff --git a/.github/actions/setup-solana/action.yml b/.github/actions/setup-solana/action.yml index f4e60ac..78386f1 100644 --- a/.github/actions/setup-solana/action.yml +++ b/.github/actions/setup-solana/action.yml @@ -3,7 +3,7 @@ description: "Setup Solana" runs: using: "composite" steps: - - uses: actions/cache@v4 + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 name: Cache Solana Tool Suite id: cache-solana with: diff --git a/.github/actions/setup-versions/action.yml b/.github/actions/setup-versions/action.yml new file mode 100644 index 0000000..7044aa5 --- /dev/null +++ b/.github/actions/setup-versions/action.yml @@ -0,0 +1,11 @@ +name: "Setup Versions" +description: "Read version configs from repo files and export as env vars" +runs: + using: "composite" + steps: + - name: Extract versions from config files + run: | + echo "TOOLCHAIN=$(grep 'channel' rust-toolchain.toml | sed 's/.*"\(.*\)"/\1/')" >> $GITHUB_ENV + echo "SOLANA_CLI_VERSION=$(grep 'solana_version' Anchor.toml | sed 's/.*"\(.*\)"/\1/')" >> $GITHUB_ENV + echo "ANCHOR_CLI_VERSION=$(grep 'anchor_version' Anchor.toml | sed 's/.*"\(.*\)"/\1/')" >> $GITHUB_ENV + shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7b65fb9..3f5c1ce 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,39 +6,46 @@ on: - main - release_* -env: - SOLANA_CLI_VERSION: 3.1.10 - ANCHOR_CLI_VERSION: 1.0.2 - TOOLCHAIN: 1.93.0 - jobs: program_changed_files: runs-on: ubuntu-latest outputs: program: ${{steps.changed-files-specific.outputs.any_changed}} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 with: fetch-depth: 0 - name: Get specific changed files id: changed-files-specific - uses: tj-actions/changed-files@v18.6 + uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 # v47.0.6 with: files: | - programs/dynamic-fee-sharing + programs/dynamic-fee-sharing/** + libs/** + idls/** + Cargo.toml + Cargo.lock + rust-toolchain.toml + Anchor.toml + package.json + bun.lock + tsconfig.json + tests/** + .github/** cargo_test: runs-on: ubuntu-latest needs: program_changed_files if: needs.program_changed_files.outputs.program == 'true' steps: - - uses: actions/checkout@v4 - - uses: dtolnay/rust-toolchain@stable + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: ./.github/actions/setup-versions + - uses: dtolnay/rust-toolchain@683b588c487a69d01f6c6ddf40f036ff682cc2c8 # master (2026-10-16) with: toolchain: ${{ env.TOOLCHAIN }} components: clippy # Cache rust, cargo - - uses: Swatinem/rust-cache@v1 + - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2 - run: cargo test --package dynamic-fee-sharing shell: bash @@ -47,21 +54,22 @@ jobs: needs: program_changed_files if: needs.program_changed_files.outputs.program == 'true' steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0 + - uses: ./.github/actions/setup-versions - uses: ./.github/actions/setup-solana - uses: ./.github/actions/setup-dep - uses: ./.github/actions/setup-anchor # Install bun - - uses: oven-sh/setup-bun@v2 + - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 # Install rust + toolchain - - uses: dtolnay/rust-toolchain@stable + - uses: dtolnay/rust-toolchain@683b588c487a69d01f6c6ddf40f036ff682cc2c8 # master (2026-10-16) with: toolchain: ${{ env.TOOLCHAIN }} components: clippy # Cache rust, cargo - - uses: Swatinem/rust-cache@v1 + - uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2 # Cache node_modules - - uses: actions/cache@v4 + - uses: actions/cache@0057852bfaa89a56745cba8c7296529d2fc39830 # v4.3.0 id: cache-node-modules with: path: ./node_modules @@ -69,5 +77,5 @@ jobs: # Testing - run: bun install shell: bash - - run: bun run test + - run: bun run build-test shell: bash diff --git a/Anchor.toml b/Anchor.toml index 3991b94..e55f891 100644 --- a/Anchor.toml +++ b/Anchor.toml @@ -1,6 +1,6 @@ [toolchain] -anchor_version = "1.0.2" -solana_version = "3.1.10" +anchor_version = "1.2.1" +solana_version = "4.1.2" package_manager = "bun" [features] @@ -10,9 +10,6 @@ skip-lint = false [programs.localnet] dynamic_fee_sharing = "dfsdo2UqvwfN8DuUVrMRNfQe11VaiNoKcMqLHVvDPzh" -[registry] -url = "https://api.apr.dev" - [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" diff --git a/CHANGELOG.md b/CHANGELOG.md index 2238daa..fd13ebe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Breaking Changes +## dynamic-fee-sharing [0.1.3] + +### Added + +- New endpoint `update_user_address(index, new_address)`: the user at `index` moves its share to `new_address`, signed by its current address. The share and the fee not claimed yet stay with the slot, so they go to the new address. It emits `EvtUpdateUserAddress`. Only the current address can sign, so it is meant to rotate a wallet, not to recover from a compromised key: whoever holds that key can update the address too + +### Changed + +- Update to anchor 1.2.1 and solana 4.1.2, building for SBPF v3 with platform-tools v1.57 +- Enable `#[program(legacy_idl)]` to keep the legacy on-chain IDL instructions, managed with `anchor legacy-idl` (`anchor idl` now uses the Program Metadata program). Anchor marks it as deprecated + ## dynamic-fee-sharing [0.1.2] [PR #15](https://github.com/MeteoraAg/dynamic-fee-sharing/pull/15) ### Added diff --git a/Cargo.lock b/Cargo.lock index d1c6674..acbd8ab 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ - "crypto-common", + "crypto-common 0.1.6", "generic-array", ] @@ -20,7 +20,7 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.9", ] [[package]] @@ -59,66 +59,66 @@ dependencies = [ [[package]] name = "anchor-attribute-access-control" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8cd233e382ea499e3c1e51bf4f0cb367abb37bb64e9e3667a5d618af3fe265" +checksum = "c8acfe7170adee791e68a95b49d8935b1287a92a1b0384d651996131cbb0ef4f" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] name = "anchor-attribute-account" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e12171382e24c5cda6b0f7236a4f6bb9b657da997780c88a0ef794a419298bf" +checksum = "d576ded7c483b7d5b20f582a31147ebc8ed4c4445bfbc6197a4ec41e7546867d" dependencies = [ "anchor-syn", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] name = "anchor-attribute-constant" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510f8db71375446405dfabdaf157fb7d3fbf33470c98ed75fad4c467e8ca0080" +checksum = "379641984ce7be4f2be6619a12e009cbcbf748e207aec69a1063a65d0fdd0a8a" dependencies = [ "anchor-syn", "quote", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] name = "anchor-attribute-error" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b203169a49ea74da7782281e740ea8e21017c85f8f3b1ab452712c9796d28f" +checksum = "75af3039069c943582b7acff950bc52e08232912cef929b3704969318320ef7b" dependencies = [ "anchor-syn", "quote", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] name = "anchor-attribute-event" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c50a462651e573ec6cc632e8f607e8b1e11f620f6fc26badaeff04fd49f45cc1" +checksum = "95055406282f15fdb3d18ac90d0631b5592e87726bbfcec7213ee220c98d1d36" dependencies = [ "anchor-syn", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] name = "anchor-attribute-program" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84704ee25a7e788afd9d846945cba536cfdcd53b463e8a337cf237cd897ca4d9" +checksum = "11c443bdf2f47894fb477a3199b3a8faebee08fcccf7103100d4c8836bacbea3" dependencies = [ "anchor-lang-idl", "anchor-syn", @@ -126,49 +126,49 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] name = "anchor-derive-accounts" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98bf49664527c7bb0ebca04e9b5bfb618d6ceb849ef44a8149241d244bbfb0f6" +checksum = "36311ece149803532842eefc8492d013be34934b85cab35f9487f4e1295d4e08" dependencies = [ "anchor-syn", "quote", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] name = "anchor-derive-serde" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8140a40827bdfd74720f1f3084778fa081262f2f43bd4bdbc350f98ce1b341c6" +checksum = "c6cbecf7fb85e8caa68fa97b02793ad0308cad078f64c8c24460c31ed2e5eecc" dependencies = [ "anchor-syn", "proc-macro-crate", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] name = "anchor-derive-space" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee5b6fa5dde037399d3e0bb322a1c7360ad8adc6b6afdd797d19566c039dcfb" +checksum = "17f15cad8c537d6560f365238b7e73c1d100252ddf76d77ef5d8391acdc5472c" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.117", ] [[package]] name = "anchor-lang" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bac4de7c9a9a69180798af701e22302cc0ebf2ef683b843706a1b7809454735" +checksum = "19d595e09daa737c57e9a0ab807e5c0b9278e5aefc463063438768ece09f614b" dependencies = [ "anchor-attribute-access-control", "anchor-attribute-account", @@ -179,19 +179,21 @@ dependencies = [ "anchor-derive-accounts", "anchor-derive-serde", "anchor-derive-space", + "anchor-lang-error", "anchor-lang-idl", "base64 0.21.4", "bincode", "borsh", "bytemuck", "const-crypto", + "serde", "solana-account-info", - "solana-clock", + "solana-clock 4.0.0", "solana-cpi", - "solana-define-syscall 3.0.0", + "solana-define-syscall 4.0.1", "solana-feature-gate-interface", - "solana-instruction", - "solana-instructions-sysvar", + "solana-instruction 3.5.1", + "solana-instructions-sysvar 4.0.0", "solana-invoke", "solana-loader-v3-interface", "solana-msg", @@ -200,7 +202,7 @@ dependencies = [ "solana-program-memory", "solana-program-option", "solana-program-pack", - "solana-pubkey 3.0.0", + "solana-pubkey 4.4.0", "solana-sdk-ids", "solana-stake-interface", "solana-system-interface 2.0.0", @@ -209,11 +211,24 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "anchor-lang-error" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8677821ff5d74d02ccd9e53c23d47e073e95e1b512a3290ee2dd73a51bf4e00" +dependencies = [ + "anchor-attribute-error", + "borsh", + "solana-msg", + "solana-program-error", + "solana-pubkey 4.4.0", +] + [[package]] name = "anchor-lang-idl" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32e8599d21995f68e296265aa5ab0c3cef582fd58afec014d01bd0bce18a4418" +checksum = "47914b4290ae2bdf4ec203aa821e6eba86d7c78ef497918938038dcc6919f953" dependencies = [ "anchor-lang-idl-spec", "anyhow", @@ -221,7 +236,7 @@ dependencies = [ "regex", "serde", "serde_json", - "sha2", + "sha2 0.10.8", ] [[package]] @@ -236,12 +251,14 @@ dependencies = [ [[package]] name = "anchor-spl" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b8005eef3a48a9a8cb21b126ae3bb252647e353afe6ef7f19e545177801c841" +checksum = "9c3557c0a140ddcd5641bfe66bbb0c563b9576100a1226ad54316c791849c3e9" dependencies = [ "anchor-lang", - "spl-associated-token-account-interface", + "solana-nullable", + "solana-stake-interface", + "solana-sysvar", "spl-pod", "spl-token-2022-interface", "spl-token-group-interface", @@ -251,19 +268,18 @@ dependencies = [ [[package]] name = "anchor-syn" -version = "1.0.2" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6940253e80acf0f8e83b1ebd9c4772c496aedcce6ad19aa85ce75d0b6b188298" +checksum = "1ec9f541e494a3b07f453110264b2a4f4d3d1a9e86736d267cf0d252a54a6ff3" dependencies = [ - "anyhow", "bs58", "cargo_toml", "heck", "proc-macro2", "quote", "serde", - "sha2", - "syn 1.0.109", + "sha2 0.11.1", + "syn 2.0.117", "thiserror 1.0.69", ] @@ -495,6 +511,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + [[package]] name = "borsh" version = "1.6.1" @@ -584,9 +609,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "cargo_toml" -version = "0.19.2" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" dependencies = [ "serde", "toml", @@ -610,7 +635,7 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "crypto-common", + "crypto-common 0.1.6", "inout", ] @@ -624,6 +649,12 @@ dependencies = [ "sha2-const-stable", ] +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + [[package]] name = "cpufeatures" version = "0.2.9" @@ -633,6 +664,15 @@ dependencies = [ "libc", ] +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + [[package]] name = "crunchy" version = "0.2.2" @@ -650,6 +690,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + [[package]] name = "ctr" version = "0.9.2" @@ -666,7 +715,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.9", "curve25519-dalek-derive", "digest 0.10.7", "fiat-crypto", @@ -698,9 +747,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" dependencies = [ "darling_core", "darling_macro", @@ -708,11 +757,10 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" dependencies = [ - "fnv", "ident_case", "proc-macro2", "quote", @@ -722,9 +770,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.21.3" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", @@ -763,11 +811,22 @@ version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "crypto-common", + "block-buffer 0.10.4", + "crypto-common 0.1.6", "subtle", ] +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid", + "crypto-common 0.2.2", +] + [[package]] name = "dynamic-bonding-curve" version = "0.1.6" @@ -778,7 +837,7 @@ dependencies = [ [[package]] name = "dynamic-fee-sharing" -version = "0.1.2" +version = "0.1.3" dependencies = [ "anchor-lang", "anchor-spl", @@ -967,6 +1026,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "hybrid-array" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" +dependencies = [ + "typenum", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -1052,7 +1120,7 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.9", ] [[package]] @@ -1140,6 +1208,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "num-derive" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e98dc3b890f6c23a0f9d3d491a2823d0dea0fa656302a13dd225fa924112a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.9", +] + [[package]] name = "num-integer" version = "0.1.46" @@ -1250,9 +1329,9 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pastey" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b867cad97c0791bbd3aaa6472142568c6c9e8f71937e98379f584cfb0cf35bec" +checksum = "2ee67f1008b1ba2321834326597b8e186293b049a023cdef258527550b9935b4" [[package]] name = "pbkdf2" @@ -1287,7 +1366,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.9", "opaque-debug", "universal-hash", ] @@ -1315,7 +1394,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.11+spec-1.1.0", + "toml_edit", ] [[package]] @@ -1676,11 +1755,11 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.8" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "4e7523beb55eece201a2356bee0bbca0d1ab466c14c07703b2e0ee6d42cb0c2c" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -1690,10 +1769,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.9", "digest 0.10.7", ] +[[package]] +name = "sha2" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d7069beb7d6ac7b9acd1039986e73443f24234f41074da099d6f994ac9ad19" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "digest 0.11.3", +] + [[package]] name = "sha2-const-stable" version = "0.1.0" @@ -1722,7 +1812,7 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" dependencies = [ - "solana-address 2.6.0", + "solana-address 2.9.0", "solana-program-error", "solana-program-memory", ] @@ -1733,14 +1823,14 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2ecac8e1b7f74c2baa9e774c42817e3e75b20787134b76cc4d45e8a604488f5" dependencies = [ - "solana-address 2.6.0", + "solana-address 2.9.0", ] [[package]] name = "solana-address" -version = "2.6.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1384b52c435a750cc9c538760fc7bb472fd78e65a9900a2d07312c5bb335b72" +checksum = "451294fdd4dde59ae27213695e2333eaaa39035e1f099f68644d2aa3ca0e2edd" dependencies = [ "borsh", "bytemuck", @@ -1780,12 +1870,22 @@ dependencies = [ [[package]] name = "solana-clock" -version = "3.0.1" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95cf11109c3b6115cc510f1e31f06fdd52f504271bc24ef5f1249fbbcae5f9f3" +checksum = "5f536b035433918d204397c2989d3c75f0d57af6948c3235599cfe909038af43" +dependencies = [ + "solana-clock 4.0.0", +] + +[[package]] +name = "solana-clock" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "178fc0c31655aa16190cc112919dcdf279437e14b2f2f9790fe1ec29157ff20c" dependencies = [ "serde", "serde_derive", + "solana-get-sysvar", "solana-sdk-ids", "solana-sdk-macro", "solana-sysvar-id", @@ -1799,22 +1899,22 @@ checksum = "4dea26709d867aada85d0d3617db0944215c8bb28d3745b912de7db13a23280c" dependencies = [ "solana-account-info", "solana-define-syscall 4.0.1", - "solana-instruction", + "solana-instruction 3.5.1", "solana-program-error", - "solana-pubkey 4.2.0", + "solana-pubkey 4.4.0", "solana-stable-layout", ] [[package]] name = "solana-curve25519" -version = "3.1.13" +version = "4.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78600945fd087ceae784e4afee6c22610d5ee480fc73d6df1d733c6f06507d3e" +checksum = "14b4d2a4bf0d0b0a86c22111917e86e8bd39a7b31420fb2c7d73eb83761fc7af" dependencies = [ "bytemuck", "bytemuck_derive", "curve25519-dalek", - "solana-define-syscall 3.0.0", + "solana-define-syscall 5.1.0", "subtle", "thiserror 2.0.18", ] @@ -1850,12 +1950,13 @@ dependencies = [ [[package]] name = "solana-epoch-rewards" -version = "3.0.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e7b0ba210593ba8ddd39d6d234d81795d1671cebf3026baa10d5dc23ac42f0" +checksum = "0788d74ee15778deecaa15ed1a1e37727ba954f86cbc35225450a1f2b5012969" dependencies = [ "serde", "serde_derive", + "solana-get-sysvar", "solana-hash", "solana-sdk-ids", "solana-sdk-macro", @@ -1864,12 +1965,14 @@ dependencies = [ [[package]] name = "solana-epoch-schedule" -version = "3.1.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce264b7b42322325947c4136a09460bf5c73d9aa8262c9b0a2064be63ba8639" +checksum = "43ae73018043cff5d3990b3998d846fab2e823c07e3b2f49be602ea584be3d4f" dependencies = [ "serde", "serde_derive", + "solana-get-sysvar", + "solana-program-error", "solana-sdk-ids", "solana-sdk-macro", "solana-sysvar-id", @@ -1877,31 +1980,42 @@ dependencies = [ [[package]] name = "solana-feature-gate-interface" -version = "3.1.0" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" +checksum = "bd7545e02f91da1d6996f32b18f7796aa01e0682f8f3a7434b82cd1a10448add" dependencies = [ "solana-program-error", - "solana-pubkey 4.2.0", + "solana-pubkey 4.4.0", "solana-sdk-ids", ] [[package]] name = "solana-fee-calculator" -version = "3.2.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57e8add96b5741573e9f7529c4bb7719cfcfa999c3847a68cdfaef0cb6adf567" +checksum = "55add16a1c8f8953379a2b91ff3e94ee7096feac787ca33fad0292c6ca86dbe5" dependencies = [ "log", "serde", "serde_derive", ] +[[package]] +name = "solana-get-sysvar" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef3bc859fc036ed490146793557386cbfae614ebba4adc704c37d94350824ed4" +dependencies = [ + "solana-address 2.9.0", + "solana-define-syscall 5.1.0", + "solana-program-error", +] + [[package]] name = "solana-hash" -version = "4.3.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b113239362cee7093bfb250467138f079a2a03673181dc15bff6ccd677912d" +checksum = "c7507df0d2c6350053d125e3df200976fdc68d2a942637d11ac657fe7220949a" dependencies = [ "bytemuck", "bytemuck_derive", @@ -1912,23 +2026,33 @@ dependencies = [ [[package]] name = "solana-instruction" -version = "3.4.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ebb0ffd19263051bc3f683fcc086134b8ff23af894dcb63f7563c7137b42f1" +checksum = "6d8f113d1312870e2d8698033e9d153d3329c520e1065f05145a55a889e21c91" +dependencies = [ + "solana-instruction 4.0.0", + "solana-instruction-error", +] + +[[package]] +name = "solana-instruction" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ea8442b67a58dd54d5497bfc6cd3106b00f9fe6f6877d33c271c3ec4672eedc" dependencies = [ "bincode", + "borsh", "serde", "serde_derive", "solana-define-syscall 5.1.0", - "solana-instruction-error", - "solana-pubkey 4.2.0", + "solana-pubkey 4.4.0", ] [[package]] name = "solana-instruction-error" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0b188842592fdf6cb96f55263ae1bf11713ab5114401d1d5a881ed7cc41bef6" +checksum = "e8e7db78c122d02189619490b1fef04a2a042c389662920617c0e6381fdf8fdd" dependencies = [ "num-traits", "solana-program-error", @@ -1936,16 +2060,32 @@ dependencies = [ [[package]] name = "solana-instructions-sysvar" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddf67876c541aa1e21ee1acae35c95c6fbc61119814bfef70579317a5e26955" +checksum = "9e0732294560e88ecdb2bbc656e67383e9f88c78ec09469cef172f0d28cd1bcd" dependencies = [ "bitflags 2.9.0", "solana-account-info", - "solana-instruction", + "solana-instruction 3.5.1", + "solana-instruction-error", + "solana-program-error", + "solana-sanitize", + "solana-sdk-ids", + "solana-serialize-utils", + "solana-sysvar-id", +] + +[[package]] +name = "solana-instructions-sysvar" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e38363a181313d607f7a118df2b401bb27b477a0104b09283cbf504f5f0f00cc" +dependencies = [ + "bitflags 2.9.0", + "solana-account-info", + "solana-instruction 3.5.1", "solana-instruction-error", "solana-program-error", - "solana-pubkey 3.0.0", "solana-sanitize", "solana-sdk-ids", "solana-serialize-utils", @@ -1960,19 +2100,20 @@ checksum = "4065031f5c7dd29ef5f5003c1a353011eeabbafa6c5a5033da0cedbfca824b94" dependencies = [ "solana-account-info", "solana-define-syscall 3.0.0", - "solana-instruction", + "solana-instruction 3.5.1", "solana-program-entrypoint", "solana-stable-layout", ] [[package]] name = "solana-last-restart-slot" -version = "3.0.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcda154ec827f5fc1e4da0af3417951b7e9b8157540f81f936c4a8b1156134d0" +checksum = "5099e736c3c06c451b307a60637d69eb65b3144143ebeed899e2fd1134f4fc35" dependencies = [ "serde", "serde_derive", + "solana-get-sysvar", "solana-sdk-ids", "solana-sdk-macro", "solana-sysvar-id", @@ -1980,17 +2121,17 @@ dependencies = [ [[package]] name = "solana-loader-v3-interface" -version = "6.1.1" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e0538d4dbc9022e01616f1c58f2db98ece739c5d5ed4a2ef8737a953e76a2d4" +checksum = "68029ab11d9c891d4ce23ada75745e40f983c5674af366f447b672569634231b" dependencies = [ "serde", "serde_bytes", "serde_derive", - "solana-instruction", - "solana-pubkey 4.2.0", + "solana-instruction 3.5.1", + "solana-pubkey 4.4.0", "solana-sdk-ids", - "solana-system-interface 3.2.0", + "solana-system-interface 3.3.0", ] [[package]] @@ -2004,10 +2145,11 @@ dependencies = [ [[package]] name = "solana-nullable" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da028344c595c7416769ff648d206de7962571291a4cea24c38a60b6f40d53bb" +checksum = "889194d8c5faec648f2f6fadddb60566249921ebb074e2707e7095458d5864e2" dependencies = [ + "borsh", "bytemuck", ] @@ -2020,7 +2162,7 @@ dependencies = [ "solana-account-info", "solana-define-syscall 4.0.1", "solana-program-error", - "solana-pubkey 4.2.0", + "solana-pubkey 4.4.0", ] [[package]] @@ -2067,21 +2209,22 @@ dependencies = [ [[package]] name = "solana-pubkey" -version = "4.2.0" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7db719574990de7e8b0f55a8593ac92a5ccb42c8ce67b3e4bf05b139d5d9ee71" +checksum = "e2b8ba5d677d77a76d557b59ce7ecf9a8578743089cb25c73990752c5f005885" dependencies = [ - "solana-address 2.6.0", + "solana-address 2.9.0", ] [[package]] name = "solana-rent" -version = "3.1.0" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e860d5499a705369778647e97d760f7670adfb6fc8419dd3d568deccd46d5487" +checksum = "6e7c7590d4e53446a00c363783d98199d8c8f5099ca60eaf2a0f1f50d0e7a31e" dependencies = [ "serde", "serde_derive", + "solana-get-sysvar", "solana-sdk-ids", "solana-sdk-macro", "solana-sysvar-id", @@ -2099,7 +2242,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" dependencies = [ - "solana-address 2.6.0", + "solana-address 2.9.0", ] [[package]] @@ -2131,17 +2274,17 @@ checksum = "dc905b200a95f2ea9146e43f2a7181e3aeb55de6bc12afb36462d00a3c7310de" dependencies = [ "hmac", "pbkdf2", - "sha2", + "sha2 0.10.8", ] [[package]] name = "solana-serialize-utils" -version = "3.1.1" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d7cc401931d178472358e6b78dc72d031dc08f752d7410f0e8bd259dd6f02fa" +checksum = "761357b0853c9623bf12c1d2314b3d6160a85b087b84c45224fb85766d22616b" dependencies = [ "solana-instruction-error", - "solana-pubkey 4.2.0", + "solana-pubkey 4.4.0", "solana-sanitize", ] @@ -2151,7 +2294,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db7dc3011ea4c0334aaaa7e7128cb390ecf546b28d412e9bf2064680f57f588f" dependencies = [ - "sha2", + "sha2 0.10.8", "solana-define-syscall 4.0.1", "solana-hash", ] @@ -2179,12 +2322,13 @@ dependencies = [ [[package]] name = "solana-slot-hashes" -version = "3.0.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2585f70191623887329dfb5078da3a00e15e3980ea67f42c2e10b07028419f43" +checksum = "007d6bc909599eea325c9d09f7ff16ef6166c134876ff47a6a122d693d058dad" dependencies = [ "serde", "serde_derive", + "solana-get-sysvar", "solana-hash", "solana-sdk-ids", "solana-sysvar-id", @@ -2192,13 +2336,14 @@ dependencies = [ [[package]] name = "solana-slot-history" -version = "3.0.0" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f914f6b108f5bba14a280b458d023e3621c9973f27f015a4d755b50e88d89e97" +checksum = "4560fde841a6f2001aedc33b74fe99840ee3d56a71fe9b98ee332303b8597900" dependencies = [ "bv", "serde", "serde_derive", + "solana-get-sysvar", "solana-sdk-ids", "solana-sysvar-id", ] @@ -2209,27 +2354,41 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c9f6a291ba063a37780af29e7db14bdd3dc447584d8ba5b3fc4b88e2bbc982fa" dependencies = [ - "solana-instruction", - "solana-pubkey 4.2.0", + "solana-instruction 3.5.1", + "solana-pubkey 4.4.0", +] + +[[package]] +name = "solana-stake-history" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c814b4e2570f8c343eb1d4f968ff981bdf518afc3643d070d8e5a28158e85a4b" +dependencies = [ + "serde", + "serde_derive", + "solana-clock 3.2.1", + "solana-get-sysvar", + "solana-sdk-ids", + "solana-sysvar-id", ] [[package]] name = "solana-stake-interface" -version = "2.0.2" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9bc26191b533f9a6e5a14cca05174119819ced680a80febff2f5051a713f0db" +checksum = "76b3c13c6711702b2fa18b5203f1807aae0d669b627a97b72663355786bbcbed" dependencies = [ + "borsh", "num-traits", "serde", "serde_derive", - "solana-clock", + "solana-clock 3.2.1", "solana-cpi", - "solana-instruction", + "solana-instruction 3.5.1", "solana-program-error", - "solana-pubkey 3.0.0", - "solana-system-interface 2.0.0", - "solana-sysvar", - "solana-sysvar-id", + "solana-pubkey 4.4.0", + "solana-stake-history", + "solana-system-interface 3.3.0", ] [[package]] @@ -2241,7 +2400,7 @@ dependencies = [ "num-traits", "serde", "serde_derive", - "solana-instruction", + "solana-instruction 3.5.1", "solana-msg", "solana-program-error", "solana-pubkey 3.0.0", @@ -2249,48 +2408,49 @@ dependencies = [ [[package]] name = "solana-system-interface" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55b54965bf0b76fa8e2b35376583efddd4d916618cfe595bf48c7d7b55a9e628" +checksum = "2e2d5311d0584af231c6c2b0503ba1c3aa50118ead4f503ab215ccbdd1ffac57" dependencies = [ "num-traits", "serde", "serde_derive", - "solana-address 2.6.0", - "solana-instruction", + "solana-address 2.9.0", + "solana-instruction 3.5.1", "solana-msg", "solana-program-error", ] [[package]] name = "solana-sysvar" -version = "3.1.1" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +checksum = "552f9d54ec9597f5a17469df500a1ac345c262e5a9859938ef5e5541844fdac5" dependencies = [ "base64 0.22.1", - "bincode", "lazy_static", "serde", "serde_derive", "solana-account-info", - "solana-clock", - "solana-define-syscall 4.0.1", + "solana-clock 3.2.1", + "solana-define-syscall 5.1.0", "solana-epoch-rewards", "solana-epoch-schedule", "solana-fee-calculator", + "solana-get-sysvar", "solana-hash", - "solana-instruction", + "solana-instruction 3.5.1", "solana-last-restart-slot", "solana-program-entrypoint", "solana-program-error", "solana-program-memory", - "solana-pubkey 4.2.0", + "solana-pubkey 4.4.0", "solana-rent", "solana-sdk-ids", "solana-sdk-macro", "solana-slot-hashes", "solana-slot-history", + "solana-stake-history", "solana-sysvar-id", ] @@ -2300,7 +2460,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" dependencies = [ - "solana-address 2.6.0", + "solana-address 2.9.0", "solana-sdk-ids", ] @@ -2316,15 +2476,30 @@ dependencies = [ [[package]] name = "solana-zero-copy" -version = "1.0.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5a91404c7de468dd80658cdb5d894ec803d1092ea6e2bfdf84eee6f07559c0d" +checksum = "369c96063ef15bc310508155ad57bc527c64d814e46ac02d9ebb751a41eb8ea1" dependencies = [ - "borsh", "bytemuck", "bytemuck_derive", ] +[[package]] +name = "solana-zk-elgamal-proof-interface" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8da7f01db2148a1dc16261ff1dc6f3930a1e255a33cece4f1b56658694f27f7" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "num-derive 0.4.2", + "num-traits", + "solana-address 2.9.0", + "solana-instruction 3.5.1", + "solana-sdk-ids", + "solana-zk-sdk-pod", +] + [[package]] name = "solana-zk-sdk" version = "4.0.0" @@ -2341,7 +2516,7 @@ dependencies = [ "itertools 0.12.1", "js-sys", "merlin", - "num-derive", + "num-derive 0.4.2", "num-traits", "rand 0.8.5", "serde", @@ -2349,7 +2524,7 @@ dependencies = [ "serde_json", "sha3", "solana-derivation-path", - "solana-instruction", + "solana-instruction 3.5.1", "solana-pubkey 3.0.0", "solana-sdk-ids", "solana-seed-derivable", @@ -2363,13 +2538,16 @@ dependencies = [ ] [[package]] -name = "spl-associated-token-account-interface" -version = "2.0.0" +name = "solana-zk-sdk-pod" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6433917b60441d68d99a17e121d9db0ea15a9a69c0e5afa34649cf5ba12612f" +checksum = "a800583b7a4cea3e851686af162cc6e4712eef97fa91dfa9aca2459b95c84777" dependencies = [ - "solana-instruction", - "solana-pubkey 3.0.0", + "base64 0.22.1", + "bytemuck", + "bytemuck_derive", + "solana-nullable", + "thiserror 2.0.18", ] [[package]] @@ -2403,7 +2581,7 @@ checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" dependencies = [ "proc-macro2", "quote", - "sha2", + "sha2 0.10.8", "syn 2.0.117", "thiserror 1.0.69", ] @@ -2414,10 +2592,9 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f9c6e142cdf1e7e77f480053ec9f0ce989890768ddf91f619b50f39d1b456f5" dependencies = [ - "borsh", "bytemuck", "bytemuck_derive", - "num-derive", + "num-derive 0.4.2", "num-traits", "num_enum", "solana-program-error", @@ -2430,26 +2607,28 @@ dependencies = [ [[package]] name = "spl-token-2022-interface" -version = "2.1.0" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fcd81188211f4b3c8a5eba7fd534c7142f9dd026123b3472492782cc72f4dc6" +checksum = "3c8b75ca59053d3a79bb8cbaaef12c63ec08f6f1f0b8292352a39b56c455a248" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "getrandom 0.2.10", + "num-derive 0.5.1", "num-traits", "num_enum", "solana-account-info", - "solana-instruction", + "solana-address 2.9.0", + "solana-instruction 3.5.1", + "solana-nullable", "solana-program-error", "solana-program-option", "solana-program-pack", - "solana-pubkey 3.0.0", "solana-sdk-ids", - "solana-zk-sdk", - "spl-pod", + "solana-zero-copy", + "solana-zk-elgamal-proof-interface", + "solana-zk-sdk-pod", "spl-token-confidential-transfer-proof-extraction", - "spl-token-confidential-transfer-proof-generation", "spl-token-group-interface", "spl-token-metadata-interface", "spl-type-length-value", @@ -2458,32 +2637,21 @@ dependencies = [ [[package]] name = "spl-token-confidential-transfer-proof-extraction" -version = "0.5.1" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879a9ebad0d77383d3ea71e7de50503554961ff0f4ef6cbca39ad126e6f6da3a" +checksum = "0c1a845ec724e807643a04f1d43439ee3571dd913848112ac76aa90b850eaf7c" dependencies = [ "bytemuck", "solana-account-info", + "solana-address 2.9.0", "solana-curve25519", - "solana-instruction", - "solana-instructions-sysvar", + "solana-instruction 3.5.1", + "solana-instructions-sysvar 3.0.1", "solana-msg", "solana-program-error", - "solana-pubkey 3.0.0", "solana-sdk-ids", - "solana-zk-sdk", - "spl-pod", - "thiserror 2.0.18", -] - -[[package]] -name = "spl-token-confidential-transfer-proof-generation" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0cd59fce3dc00f563c6fa364d67c3f200d278eae681f4dc250240afcfe044b1" -dependencies = [ - "curve25519-dalek", - "solana-zk-sdk", + "solana-zk-elgamal-proof-interface", + "solana-zk-sdk-pod", "thiserror 2.0.18", ] @@ -2494,11 +2662,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841cbd6f2322d02719be4da1affedbe6495b1048b7b985ec9796032564026e22" dependencies = [ "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", "num_enum", - "solana-address 2.6.0", - "solana-instruction", + "solana-address 2.9.0", + "solana-instruction 3.5.1", "solana-nullable", "solana-program-error", "solana-zero-copy", @@ -2508,16 +2676,16 @@ dependencies = [ [[package]] name = "spl-token-interface" -version = "2.0.0" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c564ac05a7c8d8b12e988a37d82695b5ba4db376d07ea98bc4882c81f96c7f3" +checksum = "7143c4e676984047a400e2fbd7ac29a1659f2b1b52b897cfde19316b562e4589" dependencies = [ "arrayref", "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", "num_enum", - "solana-instruction", + "solana-instruction 3.5.1", "solana-program-error", "solana-program-option", "solana-program-pack", @@ -2528,19 +2696,20 @@ dependencies = [ [[package]] name = "spl-token-metadata-interface" -version = "0.8.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c467c7c3bd056f8fe60119e7ec34ddd6f23052c2fa8f1f51999098063b72676" +checksum = "3d3d96f175e7022ff200464dfa75a3708a4e9b70c83c4ecd04fe52ee479f4fef" dependencies = [ "borsh", - "num-derive", + "num-derive 0.4.2", "num-traits", + "num_enum", + "solana-address 2.9.0", "solana-borsh", - "solana-instruction", + "solana-instruction 3.5.1", + "solana-nullable", "solana-program-error", - "solana-pubkey 3.0.0", "spl-discriminator", - "spl-pod", "spl-type-length-value", "thiserror 2.0.18", ] @@ -2552,7 +2721,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2504631748c48d2a937414d64a12dcac4588d34bd07d355d648619c189d29435" dependencies = [ "bytemuck", - "num-derive", + "num-derive 0.4.2", "num-traits", "num_enum", "solana-account-info", @@ -2602,6 +2771,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "tap" version = "1.0.1" @@ -2678,23 +2858,26 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.8.20" +version = "0.9.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" dependencies = [ - "serde", + "indexmap", + "serde_core", "serde_spanned", - "toml_datetime 0.6.8", - "toml_edit 0.22.24", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 0.7.15", ] [[package]] name = "toml_datetime" -version = "0.6.8" +version = "0.7.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -2706,19 +2889,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "toml_edit" -version = "0.22.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime 0.6.8", - "winnow 0.7.4", -] - [[package]] name = "toml_edit" version = "0.25.11+spec-1.1.0" @@ -2740,11 +2910,17 @@ dependencies = [ "winnow 1.0.1", ] +[[package]] +name = "toml_writer" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06bdbd8cfc056b8d2e2e85f29b56a3bdbecb527cef81eb39e3e7b98af4652770" + [[package]] name = "typenum" -version = "1.16.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "ucd-trie" @@ -2788,7 +2964,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ - "crypto-common", + "crypto-common 0.1.6", "subtle", ] @@ -2898,9 +3074,9 @@ dependencies = [ [[package]] name = "wincode" -version = "0.5.3" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c754f1fc41250f2f742a27ba0fcc9f73df1dec23f6878490770855d43c322d" +checksum = "063b5affe63fb4e584a33101d8808f01f2348b4f533db6223bf27263a0fdb9e9" dependencies = [ "pastey", "proc-macro2", @@ -2911,9 +3087,9 @@ dependencies = [ [[package]] name = "wincode-derive" -version = "0.4.4" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e070787599c7c067b89598cd3eda440cca1b69eda9e0ff7c725fc8679ce9eb4" +checksum = "11d582d9fc9d813264407a9e16bfa16846ccf15ef032f9bbcd700741bdc00255" dependencies = [ "darling", "proc-macro2", @@ -3126,12 +3302,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" -version = "0.7.4" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" -dependencies = [ - "memchr", -] +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" [[package]] name = "winnow" diff --git a/Cargo.toml b/Cargo.toml index 7366ac2..36fd085 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,8 +14,16 @@ incremental = false codegen-units = 1 [workspace.dependencies] -anchor-lang = {version = "1.0.2", features = ["event-cpi"]} -anchor-spl = "1.0.2" +anchor-lang = { version = "1.2.1", default-features = false, features = [ + "solana-v4", + "event-cpi", +] } +anchor-spl = { version = "1.2.1", default-features = false, features = [ + "solana-v4", + "token", + "token_2022", + "token_2022_extensions", +] } bytemuck = { version = "1.21", features = ["derive", "min_const_generics"] } [workspace.lints.rust] @@ -24,4 +32,4 @@ unexpected_cfgs = { level = "warn", check-cfg = [ ] } [workspace.metadata.cli] -solana = "3.1.10" +solana = "4.1.2" diff --git a/README.md b/README.md index ef251fc..8fe6f2a 100644 --- a/README.md +++ b/README.md @@ -7,22 +7,38 @@ ### Development -### Dependencies +### Toolchain -- anchor 1.0.2 -- solana 3.1.10 +| Tool | Version | +| -------------- | ----------------------------------------------------------- | +| Rust | `1.95.0` (pinned via `rust-toolchain.toml`) | +| Solana (Agave) | `4.1.2` (declared in `Anchor.toml`) | +| Anchor | `1.2.1` (declared in `Anchor.toml`), `solana-v4` crates | +| platform-tools | `v1.57`, building for SBPF `v3` (set in `package.json`) | +| Node.js | `>= 20.18` (required by `@solana/kit`, used by LiteSVM 1.x) | +| Bun | latest stable | ### Build -Program +Program ``` -anchor build --ignore-keys +anchor build --ignore-keys --tools-version v1.57 --arch v3 +``` + +Solana verifiable build + +``` +solana-verify build --library-name dynamic_fee_sharing --arch v3 ``` ### Test ``` bun install -bun test -``` \ No newline at end of file +bun run build-test +``` + +`bun run test` runs the tests against the program already built in `target/deploy`. +When switching from a branch that uses LiteSVM 0.x, remove `node_modules` before `bun install`, +otherwise a leftover `litesvm-darwin-universal@0.1.0` can be loaded instead of LiteSVM 1.x. \ No newline at end of file diff --git a/bun.lock b/bun.lock index eded075..6960e4d 100644 --- a/bun.lock +++ b/bun.lock @@ -4,13 +4,14 @@ "workspaces": { "": { "dependencies": { - "@anchor-lang/core": "^1.0.0", - "@solana/spl-token": "^0.4.13", + "@anchor-lang/core": "1.2.1", + "@solana/spl-token": "^0.4.15", "@solana/web3.js": "^1.98.2", "decimal.js": "^10.6.0", - "litesvm": "^0.1.0", + "litesvm": "1.6.0", }, "devDependencies": { + "@solana/kit": "^8.4.0", "@types/bn.js": "^5.1.0", "@types/chai": "^4.3.0", "@types/mocha": "^9.0.0", @@ -23,11 +24,11 @@ }, }, "packages": { - "@anchor-lang/borsh": ["@anchor-lang/borsh@1.0.1", "", { "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" }, "peerDependencies": { "@solana/web3.js": "^1.69.0" } }, "sha512-YnWRh76/3DqF0TSzRpCojRelya9OEQ23LpJQYqkAh+L1xiPcaUaYm1C9Q+W8t363aL45xNJOXMGqb0QPx6kgPw=="], + "@anchor-lang/borsh": ["@anchor-lang/borsh@1.2.1", "", { "dependencies": { "bn.js": "^5.2.3", "buffer-layout": "^1.2.0" }, "peerDependencies": { "@solana/web3.js": "^1.69.1" } }, "sha512-HEquDEKamy69yc+gjhYlPnqrwzKfg/J6618o1fnpZD8p3ifiWVzi+Exv5S8jdmBaEMDgHEJ+qGjpTx+kivyqHQ=="], - "@anchor-lang/core": ["@anchor-lang/core@1.0.1", "", { "dependencies": { "@anchor-lang/borsh": "^1.0.1", "@anchor-lang/errors": "^1.0.1", "@noble/hashes": "^1.3.1", "@solana/web3.js": "^1.69.0", "bn.js": "^5.1.2", "bs58": "^4.0.1", "buffer-layout": "^1.2.2", "camelcase": "^6.3.0", "cross-fetch": "^3.1.5", "eventemitter3": "^4.0.7", "pako": "^2.0.3", "superstruct": "^0.15.4", "toml": "^3.0.0" } }, "sha512-SzZRCod5esNCFmOSwwpKp0Qx2tUiheEIR099LC56OED3BP35hLmsr6OX1xVgD2F/itR5j82xciDjFhbgHCaz2w=="], + "@anchor-lang/core": ["@anchor-lang/core@1.2.1", "", { "dependencies": { "@anchor-lang/borsh": "^1.2.1", "@anchor-lang/errors": "^1.2.1", "@noble/hashes": "^1.3.1", "@solana/web3.js": "^1.69.1", "bn.js": "^5.2.3", "bs58": "^4.0.1", "buffer-layout": "^1.2.2", "eventemitter3": "^4.0.7", "pako": "^2.0.3", "superstruct": "^0.15.4", "toml": "^3.0.0" } }, "sha512-hpaczf9elfPkJ8Nw14HLG58VbuBqZtVEXBPKqn6RA/0d3WJxHlFWMzfYHoI0hTEacd/Tfi5fl94A6q3Ugnvtyg=="], - "@anchor-lang/errors": ["@anchor-lang/errors@1.0.1", "", {}, "sha512-1BpLZbSGT8q1BsGlocAX+/hHdh6zAU4VTCEXkisMjxOy5iaMSCOvQuEM6DO1t73463XUXykxdyzuwQ4pAoYfcw=="], + "@anchor-lang/errors": ["@anchor-lang/errors@1.2.1", "", {}, "sha512-HrVenxlSzosMaSxJo3DSPi3M8KnBpcvB8eWHkLLe1CkBF7Q8HQdkyCkkM6XZvryJGO+98XAX7IRTd9V1wohW+w=="], "@babel/runtime": ["@babel/runtime@7.29.2", "", {}, "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="], @@ -35,30 +36,106 @@ "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@solana-program/system": ["@solana-program/system@0.14.1", "", { "peerDependencies": { "@solana/kit": "^8.0.0" } }, "sha512-K6ZiIrAKoJAfcwfUdsoFvfSAxeRJaRrV7BPFTJvUVRS4m3zszN+nLcdaNMMe2F1/zTriZqC+xh+Kgw6ziGUqpQ=="], + + "@solana-program/token": ["@solana-program/token@0.16.1", "", { "dependencies": { "@solana-program/system": "^0.14.0" }, "peerDependencies": { "@solana/kit": "^8.0.0" } }, "sha512-X9dsvbh+VDq4SuCfvxn95P1DCvtBYHJOBiVmgBJMfW8l/lp8uSwEhy9IurpcdltnGi5kNIkCm4sk4YOXKAMiCw=="], + + "@solana/accounts": ["@solana/accounts@8.5.0", "", { "dependencies": { "@solana/addresses": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/codecs-strings": "8.5.0", "@solana/errors": "8.5.0", "@solana/rpc-spec": "8.5.0", "@solana/rpc-types": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-vwwXYCobg1oG4kFeUEsGiNORjPujI2ff3yKLp6lCa7QBIlKaD7kZ2QRI3PZFYcNrMJ6HYNwNeZXR7ixg02pWdA=="], + + "@solana/addresses": ["@solana/addresses@8.5.0", "", { "dependencies": { "@solana/assertions": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/codecs-strings": "8.5.0", "@solana/errors": "8.5.0", "@solana/nominal-types": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-LwTrDbDSJBng9y0vwiKqb/kSS9daspTGrSYoZPafeMWpAlpmutdD1KXPDHVTa4Xz00hcAfOJXYxRXX5VAoiOag=="], + + "@solana/assertions": ["@solana/assertions@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-EZDY5rJIV8Mv9xYJ7P+jvE5pihG7pmKZ6pTqbunba/4uZSQN4Klw0FX54LDDklfDvhzmAdXN0nYAnjovTGAPEg=="], + "@solana/buffer-layout": ["@solana/buffer-layout@4.0.1", "", { "dependencies": { "buffer": "~6.0.3" } }, "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA=="], - "@solana/buffer-layout-utils": ["@solana/buffer-layout-utils@0.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" } }, "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g=="], + "@solana/buffer-layout-utils": ["@solana/buffer-layout-utils@0.3.0", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/web3.js": "^1.32.0", "bigint-buffer": "^1.1.5", "bignumber.js": "^9.0.1" } }, "sha512-MuQOCC1j0np1xH9yAv0ZWWfwvr7Bt7Sz4LId11Wi4wDdAmJ+lobE+vHg/mZmGcihF0BIkqVBNxGmlv8QE5DrtA=="], - "@solana/codecs": ["@solana/codecs@2.0.0-rc.1", "", { "dependencies": { "@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" } }, "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ=="], + "@solana/codecs": ["@solana/codecs@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/codecs-data-structures": "8.5.0", "@solana/codecs-numbers": "8.5.0", "@solana/codecs-strings": "8.5.0", "@solana/fixed-points": "8.5.0", "@solana/options": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-wALOoEuL7HAaahZnrhxCwYz10p23hku/LPNfXjlvwgjVYJL08PH3uyWDFO8e9zhcNLOaR13IREE9z8zPUhJjDQ=="], - "@solana/codecs-core": ["@solana/codecs-core@2.3.0", "", { "dependencies": { "@solana/errors": "2.3.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw=="], + "@solana/codecs-core": ["@solana/codecs-core@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-ou38qNrf9XOzCWsu/I4sTzRmnrKqhblwMVvpXwXPKAAUZwkSAKQXonwgZFY68I5HK6nkfq1NLWfZFmTEIZYLiw=="], - "@solana/codecs-data-structures": ["@solana/codecs-data-structures@2.0.0-rc.1", "", { "dependencies": { "@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" } }, "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog=="], + "@solana/codecs-data-structures": ["@solana/codecs-data-structures@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/codecs-numbers": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-CnnNriyltkgxZAKgAJoVRsRnrtdW4KCX37BUoIsquCM+AgSvhSbxaZNz0iaHjGOX7o1Z4s6+j7nAUgad0N/w5A=="], "@solana/codecs-numbers": ["@solana/codecs-numbers@2.3.0", "", { "dependencies": { "@solana/codecs-core": "2.3.0", "@solana/errors": "2.3.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg=="], - "@solana/codecs-strings": ["@solana/codecs-strings@2.0.0-rc.1", "", { "dependencies": { "@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", "typescript": ">=5" } }, "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g=="], + "@solana/codecs-strings": ["@solana/codecs-strings@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/codecs-numbers": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", "typescript": ">=5.4.0" }, "optionalPeers": ["fastestsmallesttextencoderdecoder", "typescript"] }, "sha512-9lCSCUVkbPLb1o9PLDsaOatdVgrUqqWMrAqJvZPyyuvrC5++wPuKRIGq+5iU3lICY+AwWxrzVyiwdu4xaZVCiw=="], + + "@solana/errors": ["@solana/errors@8.5.0", "", { "dependencies": { "chalk": "5.6.2", "commander": "15.0.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"], "bin": { "errors": "bin/cli.mjs" } }, "sha512-y/XTiwAZsm2kHoEDJ3ac3NUq/0E4uCbOnBe2m5mmBXF3TGmF562tDKgN5pQ+thiRABvi7b2LqwTBCg4kAdtgRg=="], + + "@solana/fast-stable-stringify": ["@solana/fast-stable-stringify@8.5.0", "", { "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-CTIoOwJ0NScrB8KTzr/V4PJrNHrBAz1zvamM0opgDPQZGzLrBhca1e4eQcGmF6o7Dv3Ve0HdvDJx0B2uG6YxVA=="], + + "@solana/fixed-points": ["@solana/fixed-points@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-hkB7dUAD/oxXeNOvdMXVqfKZAvOJ1o50gBwzh8yLP1ihdSxVgssb36Vg7806C5HzmIxmTKZclJJokG0cRUXVSw=="], + + "@solana/functional": ["@solana/functional@8.5.0", "", { "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-+8pgF1rVW78FfT0d+ceADFLKpSh/8/o9Ldx5tEkI6paiv0QeClL1rlU5nFs5tjoFkf+92x8PpiLEEGkm0CifOQ=="], + + "@solana/instruction-plans": ["@solana/instruction-plans@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0", "@solana/instructions": "8.5.0", "@solana/keys": "8.5.0", "@solana/promises": "8.5.0", "@solana/transaction-messages": "8.5.0", "@solana/transactions": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-cES8TzRGuJ5cdVn3hr6GskwwG68rLd8R0FqmzB9NeU/nzPnW/50nRrg36DYX1Nh+OwuU/ehg6zkNNu1Vo72lKQ=="], + + "@solana/instructions": ["@solana/instructions@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-LSMOQRicz8OalMM2DT60PtAaPjvkHPhIvmPEI8KpyWOuNRwABJBRAfn5ypcdSa69VVj4IdOY10tDWZzjN4dviA=="], + + "@solana/keys": ["@solana/keys@8.5.0", "", { "dependencies": { "@solana/assertions": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/codecs-strings": "8.5.0", "@solana/errors": "8.5.0", "@solana/nominal-types": "8.5.0", "@solana/promises": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-mq6amguPYLklpAOC9A+boXQhpcHGjcn4QN40J0l1TvUkfWyFJ4HBbNb35fyWldqqDUV5ujOpaPZmmVvWJBK2Kw=="], + + "@solana/kit": ["@solana/kit@8.5.0", "", { "dependencies": { "@solana/accounts": "8.5.0", "@solana/addresses": "8.5.0", "@solana/codecs": "8.5.0", "@solana/errors": "8.5.0", "@solana/functional": "8.5.0", "@solana/instruction-plans": "8.5.0", "@solana/instructions": "8.5.0", "@solana/keys": "8.5.0", "@solana/offchain-messages": "8.5.0", "@solana/plugin-core": "8.5.0", "@solana/plugin-interfaces": "8.5.0", "@solana/program-client-core": "8.5.0", "@solana/programs": "8.5.0", "@solana/promises": "8.5.0", "@solana/rpc": "8.5.0", "@solana/rpc-api": "8.5.0", "@solana/rpc-parsed-types": "8.5.0", "@solana/rpc-spec-types": "8.5.0", "@solana/rpc-subscriptions": "8.5.0", "@solana/rpc-types": "8.5.0", "@solana/signers": "8.5.0", "@solana/subscribable": "8.5.0", "@solana/sysvars": "8.5.0", "@solana/transaction-confirmation": "8.5.0", "@solana/transaction-introspection": "8.5.0", "@solana/transaction-messages": "8.5.0", "@solana/transactions": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-bMnXXADeyZFe3XyqzPhlQAIsmPYRiojaRO4JQxwGOmMwiQ5f13ZQodmsOqnt8W/n40P7r/+/pDqWuqG0TUv+yA=="], + + "@solana/nominal-types": ["@solana/nominal-types@8.5.0", "", { "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-OfTZ+w/C59Zkp51RJ3dzn2GXUojf9p/PMmSrOpxrj+hci3bdh4e6XDGY+mvP8HGPH+m0nfKWTBCygEslfoX6bg=="], + + "@solana/offchain-messages": ["@solana/offchain-messages@8.5.0", "", { "dependencies": { "@solana/addresses": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/codecs-data-structures": "8.5.0", "@solana/codecs-numbers": "8.5.0", "@solana/codecs-strings": "8.5.0", "@solana/errors": "8.5.0", "@solana/keys": "8.5.0", "@solana/nominal-types": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-C7qBBD1Gfbdv99uoQnuc8XZYwttTQJOYEG2v6z7q3mAL03PN7zdItAlBa+M2tpeRKjTJObRYnUUJDfiIyyGD/Q=="], + + "@solana/options": ["@solana/options@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/codecs-data-structures": "8.5.0", "@solana/codecs-numbers": "8.5.0", "@solana/codecs-strings": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-Ron9FrWDkwxlmuI6D+NmrZZRngC1MUncglgyN77ThAoxDE1gGMOB88mQvEILeeqONeTA1rDg1uBvbewQcILp+w=="], + + "@solana/plugin-core": ["@solana/plugin-core@8.5.0", "", { "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-1zmh+UC47yxsZHleDpH4AEVkm9yXIATkWm8v33DJuXaqX3TQXMXuxP39cXAyObIQEpCG8DK8lyAeFTUrIFcDmA=="], - "@solana/errors": ["@solana/errors@2.3.0", "", { "dependencies": { "chalk": "^5.4.1", "commander": "^14.0.0" }, "peerDependencies": { "typescript": ">=5.3.3" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ=="], + "@solana/plugin-interfaces": ["@solana/plugin-interfaces@8.5.0", "", { "dependencies": { "@solana/accounts": "8.5.0", "@solana/addresses": "8.5.0", "@solana/instruction-plans": "8.5.0", "@solana/keys": "8.5.0", "@solana/rpc-spec": "8.5.0", "@solana/rpc-subscriptions-spec": "8.5.0", "@solana/rpc-types": "8.5.0", "@solana/signers": "8.5.0", "@solana/transactions": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-+s/+cCuzk23/a1ViTIugvXFYHN0txxmvqfuL4qx81NlmGawqEYws6xD+L02wNzJ5rbJeAaBhw2pUFStMfG4vYg=="], - "@solana/options": ["@solana/options@2.0.0-rc.1", "", { "dependencies": { "@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" } }, "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA=="], + "@solana/program-client-core": ["@solana/program-client-core@8.5.0", "", { "dependencies": { "@solana/accounts": "8.5.0", "@solana/addresses": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0", "@solana/instruction-plans": "8.5.0", "@solana/instructions": "8.5.0", "@solana/plugin-interfaces": "8.5.0", "@solana/rpc-api": "8.5.0", "@solana/signers": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-HJcnbuvQRcWOV3nTUjzgmQRIs0Of1973UU8uOvSEEW7rxycQwNxJ7fVgxQ5sYOCbT+7rlqqTkDeczvB7I4OwoA=="], - "@solana/spl-token": ["@solana/spl-token@0.4.14", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", "@solana/spl-token-group": "^0.0.7", "@solana/spl-token-metadata": "^0.1.6", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.95.5" } }, "sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA=="], + "@solana/programs": ["@solana/programs@8.5.0", "", { "dependencies": { "@solana/addresses": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-8PC2E/d5rwCRw1tFwQlpG65YDN56bYmPiBl99QqCP2RzhNdFJ/52xgFumL2G0uLfD3xsuFaWuOIGNxkyfXYm/Q=="], + + "@solana/promises": ["@solana/promises@8.5.0", "", { "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-qWJbU6RGuZVrtvsGZ+2F46jccaIZDX4czYRRhS3m38cCdE+wKMbqGvWND50xP7D9egOxYKHMqJAJbLQH4gspvQ=="], + + "@solana/rpc": ["@solana/rpc@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0", "@solana/fast-stable-stringify": "8.5.0", "@solana/functional": "8.5.0", "@solana/rpc-api": "8.5.0", "@solana/rpc-spec": "8.5.0", "@solana/rpc-spec-types": "8.5.0", "@solana/rpc-transformers": "8.5.0", "@solana/rpc-transport-http": "8.5.0", "@solana/rpc-types": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-7CQFNOMhXrY/LT0qdsi3h0chy4A/Ao93pyBLqFQqxzlub0st8dC5wl+MDXhkxaBos/DZOu1V4EleWv6qbLMlow=="], + + "@solana/rpc-api": ["@solana/rpc-api@8.5.0", "", { "dependencies": { "@solana/addresses": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/codecs-strings": "8.5.0", "@solana/errors": "8.5.0", "@solana/keys": "8.5.0", "@solana/rpc-parsed-types": "8.5.0", "@solana/rpc-spec": "8.5.0", "@solana/rpc-transformers": "8.5.0", "@solana/rpc-types": "8.5.0", "@solana/transaction-messages": "8.5.0", "@solana/transactions": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-qlRZ2yC8WEWNg3VX8UEqlZOitKZaeE6KWbn3A/ybtJAYz+mvr3RMDhnQ89RDqIuxPuAFZNV21BRJv3yB9xR44Q=="], + + "@solana/rpc-parsed-types": ["@solana/rpc-parsed-types@8.5.0", "", { "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-ktygZ019trgAyjr8y1GN1x4x6wJYw2Ola6UogAfJT5LoNs6kV3k84yCNAlGv34xRPqCVxlWo4nsIWJf8yWQQ2w=="], + + "@solana/rpc-spec": ["@solana/rpc-spec@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0", "@solana/rpc-spec-types": "8.5.0", "@solana/subscribable": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-0oET5yc880zFGqBMJE2UB7sxW8sIs4hmsP4bmkR2y4ipm1aScC5U+Rd8GaIrupBOVOFj+RXIorC7kQycN/9nhw=="], + + "@solana/rpc-spec-types": ["@solana/rpc-spec-types@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-YUTMKWWlHCGBmA1wxhIilbxJlad5vEsvc8dDO9VWr7GVkQUlipEU79iGaKk4xQ6Oo1mZWxpGz5mAJUqGraTK4A=="], + + "@solana/rpc-subscriptions": ["@solana/rpc-subscriptions@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0", "@solana/fast-stable-stringify": "8.5.0", "@solana/functional": "8.5.0", "@solana/promises": "8.5.0", "@solana/rpc-spec-types": "8.5.0", "@solana/rpc-subscriptions-api": "8.5.0", "@solana/rpc-subscriptions-channel-websocket": "8.5.0", "@solana/rpc-subscriptions-spec": "8.5.0", "@solana/rpc-transformers": "8.5.0", "@solana/rpc-types": "8.5.0", "@solana/subscribable": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-8hdWSDKKtMK3kRrR8TExwFo/bWHxVTu4zJ/JkePTQgNtm95kX25/hy+9JHKRtSsNUfXXYM60sQVE18cGgMU7dA=="], + + "@solana/rpc-subscriptions-api": ["@solana/rpc-subscriptions-api@8.5.0", "", { "dependencies": { "@solana/addresses": "8.5.0", "@solana/keys": "8.5.0", "@solana/rpc-subscriptions-spec": "8.5.0", "@solana/rpc-transformers": "8.5.0", "@solana/rpc-types": "8.5.0", "@solana/transaction-messages": "8.5.0", "@solana/transactions": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-PJaAyqZkpG8vuzdxmdWMwp1JS5pyZ6PuL8OMhx6nCt3phkseqIs1NmAf8pQc/RZjIV3hJMMVCwSDG1DE8DY64w=="], + + "@solana/rpc-subscriptions-channel-websocket": ["@solana/rpc-subscriptions-channel-websocket@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0", "@solana/functional": "8.5.0", "@solana/rpc-subscriptions-spec": "8.5.0", "@solana/subscribable": "8.5.0", "ws": "^8.21.3" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-sRYYwBFg31z77zfKpJBcAO9MaUWa+bO1PlBcDiToa4luXGuR3dC8TSpi1Yip4T4NCONNzK3yhyeI6sHhGHc8Qw=="], + + "@solana/rpc-subscriptions-spec": ["@solana/rpc-subscriptions-spec@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0", "@solana/promises": "8.5.0", "@solana/rpc-spec-types": "8.5.0", "@solana/subscribable": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-YdCPLHOcQWz8JhMaT/E+YC56nFDJ6D+XOTr6qRWHGe/1PIYGQDVvaFzI7+tF0b6tuv49GoMbpGdkiTX2v6KeUw=="], + + "@solana/rpc-transformers": ["@solana/rpc-transformers@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0", "@solana/functional": "8.5.0", "@solana/nominal-types": "8.5.0", "@solana/rpc-spec-types": "8.5.0", "@solana/rpc-types": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-JYq+EyfzJ1ksZubU9VHynQY1Z3k1tosdxG6KE4Cua/rFuXPosSn7o5h9FLLbSB5cTVcnj0lGNrBaVYW4AVK4iA=="], + + "@solana/rpc-transport-http": ["@solana/rpc-transport-http@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0", "@solana/rpc-spec": "8.5.0", "@solana/rpc-spec-types": "8.5.0", "undici-types": "^8.11.2" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-xfIFZa+oxXLgA6BXaE2bXjiy2yZM1qO1URzzF0lmTekJM/okS8EZAQwEicWpYkvfdHJZ2x/oagD3AOSBBCWrsw=="], + + "@solana/rpc-types": ["@solana/rpc-types@8.5.0", "", { "dependencies": { "@solana/addresses": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/codecs-numbers": "8.5.0", "@solana/codecs-strings": "8.5.0", "@solana/errors": "8.5.0", "@solana/fixed-points": "8.5.0", "@solana/nominal-types": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-L050pZqQ8gaFABF26NAYoatyZZeJo52AKvQQ3i58LRtUc6wcrpCF+4x4U/EDER2YVAc6Qx1xWvGnAomGhI6vzw=="], + + "@solana/signers": ["@solana/signers@8.5.0", "", { "dependencies": { "@solana/addresses": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0", "@solana/instructions": "8.5.0", "@solana/keys": "8.5.0", "@solana/nominal-types": "8.5.0", "@solana/offchain-messages": "8.5.0", "@solana/transaction-messages": "8.5.0", "@solana/transactions": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-F9VvFsG9Av+Sbs4mQpuVlszb6msujxnqKQqa4TsRT24GOqKOFr4Xvs7HqgVJV/BPIDnz7u0omUhUILesHJDfkQ=="], + + "@solana/spl-token": ["@solana/spl-token@0.4.15", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.3.0", "@solana/spl-token-group": "^0.0.7", "@solana/spl-token-metadata": "^0.1.6", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.95.5" } }, "sha512-3Lof3mNov8NVQ3PalIWb1Jgr/TZ6lYM+/sexv2TLqdhNFVth2OfWmH3d7QucgMjSbokkjNiNlRr6I8Fd269uaw=="], "@solana/spl-token-group": ["@solana/spl-token-group@0.0.7", "", { "dependencies": { "@solana/codecs": "2.0.0-rc.1" }, "peerDependencies": { "@solana/web3.js": "^1.95.3" } }, "sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug=="], "@solana/spl-token-metadata": ["@solana/spl-token-metadata@0.1.6", "", { "dependencies": { "@solana/codecs": "2.0.0-rc.1" }, "peerDependencies": { "@solana/web3.js": "^1.95.3" } }, "sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA=="], + "@solana/subscribable": ["@solana/subscribable@8.5.0", "", { "dependencies": { "@solana/errors": "8.5.0", "@solana/promises": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-v1/hL/l4kubwYVuaMNmtQcmTgDuKG6e9Hjv9fCxkYCdDIUERgmm9DX/So1386+6rkQBVRC7wTSH86Jq+RIqNGQ=="], + + "@solana/sysvars": ["@solana/sysvars@8.5.0", "", { "dependencies": { "@solana/accounts": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/codecs-data-structures": "8.5.0", "@solana/codecs-numbers": "8.5.0", "@solana/errors": "8.5.0", "@solana/rpc-types": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-vidKFEOAujEVizDUHFCmmIpHsS3Zu/fXJKcDUtbUn+bwD9Z1fRiper8rZW3Qdtgu1GmrH3O8MoyL2Nrp7k6QNw=="], + + "@solana/transaction-confirmation": ["@solana/transaction-confirmation@8.5.0", "", { "dependencies": { "@solana/addresses": "8.5.0", "@solana/codecs-strings": "8.5.0", "@solana/errors": "8.5.0", "@solana/keys": "8.5.0", "@solana/promises": "8.5.0", "@solana/rpc": "8.5.0", "@solana/rpc-subscriptions": "8.5.0", "@solana/rpc-types": "8.5.0", "@solana/transaction-messages": "8.5.0", "@solana/transactions": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-dUVHhyaJ9tt535ZJfgPAdKo6zycCAn1mqKKP/FYvCz/4FiAKnyvqj8rxd66yvvuJVhkpjbcPDDagm/P8JEYUug=="], + + "@solana/transaction-introspection": ["@solana/transaction-introspection@8.5.0", "", { "dependencies": { "@solana/addresses": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/codecs-strings": "8.5.0", "@solana/errors": "8.5.0", "@solana/instructions": "8.5.0", "@solana/rpc-types": "8.5.0", "@solana/transaction-messages": "8.5.0", "@solana/transactions": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-VPYVLcpieu5YwwC1wmh3zZ/KHWmqJWPS7iMPVpf90L79/1Dvkg+YYQHnVeN4VQdb7VFnfpTqUnSQpfERDk0Sag=="], + + "@solana/transaction-messages": ["@solana/transaction-messages@8.5.0", "", { "dependencies": { "@solana/addresses": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/codecs-data-structures": "8.5.0", "@solana/codecs-numbers": "8.5.0", "@solana/errors": "8.5.0", "@solana/functional": "8.5.0", "@solana/instructions": "8.5.0", "@solana/nominal-types": "8.5.0", "@solana/rpc-types": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-8SHxirU5K0kFmOwwD6XTGI5LWP/bLvLBDbemT4xDOaL+6xkLzlTMtzlgKb/Td5UtqyYOoew0FBVLJzJx/QApOw=="], + + "@solana/transactions": ["@solana/transactions@8.5.0", "", { "dependencies": { "@solana/addresses": "8.5.0", "@solana/codecs-core": "8.5.0", "@solana/codecs-data-structures": "8.5.0", "@solana/codecs-numbers": "8.5.0", "@solana/codecs-strings": "8.5.0", "@solana/errors": "8.5.0", "@solana/functional": "8.5.0", "@solana/instructions": "8.5.0", "@solana/keys": "8.5.0", "@solana/nominal-types": "8.5.0", "@solana/rpc-types": "8.5.0", "@solana/transaction-messages": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-IGRWI38rq5b94gy93wn/gVSQBuwNPSUv3GnWkd6R6Tc7jLbfRlYbYHJNHH5o28Fmlr+nlEn4bgu3BiqMWxuLmg=="], + "@solana/web3.js": ["@solana/web3.js@1.98.4", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "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.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw=="], "@swc/helpers": ["@swc/helpers@0.5.21", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg=="], @@ -135,7 +212,7 @@ "chai": ["chai@4.5.0", "", { "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", "deep-eql": "^4.1.3", "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", "type-detect": "^4.1.0" } }, "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw=="], - "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], "check-error": ["check-error@1.0.3", "", { "dependencies": { "get-func-name": "^2.0.2" } }, "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg=="], @@ -147,12 +224,10 @@ "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - "commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + "commander": ["commander@15.0.0", "", {}, "sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg=="], "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], - "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], - "debug": ["debug@4.3.3", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q=="], "decamelize": ["decamelize@4.0.0", "", {}, "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ=="], @@ -243,17 +318,19 @@ "json5": ["json5@1.0.2", "", { "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA=="], - "litesvm": ["litesvm@0.1.0", "", { "dependencies": { "@solana/web3.js": "^1.68.0", "bs58": "^4.0.1" }, "optionalDependencies": { "litesvm-darwin-arm64": "0.1.0", "litesvm-darwin-universal": "0.1.0", "litesvm-darwin-x64": "0.1.0", "litesvm-linux-x64-gnu": "0.1.0", "litesvm-linux-x64-musl": "0.1.0" } }, "sha512-XfpvWgYxFQUZxwFzWJTsuHRc1y34q8WtC60lhvH1xb6YX1/RBLqzIClp2JkxtlqGnDi/WPlThsXGmC3SinuPMQ=="], + "litesvm": ["litesvm@1.6.0", "", { "dependencies": { "@solana-program/system": "^0.14.0", "@solana-program/token": "^0.16.0", "@solana/kit": "^8.0.0" }, "optionalDependencies": { "litesvm-darwin-arm64": "1.6.0", "litesvm-darwin-x64": "1.6.0", "litesvm-linux-arm64-gnu": "1.6.0", "litesvm-linux-arm64-musl": "1.6.0", "litesvm-linux-x64-gnu": "1.6.0", "litesvm-linux-x64-musl": "1.6.0" } }, "sha512-DAe9CETZXKWebg6uTlt4gdLpOsvdwuyQC0WpHYPfkLnIDFmiM4qiW8ynF0FcUrHBFxZJb3/n7HtusZvxl8fsaw=="], - "litesvm-darwin-arm64": ["litesvm-darwin-arm64@0.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GwBph2fNaR9UP1nhFmQYk7UMcI9+ogrzpbDl2en70FUnPc+FDlchOts2X8IL5XFCU+m4ZGoQl/N9b+FywJN5lQ=="], + "litesvm-darwin-arm64": ["litesvm-darwin-arm64@1.6.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Fd5CS1NVXGXCHB1MhK1lPhrrwmLpCcK1YhVcy9fFJFzVoNFGBqlYwV7ORSaw8CNcga6z5XKLcVuWFBZAOmxf4Q=="], - "litesvm-darwin-universal": ["litesvm-darwin-universal@0.1.0", "", { "os": "darwin" }, "sha512-GjGpz77ei+RfWiMtHiES0X8GP+TafFHWu5fAQXgXEoGia7RG32Z12iJBhwfvk0T4EKbm8bqlyqhe5Me/nARm/w=="], + "litesvm-darwin-x64": ["litesvm-darwin-x64@1.6.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-945ujpieH10O5skQrno5Ws+wb9YKYDHJlA7mYOXScA+8sNwxO0g9bT78MtcoIxgKM4JbxKpwbf4Xf4x99A4Zcg=="], - "litesvm-darwin-x64": ["litesvm-darwin-x64@0.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-1N/IPfoT+gcpkvG9Wm7+vcaxgl/LB8hbm85cHDQRq4O1wyiRRiR6ByeNRamj+OFEDSfI7a/1NshhMobnnr2MGQ=="], + "litesvm-linux-arm64-gnu": ["litesvm-linux-arm64-gnu@1.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-3QtIubQlGW303e0fSAhiWunbwJxqOswKmEipJV3UQtKeQvQjswqZGCAxlh1AdkdqjjLbSNWa0Ys3FFbUXkSJAQ=="], - "litesvm-linux-x64-gnu": ["litesvm-linux-x64-gnu@0.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-S6krvRz6BXxVZIkap5XkWwulSG4KsbFrxjyqP1X0zANa8jWMHEd09Zy9pPgfOetni2exg67fBmSlWq4sRfzlCw=="], + "litesvm-linux-arm64-musl": ["litesvm-linux-arm64-musl@1.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-7rHwhjh8JG36bo5xpGQhKRslsWVo0bYhG6/p6MqSJP3qVh+e3n3gRonmWr/cGG9N56oBLMipYpTLISEpKIv0mA=="], - "litesvm-linux-x64-musl": ["litesvm-linux-x64-musl@0.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-3E9gC5HRCEHFsfUNDhAY9JKx6ou6JazlnYMhT89JgbAN/YsJmyEgkTfY6W7TVV90g4EAJ/K4smSmg+vV413mYQ=="], + "litesvm-linux-x64-gnu": ["litesvm-linux-x64-gnu@1.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-FaJCP9IPfWbKtiHjhAW5R3Bg1yDgIbEPj6qhJiKATLF7m7/t3zE86+kO+AM9bHVYdSXqUeWecSfjGRbytILZFQ=="], + + "litesvm-linux-x64-musl": ["litesvm-linux-x64-musl@1.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-oyx5Ic/ogDN4LYNv+Ow8MfCiIbkddP7fy6+DKfHwvBb5hvFe7ZAbScXh7aMSrKP6yNSdqtTz2+Z9K5zramoiKw=="], "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], @@ -351,6 +428,8 @@ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "undici-types": ["undici-types@8.12.3", "", {}, "sha512-EXE4ydL3S76dFb27UFjNVZHTyv/TLdATj/KUe29ptdcg6qXL48J2tZ3126E5kICj5jn781OR+XlVH1N6Mz8jbA=="], + "utf-8-validate": ["utf-8-validate@6.0.6", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA=="], "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], @@ -381,40 +460,44 @@ "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], - "@solana/codecs/@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="], + "@solana/codecs/@solana/codecs-numbers": ["@solana/codecs-numbers@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-6Vtf52rHzjf98ykejn9bNGMaQ2k1f4UMIa+BGMbBy4mIRQ5ggdI5oCAb3sZPfJcel2JQHwDlsLHCYdpqC+n6Mg=="], - "@solana/codecs/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], + "@solana/codecs-data-structures/@solana/codecs-numbers": ["@solana/codecs-numbers@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-6Vtf52rHzjf98ykejn9bNGMaQ2k1f4UMIa+BGMbBy4mIRQ5ggdI5oCAb3sZPfJcel2JQHwDlsLHCYdpqC+n6Mg=="], - "@solana/codecs-data-structures/@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="], + "@solana/codecs-numbers/@solana/codecs-core": ["@solana/codecs-core@2.3.0", "", { "dependencies": { "@solana/errors": "2.3.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw=="], - "@solana/codecs-data-structures/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], + "@solana/codecs-numbers/@solana/errors": ["@solana/errors@2.3.0", "", { "dependencies": { "chalk": "^5.4.1", "commander": "^14.0.0" }, "peerDependencies": { "typescript": ">=5.3.3" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ=="], - "@solana/codecs-data-structures/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + "@solana/codecs-strings/@solana/codecs-numbers": ["@solana/codecs-numbers@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-6Vtf52rHzjf98ykejn9bNGMaQ2k1f4UMIa+BGMbBy4mIRQ5ggdI5oCAb3sZPfJcel2JQHwDlsLHCYdpqC+n6Mg=="], - "@solana/codecs-strings/@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="], + "@solana/offchain-messages/@solana/codecs-numbers": ["@solana/codecs-numbers@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-6Vtf52rHzjf98ykejn9bNGMaQ2k1f4UMIa+BGMbBy4mIRQ5ggdI5oCAb3sZPfJcel2JQHwDlsLHCYdpqC+n6Mg=="], - "@solana/codecs-strings/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], + "@solana/options/@solana/codecs-numbers": ["@solana/codecs-numbers@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-6Vtf52rHzjf98ykejn9bNGMaQ2k1f4UMIa+BGMbBy4mIRQ5ggdI5oCAb3sZPfJcel2JQHwDlsLHCYdpqC+n6Mg=="], - "@solana/codecs-strings/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + "@solana/rpc-subscriptions-channel-websocket/ws": ["ws@8.22.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-Ydggc987+RO0AnWtZ/7Wq9FtNvcrL1b/RO0ud9mWjUPgDrsAAwQSF51sm2hm1XofbU/4jkpGEsLFsZZxU+1DOg=="], - "@solana/errors/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "@solana/rpc-types/@solana/codecs-numbers": ["@solana/codecs-numbers@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-6Vtf52rHzjf98ykejn9bNGMaQ2k1f4UMIa+BGMbBy4mIRQ5ggdI5oCAb3sZPfJcel2JQHwDlsLHCYdpqC+n6Mg=="], - "@solana/errors/commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], + "@solana/spl-token-group/@solana/codecs": ["@solana/codecs@2.0.0-rc.1", "", { "dependencies": { "@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" } }, "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ=="], - "@solana/options/@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="], + "@solana/spl-token-metadata/@solana/codecs": ["@solana/codecs@2.0.0-rc.1", "", { "dependencies": { "@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" } }, "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ=="], - "@solana/options/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], + "@solana/sysvars/@solana/codecs-numbers": ["@solana/codecs-numbers@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-6Vtf52rHzjf98ykejn9bNGMaQ2k1f4UMIa+BGMbBy4mIRQ5ggdI5oCAb3sZPfJcel2JQHwDlsLHCYdpqC+n6Mg=="], - "@solana/options/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + "@solana/transaction-messages/@solana/codecs-numbers": ["@solana/codecs-numbers@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-6Vtf52rHzjf98ykejn9bNGMaQ2k1f4UMIa+BGMbBy4mIRQ5ggdI5oCAb3sZPfJcel2JQHwDlsLHCYdpqC+n6Mg=="], - "@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + "@solana/transactions/@solana/codecs-numbers": ["@solana/codecs-numbers@8.5.0", "", { "dependencies": { "@solana/codecs-core": "8.5.0", "@solana/errors": "8.5.0" }, "peerDependencies": { "typescript": ">=5.4.0" }, "optionalPeers": ["typescript"] }, "sha512-6Vtf52rHzjf98ykejn9bNGMaQ2k1f4UMIa+BGMbBy4mIRQ5ggdI5oCAb3sZPfJcel2JQHwDlsLHCYdpqC+n6Mg=="], - "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], "debug/ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="], "glob/minimatch": ["minimatch@3.1.5", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w=="], + "jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "log-symbols/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + "rpc-websockets/@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], "rpc-websockets/eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], @@ -425,28 +508,68 @@ "ts-node/diff": ["diff@3.5.1", "", {}, "sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw=="], - "@solana/codecs-data-structures/@solana/errors/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "@solana/codecs-numbers/@solana/errors/commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="], + + "@solana/spl-token-group/@solana/codecs/@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="], + + "@solana/spl-token-group/@solana/codecs/@solana/codecs-data-structures": ["@solana/codecs-data-structures@2.0.0-rc.1", "", { "dependencies": { "@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" } }, "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog=="], + + "@solana/spl-token-group/@solana/codecs/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], + + "@solana/spl-token-group/@solana/codecs/@solana/codecs-strings": ["@solana/codecs-strings@2.0.0-rc.1", "", { "dependencies": { "@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", "typescript": ">=5" } }, "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g=="], + + "@solana/spl-token-group/@solana/codecs/@solana/options": ["@solana/options@2.0.0-rc.1", "", { "dependencies": { "@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" } }, "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA=="], + + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="], + + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-data-structures": ["@solana/codecs-data-structures@2.0.0-rc.1", "", { "dependencies": { "@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" } }, "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog=="], + + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], + + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-strings": ["@solana/codecs-strings@2.0.0-rc.1", "", { "dependencies": { "@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", "typescript": ">=5" } }, "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g=="], + + "@solana/spl-token-metadata/@solana/codecs/@solana/options": ["@solana/options@2.0.0-rc.1", "", { "dependencies": { "@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" } }, "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA=="], + + "log-symbols/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "@solana/spl-token-group/@solana/codecs/@solana/codecs-core/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/spl-token-group/@solana/codecs/@solana/codecs-data-structures/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/spl-token-group/@solana/codecs/@solana/codecs-numbers/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/spl-token-group/@solana/codecs/@solana/codecs-strings/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/spl-token-group/@solana/codecs/@solana/options/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-core/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-data-structures/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-numbers/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-strings/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], - "@solana/codecs-data-structures/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "@solana/spl-token-metadata/@solana/codecs/@solana/options/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], - "@solana/codecs-strings/@solana/errors/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "@solana/spl-token-group/@solana/codecs/@solana/codecs-core/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "@solana/codecs-strings/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "@solana/spl-token-group/@solana/codecs/@solana/codecs-data-structures/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "@solana/codecs/@solana/codecs-core/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + "@solana/spl-token-group/@solana/codecs/@solana/codecs-numbers/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "@solana/codecs/@solana/codecs-numbers/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + "@solana/spl-token-group/@solana/codecs/@solana/codecs-strings/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "@solana/options/@solana/errors/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "@solana/spl-token-group/@solana/codecs/@solana/options/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "@solana/options/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-core/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "@solana/codecs/@solana/codecs-core/@solana/errors/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-data-structures/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "@solana/codecs/@solana/codecs-core/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-numbers/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "@solana/codecs/@solana/codecs-numbers/@solana/errors/chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "@solana/spl-token-metadata/@solana/codecs/@solana/codecs-strings/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], - "@solana/codecs/@solana/codecs-numbers/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + "@solana/spl-token-metadata/@solana/codecs/@solana/options/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], } } diff --git a/package.json b/package.json index 3ecafc1..432067e 100644 --- a/package.json +++ b/package.json @@ -2,19 +2,21 @@ "type": "module", "license": "ISC", "scripts": { - "build": "anchor build --ignore-keys", + "build": "anchor build --ignore-keys --tools-version v1.57 --arch v3", "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check", - "test": "bun run build && bunx ts-mocha -p ./tsconfig.json -t 1000000 tests/*.test.ts" + "test": "bunx ts-mocha -p ./tsconfig.json -t 1000000 tests/*.test.ts", + "build-test": "bun run build && bun run test" }, "dependencies": { - "@anchor-lang/core": "^1.0.0", - "@solana/spl-token": "^0.4.13", + "@anchor-lang/core": "1.2.1", + "@solana/spl-token": "^0.4.15", "@solana/web3.js": "^1.98.2", "decimal.js": "^10.6.0", - "litesvm": "^0.1.0" + "litesvm": "1.6.0" }, "devDependencies": { + "@solana/kit": "^8.4.0", "@types/bn.js": "^5.1.0", "@types/chai": "^4.3.0", "@types/mocha": "^9.0.0", diff --git a/programs/dynamic-fee-sharing/Cargo.toml b/programs/dynamic-fee-sharing/Cargo.toml index 61ff6ae..ac6d806 100644 --- a/programs/dynamic-fee-sharing/Cargo.toml +++ b/programs/dynamic-fee-sharing/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dynamic-fee-sharing" -version = "0.1.2" +version = "0.1.3" description = "Created with Anchor" edition = "2021" diff --git a/programs/dynamic-fee-sharing/src/event.rs b/programs/dynamic-fee-sharing/src/event.rs index b75bde8..86677c6 100644 --- a/programs/dynamic-fee-sharing/src/event.rs +++ b/programs/dynamic-fee-sharing/src/event.rs @@ -20,6 +20,14 @@ pub struct EvtFundFee { pub payload: Vec, } +#[event] +pub struct EvtUpdateUserAddress { + pub fee_vault: Pubkey, + pub index: u8, + pub old_address: Pubkey, + pub new_address: Pubkey, +} + #[event] pub struct EvtClaimFee { pub fee_vault: Pubkey, diff --git a/programs/dynamic-fee-sharing/src/instructions/ix_update_user_address.rs b/programs/dynamic-fee-sharing/src/instructions/ix_update_user_address.rs new file mode 100644 index 0000000..c3e0344 --- /dev/null +++ b/programs/dynamic-fee-sharing/src/instructions/ix_update_user_address.rs @@ -0,0 +1,35 @@ +use anchor_lang::prelude::*; + +use crate::event::EvtUpdateUserAddress; +use crate::state::FeeVault; + +#[event_cpi] +#[derive(Accounts)] +pub struct UpdateUserAddressCtx<'info> { + #[account(mut)] + pub fee_vault: AccountLoader<'info, FeeVault>, + + /// the current address of the user at `index` + pub user: Signer<'info>, +} + +// Lets a user move its share to another address, e.g. to rotate to a new wallet or a multisig. +// Only the current address can sign, so this is not a recovery path once its key is compromised: +// whoever holds the key can update the address first. +pub fn handle_update_user_address( + ctx: Context, + index: u8, + new_address: Pubkey, +) -> Result<()> { + let mut fee_vault = ctx.accounts.fee_vault.load_mut()?; + let old_address = fee_vault.update_user_address(index, ctx.accounts.user.key, &new_address)?; + + emit_cpi!(EvtUpdateUserAddress { + fee_vault: ctx.accounts.fee_vault.key(), + index, + old_address, + new_address, + }); + + Ok(()) +} diff --git a/programs/dynamic-fee-sharing/src/instructions/mod.rs b/programs/dynamic-fee-sharing/src/instructions/mod.rs index 44af05a..960620f 100644 --- a/programs/dynamic-fee-sharing/src/instructions/mod.rs +++ b/programs/dynamic-fee-sharing/src/instructions/mod.rs @@ -8,3 +8,5 @@ pub mod ix_initialize_fee_vault_pda; pub use ix_initialize_fee_vault_pda::*; pub mod ix_fund_by_claiming_fee; pub use ix_fund_by_claiming_fee::*; +pub mod ix_update_user_address; +pub use ix_update_user_address::*; diff --git a/programs/dynamic-fee-sharing/src/lib.rs b/programs/dynamic-fee-sharing/src/lib.rs index f44c227..b290014 100644 --- a/programs/dynamic-fee-sharing/src/lib.rs +++ b/programs/dynamic-fee-sharing/src/lib.rs @@ -14,7 +14,7 @@ pub mod utils; pub mod tests; declare_id!("dfsdo2UqvwfN8DuUVrMRNfQe11VaiNoKcMqLHVvDPzh"); -#[program] +#[program(legacy_idl)] pub mod dynamic_fee_sharing { use super::*; pub fn initialize_fee_vault( @@ -45,4 +45,12 @@ pub mod dynamic_fee_sharing { pub fn claim_fee(ctx: Context, index: u8) -> Result<()> { instructions::handle_claim_fee(ctx, index) } + + pub fn update_user_address( + ctx: Context, + index: u8, + new_address: Pubkey, + ) -> Result<()> { + instructions::handle_update_user_address(ctx, index, new_address) + } } diff --git a/programs/dynamic-fee-sharing/src/state/fee_vault.rs b/programs/dynamic-fee-sharing/src/state/fee_vault.rs index a9c9519..5b1cc79 100644 --- a/programs/dynamic-fee-sharing/src/state/fee_vault.rs +++ b/programs/dynamic-fee-sharing/src/state/fee_vault.rs @@ -120,6 +120,31 @@ impl FeeVault { Ok(fee_being_claimed) } + /// Moves the user at `index` to `new_address`, signed by its current address. The share and the fee accounting + /// stay with the slot, so the fee not claimed yet goes to the new address. + /// It does not help once the current key is compromised: whoever holds that key can update the address too. + pub fn update_user_address( + &mut self, + index: u8, + signer: &Pubkey, + new_address: &Pubkey, + ) -> Result { + let user = self + .users + .get_mut(index as usize) + .ok_or_else(|| FeeVaultError::InvalidUserIndex)?; + require!(user.address.eq(signer), FeeVaultError::InvalidUserAddress); + require!( + new_address.ne(&Pubkey::default()) && new_address.ne(&user.address), + FeeVaultError::InvalidUserAddress + ); + + let old_address = user.address; + user.address = *new_address; + + Ok(old_address) + } + pub fn is_share_holder(&self, signer: &Pubkey) -> bool { self.users .iter() diff --git a/programs/dynamic-fee-sharing/src/tests/mod.rs b/programs/dynamic-fee-sharing/src/tests/mod.rs index a8db850..e61577d 100644 --- a/programs/dynamic-fee-sharing/src/tests/mod.rs +++ b/programs/dynamic-fee-sharing/src/tests/mod.rs @@ -1,2 +1,4 @@ #[cfg(test)] mod fund_fee; +#[cfg(test)] +mod update_user_address; diff --git a/programs/dynamic-fee-sharing/src/tests/update_user_address.rs b/programs/dynamic-fee-sharing/src/tests/update_user_address.rs new file mode 100644 index 0000000..f4c8a3f --- /dev/null +++ b/programs/dynamic-fee-sharing/src/tests/update_user_address.rs @@ -0,0 +1,95 @@ +use anchor_lang::prelude::*; + +use crate::{ + error::FeeVaultError, + state::{FeeVault, UserFee}, +}; + +fn fee_vault_with_users(addresses: &[Pubkey]) -> FeeVault { + let mut fee_vault = FeeVault { + total_share: 2_000, + ..Default::default() + }; + for (i, address) in addresses.iter().enumerate() { + fee_vault.users[i] = UserFee { + address: *address, + share: 1_000, + ..Default::default() + }; + } + fee_vault +} + +#[test] +fn test_update_user_address_keeps_the_pending_fee_with_the_slot() { + let (old_address, other, new_address) = ( + Pubkey::new_unique(), + Pubkey::new_unique(), + Pubkey::new_unique(), + ); + let mut fee_vault = fee_vault_with_users(&[old_address, other]); + fee_vault.fund_fee(1_000).unwrap(); + + // claim once, then fund again so some fee is pending + let claimed_before = fee_vault.validate_and_claim_fee(0, &old_address).unwrap(); + fee_vault.fund_fee(1_000).unwrap(); + + let returned = fee_vault + .update_user_address(0, &old_address, &new_address) + .unwrap(); + assert_eq!(returned, old_address); + assert_eq!(fee_vault.users[0].address, new_address); + assert_eq!(fee_vault.users[0].share, 1_000); + assert_eq!(fee_vault.users[0].fee_claimed, claimed_before); + + // the old address cannot claim anymore, the new one gets the pending fee + assert_eq!( + fee_vault + .validate_and_claim_fee(0, &old_address) + .unwrap_err(), + FeeVaultError::InvalidUserAddress.into() + ); + assert_eq!( + fee_vault.validate_and_claim_fee(0, &new_address).unwrap(), + 500 + ); + // the other user is untouched + assert_eq!(fee_vault.users[1].address, other); +} + +#[test] +fn test_update_user_address_rejects_a_signer_that_is_not_the_user() { + let (address, other) = (Pubkey::new_unique(), Pubkey::new_unique()); + let mut fee_vault = fee_vault_with_users(&[address, other]); + + // another share holder cannot move someone else's slot + assert_eq!( + fee_vault + .update_user_address(0, &other, &Pubkey::new_unique()) + .unwrap_err(), + FeeVaultError::InvalidUserAddress.into() + ); + assert_eq!(fee_vault.users[0].address, address); +} + +#[test] +fn test_update_user_address_rejects_an_invalid_new_address_or_index() { + let (address, other) = (Pubkey::new_unique(), Pubkey::new_unique()); + let mut fee_vault = fee_vault_with_users(&[address, other]); + + for new_address in [Pubkey::default(), address] { + assert_eq!( + fee_vault + .update_user_address(0, &address, &new_address) + .unwrap_err(), + FeeVaultError::InvalidUserAddress.into() + ); + } + assert_eq!( + fee_vault + .update_user_address(u8::MAX, &address, &Pubkey::new_unique()) + .unwrap_err(), + FeeVaultError::InvalidUserIndex.into() + ); + assert_eq!(fee_vault.users[0].address, address); +} diff --git a/rust-toolchain.toml b/rust-toolchain.toml index bf165c7..03b322a 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "1.93.0" \ No newline at end of file +channel = "1.95.0" \ No newline at end of file diff --git a/tests/claim_damm_v2.test.ts b/tests/claim_damm_v2.test.ts index e8ff3cd..5352b20 100644 --- a/tests/claim_damm_v2.test.ts +++ b/tests/claim_damm_v2.test.ts @@ -1,4 +1,4 @@ -import { LiteSVM } from "litesvm"; +import { LiteSVM } from "./common/litesvmCompat"; import { PublicKey, Keypair, Transaction } from "@solana/web3.js"; import { generateUsers, @@ -74,7 +74,7 @@ describe("Fund by claiming damm v2", () => { vaultOwner.publicKey, tokenBMint, { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users: [ { address: shareHolder.publicKey, @@ -149,7 +149,7 @@ describe("Fund by claiming damm v2", () => { vaultOwner.publicKey, rewardMint, { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users: [ { address: shareHolder.publicKey, @@ -226,7 +226,7 @@ describe("Fund by claiming damm v2", () => { vaultOwner.publicKey, rewardMint, { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users: [ { address: shareHolder.publicKey, diff --git a/tests/claim_dbc_creator_trading_fee.test.ts b/tests/claim_dbc_creator_trading_fee.test.ts index c8ec3ef..4f7624e 100644 --- a/tests/claim_dbc_creator_trading_fee.test.ts +++ b/tests/claim_dbc_creator_trading_fee.test.ts @@ -1,7 +1,7 @@ import { BN } from "bn.js"; import { Keypair, PublicKey } from "@solana/web3.js"; import { expect } from "chai"; -import { LiteSVM } from "litesvm"; +import { LiteSVM } from "./common/litesvmCompat"; import { generateUsers, getTokenBalance, startSvm } from "./common/svm"; import { createToken, getFeeVault, mintToken } from "./common"; import { @@ -56,7 +56,7 @@ describe("Funding by claiming in DBC", () => { vaultOwner.publicKey, quoteMint, { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users: [ { address: shareHolder.publicKey, @@ -115,7 +115,7 @@ describe("Funding by claiming in DBC", () => { vaultOwner.publicKey, quoteMint, { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users: [ { address: shareHolder.publicKey, @@ -175,7 +175,7 @@ describe("Funding by claiming in DBC", () => { vaultOwner.publicKey, quoteMint, { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users: [ { address: shareHolder.publicKey, @@ -234,7 +234,7 @@ describe("Funding by claiming in DBC", () => { vaultOwner.publicKey, quoteMint, { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users: [ { address: shareHolder.publicKey, @@ -295,7 +295,7 @@ describe("Funding by claiming in DBC", () => { vaultOwner.publicKey, quoteMint, { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users: [ { address: shareHolder.publicKey, @@ -355,7 +355,7 @@ describe("Funding by claiming in DBC", () => { vaultOwner.publicKey, quoteMint, { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users: [ { address: shareHolder.publicKey, @@ -414,7 +414,7 @@ describe("Funding by claiming in DBC", () => { vaultOwner.publicKey, quoteMint, { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users: [ { address: shareHolder.publicKey, diff --git a/tests/common/damm_v2.ts b/tests/common/damm_v2.ts index f85f9b8..9354ddb 100644 --- a/tests/common/damm_v2.ts +++ b/tests/common/damm_v2.ts @@ -15,7 +15,7 @@ import { PublicKey, Transaction, } from "@solana/web3.js"; -import { LiteSVM } from "litesvm"; +import { LiteSVM } from "./litesvmCompat"; import { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID, diff --git a/tests/common/dbc.ts b/tests/common/dbc.ts index cddb29b..6b99e09 100644 --- a/tests/common/dbc.ts +++ b/tests/common/dbc.ts @@ -17,7 +17,7 @@ import { SYSVAR_INSTRUCTIONS_PUBKEY, TransactionInstruction, } from "@solana/web3.js"; -import { LiteSVM } from "litesvm"; +import { LiteSVM } from "./litesvmCompat"; import { getAssociatedTokenAddressSync, NATIVE_MINT, @@ -497,7 +497,7 @@ export function buildDefaultCurve(): ConfigParameters { }, enableFirstSwapWithMinFee: false, compoundingFeeBps: 0, - padding: [], + padding: [0, 0], // [u8; 2] curve, }; return instructionParams; diff --git a/tests/common/dfs.ts b/tests/common/dfs.ts index 313e039..a01601c 100644 --- a/tests/common/dfs.ts +++ b/tests/common/dfs.ts @@ -10,7 +10,7 @@ import { InitializeFeeVaultParameters, U64_MAX, } from "."; -import { LiteSVM } from "litesvm"; +import { LiteSVM } from "./litesvmCompat"; import { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID, diff --git a/tests/common/index.ts b/tests/common/index.ts index 3d09f3d..8a8004b 100644 --- a/tests/common/index.ts +++ b/tests/common/index.ts @@ -6,11 +6,8 @@ import { Program, Wallet, } from "@anchor-lang/core"; -import { - FailedTransactionMetadata, - LiteSVM, - TransactionMetadata, -} from "litesvm"; +import { FailedTransactionMetadata, TransactionMetadata } from "litesvm"; +import { LiteSVM } from "./litesvmCompat"; import DynamicFeeSharingIDL from "../../target/idl/dynamic_fee_sharing.json"; import { DynamicFeeSharing } from "../../target/types/dynamic_fee_sharing"; diff --git a/tests/common/litesvmCompat.ts b/tests/common/litesvmCompat.ts new file mode 100644 index 0000000..33092cb --- /dev/null +++ b/tests/common/litesvmCompat.ts @@ -0,0 +1,108 @@ +import { + address, + getTransactionDecoder, + lamports as toLamports, + type Address, + type EncodedAccount, +} from "@solana/kit"; +import { + AccountInfo, + PublicKey, + Transaction, + VersionedTransaction, +} from "@solana/web3.js"; +import { + Clock, + FailedTransactionMetadata, + LiteSVM as KitLiteSVM, + Rent, + TransactionMetadata, +} from "litesvm"; + +export type AccountInfoBytes = AccountInfo; + +function toAddress(pubkey: PublicKey): Address { + return address(pubkey.toBase58()); +} + +/** + * litesvm 1.x takes and returns `@solana/kit` types (`Address`, `EncodedAccount`, kit + * `Transaction`). The test suite is written against `@solana/web3.js`, so this wrapper keeps the + * litesvm 0.x method signatures and converts between the two type systems at the boundary. + * Only the methods the tests call are exposed. + */ +export class LiteSVM { + private readonly inner: KitLiteSVM; + + constructor() { + this.inner = new KitLiteSVM(); + } + + // Returns `null` when the account does not exist, which matches litesvm 0.x + getAccount(pubkey: PublicKey): AccountInfoBytes | null { + const account = this.inner.getAccount(toAddress(pubkey)); + if (!account.exists) { + return null; + } + return { + data: new Uint8Array(account.data), + executable: account.executable, + lamports: Number(account.lamports), + owner: new PublicKey(account.programAddress), + }; + } + + setAccount(pubkey: PublicKey, info: AccountInfoBytes): void { + const account: EncodedAccount = { + address: toAddress(pubkey), + data: info.data, + executable: info.executable, + lamports: toLamports(BigInt(info.lamports)), + programAddress: toAddress(info.owner), + space: BigInt(info.data.length), + }; + this.inner.setAccount(account); + } + + airdrop( + pubkey: PublicKey, + amount: bigint + ): TransactionMetadata | FailedTransactionMetadata | null { + return this.inner.airdrop(toAddress(pubkey), toLamports(amount)); + } + + addProgramFromFile(programId: PublicKey, path: string): void { + this.inner.addProgramFromFile(toAddress(programId), path); + } + + sendTransaction( + tx: Transaction | VersionedTransaction + ): TransactionMetadata | FailedTransactionMetadata { + const wire = tx.serialize(); + return this.inner.sendTransaction(getTransactionDecoder().decode(wire)); + } + + latestBlockhash(): string { + return this.inner.latestBlockhash(); + } + + expireBlockhash(): void { + this.inner.expireBlockhash(); + } + + warpToSlot(slot: bigint): void { + this.inner.warpToSlot(slot); + } + + getClock(): Clock { + return this.inner.getClock(); + } + + setClock(clock: Clock): void { + this.inner.setClock(clock); + } + + getRent(): Rent { + return this.inner.getRent(); + } +} diff --git a/tests/common/svm.ts b/tests/common/svm.ts index db57ca3..726b8b5 100644 --- a/tests/common/svm.ts +++ b/tests/common/svm.ts @@ -6,12 +6,8 @@ import { Transaction, } from "@solana/web3.js"; -import { - AccountInfoBytes, - FailedTransactionMetadata, - LiteSVM, - TransactionMetadata, -} from "litesvm"; +import { FailedTransactionMetadata, TransactionMetadata } from "litesvm"; +import { AccountInfoBytes, LiteSVM } from "./litesvmCompat"; import { DYNAMIC_FEE_SHARING_PROGRAM_ID } from "./index"; import { expect } from "chai"; import BN from "bn.js"; diff --git a/tests/fee_sharing.test.ts b/tests/fee_sharing.test.ts index 80bb53f..aedaa14 100644 --- a/tests/fee_sharing.test.ts +++ b/tests/fee_sharing.test.ts @@ -1,4 +1,5 @@ -import { LiteSVM, TransactionMetadata } from "litesvm"; +import { TransactionMetadata } from "litesvm"; +import { LiteSVM } from "./common/litesvmCompat"; import { PublicKey, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js"; import { createProgram, @@ -66,7 +67,7 @@ describe("Fee vault sharing", () => { }); const params: InitializeFeeVaultParameters = { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users, }; @@ -98,7 +99,7 @@ describe("Fee vault sharing", () => { const users = []; const params: InitializeFeeVaultParameters = { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users, }; @@ -136,7 +137,7 @@ describe("Fee vault sharing", () => { }); const params: InitializeFeeVaultParameters = { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users, }; diff --git a/tests/fee_sharing_pda.test.ts b/tests/fee_sharing_pda.test.ts index ef79ae0..60f447f 100644 --- a/tests/fee_sharing_pda.test.ts +++ b/tests/fee_sharing_pda.test.ts @@ -1,4 +1,5 @@ -import { LiteSVM, TransactionMetadata } from "litesvm"; +import { TransactionMetadata } from "litesvm"; +import { LiteSVM } from "./common/litesvmCompat"; import { PublicKey, Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js"; import { createProgram, @@ -67,7 +68,7 @@ describe("Fee vault pda sharing", () => { }); const params: InitializeFeeVaultParameters = { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users, }; @@ -101,7 +102,7 @@ describe("Fee vault pda sharing", () => { const users = []; const params: InitializeFeeVaultParameters = { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users, }; const baseKp = Keypair.generate(); @@ -140,7 +141,7 @@ describe("Fee vault pda sharing", () => { }); const params: InitializeFeeVaultParameters = { - padding: [], + padding: new Array(8).fill(new BN(0)), // [u64; 8] users, }; diff --git a/tests/update_user_address.test.ts b/tests/update_user_address.test.ts new file mode 100644 index 0000000..39eb9fe --- /dev/null +++ b/tests/update_user_address.test.ts @@ -0,0 +1,205 @@ +import { TransactionMetadata } from "litesvm"; +import { LiteSVM } from "./common/litesvmCompat"; +import { + PublicKey, + Keypair, + LAMPORTS_PER_SOL, + Transaction, +} from "@solana/web3.js"; +import { + createProgram, + createToken, + deriveFeeVaultAuthorityAddress, + deriveTokenVaultAddress, + expectThrowsErrorCode, + getFeeVault, + getOrCreateAtA, + getProgramErrorCodeHexString, + InitializeFeeVaultParameters, + mintToken, + TOKEN_DECIMALS, +} from "./common"; +import { getTokenBalance } from "./common/svm"; +import { BN } from "@anchor-lang/core"; +import { + getAssociatedTokenAddressSync, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; +import { expect } from "chai"; + +import DynamicFeeSharingIDL from "../target/idl/dynamic_fee_sharing.json"; + +describe("Update user address", () => { + const program = createProgram(); + let svm: LiteSVM; + let admin: Keypair; + let funder: Keypair; + let tokenMint: PublicKey; + let users: Keypair[]; + let feeVault: PublicKey; + let tokenVault: PublicKey; + + function send(tx: Transaction, signers: Keypair[]) { + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(...signers); + const result = svm.sendTransaction(tx); + svm.expireBlockhash(); + return result; + } + + async function fundFee(amount: BN) { + const tx = await program.methods + .fundFee(amount) + .accountsPartial({ + feeVault, + tokenVault, + tokenMint, + fundTokenVault: getAssociatedTokenAddressSync( + tokenMint, + funder.publicKey + ), + funder: funder.publicKey, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .transaction(); + expect(send(tx, [funder])).instanceOf(TransactionMetadata); + } + + async function claimFee(index: number, signer: Keypair) { + const userTokenVault = getOrCreateAtA( + svm, + signer, + tokenMint, + signer.publicKey + ); + const tx = await program.methods + .claimFee(index) + .accountsPartial({ + feeVault, + tokenMint, + tokenVault, + userTokenVault, + user: signer.publicKey, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .transaction(); + return { result: send(tx, [signer]), userTokenVault }; + } + + async function updateUserAddress( + index: number, + signer: Keypair, + newAddress: PublicKey + ) { + const tx = await program.methods + .updateUserAddress(index, newAddress) + .accountsPartial({ feeVault, user: signer.publicKey }) + .transaction(); + return send(tx, [signer]); + } + + beforeEach(async () => { + svm = new LiteSVM(); + svm.addProgramFromFile( + new PublicKey(DynamicFeeSharingIDL.address), + "./target/deploy/dynamic_fee_sharing.so" + ); + + admin = Keypair.generate(); + funder = Keypair.generate(); + users = [Keypair.generate(), Keypair.generate()]; + for (const kp of [admin, funder, ...users]) { + svm.airdrop(kp.publicKey, BigInt(LAMPORTS_PER_SOL)); + } + + tokenMint = createToken(svm, admin, admin.publicKey, null); + mintToken(svm, admin, tokenMint, admin, funder.publicKey); + + const params: InitializeFeeVaultParameters = { + padding: new Array(8).fill(new BN(0)), // [u64; 8] + users: users.map((user) => ({ address: user.publicKey, share: 1000 })), + }; + const feeVaultKp = Keypair.generate(); + feeVault = feeVaultKp.publicKey; + tokenVault = deriveTokenVaultAddress(feeVault); + const tx = await program.methods + .initializeFeeVault(params) + .accountsPartial({ + feeVault, + feeVaultAuthority: deriveFeeVaultAuthorityAddress(), + tokenVault, + tokenMint, + owner: admin.publicKey, + payer: admin.publicKey, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .transaction(); + expect(send(tx, [admin, feeVaultKp])).instanceOf(TransactionMetadata); + }); + + it("moves the share and the pending fee to the new address", async () => { + const newOwner = Keypair.generate(); + svm.airdrop(newOwner.publicKey, BigInt(LAMPORTS_PER_SOL)); + const fundAmount = new BN(1_000 * 10 ** TOKEN_DECIMALS); + await fundFee(fundAmount); + + expect(await updateUserAddress(0, users[0], newOwner.publicKey)).instanceOf( + TransactionMetadata + ); + + const user = getFeeVault(svm, feeVault).users[0]; + expect(user.address.equals(newOwner.publicKey)).to.be.true; + expect(user.share).eq(1000); + expect(user.feeClaimed.isZero()).to.be.true; + + // the old address cannot claim anymore + const invalidUserAddress = + getProgramErrorCodeHexString("InvalidUserAddress"); + expectThrowsErrorCode( + (await claimFee(0, users[0])).result, + invalidUserAddress + ); + + // the new address claims the fee funded before the update: half of it + const { result, userTokenVault } = await claimFee(0, newOwner); + expect(result).instanceOf(TransactionMetadata); + expect(getTokenBalance(svm, userTokenVault).toString()).eq( + fundAmount.divn(2).toString() + ); + + // the other user is untouched + expect( + getFeeVault(svm, feeVault).users[1].address.equals(users[1].publicKey) + ).to.be.true; + }); + + it("rejects a signer that is not the user at the index", async () => { + const invalidUserAddress = + getProgramErrorCodeHexString("InvalidUserAddress"); + // another share holder cannot move someone else's slot + expectThrowsErrorCode( + await updateUserAddress(0, users[1], Keypair.generate().publicKey), + invalidUserAddress + ); + expect( + getFeeVault(svm, feeVault).users[0].address.equals(users[0].publicKey) + ).to.be.true; + }); + + it("rejects the default or the same address, and an invalid index", async () => { + const invalidUserAddress = + getProgramErrorCodeHexString("InvalidUserAddress"); + expectThrowsErrorCode( + await updateUserAddress(0, users[0], PublicKey.default), + invalidUserAddress + ); + expectThrowsErrorCode( + await updateUserAddress(0, users[0], users[0].publicKey), + invalidUserAddress + ); + expectThrowsErrorCode( + await updateUserAddress(255, users[0], Keypair.generate().publicKey), + getProgramErrorCodeHexString("InvalidUserIndex") + ); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index e5e8218..67becf2 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,7 @@ "target": "es6", "esModuleInterop": true, "resolveJsonModule": true, + "skipLibCheck": true, "strictNullChecks": false, "noImplicitAny": false }