From 8fe00ede7dffedfb417ab5d62ba762227bb3e481 Mon Sep 17 00:00:00 2001 From: Mike MacCana Date: Tue, 7 Apr 2026 00:35:00 +0000 Subject: [PATCH] Migrate to Anchor 1.0, Rust LiteSVM tests with solana-kite 0.3.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replaces all TypeScript Anchor tests with Rust LiteSVM tests powered by solana-kite (https://crates.io/crates/solana-kite). Kite consolidates repeated test boilerplate — account creation, token minting, PDA derivation, balance assertions — into reusable functions. The result: 46 Rust test files averaging just 148 lines each, replacing ~13,700 lines of TypeScript tests and 109 per-project config files (package.json, tsconfig, pnpm-lock.yaml). No more per-project npm dependencies for Anchor tests. ### Anchor 1.0.0 (stable) - Migrate all 49 Anchor programs from 0.32.1 → 1.0.0 (stable, released 2026-04-02) - @coral-xyz/anchor → @anchor-lang/core in TypeScript - CpiContext::new() .to_account_info() → .key() in Rust - Transfer-hook: .map_err() wrappers for SPL 2.x→3.x ProgramError bridge - transfer-cost: upgraded SPL crates to Solana 3.x, Box for stack overflow - Compression: replaced mpl-bubblegum CPI with raw invoke() (no Solana 3.x release) ### Rust LiteSVM tests with solana-kite 0.3.0 - 46 Anchor programs now have Rust integration tests (~6,800 lines total) - solana-kite replaces hundreds of lines of duplicated setup code per test: create_funded_keypair, create_token_mint, mint_tokens_to_token_account, get_pda, get_token_balance — all one-liners instead of 20+ line helpers - Eliminates 109 per-project boilerplate files (package.json, tsconfig, pnpm-lock) - Net deletion: ~6,900 lines of TypeScript test code removed ### Repo cleanup - Configure biome, fix all lint errors - Remove yarn.lock (project uses pnpm) - Add pnpm/action-setup to CI workflows - Upgrade litesvm from 0.8.1 to 0.11.0 - Use 🤥 emoji for Pinocchio (lying face / growing nose) 691 files changed, +21,837 / -17,091 --- .github/workflows/anchor.yml | 2 + .github/workflows/rust.yml | 2 + .github/workflows/solana-native.yml | 6 +- .github/workflows/solana-pinocchio.yml | 6 +- .github/workflows/typescript.yml | 31 + .gitignore | 4 +- .vscode/settings.json | 4 + Cargo.lock | 458 ++- Cargo.toml | 2 +- README.md | 2 +- basics/account-data/anchor/Anchor.toml | 13 +- basics/account-data/anchor/package.json | 17 - basics/account-data/anchor/pnpm-lock.yaml | 1463 -------- .../anchor-program-example/Cargo.toml | 10 +- .../anchor-program-example/src/lib.rs | 2 +- .../tests/test_account_data.rs | 66 + .../account-data/anchor/tests/litesvm.test.ts | 110 - basics/account-data/anchor/tests/test.ts | 51 - basics/account-data/anchor/tsconfig.json | 10 - basics/account-data/native/program/Cargo.toml | 2 +- basics/account-data/native/tests/test.ts | 118 +- .../account-data/pinocchio/program/Cargo.toml | 2 +- .../pinocchio/tests/index.test.ts | 237 +- basics/checking-accounts/anchor/Anchor.toml | 12 +- basics/checking-accounts/anchor/package.json | 32 +- .../checking-accounts/anchor/pnpm-lock.yaml | 26 +- .../anchor-program-example/Cargo.toml | 10 +- .../anchor-program-example/src/lib.rs | 2 +- .../tests/test_checking_accounts.rs | 61 + .../anchor/tests/bankrun.test.ts | 95 +- basics/checking-accounts/anchor/tests/test.ts | 71 +- .../native/program/Cargo.toml | 2 +- basics/checking-accounts/native/tests/test.ts | 14 +- .../pinocchio/program/Cargo.toml | 2 +- .../checking-accounts/pinocchio/tests/test.ts | 13 +- basics/close-account/anchor/Anchor.toml | 12 +- .../close-account/anchor/migrations/deploy.ts | 2 +- basics/close-account/anchor/package.json | 42 +- basics/close-account/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/close-account/Cargo.toml | 9 +- .../anchor/programs/close-account/src/lib.rs | 2 +- .../close-account/tests/test_close_account.rs | 71 + .../anchor/tests/litesvm.test.ts | 156 +- basics/close-account/anchor/tests/test.ts | 91 +- basics/close-account/anchor/tsconfig.json | 16 +- .../close-account/native/program/Cargo.toml | 2 +- .../native/tests/close-account.test.ts | 23 +- basics/close-account/native/ts/index.ts | 4 +- .../native/ts/instructions/close.ts | 18 +- .../native/ts/instructions/create.ts | 21 +- basics/close-account/native/ts/state/index.ts | 8 +- .../pinocchio/program/Cargo.toml | 2 +- .../pinocchio/tests/close-account.test.ts | 4 +- basics/counter/anchor/Anchor.toml | 12 +- basics/counter/anchor/migrations/deploy.ts | 2 +- basics/counter/anchor/package.json | 22 - basics/counter/anchor/pnpm-lock.yaml | 1476 --------- .../anchor/programs/counter_anchor/Cargo.toml | 10 +- .../anchor/programs/counter_anchor/src/lib.rs | 2 +- .../counter_anchor/tests/test_counter.rs | 143 + basics/counter/anchor/tests/litesvm.test.ts | 121 - basics/counter/anchor/tests/test.ts | 63 - basics/counter/anchor/tsconfig.json | 10 - basics/counter/mpl-stack/.solitarc.js | 14 +- basics/counter/mpl-stack/jest.config.js | 6 +- .../counter/mpl-stack/tests/counter.test.ts | 42 +- .../ts/generated/accounts/Counter.ts | 23 +- .../mpl-stack/ts/generated/accounts/index.ts | 4 +- .../counter/mpl-stack/ts/generated/index.ts | 8 +- .../ts/generated/instructions/Increment.ts | 8 +- .../ts/generated/instructions/index.ts | 2 +- basics/counter/mpl-stack/ts/index.ts | 2 +- basics/counter/native/program/Cargo.toml | 2 +- basics/counter/native/tests/counter.test.ts | 30 +- basics/counter/native/ts/accounts/counter.ts | 6 +- basics/counter/native/ts/accounts/index.ts | 2 +- basics/counter/native/ts/index.ts | 8 +- .../createIncrementInstruction.ts | 4 +- .../counter/native/ts/instructions/index.ts | 2 +- basics/counter/pinocchio/program/Cargo.toml | 2 +- .../counter/pinocchio/tests/counter.test.ts | 10 +- basics/create-account/anchor/Anchor.toml | 12 +- basics/create-account/anchor/package.json | 17 - basics/create-account/anchor/pnpm-lock.yaml | 1466 --------- .../programs/create-system-account/Cargo.toml | 9 +- .../programs/create-system-account/src/lib.rs | 2 +- .../tests/test_create_account.rs | 46 + .../anchor/tests/litesvm.test.ts | 64 - basics/create-account/anchor/tests/test.ts | 34 - basics/create-account/anchor/tsconfig.json | 10 - .../create-account/native/program/Cargo.toml | 2 +- basics/create-account/native/tests/test.ts | 21 +- .../pinocchio/program/Cargo.toml | 2 +- basics/create-account/pinocchio/tests/test.ts | 9 +- .../anchor/Anchor.toml | 12 +- .../anchor/idls/lever.json | 2 +- .../anchor/migrations/deploy.ts | 2 +- .../anchor/package.json | 40 +- .../anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/hand/Cargo.toml | 10 +- .../anchor/programs/hand/src/lib.rs | 2 +- .../anchor/programs/hand/tests/test_hand.rs | 122 + .../anchor/programs/lever/Cargo.toml | 9 +- .../anchor/programs/lever/src/lib.rs | 2 +- .../anchor/programs/lever/tests/test_lever.rs | 124 + .../anchor/tests/litesvm.test.ts | 271 +- .../anchor/tests/test.ts | 117 +- .../anchor/tsconfig.json | 16 +- .../native/programs/hand/Cargo.toml | 2 +- .../native/tests/test.ts | 39 +- basics/favorites/anchor/Anchor.toml | 10 +- basics/favorites/anchor/migrations/deploy.ts | 2 +- basics/favorites/anchor/package.json | 42 +- basics/favorites/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/favorites/Cargo.toml | 8 +- .../anchor/programs/favorites/src/lib.rs | 2 +- .../favorites/tests/test_favorites.rs | 163 + basics/favorites/anchor/tests/litesvm.test.ts | 257 +- basics/favorites/anchor/tests/test.ts | 134 +- basics/favorites/anchor/tsconfig.json | 16 +- basics/favorites/native/program/Cargo.toml | 2 +- basics/favorites/native/tests/test.ts | 10 +- basics/favorites/pinocchio/program/Cargo.toml | 2 +- basics/favorites/pinocchio/tests/test.ts | 14 +- basics/hello-solana/anchor/Anchor.toml | 12 +- basics/hello-solana/anchor/package.json | 17 - basics/hello-solana/anchor/pnpm-lock.yaml | 1466 --------- .../anchor/programs/hello-solana/Cargo.toml | 8 +- .../anchor/programs/hello-solana/src/lib.rs | 2 +- .../programs/hello-solana/tests/test_hello.rs | 24 + .../hello-solana/anchor/tests/litesvm.test.ts | 55 - basics/hello-solana/anchor/tests/test.ts | 17 - basics/hello-solana/anchor/tsconfig.json | 10 - basics/hello-solana/native/program/Cargo.toml | 2 +- .../hello-solana/native/tests/index.test.ts | 16 +- .../pinocchio/tests/index.test.ts | 16 +- basics/pda-rent-payer/anchor/Anchor.toml | 12 +- basics/pda-rent-payer/anchor/package.json | 30 +- basics/pda-rent-payer/anchor/pnpm-lock.yaml | 26 +- .../anchor-program-example/Cargo.toml | 9 +- .../anchor-program-example/src/lib.rs | 2 +- .../tests/test_pda_rent_payer.rs | 112 + .../anchor/tests/litesvm.test.ts | 138 +- basics/pda-rent-payer/anchor/tests/test.ts | 92 +- basics/pda-rent-payer/anchor/tsconfig.json | 16 +- basics/pda-rent-payer/native/tests/test.ts | 18 +- basics/pda-rent-payer/pinocchio/tests/test.ts | 12 +- .../anchor/Anchor.toml | 12 +- .../anchor/package.json | 30 +- .../anchor/pnpm-lock.yaml | 26 +- .../processing-instructions/Cargo.toml | 9 +- .../processing-instructions/src/lib.rs | 2 +- .../tests/test_processing_instructions.rs | 49 + .../anchor/tests/litesvm.test.ts | 130 +- .../anchor/tests/test.ts | 12 +- .../anchor/tsconfig.json | 16 +- .../native/program/Cargo.toml | 2 +- .../native/tests/test.ts | 30 +- .../pinocchio/program/Cargo.toml | 2 +- .../pinocchio/tests/test.ts | 10 +- .../anchor/Anchor.toml | 12 +- .../anchor/package.json | 30 +- .../anchor/pnpm-lock.yaml | 26 +- .../anchor-program-example/Cargo.toml | 10 +- .../anchor-program-example/src/lib.rs | 2 +- .../tests/test_program_derived_addresses.rs | 100 + .../anchor/tests/litesvm.test.ts | 206 +- .../anchor/tests/test.ts | 93 +- .../anchor/tsconfig.json | 16 +- .../native/program/Cargo.toml | 2 +- .../native/tests/test.ts | 48 +- .../pinocchio/program/Cargo.toml | 2 +- .../pinocchio/tests/test.ts | 12 +- basics/realloc/anchor/Anchor.toml | 12 +- basics/realloc/anchor/migrations/deploy.ts | 2 +- basics/realloc/anchor/package.json | 40 +- basics/realloc/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/anchor-realloc/Cargo.toml | 10 +- .../anchor/programs/anchor-realloc/src/lib.rs | 2 +- .../anchor-realloc/tests/test_realloc.rs | 177 + basics/realloc/anchor/tests/litesvm.test.ts | 192 +- basics/realloc/anchor/tests/test.ts | 102 +- basics/realloc/anchor/tsconfig.json | 16 +- basics/realloc/native/program/Cargo.toml | 2 +- basics/realloc/native/tests/realloc.test.ts | 52 +- basics/realloc/native/ts/index.ts | 14 +- .../realloc/native/ts/instructions/create.ts | 20 +- .../realloc/native/ts/instructions/index.ts | 6 +- .../native/ts/instructions/reallocate.ts | 28 +- .../realloc/native/ts/state/address-info.ts | 14 +- .../native/ts/state/enhanced-address-info.ts | 18 +- basics/realloc/native/ts/state/index.ts | 6 +- basics/realloc/native/ts/state/work-info.ts | 14 +- basics/realloc/native/ts/util/index.ts | 2 +- basics/realloc/native/ts/util/util.ts | 4 +- basics/realloc/pinocchio/program/Cargo.toml | 2 +- .../realloc/pinocchio/tests/realloc.test.ts | 4 +- basics/rent/anchor/Anchor.toml | 12 +- basics/rent/anchor/package.json | 30 +- basics/rent/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/rent-example/Cargo.toml | 10 +- .../anchor/programs/rent-example/src/lib.rs | 2 +- .../programs/rent-example/tests/test_rent.rs | 76 + basics/rent/anchor/tests/litesvm.test.ts | 106 +- basics/rent/anchor/tests/test.ts | 54 +- basics/rent/anchor/tsconfig.json | 16 +- basics/rent/native/program/Cargo.toml | 2 +- basics/rent/native/tests/test.ts | 24 +- basics/rent/pinocchio/program/Cargo.toml | 2 +- basics/rent/pinocchio/tests/test.ts | 3 +- basics/repository-layout/anchor/Anchor.toml | 12 +- basics/repository-layout/anchor/package.json | 30 +- .../repository-layout/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/carnival/Cargo.toml | 9 +- .../anchor/programs/carnival/src/lib.rs | 2 +- .../programs/carnival/tests/test_carnival.rs | 115 + .../anchor/tests/litesvm.test.ts | 218 +- basics/repository-layout/anchor/tests/test.ts | 82 +- basics/repository-layout/anchor/tsconfig.json | 16 +- .../native/program/Cargo.toml | 2 +- basics/repository-layout/native/tests/test.ts | 126 +- basics/transfer-sol/anchor/Anchor.toml | 12 +- basics/transfer-sol/anchor/package.json | 30 +- basics/transfer-sol/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/transfer-sol/Cargo.toml | 9 +- .../anchor/programs/transfer-sol/src/lib.rs | 2 +- .../transfer-sol/tests/test_transfer_sol.rs | 92 + .../transfer-sol/anchor/tests/litesvm.test.ts | 157 +- basics/transfer-sol/anchor/tests/test.ts | 108 +- basics/transfer-sol/anchor/tsconfig.json | 16 +- basics/transfer-sol/native/program/Cargo.toml | 2 +- .../transfer-sol/native/tests/instruction.ts | 10 +- basics/transfer-sol/native/tests/test.ts | 38 +- .../transfer-sol/pinocchio/program/Cargo.toml | 2 +- basics/transfer-sol/pinocchio/tests/test.ts | 10 +- biome.jsonc | 27 + compression/cnft-burn/anchor/Anchor.toml | 10 +- .../cnft-burn/anchor/migrations/deploy.ts | 2 +- compression/cnft-burn/anchor/package.json | 50 +- compression/cnft-burn/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/cnft-burn/Cargo.toml | 4 +- .../anchor/programs/cnft-burn/src/lib.rs | 2 +- .../anchor/tests/ReadApi/WrapperConnection.ts | 89 +- .../cnft-burn/anchor/tests/ReadApi/types.ts | 36 +- .../cnft-burn/anchor/tests/cnft-burn.ts | 39 +- .../cnft-burn/anchor/tests/createAndMint.ts | 36 +- .../anchor/tests/fetchNFTsByCollection.ts | 28 +- compression/cnft-burn/anchor/tests/readApi.ts | 18 +- compression/cnft-burn/anchor/tests/utils.ts | 8 +- .../anchor/tests/utils/compression.ts | 95 +- .../cnft-burn/anchor/tests/utils/helpers.ts | 86 +- compression/cnft-vault/anchor/Anchor.toml | 4 +- compression/cnft-vault/anchor/package.json | 42 +- compression/cnft-vault/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/cnft-vault/Cargo.toml | 4 +- .../cnft-vault/anchor/tests/readAPI.ts | 18 +- .../anchor/tests/scripts/constants.ts | 8 +- .../anchor/tests/scripts/withdraw.ts | 23 +- .../anchor/tests/scripts/withdrawTwo.ts | 42 +- .../tests/scripts/withdrawWithLookup.ts | 52 +- compression/cnft-vault/anchor/tests/tests.ts | 63 +- compression/cnft-vault/anchor/tests/utils.ts | 8 +- compression/cutils/anchor/Anchor.toml | 6 +- compression/cutils/anchor/package.json | 50 +- compression/cutils/anchor/pnpm-lock.yaml | 26 +- .../cutils/anchor/programs/cutils/Cargo.toml | 4 +- .../programs/cutils/src/actions/mint.rs | 2 +- .../programs/cutils/src/actions/verify.rs | 10 +- compression/cutils/anchor/tests/setup.ts | 28 +- compression/cutils/anchor/tests/tests.ts | 20 +- .../cutils/anchor/tests/utils/compression.ts | 97 +- .../cutils/anchor/tests/utils/helpers.ts | 84 +- .../cutils/anchor/tests/utils/readAPI.ts | 18 +- .../cutils/anchor/tests/utils/utils.ts | 23 +- oracles/pyth/anchor/Anchor.toml | 13 +- .../anchor/programs/pythexample/Cargo.toml | 15 +- .../anchor/programs/pythexample/src/lib.rs | 86 +- .../programs/pythexample/tests/test_pyth.rs | 112 + package.json | 71 +- pnpm-lock.yaml | 108 +- scripts/lib/change-package-version.ts | 4 +- scripts/lib/command-check.ts | 16 +- scripts/lib/command-help.ts | 46 +- scripts/lib/command-list.ts | 6 +- scripts/lib/command-set.ts | 26 +- scripts/lib/command-update.ts | 22 +- scripts/lib/get-deps-count.ts | 4 +- scripts/lib/get-recursive-file-list.ts | 6 +- scripts/lib/index.ts | 10 +- scripts/sync-package-json.ts | 10 +- tokens/create-token/anchor/Anchor.toml | 11 +- tokens/create-token/anchor/package.json | 38 +- tokens/create-token/anchor/pnpm-lock.yaml | 26 +- tokens/create-token/anchor/prepare.mjs | 12 +- .../anchor/programs/create-token/Cargo.toml | 12 +- .../anchor/programs/create-token/src/lib.rs | 2 +- .../create-token/tests/test_create_token.rs | 145 + .../create-token/anchor/tests/bankrun.test.ts | 4 +- .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes .../anchor/tests/fixtures/token_metadata.so | Bin 0 -> 793991 bytes tokens/create-token/anchor/tests/test.ts | 22 +- tokens/create-token/native/package.json | 48 +- tokens/create-token/native/tests/test.ts | 54 +- tokens/escrow/anchor/Anchor.toml | 10 +- tokens/escrow/anchor/migrations/deploy.ts | 2 +- tokens/escrow/anchor/package.json | 50 +- tokens/escrow/anchor/pnpm-lock.yaml | 26 +- .../escrow/anchor/programs/escrow/Cargo.toml | 12 +- .../escrow/anchor/programs/escrow/src/lib.rs | 2 +- .../programs/escrow/tests/test_escrow.rs | 279 ++ tokens/escrow/anchor/register.js | 6 +- tokens/escrow/anchor/tests/bankrun.test.ts | 151 +- tokens/escrow/anchor/tests/escrow.test.ts | 99 +- tokens/escrow/native/tests/account.ts | 14 +- tokens/escrow/native/tests/instruction.ts | 30 +- tokens/escrow/native/tests/test.ts | 50 +- tokens/escrow/native/tests/utils.ts | 29 +- .../anchor/Anchor.toml | 10 +- .../anchor/package.json | 66 +- .../anchor/pnpm-lock.yaml | 26 +- .../external-delegate-token-master/Cargo.toml | 12 +- .../external-delegate-token-master/src/lib.rs | 2 +- .../tests/test_external_delegate.rs | 224 ++ .../external-delegate-token-master.test.ts | 35 +- .../anchor/tests/types.ts | 3 +- tokens/nft-minter/anchor/Anchor.toml | 12 +- tokens/nft-minter/anchor/package.json | 36 +- tokens/nft-minter/anchor/pnpm-lock.yaml | 26 +- tokens/nft-minter/anchor/prepare.mjs | 12 +- .../anchor/programs/nft-minter/Cargo.toml | 12 +- .../anchor/programs/nft-minter/src/lib.rs | 2 +- .../nft-minter/tests/test_nft_minter.rs | 145 + .../nft-minter/anchor/tests/bankrun.test.ts | 9 +- .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes .../anchor/tests/fixtures/token_metadata.so | Bin 0 -> 793991 bytes tokens/nft-minter/anchor/tests/test.ts | 20 +- .../nft-minter/native/tests/instructions.ts | 12 +- tokens/nft-minter/native/tests/test.ts | 46 +- tokens/nft-operations/anchor/Anchor.toml | 15 +- tokens/nft-operations/anchor/Cargo.lock | 2562 +++++++++++--- tokens/nft-operations/anchor/package.json | 54 +- tokens/nft-operations/anchor/pnpm-lock.yaml | 26 +- tokens/nft-operations/anchor/prepare.mjs | 12 +- .../anchor/programs/mint-nft/Cargo.toml | 11 +- .../anchor/programs/mint-nft/src/lib.rs | 2 +- .../mint-nft/tests/test_nft_operations.rs | 332 ++ .../anchor/tests/bankrun.test.ts | 300 +- .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes .../anchor/tests/fixtures/token_metadata.so | Bin 0 -> 793991 bytes .../nft-operations/anchor/tests/mint-nft.ts | 60 +- tokens/pda-mint-authority/anchor/Anchor.toml | 11 +- tokens/pda-mint-authority/anchor/package.json | 40 +- .../pda-mint-authority/anchor/pnpm-lock.yaml | 26 +- tokens/pda-mint-authority/anchor/prepare.mjs | 12 +- .../anchor/programs/token-minter/Cargo.toml | 11 +- .../anchor/programs/token-minter/src/lib.rs | 2 +- .../token-minter/tests/test_pda_mint.rs | 148 + .../anchor/tests/bankrun.test.ts | 108 +- .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes .../anchor/tests/fixtures/token_metadata.so | Bin 0 -> 793991 bytes .../pda-mint-authority/anchor/tests/test.ts | 102 +- .../native/tests/instructions.ts | 14 +- .../pda-mint-authority/native/tests/test.ts | 65 +- tokens/spl-token-minter/anchor/Anchor.toml | 11 +- tokens/spl-token-minter/anchor/package.json | 40 +- tokens/spl-token-minter/anchor/pnpm-lock.yaml | 26 +- tokens/spl-token-minter/anchor/prepare.mjs | 12 +- .../programs/spl-token-minter/Cargo.toml | 11 +- .../programs/spl-token-minter/src/lib.rs | 2 +- .../tests/test_spl_token_minter.rs | 183 + .../anchor/tests/bankrun.test.ts | 113 +- .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes .../anchor/tests/fixtures/token_metadata.so | Bin 0 -> 793991 bytes tokens/spl-token-minter/anchor/tests/test.ts | 108 +- .../native/tests/instructions.ts | 14 +- tokens/spl-token-minter/native/tests/test.ts | 39 +- tokens/token-2022/basics/anchor/Anchor.toml | 22 +- .../basics/anchor/migrations/deploy.ts | 2 +- tokens/token-2022/basics/anchor/package.json | 42 +- .../token-2022/basics/anchor/pnpm-lock.yaml | 26 +- .../basics/anchor/programs/basics/Cargo.toml | 11 +- .../basics/anchor/programs/basics/src/lib.rs | 2 +- .../programs/basics/tests/test_basics.rs | 169 + .../token-2022/basics/anchor/tests/anchor.ts | 244 +- .../basics/anchor/tests/bankrun.test.ts | 246 +- .../token-2022/cpi-guard/anchor/Anchor.toml | 10 +- .../cpi-guard/anchor/migrations/deploy.ts | 2 +- .../token-2022/cpi-guard/anchor/package.json | 42 +- .../cpi-guard/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/cpi-guard/Cargo.toml | 12 +- .../anchor/programs/cpi-guard/src/lib.rs | 2 +- .../cpi-guard/tests/test_cpi_guard.rs | 205 ++ .../cpi-guard/anchor/tests/cpi-guard.ts | 60 +- .../default-account-state/anchor/Anchor.toml | 10 +- .../anchor/migrations/deploy.ts | 2 +- .../default-account-state/anchor/package.json | 38 +- .../anchor/pnpm-lock.yaml | 26 +- .../programs/default-account-state/Cargo.toml | 11 +- .../programs/default-account-state/src/lib.rs | 2 +- .../tests/test_default_account_state.rs | 165 + .../anchor/tests/default-account-state.ts | 24 +- .../native/tests/test.ts | 32 +- tokens/token-2022/group/anchor/Anchor.toml | 8 +- .../group/anchor/migrations/deploy.ts | 2 +- tokens/token-2022/group/anchor/package.json | 36 +- tokens/token-2022/group/anchor/pnpm-lock.yaml | 26 +- .../group/anchor/programs/group/Cargo.toml | 13 +- .../group/anchor/programs/group/src/lib.rs | 2 +- .../anchor/programs/group/tests/test_group.rs | 50 + tokens/token-2022/group/anchor/tests/group.ts | 12 +- .../immutable-owner/anchor/Anchor.toml | 10 +- .../anchor/migrations/deploy.ts | 2 +- .../immutable-owner/anchor/package.json | 38 +- .../immutable-owner/anchor/pnpm-lock.yaml | 26 +- .../programs/immutable-owner/Cargo.toml | 11 +- .../programs/immutable-owner/src/lib.rs | 2 +- .../tests/test_immutable_owner.rs | 106 + .../anchor/tests/immutable-owner.ts | 18 +- .../interest-bearing/anchor/Anchor.toml | 10 +- .../anchor/migrations/deploy.ts | 2 +- .../interest-bearing/anchor/package.json | 38 +- .../interest-bearing/anchor/pnpm-lock.yaml | 26 +- .../programs/interest-bearing/Cargo.toml | 11 +- .../programs/interest-bearing/src/lib.rs | 2 +- .../tests/test_interest_bearing.rs | 72 + .../anchor/tests/interest-bearing.ts | 27 +- .../memo-transfer/anchor/Anchor.toml | 10 +- .../memo-transfer/anchor/migrations/deploy.ts | 2 +- .../memo-transfer/anchor/package.json | 40 +- .../memo-transfer/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/memo-transfer/Cargo.toml | 11 +- .../anchor/programs/memo-transfer/src/lib.rs | 2 +- .../memo-transfer/tests/test_memo_transfer.rs | 239 ++ .../anchor/tests/fixtures/spl_memo.so | Bin 0 -> 74800 bytes .../anchor/tests/memo-transfer.ts | 74 +- tokens/token-2022/metadata/anchor/Anchor.toml | 10 +- .../metadata/anchor/migrations/deploy.ts | 2 +- .../token-2022/metadata/anchor/package.json | 38 +- .../token-2022/metadata/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/metadata/Cargo.toml | 16 +- .../metadata/src/instructions/initialize.rs | 9 +- .../src/instructions/update_authority.rs | 2 +- .../metadata/src/instructions/update_field.rs | 2 +- .../anchor/programs/metadata/src/lib.rs | 4 +- .../programs/metadata/tests/test_metadata.rs | 156 + .../metadata/anchor/tests/metadata.ts | 70 +- .../mint-close-authority/anchor/Anchor.toml | 10 +- .../anchor/migrations/deploy.ts | 2 +- .../mint-close-authority/anchor/package.json | 38 +- .../anchor/pnpm-lock.yaml | 26 +- .../programs/mint-close-authority/Cargo.toml | 11 +- .../programs/mint-close-authority/src/lib.rs | 2 +- .../tests/test_mint_close_authority.rs | 127 + .../anchor/tests/mint-close-authority.ts | 31 +- .../mint-close-authority/native/tests/test.ts | 32 +- .../multiple-extensions/native/tests/test.ts | 34 +- .../anchor-example/anchor/Anchor.toml | 11 +- .../anchor/migrations/deploy.ts | 2 +- .../anchor-example/anchor/package.json | 44 +- .../anchor-example/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/extension_nft/Cargo.toml | 8 +- .../anchor/programs/extension_nft/src/lib.rs | 2 +- .../anchor-example/anchor/tests/lumberjack.ts | 22 +- .../app/components/ChopTreeButton.tsx | 119 +- .../app/components/DisplayGameState.tsx | 20 +- .../app/components/DisplayNfts.tsx | 32 +- .../app/components/InitPlayerButton.tsx | 42 +- .../app/components/MintNftButton.tsx | 65 +- .../app/components/RequestAirdrop.tsx | 52 +- .../app/components/SessionKeyButton.tsx | 68 +- .../app/components/WalletMultiButton.tsx | 15 +- .../app/contexts/GameStateProvider.tsx | 134 +- .../app/contexts/NftProvider.tsx | 70 +- .../app/contexts/SessionProvider.tsx | 28 +- .../app/contexts/WalletContextProvider.tsx | 39 +- .../anchor-example/app/idl/extension_nft.ts | 236 +- .../anchor-example/app/next.config.js | 4 +- .../anchor-example/app/package.json | 2 +- .../anchor-example/app/pages/_app.tsx | 22 +- .../anchor-example/app/pages/_document.tsx | 4 +- .../anchor-example/app/pages/api/hello.ts | 4 +- .../anchor-example/app/pages/index.tsx | 24 +- .../anchor-example/app/styles/Home.module.css | 18 +- .../anchor-example/app/styles/globals.css | 46 +- .../anchor-example/app/utils/anchor.ts | 33 +- .../app/utils/wrappedConnection.ts | 98 +- .../Assets/TextMesh Pro/Sprites/EmojiOne.json | 310 +- .../non-transferable/anchor/Anchor.toml | 10 +- .../anchor/migrations/deploy.ts | 2 +- .../non-transferable/anchor/package.json | 38 +- .../non-transferable/anchor/pnpm-lock.yaml | 26 +- .../programs/non-transferable/Cargo.toml | 11 +- .../programs/non-transferable/src/lib.rs | 2 +- .../tests/test_non_transferable.rs | 107 + .../anchor/tests/non-transferable.ts | 24 +- .../non-transferable/native/tests/test.ts | 34 +- .../permanent-delegate/anchor/Anchor.toml | 10 +- .../anchor/migrations/deploy.ts | 2 +- .../permanent-delegate/anchor/package.json | 38 +- .../permanent-delegate/anchor/pnpm-lock.yaml | 26 +- .../programs/permanent-delegate/Cargo.toml | 11 +- .../programs/permanent-delegate/src/lib.rs | 2 +- .../tests/test_permanent_delegate.rs | 134 + .../anchor/tests/permanent-delegate.ts | 20 +- .../transfer-fee/anchor/Anchor.toml | 10 +- .../transfer-fee/anchor/migrations/deploy.ts | 2 +- .../transfer-fee/anchor/package.json | 38 +- .../transfer-fee/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/transfer-fee/Cargo.toml | 11 +- .../anchor/programs/transfer-fee/src/lib.rs | 2 +- .../transfer-fee/tests/test_transfer_fee.rs | 172 + .../transfer-fee/anchor/tests/transfer-fee.ts | 69 +- .../transfer-fee/native/tests/test.ts | 34 +- .../account-data-as-seed/anchor/.prettierrc | 10 - .../account-data-as-seed/anchor/Anchor.toml | 10 +- .../anchor/migrations/deploy.ts | 2 +- .../account-data-as-seed/anchor/package.json | 44 +- .../anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/transfer-hook/Cargo.toml | 12 +- .../anchor/programs/transfer-hook/src/lib.rs | 2 +- .../transfer-hook/tests/test_transfer_hook.rs | 154 + .../anchor/tests/transfer-hook.ts | 57 +- .../allow-block-list-token/.prettierrc | 7 - .../allow-block-list-token/anchor/Anchor.toml | 2 +- .../anchor/programs/abl-token/Cargo.toml | 10 +- .../anchor/programs/abl-token/src/lib.rs | 2 +- .../abl-token/tests/test_abl_token.rs | 86 + .../anchor/src/abl-token-exports.ts | 22 +- .../anchor/src/index.ts | 2 +- .../anchor/tests/basic.test.ts | 10 +- .../allow-block-list-token/eslint.config.mjs | 8 +- .../allow-block-list-token/next.config.ts | 2 +- .../allow-block-list-token/package.json | 112 +- .../allow-block-list-token/pnpm-lock.yaml | 26 +- .../allow-block-list-token/postcss.config.mjs | 2 +- .../src/app/account/[address]/page.tsx | 4 +- .../src/app/account/page.tsx | 4 +- .../src/app/config/page.tsx | 5 +- .../src/app/create-token/page.tsx | 4 +- .../src/app/globals.css | 6 +- .../allow-block-list-token/src/app/layout.tsx | 36 +- .../src/app/manage-token/[address]/page.tsx | 4 +- .../src/app/manage-token/page.tsx | 4 +- .../allow-block-list-token/src/app/page.tsx | 4 +- .../components/abl-token/abl-token-config.tsx | 255 +- .../abl-token/abl-token-data-access.tsx | 450 ++- .../abl-token/abl-token-feature.tsx | 22 +- .../abl-token-manage-token-detail.tsx | 149 +- .../abl-token-manage-token-input.tsx | 33 +- .../abl-token/abl-token-manage-token.tsx | 14 +- .../abl-token/abl-token-new-token.tsx | 22 +- .../src/components/abl-token/abl-token-ui.tsx | 147 +- .../account/account-data-access.tsx | 194 +- .../account/account-detail-feature.tsx | 30 +- .../account/account-list-feature.tsx | 15 +- .../src/components/account/account-ui.tsx | 169 +- .../src/components/app-alert.tsx | 8 +- .../src/components/app-footer.tsx | 6 +- .../src/components/app-header.tsx | 30 +- .../src/components/app-hero.tsx | 14 +- .../src/components/app-layout.tsx | 22 +- .../src/components/app-modal.tsx | 20 +- .../src/components/app-providers.tsx | 14 +- .../cluster/cluster-data-access.tsx | 112 +- .../src/components/cluster/cluster-ui.tsx | 45 +- .../dashboard/dashboard-feature.tsx | 23 +- .../src/components/react-query-provider.tsx | 18 +- .../src/components/solana/solana-provider.tsx | 42 +- .../src/components/theme-provider.tsx | 8 +- .../src/components/theme-select.tsx | 26 +- .../src/components/ui/alert.tsx | 36 +- .../src/components/ui/button.tsx | 44 +- .../src/components/ui/card.tsx | 42 +- .../src/components/ui/dialog.tsx | 48 +- .../src/components/ui/dropdown-menu.tsx | 76 +- .../src/components/ui/input.tsx | 16 +- .../src/components/ui/label.tsx | 14 +- .../src/components/ui/sonner.tsx | 22 +- .../src/components/ui/table.tsx | 52 +- .../src/components/use-transaction-toast.tsx | 28 +- .../allow-block-list-token/src/lib/utils.ts | 6 +- .../transfer-hook/counter/anchor/Anchor.toml | 10 +- .../counter/anchor/migrations/deploy.ts | 2 +- .../transfer-hook/counter/anchor/package.json | 44 +- .../counter/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/transfer-hook/Cargo.toml | 12 +- .../anchor/programs/transfer-hook/src/lib.rs | 2 +- .../tests/test_transfer_hook_counter.rs | 154 + .../counter/anchor/tests/transfer-hook.ts | 54 +- .../hello-world/anchor/Anchor.toml | 13 +- .../hello-world/anchor/migrations/deploy.ts | 2 +- .../hello-world/anchor/package.json | 44 +- .../hello-world/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/transfer-hook/Cargo.toml | 12 +- .../anchor/programs/transfer-hook/src/lib.rs | 2 +- .../transfer-hook/tests/test_transfer_hook.rs | 154 + .../hello-world/anchor/tests/transfer-hook.ts | 41 +- .../transfer-hook/pblock-list/codama.ts | 193 +- .../transfer-hook/pblock-list/pino/codama.ts | 193 +- .../pino/sdk/ts/src/accounts/config.ts | 24 +- .../pino/sdk/ts/src/accounts/extraMetas.ts | 14 +- .../pino/sdk/ts/src/accounts/index.ts | 6 +- .../pino/sdk/ts/src/accounts/walletBlock.ts | 12 +- .../pblock-list/pino/sdk/ts/src/index.ts | 8 +- .../sdk/ts/src/instructions/blockWallet.ts | 94 +- .../pino/sdk/ts/src/instructions/index.ts | 8 +- .../pino/sdk/ts/src/instructions/init.ts | 47 +- .../ts/src/instructions/setupExtraMetas.ts | 97 +- .../sdk/ts/src/instructions/unblockWallet.ts | 74 +- .../pino/sdk/ts/src/pdas/config.ts | 12 +- .../pino/sdk/ts/src/pdas/extraMetas.ts | 14 +- .../pblock-list/pino/sdk/ts/src/pdas/index.ts | 6 +- .../pino/sdk/ts/src/pdas/walletBlock.ts | 14 +- .../pino/sdk/ts/src/programs/blockList.ts | 31 +- .../pino/sdk/ts/src/programs/index.ts | 2 +- .../pino/sdk/ts/src/shared/index.ts | 24 +- .../pblock-list/sdk/ts/src/accounts/config.ts | 24 +- .../sdk/ts/src/accounts/extraMetas.ts | 14 +- .../pblock-list/sdk/ts/src/accounts/index.ts | 6 +- .../sdk/ts/src/accounts/walletBlock.ts | 12 +- .../pblock-list/sdk/ts/src/index.ts | 8 +- .../sdk/ts/src/instructions/blockWallet.ts | 94 +- .../sdk/ts/src/instructions/index.ts | 8 +- .../sdk/ts/src/instructions/init.ts | 47 +- .../ts/src/instructions/setupExtraMetas.ts | 97 +- .../sdk/ts/src/instructions/unblockWallet.ts | 74 +- .../pblock-list/sdk/ts/src/pdas/config.ts | 12 +- .../pblock-list/sdk/ts/src/pdas/extraMetas.ts | 14 +- .../pblock-list/sdk/ts/src/pdas/index.ts | 6 +- .../sdk/ts/src/pdas/walletBlock.ts | 14 +- .../sdk/ts/src/programs/blockList.ts | 31 +- .../pblock-list/sdk/ts/src/programs/index.ts | 2 +- .../pblock-list/sdk/ts/src/shared/index.ts | 24 +- .../transfer-cost/anchor/Anchor.toml | 10 +- .../transfer-cost/anchor/migrations/deploy.ts | 2 +- .../transfer-cost/anchor/package.json | 38 +- .../transfer-cost/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/transfer-hook/Cargo.toml | 12 +- .../anchor/programs/transfer-hook/src/lib.rs | 2 +- .../transfer-hook/tests/test_transfer_hook.rs | 84 + .../anchor/tests/transfer-hook.ts | 57 +- .../transfer-switch/anchor/Anchor.toml | 10 +- .../transfer-switch/anchor/package.json | 34 +- .../transfer-switch/anchor/pnpm-lock.yaml | 26 +- .../programs/transfer-switch/Cargo.toml | 12 +- .../programs/transfer-switch/src/lib.rs | 2 +- .../tests/test_transfer_switch.rs | 190 ++ .../anchor/tests/transfer-switch.ts | 145 +- .../whitelist/anchor/Anchor.toml | 15 +- .../whitelist/anchor/migrations/deploy.ts | 2 +- .../whitelist/anchor/package.json | 42 +- .../whitelist/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/transfer-hook/Cargo.toml | 12 +- .../anchor/programs/transfer-hook/src/lib.rs | 2 +- .../transfer-hook/tests/test_transfer_hook.rs | 138 + .../whitelist/anchor/tests/transfer-hook.ts | 35 +- tokens/token-fundraiser/anchor/Anchor.toml | 12 +- tokens/token-fundraiser/anchor/Cargo.lock | 2930 +++++++++++++++-- tokens/token-fundraiser/anchor/package.json | 42 +- tokens/token-fundraiser/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/fundraiser/Cargo.toml | 11 +- .../anchor/programs/fundraiser/src/lib.rs | 2 +- .../fundraiser/tests/test_fundraiser.rs | 424 +++ .../anchor/tests/bankrun.test.ts | 84 +- .../anchor/tests/fundraiser.ts | 471 ++- tokens/token-swap/anchor/Anchor.toml | 3 +- tokens/token-swap/anchor/package.json | 38 +- tokens/token-swap/anchor/pnpm-lock.yaml | 26 +- .../anchor/programs/token-swap/Cargo.toml | 11 +- .../anchor/programs/token-swap/src/lib.rs | 2 +- .../programs/token-swap/tests/test_swap.rs | 437 +++ tokens/token-swap/anchor/tests/create-amm.ts | 28 +- tokens/token-swap/anchor/tests/create-pool.ts | 28 +- .../anchor/tests/deposit-liquidity.ts | 23 +- tokens/token-swap/anchor/tests/swap.ts | 33 +- tokens/token-swap/anchor/tests/utils.ts | 20 +- .../anchor/tests/withdraw-liquidity.ts | 29 +- tokens/transfer-tokens/anchor/Anchor.toml | 11 +- tokens/transfer-tokens/anchor/package.json | 42 +- tokens/transfer-tokens/anchor/pnpm-lock.yaml | 26 +- tokens/transfer-tokens/anchor/prepare.mjs | 12 +- .../programs/transfer-tokens/Cargo.toml | 11 +- .../programs/transfer-tokens/src/lib.rs | 2 +- .../tests/test_transfer_tokens.rs | 181 + .../anchor/tests/bankrun.test.ts | 14 +- .../tests/fixtures/mpl_token_metadata.so | Bin 0 -> 793991 bytes .../anchor/tests/fixtures/token_metadata.so | Bin 0 -> 793991 bytes tokens/transfer-tokens/anchor/tests/test.ts | 133 +- .../native/tests/instructions.ts | 22 +- tokens/transfer-tokens/native/tests/test.ts | 96 +- tools/shank-and-solita/native/.solitarc.js | 14 +- .../native/tests/generated/accounts/Car.ts | 22 +- .../tests/generated/accounts/RentalOrder.ts | 32 +- .../native/tests/generated/accounts/index.ts | 8 +- .../native/tests/generated/index.ts | 10 +- .../tests/generated/instructions/AddCar.ts | 14 +- .../generated/instructions/BookRental.ts | 14 +- .../tests/generated/instructions/PickUpCar.ts | 8 +- .../tests/generated/instructions/ReturnCar.ts | 8 +- .../tests/generated/instructions/index.ts | 8 +- .../tests/generated/types/AddCarArgs.ts | 10 +- .../tests/generated/types/BookRentalArgs.ts | 12 +- .../generated/types/RentalOrderStatus.ts | 7 +- .../native/tests/generated/types/index.ts | 6 +- tools/shank-and-solita/native/tests/test.ts | 60 +- yarn.lock | 153 - 706 files changed, 21872 insertions(+), 17118 deletions(-) create mode 100644 .github/workflows/typescript.yml create mode 100644 .vscode/settings.json delete mode 100644 basics/account-data/anchor/package.json delete mode 100644 basics/account-data/anchor/pnpm-lock.yaml create mode 100644 basics/account-data/anchor/programs/anchor-program-example/tests/test_account_data.rs delete mode 100644 basics/account-data/anchor/tests/litesvm.test.ts delete mode 100644 basics/account-data/anchor/tests/test.ts delete mode 100644 basics/account-data/anchor/tsconfig.json create mode 100644 basics/checking-accounts/anchor/programs/anchor-program-example/tests/test_checking_accounts.rs create mode 100644 basics/close-account/anchor/programs/close-account/tests/test_close_account.rs delete mode 100644 basics/counter/anchor/package.json delete mode 100644 basics/counter/anchor/pnpm-lock.yaml create mode 100644 basics/counter/anchor/programs/counter_anchor/tests/test_counter.rs delete mode 100644 basics/counter/anchor/tests/litesvm.test.ts delete mode 100644 basics/counter/anchor/tests/test.ts delete mode 100644 basics/counter/anchor/tsconfig.json delete mode 100644 basics/create-account/anchor/package.json delete mode 100644 basics/create-account/anchor/pnpm-lock.yaml create mode 100644 basics/create-account/anchor/programs/create-system-account/tests/test_create_account.rs delete mode 100644 basics/create-account/anchor/tests/litesvm.test.ts delete mode 100644 basics/create-account/anchor/tests/test.ts delete mode 100644 basics/create-account/anchor/tsconfig.json create mode 100644 basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs create mode 100644 basics/cross-program-invocation/anchor/programs/lever/tests/test_lever.rs create mode 100644 basics/favorites/anchor/programs/favorites/tests/test_favorites.rs delete mode 100644 basics/hello-solana/anchor/package.json delete mode 100644 basics/hello-solana/anchor/pnpm-lock.yaml create mode 100644 basics/hello-solana/anchor/programs/hello-solana/tests/test_hello.rs delete mode 100644 basics/hello-solana/anchor/tests/litesvm.test.ts delete mode 100644 basics/hello-solana/anchor/tests/test.ts delete mode 100644 basics/hello-solana/anchor/tsconfig.json create mode 100644 basics/pda-rent-payer/anchor/programs/anchor-program-example/tests/test_pda_rent_payer.rs create mode 100644 basics/processing-instructions/anchor/programs/processing-instructions/tests/test_processing_instructions.rs create mode 100644 basics/program-derived-addresses/anchor/programs/anchor-program-example/tests/test_program_derived_addresses.rs create mode 100644 basics/realloc/anchor/programs/anchor-realloc/tests/test_realloc.rs create mode 100644 basics/rent/anchor/programs/rent-example/tests/test_rent.rs create mode 100644 basics/repository-layout/anchor/programs/carnival/tests/test_carnival.rs create mode 100644 basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs create mode 100644 biome.jsonc create mode 100644 oracles/pyth/anchor/programs/pythexample/tests/test_pyth.rs create mode 100644 tokens/create-token/anchor/programs/create-token/tests/test_create_token.rs create mode 100644 tokens/create-token/anchor/tests/fixtures/mpl_token_metadata.so create mode 100644 tokens/create-token/anchor/tests/fixtures/token_metadata.so create mode 100644 tokens/escrow/anchor/programs/escrow/tests/test_escrow.rs create mode 100644 tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/tests/test_external_delegate.rs create mode 100644 tokens/nft-minter/anchor/programs/nft-minter/tests/test_nft_minter.rs create mode 100644 tokens/nft-minter/anchor/tests/fixtures/mpl_token_metadata.so create mode 100644 tokens/nft-minter/anchor/tests/fixtures/token_metadata.so create mode 100644 tokens/nft-operations/anchor/programs/mint-nft/tests/test_nft_operations.rs create mode 100644 tokens/nft-operations/anchor/tests/fixtures/mpl_token_metadata.so create mode 100644 tokens/nft-operations/anchor/tests/fixtures/token_metadata.so create mode 100644 tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs create mode 100644 tokens/pda-mint-authority/anchor/tests/fixtures/mpl_token_metadata.so create mode 100644 tokens/pda-mint-authority/anchor/tests/fixtures/token_metadata.so create mode 100644 tokens/spl-token-minter/anchor/programs/spl-token-minter/tests/test_spl_token_minter.rs create mode 100644 tokens/spl-token-minter/anchor/tests/fixtures/mpl_token_metadata.so create mode 100644 tokens/spl-token-minter/anchor/tests/fixtures/token_metadata.so create mode 100644 tokens/token-2022/basics/anchor/programs/basics/tests/test_basics.rs create mode 100644 tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs create mode 100644 tokens/token-2022/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs create mode 100644 tokens/token-2022/group/anchor/programs/group/tests/test_group.rs create mode 100644 tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs create mode 100644 tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/tests/test_interest_bearing.rs create mode 100644 tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs create mode 100644 tokens/token-2022/memo-transfer/anchor/tests/fixtures/spl_memo.so create mode 100644 tokens/token-2022/metadata/anchor/programs/metadata/tests/test_metadata.rs create mode 100644 tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/tests/test_mint_close_authority.rs create mode 100644 tokens/token-2022/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs create mode 100644 tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/tests/test_permanent_delegate.rs create mode 100644 tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/tests/test_transfer_fee.rs delete mode 100644 tokens/token-2022/transfer-hook/account-data-as-seed/anchor/.prettierrc create mode 100644 tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs delete mode 100644 tokens/token-2022/transfer-hook/allow-block-list-token/.prettierrc create mode 100644 tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/tests/test_abl_token.rs create mode 100644 tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs create mode 100644 tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs create mode 100644 tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/tests/test_transfer_hook.rs create mode 100644 tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs create mode 100644 tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs create mode 100644 tokens/token-fundraiser/anchor/programs/fundraiser/tests/test_fundraiser.rs create mode 100644 tokens/token-swap/anchor/programs/token-swap/tests/test_swap.rs create mode 100644 tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs create mode 100644 tokens/transfer-tokens/anchor/tests/fixtures/mpl_token_metadata.so create mode 100644 tokens/transfer-tokens/anchor/tests/fixtures/token_metadata.so delete mode 100644 yarn.lock diff --git a/.github/workflows/anchor.yml b/.github/workflows/anchor.yml index 926a95b98..bb7800d39 100644 --- a/.github/workflows/anchor.yml +++ b/.github/workflows/anchor.yml @@ -6,7 +6,9 @@ on: push: branches: - main + - anchor-1.0-final - anchor-1.0 + - fix-biome-errors pull_request: types: [opened, synchronize, reopened] branches: diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index 64c46c494..ba7e949a1 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -9,7 +9,9 @@ on: push: branches: - main + - anchor-1.0-final - anchor-1.0 + - fix-biome-errors pull_request: types: [opened, synchronize, reopened] branches: diff --git a/.github/workflows/solana-native.yml b/.github/workflows/solana-native.yml index 9d6331e05..71c415abc 100644 --- a/.github/workflows/solana-native.yml +++ b/.github/workflows/solana-native.yml @@ -6,6 +6,8 @@ on: push: branches: - main + - anchor-1.0-final + - fix-biome-errors pull_request: types: [opened, synchronize, reopened] branches: @@ -107,6 +109,7 @@ jobs: failed_projects: ${{ steps.set-failed.outputs.failed_projects }} steps: - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v4 - name: Use Node.js uses: actions/setup-node@v5 with: @@ -192,8 +195,7 @@ jobs: # Make the script executable chmod +x build_and_test.sh - # Install pnpm - npm install --global pnpm + # pnpm is already installed via pnpm/action-setup - name: Setup Solana Stable uses: heyAyushh/setup-solana@v5.9 with: diff --git a/.github/workflows/solana-pinocchio.yml b/.github/workflows/solana-pinocchio.yml index 3215934cd..82b8238e8 100644 --- a/.github/workflows/solana-pinocchio.yml +++ b/.github/workflows/solana-pinocchio.yml @@ -6,6 +6,8 @@ on: push: branches: - main + - anchor-1.0-final + - fix-biome-errors pull_request: types: [opened, synchronize, reopened] branches: @@ -107,6 +109,7 @@ jobs: failed_projects: ${{ steps.set-failed.outputs.failed_projects }} steps: - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v4 - name: Use Node.js uses: actions/setup-node@v5 with: @@ -192,8 +195,7 @@ jobs: # Make the script executable chmod +x build_and_test.sh - # Install pnpm - npm install --global pnpm + # pnpm is already installed via pnpm/action-setup - name: Setup Solana Stable uses: heyAyushh/setup-solana@v5.9 with: diff --git a/.github/workflows/typescript.yml b/.github/workflows/typescript.yml new file mode 100644 index 000000000..e6cf42a5d --- /dev/null +++ b/.github/workflows/typescript.yml @@ -0,0 +1,31 @@ +name: TypeScript + +on: + push: + branches: + - main + - anchor-1.0-final + - fix-biome-errors + pull_request: + types: [opened, synchronize, reopened] + branches: + - main + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +jobs: + biome: + name: Biome check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + - uses: pnpm/action-setup@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: pnpm + # --frozen-lockfile: fail if pnpm-lock.yaml is out of date + # --ignore-workspace: only install root deps, not all 94 subprojects + - run: pnpm install --frozen-lockfile --ignore-workspace + - run: pnpm run check diff --git a/.gitignore b/.gitignore index 8a05c56b2..4577cdc5b 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,9 @@ node_modules/ **/*/.anchor **/*/.DS_Store **/*/target -**/*/tests/fixtures +# Ignore test fixtures by default, but allow .so program binaries needed for LiteSVM tests +**/*/tests/fixtures/* +!**/*/tests/fixtures/*.so **/*.rs.bk **/*/test-ledger **/*/yarn.lock diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..88ca7c2bd --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.defaultFormatter": "biomejs.biome", + "editor.formatOnSave": true +} diff --git a/Cargo.lock b/Cargo.lock index 27895f8ef..f301e5c9f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,6 +7,11 @@ name = "account-data-anchor-program" version = "0.1.0" dependencies = [ "anchor-lang", + "borsh 1.6.1", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -93,28 +98,6 @@ dependencies = [ "solana-svm-feature-set", ] -[[package]] -name = "agave-precompiles" -version = "3.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58acc95455da4ba868f723d2170af9bb3009a3f430580aae359eecc9b057fb3f" -dependencies = [ - "agave-feature-set", - "bincode", - "digest 0.10.7", - "ed25519-dalek 1.0.1", - "libsecp256k1", - "openssl", - "sha3", - "solana-ed25519-program", - "solana-message 3.1.0", - "solana-precompile-error", - "solana-pubkey 3.0.0", - "solana-sdk-ids 3.1.0", - "solana-secp256k1-program", - "solana-secp256r1-program", -] - [[package]] name = "agave-reserved-account-keys" version = "3.1.11" @@ -210,9 +193,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anchor-attribute-access-control" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3db7f5f8a6b16fa2b6e1b0222e656249c3abedf052e3943babf248929571204" +checksum = "b972f5fbd02524c92e4eb487c3c648904572702670f3d6fc81aef5f1751b1569" dependencies = [ "proc-macro2", "quote", @@ -221,9 +204,9 @@ dependencies = [ [[package]] name = "anchor-attribute-account" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a12661acaba9866a5f2d8d8d46a1eed8b484f41dc9f94f808c3b07d35726816" +checksum = "9acfcb07a92084bcfa9f6cc49a5c2e8e0e986f25f4b7caa184b7a2c9c9e561c2" dependencies = [ "anchor-syn", "proc-macro2", @@ -233,9 +216,9 @@ dependencies = [ [[package]] name = "anchor-attribute-constant" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dff08bc0187aafc559da8f63b5adeab0bcdf97128765c72dd9a4861f70627fc" +checksum = "8f46cc38f819377f07663b8eb492a701427950065e79d2d7b622a782443deb7a" dependencies = [ "anchor-syn", "quote", @@ -244,9 +227,9 @@ dependencies = [ [[package]] name = "anchor-attribute-error" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2af8ce12fb8cf782a3e127d376698a4548a518e38b4686f9c439adce4730b48" +checksum = "9c34748789107c9838329e058ca7b253e67f37b39ceae5a0a6c8d99f5d1bf1fe" dependencies = [ "anchor-syn", "quote", @@ -255,9 +238,9 @@ dependencies = [ [[package]] name = "anchor-attribute-event" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338be5df076369b99585264aaa46c66229ead67568d61bd38c3ab0fa7a15e554" +checksum = "1a28a3e5eefa03d9c5ef02b2139198f652547d38dddafc9c5545152dfba54556" dependencies = [ "anchor-syn", "proc-macro2", @@ -267,9 +250,9 @@ dependencies = [ [[package]] name = "anchor-attribute-program" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c4ec70cef4ef7e2d87b4e9c550f727a43d691d3d7f3e4d6b2e3bd530ae098d" +checksum = "dfaa03865053cb168bfc4debe5992be87f397aa027dd81b69a2e44f2e5bae1c5" dependencies = [ "anchor-lang-idl", "anchor-syn", @@ -282,9 +265,9 @@ dependencies = [ [[package]] name = "anchor-derive-accounts" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f610cb50e10e4c404cc774f20a4eb602b904f68ea04590f8b1eb22a1e28b33e5" +checksum = "eef330db08f9ceee45c18ef96b15b869883d280c0ab5c6ff5d2e2f6481da7911" dependencies = [ "anchor-syn", "quote", @@ -293,9 +276,9 @@ dependencies = [ [[package]] name = "anchor-derive-serde" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be9ead49a9689493f8857a61dd1abf1d70eeeeb0683f8c1e09b015ab5bdd382d" +checksum = "e0e80ff4e3ddb8c85aafd37926335c28f820516311e7106e5b7482b42e798aaa" dependencies = [ "anchor-syn", "proc-macro-crate 3.5.0", @@ -306,9 +289,9 @@ dependencies = [ [[package]] name = "anchor-derive-space" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4d1372743444967347b60f9311d2ee54a630152fd1d6d805adebd7fcd72056" +checksum = "2672af0ef4dfd5f5b6199355867b580cd8b4048093ef5208dd2b441305c15b8b" dependencies = [ "proc-macro2", "quote", @@ -317,9 +300,9 @@ dependencies = [ [[package]] name = "anchor-lang" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "254d0cb160ea5c4c6a8c2f847bbd0f384fef733ebc36ef8426ae95f1bfda5757" +checksum = "8de9dce227fa0c08be20fef008c5b04681e1e0a15cb396e9619a9a1f800ff6cd" dependencies = [ "anchor-attribute-access-control", "anchor-attribute-account", @@ -390,13 +373,18 @@ name = "anchor-realloc" version = "0.1.0" dependencies = [ "anchor-lang", + "borsh 1.6.1", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] name = "anchor-syn" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a855d34b1b0488f37ccc759c8bd4a696cd3a7bba8cb0734c2a965109f707da" +checksum = "c62f42cb7e348c033bd9bfba59979bcd66431c026ba23490af94045aa357a950" dependencies = [ "anyhow", "bs58", @@ -954,6 +942,10 @@ name = "carnival" version = "0.1.0" dependencies = [ "anchor-lang", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -994,6 +986,11 @@ name = "checking-accounts-anchor-program-example" version = "0.1.0" dependencies = [ "anchor-lang", + "borsh 1.6.1", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -1076,6 +1073,10 @@ name = "close-account-program" version = "0.1.0" dependencies = [ "anchor-lang", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -1181,6 +1182,11 @@ name = "counter_anchor" version = "0.1.0" dependencies = [ "anchor-lang", + "borsh 1.6.1", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -1228,6 +1234,10 @@ name = "create-system-account" version = "0.1.0" dependencies = [ "anchor-lang", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -1259,16 +1269,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array", - "subtle", -] - [[package]] name = "ctr" version = "0.9.2" @@ -1278,19 +1278,6 @@ dependencies = [ "cipher", ] -[[package]] -name = "curve25519-dalek" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "subtle", - "zeroize", -] - [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -1453,19 +1440,10 @@ dependencies = [ "digest 0.10.7", "elliptic-curve", "rfc6979", - "signature 2.2.0", + "signature", "spki", ] -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - [[package]] name = "ed25519" version = "2.2.3" @@ -1473,21 +1451,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ "pkcs8", - "signature 2.2.0", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.2.0", - "ed25519 1.5.3", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "zeroize", + "signature", ] [[package]] @@ -1496,8 +1460,8 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" dependencies = [ - "curve25519-dalek 4.1.3", - "ed25519 2.2.3", + "curve25519-dalek", + "ed25519", "rand_core 0.6.4", "serde", "sha2 0.10.9", @@ -1512,8 +1476,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b49a684b133c4980d7ee783936af771516011c8cd15f429dbda77245e282f03" dependencies = [ "derivation-path", - "ed25519-dalek 2.2.0", - "hmac 0.12.1", + "ed25519-dalek", + "hmac", "sha2 0.10.9", ] @@ -1715,21 +1679,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "generic-array" version = "0.14.7" @@ -1793,6 +1742,10 @@ name = "hand" version = "0.1.0" dependencies = [ "anchor-lang", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -1851,6 +1804,9 @@ name = "hello-solana-anchor" version = "0.1.0" dependencies = [ "anchor-lang", + "litesvm", + "solana-kite", + "solana-signer", ] [[package]] @@ -1874,16 +1830,6 @@ dependencies = [ "pinocchio-log", ] -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] - [[package]] name = "hmac" version = "0.12.1" @@ -1893,17 +1839,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "hmac-drbg" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" -dependencies = [ - "digest 0.9.0", - "generic-array", - "hmac 0.8.1", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -1992,7 +1927,7 @@ dependencies = [ "elliptic-curve", "once_cell", "sha2 0.10.9", - "signature 2.2.0", + "signature", ] [[package]] @@ -2021,6 +1956,10 @@ name = "lever" version = "0.1.0" dependencies = [ "anchor-lang", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -2038,14 +1977,12 @@ dependencies = [ "arrayref", "base64 0.12.3", "digest 0.9.0", - "hmac-drbg", "libsecp256k1-core", "libsecp256k1-gen-ecmult", "libsecp256k1-gen-genmult", "rand 0.7.3", "serde", "sha2 0.9.9", - "typenum", ] [[package]] @@ -2103,12 +2040,11 @@ dependencies = [ [[package]] name = "litesvm" -version = "0.8.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a22c52e9daf4680aee15e84c877808d94bbd4f3f66cdd32e0ba059d930d581e4" +checksum = "347d8c652d592c618ac996f2ab21f8c0b0f2da3fbbca227a6887ee61bb75f2de" dependencies = [ "agave-feature-set", - "agave-precompiles", "agave-reserved-account-keys", "agave-syscalls", "ansi_term", @@ -2118,6 +2054,7 @@ dependencies = [ "log", "serde", "solana-account 3.4.0", + "solana-address 2.4.0", "solana-address-lookup-table-interface 3.0.1", "solana-bpf-loader-program", "solana-builtins", @@ -2126,6 +2063,7 @@ dependencies = [ "solana-compute-budget-instruction", "solana-epoch-rewards 3.0.1", "solana-epoch-schedule 3.0.0", + "solana-feature-gate-interface 3.1.0", "solana-fee", "solana-fee-structure", "solana-hash 3.1.0", @@ -2142,7 +2080,6 @@ dependencies = [ "solana-precompile-error", "solana-program-error 3.0.1", "solana-program-runtime", - "solana-pubkey 3.0.0", "solana-rent 3.1.0", "solana-sdk-ids 3.1.0", "solana-sha256-hasher 3.1.0", @@ -2338,54 +2275,6 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" -[[package]] -name = "openssl" -version = "0.10.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "openssl-src" -version = "300.5.5+3.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f1787d533e03597a7934fd0a765f0d28e94ecc5fb7789f8053b1e699a56f709" -dependencies = [ - "cc", -] - -[[package]] -name = "openssl-sys" -version = "0.9.112" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" -dependencies = [ - "cc", - "libc", - "openssl-src", - "pkg-config", - "vcpkg", -] - [[package]] name = "parking_lot" version = "0.12.5" @@ -2435,6 +2324,10 @@ name = "pda-rent-payer" version = "0.1.0" dependencies = [ "anchor-lang", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -2555,12 +2448,6 @@ dependencies = [ "spki", ] -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - [[package]] name = "polyval" version = "0.6.2" @@ -2614,6 +2501,10 @@ name = "processing-instructions" version = "0.1.0" dependencies = [ "anchor-lang", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -2700,6 +2591,11 @@ name = "program-derived-addresses-program" version = "0.1.0" dependencies = [ "anchor-lang", + "borsh 1.6.1", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -2912,6 +2808,11 @@ name = "rent-example" version = "0.1.0" dependencies = [ "anchor-lang", + "borsh 1.6.1", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -2952,7 +2853,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "hmac 0.12.1", + "hmac", "subtle", ] @@ -3188,12 +3089,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - [[package]] name = "signature" version = "2.2.0" @@ -3301,7 +3196,7 @@ dependencies = [ "borsh 1.6.1", "bytemuck", "bytemuck_derive", - "curve25519-dalek 4.1.3", + "curve25519-dalek", "five8 1.0.0", "five8_const 1.0.0", "rand 0.9.2", @@ -3651,7 +3546,7 @@ checksum = "9a9eaec815ed773919bc7269c027933fc2472d7b9876f68ea6f1281c7daa5278" dependencies = [ "bytemuck", "bytemuck_derive", - "curve25519-dalek 4.1.3", + "curve25519-dalek", "solana-define-syscall 3.0.0", "subtle", "thiserror 2.0.18", @@ -3701,18 +3596,6 @@ dependencies = [ "uriparse", ] -[[package]] -name = "solana-ed25519-program" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1419197f1c06abf760043f6d64ba9d79a03ad5a43f18c7586471937122094da" -dependencies = [ - "bytemuck", - "bytemuck_derive", - "solana-instruction 3.3.0", - "solana-sdk-ids 3.1.0", -] - [[package]] name = "solana-epoch-info" version = "3.1.0" @@ -3865,9 +3748,17 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account 3.4.0", + "solana-account-info 3.1.1", + "solana-instruction 3.3.0", "solana-program-error 3.0.1", "solana-pubkey 4.1.0", + "solana-rent 4.1.0", "solana-sdk-ids 3.1.0", + "solana-system-interface 3.1.0", ] [[package]] @@ -4108,7 +3999,7 @@ version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" dependencies = [ - "ed25519-dalek 2.2.0", + "ed25519-dalek", "ed25519-dalek-bip32", "five8 1.0.0", "five8_core 1.0.0", @@ -4121,6 +4012,25 @@ dependencies = [ "solana-signer", ] +[[package]] +name = "solana-kite" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c6774af93647a15b51e266bc76f558fba11fbfbe30131b50664e665a8fea55" +dependencies = [ + "litesvm", + "solana-account 3.4.0", + "solana-instruction 3.3.0", + "solana-keypair", + "solana-message 3.1.0", + "solana-program 3.0.0", + "solana-pubkey 3.0.0", + "solana-signer", + "solana-transaction", + "spl-associated-token-account", + "spl-token", +] + [[package]] name = "solana-last-restart-slot" version = "2.2.1" @@ -4707,7 +4617,7 @@ dependencies = [ "borsh 1.6.1", "bytemuck", "bytemuck_derive", - "curve25519-dalek 4.1.3", + "curve25519-dalek", "five8 0.2.1", "five8_const 0.1.4", "getrandom 0.2.17", @@ -4886,20 +4796,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "solana-secp256k1-program" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad4cf8232f7aef9ff2dd95d701f63e3c11909dec2400def5c361be29d24291e7" -dependencies = [ - "digest 0.10.7", - "k256", - "serde", - "serde_derive", - "sha3", - "solana-signature", -] - [[package]] name = "solana-secp256k1-recover" version = "2.2.1" @@ -4922,18 +4818,6 @@ dependencies = [ "thiserror 2.0.18", ] -[[package]] -name = "solana-secp256r1-program" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "445d8e12592631d76fc4dc57858bae66c9fd7cc838c306c62a472547fc9d0ce6" -dependencies = [ - "bytemuck", - "openssl", - "solana-instruction 3.3.0", - "solana-sdk-ids 3.1.0", -] - [[package]] name = "solana-seed-derivable" version = "3.0.0" @@ -4949,7 +4833,7 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc905b200a95f2ea9146e43f2a7181e3aeb55de6bc12afb36462d00a3c7310de" dependencies = [ - "hmac 0.12.1", + "hmac", "pbkdf2", "sha2 0.10.9", ] @@ -5060,7 +4944,7 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "132a93134f1262aa832f1849b83bec6c9945669b866da18661a427943b9e801e" dependencies = [ - "ed25519-dalek 2.2.0", + "ed25519-dalek", "five8 1.0.0", "rand 0.9.2", "serde", @@ -5291,6 +5175,21 @@ dependencies = [ "solana-pubkey 3.0.0", ] +[[package]] +name = "solana-system-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a95a6f2e23ed861d6444ad4a6d6896c418d7d101b960787e65a8e33157cee81b" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-address 2.4.0", + "solana-instruction 3.3.0", + "solana-msg 3.1.0", + "solana-program-error 3.0.1", +] + [[package]] name = "solana-system-program" version = "3.1.11" @@ -5595,7 +5494,7 @@ dependencies = [ "bincode", "bytemuck", "bytemuck_derive", - "curve25519-dalek 4.1.3", + "curve25519-dalek", "getrandom 0.2.17", "itertools 0.12.1", "js-sys", @@ -5649,7 +5548,7 @@ dependencies = [ "bincode", "bytemuck", "bytemuck_derive", - "curve25519-dalek 4.1.3", + "curve25519-dalek", "itertools 0.12.1", "merlin", "num-derive", @@ -5682,12 +5581,39 @@ dependencies = [ "der", ] +[[package]] +name = "spl-associated-token-account" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0242277e290c023de8826f504abcf9206b3cd4e18d9ace4ec59a698b2828e88b" +dependencies = [ + "borsh 1.6.1", + "num-derive", + "num-traits", + "solana-account-info 3.1.1", + "solana-cpi 3.1.0", + "solana-instruction 3.3.0", + "solana-msg 3.1.0", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-system-interface 2.0.0", + "solana-sysvar 3.1.1", + "spl-associated-token-account-interface", + "spl-token-2022-interface", + "spl-token-interface", + "thiserror 2.0.18", +] + [[package]] name = "spl-associated-token-account-interface" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6433917b60441d68d99a17e121d9db0ea15a9a69c0e5afa34649cf5ba12612f" dependencies = [ + "borsh 1.6.1", "solana-instruction 3.3.0", "solana-pubkey 3.0.0", ] @@ -5747,6 +5673,34 @@ dependencies = [ "thiserror 2.0.18", ] +[[package]] +name = "spl-token" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878b0183d51fcd8a53e1604f4c13321894cf53227e6773c529b0d03d499a8dfd" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-account-info 3.1.1", + "solana-cpi 3.1.0", + "solana-instruction 3.3.0", + "solana-msg 3.1.0", + "solana-program-entrypoint 3.1.1", + "solana-program-error 3.0.1", + "solana-program-memory 3.1.0", + "solana-program-option 3.1.0", + "solana-program-pack 3.1.0", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids 3.1.0", + "solana-sysvar 3.1.1", + "spl-token-interface", + "thiserror 2.0.18", +] + [[package]] name = "spl-token-2022-interface" version = "2.1.0" @@ -5801,7 +5755,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0cd59fce3dc00f563c6fa364d67c3f200d278eae681f4dc250240afcfe044b1" dependencies = [ - "curve25519-dalek 4.1.3", + "curve25519-dalek", "solana-zk-sdk", "thiserror 2.0.18", ] @@ -6112,6 +6066,10 @@ name = "transfer-sol" version = "0.1.0" dependencies = [ "anchor-lang", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -6192,12 +6150,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.5" diff --git a/Cargo.toml b/Cargo.toml index 66c8b33cb..a0a7bcb2f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -83,7 +83,7 @@ pinocchio-system = "0.5.0" pinocchio-pubkey = "0.3.0" # testing -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-pubkey = "3.0.0" diff --git a/README.md b/README.md index fbf57e865..e19d4b286 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Program Examples -## Onchain program examples for :anchor: Anchor, :crab: Native Rust, and :boy: Pinocchio. +## Onchain program examples for ⚓ Anchor, 🦀 Native Rust, and 🤥 Pinocchio. [![Anchor](https://github.com/solana-developers/program-examples/actions/workflows/anchor.yml/badge.svg?event=schedule)](https://github.com/solana-developers/program-examples/actions/workflows/anchor.yml) [![Native](https://github.com/solana-developers/program-examples/actions/workflows/solana-native.yml/badge.svg?event=schedule)](https://github.com/solana-developers/program-examples/actions/workflows/solana-native.yml) [![Pinocchio](https://github.com/solana-developers/program-examples/actions/workflows/solana-pinocchio.yml/badge.svg?event=schedule)](https://github.com/solana-developers/program-examples/actions/workflows/solana-pinocchio.yml) diff --git a/basics/account-data/anchor/Anchor.toml b/basics/account-data/anchor/Anchor.toml index b3e350150..da5743131 100644 --- a/basics/account-data/anchor/Anchor.toml +++ b/basics/account-data/anchor/Anchor.toml @@ -2,18 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false +resolution = true skip-lint = false [programs.localnet] -account_data_anchor_program = "GpVcgWdgVErgLqsn8VYUch6EqDerMgNqoLSmGyKrd6MR" - -# [registry] section removed — no longer used in Anchor 1.0 +account_data_anchor_program = "77pvTicQMoPQXrf97tCtuzgPQuS69U5oYsU99LYdqyLF" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" -litesvm-test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/litesvm.test.ts" #For litesvm test +test = "cargo test" + +[hooks] diff --git a/basics/account-data/anchor/package.json b/basics/account-data/anchor/package.json deleted file mode 100644 index fcb292b38..000000000 --- a/basics/account-data/anchor/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "litesvm": "^0.3.3", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - }, - "type": "module" -} diff --git a/basics/account-data/anchor/pnpm-lock.yaml b/basics/account-data/anchor/pnpm-lock.yaml deleted file mode 100644 index fea07a0c0..000000000 --- a/basics/account-data/anchor/pnpm-lock.yaml +++ /dev/null @@ -1,1463 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.0 - version: 4.3.16 - '@types/mocha': - specifier: ^9.0.0 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.4.1 - litesvm: - specifier: ^0.3.3 - version: 0.3.3(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - mocha: - specifier: ^9.0.3 - version: 9.2.2 - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^5.3.3 - version: 5.9.3 - -packages: - - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} - engines: {node: '>=10'} - peerDependencies: - '@solana/web3.js': ^1.69.0 - - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} - engines: {node: '>=17'} - - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} - engines: {node: '>=10'} - - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.4.2': - resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.12': - resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.11': - resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base-x@5.0.1: - resolution: {integrity: sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - bs58@6.0.0: - resolution: {integrity: sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-layout@1.2.2: - resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} - engines: {node: '>=4.5'} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - cross-fetch@3.2.0: - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.1.1: - resolution: {integrity: sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - litesvm-darwin-arm64@0.3.3: - resolution: {integrity: sha512-81YimsV3ezWjWLgoKixsXfVznaaecbURE3RtECgNb6Din6Za03pKGKGEN4gkyecHkv8uoPaEZv5cl6ARsgeN1Q==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - litesvm-darwin-x64@0.3.3: - resolution: {integrity: sha512-pYietuU165Bl+2eDnVp2Eidiedfjt+pljyyBAfJPbYriaFyG577mU364NiNcsfQ8ZZWbe+ygIEAVq4Ol247+1g==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - litesvm-linux-arm64-musl@0.3.3: - resolution: {integrity: sha512-mkI15rWtNbaJxVFUfh+qnolqnDCZEqhwSZo/XZ48TZNsQ69vAqY00KhyFhTVJ+jeaYCAZTSNamuFIiRBxqVmNg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [musl] - - litesvm-linux-x64-gnu@0.3.3: - resolution: {integrity: sha512-Qai2/E8Eq03w8VKnJDREyiWxwavjykW/H6onE179ayMnBjVVmkj5fN7XF50VV4z73kasx5bpDzBNK8fcaxMdzA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [glibc] - - litesvm-linux-x64-musl@0.3.3: - resolution: {integrity: sha512-bpWZ2f506hbfu1y6bkmuZf+qqtnLDxggpOMTQbibjd+q6faEO3sETWwKGlIgHB99P8wyU+aXKwLSGQX2sJEw6Q==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [musl] - - litesvm@0.3.3: - resolution: {integrity: sha512-QHXjAIXzvG0uAMOza6aJcYl19yTKz3guwq/z0Zml4KnQxyQvPhjaBpUFc5sf2ey/NxMVdqFhoXmL02CXOOomjw==} - engines: {node: '>= 20'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.0.2: - resolution: {integrity: sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@0.15.5: - resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - buffer-layout: 1.2.2 - - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 - '@noble/hashes': 1.8.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - bs58: 4.0.1 - buffer-layout: 1.2.2 - camelcase: 6.3.0 - cross-fetch: 3.2.0 - eventemitter3: 4.0.7 - pako: 2.1.0 - superstruct: 0.15.5 - toml: 3.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@anchor-lang/errors@1.0.0-rc.5': {} - - '@babel/runtime@7.25.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@noble/curves@1.4.2': - dependencies: - '@noble/hashes': 1.4.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.2 - typescript: 5.9.3 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.25.0 - '@noble/curves': 1.4.2 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - agentkeepalive: 4.5.0 - bn.js: 5.2.2 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.1.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.0.2 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.12': - dependencies: - tslib: 2.6.2 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.11 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.11 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.11': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.11 - - '@types/ws@8.5.12': - dependencies: - '@types/node': 20.12.11 - - '@ungap/promise-all-settled@1.1.2': {} - - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base-x@5.0.1: {} - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.2 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - bs58@6.0.0: - dependencies: - base-x: 5.0.1 - - buffer-from@1.1.2: {} - - buffer-layout@1.2.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - camelcase@6.3.0: {} - - chai@4.4.1: - 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.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@14.0.2: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - cross-fetch@3.2.0: - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@4.0.7: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - - jayson@4.1.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - JSONStream: 1.3.5 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - jsonparse@1.3.1: {} - - litesvm-darwin-arm64@0.3.3: - optional: true - - litesvm-darwin-x64@0.3.3: - optional: true - - litesvm-linux-arm64-musl@0.3.3: - optional: true - - litesvm-linux-x64-gnu@0.3.3: - optional: true - - litesvm-linux-x64-musl@0.3.3: - optional: true - - litesvm@0.3.3(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - bs58: 6.0.0 - fastestsmallesttextencoderdecoder: 1.0.22 - optionalDependencies: - litesvm-darwin-arm64: 0.3.3 - litesvm-darwin-x64: 0.3.3 - litesvm-linux-arm64-musl: 0.3.3 - litesvm-linux-x64-gnu: 0.3.3 - litesvm-linux-x64-musl: 0.3.3 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - pako@2.1.0: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - regenerator-runtime@0.14.1: {} - - require-directory@2.1.1: {} - - rpc-websockets@9.0.2: - dependencies: - '@swc/helpers': 0.5.12 - '@types/uuid': 8.3.4 - '@types/ws': 8.5.12 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@0.15.5: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - through@2.3.8: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toml@3.0.0: {} - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.6.2: {} - - type-detect@4.0.8: {} - - typescript@5.9.3: {} - - undici-types@5.26.5: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/account-data/anchor/programs/anchor-program-example/Cargo.toml b/basics/account-data/anchor/programs/anchor-program-example/Cargo.toml index 2d23f9606..0adedc17f 100644 --- a/basics/account-data/anchor/programs/anchor-program-example/Cargo.toml +++ b/basics/account-data/anchor/programs/anchor-program-example/Cargo.toml @@ -20,8 +20,14 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/account-data/anchor/programs/anchor-program-example/src/lib.rs b/basics/account-data/anchor/programs/anchor-program-example/src/lib.rs index 52ae01807..1221bc675 100644 --- a/basics/account-data/anchor/programs/anchor-program-example/src/lib.rs +++ b/basics/account-data/anchor/programs/anchor-program-example/src/lib.rs @@ -5,7 +5,7 @@ pub mod constants; pub mod instructions; pub mod state; -declare_id!("GpVcgWdgVErgLqsn8VYUch6EqDerMgNqoLSmGyKrd6MR"); +declare_id!("77pvTicQMoPQXrf97tCtuzgPQuS69U5oYsU99LYdqyLF"); #[program] pub mod account_data_anchor_program { diff --git a/basics/account-data/anchor/programs/anchor-program-example/tests/test_account_data.rs b/basics/account-data/anchor/programs/anchor-program-example/tests/test_account_data.rs new file mode 100644 index 000000000..df3bac0a0 --- /dev/null +++ b/basics/account-data/anchor/programs/anchor-program-example/tests/test_account_data.rs @@ -0,0 +1,66 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + AnchorSerialize, InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// Deserialize the AddressInfo account (8-byte discriminator + fields). +#[derive(BorshDeserialize)] +struct AddressInfoAccount { + _discriminator: [u8; 8], + name: String, + house_number: u8, + street: String, + city: String, +} + +#[test] +fn test_create_address_info() { + let program_id = account_data_anchor_program::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/account_data_anchor_program.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let address_info_keypair = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &account_data_anchor_program::instruction::CreateAddressInfo { + name: "Joe C".to_string(), + house_number: 136, + street: "Mile High Dr.".to_string(), + city: "Solana Beach".to_string(), + } + .data(), + account_data_anchor_program::accounts::CreateAddressInfo { + payer: payer.pubkey(), + address_info: address_info_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &address_info_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Read the account data back + let account = svm.get_account(&address_info_keypair.pubkey()).unwrap(); + let info = AddressInfoAccount::deserialize(&mut &account.data[..]).unwrap(); + + assert_eq!(info.name, "Joe C"); + assert_eq!(info.house_number, 136); + assert_eq!(info.street, "Mile High Dr."); + assert_eq!(info.city, "Solana Beach"); +} diff --git a/basics/account-data/anchor/tests/litesvm.test.ts b/basics/account-data/anchor/tests/litesvm.test.ts deleted file mode 100644 index 2136f1caa..000000000 --- a/basics/account-data/anchor/tests/litesvm.test.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { BorshCoder } from "@anchor-lang/core"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import { LiteSVM } from "litesvm"; - -import IDL from "../target/idl/account_data_anchor_program.json" with { - type: "json", -}; - -describe("Account Data!", () => { - let litesvm: LiteSVM; - let programId: PublicKey; - let payer: Keypair; - let addressInfoAccount: Keypair; - const coder = new BorshCoder(IDL); - - before(() => { - litesvm = new LiteSVM(); - programId = new PublicKey(IDL.address); - payer = Keypair.generate(); - addressInfoAccount = Keypair.generate(); - - const programPath = new URL( - "../target/deploy/account_data_anchor_program.so", - // @ts-ignore - import.meta.url, - ).pathname; - litesvm.addProgramFromFile(programId, programPath); - - litesvm.airdrop(payer.publicKey, BigInt(100000000000)); - }); - - it("Create the address info account", () => { - console.log(`Payer Address : ${payer.publicKey}`); - console.log(`Address Info Acct : ${addressInfoAccount.publicKey}`); - - // Instruction Ix data - const addressInfoIns = { - name: "Joe C", - house_number: 136, - street: "Mile High Dr.", - city: "Solana Beach", - }; - - /** - * Convert into buffer and encode of instruction and arguments - */ - const data = coder.instruction.encode( - "create_address_info", - addressInfoIns, - ); - - /** - * Create Transactions - */ - - const ix = new TransactionInstruction({ - keys: [ - { - pubkey: payer.publicKey, - isSigner: true, - isWritable: true, - }, - { - pubkey: addressInfoAccount.publicKey, - isSigner: true, - isWritable: true, - }, - { - pubkey: SystemProgram.programId, - isSigner: false, - isWritable: false, - }, - ], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = litesvm.latestBlockhash(); - tx.sign(payer, addressInfoAccount); - const res = litesvm.sendTransaction(tx); - // console.log(res.toString()); - }); - it("Read the new account's data", () => { - const accountInfoAcc = litesvm.getAccount(addressInfoAccount.publicKey); - if (!accountInfoAcc) { - throw new Error("Failed to fetch account info"); - } - - /** - * Decode the accounts' data - */ - const addressInfo = coder.accounts.decode( - "AddressInfo", - Buffer.from(accountInfoAcc.data), - ); - - console.log(`Name : ${addressInfo.name}`); - console.log(`House Num: ${addressInfo.house_number}`); - console.log(`Street : ${addressInfo.street}`); - console.log(`City : ${addressInfo.city}`); - }); -}); diff --git a/basics/account-data/anchor/tests/test.ts b/basics/account-data/anchor/tests/test.ts deleted file mode 100644 index b8822eabd..000000000 --- a/basics/account-data/anchor/tests/test.ts +++ /dev/null @@ -1,51 +0,0 @@ -import * as anchor from "@anchor-lang/core"; -import { Keypair } from "@solana/web3.js"; -import type { AccountDataAnchorProgram } from "../target/types/account_data_anchor_program"; - -describe("Account Data!", () => { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const payer = provider.wallet as anchor.Wallet; - const program = anchor.workspace - .AccountDataAnchorProgram as anchor.Program; - - // Generate a new keypair for the addressInfo account - const addressInfoAccount = new Keypair(); - - it("Create the address info account", async () => { - console.log(`Payer Address : ${payer.publicKey}`); - console.log(`Address Info Acct : ${addressInfoAccount.publicKey}`); - - // Instruction Ix data - const addressInfo = { - name: "Joe C", - houseNumber: 136, - street: "Mile High Dr.", - city: "Solana Beach", - }; - - await program.methods - .createAddressInfo( - addressInfo.name, - addressInfo.houseNumber, - addressInfo.street, - addressInfo.city, - ) - .accounts({ - addressInfo: addressInfoAccount.publicKey, - payer: payer.publicKey, - }) - .signers([addressInfoAccount]) - .rpc(); - }); - - it("Read the new account's data", async () => { - const addressInfo = await program.account.addressInfo.fetch( - addressInfoAccount.publicKey, - ); - console.log(`Name : ${addressInfo.name}`); - console.log(`House Num: ${addressInfo.houseNumber}`); - console.log(`Street : ${addressInfo.street}`); - console.log(`City : ${addressInfo.city}`); - }); -}); diff --git a/basics/account-data/anchor/tsconfig.json b/basics/account-data/anchor/tsconfig.json deleted file mode 100644 index cd5d2e3d0..000000000 --- a/basics/account-data/anchor/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "commonjs", - "target": "es6", - "esModuleInterop": true - } -} diff --git a/basics/account-data/native/program/Cargo.toml b/basics/account-data/native/program/Cargo.toml index 968f41b7f..acdb1be45 100644 --- a/basics/account-data/native/program/Cargo.toml +++ b/basics/account-data/native/program/Cargo.toml @@ -20,7 +20,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-keypair = "3.0.1" solana-message = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/account-data/native/tests/test.ts b/basics/account-data/native/tests/test.ts index 3965804f5..5af298222 100644 --- a/basics/account-data/native/tests/test.ts +++ b/basics/account-data/native/tests/test.ts @@ -1,88 +1,76 @@ import { Buffer } from "node:buffer"; import { describe, test } from "node:test"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; import * as borsh from "borsh"; import { start } from "solana-bankrun"; const AddressInfoSchema = { - struct: { - name: "string", - house_number: "u8", - street: "string", - city: "string", - }, + struct: { + name: "string", + house_number: "u8", + street: "string", + city: "string", + }, }; type AddressInfo = { - name: string; - house_number: number; - street: string; - city: string; + name: string; + house_number: number; + street: string; + city: string; }; function borshSerialize(schema: borsh.Schema, data: object): Buffer { - return Buffer.from(borsh.serialize(schema, data)); + return Buffer.from(borsh.serialize(schema, data)); } describe("Account Data!", async () => { - const addressInfoAccount = Keypair.generate(); - const PROGRAM_ID = PublicKey.unique(); - const context = await start( - [{ name: "account_data_native_program", programId: PROGRAM_ID }], - [], - ); - const client = context.banksClient; + const addressInfoAccount = Keypair.generate(); + const PROGRAM_ID = PublicKey.unique(); + const context = await start([{ name: "account_data_native_program", programId: PROGRAM_ID }], []); + const client = context.banksClient; - test("Create the address info account", async () => { - const payer = context.payer; + test("Create the address info account", async () => { + const payer = context.payer; - console.log(`Program Address : ${PROGRAM_ID}`); - console.log(`Payer Address : ${payer.publicKey}`); - console.log(`Address Info Acct : ${addressInfoAccount.publicKey}`); + console.log(`Program Address : ${PROGRAM_ID}`); + console.log(`Payer Address : ${payer.publicKey}`); + console.log(`Address Info Acct : ${addressInfoAccount.publicKey}`); - const ix = new TransactionInstruction({ - keys: [ - { - pubkey: addressInfoAccount.publicKey, - isSigner: true, - isWritable: true, - }, - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: borshSerialize(AddressInfoSchema, { - name: "Joe C", - house_number: 136, - street: "Mile High Dr.", - city: "Solana Beach", - }), - }); + const ix = new TransactionInstruction({ + keys: [ + { + pubkey: addressInfoAccount.publicKey, + isSigner: true, + isWritable: true, + }, + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId: PROGRAM_ID, + data: borshSerialize(AddressInfoSchema, { + name: "Joe C", + house_number: 136, + street: "Mile High Dr.", + city: "Solana Beach", + }), + }); - const blockhash = context.lastBlockhash; + const blockhash = context.lastBlockhash; - const tx = new Transaction(); - tx.recentBlockhash = blockhash; - tx.add(ix).sign(payer, addressInfoAccount); - await client.processTransaction(tx); - }); + const tx = new Transaction(); + tx.recentBlockhash = blockhash; + tx.add(ix).sign(payer, addressInfoAccount); + await client.processTransaction(tx); + }); - test("Read the new account's data", async () => { - const accountInfo = await client.getAccount(addressInfoAccount.publicKey); + test("Read the new account's data", async () => { + const accountInfo = await client.getAccount(addressInfoAccount.publicKey); - const readAddressInfo = borsh.deserialize( - AddressInfoSchema, - Buffer.from(accountInfo.data), - ) as AddressInfo; - console.log(`Name : ${readAddressInfo.name}`); - console.log(`House Num: ${readAddressInfo.house_number}`); - console.log(`Street : ${readAddressInfo.street}`); - console.log(`City : ${readAddressInfo.city}`); - }); + const readAddressInfo = borsh.deserialize(AddressInfoSchema, Buffer.from(accountInfo.data)) as AddressInfo; + console.log(`Name : ${readAddressInfo.name}`); + console.log(`House Num: ${readAddressInfo.house_number}`); + console.log(`Street : ${readAddressInfo.street}`); + console.log(`City : ${readAddressInfo.city}`); + }); }); diff --git a/basics/account-data/pinocchio/program/Cargo.toml b/basics/account-data/pinocchio/program/Cargo.toml index c79283770..4239753c5 100644 --- a/basics/account-data/pinocchio/program/Cargo.toml +++ b/basics/account-data/pinocchio/program/Cargo.toml @@ -9,7 +9,7 @@ pinocchio-log.workspace = true pinocchio-system.workspace = true [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-keypair = "3.0.1" solana-message = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/account-data/pinocchio/tests/index.test.ts b/basics/account-data/pinocchio/tests/index.test.ts index 1fac4271e..825ab4e67 100644 --- a/basics/account-data/pinocchio/tests/index.test.ts +++ b/basics/account-data/pinocchio/tests/index.test.ts @@ -1,149 +1,142 @@ import { readFileSync } from "node:fs"; import { describe, test } from "node:test"; -import { - Keypair, - LAMPORTS_PER_SOL, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; +import { Keypair, LAMPORTS_PER_SOL, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; import { LiteSVM } from "litesvm"; interface AddressInfo { - name: string; - house_number: number; - street: string; - city: string; + name: string; + house_number: number; + street: string; + city: string; } function toBytes(addressInfo: AddressInfo): Buffer { - const data: number[] = []; + const data: number[] = []; - // Add instruction discriminator - data.push(0); + // Add instruction discriminator + data.push(0); - // Pad name to 16 bytes (data[1..17]) - const nameBytes = Buffer.from(addressInfo.name, "utf-8"); - const namePadded = Buffer.alloc(16); - nameBytes.copy(namePadded, 0, 0, Math.min(nameBytes.length, 16)); - data.push(...namePadded); + // Pad name to 16 bytes (data[1..17]) + const nameBytes = Buffer.from(addressInfo.name, "utf-8"); + const namePadded = Buffer.alloc(16); + nameBytes.copy(namePadded, 0, 0, Math.min(nameBytes.length, 16)); + data.push(...namePadded); - // Add 1 byte padding at index 17 - data.push(0); + // Add 1 byte padding at index 17 + data.push(0); - // Add house_number at index 18 - data.push(addressInfo.house_number); + // Add house_number at index 18 + data.push(addressInfo.house_number); - // Pad street to 16 bytes (data[19..35]) - const streetBytes = Buffer.from(addressInfo.street, "utf-8"); - const streetPadded = Buffer.alloc(16); - streetBytes.copy(streetPadded, 0, 0, Math.min(streetBytes.length, 16)); - data.push(...streetPadded); + // Pad street to 16 bytes (data[19..35]) + const streetBytes = Buffer.from(addressInfo.street, "utf-8"); + const streetPadded = Buffer.alloc(16); + streetBytes.copy(streetPadded, 0, 0, Math.min(streetBytes.length, 16)); + data.push(...streetPadded); - // Add 1 byte padding at index 35 - data.push(0); + // Add 1 byte padding at index 35 + data.push(0); - // Pad city to 16 bytes (data[36..52]) - const cityBytes = Buffer.from(addressInfo.city, "utf-8"); - const cityPadded = Buffer.alloc(16); - cityBytes.copy(cityPadded, 0, 0, Math.min(cityBytes.length, 16)); - data.push(...cityPadded); + // Pad city to 16 bytes (data[36..52]) + const cityBytes = Buffer.from(addressInfo.city, "utf-8"); + const cityPadded = Buffer.alloc(16); + cityBytes.copy(cityPadded, 0, 0, Math.min(cityBytes.length, 16)); + data.push(...cityPadded); - return Buffer.from(data); + return Buffer.from(data); } function fromBytes(buffer: Buffer): AddressInfo { - // name: bytes 0..16 - const nameBytes = buffer.subarray(0, 16); - const name = nameBytes.toString("utf-8").replace(/\0/g, ""); + // name: bytes 0..16 + const nameBytes = buffer.subarray(0, 16); + const name = nameBytes.toString("utf-8").replace(/\0/g, ""); - // house_number: byte 17 - const house_number = buffer[17]; + // house_number: byte 17 + const house_number = buffer[17]; - // street: bytes 18..34 - const streetBytes = buffer.subarray(18, 34); - const street = streetBytes.toString("utf-8").replace(/\0/g, ""); + // street: bytes 18..34 + const streetBytes = buffer.subarray(18, 34); + const street = streetBytes.toString("utf-8").replace(/\0/g, ""); - // city: bytes 35..51 - const cityBytes = buffer.subarray(35, 51); - const city = cityBytes.toString("utf-8").replace(/\0/g, ""); + // city: bytes 35..51 + const cityBytes = buffer.subarray(35, 51); + const city = cityBytes.toString("utf-8").replace(/\0/g, ""); - return { name, house_number, street, city }; + return { name, house_number, street, city }; } describe("Account Data!", () => { - // Load the program keypair - const programKeypairPath = new URL( - "./fixtures/account_data_pinocchio_program-keypair.json", - // @ts-ignore - import.meta.url, - ).pathname; - const programKeypairData = JSON.parse(readFileSync(programKeypairPath, "utf-8")); - const programKeypair = Keypair.fromSecretKey(new Uint8Array(programKeypairData)); - const PROGRAM_ID = programKeypair.publicKey; - - // Load the program - const programPath = new URL( - "./fixtures/account_data_pinocchio_program.so", - // @ts-ignore - import.meta.url, - ).pathname; - - const litesvm = new LiteSVM(); - litesvm.addProgramFromFile(PROGRAM_ID, programPath); - - const payer = Keypair.generate(); - litesvm.airdrop(payer.publicKey, BigInt(100 * LAMPORTS_PER_SOL)); - - const addressInfoAccount = Keypair.generate(); - - test("Create the address info account", () => { - console.log(`Program Address : ${PROGRAM_ID}`); - console.log(`Payer Address : ${payer.publicKey}`); - console.log(`Address Info Acct : ${addressInfoAccount.publicKey}`); - - const addressInfo: AddressInfo = { - name: "Joe C", - house_number: 136, - street: "Mile High Dr.", - city: "Solana Beach", - }; - - const ix = new TransactionInstruction({ - keys: [ - { - pubkey: addressInfoAccount.publicKey, - isSigner: true, - isWritable: true, - }, - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: PROGRAM_ID, - data: toBytes(addressInfo), - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = litesvm.latestBlockhash(); - tx.sign(payer, addressInfoAccount); - - litesvm.sendTransaction(tx); - }); - - test("Read the new account's data", () => { - const accountInfo = litesvm.getAccount(addressInfoAccount.publicKey); - - if (!accountInfo) { - throw new Error("Account not found"); - } - - const readAddressInfo = fromBytes(Buffer.from(accountInfo.data)); - - console.log(`Name : ${readAddressInfo.name}`); - console.log(`House Num: ${readAddressInfo.house_number}`); - console.log(`Street : ${readAddressInfo.street}`); - console.log(`City : ${readAddressInfo.city}`); - }); + // Load the program keypair + const programKeypairPath = new URL( + "./fixtures/account_data_pinocchio_program-keypair.json", + // @ts-expect-error + import.meta.url, + ).pathname; + const programKeypairData = JSON.parse(readFileSync(programKeypairPath, "utf-8")); + const programKeypair = Keypair.fromSecretKey(new Uint8Array(programKeypairData)); + const PROGRAM_ID = programKeypair.publicKey; + + // Load the program + const programPath = new URL( + "./fixtures/account_data_pinocchio_program.so", + // @ts-expect-error + import.meta.url, + ).pathname; + + const litesvm = new LiteSVM(); + litesvm.addProgramFromFile(PROGRAM_ID, programPath); + + const payer = Keypair.generate(); + litesvm.airdrop(payer.publicKey, BigInt(100 * LAMPORTS_PER_SOL)); + + const addressInfoAccount = Keypair.generate(); + + test("Create the address info account", () => { + console.log(`Program Address : ${PROGRAM_ID}`); + console.log(`Payer Address : ${payer.publicKey}`); + console.log(`Address Info Acct : ${addressInfoAccount.publicKey}`); + + const addressInfo: AddressInfo = { + name: "Joe C", + house_number: 136, + street: "Mile High Dr.", + city: "Solana Beach", + }; + + const ix = new TransactionInstruction({ + keys: [ + { + pubkey: addressInfoAccount.publicKey, + isSigner: true, + isWritable: true, + }, + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId: PROGRAM_ID, + data: toBytes(addressInfo), + }); + + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = litesvm.latestBlockhash(); + tx.sign(payer, addressInfoAccount); + + litesvm.sendTransaction(tx); + }); + + test("Read the new account's data", () => { + const accountInfo = litesvm.getAccount(addressInfoAccount.publicKey); + + if (!accountInfo) { + throw new Error("Account not found"); + } + + const readAddressInfo = fromBytes(Buffer.from(accountInfo.data)); + + console.log(`Name : ${readAddressInfo.name}`); + console.log(`House Num: ${readAddressInfo.house_number}`); + console.log(`Street : ${readAddressInfo.street}`); + console.log(`City : ${readAddressInfo.city}`); + }); }); - diff --git a/basics/checking-accounts/anchor/Anchor.toml b/basics/checking-accounts/anchor/Anchor.toml index cc8f9ed12..39bc5ddd9 100644 --- a/basics/checking-accounts/anchor/Anchor.toml +++ b/basics/checking-accounts/anchor/Anchor.toml @@ -2,15 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false -[programs.localnet] -checking_account_program = "ECWPhR3rJbaPfyNFgphnjxSEexbTArc7vxD8fnW6tgKw" +resolution = true +skip-lint = false -# [registry] section removed — no longer used in Anchor 1.0 +[programs.localnet] +checking_account_program = "B56s2CGHWSG9HzzyYS5USQNYPJsB2teiUSKgG5CKpr2o" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/checking-accounts/anchor/package.json b/basics/checking-accounts/anchor/package.json index 31ba94982..a2f52fb80 100644 --- a/basics/checking-accounts/anchor/package.json +++ b/basics/checking-accounts/anchor/package.json @@ -1,18 +1,18 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "anchor-bankrun": "^0.4.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "anchor-bankrun": "^0.4.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/basics/checking-accounts/anchor/pnpm-lock.yaml b/basics/checking-accounts/anchor/pnpm-lock.yaml index d0feff1e4..e6ecdc446 100644 --- a/basics/checking-accounts/anchor/pnpm-lock.yaml +++ b/basics/checking-accounts/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -45,18 +45,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.25.0': @@ -768,16 +768,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -795,7 +795,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.25.0': dependencies: diff --git a/basics/checking-accounts/anchor/programs/anchor-program-example/Cargo.toml b/basics/checking-accounts/anchor/programs/anchor-program-example/Cargo.toml index a38a4ffcd..c02b5a14f 100644 --- a/basics/checking-accounts/anchor/programs/anchor-program-example/Cargo.toml +++ b/basics/checking-accounts/anchor/programs/anchor-program-example/Cargo.toml @@ -20,8 +20,14 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/checking-accounts/anchor/programs/anchor-program-example/src/lib.rs b/basics/checking-accounts/anchor/programs/anchor-program-example/src/lib.rs index 7eb51baa7..1b5edb40e 100644 --- a/basics/checking-accounts/anchor/programs/anchor-program-example/src/lib.rs +++ b/basics/checking-accounts/anchor/programs/anchor-program-example/src/lib.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; -declare_id!("ECWPhR3rJbaPfyNFgphnjxSEexbTArc7vxD8fnW6tgKw"); +declare_id!("B56s2CGHWSG9HzzyYS5USQNYPJsB2teiUSKgG5CKpr2o"); #[program] pub mod checking_account_program { diff --git a/basics/checking-accounts/anchor/programs/anchor-program-example/tests/test_checking_accounts.rs b/basics/checking-accounts/anchor/programs/anchor-program-example/tests/test_checking_accounts.rs new file mode 100644 index 000000000..33de2b6b8 --- /dev/null +++ b/basics/checking-accounts/anchor/programs/anchor-program-example/tests/test_checking_accounts.rs @@ -0,0 +1,61 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_instruction, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +#[test] +fn test_check_accounts() { + let program_id = checking_account_program::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/checking_account_program.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let account_to_change = Keypair::new(); + let account_to_create = Keypair::new(); + + // First, create an account owned by our program (like the TS test does) + let rent_exempt_balance = svm.minimum_balance_for_rent_exemption(0); + let create_account_ix = system_instruction::create_account( + &payer.pubkey(), + &account_to_change.pubkey(), + rent_exempt_balance, + 0, + &program_id, + ); + send_transaction_from_instructions( + &mut svm, + vec![create_account_ix], + &[&payer, &account_to_change], + &payer.pubkey(), + ) + .unwrap(); + + svm.expire_blockhash(); + + // Now call check_accounts + let check_accounts_ix = Instruction::new_with_bytes( + program_id, + &checking_account_program::instruction::CheckAccounts {}.data(), + checking_account_program::accounts::CheckingAccounts { + payer: payer.pubkey(), + account_to_create: account_to_create.pubkey(), + account_to_change: account_to_change.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![check_accounts_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); +} diff --git a/basics/checking-accounts/anchor/tests/bankrun.test.ts b/basics/checking-accounts/anchor/tests/bankrun.test.ts index d47712601..cb9839edf 100644 --- a/basics/checking-accounts/anchor/tests/bankrun.test.ts +++ b/basics/checking-accounts/anchor/tests/bankrun.test.ts @@ -1,63 +1,52 @@ import { describe, it } from "node:test"; import * as anchor from "@anchor-lang/core"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, -} from "@solana/web3.js"; +import { Keypair, PublicKey, SystemProgram, Transaction } from "@solana/web3.js"; import { BankrunProvider } from "anchor-bankrun"; import { startAnchor } from "solana-bankrun"; +import IDL from "../target/idl/checking_account_program.json" with { type: "json" }; import type { CheckingAccountProgram } from "../target/types/checking_account_program"; -import IDL from "../target/idl/checking_account_program.json" with { - type: "json", -}; const PROGRAM_ID = new PublicKey(IDL.address); describe("Bankrun example", async () => { - const context = await startAnchor( - "", - [{ name: "checking_account_program", programId: PROGRAM_ID }], - [], - ); - const provider = new BankrunProvider(context); - - const wallet = provider.wallet as anchor.Wallet; - const program = new anchor.Program(IDL, provider); - const client = context.banksClient; - - // We'll create this ahead of time. - // Our program will try to modify it. - const accountToChange = new Keypair(); - // Our program will create this. - const accountToCreate = new Keypair(); - - it("Create an account owned by our program", async () => { - const instruction = SystemProgram.createAccount({ - fromPubkey: provider.wallet.publicKey, - newAccountPubkey: accountToChange.publicKey, - lamports: await provider.connection.getMinimumBalanceForRentExemption(0), - space: 0, - programId: program.programId, // Our program - }); - - const transaction = new Transaction(); - const blockhash = context.lastBlockhash; - - transaction.recentBlockhash = blockhash; - transaction.add(instruction).sign(wallet.payer, accountToChange); - await client.processTransaction(transaction); - }); - - it("Check accounts", async () => { - await program.methods - .checkAccounts() - .accounts({ - payer: wallet.publicKey, - accountToCreate: accountToCreate.publicKey, - accountToChange: accountToChange.publicKey, - }) - .rpc(); - }); + const context = await startAnchor("", [{ name: "checking_account_program", programId: PROGRAM_ID }], []); + const provider = new BankrunProvider(context); + + const wallet = provider.wallet as anchor.Wallet; + const program = new anchor.Program(IDL, provider); + const client = context.banksClient; + + // We'll create this ahead of time. + // Our program will try to modify it. + const accountToChange = new Keypair(); + // Our program will create this. + const accountToCreate = new Keypair(); + + it("Create an account owned by our program", async () => { + const instruction = SystemProgram.createAccount({ + fromPubkey: provider.wallet.publicKey, + newAccountPubkey: accountToChange.publicKey, + lamports: await provider.connection.getMinimumBalanceForRentExemption(0), + space: 0, + programId: program.programId, // Our program + }); + + const transaction = new Transaction(); + const blockhash = context.lastBlockhash; + + transaction.recentBlockhash = blockhash; + transaction.add(instruction).sign(wallet.payer, accountToChange); + await client.processTransaction(transaction); + }); + + it("Check accounts", async () => { + await program.methods + .checkAccounts() + .accounts({ + payer: wallet.publicKey, + accountToCreate: accountToCreate.publicKey, + accountToChange: accountToChange.publicKey, + }) + .rpc(); + }); }); diff --git a/basics/checking-accounts/anchor/tests/test.ts b/basics/checking-accounts/anchor/tests/test.ts index 9b5599e18..514bca172 100644 --- a/basics/checking-accounts/anchor/tests/test.ts +++ b/basics/checking-accounts/anchor/tests/test.ts @@ -1,50 +1,41 @@ import * as anchor from "@anchor-lang/core"; -import { - Keypair, - SystemProgram, - Transaction, - sendAndConfirmTransaction, -} from "@solana/web3.js"; +import { Keypair, SystemProgram, sendAndConfirmTransaction, Transaction } from "@solana/web3.js"; import type { CheckingAccountProgram } from "../target/types/checking_account_program"; describe("Anchor example", () => { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const program = anchor.workspace - .CheckingAccountProgram as anchor.Program; - const wallet = provider.wallet as anchor.Wallet; + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + const program = anchor.workspace.CheckingAccountProgram as anchor.Program; + const wallet = provider.wallet as anchor.Wallet; - // We'll create this ahead of time. - // Our program will try to modify it. - const accountToChange = new Keypair(); - // Our program will create this. - const accountToCreate = new Keypair(); + // We'll create this ahead of time. + // Our program will try to modify it. + const accountToChange = new Keypair(); + // Our program will create this. + const accountToCreate = new Keypair(); - it("Create an account owned by our program", async () => { - const instruction = SystemProgram.createAccount({ - fromPubkey: provider.wallet.publicKey, - newAccountPubkey: accountToChange.publicKey, - lamports: await provider.connection.getMinimumBalanceForRentExemption(0), - space: 0, - programId: program.programId, // Our program - }); + it("Create an account owned by our program", async () => { + const instruction = SystemProgram.createAccount({ + fromPubkey: provider.wallet.publicKey, + newAccountPubkey: accountToChange.publicKey, + lamports: await provider.connection.getMinimumBalanceForRentExemption(0), + space: 0, + programId: program.programId, // Our program + }); - const transaction = new Transaction().add(instruction); + const transaction = new Transaction().add(instruction); - await sendAndConfirmTransaction(provider.connection, transaction, [ - wallet.payer, - accountToChange, - ]); - }); + await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer, accountToChange]); + }); - it("Check accounts", async () => { - await program.methods - .checkAccounts() - .accounts({ - payer: wallet.publicKey, - accountToCreate: accountToCreate.publicKey, - accountToChange: accountToChange.publicKey, - }) - .rpc(); - }); + it("Check accounts", async () => { + await program.methods + .checkAccounts() + .accounts({ + payer: wallet.publicKey, + accountToCreate: accountToCreate.publicKey, + accountToChange: accountToChange.publicKey, + }) + .rpc(); + }); }); diff --git a/basics/checking-accounts/native/program/Cargo.toml b/basics/checking-accounts/native/program/Cargo.toml index 214ea7856..4ee029de8 100644 --- a/basics/checking-accounts/native/program/Cargo.toml +++ b/basics/checking-accounts/native/program/Cargo.toml @@ -19,7 +19,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" solana-pubkey = "3.0.0" diff --git a/basics/checking-accounts/native/tests/test.ts b/basics/checking-accounts/native/tests/test.ts index 8e39eea31..a64bd5e0b 100644 --- a/basics/checking-accounts/native/tests/test.ts +++ b/basics/checking-accounts/native/tests/test.ts @@ -1,10 +1,10 @@ -import { describe, test } from 'node:test'; -import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js'; -import { start } from 'solana-bankrun'; +import { describe, test } from "node:test"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; +import { start } from "solana-bankrun"; -describe('Checking accounts', async () => { +describe("Checking accounts", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'checking_accounts_native_program', programId: PROGRAM_ID }], []); + const context = await start([{ name: "checking_accounts_native_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; const rent = await client.getRent(); @@ -15,7 +15,7 @@ describe('Checking accounts', async () => { // Our program will create this. const accountToCreate = Keypair.generate(); - test('Create an account owned by our program', async () => { + test("Create an account owned by our program", async () => { const blockhash = context.lastBlockhash; const ix = SystemProgram.createAccount({ fromPubkey: payer.publicKey, @@ -32,7 +32,7 @@ describe('Checking accounts', async () => { await client.processTransaction(tx); }); - test('Check accounts', async () => { + test("Check accounts", async () => { const blockhash = context.lastBlockhash; const ix = new TransactionInstruction({ keys: [ diff --git a/basics/checking-accounts/pinocchio/program/Cargo.toml b/basics/checking-accounts/pinocchio/program/Cargo.toml index 5eebeb583..f03a6369b 100644 --- a/basics/checking-accounts/pinocchio/program/Cargo.toml +++ b/basics/checking-accounts/pinocchio/program/Cargo.toml @@ -9,7 +9,7 @@ pinocchio-system.workspace = true pinocchio-log.workspace = true [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" solana-pubkey = "3.0.0" diff --git a/basics/checking-accounts/pinocchio/tests/test.ts b/basics/checking-accounts/pinocchio/tests/test.ts index 7dcc9d8b5..ea6a1a548 100644 --- a/basics/checking-accounts/pinocchio/tests/test.ts +++ b/basics/checking-accounts/pinocchio/tests/test.ts @@ -1,19 +1,10 @@ import { describe, test } from "node:test"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; import { start } from "solana-bankrun"; describe("Checking accounts", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start( - [{ name: "checking_accounts_pinocchio_program", programId: PROGRAM_ID }], - [], - ); + const context = await start([{ name: "checking_accounts_pinocchio_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; const rent = await client.getRent(); diff --git a/basics/close-account/anchor/Anchor.toml b/basics/close-account/anchor/Anchor.toml index abe70b718..77fdf792d 100644 --- a/basics/close-account/anchor/Anchor.toml +++ b/basics/close-account/anchor/Anchor.toml @@ -2,17 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false +resolution = true skip-lint = false [programs.localnet] -close_account_program = "99TQtoDdQ5NS2v5Ppha93aqEmv3vV9VZVfHTP5rGST3c" - -# [registry] section removed — no longer used in Anchor 1.0 +close_account_program = "E7Cgyech7DrHz39ctmsPe6xqe65YJKWg1jwQQpmZrtcm" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/close-account/anchor/migrations/deploy.ts b/basics/close-account/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/basics/close-account/anchor/migrations/deploy.ts +++ b/basics/close-account/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/basics/close-account/anchor/package.json b/basics/close-account/anchor/package.json index 0955a189f..e09b39ceb 100644 --- a/basics/close-account/anchor/package.json +++ b/basics/close-account/anchor/package.json @@ -1,23 +1,23 @@ { - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "anchor-bankrun": "^0.4.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - }, - "type": "module" + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4", + "litesvm": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "anchor-bankrun": "^0.4.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + }, + "type": "module" } diff --git a/basics/close-account/anchor/pnpm-lock.yaml b/basics/close-account/anchor/pnpm-lock.yaml index 6d5cf4fb1..4e677c70a 100644 --- a/basics/close-account/anchor/pnpm-lock.yaml +++ b/basics/close-account/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -48,18 +48,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.25.0': @@ -821,16 +821,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -848,7 +848,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.25.0': dependencies: diff --git a/basics/close-account/anchor/programs/close-account/Cargo.toml b/basics/close-account/anchor/programs/close-account/Cargo.toml index 6a257d0ce..477a8700b 100644 --- a/basics/close-account/anchor/programs/close-account/Cargo.toml +++ b/basics/close-account/anchor/programs/close-account/Cargo.toml @@ -20,8 +20,13 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/close-account/anchor/programs/close-account/src/lib.rs b/basics/close-account/anchor/programs/close-account/src/lib.rs index fd298e7bd..61d7f4f10 100644 --- a/basics/close-account/anchor/programs/close-account/src/lib.rs +++ b/basics/close-account/anchor/programs/close-account/src/lib.rs @@ -3,7 +3,7 @@ mod instructions; mod state; use instructions::*; -declare_id!("99TQtoDdQ5NS2v5Ppha93aqEmv3vV9VZVfHTP5rGST3c"); +declare_id!("E7Cgyech7DrHz39ctmsPe6xqe65YJKWg1jwQQpmZrtcm"); #[program] pub mod close_account_program { diff --git a/basics/close-account/anchor/programs/close-account/tests/test_close_account.rs b/basics/close-account/anchor/programs/close-account/tests/test_close_account.rs new file mode 100644 index 000000000..cbc2952d6 --- /dev/null +++ b/basics/close-account/anchor/programs/close-account/tests/test_close_account.rs @@ -0,0 +1,71 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Keypair) { + let program_id = close_account_program::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/close_account_program.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, payer) +} + +#[test] +fn test_create_and_close_user() { + let (mut svm, payer) = setup(); + let program_id = close_account_program::id(); + + // Derive the PDA for the user's account + let (user_account_pda, _bump) = + Pubkey::find_program_address(&[b"USER", payer.pubkey().as_ref()], &program_id); + + // Create user + let create_ix = Instruction::new_with_bytes( + program_id, + &close_account_program::instruction::CreateUser { + name: "John Doe".to_string(), + } + .data(), + close_account_program::accounts::CreateUserContext { + user: payer.pubkey(), + user_account: user_account_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![create_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify account exists and has correct data + let account = svm + .get_account(&user_account_pda) + .expect("Account should exist after creation"); + assert!(account.data.len() > 0, "Account should have data"); + + svm.expire_blockhash(); + + // Close user + let close_ix = Instruction::new_with_bytes( + program_id, + &close_account_program::instruction::CloseUser {}.data(), + close_account_program::accounts::CloseUserContext { + user: payer.pubkey(), + user_account: user_account_pda, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![close_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify account is closed + let account = svm.get_account(&user_account_pda); + assert!(account.is_none(), "Account should be closed"); +} diff --git a/basics/close-account/anchor/tests/litesvm.test.ts b/basics/close-account/anchor/tests/litesvm.test.ts index 5dead96f1..304620d54 100644 --- a/basics/close-account/anchor/tests/litesvm.test.ts +++ b/basics/close-account/anchor/tests/litesvm.test.ts @@ -1,101 +1,93 @@ import anchor from "@anchor-lang/core"; import { - Keypair, - LAMPORTS_PER_SOL, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, + Transaction, + TransactionInstruction, } from "@solana/web3.js"; import { assert } from "chai"; import { LiteSVM } from "litesvm"; -import IDL from "../target/idl/close_account_program.json" with { - type: "json", -}; +import IDL from "../target/idl/close_account_program.json" with { type: "json" }; describe("LiteSVM: Close an account", () => { - const litesvm = new LiteSVM(); - const programId = new PublicKey(IDL.address); - const payer = Keypair.generate(); - const coder = new anchor.BorshCoder(IDL as anchor.Idl); // For serialization and deserialization + const litesvm = new LiteSVM(); + const programId = new PublicKey(IDL.address); + const payer = Keypair.generate(); + const coder = new anchor.BorshCoder(IDL as anchor.Idl); // For serialization and deserialization - const programPath = new URL( - "../target/deploy/close_account_program.so", - import.meta.url, - ).pathname; - litesvm.addProgramFromFile(programId, programPath); + const programPath = new URL("../target/deploy/close_account_program.so", import.meta.url).pathname; + litesvm.addProgramFromFile(programId, programPath); - litesvm.airdrop(payer.publicKey, BigInt(5 * LAMPORTS_PER_SOL)); + litesvm.airdrop(payer.publicKey, BigInt(5 * LAMPORTS_PER_SOL)); - /** - * Derive the PDA for the user's account. - */ - const [userAccountAddress] = PublicKey.findProgramAddressSync( - [Buffer.from("USER"), payer.publicKey.toBuffer()], - programId, - ); + /** + * Derive the PDA for the user's account. + */ + const [userAccountAddress] = PublicKey.findProgramAddressSync( + [Buffer.from("USER"), payer.publicKey.toBuffer()], + programId, + ); - it("Create an account", () => { - /** - * Instruction data - * Convert into buffer of instruction data - */ - const dataArg = { name: "John Doe" }; - const data = coder.instruction.encode("create_user", dataArg); + it("Create an account", () => { + /** + * Instruction data + * Convert into buffer of instruction data + */ + const dataArg = { name: "John Doe" }; + const data = coder.instruction.encode("create_user", dataArg); - /** - * Create Transactions - */ - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: userAccountAddress, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); + /** + * Create Transactions + */ + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: userAccountAddress, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = litesvm.latestBlockhash(); - tx.sign(payer); - litesvm.sendTransaction(tx); + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = litesvm.latestBlockhash(); + tx.sign(payer); + litesvm.sendTransaction(tx); - /** - * Fetch account - */ - const userAccount = litesvm.getAccount(userAccountAddress); - const user = coder.accounts.decode( - "UserState", - Buffer.from(userAccount.data), - ); - assert.equal(user.name, "John Doe"); - assert.equal(user.user.toBase58(), payer.publicKey.toBase58()); - }); + /** + * Fetch account + */ + const userAccount = litesvm.getAccount(userAccountAddress); + const user = coder.accounts.decode("UserState", Buffer.from(userAccount.data)); + assert.equal(user.name, "John Doe"); + assert.equal(user.user.toBase58(), payer.publicKey.toBase58()); + }); - it("Close an account", () => { - const data = coder.instruction.encode("close_user", {}); + it("Close an account", () => { + const data = coder.instruction.encode("close_user", {}); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: userAccountAddress, isSigner: false, isWritable: true }, - ], - programId, - data, - }); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: userAccountAddress, isSigner: false, isWritable: true }, + ], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = litesvm.latestBlockhash(); - tx.sign(payer); - litesvm.sendTransaction(tx); + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = litesvm.latestBlockhash(); + tx.sign(payer); + litesvm.sendTransaction(tx); - /** - * Fetch account - */ - const userAccount = litesvm.getAccount(userAccountAddress); - assert.equal(userAccount, null); - }); + /** + * Fetch account + */ + const userAccount = litesvm.getAccount(userAccountAddress); + assert.equal(userAccount, null); + }); }); diff --git a/basics/close-account/anchor/tests/test.ts b/basics/close-account/anchor/tests/test.ts index 4623c0d19..988ebd5f5 100644 --- a/basics/close-account/anchor/tests/test.ts +++ b/basics/close-account/anchor/tests/test.ts @@ -5,57 +5,54 @@ import { assert } from "chai"; import type { CloseAccountProgram } from "../target/types/close_account_program.ts"; describe("Anchor: Close an account", () => { - /** - * Configure the client to use the local cluster. - */ - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); + /** + * Configure the client to use the local cluster. + */ + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); - const program = anchor.workspace - .CloseAccountProgram as Program; - const payer = provider.wallet as anchor.Wallet; + const program = anchor.workspace.CloseAccountProgram as Program; + const payer = provider.wallet as anchor.Wallet; - /** - * Derive the PDA for the user's account. - */ - const [userAccountAddress] = PublicKey.findProgramAddressSync( - [Buffer.from("USER"), payer.publicKey.toBuffer()], - program.programId, - ); + /** + * Derive the PDA for the user's account. + */ + const [userAccountAddress] = PublicKey.findProgramAddressSync( + [Buffer.from("USER"), payer.publicKey.toBuffer()], + program.programId, + ); - it("Create an account", async () => { - await program.methods - .createUser("John Doe") - .accounts({ - user: payer.publicKey, - userAccount: userAccountAddress, - system_program: SystemProgram.programId, - }) - .rpc(); + it("Create an account", async () => { + await program.methods + .createUser("John Doe") + .accounts({ + user: payer.publicKey, + userAccount: userAccountAddress, + system_program: SystemProgram.programId, + }) + .rpc(); - /** - * Fetch account - */ - const userAccount = - await program.account.userState.fetch(userAccountAddress); - assert.equal(userAccount.name, "John Doe"); - assert.equal(userAccount.user.toBase58(), payer.publicKey.toBase58()); - }); + /** + * Fetch account + */ + const userAccount = await program.account.userState.fetch(userAccountAddress); + assert.equal(userAccount.name, "John Doe"); + assert.equal(userAccount.user.toBase58(), payer.publicKey.toBase58()); + }); - it("Close an account", async () => { - await program.methods - .closeUser() - .accounts({ - user: payer.publicKey, - userAccount: userAccountAddress, - }) - .rpc(); + it("Close an account", async () => { + await program.methods + .closeUser() + .accounts({ + user: payer.publicKey, + userAccount: userAccountAddress, + }) + .rpc(); - /** - * Fetch account - */ - const userAccount = - await program.account.userState.fetchNullable(userAccountAddress); - assert.equal(userAccount, null); - }); + /** + * Fetch account + */ + const userAccount = await program.account.userState.fetchNullable(userAccountAddress); + assert.equal(userAccount, null); + }); }); diff --git a/basics/close-account/anchor/tsconfig.json b/basics/close-account/anchor/tsconfig.json index 88e8865f0..ce454c83b 100644 --- a/basics/close-account/anchor/tsconfig.json +++ b/basics/close-account/anchor/tsconfig.json @@ -1,10 +1,10 @@ { - "compilerOptions": { - "typeRoots": ["./node_modules/@types"], - "lib": ["es2020"], - "module": "nodenext", - "target": "es2020", - "esModuleInterop": true, - "resolveJsonModule": true - } + "compilerOptions": { + "typeRoots": ["./node_modules/@types"], + "lib": ["es2020"], + "module": "nodenext", + "target": "es2020", + "esModuleInterop": true, + "resolveJsonModule": true + } } diff --git a/basics/close-account/native/program/Cargo.toml b/basics/close-account/native/program/Cargo.toml index 5bedf0754..ca3d566e6 100644 --- a/basics/close-account/native/program/Cargo.toml +++ b/basics/close-account/native/program/Cargo.toml @@ -20,7 +20,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/close-account/native/tests/close-account.test.ts b/basics/close-account/native/tests/close-account.test.ts index cb8640c3d..df253f1fb 100644 --- a/basics/close-account/native/tests/close-account.test.ts +++ b/basics/close-account/native/tests/close-account.test.ts @@ -1,19 +1,22 @@ -import { describe, test } from 'node:test'; -import { PublicKey, Transaction } from '@solana/web3.js'; -import { start } from 'solana-bankrun'; -import { createCloseUserInstruction, createCreateUserInstruction } from '../ts'; +import { describe, test } from "node:test"; +import { PublicKey, Transaction } from "@solana/web3.js"; +import { start } from "solana-bankrun"; +import { createCloseUserInstruction, createCreateUserInstruction } from "../ts"; -describe('Close Account!', async () => { +describe("Close Account!", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'close_account_native_program', programId: PROGRAM_ID }], []); + const context = await start([{ name: "close_account_native_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; - const testAccountPublicKey = PublicKey.findProgramAddressSync([Buffer.from('USER'), payer.publicKey.toBuffer()], PROGRAM_ID)[0]; + const testAccountPublicKey = PublicKey.findProgramAddressSync( + [Buffer.from("USER"), payer.publicKey.toBuffer()], + PROGRAM_ID, + )[0]; - test('Create the account', async () => { + test("Create the account", async () => { const blockhash = context.lastBlockhash; - const ix = createCreateUserInstruction(testAccountPublicKey, payer.publicKey, PROGRAM_ID, 'Jacob'); + const ix = createCreateUserInstruction(testAccountPublicKey, payer.publicKey, PROGRAM_ID, "Jacob"); const tx = new Transaction(); tx.recentBlockhash = blockhash; @@ -22,7 +25,7 @@ describe('Close Account!', async () => { await client.processTransaction(tx); }); - test('Close the account', async () => { + test("Close the account", async () => { const blockhash = context.lastBlockhash; const ix = createCloseUserInstruction(testAccountPublicKey, payer.publicKey, PROGRAM_ID); diff --git a/basics/close-account/native/ts/index.ts b/basics/close-account/native/ts/index.ts index 898deed08..110032b71 100644 --- a/basics/close-account/native/ts/index.ts +++ b/basics/close-account/native/ts/index.ts @@ -1,2 +1,2 @@ -export * from './instructions'; -export * from './state'; +export * from "./instructions"; +export * from "./state"; diff --git a/basics/close-account/native/ts/instructions/close.ts b/basics/close-account/native/ts/instructions/close.ts index 697d347bf..3bc4afd37 100644 --- a/basics/close-account/native/ts/instructions/close.ts +++ b/basics/close-account/native/ts/instructions/close.ts @@ -1,7 +1,7 @@ -import { Buffer } from 'node:buffer'; -import { type PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { MyInstruction } from '.'; +import { Buffer } from "node:buffer"; +import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; +import * as borsh from "borsh"; +import { MyInstruction } from "."; export class Close { instruction: MyInstruction; @@ -25,13 +25,17 @@ export const CloseSchema = new Map([ [ Close, { - kind: 'struct', - fields: [['instruction', 'u8']], + kind: "struct", + fields: [["instruction", "u8"]], }, ], ]); -export function createCloseUserInstruction(target: PublicKey, payer: PublicKey, programId: PublicKey): TransactionInstruction { +export function createCloseUserInstruction( + target: PublicKey, + payer: PublicKey, + programId: PublicKey, +): TransactionInstruction { const instructionObject = new Close({ instruction: MyInstruction.CloseUser, }); diff --git a/basics/close-account/native/ts/instructions/create.ts b/basics/close-account/native/ts/instructions/create.ts index 100b6cd68..7a18c43ac 100644 --- a/basics/close-account/native/ts/instructions/create.ts +++ b/basics/close-account/native/ts/instructions/create.ts @@ -1,7 +1,7 @@ -import { Buffer } from 'node:buffer'; -import { type PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { MyInstruction } from '.'; +import { Buffer } from "node:buffer"; +import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; +import * as borsh from "borsh"; +import { MyInstruction } from "."; export class Create { instruction: MyInstruction; @@ -25,16 +25,21 @@ export const CreateSchema = new Map([ [ Create, { - kind: 'struct', + kind: "struct", fields: [ - ['instruction', 'u8'], - ['name', 'string'], + ["instruction", "u8"], + ["name", "string"], ], }, ], ]); -export function createCreateUserInstruction(target: PublicKey, payer: PublicKey, programId: PublicKey, name: string): TransactionInstruction { +export function createCreateUserInstruction( + target: PublicKey, + payer: PublicKey, + programId: PublicKey, + name: string, +): TransactionInstruction { const instructionObject = new Create({ instruction: MyInstruction.CreateUser, name, diff --git a/basics/close-account/native/ts/state/index.ts b/basics/close-account/native/ts/state/index.ts index 4dad1be41..440a115d4 100644 --- a/basics/close-account/native/ts/state/index.ts +++ b/basics/close-account/native/ts/state/index.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'node:buffer'; -import * as borsh from 'borsh'; +import { Buffer } from "node:buffer"; +import * as borsh from "borsh"; export class User { name: string; @@ -27,8 +27,8 @@ export const UserSchema = new Map([ [ User, { - kind: 'struct', - fields: [['name', 'string']], + kind: "struct", + fields: [["name", "string"]], }, ], ]); diff --git a/basics/close-account/pinocchio/program/Cargo.toml b/basics/close-account/pinocchio/program/Cargo.toml index e1c7f3307..3c6d7e48f 100644 --- a/basics/close-account/pinocchio/program/Cargo.toml +++ b/basics/close-account/pinocchio/program/Cargo.toml @@ -10,7 +10,7 @@ pinocchio-pubkey.workspace = true pinocchio-system.workspace = true [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-keypair = "3.0.1" solana-message = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/close-account/pinocchio/tests/close-account.test.ts b/basics/close-account/pinocchio/tests/close-account.test.ts index e073c28c7..163818817 100644 --- a/basics/close-account/pinocchio/tests/close-account.test.ts +++ b/basics/close-account/pinocchio/tests/close-account.test.ts @@ -1,6 +1,4 @@ -import { describe, test } from "node:test"; -import { PublicKey, Transaction } from "@solana/web3.js"; -import { start } from "solana-bankrun"; +import { describe } from "node:test"; describe("Close Account!", async () => { console.log("Close Account"); diff --git a/basics/counter/anchor/Anchor.toml b/basics/counter/anchor/Anchor.toml index a07cc9353..e5803a783 100644 --- a/basics/counter/anchor/Anchor.toml +++ b/basics/counter/anchor/Anchor.toml @@ -2,17 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false +resolution = true skip-lint = false [programs.localnet] -counter_anchor = "BmDHboaj1kBUoinJKKSRqKfMeRKJqQqEbUj1VgzeQe4A" - -# [registry] section removed — no longer used in Anchor 1.0 +counter_anchor = "9nG25nFpLsycMERePF627oKHm5cHvNyv2TbfiFck32EP" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/counter/anchor/migrations/deploy.ts b/basics/counter/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/basics/counter/anchor/migrations/deploy.ts +++ b/basics/counter/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/basics/counter/anchor/package.json b/basics/counter/anchor/package.json deleted file mode 100644 index 21d106e4d..000000000 --- a/basics/counter/anchor/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - }, - "type": "module" -} diff --git a/basics/counter/anchor/pnpm-lock.yaml b/basics/counter/anchor/pnpm-lock.yaml deleted file mode 100644 index ca3afd7ff..000000000 --- a/basics/counter/anchor/pnpm-lock.yaml +++ /dev/null @@ -1,1476 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - litesvm: - specifier: ^0.4.0 - version: 0.4.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.0 - version: 4.3.16 - '@types/mocha': - specifier: ^9.0.0 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.4.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - prettier: - specifier: ^2.6.2 - version: 2.8.8 - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^5.3.3 - version: 5.9.3 - -packages: - - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} - engines: {node: '>=10'} - peerDependencies: - '@solana/web3.js': ^1.69.0 - - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} - engines: {node: '>=17'} - - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} - engines: {node: '>=10'} - - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.4.2': - resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.12': - resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.11': - resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-layout@1.2.2: - resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} - engines: {node: '>=4.5'} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - cross-fetch@3.2.0: - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.1.1: - resolution: {integrity: sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - litesvm-darwin-arm64@0.4.0: - resolution: {integrity: sha512-LN6iZcUQ6Xi5KO/7yJBYSALjjDCI/s/s2PgV3BqM4dpeBaLz+fXX/+qgMcBgpEVgEdEmhelux+WtAMkbEzJfrA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - litesvm-darwin-x64@0.4.0: - resolution: {integrity: sha512-3ltogKQdle8LbakVqoB6plxaNwp6Vb3tnkqa3G5mAvvZNorB2iumThDaTZ381Knl69t566LZm+g/VDZwYfsfhA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - litesvm-linux-arm64-gnu@0.4.0: - resolution: {integrity: sha512-SWlcRUqkXCMgLoDX/Wqr/S1lff+ggVI9f0YrRJMraxtEyApxutAoW2AWw4tvo6DsEgNwjxgsZOAwnE6bQBv8CA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - litesvm-linux-arm64-musl@0.4.0: - resolution: {integrity: sha512-YMMqwEWJUSWwL0Rwp8dFwl3jvgNU21eI7Qc+BpH9u2yeIRYQTn3rNGDnsK8v3QIZPHQdMo7NrPhzk4XoB1aKPg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [musl] - - litesvm-linux-x64-gnu@0.4.0: - resolution: {integrity: sha512-brZ3tFABDVQEYCgci7AO8iVYLw10UXVo97/lpTy75bTzNoqkggg8wFQOrbgCdb9NRwt06Y4Zf8cpIZAoDQq2mw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [glibc] - - litesvm-linux-x64-musl@0.4.0: - resolution: {integrity: sha512-D98qdIOuWg4fOewIIiH1D23AtM4I7/3vLKXIL8uQz06D5ev5fsBzNp2gM7libAywTkCYy/u666xgD6PsWhrTaw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [musl] - - litesvm@0.4.0: - resolution: {integrity: sha512-ySr5mB2ap4SzJpmVR2I5+gjzTH8NJbkg7DYPormzA2U9F4LhfvTTrD17X/k5N3Bn4b5Db6/CwSyX2qc0HrJtNA==} - engines: {node: '>= 20'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.0.2: - resolution: {integrity: sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@0.15.5: - resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - buffer-layout: 1.2.2 - - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 - '@noble/hashes': 1.8.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - bs58: 4.0.1 - buffer-layout: 1.2.2 - camelcase: 6.3.0 - cross-fetch: 3.2.0 - eventemitter3: 4.0.7 - pako: 2.1.0 - superstruct: 0.15.5 - toml: 3.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@anchor-lang/errors@1.0.0-rc.5': {} - - '@babel/runtime@7.25.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@noble/curves@1.4.2': - dependencies: - '@noble/hashes': 1.4.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.2 - typescript: 5.9.3 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': - 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.3.0(typescript@5.9.3) - 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(bufferutil@4.0.8)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.0.2 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.12': - dependencies: - tslib: 2.6.2 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.11 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.11 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.11': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.11 - - '@types/ws@8.5.12': - dependencies: - '@types/node': 20.12.11 - - '@ungap/promise-all-settled@1.1.2': {} - - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.1: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - buffer-from@1.1.2: {} - - buffer-layout@1.2.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - camelcase@6.3.0: {} - - chai@4.4.1: - 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.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@14.0.2: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - cross-fetch@3.2.0: - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@4.0.7: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - - jayson@4.1.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - JSONStream: 1.3.5 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - jsonparse@1.3.1: {} - - litesvm-darwin-arm64@0.4.0: - optional: true - - litesvm-darwin-x64@0.4.0: - optional: true - - litesvm-linux-arm64-gnu@0.4.0: - optional: true - - litesvm-linux-arm64-musl@0.4.0: - optional: true - - litesvm-linux-x64-gnu@0.4.0: - optional: true - - litesvm-linux-x64-musl@0.4.0: - optional: true - - litesvm@0.4.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - fastestsmallesttextencoderdecoder: 1.0.22 - optionalDependencies: - litesvm-darwin-arm64: 0.4.0 - litesvm-darwin-x64: 0.4.0 - litesvm-linux-arm64-gnu: 0.4.0 - litesvm-linux-arm64-musl: 0.4.0 - litesvm-linux-x64-gnu: 0.4.0 - litesvm-linux-x64-musl: 0.4.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - pako@2.1.0: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - prettier@2.8.8: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - regenerator-runtime@0.14.1: {} - - require-directory@2.1.1: {} - - rpc-websockets@9.0.2: - dependencies: - '@swc/helpers': 0.5.12 - '@types/uuid': 8.3.4 - '@types/ws': 8.5.12 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@0.15.5: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - through@2.3.8: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toml@3.0.0: {} - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.6.2: {} - - type-detect@4.0.8: {} - - typescript@5.9.3: {} - - undici-types@5.26.5: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/counter/anchor/programs/counter_anchor/Cargo.toml b/basics/counter/anchor/programs/counter_anchor/Cargo.toml index 5f0d1ce44..4cdeea22a 100644 --- a/basics/counter/anchor/programs/counter_anchor/Cargo.toml +++ b/basics/counter/anchor/programs/counter_anchor/Cargo.toml @@ -20,8 +20,14 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/counter/anchor/programs/counter_anchor/src/lib.rs b/basics/counter/anchor/programs/counter_anchor/src/lib.rs index 5e208eeb5..08d5c3078 100644 --- a/basics/counter/anchor/programs/counter_anchor/src/lib.rs +++ b/basics/counter/anchor/programs/counter_anchor/src/lib.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; -declare_id!("BmDHboaj1kBUoinJKKSRqKfMeRKJqQqEbUj1VgzeQe4A"); +declare_id!("9nG25nFpLsycMERePF627oKHm5cHvNyv2TbfiFck32EP"); #[program] pub mod counter_anchor { diff --git a/basics/counter/anchor/programs/counter_anchor/tests/test_counter.rs b/basics/counter/anchor/programs/counter_anchor/tests/test_counter.rs new file mode 100644 index 000000000..8a0648b3c --- /dev/null +++ b/basics/counter/anchor/programs/counter_anchor/tests/test_counter.rs @@ -0,0 +1,143 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// Minimal deserialization of the Counter account (8-byte discriminator + u64). +#[derive(BorshDeserialize)] +struct CounterAccount { + _discriminator: [u8; 8], + count: u64, +} + +fn setup() -> (LiteSVM, anchor_lang::prelude::Pubkey, Keypair) { + let program_id = counter_anchor::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/counter_anchor.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +fn fetch_counter(svm: &LiteSVM, counter_pubkey: &anchor_lang::prelude::Pubkey) -> u64 { + let account = svm.get_account(counter_pubkey).unwrap(); + let counter = CounterAccount::try_from_slice(&account.data).unwrap(); + counter.count +} + +#[test] +fn test_initialize_counter() { + let (mut svm, _program_id, payer) = setup(); + let counter_keypair = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + counter_anchor::id(), + &counter_anchor::instruction::InitializeCounter {}.data(), + counter_anchor::accounts::InitializeCounter { + payer: payer.pubkey(), + counter: counter_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &counter_keypair], + &payer.pubkey(), + ) + .unwrap(); + + let count = fetch_counter(&svm, &counter_keypair.pubkey()); + assert_eq!(count, 0, "Expected initialized count to be 0"); +} + +#[test] +fn test_increment_counter() { + let (mut svm, _program_id, payer) = setup(); + let counter_keypair = Keypair::new(); + + // Initialize + let init_ix = Instruction::new_with_bytes( + counter_anchor::id(), + &counter_anchor::instruction::InitializeCounter {}.data(), + counter_anchor::accounts::InitializeCounter { + payer: payer.pubkey(), + counter: counter_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &counter_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Increment + let inc_ix = Instruction::new_with_bytes( + counter_anchor::id(), + &counter_anchor::instruction::Increment {}.data(), + counter_anchor::accounts::Increment { + counter: counter_keypair.pubkey(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![inc_ix], &[&payer], &payer.pubkey()).unwrap(); + + let count = fetch_counter(&svm, &counter_keypair.pubkey()); + assert_eq!(count, 1, "Expected count to be 1"); +} + +#[test] +fn test_increment_counter_again() { + let (mut svm, _program_id, payer) = setup(); + let counter_keypair = Keypair::new(); + + // Initialize + let init_ix = Instruction::new_with_bytes( + counter_anchor::id(), + &counter_anchor::instruction::InitializeCounter {}.data(), + counter_anchor::accounts::InitializeCounter { + payer: payer.pubkey(), + counter: counter_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &counter_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Increment twice + for _ in 0..2 { + let inc_ix = Instruction::new_with_bytes( + counter_anchor::id(), + &counter_anchor::instruction::Increment {}.data(), + counter_anchor::accounts::Increment { + counter: counter_keypair.pubkey(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![inc_ix], &[&payer], &payer.pubkey()) + .unwrap(); + svm.expire_blockhash(); + } + + let count = fetch_counter(&svm, &counter_keypair.pubkey()); + assert_eq!(count, 2, "Expected count to be 2"); +} diff --git a/basics/counter/anchor/tests/litesvm.test.ts b/basics/counter/anchor/tests/litesvm.test.ts deleted file mode 100644 index 90e80ad85..000000000 --- a/basics/counter/anchor/tests/litesvm.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -import anchor from "@anchor-lang/core"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import { assert } from "chai"; -import { LiteSVM } from "litesvm"; -import IDL from "../target/idl/counter_anchor.json" with { type: "json" }; - -describe("LiteSVM: Counter", () => { - const svm = new LiteSVM(); - const programId = new PublicKey(IDL.address); - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(1000000000)); - - const coder = new anchor.BorshCoder(IDL as anchor.Idl); - const programPath = new URL( - "../target/deploy/counter_anchor.so", - import.meta.url, - ).pathname; - svm.addProgramFromFile(programId, programPath); - - /** - * Generate a new keypair for the counter account - */ - const counterKeypair = new Keypair(); - - it("Initialize Counter", () => { - /** - * Instruction data - * Create Transaction - */ - const data = coder.instruction.encode("initialize_counter", {}); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: counterKeypair.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer, counterKeypair); - svm.sendTransaction(tx); - - /** - * Fetch counter account - */ - const counterAccount = svm.getAccount(counterKeypair.publicKey); - const counter = coder.accounts.decode( - "Counter", - Buffer.from(counterAccount.data), - ); - - assert.equal(counter.count, 0); - }); - - it("Increment Counter", () => { - const data = coder.instruction.encode("increment", {}); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: counterKeypair.publicKey, isSigner: false, isWritable: true }, - ], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - svm.expireBlockhash(); - - /** - * Fetch counter account - */ - const counterAccount = svm.getAccount(counterKeypair.publicKey); - const counter = coder.accounts.decode( - "Counter", - Buffer.from(counterAccount.data), - ); - - assert.equal(counter.count, 1); - }); - - it("Increment Counter Again", () => { - const data = coder.instruction.encode("increment", {}); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: counterKeypair.publicKey, isSigner: false, isWritable: true }, - ], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - - /** - * Fetch counter account - */ - const counterAccount = svm.getAccount(counterKeypair.publicKey); - const counter = coder.accounts.decode( - "Counter", - Buffer.from(counterAccount.data), - ); - - assert.equal(counter.count, 2); - }); -}); diff --git a/basics/counter/anchor/tests/test.ts b/basics/counter/anchor/tests/test.ts deleted file mode 100644 index 12f93fde9..000000000 --- a/basics/counter/anchor/tests/test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import type { Program } from "@anchor-lang/core"; -import * as anchor from "@anchor-lang/core"; -import { Keypair } from "@solana/web3.js"; -import { assert } from "chai"; -import type { CounterAnchor } from "../target/types/counter_anchor.ts"; - -describe("Anchor: Counter", () => { - // Configure the client to use the local cluster. - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const payer = provider.wallet as anchor.Wallet; - - const program = anchor.workspace.CounterAnchor as Program; - - // Generate a new keypair for the counter account - const counterKeypair = new Keypair(); - - it("Initialize Counter", async () => { - await program.methods - .initializeCounter() - .accounts({ - counter: counterKeypair.publicKey, - payer: payer.publicKey, - }) - .signers([counterKeypair]) - .rpc(); - - const currentCount = await program.account.counter.fetch( - counterKeypair.publicKey, - ); - - assert( - currentCount.count.toNumber() === 0, - "Expected initialized count to be 0", - ); - }); - - it("Increment Counter", async () => { - await program.methods - .increment() - .accounts({ counter: counterKeypair.publicKey }) - .rpc(); - - const currentCount = await program.account.counter.fetch( - counterKeypair.publicKey, - ); - - assert(currentCount.count.toNumber() === 1, "Expected count to be 1"); - }); - - it("Increment Counter Again", async () => { - await program.methods - .increment() - .accounts({ counter: counterKeypair.publicKey }) - .rpc(); - - const currentCount = await program.account.counter.fetch( - counterKeypair.publicKey, - ); - - assert(currentCount.count.toNumber() === 2, "Expected count to be 2"); - }); -}); diff --git a/basics/counter/anchor/tsconfig.json b/basics/counter/anchor/tsconfig.json deleted file mode 100644 index fdf5c04de..000000000 --- a/basics/counter/anchor/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2020"], - "module": "nodenext", - "target": "es2020", - "esModuleInterop": true - } -} diff --git a/basics/counter/mpl-stack/.solitarc.js b/basics/counter/mpl-stack/.solitarc.js index 74dc762c5..8ea5faec3 100644 --- a/basics/counter/mpl-stack/.solitarc.js +++ b/basics/counter/mpl-stack/.solitarc.js @@ -1,14 +1,14 @@ // @ts-check -const path = require('node:path'); +const path = require("node:path"); const programDir = path.join(__dirname); -const idlDir = path.join(__dirname, 'idl'); -const sdkDir = path.join(__dirname, 'ts', 'generated'); -const binaryInstallDir = path.join(__dirname, 'target', 'solita'); +const idlDir = path.join(__dirname, "idl"); +const sdkDir = path.join(__dirname, "ts", "generated"); +const binaryInstallDir = path.join(__dirname, "target", "solita"); module.exports = { - idlGenerator: 'shank', - programName: 'counter_mpl_stack', - programId: 'Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS', + idlGenerator: "shank", + programName: "counter_mpl_stack", + programId: "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS", idlDir, sdkDir, binaryInstallDir, diff --git a/basics/counter/mpl-stack/jest.config.js b/basics/counter/mpl-stack/jest.config.js index 3943c3dbb..4dd7c478d 100644 --- a/basics/counter/mpl-stack/jest.config.js +++ b/basics/counter/mpl-stack/jest.config.js @@ -1,6 +1,6 @@ module.exports = { - preset: 'ts-jest/presets/default', - testEnvironment: 'node', + preset: "ts-jest/presets/default", + testEnvironment: "node", testTimeout: 100000, - resolver: 'ts-jest-resolver', + resolver: "ts-jest-resolver", }; diff --git a/basics/counter/mpl-stack/tests/counter.test.ts b/basics/counter/mpl-stack/tests/counter.test.ts index c3c3c99f1..dc345a80b 100644 --- a/basics/counter/mpl-stack/tests/counter.test.ts +++ b/basics/counter/mpl-stack/tests/counter.test.ts @@ -1,4 +1,4 @@ -import type { bignum } from '@metaplex-foundation/beet'; +import type { bignum } from "@metaplex-foundation/beet"; import { Connection, Keypair, @@ -7,20 +7,20 @@ import { sendAndConfirmTransaction, Transaction, type TransactionInstruction, -} from '@solana/web3.js'; -import { BN } from 'bn.js'; -import { assert } from 'chai'; +} from "@solana/web3.js"; +import { BN } from "bn.js"; +import { assert } from "chai"; -import { Counter, createIncrementInstruction, PROGRAM_ID } from '../ts'; +import { Counter, createIncrementInstruction, PROGRAM_ID } from "../ts"; function convertBignumToNumber(bignum: bignum): number { return new BN(bignum).toNumber(); } -describe('Counter Solana Native', () => { - const connection = new Connection('http://localhost:8899'); +describe("Counter Solana Native", () => { + const connection = new Connection("http://localhost:8899"); - it('Test allocate counter + increment tx', async () => { + it("Test allocate counter + increment tx", async () => { // Randomly generate our wallet const payerKeypair = Keypair.generate(); const payer = payerKeypair.publicKey; @@ -50,17 +50,20 @@ describe('Counter Solana Native', () => { tx.feePayer = payer; // Fetch a "timestamp" so validators know this is a recent transaction - tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash; + tx.recentBlockhash = (await connection.getLatestBlockhash("confirmed")).blockhash; // Send transaction to network (local network) - await sendAndConfirmTransaction(connection, tx, [payerKeypair, counterKeypair], { skipPreflight: true, commitment: 'confirmed' }); + await sendAndConfirmTransaction(connection, tx, [payerKeypair, counterKeypair], { + skipPreflight: true, + commitment: "confirmed", + }); // Get the counter account info from network const count = (await Counter.fromAccountAddress(connection, counter)).count; - assert(new BN(count).toNumber() === 1, 'Expected count to have been 1'); + assert(new BN(count).toNumber() === 1, "Expected count to have been 1"); console.log(`[alloc+increment] count is: ${count}`); }); - it('Test allocate tx and increment tx', async () => { + it("Test allocate tx and increment tx", async () => { const payerKeypair = Keypair.generate(); const payer = payerKeypair.publicKey; @@ -79,11 +82,14 @@ describe('Counter Solana Native', () => { }); let tx = new Transaction().add(allocIx); tx.feePayer = payer; - tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash; - await sendAndConfirmTransaction(connection, tx, [payerKeypair, counterKeypair], { skipPreflight: true, commitment: 'confirmed' }); + tx.recentBlockhash = (await connection.getLatestBlockhash("confirmed")).blockhash; + await sendAndConfirmTransaction(connection, tx, [payerKeypair, counterKeypair], { + skipPreflight: true, + commitment: "confirmed", + }); let count = (await Counter.fromAccountAddress(connection, counter)).count; - assert(convertBignumToNumber(count) === 0, 'Expected count to have been 0'); + assert(convertBignumToNumber(count) === 0, "Expected count to have been 0"); console.log(`[allocate] count is: ${count}`); // Check increment tx @@ -92,14 +98,14 @@ describe('Counter Solana Native', () => { }); tx = new Transaction().add(incrementIx); tx.feePayer = payer; - tx.recentBlockhash = (await connection.getLatestBlockhash('confirmed')).blockhash; + tx.recentBlockhash = (await connection.getLatestBlockhash("confirmed")).blockhash; await sendAndConfirmTransaction(connection, tx, [payerKeypair], { skipPreflight: true, - commitment: 'confirmed', + commitment: "confirmed", }); count = (await Counter.fromAccountAddress(connection, counter)).count; - assert(convertBignumToNumber(count) === 1, 'Expected count to have been 1'); + assert(convertBignumToNumber(count) === 1, "Expected count to have been 1"); console.log(`[increment] count is: ${count}`); }); }); diff --git a/basics/counter/mpl-stack/ts/generated/accounts/Counter.ts b/basics/counter/mpl-stack/ts/generated/accounts/Counter.ts index 8595a99e1..159e2972f 100644 --- a/basics/counter/mpl-stack/ts/generated/accounts/Counter.ts +++ b/basics/counter/mpl-stack/ts/generated/accounts/Counter.ts @@ -5,9 +5,9 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from '@metaplex-foundation/beet'; -import * as beetSolana from '@metaplex-foundation/beet-solana'; -import * as web3 from '@solana/web3.js'; +import * as beet from "@metaplex-foundation/beet"; +import * as beetSolana from "@metaplex-foundation/beet-solana"; +import * as web3 from "@solana/web3.js"; /** * Arguments used to create {@link Counter} @@ -50,7 +50,7 @@ export class Counter implements CounterArgs { */ static async fromAccountAddress(connection: web3.Connection, address: web3.PublicKey): Promise { const accountInfo = await connection.getAccountInfo(address, { - commitment: 'confirmed', + commitment: "confirmed", }); if (accountInfo == null) { throw new Error(`Unable to find Counter account at ${address}`); @@ -64,7 +64,7 @@ export class Counter implements CounterArgs { * * @param programId - the program that owns the accounts we are filtering */ - static gpaBuilder(programId: web3.PublicKey = new web3.PublicKey('Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS')) { + static gpaBuilder(programId: web3.PublicKey = new web3.PublicKey("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS")) { return beetSolana.GpaBuilder.fromStruct(programId, counterBeet); } @@ -98,7 +98,10 @@ export class Counter implements CounterArgs { * * @param connection used to retrieve the rent exemption information */ - static async getMinimumBalanceForRentExemption(connection: web3.Connection, commitment?: web3.Commitment): Promise { + static async getMinimumBalanceForRentExemption( + connection: web3.Connection, + commitment?: web3.Commitment, + ): Promise { return connection.getMinimumBalanceForRentExemption(Counter.byteSize, commitment); } @@ -118,7 +121,7 @@ export class Counter implements CounterArgs { return { count: (() => { const x = <{ toNumber: () => number }>this.count; - if (typeof x.toNumber === 'function') { + if (typeof x.toNumber === "function") { try { return x.toNumber(); } catch (_) { @@ -135,4 +138,8 @@ export class Counter implements CounterArgs { * @category Accounts * @category generated */ -export const counterBeet = new beet.BeetStruct([['count', beet.u64]], Counter.fromArgs, 'Counter'); +export const counterBeet = new beet.BeetStruct( + [["count", beet.u64]], + Counter.fromArgs, + "Counter", +); diff --git a/basics/counter/mpl-stack/ts/generated/accounts/index.ts b/basics/counter/mpl-stack/ts/generated/accounts/index.ts index cea7bf897..4a7382443 100644 --- a/basics/counter/mpl-stack/ts/generated/accounts/index.ts +++ b/basics/counter/mpl-stack/ts/generated/accounts/index.ts @@ -1,5 +1,5 @@ -export * from './Counter'; +export * from "./Counter"; -import { Counter } from './Counter'; +import { Counter } from "./Counter"; export const accountProviders = { Counter }; diff --git a/basics/counter/mpl-stack/ts/generated/index.ts b/basics/counter/mpl-stack/ts/generated/index.ts index 1167eac99..8a3d97033 100644 --- a/basics/counter/mpl-stack/ts/generated/index.ts +++ b/basics/counter/mpl-stack/ts/generated/index.ts @@ -1,7 +1,7 @@ -import { PublicKey } from '@solana/web3.js'; +import { PublicKey } from "@solana/web3.js"; -export * from './accounts'; -export * from './instructions'; +export * from "./accounts"; +export * from "./instructions"; /** * Program address @@ -9,7 +9,7 @@ export * from './instructions'; * @category constants * @category generated */ -export const PROGRAM_ADDRESS = 'Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS'; +export const PROGRAM_ADDRESS = "Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"; /** * Program public key diff --git a/basics/counter/mpl-stack/ts/generated/instructions/Increment.ts b/basics/counter/mpl-stack/ts/generated/instructions/Increment.ts index 9f9e542fa..afc814560 100644 --- a/basics/counter/mpl-stack/ts/generated/instructions/Increment.ts +++ b/basics/counter/mpl-stack/ts/generated/instructions/Increment.ts @@ -5,8 +5,8 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from '@metaplex-foundation/beet'; -import * as web3 from '@solana/web3.js'; +import * as beet from "@metaplex-foundation/beet"; +import * as web3 from "@solana/web3.js"; /** * @category Instructions @@ -15,7 +15,7 @@ import * as web3 from '@solana/web3.js'; */ export const IncrementStruct = new beet.BeetArgsStruct<{ instructionDiscriminator: number; -}>([['instructionDiscriminator', beet.u8]], 'IncrementInstructionArgs'); +}>([["instructionDiscriminator", beet.u8]], "IncrementInstructionArgs"); /** * Accounts required by the _Increment_ instruction * @@ -40,7 +40,7 @@ export const incrementInstructionDiscriminator = 0; */ export function createIncrementInstruction( accounts: IncrementInstructionAccounts, - programId = new web3.PublicKey('Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS'), + programId = new web3.PublicKey("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"), ) { const [data] = IncrementStruct.serialize({ instructionDiscriminator: incrementInstructionDiscriminator, diff --git a/basics/counter/mpl-stack/ts/generated/instructions/index.ts b/basics/counter/mpl-stack/ts/generated/instructions/index.ts index b9941ec47..84936e742 100644 --- a/basics/counter/mpl-stack/ts/generated/instructions/index.ts +++ b/basics/counter/mpl-stack/ts/generated/instructions/index.ts @@ -1 +1 @@ -export * from './Increment'; +export * from "./Increment"; diff --git a/basics/counter/mpl-stack/ts/index.ts b/basics/counter/mpl-stack/ts/index.ts index 69e4e4eb8..e84c86c64 100644 --- a/basics/counter/mpl-stack/ts/index.ts +++ b/basics/counter/mpl-stack/ts/index.ts @@ -1 +1 @@ -export * from './generated'; +export * from "./generated"; diff --git a/basics/counter/native/program/Cargo.toml b/basics/counter/native/program/Cargo.toml index 0180bb481..c928d7806 100644 --- a/basics/counter/native/program/Cargo.toml +++ b/basics/counter/native/program/Cargo.toml @@ -22,7 +22,7 @@ solana-program.workspace = true unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/counter/native/tests/counter.test.ts b/basics/counter/native/tests/counter.test.ts index 44c2056bf..97784546b 100644 --- a/basics/counter/native/tests/counter.test.ts +++ b/basics/counter/native/tests/counter.test.ts @@ -1,19 +1,19 @@ -import { describe, test } from 'node:test'; -import { Keypair, SystemProgram, Transaction, type TransactionInstruction } from '@solana/web3.js'; -import { assert } from 'chai'; -import { start } from 'solana-bankrun'; -import { COUNTER_ACCOUNT_SIZE, createIncrementInstruction, deserializeCounterAccount, PROGRAM_ID } from '../ts'; +import { describe, test } from "node:test"; +import { Keypair, SystemProgram, Transaction, type TransactionInstruction } from "@solana/web3.js"; +import { assert } from "chai"; +import { start } from "solana-bankrun"; +import { COUNTER_ACCOUNT_SIZE, createIncrementInstruction, deserializeCounterAccount, PROGRAM_ID } from "../ts"; -describe('Counter Solana Native', async () => { +describe("Counter Solana Native", async () => { // Randomly generate the program keypair and load the program to solana-bankrun - const context = await start([{ name: 'counter_solana_native', programId: PROGRAM_ID }], []); + const context = await start([{ name: "counter_solana_native", programId: PROGRAM_ID }], []); const client = context.banksClient; // Get the payer keypair from the context, this will be used to sign transactions with enough lamports const payer = context.payer; // Get the rent object to calculate rent for the accounts const rent = await client.getRent(); - test('Test allocate counter + increment tx', async () => { + test("Test allocate counter + increment tx", async () => { // Randomly generate the account key // to sign for setting up the Counter state const counterKeypair = Keypair.generate(); @@ -45,15 +45,15 @@ describe('Counter Solana Native', async () => { // Get the counter account info from network const counterAccountInfo = await client.getAccount(counter); - assert(counterAccountInfo, 'Expected counter account to have been created'); + assert(counterAccountInfo, "Expected counter account to have been created"); // Deserialize the counter & check count has been incremented const counterAccount = deserializeCounterAccount(Buffer.from(counterAccountInfo.data)); - assert(counterAccount.count.toNumber() === 1, 'Expected count to have been 1'); + assert(counterAccount.count.toNumber() === 1, "Expected count to have been 1"); console.log(`[alloc+increment] count is: ${counterAccount.count.toNumber()}`); }); - test('Test allocate tx and increment tx', async () => { + test("Test allocate tx and increment tx", async () => { const counterKeypair = Keypair.generate(); const counter = counterKeypair.publicKey; @@ -74,10 +74,10 @@ describe('Counter Solana Native', async () => { await client.processTransaction(tx); let counterAccountInfo = await client.getAccount(counter); - assert(counterAccountInfo, 'Expected counter account to have been created'); + assert(counterAccountInfo, "Expected counter account to have been created"); let counterAccount = deserializeCounterAccount(Buffer.from(counterAccountInfo.data)); - assert(counterAccount.count.toNumber() === 0, 'Expected count to have been 0'); + assert(counterAccount.count.toNumber() === 0, "Expected count to have been 0"); console.log(`[allocate] count is: ${counterAccount.count.toNumber()}`); // Check increment tx @@ -90,10 +90,10 @@ describe('Counter Solana Native', async () => { await client.processTransaction(tx); counterAccountInfo = await client.getAccount(counter); - assert(counterAccountInfo, 'Expected counter account to have been created'); + assert(counterAccountInfo, "Expected counter account to have been created"); counterAccount = deserializeCounterAccount(Buffer.from(counterAccountInfo.data)); - assert(counterAccount.count.toNumber() === 1, 'Expected count to have been 1'); + assert(counterAccount.count.toNumber() === 1, "Expected count to have been 1"); console.log(`[increment] count is: ${counterAccount.count.toNumber()}`); }); }); diff --git a/basics/counter/native/ts/accounts/counter.ts b/basics/counter/native/ts/accounts/counter.ts index 04b7f4844..e89747f9d 100644 --- a/basics/counter/native/ts/accounts/counter.ts +++ b/basics/counter/native/ts/accounts/counter.ts @@ -1,4 +1,4 @@ -import BN from 'bn.js'; +import BN from "bn.js"; export type Counter = { count: BN; @@ -8,10 +8,10 @@ export const COUNTER_ACCOUNT_SIZE = 8; export function deserializeCounterAccount(data: Buffer): Counter { if (data.byteLength !== 8) { - throw Error('Need exactly 8 bytes to deserialize counter'); + throw Error("Need exactly 8 bytes to deserialize counter"); } return { - count: new BN(data, 'le'), + count: new BN(data, "le"), }; } diff --git a/basics/counter/native/ts/accounts/index.ts b/basics/counter/native/ts/accounts/index.ts index 0ab63758b..bd1575cbc 100644 --- a/basics/counter/native/ts/accounts/index.ts +++ b/basics/counter/native/ts/accounts/index.ts @@ -1 +1 @@ -export * from './counter'; +export * from "./counter"; diff --git a/basics/counter/native/ts/index.ts b/basics/counter/native/ts/index.ts index 2322a115f..b353a01ff 100644 --- a/basics/counter/native/ts/index.ts +++ b/basics/counter/native/ts/index.ts @@ -1,6 +1,6 @@ -import { PublicKey } from '@solana/web3.js'; +import { PublicKey } from "@solana/web3.js"; -export * from './accounts'; -export * from './instructions'; +export * from "./accounts"; +export * from "./instructions"; -export const PROGRAM_ID = new PublicKey('Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS'); +export const PROGRAM_ID = new PublicKey("Fg6PaFpoGXkYsidMpWTK6W2BeZ7FEfcYkg476zPFsLnS"); diff --git a/basics/counter/native/ts/instructions/createIncrementInstruction.ts b/basics/counter/native/ts/instructions/createIncrementInstruction.ts index 6e0bf48c4..b7290acf7 100644 --- a/basics/counter/native/ts/instructions/createIncrementInstruction.ts +++ b/basics/counter/native/ts/instructions/createIncrementInstruction.ts @@ -1,5 +1,5 @@ -import { type PublicKey, TransactionInstruction } from '@solana/web3.js'; -import { PROGRAM_ID } from '../'; +import { type PublicKey, TransactionInstruction } from "@solana/web3.js"; +import { PROGRAM_ID } from "../"; export type IncrementInstructionAccounts = { counter: PublicKey; diff --git a/basics/counter/native/ts/instructions/index.ts b/basics/counter/native/ts/instructions/index.ts index a0249a40c..618dcd823 100644 --- a/basics/counter/native/ts/instructions/index.ts +++ b/basics/counter/native/ts/instructions/index.ts @@ -1 +1 @@ -export * from './createIncrementInstruction'; +export * from "./createIncrementInstruction"; diff --git a/basics/counter/pinocchio/program/Cargo.toml b/basics/counter/pinocchio/program/Cargo.toml index 54ffc5008..2df97c688 100644 --- a/basics/counter/pinocchio/program/Cargo.toml +++ b/basics/counter/pinocchio/program/Cargo.toml @@ -22,7 +22,7 @@ pinocchio-pubkey.workspace = true unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/counter/pinocchio/tests/counter.test.ts b/basics/counter/pinocchio/tests/counter.test.ts index c8ddf656f..a8e57d960 100644 --- a/basics/counter/pinocchio/tests/counter.test.ts +++ b/basics/counter/pinocchio/tests/counter.test.ts @@ -1,12 +1,4 @@ -import { describe, test } from "node:test"; -import { - Keypair, - SystemProgram, - Transaction, - type TransactionInstruction, -} from "@solana/web3.js"; -import { assert } from "chai"; -import { start } from "solana-bankrun"; +import { describe } from "node:test"; describe("Counter Solana Pinocchio", async () => { console.log("Counter Solana Pinocchio"); diff --git a/basics/create-account/anchor/Anchor.toml b/basics/create-account/anchor/Anchor.toml index 920804801..2aaa629f4 100644 --- a/basics/create-account/anchor/Anchor.toml +++ b/basics/create-account/anchor/Anchor.toml @@ -2,17 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false +resolution = true skip-lint = false [programs.localnet] -create_system_account = "ARVNCsYKDQsCLHbwUTJLpFXVrJdjhWZStyzvxmKe2xHi" - -# [registry] section removed — no longer used in Anchor 1.0 +create_system_account = "ALfCAvL1Vbm15QabQJ72NUi7LK7fB5YP2tDKEvvh7wS8" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/create-account/anchor/package.json b/basics/create-account/anchor/package.json deleted file mode 100644 index 0432a3a0d..000000000 --- a/basics/create-account/anchor/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.4.1", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } -} diff --git a/basics/create-account/anchor/pnpm-lock.yaml b/basics/create-account/anchor/pnpm-lock.yaml deleted file mode 100644 index 78092f214..000000000 --- a/basics/create-account/anchor/pnpm-lock.yaml +++ /dev/null @@ -1,1466 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - litesvm: - specifier: ^0.4.0 - version: 0.4.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.0 - version: 4.3.16 - '@types/mocha': - specifier: ^9.0.0 - version: 9.1.1 - chai: - specifier: ^4.4.1 - version: 4.4.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^5.3.3 - version: 5.9.3 - -packages: - - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} - engines: {node: '>=10'} - peerDependencies: - '@solana/web3.js': ^1.69.0 - - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} - engines: {node: '>=17'} - - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} - engines: {node: '>=10'} - - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.5.0': - resolution: {integrity: sha512-J5EKamIHnKPyClwVrzmaf5wSdQXgdHcPZIZLu3bwnbeCx8/7NPK5q2ZBWF+5FvYGByjiQQsJYX6jfgB2wDPn3A==} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.12': - resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.11': - resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-layout@1.2.2: - resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} - engines: {node: '>=4.5'} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - cross-fetch@3.2.0: - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.1.1: - resolution: {integrity: sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - litesvm-darwin-arm64@0.4.0: - resolution: {integrity: sha512-LN6iZcUQ6Xi5KO/7yJBYSALjjDCI/s/s2PgV3BqM4dpeBaLz+fXX/+qgMcBgpEVgEdEmhelux+WtAMkbEzJfrA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - litesvm-darwin-x64@0.4.0: - resolution: {integrity: sha512-3ltogKQdle8LbakVqoB6plxaNwp6Vb3tnkqa3G5mAvvZNorB2iumThDaTZ381Knl69t566LZm+g/VDZwYfsfhA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - litesvm-linux-arm64-gnu@0.4.0: - resolution: {integrity: sha512-SWlcRUqkXCMgLoDX/Wqr/S1lff+ggVI9f0YrRJMraxtEyApxutAoW2AWw4tvo6DsEgNwjxgsZOAwnE6bQBv8CA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - litesvm-linux-arm64-musl@0.4.0: - resolution: {integrity: sha512-YMMqwEWJUSWwL0Rwp8dFwl3jvgNU21eI7Qc+BpH9u2yeIRYQTn3rNGDnsK8v3QIZPHQdMo7NrPhzk4XoB1aKPg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [musl] - - litesvm-linux-x64-gnu@0.4.0: - resolution: {integrity: sha512-brZ3tFABDVQEYCgci7AO8iVYLw10UXVo97/lpTy75bTzNoqkggg8wFQOrbgCdb9NRwt06Y4Zf8cpIZAoDQq2mw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [glibc] - - litesvm-linux-x64-musl@0.4.0: - resolution: {integrity: sha512-D98qdIOuWg4fOewIIiH1D23AtM4I7/3vLKXIL8uQz06D5ev5fsBzNp2gM7libAywTkCYy/u666xgD6PsWhrTaw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [musl] - - litesvm@0.4.0: - resolution: {integrity: sha512-ySr5mB2ap4SzJpmVR2I5+gjzTH8NJbkg7DYPormzA2U9F4LhfvTTrD17X/k5N3Bn4b5Db6/CwSyX2qc0HrJtNA==} - engines: {node: '>= 20'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.0.2: - resolution: {integrity: sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@0.15.5: - resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - buffer-layout: 1.2.2 - - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 - '@noble/hashes': 1.8.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - bs58: 4.0.1 - buffer-layout: 1.2.2 - camelcase: 6.3.0 - cross-fetch: 3.2.0 - eventemitter3: 4.0.7 - pako: 2.1.0 - superstruct: 0.15.5 - toml: 3.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@anchor-lang/errors@1.0.0-rc.5': {} - - '@babel/runtime@7.25.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@noble/curves@1.5.0': - dependencies: - '@noble/hashes': 1.4.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.2 - typescript: 5.9.3 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@babel/runtime': 7.25.0 - '@noble/curves': 1.5.0 - '@noble/hashes': 1.4.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@5.9.3) - 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(bufferutil@4.0.8)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.0.2 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.12': - dependencies: - tslib: 2.6.2 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.11 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.11 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.11': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.11 - - '@types/ws@8.5.12': - dependencies: - '@types/node': 20.12.11 - - '@ungap/promise-all-settled@1.1.2': {} - - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.1: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - buffer-from@1.1.2: {} - - buffer-layout@1.2.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - camelcase@6.3.0: {} - - chai@4.4.1: - 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.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@14.0.2: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - cross-fetch@3.2.0: - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@4.0.7: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - - jayson@4.1.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - JSONStream: 1.3.5 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - jsonparse@1.3.1: {} - - litesvm-darwin-arm64@0.4.0: - optional: true - - litesvm-darwin-x64@0.4.0: - optional: true - - litesvm-linux-arm64-gnu@0.4.0: - optional: true - - litesvm-linux-arm64-musl@0.4.0: - optional: true - - litesvm-linux-x64-gnu@0.4.0: - optional: true - - litesvm-linux-x64-musl@0.4.0: - optional: true - - litesvm@0.4.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - fastestsmallesttextencoderdecoder: 1.0.22 - optionalDependencies: - litesvm-darwin-arm64: 0.4.0 - litesvm-darwin-x64: 0.4.0 - litesvm-linux-arm64-gnu: 0.4.0 - litesvm-linux-arm64-musl: 0.4.0 - litesvm-linux-x64-gnu: 0.4.0 - litesvm-linux-x64-musl: 0.4.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - pako@2.1.0: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - regenerator-runtime@0.14.1: {} - - require-directory@2.1.1: {} - - rpc-websockets@9.0.2: - dependencies: - '@swc/helpers': 0.5.12 - '@types/uuid': 8.3.4 - '@types/ws': 8.5.12 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@0.15.5: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - through@2.3.8: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toml@3.0.0: {} - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.6.2: {} - - type-detect@4.0.8: {} - - typescript@5.9.3: {} - - undici-types@5.26.5: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/create-account/anchor/programs/create-system-account/Cargo.toml b/basics/create-account/anchor/programs/create-system-account/Cargo.toml index 25b52353b..afdfeaa37 100644 --- a/basics/create-account/anchor/programs/create-system-account/Cargo.toml +++ b/basics/create-account/anchor/programs/create-system-account/Cargo.toml @@ -20,8 +20,13 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/create-account/anchor/programs/create-system-account/src/lib.rs b/basics/create-account/anchor/programs/create-system-account/src/lib.rs index 644fc3004..04b2b187f 100644 --- a/basics/create-account/anchor/programs/create-system-account/src/lib.rs +++ b/basics/create-account/anchor/programs/create-system-account/src/lib.rs @@ -1,7 +1,7 @@ use anchor_lang::prelude::*; use anchor_lang::system_program::{create_account, CreateAccount}; -declare_id!("ARVNCsYKDQsCLHbwUTJLpFXVrJdjhWZStyzvxmKe2xHi"); +declare_id!("ALfCAvL1Vbm15QabQJ72NUi7LK7fB5YP2tDKEvvh7wS8"); #[program] pub mod create_system_account { diff --git a/basics/create-account/anchor/programs/create-system-account/tests/test_create_account.rs b/basics/create-account/anchor/programs/create-system-account/tests/test_create_account.rs new file mode 100644 index 000000000..7c1bcd4ff --- /dev/null +++ b/basics/create-account/anchor/programs/create-system-account/tests/test_create_account.rs @@ -0,0 +1,46 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, rent::Rent, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +#[test] +fn test_create_the_account() { + let program_id = create_system_account::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/create_system_account.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let new_account = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &create_system_account::instruction::CreateSystemAccount {}.data(), + create_system_account::accounts::CreateSystemAccount { + payer: payer.pubkey(), + new_account: new_account.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &new_account], + &payer.pubkey(), + ) + .unwrap(); + + // Minimum balance for rent exemption for 0-data account + let lamports = Rent::default().minimum_balance(0); + + let account_info = svm.get_account(&new_account.pubkey()).unwrap(); + assert_eq!(account_info.lamports, lamports); +} diff --git a/basics/create-account/anchor/tests/litesvm.test.ts b/basics/create-account/anchor/tests/litesvm.test.ts deleted file mode 100644 index 36053080e..000000000 --- a/basics/create-account/anchor/tests/litesvm.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -import anchor from "@anchor-lang/core"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import { assert } from "chai"; -import { LiteSVM } from "litesvm"; -import IDL from "../target/idl/create_system_account.json" with { - type: "json", -}; - -describe("LiteSVM: Create a system account", () => { - const svm = new LiteSVM(); - const programId = new PublicKey(IDL.address); - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(1000000000)); - - const coder = new anchor.BorshCoder(IDL as anchor.Idl); - const programPath = new URL( - "../target/deploy/create_system_account.so", - import.meta.url, - ).pathname; - svm.addProgramFromFile(programId, programPath); - - it("Create the account", () => { - /** - * Generate a new keypair for the new account - */ - const newKeypair = new Keypair(); - /** - * Instruction data - * Create Transaction - * Send Transaction - */ - const data = coder.instruction.encode("create_system_account", {}); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: newKeypair.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer, newKeypair); - svm.sendTransaction(tx); - - /** - * Fetch account - * Check its lamports - * */ - const lamports = svm.minimumBalanceForRentExemption(0n); - const accountInfo = svm.getAccount(newKeypair.publicKey); - - assert(Number(lamports) === accountInfo.lamports); - }); -}); diff --git a/basics/create-account/anchor/tests/test.ts b/basics/create-account/anchor/tests/test.ts deleted file mode 100644 index 57a3cc900..000000000 --- a/basics/create-account/anchor/tests/test.ts +++ /dev/null @@ -1,34 +0,0 @@ -import * as anchor from "@anchor-lang/core"; -import { Keypair } from "@solana/web3.js"; -import { assert } from "chai"; -import type { CreateSystemAccount } from "../target/types/create_system_account.ts"; - -describe("Anchor: Create a system account", () => { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const wallet = provider.wallet as anchor.Wallet; - const connection = provider.connection; - const program = anchor.workspace - .CreateSystemAccount as anchor.Program; - - it("Create the account", async () => { - // Generate a new keypair for the new account - const newKeypair = new Keypair(); - - await program.methods - .createSystemAccount() - .accounts({ - payer: wallet.publicKey, - newAccount: newKeypair.publicKey, - }) - .signers([newKeypair]) - .rpc(); - - // Minimum balance for rent exemption for new account - const lamports = await connection.getMinimumBalanceForRentExemption(0); - - // Check that the account was created - const accountInfo = await connection.getAccountInfo(newKeypair.publicKey); - assert(accountInfo.lamports === lamports); - }); -}); diff --git a/basics/create-account/anchor/tsconfig.json b/basics/create-account/anchor/tsconfig.json deleted file mode 100644 index fdf5c04de..000000000 --- a/basics/create-account/anchor/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2020"], - "module": "nodenext", - "target": "es2020", - "esModuleInterop": true - } -} diff --git a/basics/create-account/native/program/Cargo.toml b/basics/create-account/native/program/Cargo.toml index 3bd473717..bde26597a 100644 --- a/basics/create-account/native/program/Cargo.toml +++ b/basics/create-account/native/program/Cargo.toml @@ -18,7 +18,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/create-account/native/tests/test.ts b/basics/create-account/native/tests/test.ts index 4c1068abb..0bc801bdd 100644 --- a/basics/create-account/native/tests/test.ts +++ b/basics/create-account/native/tests/test.ts @@ -1,4 +1,4 @@ -import { describe, test } from 'node:test'; +import { describe, test } from "node:test"; import { Keypair, LAMPORTS_PER_SOL, @@ -6,20 +6,17 @@ import { SystemProgram, Transaction, TransactionInstruction, -} from '@solana/web3.js'; -import { start } from 'solana-bankrun'; +} from "@solana/web3.js"; +import { start } from "solana-bankrun"; -describe('Create a system account', async () => { +describe("Create a system account", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start( - [{ name: 'create_account_program', programId: PROGRAM_ID }], - [], - ); + const context = await start([{ name: "create_account_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; - test('Create the account via a cross program invocation', async () => { + test("Create the account via a cross program invocation", async () => { const newKeypair = Keypair.generate(); const ix = new TransactionInstruction({ @@ -40,11 +37,11 @@ describe('Create a system account', async () => { await client.processTransaction(tx); // Verify the account was created - const accountInfo = await client.getAccount(newKeypair.publicKey); + const _accountInfo = await client.getAccount(newKeypair.publicKey); console.log(`Account with public key ${newKeypair.publicKey} successfully created via CPI`); }); - test('Create the account via direct call to system program', async () => { + test("Create the account via direct call to system program", async () => { const newKeypair = Keypair.generate(); const ix = SystemProgram.createAccount({ @@ -63,7 +60,7 @@ describe('Create a system account', async () => { await client.processTransaction(tx); // Verify the account was created - const accountInfo = await client.getAccount(newKeypair.publicKey); + const _accountInfo = await client.getAccount(newKeypair.publicKey); console.log(`Account with public key ${newKeypair.publicKey} successfully created`); }); }); diff --git a/basics/create-account/pinocchio/program/Cargo.toml b/basics/create-account/pinocchio/program/Cargo.toml index d6d61991a..609d465c2 100644 --- a/basics/create-account/pinocchio/program/Cargo.toml +++ b/basics/create-account/pinocchio/program/Cargo.toml @@ -20,7 +20,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/create-account/pinocchio/tests/test.ts b/basics/create-account/pinocchio/tests/test.ts index 3091b46e3..317ed75e1 100644 --- a/basics/create-account/pinocchio/tests/test.ts +++ b/basics/create-account/pinocchio/tests/test.ts @@ -11,10 +11,7 @@ import { start } from "solana-bankrun"; describe("Create a system account", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start( - [{ name: "create_account_pinocchio_program", programId: PROGRAM_ID }], - [], - ); + const context = await start([{ name: "create_account_pinocchio_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; @@ -56,8 +53,6 @@ describe("Create a system account", async () => { tx.add(ix).sign(payer, newKeypair); await client.processTransaction(tx); - console.log( - `Account with public key ${newKeypair.publicKey} successfully created`, - ); + console.log(`Account with public key ${newKeypair.publicKey} successfully created`); }); }); diff --git a/basics/cross-program-invocation/anchor/Anchor.toml b/basics/cross-program-invocation/anchor/Anchor.toml index 8134bd54e..ccd65289a 100644 --- a/basics/cross-program-invocation/anchor/Anchor.toml +++ b/basics/cross-program-invocation/anchor/Anchor.toml @@ -6,14 +6,14 @@ resolution = true skip-lint = false [programs.localnet] -hand = "Bi5N7SUQhpGknVcqPTzdFFVueQoxoUu8YTLz75J6fT8A" -lever = "E64FVeubGC4NPNF2UBJYX4AkrVowf74fRJD9q6YhwstN" - -# [registry] section removed — no longer used in Anchor 1.0 +hand = "4tvjFDZybFML3tN5uyRoHPoxUTitTwGxjD7KfKEmX7Vg" +lever = "3aP7aVaJck5pUzbh3t6cqyCPgk6otbiyHsNsXHzeNDE5" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/cross-program-invocation/anchor/idls/lever.json b/basics/cross-program-invocation/anchor/idls/lever.json index 3ec862d79..1372ab9df 100644 --- a/basics/cross-program-invocation/anchor/idls/lever.json +++ b/basics/cross-program-invocation/anchor/idls/lever.json @@ -1,5 +1,5 @@ { - "address": "E64FVeubGC4NPNF2UBJYX4AkrVowf74fRJD9q6YhwstN", + "address": "3aP7aVaJck5pUzbh3t6cqyCPgk6otbiyHsNsXHzeNDE5", "metadata": { "name": "lever", "version": "0.1.0", diff --git a/basics/cross-program-invocation/anchor/migrations/deploy.ts b/basics/cross-program-invocation/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/basics/cross-program-invocation/anchor/migrations/deploy.ts +++ b/basics/cross-program-invocation/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/basics/cross-program-invocation/anchor/package.json b/basics/cross-program-invocation/anchor/package.json index 6856081db..7f2afc3dc 100644 --- a/basics/cross-program-invocation/anchor/package.json +++ b/basics/cross-program-invocation/anchor/package.json @@ -1,22 +1,22 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4", + "litesvm": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/basics/cross-program-invocation/anchor/pnpm-lock.yaml b/basics/cross-program-invocation/anchor/pnpm-lock.yaml index e9d23b11d..ab1ab1065 100644 --- a/basics/cross-program-invocation/anchor/pnpm-lock.yaml +++ b/basics/cross-program-invocation/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -45,18 +45,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.25.0': @@ -766,16 +766,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -793,7 +793,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.25.0': dependencies: diff --git a/basics/cross-program-invocation/anchor/programs/hand/Cargo.toml b/basics/cross-program-invocation/anchor/programs/hand/Cargo.toml index ef3b6bd4f..51de9a266 100644 --- a/basics/cross-program-invocation/anchor/programs/hand/Cargo.toml +++ b/basics/cross-program-invocation/anchor/programs/hand/Cargo.toml @@ -20,8 +20,14 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/cross-program-invocation/anchor/programs/hand/src/lib.rs b/basics/cross-program-invocation/anchor/programs/hand/src/lib.rs index 2602e0e8d..f9b885d42 100644 --- a/basics/cross-program-invocation/anchor/programs/hand/src/lib.rs +++ b/basics/cross-program-invocation/anchor/programs/hand/src/lib.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; -declare_id!("Bi5N7SUQhpGknVcqPTzdFFVueQoxoUu8YTLz75J6fT8A"); +declare_id!("4tvjFDZybFML3tN5uyRoHPoxUTitTwGxjD7KfKEmX7Vg"); // automatically generate module using program idl found in ./idls declare_program!(lever); diff --git a/basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs b/basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs new file mode 100644 index 000000000..4a6d69ca6 --- /dev/null +++ b/basics/cross-program-invocation/anchor/programs/hand/tests/test_hand.rs @@ -0,0 +1,122 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// PowerStatus account layout: 8-byte discriminator + 1-byte bool + 7 bytes padding. +/// Account space is 8 + 8 = 16 bytes, so read the raw bytes instead of using BorshDeserialize +/// to avoid "Not all bytes read" errors from the padding. +fn read_power_is_on(svm: &LiteSVM, pubkey: &anchor_lang::prelude::Pubkey) -> bool { + let account = svm.get_account(pubkey).unwrap(); + // Skip 8-byte discriminator, read 1 byte for bool + account.data[8] != 0 +} + +/// Build the lever program's `initialize` instruction manually. +/// Discriminator from IDL: [175, 175, 109, 31, 13, 152, 155, 237] +fn build_lever_initialize_ix( + lever_program_id: anchor_lang::prelude::Pubkey, + power: anchor_lang::prelude::Pubkey, + user: anchor_lang::prelude::Pubkey, +) -> Instruction { + let discriminator: [u8; 8] = [175, 175, 109, 31, 13, 152, 155, 237]; + Instruction { + program_id: lever_program_id, + accounts: vec![ + AccountMeta::new(power, true), + AccountMeta::new(user, true), + AccountMeta::new_readonly(system_program::id(), false), + ], + data: discriminator.to_vec(), + } +} + +#[test] +fn test_pull_lever_cpi() { + let hand_program_id = hand::id(); + // The lever program ID from declare_program!(lever) inside hand crate + let lever_program_id = hand::lever::ID; + + let mut svm = LiteSVM::new(); + + // Load both programs + let hand_bytes = include_bytes!("../../../target/deploy/hand.so"); + let lever_bytes = include_bytes!("../../../target/deploy/lever.so"); + svm.add_program(hand_program_id, hand_bytes).unwrap(); + svm.add_program(lever_program_id, lever_bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let power_keypair = Keypair::new(); + + // Initialize the lever directly (manually constructed instruction) + let init_ix = + build_lever_initialize_ix(lever_program_id, power_keypair.pubkey(), payer.pubkey()); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &power_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify initial state is off + assert!( + !read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be off after initialization" + ); + + // Pull the lever via the hand program (CPI into lever) + svm.expire_blockhash(); + let pull_ix = Instruction::new_with_bytes( + hand_program_id, + &hand::instruction::PullLever { + name: "Jacob".to_string(), + } + .data(), + hand::accounts::PullLever { + power: power_keypair.pubkey(), + lever_program: lever_program_id, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![pull_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify power is now on + assert!( + read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be on after pulling lever" + ); + + // Pull it again + svm.expire_blockhash(); + let pull_ix2 = Instruction::new_with_bytes( + hand_program_id, + &hand::instruction::PullLever { + name: "sol-warrior".to_string(), + } + .data(), + hand::accounts::PullLever { + power: power_keypair.pubkey(), + lever_program: lever_program_id, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![pull_ix2], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify power is now off again + assert!( + !read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be off after pulling lever again" + ); +} diff --git a/basics/cross-program-invocation/anchor/programs/lever/Cargo.toml b/basics/cross-program-invocation/anchor/programs/lever/Cargo.toml index 50e9488ce..52bcd14e1 100644 --- a/basics/cross-program-invocation/anchor/programs/lever/Cargo.toml +++ b/basics/cross-program-invocation/anchor/programs/lever/Cargo.toml @@ -20,8 +20,13 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs b/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs index d3ebd3f3c..90a4f0c47 100644 --- a/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs +++ b/basics/cross-program-invocation/anchor/programs/lever/src/lib.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; -declare_id!("E64FVeubGC4NPNF2UBJYX4AkrVowf74fRJD9q6YhwstN"); +declare_id!("3aP7aVaJck5pUzbh3t6cqyCPgk6otbiyHsNsXHzeNDE5"); #[program] pub mod lever { diff --git a/basics/cross-program-invocation/anchor/programs/lever/tests/test_lever.rs b/basics/cross-program-invocation/anchor/programs/lever/tests/test_lever.rs new file mode 100644 index 000000000..4cd3aec75 --- /dev/null +++ b/basics/cross-program-invocation/anchor/programs/lever/tests/test_lever.rs @@ -0,0 +1,124 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// PowerStatus account layout: 8-byte discriminator + 1-byte bool + 7 bytes padding. +/// Account space is 8 + 8 = 16 bytes, so read raw bytes to avoid "Not all bytes read" errors. +fn read_power_is_on(svm: &LiteSVM, pubkey: &anchor_lang::prelude::Pubkey) -> bool { + let account = svm.get_account(pubkey).unwrap(); + account.data[8] != 0 +} + +#[test] +fn test_initialize_lever() { + let program_id = lever::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/lever.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let power_keypair = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &lever::instruction::Initialize {}.data(), + lever::accounts::InitializeLever { + power: power_keypair.pubkey(), + user: payer.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &power_keypair], + &payer.pubkey(), + ) + .unwrap(); + + assert!( + !read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be off after initialization" + ); +} + +#[test] +fn test_switch_power() { + let program_id = lever::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/lever.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let power_keypair = Keypair::new(); + + // Initialize + let init_ix = Instruction::new_with_bytes( + program_id, + &lever::instruction::Initialize {}.data(), + lever::accounts::InitializeLever { + power: power_keypair.pubkey(), + user: payer.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &power_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Switch power on + let switch_ix = Instruction::new_with_bytes( + program_id, + &lever::instruction::SwitchPower { + name: "Alice".to_string(), + } + .data(), + lever::accounts::SetPowerStatus { + power: power_keypair.pubkey(), + } + .to_account_metas(None), + ); + svm.expire_blockhash(); + send_transaction_from_instructions(&mut svm, vec![switch_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + assert!( + read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be on after first switch" + ); + + // Switch power off + let switch_ix2 = Instruction::new_with_bytes( + program_id, + &lever::instruction::SwitchPower { + name: "Bob".to_string(), + } + .data(), + lever::accounts::SetPowerStatus { + power: power_keypair.pubkey(), + } + .to_account_metas(None), + ); + svm.expire_blockhash(); + send_transaction_from_instructions(&mut svm, vec![switch_ix2], &[&payer], &payer.pubkey()) + .unwrap(); + + assert!( + !read_power_is_on(&svm, &power_keypair.pubkey()), + "Power should be off after second switch" + ); +} diff --git a/basics/cross-program-invocation/anchor/tests/litesvm.test.ts b/basics/cross-program-invocation/anchor/tests/litesvm.test.ts index dcd966ddb..eb00f5312 100644 --- a/basics/cross-program-invocation/anchor/tests/litesvm.test.ts +++ b/basics/cross-program-invocation/anchor/tests/litesvm.test.ts @@ -1,152 +1,135 @@ import anchor from "@anchor-lang/core"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; import { assert } from "chai"; import { LiteSVM } from "litesvm"; import HAND_IDL from "../target/idl/hand.json" with { type: "json" }; import LEVER_IDL from "../target/idl/lever.json" with { type: "json" }; describe("LiteSVM: CPI", () => { - const svm = new LiteSVM(); - const handProgramId = new PublicKey(HAND_IDL.address); - const leverProgramId = new PublicKey(LEVER_IDL.address); - - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(1000000000)); - - /** - * For serialization and deserialization of data - */ - const handCoder = new anchor.BorshCoder(HAND_IDL as anchor.Idl); - const leverCoder = new anchor.BorshCoder(LEVER_IDL as anchor.Idl); - - const handProgramPath = new URL("../target/deploy/hand.so", import.meta.url) - .pathname; - const leverProgramPath = new URL("../target/deploy/lever.so", import.meta.url) - .pathname; - svm.addProgramFromFile(handProgramId, handProgramPath); - svm.addProgramFromFile(leverProgramId, leverProgramPath); - - /** - * Generate a new keypair for the power account - */ - const powerAccount = new Keypair(); - - it("Initialize the lever!", () => { - /** - * Instruction data - * Create Transaction - * Send Transaction - */ - const data = leverCoder.instruction.encode("initialize", {}); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: powerAccount.publicKey, isSigner: true, isWritable: true }, - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId: leverProgramId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer, powerAccount); - svm.sendTransaction(tx); - - /** - * Fetch account - * Check its required lamports - * Check it powerstatus - * */ - const minLamports = svm.minimumBalanceForRentExemption(BigInt(8 + 8)); - const powerAccountInfo = svm.getAccount(powerAccount.publicKey); - const powerStatus = leverCoder.accounts.decode( - "PowerStatus", - Buffer.from(powerAccountInfo.data), - ); - - assert(Number(minLamports) === powerAccountInfo.lamports); - assert(powerStatus.is_on === false); - }); - - it("Pull the lever!", () => { - /** - * Instruction data - * Create Transaction - * Send Transaction - */ - const data = handCoder.instruction.encode("pull_lever", { - name: "Jacob", - }); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: powerAccount.publicKey, isSigner: false, isWritable: true }, - { pubkey: leverProgramId, isSigner: false, isWritable: false }, - ], - programId: handProgramId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - - /** - * Fetch account - * Check its powerstatus = true - * */ - const powerAccountInfo = svm.getAccount(powerAccount.publicKey); - const powerStatus = leverCoder.accounts.decode( - "PowerStatus", - Buffer.from(powerAccountInfo.data), - ); - - assert(powerStatus.is_on === true); - }); - - it("Pull it again!", () => { - /** - * Instruction data - * Create Transaction - * Send Transaction - */ - const data = handCoder.instruction.encode("pull_lever", { - name: "sol-warrior", - }); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: powerAccount.publicKey, isSigner: false, isWritable: true }, - { pubkey: leverProgramId, isSigner: false, isWritable: false }, - ], - programId: handProgramId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - - /** - * Fetch account - * Check its powerstatus = false - * */ - const powerAccountInfo = svm.getAccount(powerAccount.publicKey); - const powerStatus = leverCoder.accounts.decode( - "PowerStatus", - Buffer.from(powerAccountInfo.data), - ); - - assert(powerStatus.is_on === false); - }); + const svm = new LiteSVM(); + const handProgramId = new PublicKey(HAND_IDL.address); + const leverProgramId = new PublicKey(LEVER_IDL.address); + + const payer = Keypair.generate(); + svm.airdrop(payer.publicKey, BigInt(1000000000)); + + /** + * For serialization and deserialization of data + */ + const handCoder = new anchor.BorshCoder(HAND_IDL as anchor.Idl); + const leverCoder = new anchor.BorshCoder(LEVER_IDL as anchor.Idl); + + const handProgramPath = new URL("../target/deploy/hand.so", import.meta.url).pathname; + const leverProgramPath = new URL("../target/deploy/lever.so", import.meta.url).pathname; + svm.addProgramFromFile(handProgramId, handProgramPath); + svm.addProgramFromFile(leverProgramId, leverProgramPath); + + /** + * Generate a new keypair for the power account + */ + const powerAccount = new Keypair(); + + it("Initialize the lever!", () => { + /** + * Instruction data + * Create Transaction + * Send Transaction + */ + const data = leverCoder.instruction.encode("initialize", {}); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: powerAccount.publicKey, isSigner: true, isWritable: true }, + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId: leverProgramId, + data, + }); + + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer, powerAccount); + svm.sendTransaction(tx); + + /** + * Fetch account + * Check its required lamports + * Check it powerstatus + * */ + const minLamports = svm.minimumBalanceForRentExemption(BigInt(8 + 8)); + const powerAccountInfo = svm.getAccount(powerAccount.publicKey); + const powerStatus = leverCoder.accounts.decode("PowerStatus", Buffer.from(powerAccountInfo.data)); + + assert(Number(minLamports) === powerAccountInfo.lamports); + assert(powerStatus.is_on === false); + }); + + it("Pull the lever!", () => { + /** + * Instruction data + * Create Transaction + * Send Transaction + */ + const data = handCoder.instruction.encode("pull_lever", { + name: "Jacob", + }); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: powerAccount.publicKey, isSigner: false, isWritable: true }, + { pubkey: leverProgramId, isSigner: false, isWritable: false }, + ], + programId: handProgramId, + data, + }); + + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); + + /** + * Fetch account + * Check its powerstatus = true + * */ + const powerAccountInfo = svm.getAccount(powerAccount.publicKey); + const powerStatus = leverCoder.accounts.decode("PowerStatus", Buffer.from(powerAccountInfo.data)); + + assert(powerStatus.is_on === true); + }); + + it("Pull it again!", () => { + /** + * Instruction data + * Create Transaction + * Send Transaction + */ + const data = handCoder.instruction.encode("pull_lever", { + name: "sol-warrior", + }); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: powerAccount.publicKey, isSigner: false, isWritable: true }, + { pubkey: leverProgramId, isSigner: false, isWritable: false }, + ], + programId: handProgramId, + data, + }); + + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); + + /** + * Fetch account + * Check its powerstatus = false + * */ + const powerAccountInfo = svm.getAccount(powerAccount.publicKey); + const powerStatus = leverCoder.accounts.decode("PowerStatus", Buffer.from(powerAccountInfo.data)); + + assert(powerStatus.is_on === false); + }); }); diff --git a/basics/cross-program-invocation/anchor/tests/test.ts b/basics/cross-program-invocation/anchor/tests/test.ts index d01c1c3ec..228593f81 100644 --- a/basics/cross-program-invocation/anchor/tests/test.ts +++ b/basics/cross-program-invocation/anchor/tests/test.ts @@ -5,78 +5,69 @@ import type { Hand } from "../target/types/hand.ts"; import type { Lever } from "../target/types/lever.ts"; describe("Anchor: CPI", () => { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); - const hand = anchor.workspace.Hand as Program; - const lever = anchor.workspace.Lever as Program; + const hand = anchor.workspace.Hand as Program; + const lever = anchor.workspace.Lever as Program; - // Generate a new keypair for the power account - const powerAccount = new anchor.web3.Keypair(); + // Generate a new keypair for the power account + const powerAccount = new anchor.web3.Keypair(); - it("Initialize the lever!", async () => { - await lever.methods - .initialize() - .accounts({ - power: powerAccount.publicKey, - user: provider.wallet.publicKey, - }) - .signers([powerAccount]) - .rpc(); + it("Initialize the lever!", async () => { + await lever.methods + .initialize() + .accounts({ + power: powerAccount.publicKey, + user: provider.wallet.publicKey, + }) + .signers([powerAccount]) + .rpc(); - /** - * Fetch account - * Check its required lamports - * Check it powerstatus - * */ - const minLamports = - await provider.connection.getMinimumBalanceForRentExemption(8 + 8); - const powerStatus = await lever.account.powerStatus.fetch( - powerAccount.publicKey, - ); - const powerAccountInfo = await provider.connection.getAccountInfo( - powerAccount.publicKey, - ); + /** + * Fetch account + * Check its required lamports + * Check it powerstatus + * */ + const minLamports = await provider.connection.getMinimumBalanceForRentExemption(8 + 8); + const powerStatus = await lever.account.powerStatus.fetch(powerAccount.publicKey); + const powerAccountInfo = await provider.connection.getAccountInfo(powerAccount.publicKey); - assert(Number(minLamports) === powerAccountInfo.lamports); - assert(powerStatus.isOn === false); - }); + assert(Number(minLamports) === powerAccountInfo.lamports); + assert(powerStatus.isOn === false); + }); - it("Pull the lever!", async () => { - await hand.methods - .pullLever("Jacob") - .accounts({ - power: powerAccount.publicKey, - }) - .rpc(); + it("Pull the lever!", async () => { + await hand.methods + .pullLever("Jacob") + .accounts({ + power: powerAccount.publicKey, + }) + .rpc(); - /** - * Fetch account - * Check its powerstatus = true - * */ - const powerStatus = await lever.account.powerStatus.fetch( - powerAccount.publicKey, - ); + /** + * Fetch account + * Check its powerstatus = true + * */ + const powerStatus = await lever.account.powerStatus.fetch(powerAccount.publicKey); - assert(powerStatus.isOn === true); - }); + assert(powerStatus.isOn === true); + }); - it("Pull it again!", async () => { - await hand.methods - .pullLever("sol-warrior") - .accounts({ - power: powerAccount.publicKey, - }) - .rpc(); + it("Pull it again!", async () => { + await hand.methods + .pullLever("sol-warrior") + .accounts({ + power: powerAccount.publicKey, + }) + .rpc(); - /** - * Fetch account - * Check its powerstatus = false - * */ - const powerStatus = await lever.account.powerStatus.fetch( - powerAccount.publicKey, - ); + /** + * Fetch account + * Check its powerstatus = false + * */ + const powerStatus = await lever.account.powerStatus.fetch(powerAccount.publicKey); - assert(powerStatus.isOn === false); - }); + assert(powerStatus.isOn === false); + }); }); diff --git a/basics/cross-program-invocation/anchor/tsconfig.json b/basics/cross-program-invocation/anchor/tsconfig.json index fdf5c04de..395d18165 100644 --- a/basics/cross-program-invocation/anchor/tsconfig.json +++ b/basics/cross-program-invocation/anchor/tsconfig.json @@ -1,10 +1,10 @@ { - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2020"], - "module": "nodenext", - "target": "es2020", - "esModuleInterop": true - } + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2020"], + "module": "nodenext", + "target": "es2020", + "esModuleInterop": true + } } diff --git a/basics/cross-program-invocation/native/programs/hand/Cargo.toml b/basics/cross-program-invocation/native/programs/hand/Cargo.toml index 26bc992a4..c74aab0f4 100644 --- a/basics/cross-program-invocation/native/programs/hand/Cargo.toml +++ b/basics/cross-program-invocation/native/programs/hand/Cargo.toml @@ -19,7 +19,7 @@ cross-program-invocatio-native-lever = { path = "../lever", features = ["cpi"] } crate-type = ["cdylib", "lib"] [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/cross-program-invocation/native/tests/test.ts b/basics/cross-program-invocation/native/tests/test.ts index efbca8062..c9dc4249b 100644 --- a/basics/cross-program-invocation/native/tests/test.ts +++ b/basics/cross-program-invocation/native/tests/test.ts @@ -1,19 +1,26 @@ -import { Buffer } from 'node:buffer'; -import { Connection, Keypair, SystemProgram, sendAndConfirmTransaction, Transaction, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; +import { Buffer } from "node:buffer"; +import { + Connection, + Keypair, + SystemProgram, + sendAndConfirmTransaction, + Transaction, + TransactionInstruction, +} from "@solana/web3.js"; +import * as borsh from "borsh"; function createKeypairFromFile(path: string): Keypair { - return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require('node:fs').readFileSync(path, 'utf-8')))); + return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require("node:fs").readFileSync(path, "utf-8")))); } -describe('CPI Example', () => { - const connection = new Connection('http://localhost:8899', 'confirmed'); - const payer = createKeypairFromFile(`${require('node:os').homedir()}/.config/solana/id.json`); - const hand = createKeypairFromFile('./target/so/hand-keypair.json'); - const lever = createKeypairFromFile('./target/so/lever-keypair.json'); +describe("CPI Example", () => { + const connection = new Connection("http://localhost:8899", "confirmed"); + const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); + const hand = createKeypairFromFile("./target/so/hand-keypair.json"); + const lever = createKeypairFromFile("./target/so/lever-keypair.json"); - const PowerStatusSchema = { struct: { is_on: 'u8' } }; - const SetPowerStatusSchema = { struct: { name: 'string' } }; + const PowerStatusSchema = { struct: { is_on: "u8" } }; + const SetPowerStatusSchema = { struct: { name: "string" } }; function borshSerialize(schema: borsh.Schema, data: object): Buffer { return Buffer.from(borsh.serialize(schema, data)); @@ -21,7 +28,7 @@ describe('CPI Example', () => { const powerAccount = Keypair.generate(); - it('Initialize the lever!', async () => { + it("Initialize the lever!", async () => { const ix = new TransactionInstruction({ keys: [ { pubkey: powerAccount.publicKey, isSigner: true, isWritable: true }, @@ -35,27 +42,27 @@ describe('CPI Example', () => { await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, powerAccount]); }); - it('Pull the lever!', async () => { + it("Pull the lever!", async () => { const ix = new TransactionInstruction({ keys: [ { pubkey: powerAccount.publicKey, isSigner: false, isWritable: true }, { pubkey: lever.publicKey, isSigner: false, isWritable: false }, ], programId: hand.publicKey, - data: borshSerialize(SetPowerStatusSchema, { name: 'Chris' }), + data: borshSerialize(SetPowerStatusSchema, { name: "Chris" }), }); await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); }); - it('Pull it again!', async () => { + it("Pull it again!", async () => { const ix = new TransactionInstruction({ keys: [ { pubkey: powerAccount.publicKey, isSigner: false, isWritable: true }, { pubkey: lever.publicKey, isSigner: false, isWritable: false }, ], programId: hand.publicKey, - data: borshSerialize(SetPowerStatusSchema, { name: 'Ashley' }), + data: borshSerialize(SetPowerStatusSchema, { name: "Ashley" }), }); await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); diff --git a/basics/favorites/anchor/Anchor.toml b/basics/favorites/anchor/Anchor.toml index 97b3b5968..e748c486c 100644 --- a/basics/favorites/anchor/Anchor.toml +++ b/basics/favorites/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -favorites = "ww9C83noARSQVBnqmCUmaVdbJjmiwcV9j2LkXYMoUCV" - -# [registry] section removed — no longer used in Anchor 1.0 +favorites = "4wHiZQvMXQKaF1BbgN9Y9D5g1dZersK3J7mLGG5cUjEm" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/favorites/anchor/migrations/deploy.ts b/basics/favorites/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/basics/favorites/anchor/migrations/deploy.ts +++ b/basics/favorites/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/basics/favorites/anchor/package.json b/basics/favorites/anchor/package.json index 7cf70d1bb..95df8da6d 100644 --- a/basics/favorites/anchor/package.json +++ b/basics/favorites/anchor/package.json @@ -1,23 +1,23 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "license": "MIT", - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4", + "litesvm": "^0.4.0" + }, + "license": "MIT", + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/basics/favorites/anchor/pnpm-lock.yaml b/basics/favorites/anchor/pnpm-lock.yaml index d54575b8d..9adb9f5d3 100644 --- a/basics/favorites/anchor/pnpm-lock.yaml +++ b/basics/favorites/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -45,18 +45,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.25.0': @@ -768,16 +768,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -795,7 +795,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.25.0': dependencies: diff --git a/basics/favorites/anchor/programs/favorites/Cargo.toml b/basics/favorites/anchor/programs/favorites/Cargo.toml index 10723e99c..cd3da05c2 100644 --- a/basics/favorites/anchor/programs/favorites/Cargo.toml +++ b/basics/favorites/anchor/programs/favorites/Cargo.toml @@ -20,7 +20,13 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = {version = "1.0.0-rc.5", features = ["init-if-needed"]} +anchor-lang = {version = "1.0.0", features = ["init-if-needed"]} + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/favorites/anchor/programs/favorites/src/lib.rs b/basics/favorites/anchor/programs/favorites/src/lib.rs index 670d65a70..dd8c3c4c5 100644 --- a/basics/favorites/anchor/programs/favorites/src/lib.rs +++ b/basics/favorites/anchor/programs/favorites/src/lib.rs @@ -1,7 +1,7 @@ use anchor_lang::prelude::*; // Our program's address! // This matches the key in the target/deploy directory -declare_id!("ww9C83noARSQVBnqmCUmaVdbJjmiwcV9j2LkXYMoUCV"); +declare_id!("4wHiZQvMXQKaF1BbgN9Y9D5g1dZersK3J7mLGG5cUjEm"); // Anchor programs always use 8 bits for the discriminator pub const ANCHOR_DISCRIMINATOR_SIZE: usize = 8; diff --git a/basics/favorites/anchor/programs/favorites/tests/test_favorites.rs b/basics/favorites/anchor/programs/favorites/tests/test_favorites.rs new file mode 100644 index 000000000..8a9cf7aec --- /dev/null +++ b/basics/favorites/anchor/programs/favorites/tests/test_favorites.rs @@ -0,0 +1,163 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +struct FavoritesData { + number: u64, + color: String, + hobbies: Vec, +} + +/// Manually deserialize the Favorites account data, skipping the 8-byte discriminator. +/// We can't use BorshDeserialize on the full account because init_if_needed allocates +/// more space than the serialized data occupies (padding for max_len strings/vecs). +fn read_favorites(svm: &LiteSVM, pda: &Pubkey) -> FavoritesData { + let account = svm.get_account(pda).unwrap(); + let data = &account.data[8..]; // skip discriminator + let mut offset = 0; + + // u64 number + let number = u64::from_le_bytes(data[offset..offset + 8].try_into().unwrap()); + offset += 8; + + // String color (4-byte length prefix + utf8 data) + let color_len = u32::from_le_bytes(data[offset..offset + 4].try_into().unwrap()) as usize; + offset += 4; + let color = String::from_utf8(data[offset..offset + color_len].to_vec()).unwrap(); + offset += color_len; + + // Vec hobbies (4-byte vec length + each string) + let hobbies_count = + u32::from_le_bytes(data[offset..offset + 4].try_into().unwrap()) as usize; + offset += 4; + let mut hobbies = Vec::with_capacity(hobbies_count); + for _ in 0..hobbies_count { + let hobby_len = + u32::from_le_bytes(data[offset..offset + 4].try_into().unwrap()) as usize; + offset += 4; + let hobby = String::from_utf8(data[offset..offset + hobby_len].to_vec()).unwrap(); + offset += hobby_len; + hobbies.push(hobby); + } + + FavoritesData { + number, + color, + hobbies, + } +} + +fn setup() -> (LiteSVM, Pubkey, solana_keypair::Keypair) { + let program_id = favorites::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/favorites.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +fn favorites_pda(program_id: &Pubkey, user: &Pubkey) -> Pubkey { + Pubkey::find_program_address(&[b"favorites", user.as_ref()], program_id).0 +} + +#[test] +fn test_set_favorites() { + let (mut svm, program_id, payer) = setup(); + let pda = favorites_pda(&program_id, &payer.pubkey()); + + let instruction = Instruction::new_with_bytes( + program_id, + &favorites::instruction::SetFavorites { + number: 23, + color: "purple".to_string(), + hobbies: vec![ + "skiing".to_string(), + "skydiving".to_string(), + "biking".to_string(), + ], + } + .data(), + favorites::accounts::SetFavorites { + user: payer.pubkey(), + favorites: pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) + .unwrap(); + + let data = read_favorites(&svm, &pda); + assert_eq!(data.number, 23); + assert_eq!(data.color, "purple"); + assert_eq!(data.hobbies, vec!["skiing", "skydiving", "biking"]); +} + +#[test] +fn test_update_favorites() { + let (mut svm, program_id, payer) = setup(); + let pda = favorites_pda(&program_id, &payer.pubkey()); + + // Set initial favorites + let instruction = Instruction::new_with_bytes( + program_id, + &favorites::instruction::SetFavorites { + number: 23, + color: "purple".to_string(), + hobbies: vec![ + "skiing".to_string(), + "skydiving".to_string(), + "biking".to_string(), + ], + } + .data(), + favorites::accounts::SetFavorites { + user: payer.pubkey(), + favorites: pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) + .unwrap(); + + // Update favorites with new hobbies + svm.expire_blockhash(); + let update_ix = Instruction::new_with_bytes( + program_id, + &favorites::instruction::SetFavorites { + number: 23, + color: "purple".to_string(), + hobbies: vec![ + "skiing".to_string(), + "skydiving".to_string(), + "biking".to_string(), + "swimming".to_string(), + ], + } + .data(), + favorites::accounts::SetFavorites { + user: payer.pubkey(), + favorites: pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + let data = read_favorites(&svm, &pda); + assert_eq!(data.number, 23); + assert_eq!(data.color, "purple"); + assert_eq!( + data.hobbies, + vec!["skiing", "skydiving", "biking", "swimming"] + ); +} diff --git a/basics/favorites/anchor/tests/litesvm.test.ts b/basics/favorites/anchor/tests/litesvm.test.ts index c3d7c031d..34fd39e18 100644 --- a/basics/favorites/anchor/tests/litesvm.test.ts +++ b/basics/favorites/anchor/tests/litesvm.test.ts @@ -1,143 +1,130 @@ import anchor from "@anchor-lang/core"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; import { assert } from "chai"; import { LiteSVM } from "litesvm"; import IDL from "../target/idl/favorites.json" with { type: "json" }; describe("LiteSVM: Favorites", () => { - const svm = new LiteSVM(); - const programId = new PublicKey(IDL.address); - const coder = new anchor.BorshCoder(IDL as anchor.Idl); //For serialization and deserialization - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(1000000000)); - - const programPath = new URL("../target/deploy/favorites.so", import.meta.url) - .pathname; - svm.addProgramFromFile(programId, programPath); - - const [favPdaAccount] = PublicKey.findProgramAddressSync( - [Buffer.from("favorites"), payer.publicKey.toBuffer()], - programId, - ); - /** - * Here's what we want to write to the blockchain - */ - const favoriteNumber = new anchor.BN(23); - const favoriteColor = "purple"; - const favoriteHobbies = ["skiing", "skydiving", "biking"]; - - it("Writes our favorites to the blockchain", () => { - const ixArgs = { - number: favoriteNumber, - color: favoriteColor, - hobbies: favoriteHobbies, - }; - - const data = coder.instruction.encode("set_favorites", ixArgs); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: favPdaAccount, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - - /** - * Fetch the account and check its favorites - */ - const favAccountInfo = svm.getAccount(favPdaAccount); - const favAccount = coder.accounts.decode( - "Favorites", - Buffer.from(favAccountInfo.data), - ); - - assert.equal(favAccount.number.toNumber(), favoriteNumber.toNumber()); - assert.equal(favAccount.color, favoriteColor); - assert.deepStrictEqual(favAccount.hobbies, favoriteHobbies); - }); - - it("Updates the favorites", () => { - const newFavoriteHobbies = ["coding", "reading", "biking", "swimming"]; - const ixArgs = { - number: favoriteNumber, - color: favoriteColor, - hobbies: newFavoriteHobbies, - }; - - const data = coder.instruction.encode("set_favorites", ixArgs); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: favPdaAccount, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - - /** - * Fetch the account and check its favorites - */ - const favAccountInfo = svm.getAccount(favPdaAccount); - const favAccount = coder.accounts.decode( - "Favorites", - Buffer.from(favAccountInfo.data), - ); - - assert.equal(favAccount.number.toNumber(), favoriteNumber.toNumber()); - assert.equal(favAccount.color, favoriteColor); - assert.deepStrictEqual(favAccount.hobbies, newFavoriteHobbies); - }); - - it("Rejects transactions from unauthorized signers", () => { - const newFavoriteHobbies = ["coding", "reading", "biking"]; - const someRandomGuy = Keypair.generate(); - - const ixArgs = { - number: favoriteNumber, - color: favoriteColor, - hobbies: newFavoriteHobbies, - }; - - const data = coder.instruction.encode("set_favorites", ixArgs); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: favPdaAccount, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - - assert.Throw(() => { - tx.sign(someRandomGuy); - svm.sendTransaction(tx); - }, "unknown signer"); - }); + const svm = new LiteSVM(); + const programId = new PublicKey(IDL.address); + const coder = new anchor.BorshCoder(IDL as anchor.Idl); //For serialization and deserialization + const payer = Keypair.generate(); + svm.airdrop(payer.publicKey, BigInt(1000000000)); + + const programPath = new URL("../target/deploy/favorites.so", import.meta.url).pathname; + svm.addProgramFromFile(programId, programPath); + + const [favPdaAccount] = PublicKey.findProgramAddressSync( + [Buffer.from("favorites"), payer.publicKey.toBuffer()], + programId, + ); + /** + * Here's what we want to write to the blockchain + */ + const favoriteNumber = new anchor.BN(23); + const favoriteColor = "purple"; + const favoriteHobbies = ["skiing", "skydiving", "biking"]; + + it("Writes our favorites to the blockchain", () => { + const ixArgs = { + number: favoriteNumber, + color: favoriteColor, + hobbies: favoriteHobbies, + }; + + const data = coder.instruction.encode("set_favorites", ixArgs); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: favPdaAccount, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); + + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); + + /** + * Fetch the account and check its favorites + */ + const favAccountInfo = svm.getAccount(favPdaAccount); + const favAccount = coder.accounts.decode("Favorites", Buffer.from(favAccountInfo.data)); + + assert.equal(favAccount.number.toNumber(), favoriteNumber.toNumber()); + assert.equal(favAccount.color, favoriteColor); + assert.deepStrictEqual(favAccount.hobbies, favoriteHobbies); + }); + + it("Updates the favorites", () => { + const newFavoriteHobbies = ["coding", "reading", "biking", "swimming"]; + const ixArgs = { + number: favoriteNumber, + color: favoriteColor, + hobbies: newFavoriteHobbies, + }; + + const data = coder.instruction.encode("set_favorites", ixArgs); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: favPdaAccount, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); + + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); + + /** + * Fetch the account and check its favorites + */ + const favAccountInfo = svm.getAccount(favPdaAccount); + const favAccount = coder.accounts.decode("Favorites", Buffer.from(favAccountInfo.data)); + + assert.equal(favAccount.number.toNumber(), favoriteNumber.toNumber()); + assert.equal(favAccount.color, favoriteColor); + assert.deepStrictEqual(favAccount.hobbies, newFavoriteHobbies); + }); + + it("Rejects transactions from unauthorized signers", () => { + const newFavoriteHobbies = ["coding", "reading", "biking"]; + const someRandomGuy = Keypair.generate(); + + const ixArgs = { + number: favoriteNumber, + color: favoriteColor, + hobbies: newFavoriteHobbies, + }; + + const data = coder.instruction.encode("set_favorites", ixArgs); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: favPdaAccount, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); + + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + + assert.Throw(() => { + tx.sign(someRandomGuy); + svm.sendTransaction(tx); + }, "unknown signer"); + }); }); diff --git a/basics/favorites/anchor/tests/test.ts b/basics/favorites/anchor/tests/test.ts index c39d43a6f..c77cfa258 100644 --- a/basics/favorites/anchor/tests/test.ts +++ b/basics/favorites/anchor/tests/test.ts @@ -5,83 +5,77 @@ import { assert } from "chai"; import type { Favorites } from "../target/types/favorites.ts"; describe("Anchor: Favorites", () => { - // Use the cluster and the keypair from Anchor.toml - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const web3 = anchor.web3; - // See https://github.com/coral-xyz/anchor/issues/3122 - const user = (provider.wallet as anchor.Wallet).payer; - const someRandomGuy = anchor.web3.Keypair.generate(); - const program = anchor.workspace.Favorites as Program; + // Use the cluster and the keypair from Anchor.toml + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + const web3 = anchor.web3; + // See https://github.com/coral-xyz/anchor/issues/3122 + const user = (provider.wallet as anchor.Wallet).payer; + const someRandomGuy = anchor.web3.Keypair.generate(); + const program = anchor.workspace.Favorites as Program; - // Here's what we want to write to the blockchain - const favoriteNumber = new BN(23); - const favoriteColor = "purple"; - const favoriteHobbies = ["skiing", "skydiving", "biking"]; + // Here's what we want to write to the blockchain + const favoriteNumber = new BN(23); + const favoriteColor = "purple"; + const favoriteHobbies = ["skiing", "skydiving", "biking"]; - // We don't need to airdrop if we're using the local cluster - // because the local cluster gives us 85 billion dollars worth of SOL - before(async () => { - const balance = await provider.connection.getBalance(user.publicKey); - const balanceInSOL = balance / web3.LAMPORTS_PER_SOL; - const formattedBalance = new Intl.NumberFormat().format(balanceInSOL); - console.log(`Balance: ${formattedBalance} SOL`); - }); + // We don't need to airdrop if we're using the local cluster + // because the local cluster gives us 85 billion dollars worth of SOL + before(async () => { + const balance = await provider.connection.getBalance(user.publicKey); + const balanceInSOL = balance / web3.LAMPORTS_PER_SOL; + const formattedBalance = new Intl.NumberFormat().format(balanceInSOL); + console.log(`Balance: ${formattedBalance} SOL`); + }); - it("Writes our favorites to the blockchain", async () => { - await program.methods - // set_favourites in Rust becomes setFavorites in TypeScript - .setFavorites(favoriteNumber, favoriteColor, favoriteHobbies) - // Sign the transaction - .signers([user]) - // Send the transaction to the cluster or RPC - .rpc(); + it("Writes our favorites to the blockchain", async () => { + await program.methods + // set_favourites in Rust becomes setFavorites in TypeScript + .setFavorites(favoriteNumber, favoriteColor, favoriteHobbies) + // Sign the transaction + .signers([user]) + // Send the transaction to the cluster or RPC + .rpc(); - // Find the PDA for the user's favorites - const favoritesPdaAndBump = web3.PublicKey.findProgramAddressSync( - [Buffer.from("favorites"), user.publicKey.toBuffer()], - program.programId, - ); - const favoritesPda = favoritesPdaAndBump[0]; - const dataFromPda = await program.account.favorites.fetch(favoritesPda); - // And make sure it matches! - assert.equal(dataFromPda.color, favoriteColor); - // A little extra work to make sure the BNs are equal - assert.equal(dataFromPda.number.toString(), favoriteNumber.toString()); - // And check the hobbies too - assert.deepEqual(dataFromPda.hobbies, favoriteHobbies); - }); + // Find the PDA for the user's favorites + const favoritesPdaAndBump = web3.PublicKey.findProgramAddressSync( + [Buffer.from("favorites"), user.publicKey.toBuffer()], + program.programId, + ); + const favoritesPda = favoritesPdaAndBump[0]; + const dataFromPda = await program.account.favorites.fetch(favoritesPda); + // And make sure it matches! + assert.equal(dataFromPda.color, favoriteColor); + // A little extra work to make sure the BNs are equal + assert.equal(dataFromPda.number.toString(), favoriteNumber.toString()); + // And check the hobbies too + assert.deepEqual(dataFromPda.hobbies, favoriteHobbies); + }); - it("Updates the favorites", async () => { - const newFavoriteHobbies = ["skiing", "skydiving", "biking", "swimming"]; + it("Updates the favorites", async () => { + const newFavoriteHobbies = ["skiing", "skydiving", "biking", "swimming"]; - await program.methods - .setFavorites(favoriteNumber, favoriteColor, newFavoriteHobbies) - .signers([user]) - .rpc(); + await program.methods.setFavorites(favoriteNumber, favoriteColor, newFavoriteHobbies).signers([user]).rpc(); - // Find the PDA for the user's favorites - const favoritesPdaAndBump = web3.PublicKey.findProgramAddressSync( - [Buffer.from("favorites"), user.publicKey.toBuffer()], - program.programId, - ); - const favoritesPda = favoritesPdaAndBump[0]; - const dataFromPda = await program.account.favorites.fetch(favoritesPda); + // Find the PDA for the user's favorites + const favoritesPdaAndBump = web3.PublicKey.findProgramAddressSync( + [Buffer.from("favorites"), user.publicKey.toBuffer()], + program.programId, + ); + const favoritesPda = favoritesPdaAndBump[0]; + const dataFromPda = await program.account.favorites.fetch(favoritesPda); - assert.equal(dataFromPda.color, favoriteColor); - assert.equal(dataFromPda.number.toString(), favoriteNumber.toString()); - assert.deepEqual(dataFromPda.hobbies, newFavoriteHobbies); - }); + assert.equal(dataFromPda.color, favoriteColor); + assert.equal(dataFromPda.number.toString(), favoriteNumber.toString()); + assert.deepEqual(dataFromPda.hobbies, newFavoriteHobbies); + }); - it("Rejects transactions from unauthorized signers", async () => { - try { - await program.methods - .setFavorites(favoriteNumber, favoriteColor, favoriteHobbies) - .signers([someRandomGuy]) - .rpc(); - assert.fail("Expected unauthorized signer error"); - } catch (err) { - assert.include((err as Error).message, "unknown signer"); - } - }); + it("Rejects transactions from unauthorized signers", async () => { + try { + await program.methods.setFavorites(favoriteNumber, favoriteColor, favoriteHobbies).signers([someRandomGuy]).rpc(); + assert.fail("Expected unauthorized signer error"); + } catch (err) { + assert.include((err as Error).message, "unknown signer"); + } + }); }); diff --git a/basics/favorites/anchor/tsconfig.json b/basics/favorites/anchor/tsconfig.json index fdf5c04de..395d18165 100644 --- a/basics/favorites/anchor/tsconfig.json +++ b/basics/favorites/anchor/tsconfig.json @@ -1,10 +1,10 @@ { - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2020"], - "module": "nodenext", - "target": "es2020", - "esModuleInterop": true - } + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2020"], + "module": "nodenext", + "target": "es2020", + "esModuleInterop": true + } } diff --git a/basics/favorites/native/program/Cargo.toml b/basics/favorites/native/program/Cargo.toml index fab1cd066..416af7197 100644 --- a/basics/favorites/native/program/Cargo.toml +++ b/basics/favorites/native/program/Cargo.toml @@ -20,7 +20,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/favorites/native/tests/test.ts b/basics/favorites/native/tests/test.ts index 0027bb7bb..13e5e5b34 100644 --- a/basics/favorites/native/tests/test.ts +++ b/basics/favorites/native/tests/test.ts @@ -1,6 +1,6 @@ import { - Blockhash, - Keypair, + type Blockhash, + type Keypair, PublicKey, SystemProgram, Transaction, @@ -10,7 +10,7 @@ import { BN } from "bn.js"; import * as borsh from "borsh"; import { assert, expect } from "chai"; import { describe, test } from "mocha"; -import { BanksClient, ProgramTestContext, start } from "solana-bankrun"; +import { type BanksClient, type ProgramTestContext, start } from "solana-bankrun"; const MyInstruction = { CreateFav: 0, @@ -103,9 +103,7 @@ describe("Favorites Solana Native", () => { console.log("Deserialized data:", favoritesData); - expect(new BN(favoritesData.number as any, "le").toNumber()).to.equal( - favData.number, - ); + expect(new BN(favoritesData.number as Buffer, "le").toNumber()).to.equal(favData.number); expect(favoritesData.color).to.equal(favData.color); expect(favoritesData.hobbies).to.deep.equal(favData.hobbies); }); diff --git a/basics/favorites/pinocchio/program/Cargo.toml b/basics/favorites/pinocchio/program/Cargo.toml index 576a8c916..2842e5f8c 100644 --- a/basics/favorites/pinocchio/program/Cargo.toml +++ b/basics/favorites/pinocchio/program/Cargo.toml @@ -21,7 +21,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/favorites/pinocchio/tests/test.ts b/basics/favorites/pinocchio/tests/test.ts index e6d02ff24..f63e2f8bb 100644 --- a/basics/favorites/pinocchio/tests/test.ts +++ b/basics/favorites/pinocchio/tests/test.ts @@ -1,16 +1,4 @@ -import { - Blockhash, - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import { BN } from "bn.js"; -import * as borsh from "borsh"; -import { assert, expect } from "chai"; -import { describe, test } from "mocha"; -import { BanksClient, ProgramTestContext, start } from "solana-bankrun"; +import { describe } from "mocha"; describe("Favorites Solana Pinocchio", () => { console.log("Favorites Solana Pinocchio"); diff --git a/basics/hello-solana/anchor/Anchor.toml b/basics/hello-solana/anchor/Anchor.toml index 7ac88bd13..7716a75a1 100644 --- a/basics/hello-solana/anchor/Anchor.toml +++ b/basics/hello-solana/anchor/Anchor.toml @@ -2,17 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false +resolution = true skip-lint = false [programs.localnet] -hello_solana = "2phbC62wekpw95XuBk4i1KX4uA8zBUWmYbiTMhicSuBV" - -# [registry] section removed — no longer used in Anchor 1.0 +hello_solana = "52rNd2KDuqHaxs2vEFfEjH2zwKScA2B9AyW8F2fAcca8" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/hello-solana/anchor/package.json b/basics/hello-solana/anchor/package.json deleted file mode 100644 index 0696e9344..000000000 --- a/basics/hello-solana/anchor/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } -} diff --git a/basics/hello-solana/anchor/pnpm-lock.yaml b/basics/hello-solana/anchor/pnpm-lock.yaml deleted file mode 100644 index 685c53440..000000000 --- a/basics/hello-solana/anchor/pnpm-lock.yaml +++ /dev/null @@ -1,1466 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - litesvm: - specifier: ^0.4.0 - version: 0.4.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.1.5 - '@types/chai': - specifier: ^4.3.0 - version: 4.3.16 - '@types/mocha': - specifier: ^9.0.0 - version: 9.1.1 - chai: - specifier: ^4.3.4 - version: 4.4.1 - mocha: - specifier: ^9.0.3 - version: 9.2.2 - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) - typescript: - specifier: ^5.3.3 - version: 5.9.3 - -packages: - - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} - engines: {node: '>=10'} - peerDependencies: - '@solana/web3.js': ^1.69.0 - - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} - engines: {node: '>=17'} - - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} - engines: {node: '>=10'} - - '@babel/runtime@7.25.0': - resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} - engines: {node: '>=6.9.0'} - - '@noble/curves@1.4.2': - resolution: {integrity: sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw==} - - '@noble/hashes@1.4.0': - resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} - engines: {node: '>= 16'} - - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} - - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} - - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} - engines: {node: '>=20.18.0'} - peerDependencies: - typescript: '>=5.3.3' - - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} - engines: {node: '>=20.18.0'} - hasBin: true - peerDependencies: - typescript: '>=5.3.3' - - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} - - '@swc/helpers@0.5.12': - resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} - - '@types/bn.js@5.1.5': - resolution: {integrity: sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==} - - '@types/chai@4.3.16': - resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@20.12.11': - resolution: {integrity: sha512-vDg9PZ/zi+Nqp6boSOT7plNuthRugEKixDv5sFTIpkE89MmNtEArAShI4mxuX2+UrLEe9pxC1vm2cjm9YlWbJw==} - - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} - - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - - JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} - hasBin: true - - agentkeepalive@4.5.0: - resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} - engines: {node: '>= 8.0.0'} - - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - base-x@3.0.9: - resolution: {integrity: sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - bn.js@5.2.1: - resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} - - bn.js@5.2.2: - resolution: {integrity: sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browser-stdout@1.3.1: - resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer-layout@1.2.2: - resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} - engines: {node: '>=4.5'} - - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - - bufferutil@4.0.8: - resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} - engines: {node: '>=6.14.2'} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - chai@4.4.1: - resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@14.0.2: - resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - cross-fetch@3.2.0: - resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - - deep-eql@4.1.3: - resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} - engines: {node: '>=6'} - - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - - diff@3.5.0: - resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} - engines: {node: '>=0.3.1'} - - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - eventemitter3@5.0.1: - resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} - - eyes@0.1.8: - resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} - engines: {node: '> 0.1.90'} - - fast-stable-stringify@1.0.0: - resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - - fastestsmallesttextencoderdecoder@1.0.22: - resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isomorphic-ws@4.0.1: - resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} - peerDependencies: - ws: '*' - - jayson@4.1.1: - resolution: {integrity: sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w==} - engines: {node: '>=8'} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} - - litesvm-darwin-arm64@0.4.0: - resolution: {integrity: sha512-LN6iZcUQ6Xi5KO/7yJBYSALjjDCI/s/s2PgV3BqM4dpeBaLz+fXX/+qgMcBgpEVgEdEmhelux+WtAMkbEzJfrA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [darwin] - - litesvm-darwin-x64@0.4.0: - resolution: {integrity: sha512-3ltogKQdle8LbakVqoB6plxaNwp6Vb3tnkqa3G5mAvvZNorB2iumThDaTZ381Knl69t566LZm+g/VDZwYfsfhA==} - engines: {node: '>= 20'} - cpu: [x64] - os: [darwin] - - litesvm-linux-arm64-gnu@0.4.0: - resolution: {integrity: sha512-SWlcRUqkXCMgLoDX/Wqr/S1lff+ggVI9f0YrRJMraxtEyApxutAoW2AWw4tvo6DsEgNwjxgsZOAwnE6bQBv8CA==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [glibc] - - litesvm-linux-arm64-musl@0.4.0: - resolution: {integrity: sha512-YMMqwEWJUSWwL0Rwp8dFwl3jvgNU21eI7Qc+BpH9u2yeIRYQTn3rNGDnsK8v3QIZPHQdMo7NrPhzk4XoB1aKPg==} - engines: {node: '>= 20'} - cpu: [arm64] - os: [linux] - libc: [musl] - - litesvm-linux-x64-gnu@0.4.0: - resolution: {integrity: sha512-brZ3tFABDVQEYCgci7AO8iVYLw10UXVo97/lpTy75bTzNoqkggg8wFQOrbgCdb9NRwt06Y4Zf8cpIZAoDQq2mw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [glibc] - - litesvm-linux-x64-musl@0.4.0: - resolution: {integrity: sha512-D98qdIOuWg4fOewIIiH1D23AtM4I7/3vLKXIL8uQz06D5ev5fsBzNp2gM7libAywTkCYy/u666xgD6PsWhrTaw==} - engines: {node: '>= 20'} - cpu: [x64] - os: [linux] - libc: [musl] - - litesvm@0.4.0: - resolution: {integrity: sha512-ySr5mB2ap4SzJpmVR2I5+gjzTH8NJbkg7DYPormzA2U9F4LhfvTTrD17X/k5N3Bn4b5Db6/CwSyX2qc0HrJtNA==} - engines: {node: '>= 20'} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - loupe@2.3.7: - resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - - make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} - hasBin: true - - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - nanoid@3.3.1: - resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - - node-gyp-build@4.8.1: - resolution: {integrity: sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==} - hasBin: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - pako@2.1.0: - resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - rpc-websockets@9.0.2: - resolution: {integrity: sha512-YzggvfItxMY3Lwuax5rC18inhbjJv9Py7JXRHxTIi94JOLrqBsSsUUc5bbl5W6c11tXhdfpDPK0KzBhoGe8jjw==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - superstruct@0.15.5: - resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} - - superstruct@2.0.2: - resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} - engines: {node: '>=14.0.0'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toml@3.0.0: - resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} - - tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - ts-mocha@10.0.0: - resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} - engines: {node: '>= 6.X.X'} - hasBin: true - peerDependencies: - mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X - - ts-node@7.0.1: - resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} - engines: {node: '>=4.2.0'} - hasBin: true - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - - typescript@5.9.3: - resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} - engines: {node: '>=14.17'} - hasBin: true - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} - engines: {node: '>=6.14.2'} - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - ws@7.5.10: - resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.17.0: - resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - - yn@2.0.0: - resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} - engines: {node: '>=4'} - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - -snapshots: - - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - buffer-layout: 1.2.2 - - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 - '@noble/hashes': 1.8.0 - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - bn.js: 5.2.2 - bs58: 4.0.1 - buffer-layout: 1.2.2 - camelcase: 6.3.0 - cross-fetch: 3.2.0 - eventemitter3: 4.0.7 - pako: 2.1.0 - superstruct: 0.15.5 - toml: 3.0.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@anchor-lang/errors@1.0.0-rc.5': {} - - '@babel/runtime@7.25.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@noble/curves@1.4.2': - dependencies: - '@noble/hashes': 1.4.0 - - '@noble/hashes@1.4.0': {} - - '@noble/hashes@1.8.0': {} - - '@solana/buffer-layout@4.0.1': - dependencies: - buffer: 6.0.3 - - '@solana/codecs-core@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': - dependencies: - '@solana/codecs-core': 2.3.0(typescript@5.9.3) - '@solana/errors': 2.3.0(typescript@5.9.3) - typescript: 5.9.3 - - '@solana/errors@2.3.0(typescript@5.9.3)': - dependencies: - chalk: 5.6.2 - commander: 14.0.2 - typescript: 5.9.3 - - '@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': - 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.3.0(typescript@5.9.3) - 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(bufferutil@4.0.8)(utf-8-validate@5.0.10) - node-fetch: 2.7.0 - rpc-websockets: 9.0.2 - superstruct: 2.0.2 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - '@swc/helpers@0.5.12': - dependencies: - tslib: 2.6.2 - - '@types/bn.js@5.1.5': - dependencies: - '@types/node': 20.12.11 - - '@types/chai@4.3.16': {} - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.12.11 - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} - - '@types/node@12.20.55': {} - - '@types/node@20.12.11': - dependencies: - undici-types: 5.26.5 - - '@types/uuid@8.3.4': {} - - '@types/ws@7.4.7': - dependencies: - '@types/node': 20.12.11 - - '@types/ws@8.5.12': - dependencies: - '@types/node': 20.12.11 - - '@ungap/promise-all-settled@1.1.2': {} - - JSONStream@1.3.5: - dependencies: - jsonparse: 1.3.1 - through: 2.3.8 - - agentkeepalive@4.5.0: - dependencies: - humanize-ms: 1.2.1 - - ansi-colors@4.1.1: {} - - ansi-regex@5.0.1: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - argparse@2.0.1: {} - - arrify@1.0.1: {} - - assertion-error@1.1.0: {} - - balanced-match@1.0.2: {} - - base-x@3.0.9: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - - binary-extensions@2.3.0: {} - - bn.js@5.2.1: {} - - bn.js@5.2.2: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.1 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - browser-stdout@1.3.1: {} - - bs58@4.0.1: - dependencies: - base-x: 3.0.9 - - buffer-from@1.1.2: {} - - buffer-layout@1.2.2: {} - - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bufferutil@4.0.8: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - camelcase@6.3.0: {} - - chai@4.4.1: - 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.7 - pathval: 1.1.1 - type-detect: 4.0.8 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.6.2: {} - - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - cliui@7.0.4: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@14.0.2: {} - - commander@2.20.3: {} - - concat-map@0.0.1: {} - - cross-fetch@3.2.0: - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - debug@4.3.3(supports-color@8.1.1): - dependencies: - ms: 2.1.2 - optionalDependencies: - supports-color: 8.1.1 - - decamelize@4.0.0: {} - - deep-eql@4.1.3: - dependencies: - type-detect: 4.0.8 - - delay@5.0.0: {} - - diff@3.5.0: {} - - diff@5.0.0: {} - - emoji-regex@8.0.0: {} - - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - - escalade@3.1.2: {} - - escape-string-regexp@4.0.0: {} - - eventemitter3@4.0.7: {} - - eventemitter3@5.0.1: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - - fastestsmallesttextencoderdecoder@1.0.22: {} - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat@5.0.2: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - get-caller-file@2.0.5: {} - - get-func-name@2.0.2: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} - - has-flag@4.0.0: {} - - he@1.2.0: {} - - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - - ieee754@1.2.1: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} - - is-plain-obj@2.1.0: {} - - is-unicode-supported@0.1.0: {} - - isexe@2.0.0: {} - - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)): - dependencies: - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - - jayson@4.1.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - JSONStream: 1.3.5 - commander: 2.20.3 - delay: 5.0.0 - es6-promisify: 5.0.0 - eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - json-stringify-safe: 5.0.1 - uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-stringify-safe@5.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - optional: true - - jsonparse@1.3.1: {} - - litesvm-darwin-arm64@0.4.0: - optional: true - - litesvm-darwin-x64@0.4.0: - optional: true - - litesvm-linux-arm64-gnu@0.4.0: - optional: true - - litesvm-linux-arm64-musl@0.4.0: - optional: true - - litesvm-linux-x64-gnu@0.4.0: - optional: true - - litesvm-linux-x64-musl@0.4.0: - optional: true - - litesvm@0.4.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) - fastestsmallesttextencoderdecoder: 1.0.22 - optionalDependencies: - litesvm-darwin-arm64: 0.4.0 - litesvm-darwin-x64: 0.4.0 - litesvm-linux-arm64-gnu: 0.4.0 - litesvm-linux-arm64-musl: 0.4.0 - litesvm-linux-x64-gnu: 0.4.0 - litesvm-linux-x64-musl: 0.4.0 - transitivePeerDependencies: - - bufferutil - - encoding - - typescript - - utf-8-validate - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - loupe@2.3.7: - dependencies: - get-func-name: 2.0.2 - - make-error@1.3.6: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: - dependencies: - brace-expansion: 1.1.11 - - minimist@1.2.8: {} - - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 - - mocha@9.2.2: - dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 - browser-stdout: 1.3.1 - chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 - escape-string-regexp: 4.0.0 - find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 - he: 1.2.0 - js-yaml: 4.1.0 - log-symbols: 4.1.0 - minimatch: 4.2.1 - ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 - strip-json-comments: 3.1.1 - supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 - yargs: 16.2.0 - yargs-parser: 20.2.4 - yargs-unparser: 2.0.0 - - ms@2.1.2: {} - - ms@2.1.3: {} - - nanoid@3.3.1: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-gyp-build@4.8.1: - optional: true - - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - pako@2.1.0: {} - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - pathval@1.1.1: {} - - picomatch@2.3.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - regenerator-runtime@0.14.1: {} - - require-directory@2.1.1: {} - - rpc-websockets@9.0.2: - dependencies: - '@swc/helpers': 0.5.12 - '@types/uuid': 8.3.4 - '@types/ws': 8.5.12 - buffer: 6.0.3 - eventemitter3: 5.0.1 - uuid: 8.3.2 - ws: 8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - safe-buffer@5.2.1: {} - - serialize-javascript@6.0.0: - dependencies: - randombytes: 2.1.0 - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-bom@3.0.0: - optional: true - - strip-json-comments@3.1.1: {} - - superstruct@0.15.5: {} - - superstruct@2.0.2: {} - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - text-encoding-utf-8@1.0.2: {} - - through@2.3.8: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toml@3.0.0: {} - - tr46@0.0.3: {} - - ts-mocha@10.0.0(mocha@9.2.2): - dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 - optionalDependencies: - tsconfig-paths: 3.15.0 - - ts-node@7.0.1: - dependencies: - arrify: 1.0.1 - buffer-from: 1.1.2 - diff: 3.5.0 - make-error: 1.3.6 - minimist: 1.2.8 - mkdirp: 0.5.6 - source-map-support: 0.5.21 - yn: 2.0.0 - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - optional: true - - tslib@2.6.2: {} - - type-detect@4.0.8: {} - - typescript@5.9.3: {} - - undici-types@5.26.5: {} - - utf-8-validate@5.0.10: - dependencies: - node-gyp-build: 4.8.1 - optional: true - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrappy@1.0.2: {} - - ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - ws@8.17.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): - optionalDependencies: - bufferutil: 4.0.8 - utf-8-validate: 5.0.10 - - y18n@5.0.8: {} - - yargs-parser@20.2.4: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@16.2.0: - dependencies: - cliui: 7.0.4 - escalade: 3.1.2 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.4 - - yn@2.0.0: {} - - yocto-queue@0.1.0: {} diff --git a/basics/hello-solana/anchor/programs/hello-solana/Cargo.toml b/basics/hello-solana/anchor/programs/hello-solana/Cargo.toml index 455794ab9..9cadce60d 100644 --- a/basics/hello-solana/anchor/programs/hello-solana/Cargo.toml +++ b/basics/hello-solana/anchor/programs/hello-solana/Cargo.toml @@ -20,8 +20,12 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/hello-solana/anchor/programs/hello-solana/src/lib.rs b/basics/hello-solana/anchor/programs/hello-solana/src/lib.rs index d714080f3..ff0d0d25a 100644 --- a/basics/hello-solana/anchor/programs/hello-solana/src/lib.rs +++ b/basics/hello-solana/anchor/programs/hello-solana/src/lib.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; -declare_id!("2phbC62wekpw95XuBk4i1KX4uA8zBUWmYbiTMhicSuBV"); +declare_id!("52rNd2KDuqHaxs2vEFfEjH2zwKScA2B9AyW8F2fAcca8"); #[program] pub mod hello_solana { diff --git a/basics/hello-solana/anchor/programs/hello-solana/tests/test_hello.rs b/basics/hello-solana/anchor/programs/hello-solana/tests/test_hello.rs new file mode 100644 index 000000000..815d051a0 --- /dev/null +++ b/basics/hello-solana/anchor/programs/hello-solana/tests/test_hello.rs @@ -0,0 +1,24 @@ +use { + anchor_lang::{solana_program::instruction::Instruction, InstructionData, ToAccountMetas}, + litesvm::LiteSVM, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +#[test] +fn test_say_hello() { + let program_id = hello_solana::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/hello_solana.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 1_000_000_000).unwrap(); + + let instruction = Instruction::new_with_bytes( + program_id, + &hello_solana::instruction::Hello {}.data(), + hello_solana::accounts::Hello {}.to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) + .unwrap(); +} diff --git a/basics/hello-solana/anchor/tests/litesvm.test.ts b/basics/hello-solana/anchor/tests/litesvm.test.ts deleted file mode 100644 index 30f9e5b74..000000000 --- a/basics/hello-solana/anchor/tests/litesvm.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -import anchor from "@anchor-lang/core"; -import { - Keypair, - PublicKey, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import { LiteSVM } from "litesvm"; -import IDL from "../target/idl/hello_solana.json" with { type: "json" }; - -describe("LiteSVM: hello-solana", () => { - const svm = new LiteSVM(); - const programId = new PublicKey(IDL.address); - /** - * Creates a coder to easily build and encode program instructions based on the IDL. - */ - const coder = new anchor.BorshCoder(IDL as anchor.Idl); - - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(1000000000)); - - /** - * Load the hello_solana program binary into the LiteSVM instance - * for local testing and simulation. - */ - const programPath = new URL( - "../target/deploy/hello_solana.so", - import.meta.url, - ).pathname; - svm.addProgramFromFile(programId, programPath); - - it("Say hello!", () => { - /** - * Create an instruction for the 'hello' method using the Anchor coder. - * No arguments are needed for this instruction so i give `{}`. - */ - const data = coder.instruction.encode("hello", {}); - - /** - * Build and sign a transaction to call the 'hello' instruction - * on the hello_solana program with LiteSVM. - */ - const ix = new TransactionInstruction({ - keys: [], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - }); -}); diff --git a/basics/hello-solana/anchor/tests/test.ts b/basics/hello-solana/anchor/tests/test.ts deleted file mode 100644 index 18f4ab831..000000000 --- a/basics/hello-solana/anchor/tests/test.ts +++ /dev/null @@ -1,17 +0,0 @@ -import * as anchor from "@anchor-lang/core"; -import type { HelloSolana } from "../target/types/hello_solana.ts"; - -describe("Anchor: hello-solana", () => { - // Configure the Anchor provider & load the program IDL - // The IDL gives you a typescript module - // - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const program = anchor.workspace.HelloSolana as anchor.Program; - - it("Say hello!", async () => { - // Just run Anchor's IDL method to build a transaction! - // - await program.methods.hello().accounts({}).rpc(); - }); -}); diff --git a/basics/hello-solana/anchor/tsconfig.json b/basics/hello-solana/anchor/tsconfig.json deleted file mode 100644 index fdf5c04de..000000000 --- a/basics/hello-solana/anchor/tsconfig.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2020"], - "module": "nodenext", - "target": "es2020", - "esModuleInterop": true - } -} diff --git a/basics/hello-solana/native/program/Cargo.toml b/basics/hello-solana/native/program/Cargo.toml index 6467e0684..a51e82ffa 100644 --- a/basics/hello-solana/native/program/Cargo.toml +++ b/basics/hello-solana/native/program/Cargo.toml @@ -17,7 +17,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/hello-solana/native/tests/index.test.ts b/basics/hello-solana/native/tests/index.test.ts index ec7daa61e..1c0c85b31 100644 --- a/basics/hello-solana/native/tests/index.test.ts +++ b/basics/hello-solana/native/tests/index.test.ts @@ -1,16 +1,16 @@ -import { describe, test } from 'node:test'; -import { PublicKey, Transaction, TransactionInstruction } from '@solana/web3.js'; -import { assert } from 'chai'; -import { start } from 'solana-bankrun'; +import { describe, test } from "node:test"; +import { PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; +import { assert } from "chai"; +import { start } from "solana-bankrun"; -describe('hello-solana', async () => { +describe("hello-solana", async () => { // load program in solana-bankrun const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'hello_solana_program', programId: PROGRAM_ID }], []); + const context = await start([{ name: "hello_solana_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; - test('Say hello!', async () => { + test("Say hello!", async () => { const blockhash = context.lastBlockhash; // We set up our instruction first. const ix = new TransactionInstruction({ @@ -27,7 +27,7 @@ describe('hello-solana', async () => { const transaction = await client.processTransaction(tx); assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - assert(transaction.logMessages[1] === 'Program log: Hello, Solana!'); + assert(transaction.logMessages[1] === "Program log: Hello, Solana!"); assert(transaction.logMessages[2] === `Program log: Our program's Program ID: ${PROGRAM_ID}`); assert(transaction.logMessages[3].startsWith(`Program ${PROGRAM_ID} consumed`)); assert(transaction.logMessages[4] === `Program ${PROGRAM_ID} success`); diff --git a/basics/hello-solana/pinocchio/tests/index.test.ts b/basics/hello-solana/pinocchio/tests/index.test.ts index 734bad24f..985c2befa 100644 --- a/basics/hello-solana/pinocchio/tests/index.test.ts +++ b/basics/hello-solana/pinocchio/tests/index.test.ts @@ -1,17 +1,17 @@ -import { PublicKey, Transaction, TransactionInstruction } from '@solana/web3.js'; -import { assert } from 'chai'; -import { ProgramTestContext, start } from 'solana-bankrun'; +import { PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; +import { assert } from "chai"; +import { type ProgramTestContext, start } from "solana-bankrun"; -describe('hello-solana', () => { +describe("hello-solana", () => { const PROGRAM_ID = PublicKey.unique(); // load program in solana-bankrun let context: ProgramTestContext; before(async () => { - context = await start([{ name: 'hello_solana_program_pinocchio', programId: PROGRAM_ID }], []); + context = await start([{ name: "hello_solana_program_pinocchio", programId: PROGRAM_ID }], []); }); - it('Say hello!', async () => { + it("Say hello!", async () => { const client = context.banksClient; const payer = context.payer; const blockhash = context.lastBlockhash; @@ -30,8 +30,8 @@ describe('hello-solana', () => { const transaction = await client.processTransaction(tx); assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - assert(transaction.logMessages[1] === 'Program log: Hello, Solana!'); - assert(transaction.logMessages[2] === `Program log: [${Array.from(PROGRAM_ID.toBytes()).join(', ')}]`); + assert(transaction.logMessages[1] === "Program log: Hello, Solana!"); + assert(transaction.logMessages[2] === `Program log: [${Array.from(PROGRAM_ID.toBytes()).join(", ")}]`); assert(transaction.logMessages[3].startsWith(`Program ${PROGRAM_ID} consumed`)); assert(transaction.logMessages[4] === `Program ${PROGRAM_ID} success`); assert(transaction.logMessages.length === 5); diff --git a/basics/pda-rent-payer/anchor/Anchor.toml b/basics/pda-rent-payer/anchor/Anchor.toml index 50b35bcf2..14b4bd938 100644 --- a/basics/pda-rent-payer/anchor/Anchor.toml +++ b/basics/pda-rent-payer/anchor/Anchor.toml @@ -2,15 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false -[programs.localnet] -pda_rent_payer = "7Hm9nsYVuBZ9rf8z9AMUHreZRv8Q4vLhqwdVTCawRZtA" +resolution = true +skip-lint = false -# [registry] section removed — no longer used in Anchor 1.0 +[programs.localnet] +pda_rent_payer = "EC9R1o4AsK3hoeh61yNyr2xiDoorgyS4ZBmhYujNUsyN" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/pda-rent-payer/anchor/package.json b/basics/pda-rent-payer/anchor/package.json index 0696e9344..878e62db1 100644 --- a/basics/pda-rent-payer/anchor/package.json +++ b/basics/pda-rent-payer/anchor/package.json @@ -1,17 +1,17 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4", + "litesvm": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/basics/pda-rent-payer/anchor/pnpm-lock.yaml b/basics/pda-rent-payer/anchor/pnpm-lock.yaml index 37a30dda9..271bd4550 100644 --- a/basics/pda-rent-payer/anchor/pnpm-lock.yaml +++ b/basics/pda-rent-payer/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -746,16 +746,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -773,7 +773,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/basics/pda-rent-payer/anchor/programs/anchor-program-example/Cargo.toml b/basics/pda-rent-payer/anchor/programs/anchor-program-example/Cargo.toml index 3a5db53ef..9cf22c479 100644 --- a/basics/pda-rent-payer/anchor/programs/anchor-program-example/Cargo.toml +++ b/basics/pda-rent-payer/anchor/programs/anchor-program-example/Cargo.toml @@ -20,8 +20,13 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs index b5b31ead7..28ecc3c41 100644 --- a/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs +++ b/basics/pda-rent-payer/anchor/programs/anchor-program-example/src/lib.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use instructions::*; pub mod instructions; -declare_id!("7Hm9nsYVuBZ9rf8z9AMUHreZRv8Q4vLhqwdVTCawRZtA"); +declare_id!("EC9R1o4AsK3hoeh61yNyr2xiDoorgyS4ZBmhYujNUsyN"); #[program] pub mod pda_rent_payer { diff --git a/basics/pda-rent-payer/anchor/programs/anchor-program-example/tests/test_pda_rent_payer.rs b/basics/pda-rent-payer/anchor/programs/anchor-program-example/tests/test_pda_rent_payer.rs new file mode 100644 index 000000000..3bc8c1f57 --- /dev/null +++ b/basics/pda-rent-payer/anchor/programs/anchor-program-example/tests/test_pda_rent_payer.rs @@ -0,0 +1,112 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Keypair) { + let program_id = pda_rent_payer::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/pda_rent_payer.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, payer) +} + +#[test] +fn test_init_rent_vault() { + let (mut svm, payer) = setup(); + let program_id = pda_rent_payer::id(); + + let (rent_vault_pda, _bump) = Pubkey::find_program_address(&[b"rent_vault"], &program_id); + + // Fund the rent vault with 1 SOL + let fund_amount: u64 = 1_000_000_000; + let init_ix = Instruction::new_with_bytes( + program_id, + &pda_rent_payer::instruction::InitRentVault { + fund_lamports: fund_amount, + } + .data(), + pda_rent_payer::accounts::InitRentVault { + payer: payer.pubkey(), + rent_vault: rent_vault_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify the rent vault has the correct balance + let account = svm + .get_account(&rent_vault_pda) + .expect("Rent vault should exist"); + assert_eq!( + account.lamports, fund_amount, + "Rent vault should have 1 SOL" + ); +} + +#[test] +fn test_create_new_account_from_rent_vault() { + let (mut svm, payer) = setup(); + let program_id = pda_rent_payer::id(); + + let (rent_vault_pda, _bump) = Pubkey::find_program_address(&[b"rent_vault"], &program_id); + + // Fund the rent vault with 1 SOL + let fund_amount: u64 = 1_000_000_000; + let init_ix = Instruction::new_with_bytes( + program_id, + &pda_rent_payer::instruction::InitRentVault { + fund_lamports: fund_amount, + } + .data(), + pda_rent_payer::accounts::InitRentVault { + payer: payer.pubkey(), + rent_vault: rent_vault_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + svm.expire_blockhash(); + + // Create a new account using the rent vault + let new_account = Keypair::new(); + let create_ix = Instruction::new_with_bytes( + program_id, + &pda_rent_payer::instruction::CreateNewAccount {}.data(), + pda_rent_payer::accounts::CreateNewAccount { + new_account: new_account.pubkey(), + rent_vault: rent_vault_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_ix], + &[&payer, &new_account], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the new account was created with minimum rent-exempt balance + let rent_exempt_balance = svm.minimum_balance_for_rent_exemption(0); + let account = svm + .get_account(&new_account.pubkey()) + .expect("New account should exist"); + assert_eq!( + account.lamports, rent_exempt_balance, + "New account should have rent-exempt balance" + ); +} diff --git a/basics/pda-rent-payer/anchor/tests/litesvm.test.ts b/basics/pda-rent-payer/anchor/tests/litesvm.test.ts index 35c9a3108..a1c0c2174 100644 --- a/basics/pda-rent-payer/anchor/tests/litesvm.test.ts +++ b/basics/pda-rent-payer/anchor/tests/litesvm.test.ts @@ -1,93 +1,87 @@ import anchor from "@anchor-lang/core"; import { - Keypair, - LAMPORTS_PER_SOL, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, + Transaction, + TransactionInstruction, } from "@solana/web3.js"; import { assert } from "chai"; import { LiteSVM } from "litesvm"; import IDL from "../target/idl/pda_rent_payer.json" with { type: "json" }; describe("LiteSVM: PDA Rent-Payer", () => { - const svm = new LiteSVM(); - const programId = new PublicKey(IDL.address); - const coder = new anchor.BorshCoder(IDL as anchor.Idl); - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(10000000000)); + const svm = new LiteSVM(); + const programId = new PublicKey(IDL.address); + const coder = new anchor.BorshCoder(IDL as anchor.Idl); + const payer = Keypair.generate(); + svm.airdrop(payer.publicKey, BigInt(10000000000)); - const programPath = new URL( - "../target/deploy/pda_rent_payer.so", - import.meta.url, - ).pathname; - svm.addProgramFromFile(programId, programPath); + const programPath = new URL("../target/deploy/pda_rent_payer.so", import.meta.url).pathname; + svm.addProgramFromFile(programId, programPath); - /** - * generate PDA for the Rent Vault - */ - const [rentVaultPDA] = PublicKey.findProgramAddressSync( - [Buffer.from("rent_vault")], - programId, - ); + /** + * generate PDA for the Rent Vault + */ + const [rentVaultPDA] = PublicKey.findProgramAddressSync([Buffer.from("rent_vault")], programId); - it("Initialize the Rent Vault", () => { - const ixArgs = { - fund_lamports: new anchor.BN(LAMPORTS_PER_SOL), - }; + it("Initialize the Rent Vault", () => { + const ixArgs = { + fund_lamports: new anchor.BN(LAMPORTS_PER_SOL), + }; - const data = coder.instruction.encode("init_rent_vault", ixArgs); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: rentVaultPDA, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); + const data = coder.instruction.encode("init_rent_vault", ixArgs); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: rentVaultPDA, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); - /** - * Fetch the account and check its rent vault account info - */ - const rentVaultAccountInfo = svm.getAccount(rentVaultPDA); + /** + * Fetch the account and check its rent vault account info + */ + const rentVaultAccountInfo = svm.getAccount(rentVaultPDA); - assert.equal(rentVaultAccountInfo.lamports, LAMPORTS_PER_SOL); - }); + assert.equal(rentVaultAccountInfo.lamports, LAMPORTS_PER_SOL); + }); - it("Create a new account using the Rent Vault", () => { - const newAccount = new Keypair(); + it("Create a new account using the Rent Vault", () => { + const newAccount = new Keypair(); - const data = coder.instruction.encode("create_new_account", {}); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: newAccount.publicKey, isSigner: true, isWritable: true }, - { pubkey: rentVaultPDA, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); + const data = coder.instruction.encode("create_new_account", {}); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: newAccount.publicKey, isSigner: true, isWritable: true }, + { pubkey: rentVaultPDA, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer, newAccount); - svm.sendTransaction(tx); + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer, newAccount); + svm.sendTransaction(tx); - /** - * Fetch the newAccount and check its rent - */ - const minLamports = svm.minimumBalanceForRentExemption(BigInt(0)); - const newAccountInfo = svm.getAccount(newAccount.publicKey); + /** + * Fetch the newAccount and check its rent + */ + const minLamports = svm.minimumBalanceForRentExemption(BigInt(0)); + const newAccountInfo = svm.getAccount(newAccount.publicKey); - assert.equal(newAccountInfo.lamports, Number(minLamports)); - }); + assert.equal(newAccountInfo.lamports, Number(minLamports)); + }); }); diff --git a/basics/pda-rent-payer/anchor/tests/test.ts b/basics/pda-rent-payer/anchor/tests/test.ts index 153d95d3f..1e8dc3a92 100644 --- a/basics/pda-rent-payer/anchor/tests/test.ts +++ b/basics/pda-rent-payer/anchor/tests/test.ts @@ -5,52 +5,48 @@ import { assert } from "chai"; import type { PdaRentPayer } from "../target/types/pda_rent_payer.ts"; describe("PDA Rent-Payer", () => { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const wallet = provider.wallet as anchor.Wallet; - const connection = provider.connection; - const program = anchor.workspace.PdaRentPayer as anchor.Program; - - // PDA for the Rent Vault - const [rentVaultPDA] = PublicKey.findProgramAddressSync( - [Buffer.from("rent_vault")], - program.programId, - ); - - it("Initialize the Rent Vault", async () => { - // 1 SOL - const fundAmount = new BN(LAMPORTS_PER_SOL); - - await program.methods - .initRentVault(fundAmount) - .accounts({ - payer: wallet.publicKey, - }) - .rpc(); - - // Check rent vault balance - const accountInfo = - await program.provider.connection.getAccountInfo(rentVaultPDA); - assert(accountInfo.lamports === fundAmount.toNumber()); - }); - - it("Create a new account using the Rent Vault", async () => { - // Generate a new keypair for the new account - const newAccount = new Keypair(); - - await program.methods - .createNewAccount() - .accounts({ - newAccount: newAccount.publicKey, - }) - .signers([newAccount]) - .rpc(); - - // Minimum balance for rent exemption for new account - const lamports = await connection.getMinimumBalanceForRentExemption(0); - - // Check that the account was created - const accountInfo = await connection.getAccountInfo(newAccount.publicKey); - assert(accountInfo.lamports === lamports); - }); + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + const wallet = provider.wallet as anchor.Wallet; + const connection = provider.connection; + const program = anchor.workspace.PdaRentPayer as anchor.Program; + + // PDA for the Rent Vault + const [rentVaultPDA] = PublicKey.findProgramAddressSync([Buffer.from("rent_vault")], program.programId); + + it("Initialize the Rent Vault", async () => { + // 1 SOL + const fundAmount = new BN(LAMPORTS_PER_SOL); + + await program.methods + .initRentVault(fundAmount) + .accounts({ + payer: wallet.publicKey, + }) + .rpc(); + + // Check rent vault balance + const accountInfo = await program.provider.connection.getAccountInfo(rentVaultPDA); + assert(accountInfo.lamports === fundAmount.toNumber()); + }); + + it("Create a new account using the Rent Vault", async () => { + // Generate a new keypair for the new account + const newAccount = new Keypair(); + + await program.methods + .createNewAccount() + .accounts({ + newAccount: newAccount.publicKey, + }) + .signers([newAccount]) + .rpc(); + + // Minimum balance for rent exemption for new account + const lamports = await connection.getMinimumBalanceForRentExemption(0); + + // Check that the account was created + const accountInfo = await connection.getAccountInfo(newAccount.publicKey); + assert(accountInfo.lamports === lamports); + }); }); diff --git a/basics/pda-rent-payer/anchor/tsconfig.json b/basics/pda-rent-payer/anchor/tsconfig.json index 59fe75cf0..beb254c00 100644 --- a/basics/pda-rent-payer/anchor/tsconfig.json +++ b/basics/pda-rent-payer/anchor/tsconfig.json @@ -1,10 +1,10 @@ { - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "nodenext", - "target": "es6", - "esModuleInterop": true - } + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "nodenext", + "target": "es6", + "esModuleInterop": true + } } diff --git a/basics/pda-rent-payer/native/tests/test.ts b/basics/pda-rent-payer/native/tests/test.ts index 03f17ca03..6c3a9c414 100644 --- a/basics/pda-rent-payer/native/tests/test.ts +++ b/basics/pda-rent-payer/native/tests/test.ts @@ -1,21 +1,12 @@ import { Buffer } from "node:buffer"; import { describe, test } from "node:test"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; import * as borsh from "borsh"; import { start } from "solana-bankrun"; describe("PDA Rent-Payer", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start( - [{ name: "pda_rent_payer_program", programId: PROGRAM_ID }], - [], - ); + const context = await start([{ name: "pda_rent_payer_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; @@ -42,10 +33,7 @@ describe("PDA Rent-Payer", async () => { } function deriveRentVaultPda() { - const pda = PublicKey.findProgramAddressSync( - [Buffer.from("rent_vault")], - PROGRAM_ID, - ); + const pda = PublicKey.findProgramAddressSync([Buffer.from("rent_vault")], PROGRAM_ID); console.log(`PDA: ${pda[0].toBase58()}`); return pda; } diff --git a/basics/pda-rent-payer/pinocchio/tests/test.ts b/basics/pda-rent-payer/pinocchio/tests/test.ts index b1af8db34..836c6aba3 100644 --- a/basics/pda-rent-payer/pinocchio/tests/test.ts +++ b/basics/pda-rent-payer/pinocchio/tests/test.ts @@ -1,14 +1,4 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import * as borsh from "borsh"; -import { start } from "solana-bankrun"; +import { describe } from "node:test"; describe("PDA Rent-Payer", async () => { console.log("PDA Rent-Payer"); diff --git a/basics/processing-instructions/anchor/Anchor.toml b/basics/processing-instructions/anchor/Anchor.toml index f08cbe3f0..0ddc6ba34 100644 --- a/basics/processing-instructions/anchor/Anchor.toml +++ b/basics/processing-instructions/anchor/Anchor.toml @@ -2,15 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false -[programs.localnet] -processing_instructions = "DgoL5J44aspizyUs9fcnpGEUJjWTLJRCfx8eYtUMYczf" +resolution = true +skip-lint = false -# [registry] section removed — no longer used in Anchor 1.0 +[programs.localnet] +processing_instructions = "ErP5EBTkp343iNqC9HP5u7Eh8dyTn5tvKzSiaUpiKgHK" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/processing-instructions/anchor/package.json b/basics/processing-instructions/anchor/package.json index 0696e9344..878e62db1 100644 --- a/basics/processing-instructions/anchor/package.json +++ b/basics/processing-instructions/anchor/package.json @@ -1,17 +1,17 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4", + "litesvm": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/basics/processing-instructions/anchor/pnpm-lock.yaml b/basics/processing-instructions/anchor/pnpm-lock.yaml index a439ab7e5..5a193f700 100644 --- a/basics/processing-instructions/anchor/pnpm-lock.yaml +++ b/basics/processing-instructions/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.25.0': @@ -755,16 +755,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -782,7 +782,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.25.0': dependencies: diff --git a/basics/processing-instructions/anchor/programs/processing-instructions/Cargo.toml b/basics/processing-instructions/anchor/programs/processing-instructions/Cargo.toml index 8731d6e16..331c63a3d 100644 --- a/basics/processing-instructions/anchor/programs/processing-instructions/Cargo.toml +++ b/basics/processing-instructions/anchor/programs/processing-instructions/Cargo.toml @@ -20,8 +20,13 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs b/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs index 48049f4e4..b52a76017 100644 --- a/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs +++ b/basics/processing-instructions/anchor/programs/processing-instructions/src/lib.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; -declare_id!("DgoL5J44aspizyUs9fcnpGEUJjWTLJRCfx8eYtUMYczf"); +declare_id!("ErP5EBTkp343iNqC9HP5u7Eh8dyTn5tvKzSiaUpiKgHK"); #[program] pub mod processing_instructions { diff --git a/basics/processing-instructions/anchor/programs/processing-instructions/tests/test_processing_instructions.rs b/basics/processing-instructions/anchor/programs/processing-instructions/tests/test_processing_instructions.rs new file mode 100644 index 000000000..5e5d26b1b --- /dev/null +++ b/basics/processing-instructions/anchor/programs/processing-instructions/tests/test_processing_instructions.rs @@ -0,0 +1,49 @@ +use { + anchor_lang::{solana_program::instruction::Instruction, InstructionData, ToAccountMetas}, + litesvm::LiteSVM, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, solana_keypair::Keypair) { + let program_id = processing_instructions::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/processing_instructions.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, payer) +} + +#[test] +fn test_go_to_park() { + let (mut svm, payer) = setup(); + let program_id = processing_instructions::id(); + + // Test with short person (height 3) + let ix_short = Instruction::new_with_bytes( + program_id, + &processing_instructions::instruction::GoToPark { + name: "Jimmy".to_string(), + height: 3, + } + .data(), + processing_instructions::accounts::Park {}.to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![ix_short], &[&payer], &payer.pubkey()) + .unwrap(); + + svm.expire_blockhash(); + + // Test with tall person (height 10) + let ix_tall = Instruction::new_with_bytes( + program_id, + &processing_instructions::instruction::GoToPark { + name: "Mary".to_string(), + height: 10, + } + .data(), + processing_instructions::accounts::Park {}.to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![ix_tall], &[&payer], &payer.pubkey()) + .unwrap(); +} diff --git a/basics/processing-instructions/anchor/tests/litesvm.test.ts b/basics/processing-instructions/anchor/tests/litesvm.test.ts index 096d394ee..b943c6780 100644 --- a/basics/processing-instructions/anchor/tests/litesvm.test.ts +++ b/basics/processing-instructions/anchor/tests/litesvm.test.ts @@ -1,83 +1,73 @@ import anchor from "@anchor-lang/core"; -import { - Keypair, - PublicKey, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; +import { Keypair, PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; import { LiteSVM } from "litesvm"; -import IDL from "../target/idl/processing_instructions.json" with { - type: "json", -}; +import IDL from "../target/idl/processing_instructions.json" with { type: "json" }; describe("LiteSVM: custom-instruction-data", () => { - const svm = new LiteSVM(); - const programId = new PublicKey(IDL.address); - /** - * Creates a coder to easily build and encode program instructions based on the IDL. - */ - const coder = new anchor.BorshCoder(IDL as anchor.Idl); + const svm = new LiteSVM(); + const programId = new PublicKey(IDL.address); + /** + * Creates a coder to easily build and encode program instructions based on the IDL. + */ + const coder = new anchor.BorshCoder(IDL as anchor.Idl); - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(1000000000)); + const payer = Keypair.generate(); + svm.airdrop(payer.publicKey, BigInt(1000000000)); - /** - * Load the processing_instructions program binary into the LiteSVM instance - * for local testing and simulation. - */ - const programPath = new URL( - "../target/deploy/processing_instructions.so", - import.meta.url, - ).pathname; - svm.addProgramFromFile(programId, programPath); + /** + * Load the processing_instructions program binary into the LiteSVM instance + * for local testing and simulation. + */ + const programPath = new URL("../target/deploy/processing_instructions.so", import.meta.url).pathname; + svm.addProgramFromFile(programId, programPath); - it("Go to the park!", () => { - /** - * Create an instruction for the 'go_to_park' method using the Anchor coder. - * Arguments are needed for this instruction so we give inside `{}`. - */ - const ixArgs = { - name: "Jimmy", - height: 5, - }; - const data = coder.instruction.encode("go_to_park", ixArgs); + it("Go to the park!", () => { + /** + * Create an instruction for the 'go_to_park' method using the Anchor coder. + * Arguments are needed for this instruction so we give inside `{}`. + */ + const ixArgs = { + name: "Jimmy", + height: 5, + }; + const data = coder.instruction.encode("go_to_park", ixArgs); - /** - * Build and sign a transaction to call the 'go_to_park' instruction - * on the processing_instructions program with LiteSVM. - */ - const ix = new TransactionInstruction({ - keys: [], - programId, - data, - }); + /** + * Build and sign a transaction to call the 'go_to_park' instruction + * on the processing_instructions program with LiteSVM. + */ + const ix = new TransactionInstruction({ + keys: [], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - svm.expireBlockhash(); + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); + svm.expireBlockhash(); - /** - * For Mary , height: 10 - */ - const ixArgs2 = { - name: "Mary", - height: 10, - }; - const data2 = coder.instruction.encode("go_to_park", ixArgs2); + /** + * For Mary , height: 10 + */ + const ixArgs2 = { + name: "Mary", + height: 10, + }; + const data2 = coder.instruction.encode("go_to_park", ixArgs2); - const ix2 = new TransactionInstruction({ - keys: [], - programId, - data: data2, - }); + const ix2 = new TransactionInstruction({ + keys: [], + programId, + data: data2, + }); - const tx2 = new Transaction().add(ix2); - tx2.feePayer = payer.publicKey; - tx2.recentBlockhash = svm.latestBlockhash(); - tx2.sign(payer); - svm.sendTransaction(tx2); - }); + const tx2 = new Transaction().add(ix2); + tx2.feePayer = payer.publicKey; + tx2.recentBlockhash = svm.latestBlockhash(); + tx2.sign(payer); + svm.sendTransaction(tx2); + }); }); diff --git a/basics/processing-instructions/anchor/tests/test.ts b/basics/processing-instructions/anchor/tests/test.ts index debaf2f63..5e26f7296 100644 --- a/basics/processing-instructions/anchor/tests/test.ts +++ b/basics/processing-instructions/anchor/tests/test.ts @@ -1,15 +1,15 @@ -import * as anchor from '@anchor-lang/core'; -import type { ProcessingInstructions } from '../target/types/processing_instructions'; +import * as anchor from "@anchor-lang/core"; +import type { ProcessingInstructions } from "../target/types/processing_instructions"; -describe('custom-instruction-data', () => { +describe("custom-instruction-data", () => { const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); const program = anchor.workspace.ProcessingInstructions as anchor.Program; - it('Go to the park!', async () => { + it("Go to the park!", async () => { // Again, Anchor makes it super simple. // - await program.methods.goToPark('Jimmy', 3).accounts({}).rpc(); - await program.methods.goToPark('Mary', 10).accounts({}).rpc(); + await program.methods.goToPark("Jimmy", 3).accounts({}).rpc(); + await program.methods.goToPark("Mary", 10).accounts({}).rpc(); }); }); diff --git a/basics/processing-instructions/anchor/tsconfig.json b/basics/processing-instructions/anchor/tsconfig.json index 59fe75cf0..beb254c00 100644 --- a/basics/processing-instructions/anchor/tsconfig.json +++ b/basics/processing-instructions/anchor/tsconfig.json @@ -1,10 +1,10 @@ { - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "nodenext", - "target": "es6", - "esModuleInterop": true - } + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "nodenext", + "target": "es6", + "esModuleInterop": true + } } diff --git a/basics/processing-instructions/native/program/Cargo.toml b/basics/processing-instructions/native/program/Cargo.toml index 2855d519d..d3af395c4 100644 --- a/basics/processing-instructions/native/program/Cargo.toml +++ b/basics/processing-instructions/native/program/Cargo.toml @@ -19,7 +19,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-pubkey = "3.0.0" diff --git a/basics/processing-instructions/native/tests/test.ts b/basics/processing-instructions/native/tests/test.ts index 3964cc912..e77b04772 100644 --- a/basics/processing-instructions/native/tests/test.ts +++ b/basics/processing-instructions/native/tests/test.ts @@ -1,19 +1,19 @@ -import { Buffer } from 'node:buffer'; -import { describe, test } from 'node:test'; -import { PublicKey, Transaction, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { start } from 'solana-bankrun'; +import { Buffer } from "node:buffer"; +import { describe, test } from "node:test"; +import { PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; +import * as borsh from "borsh"; +import { start } from "solana-bankrun"; -describe('custom-instruction-data', async () => { +describe("custom-instruction-data", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'processing_instructions_program', programId: PROGRAM_ID }], []); + const context = await start([{ name: "processing_instructions_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; const InstructionDataSchema = { struct: { - name: 'string', - height: 'u32', + name: "string", + height: "u32", }, }; @@ -21,11 +21,17 @@ describe('custom-instruction-data', async () => { return Buffer.from(borsh.serialize(schema, data)); } - test('Go to the park!', async () => { + test("Go to the park!", async () => { const blockhash = context.lastBlockhash; - const jimmy = borshSerialize(InstructionDataSchema, { name: 'Jimmy', height: 3 }); - const mary = borshSerialize(InstructionDataSchema, { name: 'Mary', height: 10 }); + const jimmy = borshSerialize(InstructionDataSchema, { + name: "Jimmy", + height: 3, + }); + const mary = borshSerialize(InstructionDataSchema, { + name: "Mary", + height: 10, + }); const ix1 = new TransactionInstruction({ keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }], diff --git a/basics/processing-instructions/pinocchio/program/Cargo.toml b/basics/processing-instructions/pinocchio/program/Cargo.toml index 96beaced7..5e202b590 100644 --- a/basics/processing-instructions/pinocchio/program/Cargo.toml +++ b/basics/processing-instructions/pinocchio/program/Cargo.toml @@ -18,7 +18,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-pubkey = "3.0.0" diff --git a/basics/processing-instructions/pinocchio/tests/test.ts b/basics/processing-instructions/pinocchio/tests/test.ts index b5be3aecb..a4fe7c67d 100644 --- a/basics/processing-instructions/pinocchio/tests/test.ts +++ b/basics/processing-instructions/pinocchio/tests/test.ts @@ -1,12 +1,4 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { - PublicKey, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import * as borsh from "borsh"; -import { start } from "solana-bankrun"; +import { describe } from "node:test"; describe("custom-instruction-data", async () => { console.log("custom-instruction-data"); diff --git a/basics/program-derived-addresses/anchor/Anchor.toml b/basics/program-derived-addresses/anchor/Anchor.toml index 846ff33de..4ec3dd439 100644 --- a/basics/program-derived-addresses/anchor/Anchor.toml +++ b/basics/program-derived-addresses/anchor/Anchor.toml @@ -2,15 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false -[programs.localnet] -program_derived_addresses_program = "oCCQRZyAbVxujyd8m57MPmDzZDmy2FoKW4ULS7KofCE" +resolution = true +skip-lint = false -# [registry] section removed — no longer used in Anchor 1.0 +[programs.localnet] +program_derived_addresses_program = "GHC7zYxZ3mDfb9EunrPwbVd2FG8QpYbnVH3TEp9wBCCU" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/program-derived-addresses/anchor/package.json b/basics/program-derived-addresses/anchor/package.json index 0696e9344..878e62db1 100644 --- a/basics/program-derived-addresses/anchor/package.json +++ b/basics/program-derived-addresses/anchor/package.json @@ -1,17 +1,17 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4", + "litesvm": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/basics/program-derived-addresses/anchor/pnpm-lock.yaml b/basics/program-derived-addresses/anchor/pnpm-lock.yaml index 685c53440..23aac405f 100644 --- a/basics/program-derived-addresses/anchor/pnpm-lock.yaml +++ b/basics/program-derived-addresses/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.25.0': @@ -758,16 +758,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -785,7 +785,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.25.0': dependencies: diff --git a/basics/program-derived-addresses/anchor/programs/anchor-program-example/Cargo.toml b/basics/program-derived-addresses/anchor/programs/anchor-program-example/Cargo.toml index 05229b066..fe8f082a5 100644 --- a/basics/program-derived-addresses/anchor/programs/anchor-program-example/Cargo.toml +++ b/basics/program-derived-addresses/anchor/programs/anchor-program-example/Cargo.toml @@ -20,8 +20,14 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs index 630b20c29..77b1501e1 100644 --- a/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs +++ b/basics/program-derived-addresses/anchor/programs/anchor-program-example/src/lib.rs @@ -5,7 +5,7 @@ use instructions::*; pub mod instructions; pub mod state; -declare_id!("oCCQRZyAbVxujyd8m57MPmDzZDmy2FoKW4ULS7KofCE"); +declare_id!("GHC7zYxZ3mDfb9EunrPwbVd2FG8QpYbnVH3TEp9wBCCU"); #[program] pub mod program_derived_addresses_program { diff --git a/basics/program-derived-addresses/anchor/programs/anchor-program-example/tests/test_program_derived_addresses.rs b/basics/program-derived-addresses/anchor/programs/anchor-program-example/tests/test_program_derived_addresses.rs new file mode 100644 index 000000000..173a42960 --- /dev/null +++ b/basics/program-derived-addresses/anchor/programs/anchor-program-example/tests/test_program_derived_addresses.rs @@ -0,0 +1,100 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + litesvm::LiteSVM, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, solana_keypair::Keypair) { + let program_id = program_derived_addresses_program::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/program_derived_addresses_program.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, payer) +} + +#[derive(BorshDeserialize)] +struct PageVisits { + page_visits: u32, + bump: u8, +} + +#[test] +fn test_create_and_increment_page_visits() { + let (mut svm, payer) = setup(); + let program_id = program_derived_addresses_program::id(); + + // Derive PDA + let (page_visits_pda, _bump) = + Pubkey::find_program_address(&[b"page_visits", payer.pubkey().as_ref()], &program_id); + + // Create page visits account + let create_ix = Instruction::new_with_bytes( + program_id, + &program_derived_addresses_program::instruction::CreatePageVisits {}.data(), + program_derived_addresses_program::accounts::CreatePageVisits { + payer: payer.pubkey(), + page_visits: page_visits_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![create_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify initial state (page_visits = 0) + let account = svm.get_account(&page_visits_pda).expect("PDA should exist"); + let data = PageVisits::try_from_slice(&account.data[8..]).unwrap(); + assert_eq!(data.page_visits, 0, "Initial page visits should be 0"); + + svm.expire_blockhash(); + + // Increment page visits + let increment_ix = Instruction::new_with_bytes( + program_id, + &program_derived_addresses_program::instruction::IncrementPageVisits {}.data(), + program_derived_addresses_program::accounts::IncrementPageVisits { + user: payer.pubkey(), + page_visits: page_visits_pda, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![increment_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify page_visits = 1 + let account = svm.get_account(&page_visits_pda).expect("PDA should exist"); + let data = PageVisits::try_from_slice(&account.data[8..]).unwrap(); + assert_eq!( + data.page_visits, 1, + "Page visits should be 1 after increment" + ); + + svm.expire_blockhash(); + + // Increment again + let increment_ix2 = Instruction::new_with_bytes( + program_id, + &program_derived_addresses_program::instruction::IncrementPageVisits {}.data(), + program_derived_addresses_program::accounts::IncrementPageVisits { + user: payer.pubkey(), + page_visits: page_visits_pda, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![increment_ix2], &[&payer], &payer.pubkey()) + .unwrap(); + + // Verify page_visits = 2 + let account = svm.get_account(&page_visits_pda).expect("PDA should exist"); + let data = PageVisits::try_from_slice(&account.data[8..]).unwrap(); + assert_eq!( + data.page_visits, 2, + "Page visits should be 2 after second increment" + ); +} diff --git a/basics/program-derived-addresses/anchor/tests/litesvm.test.ts b/basics/program-derived-addresses/anchor/tests/litesvm.test.ts index 84c78cb7c..cf597e954 100644 --- a/basics/program-derived-addresses/anchor/tests/litesvm.test.ts +++ b/basics/program-derived-addresses/anchor/tests/litesvm.test.ts @@ -1,119 +1,99 @@ import anchor from "@anchor-lang/core"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; import { assert } from "chai"; import { LiteSVM } from "litesvm"; -import IDL from "../target/idl/program_derived_addresses_program.json" with { - type: "json", -}; +import IDL from "../target/idl/program_derived_addresses_program.json" with { type: "json" }; describe("LiteSVM: PDA", () => { - const svm = new LiteSVM(); - const programId = new PublicKey(IDL.address); - const coder = new anchor.BorshCoder(IDL as anchor.Idl); - - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(1000000000)); - - const programPath = new URL( - "../target/deploy/program_derived_addresses_program.so", - import.meta.url, - ).pathname; - svm.addProgramFromFile(programId, programPath); - - // PDA for the page visits account - const [pageVisitPDA] = PublicKey.findProgramAddressSync( - [Buffer.from("page_visits"), payer.publicKey.toBuffer()], - programId, - ); - - it("Create the page visits tracking PDA", () => { - const data = coder.instruction.encode("create_page_visits", {}); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: pageVisitPDA, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - - //Fetch the pageVisitPDA account and check it page visit count - const pageVisitPDAAccInfo = svm.getAccount(pageVisitPDA); - const pageVisitAccount = coder.accounts.decode( - "PageVisits", - Buffer.from(pageVisitPDAAccInfo.data), - ); - - assert.equal(pageVisitAccount.page_visits, 0); - }); - - it("Visit the page!", () => { - const data = coder.instruction.encode("increment_page_visits", {}); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: pageVisitPDA, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - svm.expireBlockhash(); - - //Fetch the pageVisitPDA account and check it page visit count - const pageVisitPDAAccInfo = svm.getAccount(pageVisitPDA); - const pageVisitAccount = coder.accounts.decode( - "PageVisits", - Buffer.from(pageVisitPDAAccInfo.data), - ); - - assert.equal(pageVisitAccount.page_visits, 1); - }); - - it("Again visit the page!", () => { - const data = coder.instruction.encode("increment_page_visits", {}); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: pageVisitPDA, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); - - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - - //Fetch the pageVisitPDA account and check it page visit count - const pageVisitPDAAccInfo = svm.getAccount(pageVisitPDA); - const pageVisitAccount = coder.accounts.decode( - "PageVisits", - Buffer.from(pageVisitPDAAccInfo.data), - ); - - assert.equal(pageVisitAccount.page_visits, 2); - }); + const svm = new LiteSVM(); + const programId = new PublicKey(IDL.address); + const coder = new anchor.BorshCoder(IDL as anchor.Idl); + + const payer = Keypair.generate(); + svm.airdrop(payer.publicKey, BigInt(1000000000)); + + const programPath = new URL("../target/deploy/program_derived_addresses_program.so", import.meta.url).pathname; + svm.addProgramFromFile(programId, programPath); + + // PDA for the page visits account + const [pageVisitPDA] = PublicKey.findProgramAddressSync( + [Buffer.from("page_visits"), payer.publicKey.toBuffer()], + programId, + ); + + it("Create the page visits tracking PDA", () => { + const data = coder.instruction.encode("create_page_visits", {}); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: pageVisitPDA, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); + + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); + + //Fetch the pageVisitPDA account and check it page visit count + const pageVisitPDAAccInfo = svm.getAccount(pageVisitPDA); + const pageVisitAccount = coder.accounts.decode("PageVisits", Buffer.from(pageVisitPDAAccInfo.data)); + + assert.equal(pageVisitAccount.page_visits, 0); + }); + + it("Visit the page!", () => { + const data = coder.instruction.encode("increment_page_visits", {}); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: pageVisitPDA, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); + + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); + svm.expireBlockhash(); + + //Fetch the pageVisitPDA account and check it page visit count + const pageVisitPDAAccInfo = svm.getAccount(pageVisitPDA); + const pageVisitAccount = coder.accounts.decode("PageVisits", Buffer.from(pageVisitPDAAccInfo.data)); + + assert.equal(pageVisitAccount.page_visits, 1); + }); + + it("Again visit the page!", () => { + const data = coder.instruction.encode("increment_page_visits", {}); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: pageVisitPDA, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); + + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); + + //Fetch the pageVisitPDA account and check it page visit count + const pageVisitPDAAccInfo = svm.getAccount(pageVisitPDA); + const pageVisitAccount = coder.accounts.decode("PageVisits", Buffer.from(pageVisitPDAAccInfo.data)); + + assert.equal(pageVisitAccount.page_visits, 2); + }); }); diff --git a/basics/program-derived-addresses/anchor/tests/test.ts b/basics/program-derived-addresses/anchor/tests/test.ts index da096db2a..9e6663f27 100644 --- a/basics/program-derived-addresses/anchor/tests/test.ts +++ b/basics/program-derived-addresses/anchor/tests/test.ts @@ -4,51 +4,50 @@ import { assert } from "chai"; import type { ProgramDerivedAddressesProgram } from "../target/types/program_derived_addresses_program.ts"; describe("Anchor: PDAs", () => { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const payer = provider.wallet as anchor.Wallet; - const program = anchor.workspace - .ProgramDerivedAddressesProgram as anchor.Program; - - // PDA for the page visits account - const [pageVisitPDA] = PublicKey.findProgramAddressSync( - [Buffer.from("page_visits"), payer.publicKey.toBuffer()], - program.programId, - ); - - it("Create the page visits tracking PDA", async () => { - await program.methods - .createPageVisits() - .accounts({ - payer: payer.publicKey, - }) - .rpc(); - - const pageVisits = await program.account.pageVisits.fetch(pageVisitPDA); - assert.equal(pageVisits.pageVisits, 0); - }); - - it("Visit the page!", async () => { - await program.methods - .incrementPageVisits() - .accounts({ - user: payer.publicKey, - }) - .rpc(); - - const pageVisits = await program.account.pageVisits.fetch(pageVisitPDA); - assert.equal(pageVisits.pageVisits, 1); - }); - - it("Again visit the page!", async () => { - await program.methods - .incrementPageVisits() - .accounts({ - user: payer.publicKey, - }) - .rpc(); - - const pageVisits = await program.account.pageVisits.fetch(pageVisitPDA); - assert.equal(pageVisits.pageVisits, 2); - }); + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + const payer = provider.wallet as anchor.Wallet; + const program = anchor.workspace.ProgramDerivedAddressesProgram as anchor.Program; + + // PDA for the page visits account + const [pageVisitPDA] = PublicKey.findProgramAddressSync( + [Buffer.from("page_visits"), payer.publicKey.toBuffer()], + program.programId, + ); + + it("Create the page visits tracking PDA", async () => { + await program.methods + .createPageVisits() + .accounts({ + payer: payer.publicKey, + }) + .rpc(); + + const pageVisits = await program.account.pageVisits.fetch(pageVisitPDA); + assert.equal(pageVisits.pageVisits, 0); + }); + + it("Visit the page!", async () => { + await program.methods + .incrementPageVisits() + .accounts({ + user: payer.publicKey, + }) + .rpc(); + + const pageVisits = await program.account.pageVisits.fetch(pageVisitPDA); + assert.equal(pageVisits.pageVisits, 1); + }); + + it("Again visit the page!", async () => { + await program.methods + .incrementPageVisits() + .accounts({ + user: payer.publicKey, + }) + .rpc(); + + const pageVisits = await program.account.pageVisits.fetch(pageVisitPDA); + assert.equal(pageVisits.pageVisits, 2); + }); }); diff --git a/basics/program-derived-addresses/anchor/tsconfig.json b/basics/program-derived-addresses/anchor/tsconfig.json index 59fe75cf0..beb254c00 100644 --- a/basics/program-derived-addresses/anchor/tsconfig.json +++ b/basics/program-derived-addresses/anchor/tsconfig.json @@ -1,10 +1,10 @@ { - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "nodenext", - "target": "es6", - "esModuleInterop": true - } + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "nodenext", + "target": "es6", + "esModuleInterop": true + } } diff --git a/basics/program-derived-addresses/native/program/Cargo.toml b/basics/program-derived-addresses/native/program/Cargo.toml index 097ef4d8a..1251e8d8a 100644 --- a/basics/program-derived-addresses/native/program/Cargo.toml +++ b/basics/program-derived-addresses/native/program/Cargo.toml @@ -20,7 +20,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-pubkey = "3.0.0" diff --git a/basics/program-derived-addresses/native/tests/test.ts b/basics/program-derived-addresses/native/tests/test.ts index 805bc7083..3065e8c5f 100644 --- a/basics/program-derived-addresses/native/tests/test.ts +++ b/basics/program-derived-addresses/native/tests/test.ts @@ -1,20 +1,28 @@ -import { Buffer } from 'node:buffer'; -import { describe, test } from 'node:test'; -import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { start } from 'solana-bankrun'; +import { Buffer } from "node:buffer"; +import { describe, test } from "node:test"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; +import * as borsh from "borsh"; +import { start } from "solana-bankrun"; -describe('PDAs', async () => { +describe("PDAs", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'program_derived_addresses_native_program', programId: PROGRAM_ID }], []); + const context = await start( + [ + { + name: "program_derived_addresses_native_program", + programId: PROGRAM_ID, + }, + ], + [], + ); const client = context.banksClient; const payer = context.payer; const rent = await client.getRent(); const PageVisitsSchema = { struct: { - page_visits: 'u32', - bump: 'u8', + page_visits: "u32", + bump: "u8", }, }; @@ -27,7 +35,7 @@ describe('PDAs', async () => { const testUser = Keypair.generate(); - test('Create a test user', async () => { + test("Create a test user", async () => { const ix = SystemProgram.createAccount({ fromPubkey: payer.publicKey, lamports: Number(rent.minimumBalance(BigInt(0))), @@ -47,10 +55,10 @@ describe('PDAs', async () => { }); function derivePageVisitsPda(userPubkey: PublicKey) { - return PublicKey.findProgramAddressSync([Buffer.from('page_visits'), userPubkey.toBuffer()], PROGRAM_ID); + return PublicKey.findProgramAddressSync([Buffer.from("page_visits"), userPubkey.toBuffer()], PROGRAM_ID); } - test('Create the page visits tracking PDA', async () => { + test("Create the page visits tracking PDA", async () => { const [pageVisitsPda, pageVisitsBump] = derivePageVisitsPda(testUser.publicKey); const ix = new TransactionInstruction({ keys: [ @@ -60,7 +68,10 @@ describe('PDAs', async () => { { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, ], programId: PROGRAM_ID, - data: borshSerialize(PageVisitsSchema, { page_visits: 0, bump: pageVisitsBump }), + data: borshSerialize(PageVisitsSchema, { + page_visits: 0, + bump: pageVisitsBump, + }), }); const tx = new Transaction(); const blockhash = context.lastBlockhash; @@ -70,7 +81,7 @@ describe('PDAs', async () => { await client.processTransaction(tx); }); - test('Visit the page!', async () => { + test("Visit the page!", async () => { const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey); const ix = new TransactionInstruction({ keys: [ @@ -88,7 +99,7 @@ describe('PDAs', async () => { await client.processTransaction(tx); }); - test('Visit the page!', async () => { + test("Visit the page!", async () => { const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey); const ix = new TransactionInstruction({ keys: [ @@ -106,10 +117,13 @@ describe('PDAs', async () => { await client.processTransaction(tx); }); - test('Read page visits', async () => { + test("Read page visits", async () => { const [pageVisitsPda, _] = derivePageVisitsPda(testUser.publicKey); const accountInfo = await client.getAccount(pageVisitsPda); - const readPageVisits = borsh.deserialize(PageVisitsSchema, Buffer.from(accountInfo.data)) as { page_visits: number; bump: number }; + const readPageVisits = borsh.deserialize(PageVisitsSchema, Buffer.from(accountInfo.data)) as { + page_visits: number; + bump: number; + }; console.log(`Number of page visits: ${readPageVisits.page_visits}`); }); }); diff --git a/basics/program-derived-addresses/pinocchio/program/Cargo.toml b/basics/program-derived-addresses/pinocchio/program/Cargo.toml index 4b255c5eb..e803884e6 100644 --- a/basics/program-derived-addresses/pinocchio/program/Cargo.toml +++ b/basics/program-derived-addresses/pinocchio/program/Cargo.toml @@ -19,7 +19,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-pubkey = "3.0.0" diff --git a/basics/program-derived-addresses/pinocchio/tests/test.ts b/basics/program-derived-addresses/pinocchio/tests/test.ts index b197963e8..892781bf9 100644 --- a/basics/program-derived-addresses/pinocchio/tests/test.ts +++ b/basics/program-derived-addresses/pinocchio/tests/test.ts @@ -1,14 +1,4 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; -import * as borsh from "borsh"; -import { start } from "solana-bankrun"; +import { describe } from "node:test"; describe("PDAs", async () => { console.log("PDAS"); diff --git a/basics/realloc/anchor/Anchor.toml b/basics/realloc/anchor/Anchor.toml index f6b6906d1..77466e746 100644 --- a/basics/realloc/anchor/Anchor.toml +++ b/basics/realloc/anchor/Anchor.toml @@ -2,17 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false +resolution = true skip-lint = false [programs.localnet] -anchor_realloc = "Fod47xKXjdHVQDzkFPBvfdWLm8gEAV4iMSXkfUzCHiSD" - -# [registry] section removed — no longer used in Anchor 1.0 +anchor_realloc = "4JzDy7ZPoTzSxWCFu8dmxFqEyJzLeXacYJ5xDxopt5vz" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/realloc/anchor/migrations/deploy.ts b/basics/realloc/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/basics/realloc/anchor/migrations/deploy.ts +++ b/basics/realloc/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/basics/realloc/anchor/package.json b/basics/realloc/anchor/package.json index 3335c7917..a5ef7c15b 100644 --- a/basics/realloc/anchor/package.json +++ b/basics/realloc/anchor/package.json @@ -1,22 +1,22 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.4.1", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4", + "litesvm": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.4.1", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/basics/realloc/anchor/pnpm-lock.yaml b/basics/realloc/anchor/pnpm-lock.yaml index f7baf21bd..28bd50a78 100644 --- a/basics/realloc/anchor/pnpm-lock.yaml +++ b/basics/realloc/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -45,18 +45,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.25.0': @@ -766,16 +766,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -793,7 +793,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.25.0': dependencies: diff --git a/basics/realloc/anchor/programs/anchor-realloc/Cargo.toml b/basics/realloc/anchor/programs/anchor-realloc/Cargo.toml index d7a7d349a..7ad0e5d94 100644 --- a/basics/realloc/anchor/programs/anchor-realloc/Cargo.toml +++ b/basics/realloc/anchor/programs/anchor-realloc/Cargo.toml @@ -20,8 +20,14 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/realloc/anchor/programs/anchor-realloc/src/lib.rs b/basics/realloc/anchor/programs/anchor-realloc/src/lib.rs index 7a0abc572..54ad70803 100644 --- a/basics/realloc/anchor/programs/anchor-realloc/src/lib.rs +++ b/basics/realloc/anchor/programs/anchor-realloc/src/lib.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; -declare_id!("Fod47xKXjdHVQDzkFPBvfdWLm8gEAV4iMSXkfUzCHiSD"); +declare_id!("4JzDy7ZPoTzSxWCFu8dmxFqEyJzLeXacYJ5xDxopt5vz"); #[program] pub mod anchor_realloc { diff --git a/basics/realloc/anchor/programs/anchor-realloc/tests/test_realloc.rs b/basics/realloc/anchor/programs/anchor-realloc/tests/test_realloc.rs new file mode 100644 index 000000000..ffc045d2a --- /dev/null +++ b/basics/realloc/anchor/programs/anchor-realloc/tests/test_realloc.rs @@ -0,0 +1,177 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +#[derive(BorshDeserialize)] +struct MessageAccount { + _discriminator: [u8; 8], + message: String, +} + +fn fetch_message(svm: &LiteSVM, pubkey: &anchor_lang::prelude::Pubkey) -> String { + let account = svm.get_account(pubkey).unwrap(); + let data = MessageAccount::try_from_slice(&account.data).unwrap(); + data.message +} + +#[test] +fn test_initialize() { + let program_id = anchor_realloc::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/anchor_realloc.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let message_keypair = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &anchor_realloc::instruction::Initialize { + input: "hello".to_string(), + } + .data(), + anchor_realloc::accounts::Initialize { + payer: payer.pubkey(), + message_account: message_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &message_keypair], + &payer.pubkey(), + ) + .unwrap(); + + let msg_text = fetch_message(&svm, &message_keypair.pubkey()); + assert_eq!(msg_text, "hello"); + + // Verify account size: 8 (discriminator) + 4 (string length) + 5 ("hello") + let account = svm.get_account(&message_keypair.pubkey()).unwrap(); + assert_eq!(account.data.len(), 8 + 4 + 5); +} + +#[test] +fn test_update_grows() { + let program_id = anchor_realloc::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/anchor_realloc.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let message_keypair = Keypair::new(); + + // Initialize with "hello" + let init_ix = Instruction::new_with_bytes( + program_id, + &anchor_realloc::instruction::Initialize { + input: "hello".to_string(), + } + .data(), + anchor_realloc::accounts::Initialize { + payer: payer.pubkey(), + message_account: message_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &message_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Update to "hello world" (grows the account) + svm.expire_blockhash(); + let update_ix = Instruction::new_with_bytes( + program_id, + &anchor_realloc::instruction::Update { + input: "hello world".to_string(), + } + .data(), + anchor_realloc::accounts::Update { + payer: payer.pubkey(), + message_account: message_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + let msg_text = fetch_message(&svm, &message_keypair.pubkey()); + assert_eq!(msg_text, "hello world"); + + let account = svm.get_account(&message_keypair.pubkey()).unwrap(); + assert_eq!(account.data.len(), 8 + 4 + 11); +} + +#[test] +fn test_update_shrinks() { + let program_id = anchor_realloc::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/anchor_realloc.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let message_keypair = Keypair::new(); + + // Initialize with "hello world" + let init_ix = Instruction::new_with_bytes( + program_id, + &anchor_realloc::instruction::Initialize { + input: "hello world".to_string(), + } + .data(), + anchor_realloc::accounts::Initialize { + payer: payer.pubkey(), + message_account: message_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&payer, &message_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Update to "hi" (shrinks the account) + svm.expire_blockhash(); + let update_ix = Instruction::new_with_bytes( + program_id, + &anchor_realloc::instruction::Update { + input: "hi".to_string(), + } + .data(), + anchor_realloc::accounts::Update { + payer: payer.pubkey(), + message_account: message_keypair.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_ix], &[&payer], &payer.pubkey()) + .unwrap(); + + let msg_text = fetch_message(&svm, &message_keypair.pubkey()); + assert_eq!(msg_text, "hi"); + + let account = svm.get_account(&message_keypair.pubkey()).unwrap(); + assert_eq!(account.data.len(), 8 + 4 + 2); +} diff --git a/basics/realloc/anchor/tests/litesvm.test.ts b/basics/realloc/anchor/tests/litesvm.test.ts index e45976d50..e83294416 100644 --- a/basics/realloc/anchor/tests/litesvm.test.ts +++ b/basics/realloc/anchor/tests/litesvm.test.ts @@ -1,125 +1,107 @@ import anchor from "@anchor-lang/core"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; import { assert } from "chai"; import { LiteSVM } from "litesvm"; import IDL from "../target/idl/anchor_realloc.json" with { type: "json" }; describe("LiteSVM: realloc", () => { - const svm = new LiteSVM(); - const programId = new PublicKey(IDL.address); - const coder = new anchor.BorshCoder(IDL as anchor.Idl); + const svm = new LiteSVM(); + const programId = new PublicKey(IDL.address); + const coder = new anchor.BorshCoder(IDL as anchor.Idl); - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(1000000000)); + const payer = Keypair.generate(); + svm.airdrop(payer.publicKey, BigInt(1000000000)); - const programPath = new URL( - "../target/deploy/anchor_realloc.so", - import.meta.url, - ).pathname; - svm.addProgramFromFile(programId, programPath); + const programPath = new URL("../target/deploy/anchor_realloc.so", import.meta.url).pathname; + svm.addProgramFromFile(programId, programPath); - // PDA for the message account - const messageAccount = new Keypair(); + // PDA for the message account + const messageAccount = new Keypair(); - it("Is initialized!", () => { - const message = "hello"; - const data = coder.instruction.encode("initialize", { - input: message, - }); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: messageAccount.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); + it("Is initialized!", () => { + const message = "hello"; + const data = coder.instruction.encode("initialize", { + input: message, + }); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: messageAccount.publicKey, isSigner: true, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer, messageAccount); - svm.sendTransaction(tx); + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer, messageAccount); + svm.sendTransaction(tx); - //Fetch the message account and check it message - const messageAccInfo = svm.getAccount(messageAccount.publicKey); - const messageAcc = coder.accounts.decode( - "Message", - Buffer.from(messageAccInfo.data), - ); - assert.equal(messageAccInfo.data.length, 8 + 4 + message.length); - assert.equal(messageAcc.message, message); - }); + //Fetch the message account and check it message + const messageAccInfo = svm.getAccount(messageAccount.publicKey); + const messageAcc = coder.accounts.decode("Message", Buffer.from(messageAccInfo.data)); + assert.equal(messageAccInfo.data.length, 8 + 4 + message.length); + assert.equal(messageAcc.message, message); + }); - it("Update", () => { - const message = "hello world"; - const data = coder.instruction.encode("update", { - input: message, - }); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: messageAccount.publicKey, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); + it("Update", () => { + const message = "hello world"; + const data = coder.instruction.encode("update", { + input: message, + }); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: messageAccount.publicKey, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - svm.expireBlockhash(); + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); + svm.expireBlockhash(); - //Fetch the message account and check it message - const messageAccInfo = svm.getAccount(messageAccount.publicKey); - const messageAcc = coder.accounts.decode( - "Message", - Buffer.from(messageAccInfo.data), - ); - assert.equal(messageAccInfo.data.length, 8 + 4 + message.length); - assert.equal(messageAcc.message, message); - }); + //Fetch the message account and check it message + const messageAccInfo = svm.getAccount(messageAccount.publicKey); + const messageAcc = coder.accounts.decode("Message", Buffer.from(messageAccInfo.data)); + assert.equal(messageAccInfo.data.length, 8 + 4 + message.length); + assert.equal(messageAcc.message, message); + }); - it("Again update", () => { - const message = "hi"; - const data = coder.instruction.encode("update", { - input: message, - }); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: messageAccount.publicKey, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); + it("Again update", () => { + const message = "hi"; + const data = coder.instruction.encode("update", { + input: message, + }); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: messageAccount.publicKey, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); - svm.expireBlockhash(); + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); + svm.expireBlockhash(); - //Fetch the message account and check it message - const messageAccInfo = svm.getAccount(messageAccount.publicKey); - const messageAcc = coder.accounts.decode( - "Message", - Buffer.from(messageAccInfo.data), - ); + //Fetch the message account and check it message + const messageAccInfo = svm.getAccount(messageAccount.publicKey); + const messageAcc = coder.accounts.decode("Message", Buffer.from(messageAccInfo.data)); - assert.equal(messageAccInfo.data.length, 8 + 4 + message.length); - assert.equal(messageAcc.message, message); - }); + assert.equal(messageAccInfo.data.length, 8 + 4 + message.length); + assert.equal(messageAcc.message, message); + }); }); diff --git a/basics/realloc/anchor/tests/test.ts b/basics/realloc/anchor/tests/test.ts index be04c637d..8ae3ab45d 100644 --- a/basics/realloc/anchor/tests/test.ts +++ b/basics/realloc/anchor/tests/test.ts @@ -5,68 +5,68 @@ import { assert } from "chai"; import type { AnchorRealloc } from "../target/types/anchor_realloc.ts"; describe("Anchor: realloc", () => { - // Configure the client to use the local cluster. - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const payer = provider.wallet as anchor.Wallet; - const connection = provider.connection; + // Configure the client to use the local cluster. + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + const payer = provider.wallet as anchor.Wallet; + const connection = provider.connection; - const program = anchor.workspace.AnchorRealloc as Program; + const program = anchor.workspace.AnchorRealloc as Program; - const messageAccount = new Keypair(); + const messageAccount = new Keypair(); - // helper function to check the account data and message - async function checkAccount(publicKey, expectedMessage) { - const accountInfo = await connection.getAccountInfo(publicKey); - const accountData = await program.account.message.fetch(publicKey); + // helper function to check the account data and message + async function checkAccount(publicKey, expectedMessage) { + const accountInfo = await connection.getAccountInfo(publicKey); + const accountData = await program.account.message.fetch(publicKey); - // 8 bytes for the discriminator, - // 4 bytes for the length of the message, - // and the length of the message - assert.equal(accountInfo.data.length, 8 + 4 + expectedMessage.length); - assert.equal(accountData.message, expectedMessage); - } + // 8 bytes for the discriminator, + // 4 bytes for the length of the message, + // and the length of the message + assert.equal(accountInfo.data.length, 8 + 4 + expectedMessage.length); + assert.equal(accountData.message, expectedMessage); + } - it("Is initialized!", async () => { - const input = "hello"; + it("Is initialized!", async () => { + const input = "hello"; - await program.methods - .initialize(input) - .accounts({ - payer: payer.publicKey, - messageAccount: messageAccount.publicKey, - }) - .signers([messageAccount]) - .rpc(); + await program.methods + .initialize(input) + .accounts({ + payer: payer.publicKey, + messageAccount: messageAccount.publicKey, + }) + .signers([messageAccount]) + .rpc(); - await checkAccount(messageAccount.publicKey, input); - }); + await checkAccount(messageAccount.publicKey, input); + }); - it("Update", async () => { - const input = "hello world"; + it("Update", async () => { + const input = "hello world"; - await program.methods - .update(input) - .accounts({ - payer: payer.publicKey, - messageAccount: messageAccount.publicKey, - }) - .rpc(); + await program.methods + .update(input) + .accounts({ + payer: payer.publicKey, + messageAccount: messageAccount.publicKey, + }) + .rpc(); - await checkAccount(messageAccount.publicKey, input); - }); + await checkAccount(messageAccount.publicKey, input); + }); - it("Again update", async () => { - const input = "hi"; + it("Again update", async () => { + const input = "hi"; - await program.methods - .update(input) - .accounts({ - payer: payer.publicKey, - messageAccount: messageAccount.publicKey, - }) - .rpc(); + await program.methods + .update(input) + .accounts({ + payer: payer.publicKey, + messageAccount: messageAccount.publicKey, + }) + .rpc(); - await checkAccount(messageAccount.publicKey, input); - }); + await checkAccount(messageAccount.publicKey, input); + }); }); diff --git a/basics/realloc/anchor/tsconfig.json b/basics/realloc/anchor/tsconfig.json index 59fe75cf0..beb254c00 100644 --- a/basics/realloc/anchor/tsconfig.json +++ b/basics/realloc/anchor/tsconfig.json @@ -1,10 +1,10 @@ { - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "nodenext", - "target": "es6", - "esModuleInterop": true - } + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "nodenext", + "target": "es6", + "esModuleInterop": true + } } diff --git a/basics/realloc/native/program/Cargo.toml b/basics/realloc/native/program/Cargo.toml index 3c8672f61..8a763a8e1 100644 --- a/basics/realloc/native/program/Cargo.toml +++ b/basics/realloc/native/program/Cargo.toml @@ -20,7 +20,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/realloc/native/tests/realloc.test.ts b/basics/realloc/native/tests/realloc.test.ts index 08c39058c..53ef0b78c 100644 --- a/basics/realloc/native/tests/realloc.test.ts +++ b/basics/realloc/native/tests/realloc.test.ts @@ -1,6 +1,6 @@ -import { describe, test } from 'node:test'; -import { Keypair, PublicKey, Transaction } from '@solana/web3.js'; -import { start } from 'solana-bankrun'; +import { describe, test } from "node:test"; +import { Keypair, PublicKey, Transaction } from "@solana/web3.js"; +import { start } from "solana-bankrun"; import { AddressInfo, createCreateInstruction, @@ -8,19 +8,27 @@ import { createReallocateZeroInitInstruction, EnhancedAddressInfo, WorkInfo, -} from '../ts'; +} from "../ts"; -describe('Realloc!', async () => { +describe("Realloc!", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'realloc_program', programId: PROGRAM_ID }], []); + const context = await start([{ name: "realloc_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; const testAccount = Keypair.generate(); - test('Create the account with data', async () => { + test("Create the account with data", async () => { console.log(`${testAccount.publicKey}`); - const ix = createCreateInstruction(testAccount.publicKey, payer.publicKey, PROGRAM_ID, 'Jacob', 123, 'Main St.', 'Chicago'); + const ix = createCreateInstruction( + testAccount.publicKey, + payer.publicKey, + PROGRAM_ID, + "Jacob", + 123, + "Main St.", + "Chicago", + ); const tx = new Transaction(); tx.recentBlockhash = context.lastBlockhash; @@ -30,8 +38,14 @@ describe('Realloc!', async () => { await printAddressInfo(testAccount.publicKey); }); - test('Reallocate WITHOUT zero init', async () => { - const ix = createReallocateWithoutZeroInitInstruction(testAccount.publicKey, payer.publicKey, PROGRAM_ID, 'Illinois', 12345); + test("Reallocate WITHOUT zero init", async () => { + const ix = createReallocateWithoutZeroInitInstruction( + testAccount.publicKey, + payer.publicKey, + PROGRAM_ID, + "Illinois", + 12345, + ); const tx = new Transaction(); const [blockHash, _blockHeight] = await client.getLatestBlockhash(); tx.recentBlockhash = blockHash; @@ -41,8 +55,16 @@ describe('Realloc!', async () => { await printEnhancedAddressInfo(testAccount.publicKey); }); - test('Reallocate WITH zero init', async () => { - const ix = createReallocateZeroInitInstruction(testAccount.publicKey, payer.publicKey, PROGRAM_ID, 'Pete', 'Engineer', 'Solana Labs', 2); + test("Reallocate WITH zero init", async () => { + const ix = createReallocateZeroInitInstruction( + testAccount.publicKey, + payer.publicKey, + PROGRAM_ID, + "Pete", + "Engineer", + "Solana Labs", + 2, + ); const tx = new Transaction(); const [blockHash, _blockHeight] = await client.getLatestBlockhash(); tx.recentBlockhash = blockHash; @@ -58,7 +80,7 @@ describe('Realloc!', async () => { const data = (await client.getAccount(pubkey))?.data; if (data) { const addressInfo = AddressInfo.fromBuffer(Buffer.from(data)); - console.log('Address info:'); + console.log("Address info:"); console.log(` Name: ${addressInfo.name}`); console.log(` House Num: ${addressInfo.house_number}`); console.log(` Street: ${addressInfo.street}`); @@ -71,7 +93,7 @@ describe('Realloc!', async () => { const data = (await client.getAccount(pubkey))?.data; if (data) { const enhancedAddressInfo = EnhancedAddressInfo.fromBuffer(Buffer.from(data)); - console.log('Enhanced Address info:'); + console.log("Enhanced Address info:"); console.log(` Name: ${enhancedAddressInfo.name}`); console.log(` House Num: ${enhancedAddressInfo.house_number}`); console.log(` Street: ${enhancedAddressInfo.street}`); @@ -86,7 +108,7 @@ describe('Realloc!', async () => { const data = (await client.getAccount(pubkey))?.data; if (data) { const workInfo = WorkInfo.fromBuffer(Buffer.from(data)); - console.log('Work info:'); + console.log("Work info:"); console.log(` Name: ${workInfo.name}`); console.log(` Position: ${workInfo.position}`); console.log(` Company: ${workInfo.company}`); diff --git a/basics/realloc/native/ts/index.ts b/basics/realloc/native/ts/index.ts index 70c7f3510..9cfd68485 100644 --- a/basics/realloc/native/ts/index.ts +++ b/basics/realloc/native/ts/index.ts @@ -1,7 +1,7 @@ -export * from './instructions/create'; -export * from './instructions/instruction'; -export * from './instructions/reallocate'; -export * from './state/address-info'; -export * from './state/enhanced-address-info'; -export * from './state/work-info'; -export * from './util/util'; +export * from "./instructions/create"; +export * from "./instructions/instruction"; +export * from "./instructions/reallocate"; +export * from "./state/address-info"; +export * from "./state/enhanced-address-info"; +export * from "./state/work-info"; +export * from "./util/util"; diff --git a/basics/realloc/native/ts/instructions/create.ts b/basics/realloc/native/ts/instructions/create.ts index d60a9c800..3fbc6a84e 100644 --- a/basics/realloc/native/ts/instructions/create.ts +++ b/basics/realloc/native/ts/instructions/create.ts @@ -1,7 +1,7 @@ -import { Buffer } from 'node:buffer'; -import { type PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { ReallocInstruction } from './instruction'; +import { Buffer } from "node:buffer"; +import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; +import * as borsh from "borsh"; +import { ReallocInstruction } from "./instruction"; export class Create { instruction: ReallocInstruction; @@ -37,13 +37,13 @@ export const CreateSchema = new Map([ [ Create, { - kind: 'struct', + kind: "struct", fields: [ - ['instruction', 'u8'], - ['name', 'string'], - ['house_number', 'u8'], - ['street', 'string'], - ['city', 'string'], + ["instruction", "u8"], + ["name", "string"], + ["house_number", "u8"], + ["street", "string"], + ["city", "string"], ], }, ], diff --git a/basics/realloc/native/ts/instructions/index.ts b/basics/realloc/native/ts/instructions/index.ts index a0876a284..dba00c454 100644 --- a/basics/realloc/native/ts/instructions/index.ts +++ b/basics/realloc/native/ts/instructions/index.ts @@ -1,3 +1,3 @@ -export * from './create'; -export * from './instruction'; -export * from './reallocate'; +export * from "./create"; +export * from "./instruction"; +export * from "./reallocate"; diff --git a/basics/realloc/native/ts/instructions/reallocate.ts b/basics/realloc/native/ts/instructions/reallocate.ts index 884872d26..197e711d6 100644 --- a/basics/realloc/native/ts/instructions/reallocate.ts +++ b/basics/realloc/native/ts/instructions/reallocate.ts @@ -1,7 +1,7 @@ -import { Buffer } from 'node:buffer'; -import { type PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { ReallocInstruction } from './instruction'; +import { Buffer } from "node:buffer"; +import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; +import * as borsh from "borsh"; +import { ReallocInstruction } from "./instruction"; export class ReallocateWithoutZeroInit { instruction: ReallocInstruction; @@ -31,11 +31,11 @@ export const ReallocateWithoutZeroInitSchema = new Map([ [ ReallocateWithoutZeroInit, { - kind: 'struct', + kind: "struct", fields: [ - ['instruction', 'u8'], - ['state', 'string'], - ['zip', 'u32'], + ["instruction", "u8"], + ["state", "string"], + ["zip", "u32"], ], }, ], @@ -101,13 +101,13 @@ export const ReallocateZeroInitSchema = new Map([ [ ReallocateZeroInit, { - kind: 'struct', + kind: "struct", fields: [ - ['instruction', 'u8'], - ['name', 'string'], - ['position', 'string'], - ['company', 'string'], - ['years_employed', 'u8'], + ["instruction", "u8"], + ["name", "string"], + ["position", "string"], + ["company", "string"], + ["years_employed", "u8"], ], }, ], diff --git a/basics/realloc/native/ts/state/address-info.ts b/basics/realloc/native/ts/state/address-info.ts index d3a3e466f..6acf96c8a 100644 --- a/basics/realloc/native/ts/state/address-info.ts +++ b/basics/realloc/native/ts/state/address-info.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'node:buffer'; -import * as borsh from 'borsh'; +import { Buffer } from "node:buffer"; +import * as borsh from "borsh"; export class AddressInfo { name: string; @@ -36,12 +36,12 @@ export const AddressInfoSchema = new Map([ [ AddressInfo, { - kind: 'struct', + kind: "struct", fields: [ - ['name', 'string'], - ['house_number', 'u8'], - ['street', 'string'], - ['city', 'string'], + ["name", "string"], + ["house_number", "u8"], + ["street", "string"], + ["city", "string"], ], }, ], diff --git a/basics/realloc/native/ts/state/enhanced-address-info.ts b/basics/realloc/native/ts/state/enhanced-address-info.ts index ba7f38b57..edbda7781 100644 --- a/basics/realloc/native/ts/state/enhanced-address-info.ts +++ b/basics/realloc/native/ts/state/enhanced-address-info.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'node:buffer'; -import * as borsh from 'borsh'; +import { Buffer } from "node:buffer"; +import * as borsh from "borsh"; export class EnhancedAddressInfo { name: string; @@ -42,14 +42,14 @@ export const EnhancedAddressInfoSchema = new Map([ [ EnhancedAddressInfo, { - kind: 'struct', + kind: "struct", fields: [ - ['name', 'string'], - ['house_number', 'u8'], - ['street', 'string'], - ['city', 'string'], - ['state', 'string'], - ['zip', 'u32'], + ["name", "string"], + ["house_number", "u8"], + ["street", "string"], + ["city", "string"], + ["state", "string"], + ["zip", "u32"], ], }, ], diff --git a/basics/realloc/native/ts/state/index.ts b/basics/realloc/native/ts/state/index.ts index 5b4330eb5..2cc8c6587 100644 --- a/basics/realloc/native/ts/state/index.ts +++ b/basics/realloc/native/ts/state/index.ts @@ -1,3 +1,3 @@ -export * from './address-info'; -export * from './enhanced-address-info'; -export * from './work-info'; +export * from "./address-info"; +export * from "./enhanced-address-info"; +export * from "./work-info"; diff --git a/basics/realloc/native/ts/state/work-info.ts b/basics/realloc/native/ts/state/work-info.ts index 8275ba017..26a89ebec 100644 --- a/basics/realloc/native/ts/state/work-info.ts +++ b/basics/realloc/native/ts/state/work-info.ts @@ -1,5 +1,5 @@ -import { Buffer } from 'node:buffer'; -import * as borsh from 'borsh'; +import { Buffer } from "node:buffer"; +import * as borsh from "borsh"; export class WorkInfo { name: string; @@ -36,12 +36,12 @@ export const WorkInfoSchema = new Map([ [ WorkInfo, { - kind: 'struct', + kind: "struct", fields: [ - ['name', 'string'], - ['position', 'string'], - ['company', 'string'], - ['years_employed', 'u8'], + ["name", "string"], + ["position", "string"], + ["company", "string"], + ["years_employed", "u8"], ], }, ], diff --git a/basics/realloc/native/ts/util/index.ts b/basics/realloc/native/ts/util/index.ts index bbebd88eb..181e76f24 100644 --- a/basics/realloc/native/ts/util/index.ts +++ b/basics/realloc/native/ts/util/index.ts @@ -1 +1 @@ -export * from './util'; +export * from "./util"; diff --git a/basics/realloc/native/ts/util/util.ts b/basics/realloc/native/ts/util/util.ts index 0e63c77df..7e72414f8 100644 --- a/basics/realloc/native/ts/util/util.ts +++ b/basics/realloc/native/ts/util/util.ts @@ -1,5 +1,5 @@ -import { Keypair } from '@solana/web3.js'; +import { Keypair } from "@solana/web3.js"; export function createKeypairFromFile(path: string): Keypair { - return Keypair.fromSecretKey(Buffer.from(JSON.parse(require('node:fs').readFileSync(path, 'utf-8')))); + return Keypair.fromSecretKey(Buffer.from(JSON.parse(require("node:fs").readFileSync(path, "utf-8")))); } diff --git a/basics/realloc/pinocchio/program/Cargo.toml b/basics/realloc/pinocchio/program/Cargo.toml index 0a475abf2..35d0043d1 100644 --- a/basics/realloc/pinocchio/program/Cargo.toml +++ b/basics/realloc/pinocchio/program/Cargo.toml @@ -20,7 +20,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/realloc/pinocchio/tests/realloc.test.ts b/basics/realloc/pinocchio/tests/realloc.test.ts index 58b2b4fb5..4d32049cf 100644 --- a/basics/realloc/pinocchio/tests/realloc.test.ts +++ b/basics/realloc/pinocchio/tests/realloc.test.ts @@ -1,6 +1,4 @@ -import { describe, test } from "node:test"; -import { Keypair, PublicKey, Transaction } from "@solana/web3.js"; -import { start } from "solana-bankrun"; +import { describe } from "node:test"; describe("Realloc!", async () => { console.log("Realloc!"); diff --git a/basics/rent/anchor/Anchor.toml b/basics/rent/anchor/Anchor.toml index 89a73d190..aa67963df 100644 --- a/basics/rent/anchor/Anchor.toml +++ b/basics/rent/anchor/Anchor.toml @@ -2,15 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false -[programs.localnet] -rent_example = "ED6f4gweAE7hWPQPXMt4kWxzDJne8VQEm9zkb1tMpFNB" +resolution = true +skip-lint = false -# [registry] section removed — no longer used in Anchor 1.0 +[programs.localnet] +rent_example = "3efkmFTva1SZmFPt7E2nTe6SkCLUfuzayXgfjsMJr5Ac" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/rent/anchor/package.json b/basics/rent/anchor/package.json index 0696e9344..878e62db1 100644 --- a/basics/rent/anchor/package.json +++ b/basics/rent/anchor/package.json @@ -1,17 +1,17 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4", + "litesvm": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/basics/rent/anchor/pnpm-lock.yaml b/basics/rent/anchor/pnpm-lock.yaml index a1b80e5e9..f30ff0b8a 100644 --- a/basics/rent/anchor/pnpm-lock.yaml +++ b/basics/rent/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.25.0': @@ -758,16 +758,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -785,7 +785,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.25.0': dependencies: diff --git a/basics/rent/anchor/programs/rent-example/Cargo.toml b/basics/rent/anchor/programs/rent-example/Cargo.toml index 648979a7b..1561b91b1 100644 --- a/basics/rent/anchor/programs/rent-example/Cargo.toml +++ b/basics/rent/anchor/programs/rent-example/Cargo.toml @@ -20,8 +20,14 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/rent/anchor/programs/rent-example/src/lib.rs b/basics/rent/anchor/programs/rent-example/src/lib.rs index a16dcd071..02cc0215a 100644 --- a/basics/rent/anchor/programs/rent-example/src/lib.rs +++ b/basics/rent/anchor/programs/rent-example/src/lib.rs @@ -1,7 +1,7 @@ use anchor_lang::prelude::*; use anchor_lang::system_program; -declare_id!("ED6f4gweAE7hWPQPXMt4kWxzDJne8VQEm9zkb1tMpFNB"); +declare_id!("3efkmFTva1SZmFPt7E2nTe6SkCLUfuzayXgfjsMJr5Ac"); #[program] pub mod rent_example { diff --git a/basics/rent/anchor/programs/rent-example/tests/test_rent.rs b/basics/rent/anchor/programs/rent-example/tests/test_rent.rs new file mode 100644 index 000000000..447a1ad0b --- /dev/null +++ b/basics/rent/anchor/programs/rent-example/tests/test_rent.rs @@ -0,0 +1,76 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, + }, + borsh::BorshDeserialize, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// Build borsh-serialized AddressData bytes (fields are private in the crate). +fn build_address_data_borsh(name: &str, address: &str) -> Vec { + let mut data = Vec::new(); + data.extend_from_slice(&(name.len() as u32).to_le_bytes()); + data.extend_from_slice(name.as_bytes()); + data.extend_from_slice(&(address.len() as u32).to_le_bytes()); + data.extend_from_slice(address.as_bytes()); + data +} + +/// Construct the full instruction data with discriminator + AddressData. +/// Deserialize the borsh bytes into AddressData via the crate's BorshDeserialize impl, +/// then use InstructionData to get the final bytes. +fn build_create_system_account_ix_data(name: &str, address: &str) -> Vec { + let address_data_bytes = build_address_data_borsh(name, address); + let address_data = + rent_example::AddressData::deserialize(&mut address_data_bytes.as_slice()).unwrap(); + rent_example::instruction::CreateSystemAccount { address_data }.data() +} + +#[test] +fn test_create_system_account() { + let program_id = rent_example::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/rent_example.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let new_account = Keypair::new(); + + let name = "Marcus"; + let address = "123 Main St. San Francisco, CA"; + + let ix_data = build_create_system_account_ix_data(name, address); + + let instruction = Instruction::new_with_bytes( + program_id, + &ix_data, + rent_example::accounts::CreateSystemAccount { + payer: payer.pubkey(), + new_account: new_account.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &new_account], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the account was created with the correct size + // Borsh serialized AddressData: 4 + 6 ("Marcus") + 4 + 30 = 44 bytes + let expected_size = 4 + name.len() + 4 + address.len(); + let account = svm.get_account(&new_account.pubkey()).unwrap(); + assert_eq!(account.data.len(), expected_size); + assert!( + account.lamports > 0, + "Account should have lamports for rent" + ); +} diff --git a/basics/rent/anchor/tests/litesvm.test.ts b/basics/rent/anchor/tests/litesvm.test.ts index b102af9f0..c289d1e8a 100644 --- a/basics/rent/anchor/tests/litesvm.test.ts +++ b/basics/rent/anchor/tests/litesvm.test.ts @@ -1,74 +1,68 @@ import anchor from "@anchor-lang/core"; import { - Keypair, - LAMPORTS_PER_SOL, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, + Transaction, + TransactionInstruction, } from "@solana/web3.js"; import { assert } from "chai"; import { LiteSVM } from "litesvm"; import Idl from "../target/idl/rent_example.json" with { type: "json" }; describe("LiteSVM: Create a system account", () => { - const svm = new LiteSVM(); - const programId = new PublicKey(Idl.address); - const coder = new anchor.BorshCoder(Idl as anchor.Idl); + const svm = new LiteSVM(); + const programId = new PublicKey(Idl.address); + const coder = new anchor.BorshCoder(Idl as anchor.Idl); - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(2 * LAMPORTS_PER_SOL)); + const payer = Keypair.generate(); + svm.airdrop(payer.publicKey, BigInt(2 * LAMPORTS_PER_SOL)); - const programPath = new URL( - "../target/deploy/rent_example.so", - import.meta.url, - ).pathname; - svm.addProgramFromFile(programId, programPath); + const programPath = new URL("../target/deploy/rent_example.so", import.meta.url).pathname; + svm.addProgramFromFile(programId, programPath); - it("Create the account", () => { - const newKeypair = Keypair.generate(); + it("Create the account", () => { + const newKeypair = Keypair.generate(); - const ixArgs = { - address_data: { - name: "Marcus", - address: "123 Main St. San Francisco, CA", - }, - }; + const ixArgs = { + address_data: { + name: "Marcus", + address: "123 Main St. San Francisco, CA", + }, + }; - /** - * Create Instructions - * Create Transactions - * Send Transactions - */ - const data = coder.instruction.encode("create_system_account", ixArgs); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: newKeypair.publicKey, isSigner: true, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); + /** + * Create Instructions + * Create Transactions + * Send Transactions + */ + const data = coder.instruction.encode("create_system_account", ixArgs); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: newKeypair.publicKey, isSigner: true, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer, newKeypair); - svm.sendTransaction(tx); + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer, newKeypair); + svm.sendTransaction(tx); - /** - * We're just going to serialize our object here so we can check - * the size on the client side against the program logs - */ - const addressDataBuffer = coder.types.encode( - "AddressData", - ixArgs.address_data, - ); + /** + * We're just going to serialize our object here so we can check + * the size on the client side against the program logs + */ + const addressDataBuffer = coder.types.encode("AddressData", ixArgs.address_data); - //Fetch newKeypair account and check its rent for space - const newKeypairInfo = svm.getAccount(newKeypair.publicKey); + //Fetch newKeypair account and check its rent for space + const newKeypairInfo = svm.getAccount(newKeypair.publicKey); - assert.equal(newKeypairInfo.data.length, addressDataBuffer.length); - }); + assert.equal(newKeypairInfo.data.length, addressDataBuffer.length); + }); }); diff --git a/basics/rent/anchor/tests/test.ts b/basics/rent/anchor/tests/test.ts index 7755d3d47..fdea57a3a 100644 --- a/basics/rent/anchor/tests/test.ts +++ b/basics/rent/anchor/tests/test.ts @@ -4,39 +4,35 @@ import Idl from "../target/idl/rent_example.json" with { type: "json" }; import type { RentExample } from "../target/types/rent_example.ts"; describe("Anchor: Create a system account", () => { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const wallet = provider.wallet as anchor.Wallet; - const program = anchor.workspace.RentExample as anchor.Program; + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + const wallet = provider.wallet as anchor.Wallet; + const program = anchor.workspace.RentExample as anchor.Program; - it("Create the account", async () => { - const newKeypair = anchor.web3.Keypair.generate(); + it("Create the account", async () => { + const newKeypair = anchor.web3.Keypair.generate(); - const addressData: anchor.IdlTypes["addressData"] = { - name: "Marcus", - address: "123 Main St. San Francisco, CA", - }; + const addressData: anchor.IdlTypes["addressData"] = { + name: "Marcus", + address: "123 Main St. San Francisco, CA", + }; - // We're just going to serialize our object here so we can check - // the size on the client side against the program logs - // - const addressDataBuffer = new anchor.BorshCoder( - Idl as anchor.Idl, - ).types.encode("AddressData", addressData); + // We're just going to serialize our object here so we can check + // the size on the client side against the program logs + // + const addressDataBuffer = new anchor.BorshCoder(Idl as anchor.Idl).types.encode("AddressData", addressData); - await program.methods - .createSystemAccount(addressData) - .accounts({ - payer: wallet.publicKey, - newAccount: newKeypair.publicKey, - }) - .signers([wallet.payer, newKeypair]) - .rpc(); + await program.methods + .createSystemAccount(addressData) + .accounts({ + payer: wallet.publicKey, + newAccount: newKeypair.publicKey, + }) + .signers([wallet.payer, newKeypair]) + .rpc(); - const newKeypairInfo = await provider.connection.getAccountInfo( - newKeypair.publicKey, - ); + const newKeypairInfo = await provider.connection.getAccountInfo(newKeypair.publicKey); - assert.equal(newKeypairInfo.data.length, addressDataBuffer.length); - }); + assert.equal(newKeypairInfo.data.length, addressDataBuffer.length); + }); }); diff --git a/basics/rent/anchor/tsconfig.json b/basics/rent/anchor/tsconfig.json index 59fe75cf0..beb254c00 100644 --- a/basics/rent/anchor/tsconfig.json +++ b/basics/rent/anchor/tsconfig.json @@ -1,10 +1,10 @@ { - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "nodenext", - "target": "es6", - "esModuleInterop": true - } + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "nodenext", + "target": "es6", + "esModuleInterop": true + } } diff --git a/basics/rent/native/program/Cargo.toml b/basics/rent/native/program/Cargo.toml index 018875285..dcbff7dc9 100644 --- a/basics/rent/native/program/Cargo.toml +++ b/basics/rent/native/program/Cargo.toml @@ -20,7 +20,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/rent/native/tests/test.ts b/basics/rent/native/tests/test.ts index b07f32f79..1dc1fdee9 100644 --- a/basics/rent/native/tests/test.ts +++ b/basics/rent/native/tests/test.ts @@ -1,19 +1,19 @@ -import { Buffer } from 'node:buffer'; -import { describe, test } from 'node:test'; -import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { start } from 'solana-bankrun'; +import { Buffer } from "node:buffer"; +import { describe, test } from "node:test"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; +import * as borsh from "borsh"; +import { start } from "solana-bankrun"; -describe('Create a system account', async () => { +describe("Create a system account", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'program', programId: PROGRAM_ID }], []); + const context = await start([{ name: "program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; const AddressDataSchema = { struct: { - name: 'string', - address: 'string', + name: "string", + address: "string", }, }; @@ -21,12 +21,12 @@ describe('Create a system account', async () => { return Buffer.from(borsh.serialize(schema, data)); } - test('Create the account', async () => { + test("Create the account", async () => { const newKeypair = Keypair.generate(); const addressData = { - name: 'Marcus', - address: '123 Main St. San Francisco, CA', + name: "Marcus", + address: "123 Main St. San Francisco, CA", }; // We're just going to serialize our object here so we can check diff --git a/basics/rent/pinocchio/program/Cargo.toml b/basics/rent/pinocchio/program/Cargo.toml index f58109e0b..486190ede 100644 --- a/basics/rent/pinocchio/program/Cargo.toml +++ b/basics/rent/pinocchio/program/Cargo.toml @@ -19,7 +19,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/rent/pinocchio/tests/test.ts b/basics/rent/pinocchio/tests/test.ts index ad53cf096..4c97d9a1b 100644 --- a/basics/rent/pinocchio/tests/test.ts +++ b/basics/rent/pinocchio/tests/test.ts @@ -1,5 +1,4 @@ -import { Buffer } from "node:buffer"; -import { describe, test } from "node:test"; +import { describe } from "node:test"; describe("Create a system account", async () => { console.log("Create a system account"); diff --git a/basics/repository-layout/anchor/Anchor.toml b/basics/repository-layout/anchor/Anchor.toml index 8d4faedce..62791d317 100644 --- a/basics/repository-layout/anchor/Anchor.toml +++ b/basics/repository-layout/anchor/Anchor.toml @@ -2,15 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false -[programs.localnet] -carnival = "8t94SEJh9jVjDwV7cbiuT6BvEsHo4YHP9x9a5rYH1NpP" +resolution = true +skip-lint = false -# [registry] section removed — no longer used in Anchor 1.0 +[programs.localnet] +carnival = "FY78H521JC85fwffNHeV5BjKvhvRVuVtFgVrick7JEQj" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/repository-layout/anchor/package.json b/basics/repository-layout/anchor/package.json index 0696e9344..878e62db1 100644 --- a/basics/repository-layout/anchor/package.json +++ b/basics/repository-layout/anchor/package.json @@ -1,17 +1,17 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4", + "litesvm": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/basics/repository-layout/anchor/pnpm-lock.yaml b/basics/repository-layout/anchor/pnpm-lock.yaml index ddb089051..8b77b2a35 100644 --- a/basics/repository-layout/anchor/pnpm-lock.yaml +++ b/basics/repository-layout/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.25.0': @@ -755,16 +755,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -782,7 +782,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.25.0': dependencies: diff --git a/basics/repository-layout/anchor/programs/carnival/Cargo.toml b/basics/repository-layout/anchor/programs/carnival/Cargo.toml index 71a3df21d..6708568ec 100644 --- a/basics/repository-layout/anchor/programs/carnival/Cargo.toml +++ b/basics/repository-layout/anchor/programs/carnival/Cargo.toml @@ -20,8 +20,13 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/repository-layout/anchor/programs/carnival/src/lib.rs b/basics/repository-layout/anchor/programs/carnival/src/lib.rs index 9a9269e6b..7cc752a84 100644 --- a/basics/repository-layout/anchor/programs/carnival/src/lib.rs +++ b/basics/repository-layout/anchor/programs/carnival/src/lib.rs @@ -8,7 +8,7 @@ use crate::instructions::{eat_food, get_on_ride, play_game}; // For setting up modules & configs -declare_id!("8t94SEJh9jVjDwV7cbiuT6BvEsHo4YHP9x9a5rYH1NpP"); +declare_id!("FY78H521JC85fwffNHeV5BjKvhvRVuVtFgVrick7JEQj"); #[program] pub mod carnival { diff --git a/basics/repository-layout/anchor/programs/carnival/tests/test_carnival.rs b/basics/repository-layout/anchor/programs/carnival/tests/test_carnival.rs new file mode 100644 index 000000000..ff2221246 --- /dev/null +++ b/basics/repository-layout/anchor/programs/carnival/tests/test_carnival.rs @@ -0,0 +1,115 @@ +use { + anchor_lang::{solana_program::instruction::Instruction, InstructionData, ToAccountMetas}, + litesvm::LiteSVM, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, solana_keypair::Keypair) { + let program_id = carnival::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/carnival.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, payer) +} + +#[test] +fn test_go_on_rides() { + let (mut svm, payer) = setup(); + + let accounts = carnival::accounts::CarnivalContext { + payer: payer.pubkey(), + } + .to_account_metas(None); + + let instructions: Vec = vec![ + ("Jimmy", 36u32, 15u32, "Scrambler"), + ("Mary", 52, 1, "Ferris Wheel"), + ("Alice", 56, 15, "Scrambler"), + ("Bob", 49, 6, "Tilt-a-Whirl"), + ] + .into_iter() + .map(|(name, height, tickets, ride)| { + Instruction::new_with_bytes( + carnival::id(), + &carnival::instruction::GoOnRide { + name: name.to_string(), + height, + ticket_count: tickets, + ride_name: ride.to_string(), + } + .data(), + accounts.clone(), + ) + }) + .collect(); + + send_transaction_from_instructions(&mut svm, instructions, &[&payer], &payer.pubkey()).unwrap(); +} + +#[test] +fn test_play_games() { + let (mut svm, payer) = setup(); + + let accounts = carnival::accounts::CarnivalContext { + payer: payer.pubkey(), + } + .to_account_metas(None); + + let instructions: Vec = vec![ + ("Jimmy", 15u32, "I Got It!"), + ("Mary", 1, "Ring Toss"), + ("Alice", 15, "Ladder Climb"), + ("Bob", 6, "Ring Toss"), + ] + .into_iter() + .map(|(name, tickets, game)| { + Instruction::new_with_bytes( + carnival::id(), + &carnival::instruction::PlayGame { + name: name.to_string(), + ticket_count: tickets, + game_name: game.to_string(), + } + .data(), + accounts.clone(), + ) + }) + .collect(); + + send_transaction_from_instructions(&mut svm, instructions, &[&payer], &payer.pubkey()).unwrap(); +} + +#[test] +fn test_eat_food() { + let (mut svm, payer) = setup(); + + let accounts = carnival::accounts::CarnivalContext { + payer: payer.pubkey(), + } + .to_account_metas(None); + + let instructions: Vec = vec![ + ("Jimmy", 15u32, "Taco Shack"), + ("Mary", 1, "Larry's Pizza"), + ("Alice", 15, "Dough Boy's"), + ("Bob", 6, "Dough Boy's"), + ] + .into_iter() + .map(|(name, tickets, food_stand)| { + Instruction::new_with_bytes( + carnival::id(), + &carnival::instruction::EatFood { + name: name.to_string(), + ticket_count: tickets, + food_stand_name: food_stand.to_string(), + } + .data(), + accounts.clone(), + ) + }) + .collect(); + + send_transaction_from_instructions(&mut svm, instructions, &[&payer], &payer.pubkey()).unwrap(); +} diff --git a/basics/repository-layout/anchor/tests/litesvm.test.ts b/basics/repository-layout/anchor/tests/litesvm.test.ts index a77a18431..96bbc11a0 100644 --- a/basics/repository-layout/anchor/tests/litesvm.test.ts +++ b/basics/repository-layout/anchor/tests/litesvm.test.ts @@ -1,129 +1,119 @@ import anchor from "@anchor-lang/core"; -import { - Keypair, - LAMPORTS_PER_SOL, - PublicKey, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; +import { Keypair, LAMPORTS_PER_SOL, PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; import { LiteSVM } from "litesvm"; import Idl from "../target/idl/carnival.json" with { type: "json" }; describe("LiteSVM: Carnival", () => { - const svm = new LiteSVM(); - const programId = new PublicKey(Idl.address); - const coder = new anchor.BorshCoder(Idl as anchor.Idl); - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(5 * LAMPORTS_PER_SOL)); + const svm = new LiteSVM(); + const programId = new PublicKey(Idl.address); + const coder = new anchor.BorshCoder(Idl as anchor.Idl); + const payer = Keypair.generate(); + svm.airdrop(payer.publicKey, BigInt(5 * LAMPORTS_PER_SOL)); - const programPath = new URL("../target/deploy/carnival.so", import.meta.url) - .pathname; - svm.addProgramFromFile(programId, programPath); + const programPath = new URL("../target/deploy/carnival.so", import.meta.url).pathname; + svm.addProgramFromFile(programId, programPath); - it("Go on some rides!", () => { - const jimmyIxArgs = { - name: "Jimmy", - height: 36, - ticket_count: 15, - ride_name: "Scrambler", - }; - const maryIxArgs = { - name: "Mary", - height: 52, - ticket_count: 1, - ride_name: "Ferris Wheel", - }; - const bobIxArgs = { - name: "Alice", - height: 56, - ticket_count: 15, - ride_name: "Scrambler", - }; - const aliceIxArgs = { - name: "Bob", - height: 49, - ticket_count: 6, - ride_name: "Tilt-a-Whirl", - }; + it("Go on some rides!", () => { + const jimmyIxArgs = { + name: "Jimmy", + height: 36, + ticket_count: 15, + ride_name: "Scrambler", + }; + const maryIxArgs = { + name: "Mary", + height: 52, + ticket_count: 1, + ride_name: "Ferris Wheel", + }; + const bobIxArgs = { + name: "Alice", + height: 56, + ticket_count: 15, + ride_name: "Scrambler", + }; + const aliceIxArgs = { + name: "Bob", + height: 49, + ticket_count: 6, + ride_name: "Tilt-a-Whirl", + }; - createAndSendTx(jimmyIxArgs, "go_on_ride"); - createAndSendTx(maryIxArgs, "go_on_ride"); - createAndSendTx(bobIxArgs, "go_on_ride"); - createAndSendTx(aliceIxArgs, "go_on_ride"); - }); + createAndSendTx(jimmyIxArgs, "go_on_ride"); + createAndSendTx(maryIxArgs, "go_on_ride"); + createAndSendTx(bobIxArgs, "go_on_ride"); + createAndSendTx(aliceIxArgs, "go_on_ride"); + }); - it("Play some games!", () => { - const jimmyIxArgs = { - name: "Jimmy", - ticket_count: 15, - game_name: "I Got It!", - }; - const maryIxArgs = { - name: "Mary", - ticket_count: 1, - game_name: "Ring Toss", - }; - const aliceIxArgs = { - name: "Alice", - ticket_count: 15, - game_name: "Ladder Climb", - }; - const bobIxArgs = { - name: "Bob", - ticket_count: 6, - game_name: "Ring Toss", - }; + it("Play some games!", () => { + const jimmyIxArgs = { + name: "Jimmy", + ticket_count: 15, + game_name: "I Got It!", + }; + const maryIxArgs = { + name: "Mary", + ticket_count: 1, + game_name: "Ring Toss", + }; + const aliceIxArgs = { + name: "Alice", + ticket_count: 15, + game_name: "Ladder Climb", + }; + const bobIxArgs = { + name: "Bob", + ticket_count: 6, + game_name: "Ring Toss", + }; - createAndSendTx(jimmyIxArgs, "play_game"); - createAndSendTx(maryIxArgs, "play_game"); - createAndSendTx(aliceIxArgs, "play_game"); - createAndSendTx(bobIxArgs, "play_game"); - }); + createAndSendTx(jimmyIxArgs, "play_game"); + createAndSendTx(maryIxArgs, "play_game"); + createAndSendTx(aliceIxArgs, "play_game"); + createAndSendTx(bobIxArgs, "play_game"); + }); - it("Eat some food!", () => { - const jimmyIxArgs = { - name: "Jimmy", - ticket_count: 15, - food_stand_name: "Taco Shack", - }; - const maryIxArgs = { - name: "Mary", - ticket_count: 1, - food_stand_name: "Larry's Pizza", - }; - const aliceIxArgs = { - name: "Alice", - ticket_count: 15, - food_stand_name: "Dough Boy's", - }; - const bobIxArgs = { - name: "Bob", - ticket_count: 6, - food_stand_name: "Dough Boy's", - }; + it("Eat some food!", () => { + const jimmyIxArgs = { + name: "Jimmy", + ticket_count: 15, + food_stand_name: "Taco Shack", + }; + const maryIxArgs = { + name: "Mary", + ticket_count: 1, + food_stand_name: "Larry's Pizza", + }; + const aliceIxArgs = { + name: "Alice", + ticket_count: 15, + food_stand_name: "Dough Boy's", + }; + const bobIxArgs = { + name: "Bob", + ticket_count: 6, + food_stand_name: "Dough Boy's", + }; - createAndSendTx(jimmyIxArgs, "eat_food"); - createAndSendTx(maryIxArgs, "eat_food"); - createAndSendTx(aliceIxArgs, "eat_food"); - createAndSendTx(bobIxArgs, "eat_food"); - }); + createAndSendTx(jimmyIxArgs, "eat_food"); + createAndSendTx(maryIxArgs, "eat_food"); + createAndSendTx(aliceIxArgs, "eat_food"); + createAndSendTx(bobIxArgs, "eat_food"); + }); - function createAndSendTx( - ixArgs: Record, - ixName: string, - ) { - const data = coder.instruction.encode(ixName, ixArgs); - const ix = new TransactionInstruction({ - keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }], - programId, - data, - }); + function createAndSendTx(ixArgs: Record, ixName: string) { + const data = coder.instruction.encode(ixName, ixArgs); + const ix = new TransactionInstruction({ + keys: [{ pubkey: payer.publicKey, isSigner: true, isWritable: true }], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - const re = svm.sendTransaction(tx); - // console.log(re.toString()); - } + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + const _re = svm.sendTransaction(tx); + // console.log(re.toString()); + } }); diff --git a/basics/repository-layout/anchor/tests/test.ts b/basics/repository-layout/anchor/tests/test.ts index 497a11edd..2d978110a 100644 --- a/basics/repository-layout/anchor/tests/test.ts +++ b/basics/repository-layout/anchor/tests/test.ts @@ -2,55 +2,43 @@ import * as anchor from "@anchor-lang/core"; import type { Carnival } from "../target/types/carnival.ts"; describe("Carnival", () => { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const wallet = provider.wallet as anchor.Wallet; - const program = anchor.workspace.Carnival as anchor.Program; + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + const wallet = provider.wallet as anchor.Wallet; + const program = anchor.workspace.Carnival as anchor.Program; - async function sendCarnivalInstructions( - instructionsList: anchor.web3.TransactionInstruction[], - ) { - const tx = new anchor.web3.Transaction(); - for (const ix of instructionsList) { - tx.add(ix); - } - await anchor.web3.sendAndConfirmTransaction(provider.connection, tx, [ - wallet.payer, - ]); - } + async function sendCarnivalInstructions(instructionsList: anchor.web3.TransactionInstruction[]) { + const tx = new anchor.web3.Transaction(); + for (const ix of instructionsList) { + tx.add(ix); + } + await anchor.web3.sendAndConfirmTransaction(provider.connection, tx, [wallet.payer]); + } - it("Go on some rides!", async () => { - await sendCarnivalInstructions([ - await program.methods - .goOnRide("Jimmy", 36, 15, "Scrambler") - .instruction(), - await program.methods - .goOnRide("Mary", 52, 1, "Ferris Wheel") - .instruction(), - await program.methods - .goOnRide("Alice", 56, 15, "Scrambler") - .instruction(), - await program.methods - .goOnRide("Bob", 49, 6, "Tilt-a-Whirl") - .instruction(), - ]); - }); + it("Go on some rides!", async () => { + await sendCarnivalInstructions([ + await program.methods.goOnRide("Jimmy", 36, 15, "Scrambler").instruction(), + await program.methods.goOnRide("Mary", 52, 1, "Ferris Wheel").instruction(), + await program.methods.goOnRide("Alice", 56, 15, "Scrambler").instruction(), + await program.methods.goOnRide("Bob", 49, 6, "Tilt-a-Whirl").instruction(), + ]); + }); - it("Play some games!", async () => { - await sendCarnivalInstructions([ - await program.methods.playGame("Jimmy", 15, "I Got It!").instruction(), - await program.methods.playGame("Mary", 1, "Ring Toss").instruction(), - await program.methods.playGame("Alice", 15, "Ladder Climb").instruction(), - await program.methods.playGame("Bob", 6, "Ring Toss").instruction(), - ]); - }); + it("Play some games!", async () => { + await sendCarnivalInstructions([ + await program.methods.playGame("Jimmy", 15, "I Got It!").instruction(), + await program.methods.playGame("Mary", 1, "Ring Toss").instruction(), + await program.methods.playGame("Alice", 15, "Ladder Climb").instruction(), + await program.methods.playGame("Bob", 6, "Ring Toss").instruction(), + ]); + }); - it("Eat some food!", async () => { - await sendCarnivalInstructions([ - await program.methods.eatFood("Jimmy", 15, "Taco Shack").instruction(), - await program.methods.eatFood("Mary", 1, "Larry's Pizza").instruction(), - await program.methods.eatFood("Alice", 15, "Dough Boy's").instruction(), - await program.methods.eatFood("Bob", 6, "Dough Boy's").instruction(), - ]); - }); + it("Eat some food!", async () => { + await sendCarnivalInstructions([ + await program.methods.eatFood("Jimmy", 15, "Taco Shack").instruction(), + await program.methods.eatFood("Mary", 1, "Larry's Pizza").instruction(), + await program.methods.eatFood("Alice", 15, "Dough Boy's").instruction(), + await program.methods.eatFood("Bob", 6, "Dough Boy's").instruction(), + ]); + }); }); diff --git a/basics/repository-layout/anchor/tsconfig.json b/basics/repository-layout/anchor/tsconfig.json index 59fe75cf0..beb254c00 100644 --- a/basics/repository-layout/anchor/tsconfig.json +++ b/basics/repository-layout/anchor/tsconfig.json @@ -1,10 +1,10 @@ { - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "nodenext", - "target": "es6", - "esModuleInterop": true - } + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "nodenext", + "target": "es6", + "esModuleInterop": true + } } diff --git a/basics/repository-layout/native/program/Cargo.toml b/basics/repository-layout/native/program/Cargo.toml index 049e72758..61290f9ff 100644 --- a/basics/repository-layout/native/program/Cargo.toml +++ b/basics/repository-layout/native/program/Cargo.toml @@ -19,7 +19,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/repository-layout/native/tests/test.ts b/basics/repository-layout/native/tests/test.ts index db8b6dedd..d480899ff 100644 --- a/basics/repository-layout/native/tests/test.ts +++ b/basics/repository-layout/native/tests/test.ts @@ -1,22 +1,22 @@ -import { Buffer } from 'node:buffer'; -import { describe, test } from 'node:test'; -import { PublicKey, Transaction, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { start } from 'solana-bankrun'; +import { Buffer } from "node:buffer"; +import { describe, test } from "node:test"; +import { PublicKey, Transaction, TransactionInstruction } from "@solana/web3.js"; +import * as borsh from "borsh"; +import { start } from "solana-bankrun"; -describe('Carnival', async () => { +describe("Carnival", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'repository_layout_program', programId: PROGRAM_ID }], []); + const context = await start([{ name: "repository_layout_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; const CarnivalInstructionSchema = { struct: { - name: 'string', - height: 'u32', - ticket_count: 'u32', - attraction: 'string', - attraction_name: 'string', + name: "string", + height: "u32", + ticket_count: "u32", + attraction: "string", + attraction_name: "string", }, }; @@ -47,30 +47,102 @@ describe('Carnival', async () => { await client.processTransaction(tx); } - test('Go on some rides!', async () => { + test("Go on some rides!", async () => { await sendCarnivalInstructions([ - { name: 'Jimmy', height: 36, ticket_count: 15, attraction: 'ride', attraction_name: 'Scrambler' }, - { name: 'Mary', height: 52, ticket_count: 1, attraction: 'ride', attraction_name: 'Ferris Wheel' }, - { name: 'Alice', height: 56, ticket_count: 15, attraction: 'ride', attraction_name: 'Scrambler' }, - { name: 'Bob', height: 49, ticket_count: 6, attraction: 'ride', attraction_name: 'Tilt-a-Whirl' }, + { + name: "Jimmy", + height: 36, + ticket_count: 15, + attraction: "ride", + attraction_name: "Scrambler", + }, + { + name: "Mary", + height: 52, + ticket_count: 1, + attraction: "ride", + attraction_name: "Ferris Wheel", + }, + { + name: "Alice", + height: 56, + ticket_count: 15, + attraction: "ride", + attraction_name: "Scrambler", + }, + { + name: "Bob", + height: 49, + ticket_count: 6, + attraction: "ride", + attraction_name: "Tilt-a-Whirl", + }, ]); }); - test('Play some games!', async () => { + test("Play some games!", async () => { await sendCarnivalInstructions([ - { name: 'Jimmy', height: 36, ticket_count: 15, attraction: 'game', attraction_name: 'I Got It!' }, - { name: 'Mary', height: 52, ticket_count: 1, attraction: 'game', attraction_name: 'Ring Toss' }, - { name: 'Alice', height: 56, ticket_count: 15, attraction: 'game', attraction_name: 'Ladder Climb' }, - { name: 'Bob', height: 49, ticket_count: 6, attraction: 'game', attraction_name: 'Ring Toss' }, + { + name: "Jimmy", + height: 36, + ticket_count: 15, + attraction: "game", + attraction_name: "I Got It!", + }, + { + name: "Mary", + height: 52, + ticket_count: 1, + attraction: "game", + attraction_name: "Ring Toss", + }, + { + name: "Alice", + height: 56, + ticket_count: 15, + attraction: "game", + attraction_name: "Ladder Climb", + }, + { + name: "Bob", + height: 49, + ticket_count: 6, + attraction: "game", + attraction_name: "Ring Toss", + }, ]); }); - test('Eat some food!', async () => { + test("Eat some food!", async () => { await sendCarnivalInstructions([ - { name: 'Jimmy', height: 36, ticket_count: 15, attraction: 'food', attraction_name: 'Taco Shack' }, - { name: 'Mary', height: 52, ticket_count: 1, attraction: 'food', attraction_name: "Larry's Pizza" }, - { name: 'Alice', height: 56, ticket_count: 15, attraction: 'food', attraction_name: "Dough Boy's" }, - { name: 'Bob', height: 49, ticket_count: 6, attraction: 'food', attraction_name: "Dough Boy's" }, + { + name: "Jimmy", + height: 36, + ticket_count: 15, + attraction: "food", + attraction_name: "Taco Shack", + }, + { + name: "Mary", + height: 52, + ticket_count: 1, + attraction: "food", + attraction_name: "Larry's Pizza", + }, + { + name: "Alice", + height: 56, + ticket_count: 15, + attraction: "food", + attraction_name: "Dough Boy's", + }, + { + name: "Bob", + height: 49, + ticket_count: 6, + attraction: "food", + attraction_name: "Dough Boy's", + }, ]); }); }); diff --git a/basics/transfer-sol/anchor/Anchor.toml b/basics/transfer-sol/anchor/Anchor.toml index 7e5ef2b8f..8b0c32acc 100644 --- a/basics/transfer-sol/anchor/Anchor.toml +++ b/basics/transfer-sol/anchor/Anchor.toml @@ -2,15 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false -[programs.localnet] -transfer_sol = "4fQVnLWKKKYxtxgGn7Haw8v2g2Hzbu8K61JvWKvqAi7W" +resolution = true +skip-lint = false -# [registry] section removed — no longer used in Anchor 1.0 +[programs.localnet] +transfer_sol = "5bz3T8zeTXMGEwVhuFBKmyZk1Wqhfs1K39kfDXnLLmwG" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/basics/transfer-sol/anchor/package.json b/basics/transfer-sol/anchor/package.json index 0696e9344..878e62db1 100644 --- a/basics/transfer-sol/anchor/package.json +++ b/basics/transfer-sol/anchor/package.json @@ -1,17 +1,17 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "litesvm": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4", + "litesvm": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/basics/transfer-sol/anchor/pnpm-lock.yaml b/basics/transfer-sol/anchor/pnpm-lock.yaml index 37a30dda9..271bd4550 100644 --- a/basics/transfer-sol/anchor/pnpm-lock.yaml +++ b/basics/transfer-sol/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -746,16 +746,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -773,7 +773,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/Cargo.toml b/basics/transfer-sol/anchor/programs/transfer-sol/Cargo.toml index 08eb4312d..c6ea1ce73 100644 --- a/basics/transfer-sol/anchor/programs/transfer-sol/Cargo.toml +++ b/basics/transfer-sol/anchor/programs/transfer-sol/Cargo.toml @@ -20,8 +20,13 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs b/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs index 7f8e92542..e7b67059d 100644 --- a/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs +++ b/basics/transfer-sol/anchor/programs/transfer-sol/src/lib.rs @@ -1,7 +1,7 @@ use anchor_lang::prelude::*; use anchor_lang::system_program; -declare_id!("4fQVnLWKKKYxtxgGn7Haw8v2g2Hzbu8K61JvWKvqAi7W"); +declare_id!("5bz3T8zeTXMGEwVhuFBKmyZk1Wqhfs1K39kfDXnLLmwG"); #[program] pub mod transfer_sol { diff --git a/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs b/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs new file mode 100644 index 000000000..e94829362 --- /dev/null +++ b/basics/transfer-sol/anchor/programs/transfer-sol/tests/test_transfer_sol.rs @@ -0,0 +1,92 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +const LAMPORTS_PER_SOL: u64 = 1_000_000_000; + +#[test] +fn test_transfer_sol_with_cpi() { + let program_id = transfer_sol::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/transfer_sol.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10 * LAMPORTS_PER_SOL).unwrap(); + + let recipient = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &transfer_sol::instruction::TransferSolWithCpi { + amount: LAMPORTS_PER_SOL, + } + .data(), + transfer_sol::accounts::TransferSolWithCpi { + payer: payer.pubkey(), + recipient: recipient.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) + .unwrap(); + + let recipient_balance = svm.get_balance(&recipient.pubkey()).unwrap(); + assert_eq!(recipient_balance, LAMPORTS_PER_SOL); +} + +#[test] +fn test_transfer_sol_with_program() { + let program_id = transfer_sol::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/transfer_sol.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10 * LAMPORTS_PER_SOL).unwrap(); + + // Create an account owned by our program with 1 SOL + let payer_account = Keypair::new(); + let create_account_ix = anchor_lang::solana_program::system_instruction::create_account( + &payer.pubkey(), + &payer_account.pubkey(), + LAMPORTS_PER_SOL, + 0, + &program_id, + ); + send_transaction_from_instructions( + &mut svm, + vec![create_account_ix], + &[&payer, &payer_account], + &payer.pubkey(), + ) + .unwrap(); + + // Now transfer SOL from the program-owned account to a recipient + svm.expire_blockhash(); + let recipient = Keypair::new(); + + let instruction = Instruction::new_with_bytes( + program_id, + &transfer_sol::instruction::TransferSolWithProgram { + amount: LAMPORTS_PER_SOL, + } + .data(), + transfer_sol::accounts::TransferSolWithProgram { + payer: payer_account.pubkey(), + recipient: recipient.pubkey(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) + .unwrap(); + + let recipient_balance = svm.get_balance(&recipient.pubkey()).unwrap(); + assert_eq!(recipient_balance, LAMPORTS_PER_SOL); +} diff --git a/basics/transfer-sol/anchor/tests/litesvm.test.ts b/basics/transfer-sol/anchor/tests/litesvm.test.ts index 536e796f6..21ced4b0d 100644 --- a/basics/transfer-sol/anchor/tests/litesvm.test.ts +++ b/basics/transfer-sol/anchor/tests/litesvm.test.ts @@ -1,99 +1,96 @@ import anchor from "@anchor-lang/core"; import { - Keypair, - LAMPORTS_PER_SOL, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, + Transaction, + TransactionInstruction, } from "@solana/web3.js"; import { assert } from "chai"; import { LiteSVM } from "litesvm"; import Idl from "../target/idl/transfer_sol.json" with { type: "json" }; describe("LiteSVM: Transfer SOL", () => { - const svm = new LiteSVM(); - const programId = new PublicKey(Idl.address); - const coder = new anchor.BorshCoder(Idl as anchor.Idl); - const payer = Keypair.generate(); - svm.airdrop(payer.publicKey, BigInt(5 * LAMPORTS_PER_SOL)); + const svm = new LiteSVM(); + const programId = new PublicKey(Idl.address); + const coder = new anchor.BorshCoder(Idl as anchor.Idl); + const payer = Keypair.generate(); + svm.airdrop(payer.publicKey, BigInt(5 * LAMPORTS_PER_SOL)); - const programFilePath = new URL( - "../target/deploy/transfer_sol.so", - import.meta.url, - ).pathname; - svm.addProgramFromFile(programId, programFilePath); + const programFilePath = new URL("../target/deploy/transfer_sol.so", import.meta.url).pathname; + svm.addProgramFromFile(programId, programFilePath); - it("Transfer SOL with CPI", () => { - const recipient = Keypair.generate(); + it("Transfer SOL with CPI", () => { + const recipient = Keypair.generate(); - const ixArgs = { - amount: new anchor.BN(LAMPORTS_PER_SOL), - }; - const data = coder.instruction.encode("transfer_sol_with_cpi", ixArgs); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, - { pubkey: recipient.publicKey, isSigner: false, isWritable: true }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); + const ixArgs = { + amount: new anchor.BN(LAMPORTS_PER_SOL), + }; + const data = coder.instruction.encode("transfer_sol_with_cpi", ixArgs); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, + { pubkey: recipient.publicKey, isSigner: false, isWritable: true }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer); - svm.sendTransaction(tx); + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer); + svm.sendTransaction(tx); - const recipientAcc = svm.getAccount(recipient.publicKey); - assert.equal(recipientAcc.lamports, LAMPORTS_PER_SOL); - }); + const recipientAcc = svm.getAccount(recipient.publicKey); + assert.equal(recipientAcc.lamports, LAMPORTS_PER_SOL); + }); - it("Transfer SOL with Program", () => { - const payerAccount = Keypair.generate(); - const ixPayer = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: payerAccount.publicKey, - lamports: LAMPORTS_PER_SOL, - space: 0, - programId, - }); - const txPayer = new Transaction().add(ixPayer); - txPayer.feePayer = payer.publicKey; - txPayer.recentBlockhash = svm.latestBlockhash(); - txPayer.sign(payer, payerAccount); - svm.sendTransaction(txPayer); - svm.expireBlockhash(); + it("Transfer SOL with Program", () => { + const payerAccount = Keypair.generate(); + const ixPayer = SystemProgram.createAccount({ + fromPubkey: payer.publicKey, + newAccountPubkey: payerAccount.publicKey, + lamports: LAMPORTS_PER_SOL, + space: 0, + programId, + }); + const txPayer = new Transaction().add(ixPayer); + txPayer.feePayer = payer.publicKey; + txPayer.recentBlockhash = svm.latestBlockhash(); + txPayer.sign(payer, payerAccount); + svm.sendTransaction(txPayer); + svm.expireBlockhash(); - const recipientAccount = Keypair.generate(); + const recipientAccount = Keypair.generate(); - const ixArgs = { - amount: new anchor.BN(LAMPORTS_PER_SOL), - }; - const data = coder.instruction.encode("transfer_sol_with_program", ixArgs); - const ix = new TransactionInstruction({ - keys: [ - { pubkey: payerAccount.publicKey, isSigner: true, isWritable: true }, - { - pubkey: recipientAccount.publicKey, - isSigner: false, - isWritable: true, - }, - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, - ], - programId, - data, - }); + const ixArgs = { + amount: new anchor.BN(LAMPORTS_PER_SOL), + }; + const data = coder.instruction.encode("transfer_sol_with_program", ixArgs); + const ix = new TransactionInstruction({ + keys: [ + { pubkey: payerAccount.publicKey, isSigner: true, isWritable: true }, + { + pubkey: recipientAccount.publicKey, + isSigner: false, + isWritable: true, + }, + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, + ], + programId, + data, + }); - const tx = new Transaction().add(ix); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = svm.latestBlockhash(); - tx.sign(payer, payerAccount); - svm.sendTransaction(tx); + const tx = new Transaction().add(ix); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = svm.latestBlockhash(); + tx.sign(payer, payerAccount); + svm.sendTransaction(tx); - const recipientAcc = svm.getAccount(recipientAccount.publicKey); - assert.equal(recipientAcc.lamports, LAMPORTS_PER_SOL); - }); + const recipientAcc = svm.getAccount(recipientAccount.publicKey); + assert.equal(recipientAcc.lamports, LAMPORTS_PER_SOL); + }); }); diff --git a/basics/transfer-sol/anchor/tests/test.ts b/basics/transfer-sol/anchor/tests/test.ts index c43f5f122..3f773a536 100644 --- a/basics/transfer-sol/anchor/tests/test.ts +++ b/basics/transfer-sol/anchor/tests/test.ts @@ -1,68 +1,54 @@ import * as anchor from "@anchor-lang/core"; -import { - Keypair, - LAMPORTS_PER_SOL, - type PublicKey, - SystemProgram, - Transaction, - sendAndConfirmTransaction, -} from "@solana/web3.js"; +import { Keypair, LAMPORTS_PER_SOL, SystemProgram, sendAndConfirmTransaction, Transaction } from "@solana/web3.js"; import { BN } from "bn.js"; import { assert } from "chai"; import type { TransferSol } from "../target/types/transfer_sol.ts"; describe("Anchor: Transfer SOL", () => { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const payer = provider.wallet as anchor.Wallet; - const program = anchor.workspace.TransferSol as anchor.Program; - - it("Transfer SOL with CPI", async () => { - const recipient = Keypair.generate(); - - await program.methods - .transferSolWithCpi(new BN(LAMPORTS_PER_SOL)) - .accounts({ - payer: payer.publicKey, - recipient: recipient.publicKey, - }) - .rpc(); - - const recipientBalance = await provider.connection.getBalance( - recipient.publicKey, - ); - assert.equal(recipientBalance, LAMPORTS_PER_SOL); - }); - - it("Transfer SOL with Program", async () => { - const payerAccount = Keypair.generate(); - const ix = SystemProgram.createAccount({ - fromPubkey: payer.publicKey, - newAccountPubkey: payerAccount.publicKey, - space: 0, - lamports: LAMPORTS_PER_SOL, // 1 SOL - programId: program.programId, // Program Owner, our program's address - }); - - const transaction = new Transaction().add(ix); - - await sendAndConfirmTransaction(provider.connection, transaction, [ - payer.payer, - payerAccount, - ]); - - const recipientAccount = Keypair.generate(); - await program.methods - .transferSolWithProgram(new BN(LAMPORTS_PER_SOL)) - .accounts({ - payer: payerAccount.publicKey, - recipient: recipientAccount.publicKey, - }) - .rpc(); - - const recipientBalance = await provider.connection.getBalance( - recipientAccount.publicKey, - ); - assert.equal(recipientBalance, LAMPORTS_PER_SOL); - }); + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + const payer = provider.wallet as anchor.Wallet; + const program = anchor.workspace.TransferSol as anchor.Program; + + it("Transfer SOL with CPI", async () => { + const recipient = Keypair.generate(); + + await program.methods + .transferSolWithCpi(new BN(LAMPORTS_PER_SOL)) + .accounts({ + payer: payer.publicKey, + recipient: recipient.publicKey, + }) + .rpc(); + + const recipientBalance = await provider.connection.getBalance(recipient.publicKey); + assert.equal(recipientBalance, LAMPORTS_PER_SOL); + }); + + it("Transfer SOL with Program", async () => { + const payerAccount = Keypair.generate(); + const ix = SystemProgram.createAccount({ + fromPubkey: payer.publicKey, + newAccountPubkey: payerAccount.publicKey, + space: 0, + lamports: LAMPORTS_PER_SOL, // 1 SOL + programId: program.programId, // Program Owner, our program's address + }); + + const transaction = new Transaction().add(ix); + + await sendAndConfirmTransaction(provider.connection, transaction, [payer.payer, payerAccount]); + + const recipientAccount = Keypair.generate(); + await program.methods + .transferSolWithProgram(new BN(LAMPORTS_PER_SOL)) + .accounts({ + payer: payerAccount.publicKey, + recipient: recipientAccount.publicKey, + }) + .rpc(); + + const recipientBalance = await provider.connection.getBalance(recipientAccount.publicKey); + assert.equal(recipientBalance, LAMPORTS_PER_SOL); + }); }); diff --git a/basics/transfer-sol/anchor/tsconfig.json b/basics/transfer-sol/anchor/tsconfig.json index 59fe75cf0..beb254c00 100644 --- a/basics/transfer-sol/anchor/tsconfig.json +++ b/basics/transfer-sol/anchor/tsconfig.json @@ -1,10 +1,10 @@ { - "compilerOptions": { - "types": ["mocha", "chai"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], - "module": "nodenext", - "target": "es6", - "esModuleInterop": true - } + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "nodenext", + "target": "es6", + "esModuleInterop": true + } } diff --git a/basics/transfer-sol/native/program/Cargo.toml b/basics/transfer-sol/native/program/Cargo.toml index 821c85031..9202a2596 100644 --- a/basics/transfer-sol/native/program/Cargo.toml +++ b/basics/transfer-sol/native/program/Cargo.toml @@ -20,7 +20,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/transfer-sol/native/tests/instruction.ts b/basics/transfer-sol/native/tests/instruction.ts index 311a35188..72e90f9d2 100644 --- a/basics/transfer-sol/native/tests/instruction.ts +++ b/basics/transfer-sol/native/tests/instruction.ts @@ -1,6 +1,6 @@ -import { Buffer } from 'node:buffer'; -import { type PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; +import { Buffer } from "node:buffer"; +import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; +import * as borsh from "borsh"; export enum InstructionType { CpiTransfer = 0, @@ -9,8 +9,8 @@ export enum InstructionType { const TransferInstructionSchema = { struct: { - instruction: 'u8', - amount: 'u64', + instruction: "u8", + amount: "u64", }, }; diff --git a/basics/transfer-sol/native/tests/test.ts b/basics/transfer-sol/native/tests/test.ts index e5eb81b02..929fb0a3f 100644 --- a/basics/transfer-sol/native/tests/test.ts +++ b/basics/transfer-sol/native/tests/test.ts @@ -1,11 +1,11 @@ -import { describe, test } from 'node:test'; -import { Keypair, LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction } from '@solana/web3.js'; -import { start } from 'solana-bankrun'; -import { createTransferInstruction, InstructionType } from './instruction'; +import { describe, test } from "node:test"; +import { Keypair, LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction } from "@solana/web3.js"; +import { start } from "solana-bankrun"; +import { createTransferInstruction, InstructionType } from "./instruction"; -describe('transfer-sol', async () => { +describe("transfer-sol", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'transfer_sol_program', programId: PROGRAM_ID }], []); + const context = await start([{ name: "transfer_sol_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; @@ -14,10 +14,16 @@ describe('transfer-sol', async () => { const test2Recipient1 = Keypair.generate(); const test2Recipient2 = Keypair.generate(); - test('Transfer between accounts using the system program', async () => { - await getBalances(payer.publicKey, test1Recipient.publicKey, 'Beginning'); + test("Transfer between accounts using the system program", async () => { + await getBalances(payer.publicKey, test1Recipient.publicKey, "Beginning"); - const ix = createTransferInstruction(payer.publicKey, test1Recipient.publicKey, PROGRAM_ID, InstructionType.CpiTransfer, transferAmount); + const ix = createTransferInstruction( + payer.publicKey, + test1Recipient.publicKey, + PROGRAM_ID, + InstructionType.CpiTransfer, + transferAmount, + ); const tx = new Transaction(); const [blockhash, _] = await client.getLatestBlockhash(); @@ -26,10 +32,10 @@ describe('transfer-sol', async () => { await client.processTransaction(tx); - await getBalances(payer.publicKey, test1Recipient.publicKey, 'Resulting'); + await getBalances(payer.publicKey, test1Recipient.publicKey, "Resulting"); }); - test('Create two accounts for the following test', async () => { + test("Create two accounts for the following test", async () => { const ix = (pubkey: PublicKey) => { return SystemProgram.createAccount({ fromPubkey: payer.publicKey, @@ -43,13 +49,15 @@ describe('transfer-sol', async () => { const tx = new Transaction(); const [blockhash, _] = await client.getLatestBlockhash(); tx.recentBlockhash = blockhash; - tx.add(ix(test2Recipient1.publicKey)).add(ix(test2Recipient2.publicKey)).sign(payer, test2Recipient1, test2Recipient2); + tx.add(ix(test2Recipient1.publicKey)) + .add(ix(test2Recipient2.publicKey)) + .sign(payer, test2Recipient1, test2Recipient2); await client.processTransaction(tx); }); - test('Transfer between accounts using our program', async () => { - await getBalances(test2Recipient1.publicKey, test2Recipient2.publicKey, 'Beginning'); + test("Transfer between accounts using our program", async () => { + await getBalances(test2Recipient1.publicKey, test2Recipient2.publicKey, "Beginning"); const ix = createTransferInstruction( test2Recipient1.publicKey, @@ -66,7 +74,7 @@ describe('transfer-sol', async () => { await client.processTransaction(tx); - await getBalances(test2Recipient1.publicKey, test2Recipient2.publicKey, 'Resulting'); + await getBalances(test2Recipient1.publicKey, test2Recipient2.publicKey, "Resulting"); }); async function getBalances(payerPubkey: PublicKey, recipientPubkey: PublicKey, timeframe: string) { diff --git a/basics/transfer-sol/pinocchio/program/Cargo.toml b/basics/transfer-sol/pinocchio/program/Cargo.toml index aec50f992..570467285 100644 --- a/basics/transfer-sol/pinocchio/program/Cargo.toml +++ b/basics/transfer-sol/pinocchio/program/Cargo.toml @@ -18,7 +18,7 @@ custom-panic = [] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } [dev-dependencies] -litesvm = "0.8.1" +litesvm = "0.11.0" solana-instruction = "3.0.0" solana-keypair = "3.0.1" solana-native-token = "3.0.0" diff --git a/basics/transfer-sol/pinocchio/tests/test.ts b/basics/transfer-sol/pinocchio/tests/test.ts index 40dda0916..561e1d988 100644 --- a/basics/transfer-sol/pinocchio/tests/test.ts +++ b/basics/transfer-sol/pinocchio/tests/test.ts @@ -1,12 +1,4 @@ -import { describe, test } from "node:test"; -import { - Keypair, - LAMPORTS_PER_SOL, - PublicKey, - SystemProgram, - Transaction, -} from "@solana/web3.js"; -import { start } from "solana-bankrun"; +import { describe } from "node:test"; describe("transfer-sol", async () => { console.log("transfer-sol"); diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 000000000..6243cd87c --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,27 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.10/schema.json", + "files": { + "includes": ["**", "!**/Assets"] + }, + "formatter": { + // Matches more existing code, + // also 2 spaces is used by: Prettier, StandardJS, AirBnB, + // Google JavaScript Style Guide, node.js style guide, + // deno fmt, MDN, and idiomatic.js. + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 120 + }, + "javascript": { + "formatter": { + // Also to match Prettier, Google, etc. + // (though standard and AirBnB use single) + "quoteStyle": "double" + } + }, + "css": { + "parser": { + "tailwindDirectives": true + } + } +} diff --git a/compression/cnft-burn/anchor/Anchor.toml b/compression/cnft-burn/anchor/Anchor.toml index 8917c2a49..18ebc14e8 100644 --- a/compression/cnft-burn/anchor/Anchor.toml +++ b/compression/cnft-burn/anchor/Anchor.toml @@ -5,14 +5,14 @@ solana_version = "3.1.8" resolution = true skip-lint = false -[programs.devnet] -cnft_burn = "C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv" - -# [registry] section removed — no longer used in Anchor 1.0 +[programs.localnet] +cnft_burn = "HELUXAsLsF3wVoehtbcvQyUafUdMiFxbJG6MPiCRnzwm" [provider] -cluster = "devnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/cnft-burn.ts" + +[hooks] diff --git a/compression/cnft-burn/anchor/migrations/deploy.ts b/compression/cnft-burn/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/compression/cnft-burn/anchor/migrations/deploy.ts +++ b/compression/cnft-burn/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/compression/cnft-burn/anchor/package.json b/compression/cnft-burn/anchor/package.json index bfbe65494..125ffb7fe 100644 --- a/compression/cnft-burn/anchor/package.json +++ b/compression/cnft-burn/anchor/package.json @@ -1,27 +1,27 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@metaplex-foundation/js": "^0.19.4", - "@metaplex-foundation/mpl-bubblegum": "^0.7.0", - "@metaplex-foundation/mpl-token-metadata": "^2.12.0", - "@metaplex-foundation/umi": "^0.9.0", - "@solana/spl-account-compression": "^0.2.0", - "@solana/web3.js": "^1.98.4", - "axios": "^1.6.5" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@metaplex-foundation/js": "^0.19.4", + "@metaplex-foundation/mpl-bubblegum": "^0.7.0", + "@metaplex-foundation/mpl-token-metadata": "^2.12.0", + "@metaplex-foundation/umi": "^0.9.0", + "@solana/spl-account-compression": "^0.2.0", + "@solana/web3.js": "^1.98.4", + "axios": "^1.6.5" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/compression/cnft-burn/anchor/pnpm-lock.yaml b/compression/cnft-burn/anchor/pnpm-lock.yaml index d0ff87a05..e1b0c15c9 100644 --- a/compression/cnft-burn/anchor/pnpm-lock.yaml +++ b/compression/cnft-burn/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) '@metaplex-foundation/js': specifier: ^0.19.4 version: 0.19.5(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) @@ -60,18 +60,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.6': @@ -1656,16 +1656,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) bn.js: 5.2.2 @@ -1683,7 +1683,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.6': dependencies: diff --git a/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml b/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml index b63449767..e23472777 100644 --- a/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml +++ b/compression/cnft-burn/anchor/programs/cnft-burn/Cargo.toml @@ -20,13 +20,11 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" # mpl-bubblegum and spl-account-compression removed: they depend on solana-program 2.x # which is incompatible with Anchor 1.0's solana 3.x types. CPI calls are built manually # using raw invoke() with hardcoded program IDs and discriminators. borsh = "1" -ahash = "=0.8.7" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs b/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs index 58d303426..305951183 100644 --- a/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs +++ b/compression/cnft-burn/anchor/programs/cnft-burn/src/lib.rs @@ -5,7 +5,7 @@ use anchor_lang::solana_program::{ }; use borsh::BorshSerialize; -declare_id!("C6qxH8n6mZxrrbtMtYWYSp8JR8vkQ55X1o4EBg7twnMv"); +declare_id!("HELUXAsLsF3wVoehtbcvQyUafUdMiFxbJG6MPiCRnzwm"); /// mpl-bubblegum program ID (BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY) const MPL_BUBBLEGUM_ID: Pubkey = Pubkey::new_from_array([ diff --git a/compression/cnft-burn/anchor/tests/ReadApi/WrapperConnection.ts b/compression/cnft-burn/anchor/tests/ReadApi/WrapperConnection.ts index 0f20ec043..426f6ba6b 100644 --- a/compression/cnft-burn/anchor/tests/ReadApi/WrapperConnection.ts +++ b/compression/cnft-burn/anchor/tests/ReadApi/WrapperConnection.ts @@ -1,12 +1,12 @@ // local imports for the ReadApi types -import type { Metadata, Mint, NftOriginalEdition, SplTokenCurrency } from '@metaplex-foundation/js'; +import type { Metadata, Mint, NftOriginalEdition, SplTokenCurrency } from "@metaplex-foundation/js"; // import from the `@metaplex-foundation/js` -import { amount, MetaplexError, Pda, toBigNumber } from '@metaplex-foundation/js'; -import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from '@metaplex-foundation/mpl-bubblegum'; -import { TokenStandard } from '@metaplex-foundation/mpl-token-metadata'; -import { Connection, PublicKey } from '@solana/web3.js'; -import BN from 'bn.js'; +import { amount, MetaplexError, Pda, toBigNumber } from "@metaplex-foundation/js"; +import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from "@metaplex-foundation/mpl-bubblegum"; +import { TokenStandard } from "@metaplex-foundation/mpl-token-metadata"; +import { Connection, PublicKey } from "@solana/web3.js"; +import BN from "bn.js"; import type { GetAssetProofRpcInput, GetAssetProofRpcResponse, @@ -15,7 +15,7 @@ import type { GetAssetsByOwnerRpcInput, ReadApiAsset, ReadApiAssetList, -} from '@/ReadApi/types'; +} from "@/ReadApi/types"; type JsonRpcParams = { method: string; @@ -29,9 +29,9 @@ type JsonRpcOutput = { /** @group Errors */ export class ReadApiError extends MetaplexError { - readonly name: string = 'ReadApiError'; + readonly name: string = "ReadApiError"; constructor(message: string, cause?: Error) { - super(message, 'rpc', undefined, cause); + super(message, "rpc", undefined, cause); } } @@ -40,7 +40,7 @@ export class ReadApiError extends MetaplexError { */ export const toNftEditionFromReadApiAsset = (input: ReadApiAsset): NftOriginalEdition => { return { - model: 'nftEdition', + model: "nftEdition", isOriginal: true, address: new PublicKey(input.id), supply: toBigNumber(input.supply.print_current_supply), @@ -53,13 +53,13 @@ export const toNftEditionFromReadApiAsset = (input: ReadApiAsset): NftOriginalEd */ export const toMintFromReadApiAsset = (input: ReadApiAsset): Mint => { const currency: SplTokenCurrency = { - symbol: 'Token', + symbol: "Token", decimals: 0, - namespace: 'spl-token', + namespace: "spl-token", }; return { - model: 'mint', + model: "mint", address: new PublicKey(input.id), mintAuthorityAddress: new PublicKey(input.id), freezeAuthorityAddress: new PublicKey(input.id), @@ -74,26 +74,26 @@ export const toMintFromReadApiAsset = (input: ReadApiAsset): Mint => { * Convert a ReadApi asset's data into standard Metaplex `Metadata` */ export const toMetadataFromReadApiAsset = (input: ReadApiAsset): Metadata => { - const updateAuthority = input.authorities?.find((authority) => authority.scopes.includes('full')); + const updateAuthority = input.authorities?.find((authority) => authority.scopes.includes("full")); - const collection = input.grouping.find(({ group_key }) => group_key === 'collection'); + const collection = input.grouping.find(({ group_key }) => group_key === "collection"); return { - model: 'metadata', + model: "metadata", /** * We technically don't have a metadata address anymore. * So we are using the asset's id as the address */ address: Pda.find(BUBBLEGUM_PROGRAM_ID, [ - Buffer.from('asset', 'utf-8'), + Buffer.from("asset", "utf-8"), new PublicKey(input.compression.tree).toBuffer(), - Uint8Array.from(new BN(input.compression.leaf_id).toArray('le', 8)), + Uint8Array.from(new BN(input.compression.leaf_id).toArray("le", 8)), ]), mintAddress: new PublicKey(input.id), updateAuthorityAddress: new PublicKey(updateAuthority?.address), - name: input.content.metadata?.name ?? '', - symbol: input.content.metadata?.symbol ?? '', + name: input.content.metadata?.name ?? "", + symbol: input.content.metadata?.symbol ?? "", json: input.content.metadata, jsonLoaded: true, @@ -132,14 +132,14 @@ export class WrapperConnection extends Connection { jsonRpcParams: JsonRpcParams, ): Promise> => { const response = await fetch(this.rpcEndpoint, { - method: 'POST', + method: "POST", headers: { - 'Content-Type': 'application/json', + "Content-Type": "application/json", }, body: JSON.stringify({ - jsonrpc: '2.0', + jsonrpc: "2.0", method: jsonRpcParams.method, - id: jsonRpcParams.id ?? 'rpd-op-123', + id: jsonRpcParams.id ?? "rpd-op-123", params: jsonRpcParams.params, }), }); @@ -151,13 +151,13 @@ export class WrapperConnection extends Connection { // It is a PDA with the following seeds: ["asset", tree, leafIndex] async getAsset(assetId: PublicKey): Promise { const { result: asset } = await this.callReadApi({ - method: 'getAsset', + method: "getAsset", params: { id: assetId.toBase58(), }, }); - if (!asset) throw new ReadApiError('No asset returned'); + if (!asset) throw new ReadApiError("No asset returned"); return asset; } @@ -166,26 +166,35 @@ export class WrapperConnection extends Connection { // It is a PDA with the following seeds: ["asset", tree, leafIndex] async getAssetProof(assetId: PublicKey): Promise { const { result: proof } = await this.callReadApi({ - method: 'getAssetProof', + method: "getAssetProof", params: { id: assetId.toBase58(), }, }); - if (!proof) throw new ReadApiError('No asset proof returned'); + if (!proof) throw new ReadApiError("No asset proof returned"); return proof; } // - async getAssetsByGroup({ groupKey, groupValue, page, limit, sortBy, before, after }: GetAssetsByGroupRpcInput): Promise { + async getAssetsByGroup({ + groupKey, + groupValue, + page, + limit, + sortBy, + before, + after, + }: GetAssetsByGroupRpcInput): Promise { // `page` cannot be supplied with `before` or `after` - if (typeof page === 'number' && (before || after)) throw new ReadApiError('Pagination Error. Only one pagination parameter supported per query.'); + if (typeof page === "number" && (before || after)) + throw new ReadApiError("Pagination Error. Only one pagination parameter supported per query."); // a pagination method MUST be selected, but we are defaulting to using `page=0` const { result } = await this.callReadApi({ - method: 'getAssetsByGroup', + method: "getAssetsByGroup", params: { groupKey, groupValue, @@ -197,20 +206,28 @@ export class WrapperConnection extends Connection { }, }); - if (!result) throw new ReadApiError('No results returned'); + if (!result) throw new ReadApiError("No results returned"); return result; } // - async getAssetsByOwner({ ownerAddress, page, limit, sortBy, before, after }: GetAssetsByOwnerRpcInput): Promise { + async getAssetsByOwner({ + ownerAddress, + page, + limit, + sortBy, + before, + after, + }: GetAssetsByOwnerRpcInput): Promise { // `page` cannot be supplied with `before` or `after` - if (typeof page === 'number' && (before || after)) throw new ReadApiError('Pagination Error. Only one pagination parameter supported per query.'); + if (typeof page === "number" && (before || after)) + throw new ReadApiError("Pagination Error. Only one pagination parameter supported per query."); // a pagination method MUST be selected, but we are defaulting to using `page=0` const { result } = await this.callReadApi({ - method: 'getAssetsByOwner', + method: "getAssetsByOwner", params: { ownerAddress, after: after ?? null, @@ -221,7 +238,7 @@ export class WrapperConnection extends Connection { }, }); - if (!result) throw new ReadApiError('No results returned'); + if (!result) throw new ReadApiError("No results returned"); return result; } diff --git a/compression/cnft-burn/anchor/tests/ReadApi/types.ts b/compression/cnft-burn/anchor/tests/ReadApi/types.ts index a49e40fb0..b5c14b296 100644 --- a/compression/cnft-burn/anchor/tests/ReadApi/types.ts +++ b/compression/cnft-burn/anchor/tests/ReadApi/types.ts @@ -2,25 +2,25 @@ Types specific to the ReadApi */ -import type { Metadata, Option } from '@metaplex-foundation/js'; -import type { ConcurrentMerkleTreeAccount } from '@solana/spl-account-compression'; +import type { Metadata, Option } from "@metaplex-foundation/js"; +import type { ConcurrentMerkleTreeAccount } from "@solana/spl-account-compression"; export type ReadApiAssetInterface = - | 'V1_NFT' - | 'V1_PRINT' - | 'LEGACY_NFT' - | 'V2_NFT' - | 'FungibleAsset' - | 'Custom' - | 'Identity' - | 'Executable' - | 'ProgrammableNFT'; + | "V1_NFT" + | "V1_PRINT" + | "LEGACY_NFT" + | "V2_NFT" + | "FungibleAsset" + | "Custom" + | "Identity" + | "Executable" + | "ProgrammableNFT"; -export type ReadApiPropGroupKey = 'collection'; +export type ReadApiPropGroupKey = "collection"; -export type ReadApiPropSortBy = 'created' | 'updated' | 'recent_action'; +export type ReadApiPropSortBy = "created" | "updated" | "recent_action"; -export type ReadApiPropSortDirection = 'asc' | 'desc'; +export type ReadApiPropSortDirection = "asc" | "desc"; export type TransferNftCompressionParam = { ownership?: ReadApiOwnershipMetadata; @@ -36,7 +36,7 @@ export type ReadApiParamAssetSortBy = { export type ReadApiAssetContent = { json_uri: string; - metadata: Metadata['json']; + metadata: Metadata["json"]; }; export type ReadApiCompressionMetadata = { @@ -55,7 +55,7 @@ export type ReadApiOwnershipMetadata = { delegated: boolean; delegate: string | null; owner: string; - ownership_model: 'single' | 'token'; + ownership_model: "single" | "token"; }; export type ReadApiAssetSupplyMetadata = { @@ -74,7 +74,7 @@ export type ReadApiAssetGrouping = { group_value: string; }; -export type ReadApiAuthorityScope = 'full'; +export type ReadApiAuthorityScope = "full"; export type ReadApiAssetAuthority = { address: string; @@ -133,7 +133,7 @@ export type ReadApiAsset = { content: ReadApiAssetContent; royalty: ReadApiAssetRoyaltyMetadata; supply: ReadApiAssetSupplyMetadata; - creators: Metadata['creators']; + creators: Metadata["creators"]; grouping: Array; compression: ReadApiCompressionMetadata; }; diff --git a/compression/cnft-burn/anchor/tests/cnft-burn.ts b/compression/cnft-burn/anchor/tests/cnft-burn.ts index c2e9464ef..5bc3047c9 100644 --- a/compression/cnft-burn/anchor/tests/cnft-burn.ts +++ b/compression/cnft-burn/anchor/tests/cnft-burn.ts @@ -1,17 +1,17 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from '@metaplex-foundation/mpl-bubblegum'; -import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from '@solana/spl-account-compression'; -import type { CnftBurn } from '../target/types/cnft_burn'; -import { createAndMint } from './createAndMint'; -import { getcNFTsFromCollection } from './fetchNFTsByCollection'; -import { getAsset, getAssetProof } from './readApi'; -import { decode, mapProof } from './utils'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from "@metaplex-foundation/mpl-bubblegum"; +import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from "@solana/spl-account-compression"; +import type { CnftBurn } from "../target/types/cnft_burn"; +import { createAndMint } from "./createAndMint"; +import { getcNFTsFromCollection } from "./fetchNFTsByCollection"; +import { getAsset, getAssetProof } from "./readApi"; +import { decode, mapProof } from "./utils"; // Replace this with your custom RPC endpoint that supports cNFT indexing -const _RPC_PATH = 'https://api.devnet.solana.com'; +const _RPC_PATH = "https://api.devnet.solana.com"; -describe('cnft-burn', () => { +describe("cnft-burn", () => { // Configure the client to use the local cluster. anchor.setProvider(anchor.AnchorProvider.env()); @@ -23,20 +23,20 @@ describe('cnft-burn', () => { const MPL_BUBBLEGUM_PROGRAM_ID_KEY = new anchor.web3.PublicKey(BUBBLEGUM_PROGRAM_ID); // this is the assetId of the cNft you want to burn - let assetId = ''; + let assetId = ""; - it('Should create the tree and mint a cnft', async () => { + it("Should create the tree and mint a cnft", async () => { const { tree, collection } = await createAndMint(); if (!tree.treeAddress) { - throw new Error('Tree address not found'); + throw new Error("Tree address not found"); } treeAddress = tree.treeAddress; const fetchcNFTs = await getcNFTsFromCollection(collection.mint, payerWallet.publicKey.toString()); - console.log('fetchcNFTs', fetchcNFTs); + console.log("fetchcNFTs", fetchcNFTs); assetId = fetchcNFTs[0]; }); - it('Burn cNft!', async () => { + it("Burn cNft!", async () => { const asset = await getAsset(assetId); const proof = await getAssetProof(assetId); @@ -46,7 +46,10 @@ describe('cnft-burn', () => { const creatorHash = decode(asset.compression.creator_hash); const nonce = new anchor.BN(asset.compression.leaf_id); const index = asset.compression.leaf_id; - const [treeAuthority, _bump2] = anchor.web3.PublicKey.findProgramAddressSync([treeAddress.toBuffer()], MPL_BUBBLEGUM_PROGRAM_ID_KEY); + const [treeAuthority, _bump2] = anchor.web3.PublicKey.findProgramAddressSync( + [treeAddress.toBuffer()], + MPL_BUBBLEGUM_PROGRAM_ID_KEY, + ); const tx = await program.methods .burnCnft(root, dataHash, creatorHash, nonce, index) .accounts({ @@ -62,7 +65,7 @@ describe('cnft-burn', () => { .rpc({ skipPreflight: true, }); - console.log('Your transaction signature', tx); + console.log("Your transaction signature", tx); // here is a sample transaction signature on devnet // https://explorer.solana.com/tx/2MpeHi64pbWNY7BKBuhAp4yND5HdfQqNqkd8pu6F6meoSNUYRvxQgV5TC4w8BM8hUihB8G8TwBAaPRqS7pnN8Nu1?cluster=devnet }); diff --git a/compression/cnft-burn/anchor/tests/createAndMint.ts b/compression/cnft-burn/anchor/tests/createAndMint.ts index add25d3cd..7ef574b1d 100644 --- a/compression/cnft-burn/anchor/tests/createAndMint.ts +++ b/compression/cnft-burn/anchor/tests/createAndMint.ts @@ -12,18 +12,18 @@ less console logging and explanation of what is occurring */ -import * as anchor from '@anchor-lang/core'; -import { type MetadataArgs, TokenProgramVersion, TokenStandard } from '@metaplex-foundation/mpl-bubblegum'; -import type { CreateMetadataAccountArgsV3 } from '@metaplex-foundation/mpl-token-metadata'; -import type { ValidDepthSizePair } from '@solana/spl-account-compression'; -import { Keypair, LAMPORTS_PER_SOL } from '@solana/web3.js'; -import { RPC_PATH } from './cnft-burn'; +import * as anchor from "@anchor-lang/core"; +import { type MetadataArgs, TokenProgramVersion, TokenStandard } from "@metaplex-foundation/mpl-bubblegum"; +import type { CreateMetadataAccountArgsV3 } from "@metaplex-foundation/mpl-token-metadata"; +import type { ValidDepthSizePair } from "@solana/spl-account-compression"; +import { Keypair, LAMPORTS_PER_SOL } from "@solana/web3.js"; +import { RPC_PATH } from "./cnft-burn"; // local import of the connection wrapper, to help with using the ReadApi -import { WrapperConnection } from './ReadApi/WrapperConnection'; +import { WrapperConnection } from "./ReadApi/WrapperConnection"; // import custom helpers to mint compressed NFTs -import { createCollection, createTree, mintCompressedNFT } from './utils/compression'; +import { createCollection, createTree, mintCompressedNFT } from "./utils/compression"; // import custom helpers for demos -import { numberFormatter } from './utils/helpers'; +import { numberFormatter } from "./utils/helpers"; // define some reusable balance values for tracking let initBalance: number; @@ -39,7 +39,7 @@ export async function createAndMint() { const payerWallet = provider.wallet as anchor.Wallet; const payer = payerWallet.payer; - console.log('Payer address:', payer.publicKey.toBase58()); + console.log("Payer address:", payer.publicKey.toBase58()); ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -48,7 +48,7 @@ export async function createAndMint() { const CLUSTER_URL = RPC_PATH; // create a new rpc connection, using the ReadApi wrapper - const connection = new WrapperConnection(CLUSTER_URL, 'confirmed'); + const connection = new WrapperConnection(CLUSTER_URL, "confirmed"); // get the payer's starting balance (only used for demonstration purposes) initBalance = await connection.getBalance(payer.publicKey); @@ -84,10 +84,10 @@ export async function createAndMint() { // define the metadata to be used for creating the NFT collection const collectionMetadataV3: CreateMetadataAccountArgsV3 = { data: { - name: 'Test Burn', - symbol: 'TB', + name: "Test Burn", + symbol: "TB", // specific json metadata for the collection - uri: 'https://supersweetcollection.notarealurl/collection.json', + uri: "https://supersweetcollection.notarealurl/collection.json", sellerFeeBasisPoints: 100, creators: [ { @@ -111,10 +111,10 @@ export async function createAndMint() { */ const compressedNFTMetadata: MetadataArgs = { - name: 'Pratik test', + name: "Pratik test", symbol: collectionMetadataV3.data.symbol, // specific json metadata for each NFT - uri: 'https://bafkreies5r7b5eszpq5dgnw2brhjtlw7xtdtmsmoniebqehf37nv5rxajy.ipfs.nftstorage.link/', + uri: "https://bafkreies5r7b5eszpq5dgnw2brhjtlw7xtdtmsmoniebqehf37nv5rxajy.ipfs.nftstorage.link/", creators: [ { address: payer.publicKey, @@ -154,8 +154,8 @@ export async function createAndMint() { // fetch the payer's final balance balance = await connection.getBalance(payer.publicKey); - console.log('==============================='); - console.log('Total cost:', numberFormatter((initBalance - balance) / LAMPORTS_PER_SOL, true), 'SOL\n'); + console.log("==============================="); + console.log("Total cost:", numberFormatter((initBalance - balance) / LAMPORTS_PER_SOL, true), "SOL\n"); return { tree, collection }; } diff --git a/compression/cnft-burn/anchor/tests/fetchNFTsByCollection.ts b/compression/cnft-burn/anchor/tests/fetchNFTsByCollection.ts index e12114ee5..11fef4d0a 100644 --- a/compression/cnft-burn/anchor/tests/fetchNFTsByCollection.ts +++ b/compression/cnft-burn/anchor/tests/fetchNFTsByCollection.ts @@ -4,13 +4,13 @@ */ // imports from other libraries -import type { PublicKey } from '@solana/web3.js'; -import { RPC_PATH } from './cnft-burn'; +import type { PublicKey } from "@solana/web3.js"; +import { RPC_PATH } from "./cnft-burn"; // local import of the connection wrapper, to help with using the ReadApi -import { WrapperConnection } from './ReadApi/WrapperConnection'; +import { WrapperConnection } from "./ReadApi/WrapperConnection"; // import custom helpers for demos -import { printConsoleSeparator } from './utils/helpers'; +import { printConsoleSeparator } from "./utils/helpers"; export async function getcNFTsFromCollection(collectionMint: PublicKey, owner: string) { // load the stored PublicKeys for ease of use @@ -23,7 +23,7 @@ export async function getcNFTsFromCollection(collectionMint: PublicKey, owner: s // convert the locally saved keys to PublicKeys // const collectionMint: PublicKey = keys.collectionMint; - console.log('Collection mint:', collectionMint.toBase58()); + console.log("Collection mint:", collectionMint.toBase58()); ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -38,31 +38,31 @@ export async function getcNFTsFromCollection(collectionMint: PublicKey, owner: s const assets = await connection .getAssetsByGroup({ - groupKey: 'collection', + groupKey: "collection", groupValue: collectionMint.toBase58(), sortBy: { - sortBy: 'recent_action', - sortDirection: 'asc', + sortBy: "recent_action", + sortDirection: "asc", }, }) .then((res) => { - console.log('Total assets returned:', res.total); + console.log("Total assets returned:", res.total); // loop over each of the asset items in the collection const assetsIds = res.items?.map((asset) => { // display a spacer between each of the assets - console.log('\n==============================================='); + console.log("\n==============================================="); // print the entire asset record to the console // console.log(asset); // print some useful info - console.log('assetId:', asset.id); - console.log('ownership:', asset.ownership); - console.log('compression:', asset.compression); + console.log("assetId:", asset.id); + console.log("ownership:", asset.ownership); + console.log("compression:", asset.compression); if (asset.ownership?.owner === owner) { - console.log('assetId:', asset.id); + console.log("assetId:", asset.id); return asset.id; } return undefined; diff --git a/compression/cnft-burn/anchor/tests/readApi.ts b/compression/cnft-burn/anchor/tests/readApi.ts index 0ee382850..87b9c4e0e 100644 --- a/compression/cnft-burn/anchor/tests/readApi.ts +++ b/compression/cnft-burn/anchor/tests/readApi.ts @@ -2,20 +2,21 @@ // as it supports more readAPI functionality // this is just a subset of functions for quick availabiity -import axios from 'axios'; -import { RPC_PATH } from './cnft-burn'; +import axios from "axios"; +import { RPC_PATH } from "./cnft-burn"; // you might want to change that to your custom RPC endpoint as this endpoint is not going to work as it does not support DAS +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 export async function getAsset(assetId: any, rpcUrl = RPC_PATH): Promise { try { const axiosInstance = axios.create({ baseURL: rpcUrl, }); const response = await axiosInstance.post(rpcUrl, { - jsonrpc: '2.0', - method: 'getAsset', - id: 'rpd-op-123', + jsonrpc: "2.0", + method: "getAsset", + id: "rpd-op-123", params: { id: assetId, }, @@ -26,15 +27,16 @@ export async function getAsset(assetId: any, rpcUrl = RPC_PATH): Promise { } } +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 export async function getAssetProof(assetId: any, rpcUrl = RPC_PATH): Promise { try { const axiosInstance = axios.create({ baseURL: rpcUrl, }); const response = await axiosInstance.post(rpcUrl, { - jsonrpc: '2.0', - method: 'getAssetProof', - id: 'rpd-op-123', + jsonrpc: "2.0", + method: "getAssetProof", + id: "rpd-op-123", params: { id: assetId, }, diff --git a/compression/cnft-burn/anchor/tests/utils.ts b/compression/cnft-burn/anchor/tests/utils.ts index 43759dd36..70aa141d9 100644 --- a/compression/cnft-burn/anchor/tests/utils.ts +++ b/compression/cnft-burn/anchor/tests/utils.ts @@ -1,9 +1,9 @@ -import { type AccountMeta, Keypair, PublicKey } from '@solana/web3.js'; +import { type AccountMeta, Keypair, PublicKey } from "@solana/web3.js"; -import * as bs58 from 'bs58'; +import * as bs58 from "bs58"; export function loadWalletKey(keypairFile: string): Keypair { - const fs = require('node:fs'); + const fs = require("node:fs"); return Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(keypairFile).toString()))); } @@ -19,7 +19,7 @@ function bufferToArray(buffer: Buffer): number[] { } export const mapProof = (assetProof: { proof: string[] }): AccountMeta[] => { if (!assetProof.proof || assetProof.proof.length === 0) { - throw new Error('Proof is empty'); + throw new Error("Proof is empty"); } return assetProof.proof.map((node) => ({ pubkey: new PublicKey(node), diff --git a/compression/cnft-burn/anchor/tests/utils/compression.ts b/compression/cnft-burn/anchor/tests/utils/compression.ts index 3e3e7d01a..b91ee1170 100644 --- a/compression/cnft-burn/anchor/tests/utils/compression.ts +++ b/compression/cnft-burn/anchor/tests/utils/compression.ts @@ -5,20 +5,32 @@ import { createCreateTreeInstruction, createMintToCollectionV1Instruction, type MetadataArgs, -} from '@metaplex-foundation/mpl-bubblegum'; +} from "@metaplex-foundation/mpl-bubblegum"; import { type CreateMetadataAccountArgsV3, createCreateMasterEditionV3Instruction, createCreateMetadataAccountV3Instruction, createSetCollectionSizeInstruction, PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID, -} from '@metaplex-foundation/mpl-token-metadata'; -import { createAllocTreeIx, SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID, type ValidDepthSizePair } from '@solana/spl-account-compression'; -import { createAccount, createMint, mintTo, TOKEN_PROGRAM_ID } from '@solana/spl-token'; -import { type Connection, type Keypair, PublicKey, sendAndConfirmTransaction, Transaction, type TransactionInstruction } from '@solana/web3.js'; +} from "@metaplex-foundation/mpl-token-metadata"; +import { + createAllocTreeIx, + SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + SPL_NOOP_PROGRAM_ID, + type ValidDepthSizePair, +} from "@solana/spl-account-compression"; +import { createAccount, createMint, mintTo, TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { + type Connection, + type Keypair, + PublicKey, + sendAndConfirmTransaction, + Transaction, + type TransactionInstruction, +} from "@solana/web3.js"; // import local helper functions -import { explorerURL, extractSignatureFromFailedTransaction } from './helpers'; +import { explorerURL, extractSignatureFromFailedTransaction } from "./helpers"; /* Helper function to create a merkle tree on chain, including allocating @@ -31,16 +43,25 @@ export async function createTree( maxDepthSizePair: ValidDepthSizePair, canopyDepth = 0, ) { - console.log('Creating a new Merkle tree...'); - console.log('treeAddress:', treeKeypair.publicKey.toBase58()); + console.log("Creating a new Merkle tree..."); + console.log("treeAddress:", treeKeypair.publicKey.toBase58()); // derive the tree's authority (PDA), owned by Bubblegum - const [treeAuthority, _bump] = PublicKey.findProgramAddressSync([treeKeypair.publicKey.toBuffer()], BUBBLEGUM_PROGRAM_ID); - console.log('treeAuthority:', treeAuthority.toBase58()); + const [treeAuthority, _bump] = PublicKey.findProgramAddressSync( + [treeKeypair.publicKey.toBuffer()], + BUBBLEGUM_PROGRAM_ID, + ); + console.log("treeAuthority:", treeAuthority.toBase58()); // allocate the tree's account on chain with the `space` // NOTE: this will compute the space needed to store the tree on chain (and the lamports required to store it) - const allocTreeIx = await createAllocTreeIx(connection, treeKeypair.publicKey, payer.publicKey, maxDepthSizePair, canopyDepth); + const allocTreeIx = await createAllocTreeIx( + connection, + treeKeypair.publicKey, + payer.publicKey, + maxDepthSizePair, + canopyDepth, + ); // create the instruction to actually create the tree const createTreeIx = createCreateTreeInstruction( @@ -73,18 +94,19 @@ export async function createTree( // ensuring the `treeKeypair` PDA and the `payer` are BOTH signers [treeKeypair, payer], { - commitment: 'confirmed', + commitment: "confirmed", skipPreflight: true, }, ); - console.log('\nMerkle tree created successfully!'); + console.log("\nMerkle tree created successfully!"); console.log(explorerURL({ txSignature })); // return useful info return { treeAuthority, treeAddress: treeKeypair.publicKey }; + // biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 } catch (err: any) { - console.error('\nFailed to create merkle tree:', err); + console.error("\nFailed to create merkle tree:", err); // log a block explorer link for the failed transaction await extractSignatureFromFailedTransaction(connection, err); @@ -97,7 +119,11 @@ export async function createTree( * Create an NFT collection on-chain, using the regular Metaplex standards * with the `payer` as the authority */ -export async function createCollection(connection: Connection, payer: Keypair, metadataV3: CreateMetadataAccountArgsV3) { +export async function createCollection( + connection: Connection, + payer: Keypair, + metadataV3: CreateMetadataAccountArgsV3, +) { // create and initialize the SPL token mint console.log("Creating the collection's mint..."); const mint = await createMint( @@ -110,10 +136,10 @@ export async function createCollection(connection: Connection, payer: Keypair, m // decimals - use `0` for NFTs since they are non-fungible 0, ); - console.log('Mint address:', mint.toBase58()); + console.log("Mint address:", mint.toBase58()); // create the token account - console.log('Creating a token account...'); + console.log("Creating a token account..."); const tokenAccount = await createAccount( connection, payer, @@ -121,10 +147,10 @@ export async function createCollection(connection: Connection, payer: Keypair, m payer.publicKey, // undefined, undefined, ); - console.log('Token account:', tokenAccount.toBase58()); + console.log("Token account:", tokenAccount.toBase58()); // mint 1 token () - console.log('Minting 1 token for the collection...'); + console.log("Minting 1 token for the collection..."); const _mintSig = await mintTo( connection, payer, @@ -142,10 +168,10 @@ export async function createCollection(connection: Connection, payer: Keypair, m // derive the PDA for the metadata account const [metadataAccount, _bump] = PublicKey.findProgramAddressSync( - [Buffer.from('metadata', 'utf8'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()], + [Buffer.from("metadata", "utf8"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()], TOKEN_METADATA_PROGRAM_ID, ); - console.log('Metadata account:', metadataAccount.toBase58()); + console.log("Metadata account:", metadataAccount.toBase58()); // create an instruction to create the metadata account const createMetadataIx = createCreateMetadataAccountV3Instruction( @@ -163,10 +189,15 @@ export async function createCollection(connection: Connection, payer: Keypair, m // derive the PDA for the metadata account const [masterEditionAccount, _bump2] = PublicKey.findProgramAddressSync( - [Buffer.from('metadata', 'utf8'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer(), Buffer.from('edition', 'utf8')], + [ + Buffer.from("metadata", "utf8"), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + mint.toBuffer(), + Buffer.from("edition", "utf8"), + ], TOKEN_METADATA_PROGRAM_ID, ); - console.log('Master edition account:', masterEditionAccount.toBase58()); + console.log("Master edition account:", masterEditionAccount.toBase58()); // create an instruction to create the metadata account const createMasterEditionIx = createCreateMasterEditionV3Instruction( @@ -204,14 +235,14 @@ export async function createCollection(connection: Connection, payer: Keypair, m // send the transaction to the cluster const txSignature = await sendAndConfirmTransaction(connection, tx, [payer], { - commitment: 'confirmed', + commitment: "confirmed", skipPreflight: true, }); - console.log('\nCollection successfully created!'); + console.log("\nCollection successfully created!"); console.log(explorerURL({ txSignature })); } catch (err) { - console.error('\nFailed to create collection:', err); + console.error("\nFailed to create collection:", err); // log a block explorer link for the failed transaction await extractSignatureFromFailedTransaction(connection, err); @@ -242,7 +273,7 @@ export async function mintCompressedNFT( // derive a PDA (owned by Bubblegum) to act as the signer of the compressed minting const [bubblegumSigner, _bump2] = PublicKey.findProgramAddressSync( // `collection_cpi` is a custom prefix required by the Bubblegum program - [Buffer.from('collection_cpi', 'utf8')], + [Buffer.from("collection_cpi", "utf8")], BUBBLEGUM_PROGRAM_ID, ); @@ -269,8 +300,8 @@ export async function mintCompressedNFT( */ const computedDataHash = new PublicKey(computeDataHash(metadataArgs)).toBase58(); const computedCreatorHash = new PublicKey(computeCreatorHash(metadataArgs.creators)).toBase58(); - console.log('computedDataHash:', computedDataHash); - console.log('computedCreatorHash:', computedCreatorHash); + console.log("computedDataHash:", computedDataHash); + console.log("computedCreatorHash:", computedCreatorHash); /* Add a single mint to collection instruction @@ -326,16 +357,16 @@ export async function mintCompressedNFT( // send the transaction to the cluster const txSignature = await sendAndConfirmTransaction(connection, tx, [payer], { - commitment: 'confirmed', + commitment: "confirmed", skipPreflight: true, }); - console.log('\nSuccessfully minted the compressed NFT!'); + console.log("\nSuccessfully minted the compressed NFT!"); console.log(explorerURL({ txSignature })); return txSignature; } catch (err) { - console.error('\nFailed to mint compressed NFT:', err); + console.error("\nFailed to mint compressed NFT:", err); // log a block explorer link for the failed transaction await extractSignatureFromFailedTransaction(connection, err); diff --git a/compression/cnft-burn/anchor/tests/utils/helpers.ts b/compression/cnft-burn/anchor/tests/utils/helpers.ts index da6481353..14dcf3db8 100644 --- a/compression/cnft-burn/anchor/tests/utils/helpers.ts +++ b/compression/cnft-burn/anchor/tests/utils/helpers.ts @@ -1,11 +1,11 @@ -import fs from 'node:fs'; -import path from 'node:path'; -import { type Connection, Keypair, LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js'; +import fs from "node:fs"; +import path from "node:path"; +import { type Connection, Keypair, LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; // define some default locations -const DEFAULT_KEY_DIR_NAME = '.local_keys'; -const DEFAULT_PUBLIC_KEY_FILE = 'keys.json'; -const DEFAULT_DEMO_DATA_FILE = 'demo.json'; +const DEFAULT_KEY_DIR_NAME = ".local_keys"; +const DEFAULT_PUBLIC_KEY_FILE = "keys.json"; +const DEFAULT_DEMO_DATA_FILE = "demo.json"; /* Load locally stored PublicKey addresses @@ -13,20 +13,20 @@ const DEFAULT_DEMO_DATA_FILE = 'demo.json'; */ export function loadPublicKeysFromFile(absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFAULT_PUBLIC_KEY_FILE}`) { try { - if (!absPath) throw Error('No path provided'); - if (!fs.existsSync(absPath)) throw Error('File does not exist.'); + if (!absPath) throw Error("No path provided"); + if (!fs.existsSync(absPath)) throw Error("File does not exist."); // load the public keys from the file - const data = JSON.parse(fs.readFileSync(absPath, { encoding: 'utf-8' })) || {}; + const data = JSON.parse(fs.readFileSync(absPath, { encoding: "utf-8" })) || {}; // convert all loaded keyed values into valid public keys for (const [key, value] of Object.entries(data)) { - data[key] = new PublicKey(value as string) ?? ''; + data[key] = new PublicKey(value as string) ?? ""; } return data; } catch (_err) { - console.warn('Unable to load local file'); + console.warn("Unable to load local file"); } // always return an object return {}; @@ -35,23 +35,28 @@ export function loadPublicKeysFromFile(absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFA /* Locally save a demo data to the filesystem for later retrieval */ -export function saveDemoDataToFile(name: string, newData: any, absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFAULT_DEMO_DATA_FILE}`) { +export function saveDemoDataToFile( + name: string, + // biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 + newData: any, + absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFAULT_DEMO_DATA_FILE}`, +) { try { let data: object = {}; // fetch all the current values, when the storage file exists - if (fs.existsSync(absPath)) data = JSON.parse(fs.readFileSync(absPath, { encoding: 'utf-8' })) || {}; + if (fs.existsSync(absPath)) data = JSON.parse(fs.readFileSync(absPath, { encoding: "utf-8" })) || {}; data = { ...data, [name]: newData }; // actually save the data to the file fs.writeFileSync(absPath, JSON.stringify(data), { - encoding: 'utf-8', + encoding: "utf-8", }); return data; } catch (err) { - console.warn('Unable to save to file'); + console.warn("Unable to save to file"); console.warn(err); } @@ -62,23 +67,29 @@ export function saveDemoDataToFile(name: string, newData: any, absPath = `${DEFA /* Locally save a PublicKey addresses to the filesystem for later retrieval */ -export function savePublicKeyToFile(name: string, publicKey: PublicKey, absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFAULT_PUBLIC_KEY_FILE}`) { +export function savePublicKeyToFile( + name: string, + publicKey: PublicKey, + absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFAULT_PUBLIC_KEY_FILE}`, +) { try { // if (!absPath) throw Error("No path provided"); // if (!fs.existsSync(absPath)) throw Error("File does not exist."); // fetch all the current values + // biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 let data: any = loadPublicKeysFromFile(absPath); // convert all loaded keyed values from PublicKeys to strings for (const [key, value] of Object.entries(data)) { + // biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 data[key as any] = (value as PublicKey).toBase58(); } data = { ...data, [name]: publicKey.toBase58() }; // actually save the data to the file fs.writeFileSync(absPath, JSON.stringify(data), { - encoding: 'utf-8', + encoding: "utf-8", }); // reload the keys for sanity @@ -86,7 +97,7 @@ export function savePublicKeyToFile(name: string, publicKey: PublicKey, absPath return data; } catch (_err) { - console.warn('Unable to save to file'); + console.warn("Unable to save to file"); } // always return an object return {}; @@ -97,16 +108,16 @@ export function savePublicKeyToFile(name: string, publicKey: PublicKey, absPath */ export function loadKeypairFromFile(absPath: string) { try { - if (!absPath) throw Error('No path provided'); - if (!fs.existsSync(absPath)) throw Error('File does not exist.'); + if (!absPath) throw Error("No path provided"); + if (!fs.existsSync(absPath)) throw Error("File does not exist."); // load the keypair from the file - const keyfileBytes = JSON.parse(fs.readFileSync(absPath, { encoding: 'utf-8' })); + const keyfileBytes = JSON.parse(fs.readFileSync(absPath, { encoding: "utf-8" })); // parse the loaded secretKey into a valid keypair const keypair = Keypair.fromSecretKey(new Uint8Array(keyfileBytes)); return keypair; } catch (err) { - console.error('loadKeypairFromFile:', err); + console.error("loadKeypairFromFile:", err); throw err; } } @@ -126,7 +137,7 @@ export function saveKeypairToFile(keypair: Keypair, relativeFileName: string, di // write the `secretKey` value as a string fs.writeFileSync(fileName, `[${keypair.secretKey.toString()}]`, { - encoding: 'utf-8', + encoding: "utf-8", }); return fileName; @@ -148,7 +159,7 @@ export function loadOrGenerateKeypair(fileName: string, dirName: string = DEFAUL return keypair; } catch (err) { - console.error('loadOrGenerateKeypair:', err); + console.error("loadOrGenerateKeypair:", err); throw err; } } @@ -163,17 +174,17 @@ export function explorerURL({ }: { address?: string; txSignature?: string; - cluster?: 'devnet' | 'testnet' | 'mainnet' | 'mainnet-beta'; + cluster?: "devnet" | "testnet" | "mainnet" | "mainnet-beta"; }) { let baseUrl: string; // if (address) baseUrl = `https://explorer.solana.com/address/${address}`; else if (txSignature) baseUrl = `https://explorer.solana.com/tx/${txSignature}`; - else return '[unknown]'; + else return "[unknown]"; // auto append the desired search params const url = new URL(baseUrl); - url.searchParams.append('cluster', cluster || 'devnet'); + url.searchParams.append("cluster", cluster || "devnet"); return `${url.toString()}\n`; } @@ -191,7 +202,7 @@ export async function airdropOnLowBalance(connection: Connection, keypair: Keypa if (forceAirdrop === true || balance < MIN_BALANCE_TO_AIRDROP) { console.log(`Requesting airdrop of 1 SOL to ${keypair.publicKey.toBase58()}...`); await connection.requestAirdrop(keypair.publicKey, LAMPORTS_PER_SOL).then((sig) => { - console.log('Tx signature:', sig); + console.log("Tx signature:", sig); // balance = balance + LAMPORTS_PER_SOL; }); @@ -207,11 +218,14 @@ export async function airdropOnLowBalance(connection: Connection, keypair: Keypa /* Helper function to extract a transaction signature from a failed transaction's error message */ +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 export async function extractSignatureFromFailedTransaction(connection: Connection, err: any, fetchLogs?: boolean) { if (err?.signature) return err.signature; // extract the failed transaction's signature - const failedSig = new RegExp(/^((.*)?Error: )?(Transaction|Signature) ([A-Z0-9]{32,}) /gim).exec(err?.message?.toString())?.[4]; + const failedSig = new RegExp(/^((.*)?Error: )?(Transaction|Signature) ([A-Z0-9]{32,}) /gim).exec( + err?.message?.toString(), + )?.[4]; // ensure a signature was found if (failedSig) { @@ -223,14 +237,14 @@ export async function extractSignatureFromFailedTransaction(connection: Connecti }) .then((tx) => { console.log(`\n==== Transaction logs for ${failedSig} ====`); - console.log(explorerURL({ txSignature: failedSig }), ''); - console.log(tx?.meta?.logMessages ?? 'No log messages provided by RPC'); - console.log('==== END LOGS ====\n'); + console.log(explorerURL({ txSignature: failedSig }), ""); + console.log(tx?.meta?.logMessages ?? "No log messages provided by RPC"); + console.log("==== END LOGS ====\n"); }); else { - console.log('\n========================================'); + console.log("\n========================================"); console.log(explorerURL({ txSignature: failedSig })); - console.log('========================================\n'); + console.log("========================================\n"); } } @@ -255,7 +269,7 @@ export function numberFormatter(num: number, forceDecimals = false) { Display a separator in the console, with our without a message */ export function printConsoleSeparator(message?: string) { - console.log('\n==============================================='); - console.log('===============================================\n'); + console.log("\n==============================================="); + console.log("===============================================\n"); if (message) console.log(message); } diff --git a/compression/cnft-vault/anchor/Anchor.toml b/compression/cnft-vault/anchor/Anchor.toml index b3f3533c9..3b4bc9757 100644 --- a/compression/cnft-vault/anchor/Anchor.toml +++ b/compression/cnft-vault/anchor/Anchor.toml @@ -5,13 +5,13 @@ solana_version = "3.1.8" resolution = true skip-lint = false -[programs.devnet] +[programs.localnet] cnft_vault = "Fd4iwpPWaCU8BNwGQGtvvrcvG4Tfizq3RgLm8YLBJX6D" # [registry] section removed — no longer used in Anchor 1.0 [provider] -cluster = "devnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] diff --git a/compression/cnft-vault/anchor/package.json b/compression/cnft-vault/anchor/package.json index 4aeee309a..44d4c3f72 100644 --- a/compression/cnft-vault/anchor/package.json +++ b/compression/cnft-vault/anchor/package.json @@ -1,23 +1,23 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@metaplex-foundation/mpl-bubblegum": "^0.6.2", - "@solana/spl-account-compression": "^0.1.8", - "axios": "^1.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@metaplex-foundation/mpl-bubblegum": "^0.6.2", + "@solana/spl-account-compression": "^0.1.8", + "axios": "^1.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/compression/cnft-vault/anchor/pnpm-lock.yaml b/compression/cnft-vault/anchor/pnpm-lock.yaml index c9a18387c..300c303c5 100644 --- a/compression/cnft-vault/anchor/pnpm-lock.yaml +++ b/compression/cnft-vault/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@metaplex-foundation/mpl-bubblegum': specifier: ^0.6.2 version: 0.6.2(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -48,18 +48,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.6': @@ -1064,16 +1064,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -1091,7 +1091,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.6': dependencies: diff --git a/compression/cnft-vault/anchor/programs/cnft-vault/Cargo.toml b/compression/cnft-vault/anchor/programs/cnft-vault/Cargo.toml index 1cea9f3d6..c6eee7ea3 100644 --- a/compression/cnft-vault/anchor/programs/cnft-vault/Cargo.toml +++ b/compression/cnft-vault/anchor/programs/cnft-vault/Cargo.toml @@ -20,13 +20,11 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" # mpl-bubblegum and spl-account-compression removed: they depend on solana-program 2.x # which is incompatible with Anchor 1.0's solana 3.x types. CPI calls are built manually # using raw invoke_signed() with hardcoded program IDs and discriminators. borsh = "1" -ahash = "=0.8.7" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/compression/cnft-vault/anchor/tests/readAPI.ts b/compression/cnft-vault/anchor/tests/readAPI.ts index 070203f17..3db19e145 100644 --- a/compression/cnft-vault/anchor/tests/readAPI.ts +++ b/compression/cnft-vault/anchor/tests/readAPI.ts @@ -2,20 +2,21 @@ // as it supports more readAPI functionality // this is just a subset of functions for quick availabiity -import axios from 'axios'; +import axios from "axios"; // you might want to change that to your custom RPC -const RPC_PATH = 'https://rpc-devnet.aws.metaplex.com/'; +const RPC_PATH = "https://rpc-devnet.aws.metaplex.com/"; +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 export async function getAsset(assetId: any, rpcUrl = RPC_PATH): Promise { try { const axiosInstance = axios.create({ baseURL: rpcUrl, }); const response = await axiosInstance.post(rpcUrl, { - jsonrpc: '2.0', - method: 'getAsset', - id: 'rpd-op-123', + jsonrpc: "2.0", + method: "getAsset", + id: "rpd-op-123", params: { id: assetId, }, @@ -26,15 +27,16 @@ export async function getAsset(assetId: any, rpcUrl = RPC_PATH): Promise { } } +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 export async function getAssetProof(assetId: any, rpcUrl = RPC_PATH): Promise { try { const axiosInstance = axios.create({ baseURL: rpcUrl, }); const response = await axiosInstance.post(rpcUrl, { - jsonrpc: '2.0', - method: 'getAssetProof', - id: 'rpd-op-123', + jsonrpc: "2.0", + method: "getAssetProof", + id: "rpd-op-123", params: { id: assetId, }, diff --git a/compression/cnft-vault/anchor/tests/scripts/constants.ts b/compression/cnft-vault/anchor/tests/scripts/constants.ts index 2727afc0c..4ab604bfb 100644 --- a/compression/cnft-vault/anchor/tests/scripts/constants.ts +++ b/compression/cnft-vault/anchor/tests/scripts/constants.ts @@ -3,13 +3,9 @@ import type { CnftVault } from "../../target/types/cnft_vault"; import IDL from "../../target/types/cnft_vault"; import { loadWalletKey } from "../utils"; -export const connection = new anchor.web3.Connection( - "https://api.devnet.solana.com", -); +export const connection = new anchor.web3.Connection("https://api.devnet.solana.com"); export const keypair = loadWalletKey("~/.config/solana/id.json"); export const wallet = new anchor.Wallet(keypair); export const provider = new anchor.AnchorProvider(connection, wallet, {}); -export const programID = new anchor.web3.PublicKey( - "CNftyK7T8udPwYRzZUMWzbh79rKrz9a5GwV2wv7iEHpk", -); +export const programID = new anchor.web3.PublicKey("CNftyK7T8udPwYRzZUMWzbh79rKrz9a5GwV2wv7iEHpk"); export const program = new anchor.Program(IDL, programID, provider); diff --git a/compression/cnft-vault/anchor/tests/scripts/withdraw.ts b/compression/cnft-vault/anchor/tests/scripts/withdraw.ts index 133857d15..73144d840 100644 --- a/compression/cnft-vault/anchor/tests/scripts/withdraw.ts +++ b/compression/cnft-vault/anchor/tests/scripts/withdraw.ts @@ -1,21 +1,24 @@ -import * as anchor from '@anchor-lang/core'; -import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from '@metaplex-foundation/mpl-bubblegum'; -import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from '@solana/spl-account-compression'; -import { getAsset, getAssetProof } from '../readAPI'; -import { decode, mapProof } from '../utils'; +import * as anchor from "@anchor-lang/core"; +import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from "@metaplex-foundation/mpl-bubblegum"; +import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from "@solana/spl-account-compression"; +import { getAsset, getAssetProof } from "../readAPI"; +import { decode, mapProof } from "../utils"; -import { program, programID } from './constants'; +import { program, programID } from "./constants"; async function main() { - const [vaultPDA, _bump] = anchor.web3.PublicKey.findProgramAddressSync([Buffer.from('cNFT-vault', 'utf8')], programID); + const [vaultPDA, _bump] = anchor.web3.PublicKey.findProgramAddressSync( + [Buffer.from("cNFT-vault", "utf8")], + programID, + ); - const tree = new anchor.web3.PublicKey('trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B'); + const tree = new anchor.web3.PublicKey("trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B"); - const receiver = new anchor.web3.PublicKey('Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM'); + const receiver = new anchor.web3.PublicKey("Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM"); const [treeAuthority, _bump2] = anchor.web3.PublicKey.findProgramAddressSync([tree.toBuffer()], BUBBLEGUM_PROGRAM_ID); - const assetId = 'DGWU3mHenDerCvjkeDsKYEbsvXbWvqdo1bVoXy3dkeTd'; + const assetId = "DGWU3mHenDerCvjkeDsKYEbsvXbWvqdo1bVoXy3dkeTd"; const asset = await getAsset(assetId); // console.log(res) diff --git a/compression/cnft-vault/anchor/tests/scripts/withdrawTwo.ts b/compression/cnft-vault/anchor/tests/scripts/withdrawTwo.ts index 65785c658..e8f06cf2f 100644 --- a/compression/cnft-vault/anchor/tests/scripts/withdrawTwo.ts +++ b/compression/cnft-vault/anchor/tests/scripts/withdrawTwo.ts @@ -1,28 +1,37 @@ -import * as anchor from '@anchor-lang/core'; -import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from '@metaplex-foundation/mpl-bubblegum'; -import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from '@solana/spl-account-compression'; -import type { AccountMeta } from '@solana/web3.js'; -import { getAsset, getAssetProof } from '../readAPI'; -import { decode, mapProof } from '../utils'; +import * as anchor from "@anchor-lang/core"; +import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from "@metaplex-foundation/mpl-bubblegum"; +import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from "@solana/spl-account-compression"; +import type { AccountMeta } from "@solana/web3.js"; +import { getAsset, getAssetProof } from "../readAPI"; +import { decode, mapProof } from "../utils"; -import { program, programID } from './constants'; +import { program, programID } from "./constants"; async function main() { // TODO change all of these to your values - const assetId1 = 'DGWU3mHenDerCvjkeDsKYEbsvXbWvqdo1bVoXy3dkeTd'; - const assetId2 = '14JojSTdBZvP7f77rCxB3oQK78skTVD6DiXrXUL4objg'; //"D2CoMLCRfsfv1EAiNbaBHfoU1Sqf1964KXLGxEfyUwWo"; + const assetId1 = "DGWU3mHenDerCvjkeDsKYEbsvXbWvqdo1bVoXy3dkeTd"; + const assetId2 = "14JojSTdBZvP7f77rCxB3oQK78skTVD6DiXrXUL4objg"; //"D2CoMLCRfsfv1EAiNbaBHfoU1Sqf1964KXLGxEfyUwWo"; - const tree1 = new anchor.web3.PublicKey('trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B'); - const tree2 = new anchor.web3.PublicKey('Feywkti8LLBLfxhSGmYgzUBqpq89qehfB1SMTYV1zCu'); + const tree1 = new anchor.web3.PublicKey("trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B"); + const tree2 = new anchor.web3.PublicKey("Feywkti8LLBLfxhSGmYgzUBqpq89qehfB1SMTYV1zCu"); - const receiver1 = new anchor.web3.PublicKey('Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM'); - const receiver2 = new anchor.web3.PublicKey('Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM'); + const receiver1 = new anchor.web3.PublicKey("Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM"); + const receiver2 = new anchor.web3.PublicKey("Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM"); // --- - const [vaultPDA, _bump] = anchor.web3.PublicKey.findProgramAddressSync([Buffer.from('cNFT-vault', 'utf8')], programID); + const [vaultPDA, _bump] = anchor.web3.PublicKey.findProgramAddressSync( + [Buffer.from("cNFT-vault", "utf8")], + programID, + ); - const [treeAuthority1, _bump2] = anchor.web3.PublicKey.findProgramAddressSync([tree1.toBuffer()], BUBBLEGUM_PROGRAM_ID); - const [treeAuthority2, _bump3] = anchor.web3.PublicKey.findProgramAddressSync([tree2.toBuffer()], BUBBLEGUM_PROGRAM_ID); + const [treeAuthority1, _bump2] = anchor.web3.PublicKey.findProgramAddressSync( + [tree1.toBuffer()], + BUBBLEGUM_PROGRAM_ID, + ); + const [treeAuthority2, _bump3] = anchor.web3.PublicKey.findProgramAddressSync( + [tree2.toBuffer()], + BUBBLEGUM_PROGRAM_ID, + ); const asset1 = await getAsset(assetId1); const asset2 = await getAsset(assetId2); @@ -57,6 +66,7 @@ async function main() { console.log(tx); } +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 function getInstructionData(asset: any, proof: any): [number[], number[], number[], anchor.BN, number, number] { const root = decode(proof.root); const dataHash = decode(asset.compression.data_hash); diff --git a/compression/cnft-vault/anchor/tests/scripts/withdrawWithLookup.ts b/compression/cnft-vault/anchor/tests/scripts/withdrawWithLookup.ts index 20cf63fc4..f3f45097b 100644 --- a/compression/cnft-vault/anchor/tests/scripts/withdrawWithLookup.ts +++ b/compression/cnft-vault/anchor/tests/scripts/withdrawWithLookup.ts @@ -1,6 +1,6 @@ -import * as anchor from '@anchor-lang/core'; -import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from '@metaplex-foundation/mpl-bubblegum'; -import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from '@solana/spl-account-compression'; +import * as anchor from "@anchor-lang/core"; +import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from "@metaplex-foundation/mpl-bubblegum"; +import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from "@solana/spl-account-compression"; import { type AccountMeta, AddressLookupTableProgram, @@ -10,30 +10,39 @@ import { Transaction, TransactionMessage, VersionedTransaction, -} from '@solana/web3.js'; -import { getAsset, getAssetProof } from '../readAPI'; -import { decode, mapProof } from '../utils'; +} from "@solana/web3.js"; +import { getAsset, getAssetProof } from "../readAPI"; +import { decode, mapProof } from "../utils"; -import { connection, keypair, program, programID } from './constants'; +import { connection, keypair, program, programID } from "./constants"; async function main() { // TODO change all of these to your values - const assetId1 = 'DGWU3mHenDerCvjkeDsKYEbsvXbWvqdo1bVoXy3dkeTd'; - const assetId2 = '14JojSTdBZvP7f77rCxB3oQK78skTVD6DiXrXUL4objg'; //"D2CoMLCRfsfv1EAiNbaBHfoU1Sqf1964KXLGxEfyUwWo"; + const assetId1 = "DGWU3mHenDerCvjkeDsKYEbsvXbWvqdo1bVoXy3dkeTd"; + const assetId2 = "14JojSTdBZvP7f77rCxB3oQK78skTVD6DiXrXUL4objg"; //"D2CoMLCRfsfv1EAiNbaBHfoU1Sqf1964KXLGxEfyUwWo"; - const tree1 = new anchor.web3.PublicKey('trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B'); - const tree2 = new anchor.web3.PublicKey('trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B'); + const tree1 = new anchor.web3.PublicKey("trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B"); + const tree2 = new anchor.web3.PublicKey("trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B"); - const receiver1 = new anchor.web3.PublicKey('Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM'); - const receiver2 = new anchor.web3.PublicKey('Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM'); + const receiver1 = new anchor.web3.PublicKey("Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM"); + const receiver2 = new anchor.web3.PublicKey("Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM"); // --- const lookupTable = await createLookupTable(); - const [vaultPDA, _bump] = anchor.web3.PublicKey.findProgramAddressSync([Buffer.from('cNFT-vault', 'utf8')], programID); + const [vaultPDA, _bump] = anchor.web3.PublicKey.findProgramAddressSync( + [Buffer.from("cNFT-vault", "utf8")], + programID, + ); - const [treeAuthority1, _bump2] = anchor.web3.PublicKey.findProgramAddressSync([tree1.toBuffer()], BUBBLEGUM_PROGRAM_ID); - const [treeAuthority2, _bump3] = anchor.web3.PublicKey.findProgramAddressSync([tree2.toBuffer()], BUBBLEGUM_PROGRAM_ID); + const [treeAuthority1, _bump2] = anchor.web3.PublicKey.findProgramAddressSync( + [tree1.toBuffer()], + BUBBLEGUM_PROGRAM_ID, + ); + const [treeAuthority2, _bump3] = anchor.web3.PublicKey.findProgramAddressSync( + [tree2.toBuffer()], + BUBBLEGUM_PROGRAM_ID, + ); const asset1 = await getAsset(assetId1); const asset2 = await getAsset(assetId2); @@ -78,7 +87,7 @@ async function main() { const lookupTableAccount = await connection.getAddressLookupTable(lookupTable).then((res) => res.value); if (!lookupTableAccount) { - console.log('could not fetch ATL!'); + console.log("could not fetch ATL!"); return; } @@ -97,6 +106,7 @@ async function main() { console.log(txid); } +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 function getInstructionData(asset: any, proof: any): [number[], number[], number[], anchor.BN, number, number] { const root = decode(proof.root); const dataHash = decode(asset.compression.data_hash); @@ -121,10 +131,10 @@ async function extendLookupTable(lookupTableAddress: PublicKey, proofHashes: Pub tx.add(extendInstruction); const sx = await sendAndConfirmTransaction(connection, tx, [keypair], { - commitment: 'finalized', + commitment: "finalized", }); console.log(sx); - console.log('ALT extended!'); + console.log("ALT extended!"); } async function createLookupTable(): Promise { @@ -155,10 +165,10 @@ async function createLookupTable(): Promise { tx.add(lookupTableInst).add(extendInstruction); const sx = await sendAndConfirmTransaction(connection, tx, [keypair], { - commitment: 'finalized', + commitment: "finalized", }); console.log(sx); - console.log('ALT created'); + console.log("ALT created"); return lookupTableAddress; } diff --git a/compression/cnft-vault/anchor/tests/tests.ts b/compression/cnft-vault/anchor/tests/tests.ts index 28031d448..b378ecbbe 100644 --- a/compression/cnft-vault/anchor/tests/tests.ts +++ b/compression/cnft-vault/anchor/tests/tests.ts @@ -1,31 +1,37 @@ -import * as anchor from '@anchor-lang/core'; -import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from '@metaplex-foundation/mpl-bubblegum'; -import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from '@solana/spl-account-compression'; -import type { AccountMeta } from '@solana/web3.js'; -import { type CnftVault } from '../target/types/cnft_vault'; -import { getAsset, getAssetProof } from './readAPI'; -import { decode, mapProof } from './utils'; - -describe('cNFT Vault', () => { +import * as anchor from "@anchor-lang/core"; +import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from "@metaplex-foundation/mpl-bubblegum"; +import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from "@solana/spl-account-compression"; +import type { AccountMeta } from "@solana/web3.js"; +import type { CnftVault } from "../target/types/cnft_vault"; +import { getAsset, getAssetProof } from "./readAPI"; +import { decode, mapProof } from "./utils"; + +describe("cNFT Vault", () => { const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); const payer = provider.wallet as anchor.Wallet; const program = anchor.workspace.CnftVault as anchor.Program; - const [vaultPDA, _bump] = anchor.web3.PublicKey.findProgramAddressSync([Buffer.from('cNFT-vault', 'utf8')], program.programId); + const [vaultPDA, _bump] = anchor.web3.PublicKey.findProgramAddressSync( + [Buffer.from("cNFT-vault", "utf8")], + program.programId, + ); console.log(`Vault address: ${vaultPDA.toBase58()}`); - it('Withdraw a cNFT!', async () => { + it("Withdraw a cNFT!", async () => { // we expect the cNFT to already be in the vault // you can send it there (to vaultPDA) using any regular wallet // the cNFT has the following asset id - const assetId = 'DGWU3mHenDerCvjkeDsKYEbsvXbWvqdo1bVoXy3dkeTd'; // TODO + const assetId = "DGWU3mHenDerCvjkeDsKYEbsvXbWvqdo1bVoXy3dkeTd"; // TODO // and is compressed in the following tree - const tree = new anchor.web3.PublicKey('trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B'); // TODO + const tree = new anchor.web3.PublicKey("trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B"); // TODO const receiver = payer.publicKey; // you can define any pubkey as the receiver here - const [treeAuthority, _bump2] = anchor.web3.PublicKey.findProgramAddressSync([tree.toBuffer()], BUBBLEGUM_PROGRAM_ID); + const [treeAuthority, _bump2] = anchor.web3.PublicKey.findProgramAddressSync( + [tree.toBuffer()], + BUBBLEGUM_PROGRAM_ID, + ); const asset = await getAsset(assetId); @@ -53,24 +59,30 @@ describe('cNFT Vault', () => { .remainingAccounts(proofPathAsAccounts) .rpc(); - console.log('Success!'); + console.log("Success!"); console.log(` Tx Signature: ${sx}`); }); - it('Withdraw two cNFTs!', async () => { + it("Withdraw two cNFTs!", async () => { // TODO change all of these to your values - const assetId1 = 'DGWU3mHenDerCvjkeDsKYEbsvXbWvqdo1bVoXy3dkeTd'; - const assetId2 = '14JojSTdBZvP7f77rCxB3oQK78skTVD6DiXrXUL4objg'; + const assetId1 = "DGWU3mHenDerCvjkeDsKYEbsvXbWvqdo1bVoXy3dkeTd"; + const assetId2 = "14JojSTdBZvP7f77rCxB3oQK78skTVD6DiXrXUL4objg"; - const tree1 = new anchor.web3.PublicKey('trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B'); - const tree2 = new anchor.web3.PublicKey('Feywkti8LLBLfxhSGmYgzUBqpq89qehfB1SMTYV1zCu'); + const tree1 = new anchor.web3.PublicKey("trezdkTFPKyj4gE9LAJYPpxn8AYVCvM7Mc4JkTb9X5B"); + const tree2 = new anchor.web3.PublicKey("Feywkti8LLBLfxhSGmYgzUBqpq89qehfB1SMTYV1zCu"); - const receiver1 = new anchor.web3.PublicKey('Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM'); - const receiver2 = new anchor.web3.PublicKey('Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM'); + const receiver1 = new anchor.web3.PublicKey("Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM"); + const receiver2 = new anchor.web3.PublicKey("Andys9wuoMdUeRiZLgRS5aJwYNFv4Ut6qQi8PNDTAPEM"); // --- - const [treeAuthority1, _bump2] = anchor.web3.PublicKey.findProgramAddressSync([tree1.toBuffer()], BUBBLEGUM_PROGRAM_ID); - const [treeAuthority2, _bump3] = anchor.web3.PublicKey.findProgramAddressSync([tree2.toBuffer()], BUBBLEGUM_PROGRAM_ID); + const [treeAuthority1, _bump2] = anchor.web3.PublicKey.findProgramAddressSync( + [tree1.toBuffer()], + BUBBLEGUM_PROGRAM_ID, + ); + const [treeAuthority2, _bump3] = anchor.web3.PublicKey.findProgramAddressSync( + [tree2.toBuffer()], + BUBBLEGUM_PROGRAM_ID, + ); const asset1 = await getAsset(assetId1); const asset2 = await getAsset(assetId2); @@ -102,11 +114,12 @@ describe('cNFT Vault', () => { }) .remainingAccounts(remainingAccounts) .rpc(); - console.log('Success!'); + console.log("Success!"); console.log(` Tx Signature: ${sx}`); }); }); +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 function getInstructionData(asset: any, proof: any): [number[], number[], number[], anchor.BN, number, number] { const root = decode(proof.root); const dataHash = decode(asset.compression.data_hash); diff --git a/compression/cnft-vault/anchor/tests/utils.ts b/compression/cnft-vault/anchor/tests/utils.ts index 43759dd36..70aa141d9 100644 --- a/compression/cnft-vault/anchor/tests/utils.ts +++ b/compression/cnft-vault/anchor/tests/utils.ts @@ -1,9 +1,9 @@ -import { type AccountMeta, Keypair, PublicKey } from '@solana/web3.js'; +import { type AccountMeta, Keypair, PublicKey } from "@solana/web3.js"; -import * as bs58 from 'bs58'; +import * as bs58 from "bs58"; export function loadWalletKey(keypairFile: string): Keypair { - const fs = require('node:fs'); + const fs = require("node:fs"); return Keypair.fromSecretKey(new Uint8Array(JSON.parse(fs.readFileSync(keypairFile).toString()))); } @@ -19,7 +19,7 @@ function bufferToArray(buffer: Buffer): number[] { } export const mapProof = (assetProof: { proof: string[] }): AccountMeta[] => { if (!assetProof.proof || assetProof.proof.length === 0) { - throw new Error('Proof is empty'); + throw new Error("Proof is empty"); } return assetProof.proof.map((node) => ({ pubkey: new PublicKey(node), diff --git a/compression/cutils/anchor/Anchor.toml b/compression/cutils/anchor/Anchor.toml index 1e5158a3c..20bad88e1 100644 --- a/compression/cutils/anchor/Anchor.toml +++ b/compression/cutils/anchor/Anchor.toml @@ -5,14 +5,14 @@ solana_version = "3.1.8" resolution = true skip-lint = false -[programs.devnet] +[programs.localnet] cutils = "BuFyrgRYzg2nPhqYrxZ7d9uYUs4VXtxH71U8EcoAfTQZ" # [registry] section removed — no longer used in Anchor 1.0 [provider] -cluster = "devnet" -wallet = "~/.config/solana/test.json" +cluster = "localnet" +wallet = "~/.config/solana/id.json" [scripts] test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" diff --git a/compression/cutils/anchor/package.json b/compression/cutils/anchor/package.json index d0a67bfdb..3ccfe05d8 100644 --- a/compression/cutils/anchor/package.json +++ b/compression/cutils/anchor/package.json @@ -1,27 +1,27 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@metaplex-foundation/js": "^0.19.4", - "@metaplex-foundation/mpl-bubblegum": "^0.7.0", - "@solana/spl-account-compression": "^0.1.8", - "@solana/spl-token": "^0.3.8", - "@solana/web3.js": "^1.98.4", - "axios": "^1.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "ts-node": "^10.9.1", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@metaplex-foundation/js": "^0.19.4", + "@metaplex-foundation/mpl-bubblegum": "^0.7.0", + "@solana/spl-account-compression": "^0.1.8", + "@solana/spl-token": "^0.3.8", + "@solana/web3.js": "^1.98.4", + "axios": "^1.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "ts-node": "^10.9.1", + "typescript": "^5.3.3" + } } diff --git a/compression/cutils/anchor/pnpm-lock.yaml b/compression/cutils/anchor/pnpm-lock.yaml index 1d5ffad49..138b25f84 100644 --- a/compression/cutils/anchor/pnpm-lock.yaml +++ b/compression/cutils/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) '@metaplex-foundation/js': specifier: ^0.19.4 version: 0.19.5(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) @@ -60,18 +60,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.6': @@ -1692,16 +1692,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) bn.js: 5.2.2 @@ -1719,7 +1719,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.6': dependencies: diff --git a/compression/cutils/anchor/programs/cutils/Cargo.toml b/compression/cutils/anchor/programs/cutils/Cargo.toml index c2b4aa431..3f5241e81 100644 --- a/compression/cutils/anchor/programs/cutils/Cargo.toml +++ b/compression/cutils/anchor/programs/cutils/Cargo.toml @@ -20,8 +20,7 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" +anchor-lang = "1.0.0" # mpl-bubblegum and spl-account-compression removed: they depend on solana-program 2.x # which is incompatible with Anchor 1.0's solana 3.x types. CPI calls are built manually # using raw invoke() with hardcoded program IDs and discriminators. Bubblegum types @@ -29,7 +28,6 @@ anchor-lang = "1.0.0-rc.5" borsh = "1" sha2 = "0.10" sha3 = "0.10" -ahash = "=0.8.7" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/compression/cutils/anchor/programs/cutils/src/actions/mint.rs b/compression/cutils/anchor/programs/cutils/src/actions/mint.rs index f8b879193..a1a179034 100644 --- a/compression/cutils/anchor/programs/cutils/src/actions/mint.rs +++ b/compression/cutils/anchor/programs/cutils/src/actions/mint.rs @@ -67,7 +67,7 @@ pub struct Mint<'info> { #[derive(Clone, AnchorSerialize, AnchorDeserialize)] pub struct MintParams { - uri: String, + pub uri: String, } impl Mint<'_> { diff --git a/compression/cutils/anchor/programs/cutils/src/actions/verify.rs b/compression/cutils/anchor/programs/cutils/src/actions/verify.rs index 87f282b2e..7117f71bf 100644 --- a/compression/cutils/anchor/programs/cutils/src/actions/verify.rs +++ b/compression/cutils/anchor/programs/cutils/src/actions/verify.rs @@ -18,11 +18,11 @@ pub struct Verify<'info> { #[derive(Clone, AnchorSerialize, AnchorDeserialize)] pub struct VerifyParams { - root: [u8; 32], - data_hash: [u8; 32], - creator_hash: [u8; 32], - nonce: u64, - index: u32, + pub root: [u8; 32], + pub data_hash: [u8; 32], + pub creator_hash: [u8; 32], + pub nonce: u64, + pub index: u32, } impl Verify<'_> { diff --git a/compression/cutils/anchor/tests/setup.ts b/compression/cutils/anchor/tests/setup.ts index d17721ff7..21b0de775 100644 --- a/compression/cutils/anchor/tests/setup.ts +++ b/compression/cutils/anchor/tests/setup.ts @@ -1,19 +1,19 @@ -import type { CreateMetadataAccountArgsV3 } from '@metaplex-foundation/mpl-token-metadata'; -import type { ValidDepthSizePair } from '@solana/spl-account-compression'; -import { Connection, Keypair } from '@solana/web3.js'; -import { createCollection, createTree } from './utils/compression'; -import { loadOrGenerateKeypair, savePublicKeyToFile } from './utils/helpers'; +import type { CreateMetadataAccountArgsV3 } from "@metaplex-foundation/mpl-token-metadata"; +import type { ValidDepthSizePair } from "@solana/spl-account-compression"; +import { Connection, Keypair } from "@solana/web3.js"; +import { createCollection, createTree } from "./utils/compression"; +import { loadOrGenerateKeypair, savePublicKeyToFile } from "./utils/helpers"; async function _setup() { - const rpc = 'https://api.devnet.solana.com'; - const connection = new Connection(rpc, 'confirmed'); + const rpc = "https://api.devnet.solana.com"; + const connection = new Connection(rpc, "confirmed"); // Collection auth and treeCreator - const payer = loadOrGenerateKeypair('payer'); + const payer = loadOrGenerateKeypair("payer"); // Airdrop await connection.requestAirdrop(payer.publicKey, 1 * 10 ** 9); - console.log('Payer address:', payer.publicKey.toBase58()); + console.log("Payer address:", payer.publicKey.toBase58()); const treeKeypair = Keypair.generate(); const maxDepthSizePair: ValidDepthSizePair = { @@ -24,14 +24,14 @@ async function _setup() { const tree = await createTree(connection, payer, treeKeypair, maxDepthSizePair, canopyDepth); // locally save the addresses for demo - savePublicKeyToFile('treeAddress', tree.treeAddress); + savePublicKeyToFile("treeAddress", tree.treeAddress); const collectionMetadataV3: CreateMetadataAccountArgsV3 = { data: { - name: 'Super Sweet NFT Collection', - symbol: 'SSNC', + name: "Super Sweet NFT Collection", + symbol: "SSNC", // specific json metadata for the collection - uri: 'https://supersweetcollection.notarealurl/collection.json', + uri: "https://supersweetcollection.notarealurl/collection.json", sellerFeeBasisPoints: 100, creators: [ { @@ -51,7 +51,7 @@ async function _setup() { const collection = await createCollection(connection, payer, collectionMetadataV3); // locally save the addresses for the demo - savePublicKeyToFile('collectionMint', collection.mint); + savePublicKeyToFile("collectionMint", collection.mint); } // setup() diff --git a/compression/cutils/anchor/tests/tests.ts b/compression/cutils/anchor/tests/tests.ts index ca62754f9..4acbea02c 100644 --- a/compression/cutils/anchor/tests/tests.ts +++ b/compression/cutils/anchor/tests/tests.ts @@ -1,10 +1,10 @@ -import * as anchor from '@anchor-lang/core'; -import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from '@metaplex-foundation/mpl-bubblegum/dist/src/generated'; -import type { Cutils } from '../target/types/cutils'; -import { loadOrGenerateKeypair, loadPublicKeysFromFile } from './utils/helpers'; -import { getAccounts } from './utils/utils'; +import * as anchor from "@anchor-lang/core"; +import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from "@metaplex-foundation/mpl-bubblegum/dist/src/generated"; +import type { Cutils } from "../target/types/cutils"; +import { loadOrGenerateKeypair, loadPublicKeysFromFile } from "./utils/helpers"; +import { getAccounts } from "./utils/utils"; -describe('cutils', () => { +describe("cutils", () => { const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); @@ -12,16 +12,16 @@ describe('cutils', () => { // NFT metadata pointer // TODO change - const uri = 'https://arweave.net/nVRvZDaOk5YAdr4ZBEeMjOVhynuv8P3vywvuN5sYSPo'; + const uri = "https://arweave.net/nVRvZDaOk5YAdr4ZBEeMjOVhynuv8P3vywvuN5sYSPo"; - const payer = loadOrGenerateKeypair('payer'); + const payer = loadOrGenerateKeypair("payer"); // cNFT receiver - const testWallet = loadOrGenerateKeypair('testWallet'); + const testWallet = loadOrGenerateKeypair("testWallet"); const { collectionMint, treeAddress } = loadPublicKeysFromFile(); - it('Mint!', async () => { + it("Mint!", async () => { const tx = await program.methods .mint({ uri }) .accounts({ diff --git a/compression/cutils/anchor/tests/utils/compression.ts b/compression/cutils/anchor/tests/utils/compression.ts index 87c710718..77eff4022 100644 --- a/compression/cutils/anchor/tests/utils/compression.ts +++ b/compression/cutils/anchor/tests/utils/compression.ts @@ -5,20 +5,32 @@ import { createCreateTreeInstruction, createMintToCollectionV1Instruction, type MetadataArgs, -} from '@metaplex-foundation/mpl-bubblegum'; +} from "@metaplex-foundation/mpl-bubblegum"; import { type CreateMetadataAccountArgsV3, createCreateMasterEditionV3Instruction, createCreateMetadataAccountV3Instruction, createSetCollectionSizeInstruction, PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID, -} from '@metaplex-foundation/mpl-token-metadata'; -import { createAllocTreeIx, SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID, type ValidDepthSizePair } from '@solana/spl-account-compression'; -import { createAccount, createMint, mintTo, TOKEN_PROGRAM_ID } from '@solana/spl-token'; -import { type Connection, type Keypair, PublicKey, sendAndConfirmTransaction, Transaction, type TransactionInstruction } from '@solana/web3.js'; +} from "@metaplex-foundation/mpl-token-metadata"; +import { + createAllocTreeIx, + SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, + SPL_NOOP_PROGRAM_ID, + type ValidDepthSizePair, +} from "@solana/spl-account-compression"; +import { createAccount, createMint, mintTo, TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { + type Connection, + type Keypair, + PublicKey, + sendAndConfirmTransaction, + Transaction, + type TransactionInstruction, +} from "@solana/web3.js"; // import local helper functions -import { explorerURL, extractSignatureFromFailedTransaction } from './helpers'; +import { explorerURL, extractSignatureFromFailedTransaction } from "./helpers"; /* Helper function to create a merkle tree on chain, including allocating @@ -31,16 +43,25 @@ export async function createTree( maxDepthSizePair: ValidDepthSizePair, canopyDepth = 0, ) { - console.log('Creating a new Merkle tree...'); - console.log('treeAddress:', treeKeypair.publicKey.toBase58()); + console.log("Creating a new Merkle tree..."); + console.log("treeAddress:", treeKeypair.publicKey.toBase58()); // derive the tree's authority (PDA), owned by Bubblegum - const [treeAuthority, _bump] = PublicKey.findProgramAddressSync([treeKeypair.publicKey.toBuffer()], BUBBLEGUM_PROGRAM_ID); - console.log('treeAuthority:', treeAuthority.toBase58()); + const [treeAuthority, _bump] = PublicKey.findProgramAddressSync( + [treeKeypair.publicKey.toBuffer()], + BUBBLEGUM_PROGRAM_ID, + ); + console.log("treeAuthority:", treeAuthority.toBase58()); // allocate the tree's account on chain with the `space` // NOTE: this will compute the space needed to store the tree on chain (and the lamports required to store it) - const allocTreeIx = await createAllocTreeIx(connection, treeKeypair.publicKey, payer.publicKey, maxDepthSizePair, canopyDepth); + const allocTreeIx = await createAllocTreeIx( + connection, + treeKeypair.publicKey, + payer.publicKey, + maxDepthSizePair, + canopyDepth, + ); // create the instruction to actually create the tree const createTreeIx = createCreateTreeInstruction( @@ -65,7 +86,7 @@ export async function createTree( // create and send the transaction to initialize the tree const tx = new Transaction().add(allocTreeIx).add(createTreeIx); tx.feePayer = payer.publicKey; - console.log('tx'); + console.log("tx"); // send the transaction const txSignature = await sendAndConfirmTransaction( @@ -74,18 +95,19 @@ export async function createTree( // ensuring the `treeKeypair` PDA and the `payer` are BOTH signers [treeKeypair, payer], { - commitment: 'confirmed', + commitment: "confirmed", skipPreflight: true, }, ); - console.log('\nMerkle tree created successfully!'); + console.log("\nMerkle tree created successfully!"); console.log(explorerURL({ txSignature })); // return useful info return { treeAuthority, treeAddress: treeKeypair.publicKey }; + // biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 } catch (err: any) { - console.error('\nFailed to create merkle tree:', err); + console.error("\nFailed to create merkle tree:", err); // log a block explorer link for the failed transaction await extractSignatureFromFailedTransaction(connection, err); @@ -98,7 +120,11 @@ export async function createTree( * Create an NFT collection on-chain, using the regular Metaplex standards * with the `payer` as the authority */ -export async function createCollection(connection: Connection, payer: Keypair, metadataV3: CreateMetadataAccountArgsV3) { +export async function createCollection( + connection: Connection, + payer: Keypair, + metadataV3: CreateMetadataAccountArgsV3, +) { // create and initialize the SPL token mint console.log("Creating the collection's mint..."); const mint = await createMint( @@ -111,10 +137,10 @@ export async function createCollection(connection: Connection, payer: Keypair, m // decimals - use `0` for NFTs since they are non-fungible 0, ); - console.log('Mint address:', mint.toBase58()); + console.log("Mint address:", mint.toBase58()); // create the token account - console.log('Creating a token account...'); + console.log("Creating a token account..."); const tokenAccount = await createAccount( connection, payer, @@ -122,10 +148,10 @@ export async function createCollection(connection: Connection, payer: Keypair, m payer.publicKey, // undefined, undefined, ); - console.log('Token account:', tokenAccount.toBase58()); + console.log("Token account:", tokenAccount.toBase58()); // mint 1 token () - console.log('Minting 1 token for the collection...'); + console.log("Minting 1 token for the collection..."); const _mintSig = await mintTo( connection, payer, @@ -143,10 +169,10 @@ export async function createCollection(connection: Connection, payer: Keypair, m // derive the PDA for the metadata account const [metadataAccount, _bump] = PublicKey.findProgramAddressSync( - [Buffer.from('metadata', 'utf8'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()], + [Buffer.from("metadata", "utf8"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()], TOKEN_METADATA_PROGRAM_ID, ); - console.log('Metadata account:', metadataAccount.toBase58()); + console.log("Metadata account:", metadataAccount.toBase58()); // create an instruction to create the metadata account const createMetadataIx = createCreateMetadataAccountV3Instruction( @@ -164,10 +190,15 @@ export async function createCollection(connection: Connection, payer: Keypair, m // derive the PDA for the metadata account const [masterEditionAccount, _bump2] = PublicKey.findProgramAddressSync( - [Buffer.from('metadata', 'utf8'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer(), Buffer.from('edition', 'utf8')], + [ + Buffer.from("metadata", "utf8"), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + mint.toBuffer(), + Buffer.from("edition", "utf8"), + ], TOKEN_METADATA_PROGRAM_ID, ); - console.log('Master edition account:', masterEditionAccount.toBase58()); + console.log("Master edition account:", masterEditionAccount.toBase58()); // create an instruction to create the metadata account const createMasterEditionIx = createCreateMasterEditionV3Instruction( @@ -205,14 +236,14 @@ export async function createCollection(connection: Connection, payer: Keypair, m // send the transaction to the cluster const txSignature = await sendAndConfirmTransaction(connection, tx, [payer], { - commitment: 'confirmed', + commitment: "confirmed", skipPreflight: true, }); - console.log('\nCollection successfully created!'); + console.log("\nCollection successfully created!"); console.log(explorerURL({ txSignature })); } catch (err) { - console.error('\nFailed to create collection:', err); + console.error("\nFailed to create collection:", err); // log a block explorer link for the failed transaction await extractSignatureFromFailedTransaction(connection, err); @@ -243,7 +274,7 @@ export async function mintCompressedNFT( // derive a PDA (owned by Bubblegum) to act as the signer of the compressed minting const [bubblegumSigner, _bump2] = PublicKey.findProgramAddressSync( // `collection_cpi` is a custom prefix required by the Bubblegum program - [Buffer.from('collection_cpi', 'utf8')], + [Buffer.from("collection_cpi", "utf8")], BUBBLEGUM_PROGRAM_ID, ); @@ -270,8 +301,8 @@ export async function mintCompressedNFT( */ const computedDataHash = new PublicKey(computeDataHash(metadataArgs)).toBase58(); const computedCreatorHash = new PublicKey(computeCreatorHash(metadataArgs.creators)).toBase58(); - console.log('computedDataHash:', computedDataHash); - console.log('computedCreatorHash:', computedCreatorHash); + console.log("computedDataHash:", computedDataHash); + console.log("computedCreatorHash:", computedCreatorHash); /* Add a single mint to collection instruction @@ -327,16 +358,16 @@ export async function mintCompressedNFT( // send the transaction to the cluster const txSignature = await sendAndConfirmTransaction(connection, tx, [payer], { - commitment: 'confirmed', + commitment: "confirmed", skipPreflight: true, }); - console.log('\nSuccessfully minted the compressed NFT!'); + console.log("\nSuccessfully minted the compressed NFT!"); console.log(explorerURL({ txSignature })); return txSignature; } catch (err) { - console.error('\nFailed to mint compressed NFT:', err); + console.error("\nFailed to mint compressed NFT:", err); // log a block explorer link for the failed transaction await extractSignatureFromFailedTransaction(connection, err); diff --git a/compression/cutils/anchor/tests/utils/helpers.ts b/compression/cutils/anchor/tests/utils/helpers.ts index ffe3ad8c4..a793000c9 100644 --- a/compression/cutils/anchor/tests/utils/helpers.ts +++ b/compression/cutils/anchor/tests/utils/helpers.ts @@ -1,26 +1,26 @@ -import fs from 'node:fs'; -import path from 'node:path'; -import { type Connection, Keypair, LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js'; +import fs from "node:fs"; +import path from "node:path"; +import { type Connection, Keypair, LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; // define some default locations -const DEFAULT_KEY_DIR_NAME = '.local_keys'; -const DEFAULT_PUBLIC_KEY_FILE = 'keys.json'; -const DEFAULT_DEMO_DATA_FILE = 'demo.json'; +const DEFAULT_KEY_DIR_NAME = ".local_keys"; +const DEFAULT_PUBLIC_KEY_FILE = "keys.json"; +const DEFAULT_DEMO_DATA_FILE = "demo.json"; /* Load locally stored PublicKey addresses */ export function loadPublicKeysFromFile(absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFAULT_PUBLIC_KEY_FILE}`) { try { - if (!absPath) throw Error('No path provided'); - if (!fs.existsSync(absPath)) throw Error('File does not exist.'); + if (!absPath) throw Error("No path provided"); + if (!fs.existsSync(absPath)) throw Error("File does not exist."); // load the public keys from the file - const data = JSON.parse(fs.readFileSync(absPath, { encoding: 'utf-8' })) || {}; + const data = JSON.parse(fs.readFileSync(absPath, { encoding: "utf-8" })) || {}; // convert all loaded keyed values into valid public keys for (const [key, value] of Object.entries(data)) { - data[key] = new PublicKey(value as string) ?? ''; + data[key] = new PublicKey(value as string) ?? ""; } return data; @@ -34,23 +34,28 @@ export function loadPublicKeysFromFile(absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFA /* Locally save a demo data to the filesystem for later retrieval */ -export function saveDemoDataToFile(name: string, newData: any, absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFAULT_DEMO_DATA_FILE}`) { +export function saveDemoDataToFile( + name: string, + // biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 + newData: any, + absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFAULT_DEMO_DATA_FILE}`, +) { try { let data: object = {}; // fetch all the current values, when the storage file exists - if (fs.existsSync(absPath)) data = JSON.parse(fs.readFileSync(absPath, { encoding: 'utf-8' })) || {}; + if (fs.existsSync(absPath)) data = JSON.parse(fs.readFileSync(absPath, { encoding: "utf-8" })) || {}; data = { ...data, [name]: newData }; // actually save the data to the file fs.writeFileSync(absPath, JSON.stringify(data), { - encoding: 'utf-8', + encoding: "utf-8", }); return data; } catch (_err) { - console.warn('Unable to save to file'); + console.warn("Unable to save to file"); // console.warn(err); } @@ -61,23 +66,29 @@ export function saveDemoDataToFile(name: string, newData: any, absPath = `${DEFA /* Locally save a PublicKey addresses to the filesystem for later retrieval */ -export function savePublicKeyToFile(name: string, publicKey: PublicKey, absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFAULT_PUBLIC_KEY_FILE}`) { +export function savePublicKeyToFile( + name: string, + publicKey: PublicKey, + absPath = `${DEFAULT_KEY_DIR_NAME}/${DEFAULT_PUBLIC_KEY_FILE}`, +) { try { // if (!absPath) throw Error("No path provided"); // if (!fs.existsSync(absPath)) throw Error("File does not exist."); // fetch all the current values + // biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 let data: any = loadPublicKeysFromFile(absPath); // convert all loaded keyed values from PublicKeys to strings for (const [key, value] of Object.entries(data)) { + // biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 data[key as any] = (value as PublicKey).toBase58(); } data = { ...data, [name]: publicKey.toBase58() }; // actually save the data to the file fs.writeFileSync(absPath, JSON.stringify(data), { - encoding: 'utf-8', + encoding: "utf-8", }); // reload the keys for sanity @@ -85,7 +96,7 @@ export function savePublicKeyToFile(name: string, publicKey: PublicKey, absPath return data; } catch (_err) { - console.warn('Unable to save to file'); + console.warn("Unable to save to file"); } // always return an object return {}; @@ -96,16 +107,16 @@ export function savePublicKeyToFile(name: string, publicKey: PublicKey, absPath */ export function loadKeypairFromFile(absPath: string) { try { - if (!absPath) throw Error('No path provided'); - if (!fs.existsSync(absPath)) throw Error('File does not exist.'); + if (!absPath) throw Error("No path provided"); + if (!fs.existsSync(absPath)) throw Error("File does not exist."); // load the keypair from the file - const keyfileBytes = JSON.parse(fs.readFileSync(absPath, { encoding: 'utf-8' })); + const keyfileBytes = JSON.parse(fs.readFileSync(absPath, { encoding: "utf-8" })); // parse the loaded secretKey into a valid keypair const keypair = Keypair.fromSecretKey(new Uint8Array(keyfileBytes)); return keypair; } catch (err) { - console.error('loadKeypairFromFile:', err); + console.error("loadKeypairFromFile:", err); throw err; } } @@ -125,7 +136,7 @@ export function saveKeypairToFile(keypair: Keypair, relativeFileName: string, di // write the `secretKey` value as a string fs.writeFileSync(fileName, `[${keypair.secretKey.toString()}]`, { - encoding: 'utf-8', + encoding: "utf-8", }); return fileName; @@ -147,7 +158,7 @@ export function loadOrGenerateKeypair(fileName: string, dirName: string = DEFAUL return keypair; } catch (err) { - console.error('loadOrGenerateKeypair:', err); + console.error("loadOrGenerateKeypair:", err); throw err; } } @@ -162,17 +173,17 @@ export function explorerURL({ }: { address?: string; txSignature?: string; - cluster?: 'devnet' | 'testnet' | 'mainnet' | 'mainnet-beta'; + cluster?: "devnet" | "testnet" | "mainnet" | "mainnet-beta"; }) { let baseUrl: string; // if (address) baseUrl = `https://explorer.solana.com/address/${address}`; else if (txSignature) baseUrl = `https://explorer.solana.com/tx/${txSignature}`; - else return '[unknown]'; + else return "[unknown]"; // auto append the desired search params const url = new URL(baseUrl); - url.searchParams.append('cluster', cluster || 'devnet'); + url.searchParams.append("cluster", cluster || "devnet"); return `${url.toString()}\n`; } @@ -190,7 +201,7 @@ export async function airdropOnLowBalance(connection: Connection, keypair: Keypa if (forceAirdrop === true || balance < MIN_BALANCE_TO_AIRDROP) { console.log(`Requesting airdrop of 1 SOL to ${keypair.publicKey.toBase58()}...`); await connection.requestAirdrop(keypair.publicKey, LAMPORTS_PER_SOL).then((sig) => { - console.log('Tx signature:', sig); + console.log("Tx signature:", sig); // balance = balance + LAMPORTS_PER_SOL; }); @@ -206,11 +217,14 @@ export async function airdropOnLowBalance(connection: Connection, keypair: Keypa /* Helper function to extract a transaction signature from a failed transaction's error message */ +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 export async function extractSignatureFromFailedTransaction(connection: Connection, err: any, fetchLogs?: boolean) { if (err?.signature) return err.signature; // extract the failed transaction's signature - const failedSig = new RegExp(/^((.*)?Error: )?(Transaction|Signature) ([A-Z0-9]{32,}) /gim).exec(err?.message?.toString())?.[4]; + const failedSig = new RegExp(/^((.*)?Error: )?(Transaction|Signature) ([A-Z0-9]{32,}) /gim).exec( + err?.message?.toString(), + )?.[4]; // ensure a signature was found if (failedSig) { @@ -222,14 +236,14 @@ export async function extractSignatureFromFailedTransaction(connection: Connecti }) .then((tx) => { console.log(`\n==== Transaction logs for ${failedSig} ====`); - console.log(explorerURL({ txSignature: failedSig }), ''); - console.log(tx?.meta?.logMessages ?? 'No log messages provided by RPC'); - console.log('==== END LOGS ====\n'); + console.log(explorerURL({ txSignature: failedSig }), ""); + console.log(tx?.meta?.logMessages ?? "No log messages provided by RPC"); + console.log("==== END LOGS ====\n"); }); else { - console.log('\n========================================'); + console.log("\n========================================"); console.log(explorerURL({ txSignature: failedSig })); - console.log('========================================\n'); + console.log("========================================\n"); } } @@ -254,7 +268,7 @@ export function numberFormatter(num: number, forceDecimals = false) { Display a separator in the console, with our without a message */ export function printConsoleSeparator(message?: string) { - console.log('\n==============================================='); - console.log('===============================================\n'); + console.log("\n==============================================="); + console.log("===============================================\n"); if (message) console.log(message); } diff --git a/compression/cutils/anchor/tests/utils/readAPI.ts b/compression/cutils/anchor/tests/utils/readAPI.ts index 3562d91c6..7c324845e 100644 --- a/compression/cutils/anchor/tests/utils/readAPI.ts +++ b/compression/cutils/anchor/tests/utils/readAPI.ts @@ -2,20 +2,21 @@ // as it supports more readAPI functionality // this is just a subset of functions for quick availabiity -import axios from 'axios'; +import axios from "axios"; //TODO insert -const RPC_PATH = ''; +const RPC_PATH = ""; +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 export async function getAsset(assetId: any, rpcUrl = RPC_PATH): Promise { try { const axiosInstance = axios.create({ baseURL: rpcUrl, }); const response = await axiosInstance.post(rpcUrl, { - jsonrpc: '2.0', - method: 'getAsset', - id: 'rpd-op-123', + jsonrpc: "2.0", + method: "getAsset", + id: "rpd-op-123", params: { id: assetId, }, @@ -26,15 +27,16 @@ export async function getAsset(assetId: any, rpcUrl = RPC_PATH): Promise { } } +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 export async function getAssetProof(assetId: any, rpcUrl = RPC_PATH): Promise { try { const axiosInstance = axios.create({ baseURL: rpcUrl, }); const response = await axiosInstance.post(rpcUrl, { - jsonrpc: '2.0', - method: 'getAssetProof', - id: 'rpd-op-123', + jsonrpc: "2.0", + method: "getAssetProof", + id: "rpd-op-123", params: { id: assetId, }, diff --git a/compression/cutils/anchor/tests/utils/utils.ts b/compression/cutils/anchor/tests/utils/utils.ts index 74206b75e..4e3001eee 100644 --- a/compression/cutils/anchor/tests/utils/utils.ts +++ b/compression/cutils/anchor/tests/utils/utils.ts @@ -1,8 +1,8 @@ -import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from '@metaplex-foundation/mpl-bubblegum/dist/src/generated'; -import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mpl-token-metadata/dist/src/generated'; -import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from '@solana/spl-account-compression'; -import { type AccountMeta, PublicKey, SystemProgram } from '@solana/web3.js'; -import * as bs58 from 'bs58'; +import { PROGRAM_ID as BUBBLEGUM_PROGRAM_ID } from "@metaplex-foundation/mpl-bubblegum/dist/src/generated"; +import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from "@metaplex-foundation/mpl-token-metadata/dist/src/generated"; +import { SPL_ACCOUNT_COMPRESSION_PROGRAM_ID, SPL_NOOP_PROGRAM_ID } from "@solana/spl-account-compression"; +import { type AccountMeta, PublicKey, SystemProgram } from "@solana/web3.js"; +import * as bs58 from "bs58"; export function decode(stuff: string) { return bufferToArray(bs58.decode(stuff)); @@ -16,7 +16,7 @@ function bufferToArray(buffer: Buffer): number[] { } export const mapProof = (assetProof: { proof: string[] }): AccountMeta[] => { if (!assetProof.proof || assetProof.proof.length === 0) { - throw new Error('Proof is empty'); + throw new Error("Proof is empty"); } return assetProof.proof.map((node) => ({ pubkey: new PublicKey(node), @@ -32,19 +32,24 @@ export function getAccounts(collectionMint: PublicKey, tree: PublicKey) { // derive a PDA (owned by Bubblegum) to act as the signer of the compressed minting const [bubblegumSigner] = PublicKey.findProgramAddressSync( // `collection_cpi` is a custom prefix required by the Bubblegum program - [Buffer.from('collection_cpi', 'utf8')], + [Buffer.from("collection_cpi", "utf8")], BUBBLEGUM_PROGRAM_ID, ); // collection metadata account const [metadataAccount] = PublicKey.findProgramAddressSync( - [Buffer.from('metadata', 'utf8'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), collectionMint.toBuffer()], + [Buffer.from("metadata", "utf8"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), collectionMint.toBuffer()], TOKEN_METADATA_PROGRAM_ID, ); // collection master edition const [masterEditionAccount] = PublicKey.findProgramAddressSync( - [Buffer.from('metadata', 'utf8'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), collectionMint.toBuffer(), Buffer.from('edition', 'utf8')], + [ + Buffer.from("metadata", "utf8"), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + collectionMint.toBuffer(), + Buffer.from("edition", "utf8"), + ], TOKEN_METADATA_PROGRAM_ID, ); diff --git a/oracles/pyth/anchor/Anchor.toml b/oracles/pyth/anchor/Anchor.toml index aaead0ef0..6771de0ef 100644 --- a/oracles/pyth/anchor/Anchor.toml +++ b/oracles/pyth/anchor/Anchor.toml @@ -6,10 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -pythexample = "GUkjQmrLPFXXNK1bFLKt8XQi6g3TjxcHVspbjDoHvMG2" - -# [registry] section removed — no longer used in Anchor 1.0 +pythexample = "AWYkDL963P4NXrb9kvik9JTRH7igkhJ4Xyd8t5YRv8ZN" [provider] -cluster = "Localnet" -wallet = "~/.config/solana/id.json" \ No newline at end of file +cluster = "localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "cargo test" + +[hooks] diff --git a/oracles/pyth/anchor/programs/pythexample/Cargo.toml b/oracles/pyth/anchor/programs/pythexample/Cargo.toml index 54cb09608..3d2ed2bfd 100644 --- a/oracles/pyth/anchor/programs/pythexample/Cargo.toml +++ b/oracles/pyth/anchor/programs/pythexample/Cargo.toml @@ -21,9 +21,18 @@ custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" -pyth-solana-receiver-sdk = "1.1.0" +anchor-lang = "1.0.0" +# pyth-solana-receiver-sdk removed: depends on anchor-lang 0.32 which is incompatible +# with Anchor 1.0. PriceUpdateV2 types are inlined in lib.rs. + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-account = "3.0.0" +borsh = "1.6.1" +sha2 = "0.10" +solana-kite = "0.3.0" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/oracles/pyth/anchor/programs/pythexample/src/lib.rs b/oracles/pyth/anchor/programs/pythexample/src/lib.rs index 8b1e2c56d..fd7f218b9 100644 --- a/oracles/pyth/anchor/programs/pythexample/src/lib.rs +++ b/oracles/pyth/anchor/programs/pythexample/src/lib.rs @@ -1,7 +1,88 @@ -use pyth_solana_receiver_sdk::price_update::PriceUpdateV2; use anchor_lang::prelude::*; -declare_id!("GUkjQmrLPFXXNK1bFLKt8XQi6g3TjxcHVspbjDoHvMG2"); +declare_id!("AWYkDL963P4NXrb9kvik9JTRH7igkhJ4Xyd8t5YRv8ZN"); + +/// Pyth Receiver program ID (rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ) +/// The pyth-solana-receiver-sdk crate depends on anchor-lang 0.32 which is +/// incompatible with Anchor 1.0. These types are inlined to avoid the conflict. +pub const PYTH_RECEIVER_PROGRAM_ID: Pubkey = Pubkey::new_from_array([ + 0x04, 0xdf, 0x5d, 0xa0, 0x26, 0x6c, 0x4f, 0x33, 0x78, 0x18, 0x03, 0xbe, 0x12, 0x90, 0x4e, + 0x07, 0x58, 0x91, 0x53, 0x2a, 0x50, 0x77, 0xb9, 0xba, 0x0f, 0x18, 0x20, 0xe6, 0x2a, 0xb0, + 0x27, 0x49, +]); + +/// Mirrors pyth_solana_receiver_sdk::price_update::VerificationLevel +#[derive(AnchorSerialize, AnchorDeserialize, Copy, Clone, PartialEq, Debug)] +pub enum VerificationLevel { + Partial { num_signatures: u8 }, + Full, +} + +/// Mirrors pythnet_sdk::messages::PriceFeedMessage +#[derive(AnchorSerialize, AnchorDeserialize, Copy, Clone, PartialEq, Debug)] +pub struct PriceFeedMessage { + pub feed_id: [u8; 32], + pub price: i64, + pub conf: u64, + pub exponent: i32, + pub publish_time: i64, + pub prev_publish_time: i64, + pub ema_price: i64, + pub ema_conf: u64, +} + +/// Mirrors pyth_solana_receiver_sdk::price_update::PriceUpdateV2 +/// Re-implemented here because the pyth SDK depends on anchor-lang 0.32.x, +/// which is incompatible with Anchor 1.0's types. +#[derive(AnchorSerialize, AnchorDeserialize, Clone, Debug)] +pub struct PriceUpdateV2 { + pub write_authority: Pubkey, + pub verification_level: VerificationLevel, + pub price_message: PriceFeedMessage, + pub posted_slot: u64, +} + +/// Discriminator for PriceUpdateV2 — sha256("account:PriceUpdateV2")[..8] +/// This must match the discriminator used by pyth-solana-receiver-sdk. +pub const PRICE_UPDATE_V2_DISCRIMINATOR: [u8; 8] = { + // Computed at compile time from sha256("account:PriceUpdateV2") + // = [34, 241, 35, 99, 157, 126, 244, 205] + [34, 241, 35, 99, 157, 126, 244, 205] +}; + +impl AccountDeserialize for PriceUpdateV2 { + fn try_deserialize_unchecked(buf: &mut &[u8]) -> Result { + // Skip 8-byte discriminator + if buf.len() < 8 { + return Err(ErrorCode::AccountDidNotDeserialize.into()); + } + *buf = &buf[8..]; + AnchorDeserialize::deserialize(buf).map_err(|_| ErrorCode::AccountDidNotDeserialize.into()) + } + + fn try_deserialize(buf: &mut &[u8]) -> Result { + if buf.len() < 8 { + return Err(ErrorCode::AccountDidNotDeserialize.into()); + } + let disc = &buf[..8]; + if disc != PRICE_UPDATE_V2_DISCRIMINATOR { + return Err(ErrorCode::AccountDiscriminatorMismatch.into()); + } + Self::try_deserialize_unchecked(buf) + } +} + +impl AccountSerialize for PriceUpdateV2 {} + +impl Owner for PriceUpdateV2 { + fn owner() -> Pubkey { + PYTH_RECEIVER_PROGRAM_ID + } +} + +impl Discriminator for PriceUpdateV2 { + const DISCRIMINATOR: &'static [u8] = &PRICE_UPDATE_V2_DISCRIMINATOR; +} #[program] pub mod anchor_test { @@ -20,5 +101,6 @@ pub mod anchor_test { #[derive(Accounts)] pub struct ReadPrice<'info> { + /// A PriceUpdateV2 account owned by the Pyth Receiver program. pub price_update: Account<'info, PriceUpdateV2>, } diff --git a/oracles/pyth/anchor/programs/pythexample/tests/test_pyth.rs b/oracles/pyth/anchor/programs/pythexample/tests/test_pyth.rs new file mode 100644 index 000000000..04d545fb9 --- /dev/null +++ b/oracles/pyth/anchor/programs/pythexample/tests/test_pyth.rs @@ -0,0 +1,112 @@ +use { + anchor_lang::{solana_program::instruction::Instruction, InstructionData, ToAccountMetas}, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +/// Pyth Receiver program ID (rec5EKMGg6MxZYaMdyBfgwp4d5rB9T1VQH5pJv5LtFJ) +fn pyth_receiver_program_id() -> anchor_lang::solana_program::pubkey::Pubkey { + pythexample::PYTH_RECEIVER_PROGRAM_ID +} + +/// Build mock PriceUpdateV2 account data with Anchor discriminator. +fn build_mock_price_update_account( + write_authority: &anchor_lang::solana_program::pubkey::Pubkey, +) -> Vec { + // Discriminator: sha256("account:PriceUpdateV2")[..8] + let discriminator: [u8; 8] = [34, 241, 35, 99, 157, 126, 244, 205]; + + let mut data = Vec::with_capacity(133); + + // Discriminator + data.extend_from_slice(&discriminator); + + // write_authority: Pubkey (32 bytes) + data.extend_from_slice(write_authority.as_ref()); + + // verification_level: Full = borsh enum variant 1 + data.push(1u8); + + // PriceFeedMessage fields: + // feed_id: [u8; 32] + let feed_id = [0xEFu8; 32]; + data.extend_from_slice(&feed_id); + + // price: i64 (150.00000000 USD with exponent -8) + let price: i64 = 15_000_000_000; + data.extend_from_slice(&price.to_le_bytes()); + + // conf: u64 + let conf: u64 = 100_000; + data.extend_from_slice(&conf.to_le_bytes()); + + // exponent: i32 + let exponent: i32 = -8; + data.extend_from_slice(&exponent.to_le_bytes()); + + // publish_time: i64 + let publish_time: i64 = 1_700_000_000; + data.extend_from_slice(&publish_time.to_le_bytes()); + + // prev_publish_time: i64 + let prev_publish_time: i64 = 1_699_999_999; + data.extend_from_slice(&prev_publish_time.to_le_bytes()); + + // ema_price: i64 + let ema_price: i64 = 14_900_000_000; + data.extend_from_slice(&ema_price.to_le_bytes()); + + // ema_conf: u64 + let ema_conf: u64 = 120_000; + data.extend_from_slice(&ema_conf.to_le_bytes()); + + // posted_slot: u64 + let posted_slot: u64 = 42; + data.extend_from_slice(&posted_slot.to_le_bytes()); + + data +} + +#[test] +fn test_read_price() { + let program_id = pythexample::id(); + let mut svm = LiteSVM::new(); + let bytes = include_bytes!("../../../target/deploy/pythexample.so"); + svm.add_program(program_id, bytes).unwrap(); + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + // Create a mock PriceUpdateV2 account + let price_update_key = Keypair::new(); + let account_data = build_mock_price_update_account(&payer.pubkey()); + + // Set the account in LiteSVM with the Pyth Receiver program as owner + let pyth_receiver_id = pyth_receiver_program_id(); + let rent = svm.minimum_balance_for_rent_exemption(account_data.len()); + + svm.set_account( + price_update_key.pubkey(), + solana_account::Account { + lamports: rent, + data: account_data, + owner: pyth_receiver_id, + executable: false, + rent_epoch: 0, + }, + ) + .unwrap(); + + // Call read_price — program just reads the account and logs the price info + let ix_data = pythexample::instruction::ReadPrice {}.data(); + + let accounts = pythexample::accounts::ReadPrice { + price_update: price_update_key.pubkey(), + } + .to_account_metas(None); + + let instruction = Instruction::new_with_bytes(program_id, &ix_data, accounts); + + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()) + .unwrap(); +} diff --git a/package.json b/package.json index 3ed3f9c7f..91b205a0b 100644 --- a/package.json +++ b/package.json @@ -1,37 +1,38 @@ { - "name": "program-examples", - "version": "1.0.0", - "description": "### :crab: Rust. :snake: Python. :link: All onchain.", - "scripts": { - "sync-package-json": "ts-node scripts/sync-package-json.ts", - "format:fix": "pnpx @biomejs/biome format --write ./", - "lint:fix": "pnpx @biomejs/biome lint --write ./", - "lint": "pnpx @biomejs/biome lint ./", - "fix": "pnpx @biomejs/biome check --write ./", - "check": "pnpx @biomejs/biome check ./", - "prepare": "husky" - }, - "lint-staged": { - "*": [ - "biome check --apply --no-errors-on-unmatched --files-ignore-unknown=true" - ] - }, - "keywords": [], - "author": "Solana Foundation", - "license": "MIT", - "devDependencies": { - "@biomejs/biome": "1.8.1", - "@types/node": "^20.9.0", - "husky": "^9.0.11", - "picocolors": "^1.0.0", - "ts-node": "^10.9.1", - "typescript": "^5.2.2" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4", - "anchor-bankrun": "^0.4.0", - "chai": "^5.1.1", - "solana-bankrun": "^0.3.0" - } + "name": "program-examples", + "version": "1.0.0", + "description": "Solana program (smart contract) examples for Anchor, Native Rust, and Pinocchio.", + "scripts": { + "sync-package-json": "ts-node scripts/sync-package-json.ts", + "format:fix": "pnpx @biomejs/biome format --write ./", + "lint:fix": "pnpx @biomejs/biome lint --write ./", + "lint": "pnpx @biomejs/biome lint ./", + "fix": "pnpx @biomejs/biome check --write ./", + "check": "pnpx @biomejs/biome check ./", + "prepare": "husky" + }, + "lint-staged": { + "*": [ + "biome check --write --no-errors-on-unmatched --files-ignore-unknown=true" + ] + }, + "packageManager": "pnpm@9.13.2", + "keywords": [], + "author": "Solana Foundation", + "license": "MIT", + "devDependencies": { + "@biomejs/biome": "2.4.10", + "@types/node": "^20.9.0", + "husky": "^9.0.11", + "picocolors": "^1.0.0", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4", + "anchor-bankrun": "^0.4.0", + "chai": "^5.1.1", + "solana-bankrun": "^0.3.0" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5b1f1dc05..1118a53f1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) @@ -25,8 +25,8 @@ importers: version: 0.3.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) devDependencies: '@biomejs/biome': - specifier: 1.8.1 - version: 1.8.1 + specifier: 2.4.10 + version: 2.4.10 '@types/node': specifier: ^20.9.0 version: 20.14.2 @@ -45,77 +45,73 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.25.0': resolution: {integrity: sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==} engines: {node: '>=6.9.0'} - '@biomejs/biome@1.8.1': - resolution: {integrity: sha512-fQXGfvq6DIXem12dGQCM2tNF+vsNHH1qs3C7WeOu75Pd0trduoTmoO7G4ntLJ2qDs5wuw981H+cxQhi1uHnAtA==} + '@biomejs/biome@2.4.10': + resolution: {integrity: sha512-xxA3AphFQ1geij4JTHXv4EeSTda1IFn22ye9LdyVPoJU19fNVl0uzfEuhsfQ4Yue/0FaLs2/ccVi4UDiE7R30w==} engines: {node: '>=14.21.3'} hasBin: true - '@biomejs/cli-darwin-arm64@1.8.1': - resolution: {integrity: sha512-XLiB7Uu6GALIOBWzQ2aMD0ru4Ly5/qSeQF7kk3AabzJ/kwsEWSe33iVySBP/SS2qv25cgqNiLksjGcw2bHT3mw==} + '@biomejs/cli-darwin-arm64@2.4.10': + resolution: {integrity: sha512-vuzzI1cWqDVzOMIkYyHbKqp+AkQq4K7k+UCXWpkYcY/HDn1UxdsbsfgtVpa40shem8Kax4TLDLlx8kMAecgqiw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] - '@biomejs/cli-darwin-x64@1.8.1': - resolution: {integrity: sha512-uMTSxVLMfqkBVqyc25hSn83jBbp+wtWjzM/pHFlKXt3htJuw7FErVGW0nmQ9Sxa9vJ7GcqoltLMl28VQRIMYzg==} + '@biomejs/cli-darwin-x64@2.4.10': + resolution: {integrity: sha512-14fzASRo+BPotwp7nWULy2W5xeUyFnTaq1V13Etrrxkrih+ez/2QfgFm5Ehtf5vSjtgx/IJycMMpn5kPd5ZNaA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] - '@biomejs/cli-linux-arm64-musl@1.8.1': - resolution: {integrity: sha512-UQ8Wc01J0wQL+5AYOc7qkJn20B4PZmQL1KrmDZh7ot0DvD6aX4+8mmfd/dG5b6Zjo/44QvCKcvkFGCMRYuhWZA==} + '@biomejs/cli-linux-arm64-musl@2.4.10': + resolution: {integrity: sha512-WrJY6UuiSD/Dh+nwK2qOTu8kdMDlLV3dLMmychIghHPAysWFq1/DGC1pVZx8POE3ZkzKR3PUUnVrtZfMfaJjyQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [musl] - '@biomejs/cli-linux-arm64@1.8.1': - resolution: {integrity: sha512-3SzZRuC/9Oi2P2IBNPsEj0KXxSXUEYRR2kfRF/Ve8QAfGgrt4qnwuWd6QQKKN5R+oYH691qjm+cXBKEcrP1v/Q==} + '@biomejs/cli-linux-arm64@2.4.10': + resolution: {integrity: sha512-7MH1CMW5uuxQ/s7FLST63qF8B3Hgu2HRdZ7tA1X1+mk+St4JOuIrqdhIBnnyqeyWJNI+Bww7Es5QZ0wIc1Cmkw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] - libc: [glibc] - '@biomejs/cli-linux-x64-musl@1.8.1': - resolution: {integrity: sha512-fYbP/kNu/rtZ4kKzWVocIdqZOtBSUEg9qUhZaao3dy3CRzafR6u6KDtBeSCnt47O+iLnks1eOR1TUxzr5+QuqA==} + '@biomejs/cli-linux-x64-musl@2.4.10': + resolution: {integrity: sha512-kDTi3pI6PBN6CiczsWYOyP2zk0IJI08EWEQyDMQWW221rPaaEz6FvjLhnU07KMzLv8q3qSuoB93ua6inSQ55Tw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [musl] - '@biomejs/cli-linux-x64@1.8.1': - resolution: {integrity: sha512-AeBycVdNrTzsyYKEOtR2R0Ph0hCD0sCshcp2aOnfGP0hCZbtFg09D0SdKLbyzKntisY41HxKVrydYiaApp+2uw==} + '@biomejs/cli-linux-x64@2.4.10': + resolution: {integrity: sha512-tZLvEEi2u9Xu1zAqRjTcpIDGVtldigVvzug2fTuPG0ME/g8/mXpRPcNgLB22bGn6FvLJpHHnqLnwliOu8xjYrg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] - libc: [glibc] - '@biomejs/cli-win32-arm64@1.8.1': - resolution: {integrity: sha512-6tEd1H/iFKpgpE3OIB7oNgW5XkjiVMzMRPL8zYoZ036YfuJ5nMYm9eB9H/y81+8Z76vL48fiYzMPotJwukGPqQ==} + '@biomejs/cli-win32-arm64@2.4.10': + resolution: {integrity: sha512-umwQU6qPzH+ISTf/eHyJ/QoQnJs3V9Vpjz2OjZXe9MVBZ7prgGafMy7yYeRGnlmDAn87AKTF3Q6weLoMGpeqdQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] - '@biomejs/cli-win32-x64@1.8.1': - resolution: {integrity: sha512-g2H31jJzYmS4jkvl6TiyEjEX+Nv79a5km/xn+5DARTp5MBFzC9gwceusSSB2AkJKqZzY131AiACAWjKrVt5Ijw==} + '@biomejs/cli-win32-x64@2.4.10': + resolution: {integrity: sha512-aW/JU5GuyH4uxMrNYpoC2kjaHlyJGLgIa3XkhPEZI0uKhZhJZU8BuEyJmvgzSPQNGozBwWjC972RaNdcJ9KyJg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -430,14 +426,12 @@ packages: engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] solana-bankrun-linux-x64-musl@0.3.0: resolution: {integrity: sha512-xsS2CS2xb1Sw4ivNXM0gPz/qpW9BX0neSvt/pnok5L330Nu9xlTnKAY8FhzzqOP9P9sJlGRM787Y6d0yYwt6xQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] solana-bankrun@0.3.0: resolution: {integrity: sha512-YkH7sa8TB/AoRPzG17CXJtYsRIQHEkEqGLz1Vwc13taXhDBkjO7z6NI5JYw7n0ybRymDHwMYTc7sd+5J40TyVQ==} @@ -534,16 +528,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.4.5)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -561,45 +555,45 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.25.0': dependencies: regenerator-runtime: 0.14.1 - '@biomejs/biome@1.8.1': + '@biomejs/biome@2.4.10': optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.8.1 - '@biomejs/cli-darwin-x64': 1.8.1 - '@biomejs/cli-linux-arm64': 1.8.1 - '@biomejs/cli-linux-arm64-musl': 1.8.1 - '@biomejs/cli-linux-x64': 1.8.1 - '@biomejs/cli-linux-x64-musl': 1.8.1 - '@biomejs/cli-win32-arm64': 1.8.1 - '@biomejs/cli-win32-x64': 1.8.1 - - '@biomejs/cli-darwin-arm64@1.8.1': + '@biomejs/cli-darwin-arm64': 2.4.10 + '@biomejs/cli-darwin-x64': 2.4.10 + '@biomejs/cli-linux-arm64': 2.4.10 + '@biomejs/cli-linux-arm64-musl': 2.4.10 + '@biomejs/cli-linux-x64': 2.4.10 + '@biomejs/cli-linux-x64-musl': 2.4.10 + '@biomejs/cli-win32-arm64': 2.4.10 + '@biomejs/cli-win32-x64': 2.4.10 + + '@biomejs/cli-darwin-arm64@2.4.10': optional: true - '@biomejs/cli-darwin-x64@1.8.1': + '@biomejs/cli-darwin-x64@2.4.10': optional: true - '@biomejs/cli-linux-arm64-musl@1.8.1': + '@biomejs/cli-linux-arm64-musl@2.4.10': optional: true - '@biomejs/cli-linux-arm64@1.8.1': + '@biomejs/cli-linux-arm64@2.4.10': optional: true - '@biomejs/cli-linux-x64-musl@1.8.1': + '@biomejs/cli-linux-x64-musl@2.4.10': optional: true - '@biomejs/cli-linux-x64@1.8.1': + '@biomejs/cli-linux-x64@2.4.10': optional: true - '@biomejs/cli-win32-arm64@1.8.1': + '@biomejs/cli-win32-arm64@2.4.10': optional: true - '@biomejs/cli-win32-x64@1.8.1': + '@biomejs/cli-win32-x64@2.4.10': optional: true '@coral-xyz/anchor-errors@0.31.1': {} diff --git a/scripts/lib/change-package-version.ts b/scripts/lib/change-package-version.ts index 0e8dab176..ee32d7c61 100644 --- a/scripts/lib/change-package-version.ts +++ b/scripts/lib/change-package-version.ts @@ -1,7 +1,7 @@ -import { readFileSync } from 'node:fs'; +import { readFileSync } from "node:fs"; export function changePackageVersion(file: string, pkgName: string, pkgVersion: string): [boolean, string] { - const content = JSON.parse(readFileSync(file).toString('utf-8')); + const content = JSON.parse(readFileSync(file).toString("utf-8")); if (content.dependencies?.[pkgName] && content.dependencies[pkgName] !== pkgVersion) { content.dependencies[pkgName] = pkgVersion; return [true, content]; diff --git a/scripts/lib/command-check.ts b/scripts/lib/command-check.ts index 99c3d5bb8..7d13f50dc 100644 --- a/scripts/lib/command-check.ts +++ b/scripts/lib/command-check.ts @@ -1,10 +1,10 @@ -import { basename } from 'node:path'; -import * as p from 'picocolors'; -import { getDepsCount } from './get-deps-count'; -import { getRecursiveFileList } from './get-recursive-file-list'; +import { basename } from "node:path"; +import * as p from "picocolors"; +import { getDepsCount } from "./get-deps-count"; +import { getRecursiveFileList } from "./get-recursive-file-list"; -export function commandCheck(path = '.') { - const files = getRecursiveFileList(path).filter((file) => basename(file) === 'package.json'); +export function commandCheck(path = ".") { + const files = getRecursiveFileList(path).filter((file) => basename(file) === "package.json"); const depsCounter = getDepsCount(files); const single: string[] = []; @@ -17,7 +17,7 @@ export function commandCheck(path = '.') { if (versionsLength === 1) { const count = versions[versionMap[0]].length; - single.push(`${p.green('✔')} ${pkg}@${versionMap[0]} (${count})`); + single.push(`${p.green("✔")} ${pkg}@${versionMap[0]} (${count})`); continue; } @@ -27,7 +27,7 @@ export function commandCheck(path = '.') { } versionCount.sort((a, b) => b.count - a.count); - multiple.push(`${p.yellow('⚠')} ${pkg} has ${versionsLength} versions:`); + multiple.push(`${p.yellow("⚠")} ${pkg} has ${versionsLength} versions:`); for (const { count, version } of versionCount) { multiple.push(` - ${p.bold(version)} (${count})`); diff --git a/scripts/lib/command-help.ts b/scripts/lib/command-help.ts index dfbe8021f..6fe22dd5c 100644 --- a/scripts/lib/command-help.ts +++ b/scripts/lib/command-help.ts @@ -1,26 +1,26 @@ export function commandHelp() { - console.log('Usage: yarn sync-package-json [options]'); - console.log(''); - console.log('Commands:'); - console.log(' check Check package.json files'); - console.log(' help Show this help'); - console.log(' list List package.json files'); - console.log(' set [ver] Set specific version in package.json files'); - console.log(' update Update all versions in package.json files'); - console.log(''); - console.log('Arguments:'); - console.log(' path Path to directory'); - console.log(''); - console.log('Examples:'); - console.log(' yarn sync-package-json check'); - console.log(' yarn sync-package-json check basics'); - console.log(' yarn sync-package-json list'); - console.log(' yarn sync-package-json list basics'); - console.log(' yarn sync-package-json help'); - console.log(' yarn sync-package-json set @coral-xyz/anchor@0.29.0'); - console.log(' yarn sync-package-json set @coral-xyz/anchor@0.29.0 basics'); - console.log(' yarn sync-package-json update'); - console.log(' yarn sync-package-json update basics'); - console.log(' yarn sync-package-json update . @solana/web3.js @solana/spl-token'); + console.log("Usage: yarn sync-package-json [options]"); + console.log(""); + console.log("Commands:"); + console.log(" check Check package.json files"); + console.log(" help Show this help"); + console.log(" list List package.json files"); + console.log(" set [ver] Set specific version in package.json files"); + console.log(" update Update all versions in package.json files"); + console.log(""); + console.log("Arguments:"); + console.log(" path Path to directory"); + console.log(""); + console.log("Examples:"); + console.log(" yarn sync-package-json check"); + console.log(" yarn sync-package-json check basics"); + console.log(" yarn sync-package-json list"); + console.log(" yarn sync-package-json list basics"); + console.log(" yarn sync-package-json help"); + console.log(" yarn sync-package-json set @coral-xyz/anchor@0.29.0"); + console.log(" yarn sync-package-json set @coral-xyz/anchor@0.29.0 basics"); + console.log(" yarn sync-package-json update"); + console.log(" yarn sync-package-json update basics"); + console.log(" yarn sync-package-json update . @solana/web3.js @solana/spl-token"); process.exit(0); } diff --git a/scripts/lib/command-list.ts b/scripts/lib/command-list.ts index a127c1a73..fdda272aa 100644 --- a/scripts/lib/command-list.ts +++ b/scripts/lib/command-list.ts @@ -1,8 +1,8 @@ -import { basename } from 'node:path'; -import { getRecursiveFileList } from './get-recursive-file-list'; +import { basename } from "node:path"; +import { getRecursiveFileList } from "./get-recursive-file-list"; export function commandList(path: string) { - const files = getRecursiveFileList(path).filter((file) => basename(file) === 'package.json'); + const files = getRecursiveFileList(path).filter((file) => basename(file) === "package.json"); for (const file of files) { console.log(file); } diff --git a/scripts/lib/command-set.ts b/scripts/lib/command-set.ts index 33d5be755..cad1dc6c0 100644 --- a/scripts/lib/command-set.ts +++ b/scripts/lib/command-set.ts @@ -1,32 +1,32 @@ -import { writeFileSync } from 'node:fs'; -import { basename } from 'node:path'; -import { changePackageVersion } from './change-package-version'; -import { getRecursiveFileList } from './get-recursive-file-list'; +import { writeFileSync } from "node:fs"; +import { basename } from "node:path"; +import { changePackageVersion } from "./change-package-version"; +import { getRecursiveFileList } from "./get-recursive-file-list"; -export function commandSet(version: string, path = '.') { +export function commandSet(version: string, path = ".") { if (!version) { - console.error('Version is required'); + console.error("Version is required"); process.exit(1); } if ( !version // Strip first character if it's a `@` - .replace(/^@/, '') - .includes('@') + .replace(/^@/, "") + .includes("@") ) { console.error(`Invalid package version: ${version}. Provide package with version, e.g. @solana/web3.js@1.0.0`); process.exit(1); } // Take anything after the second `@` as the version, the rest is the package name - const [pkg, ...rest] = version.split('@').reverse(); - const pkgName = rest.reverse().join('@'); + const [pkg, ...rest] = version.split("@").reverse(); + const pkgName = rest.reverse().join("@"); // Make sure pkgVersions has a ^ prefix, if not add it - const pkgVersion = pkg.startsWith('^') ? pkg : `^${pkg}`; + const pkgVersion = pkg.startsWith("^") ? pkg : `^${pkg}`; console.log(`Setting package ${pkgName} to ${pkgVersion} in ${path}`); - const files = getRecursiveFileList(path).filter((file) => basename(file) === 'package.json'); + const files = getRecursiveFileList(path).filter((file) => basename(file) === "package.json"); let count = 0; for (const file of files) { const [changed, content] = changePackageVersion(file, pkgName, pkgVersion); @@ -36,7 +36,7 @@ export function commandSet(version: string, path = '.') { } } if (count === 0) { - console.log('No files updated'); + console.log("No files updated"); } else { console.log(`Updated ${count} files`); } diff --git a/scripts/lib/command-update.ts b/scripts/lib/command-update.ts index 360d75dd9..02c724a78 100644 --- a/scripts/lib/command-update.ts +++ b/scripts/lib/command-update.ts @@ -1,18 +1,18 @@ -import { execSync } from 'node:child_process'; -import { writeFileSync } from 'node:fs'; -import { basename } from 'node:path'; -import * as p from 'picocolors'; -import { changePackageVersion } from './change-package-version'; +import { execSync } from "node:child_process"; +import { writeFileSync } from "node:fs"; +import { basename } from "node:path"; +import * as p from "picocolors"; +import { changePackageVersion } from "./change-package-version"; -import { getDepsCount } from './get-deps-count'; -import { getRecursiveFileList } from './get-recursive-file-list'; +import { getDepsCount } from "./get-deps-count"; +import { getRecursiveFileList } from "./get-recursive-file-list"; -export function commandUpdate(path = '.', packageNames: string[] = []) { - const files = getRecursiveFileList(path).filter((file) => basename(file) === 'package.json'); +export function commandUpdate(path = ".", packageNames: string[] = []) { + const files = getRecursiveFileList(path).filter((file) => basename(file) === "package.json"); const depsCounter = getDepsCount(files); const pkgNames = Object.keys(depsCounter).sort(); if (packageNames.length > 0) { - console.log(`Updating ${packageNames.join(', ')} in ${files.length} files`); + console.log(`Updating ${packageNames.join(", ")} in ${files.length} files`); } let total = 0; @@ -38,7 +38,7 @@ export function commandUpdate(path = '.', packageNames: string[] = []) { } if (total === 0) { - console.log('No files updated'); + console.log("No files updated"); } else { console.log(`Updated ${total} files`); } diff --git a/scripts/lib/get-deps-count.ts b/scripts/lib/get-deps-count.ts index 4481213a1..087bed171 100644 --- a/scripts/lib/get-deps-count.ts +++ b/scripts/lib/get-deps-count.ts @@ -1,11 +1,11 @@ -import { readFileSync } from 'node:fs'; +import { readFileSync } from "node:fs"; export function getDepsCount(files: string[] = []): Record> { const map: Record = {}; const depsCounter: Record> = {}; for (const file of files) { - const content = JSON.parse(readFileSync(file).toString('utf-8')); + const content = JSON.parse(readFileSync(file).toString("utf-8")); map[file] = content; const deps = content.dependencies ?? {}; diff --git a/scripts/lib/get-recursive-file-list.ts b/scripts/lib/get-recursive-file-list.ts index 8c65fbea1..951df23e5 100644 --- a/scripts/lib/get-recursive-file-list.ts +++ b/scripts/lib/get-recursive-file-list.ts @@ -1,8 +1,8 @@ // Point method at path and return a list of all the files in the directory recursively -import { readdirSync, statSync } from 'node:fs'; +import { readdirSync, statSync } from "node:fs"; export function getRecursiveFileList(path: string): string[] { - const ignore = ['.git', '.github', '.idea', '.next', '.vercel', '.vscode', 'coverage', 'dist', 'node_modules']; + const ignore = [".git", ".github", ".idea", ".next", ".vercel", ".vscode", "coverage", "dist", "node_modules"]; const files: string[] = []; const items = readdirSync(path); @@ -23,6 +23,6 @@ export function getRecursiveFileList(path: string): string[] { return files.filter((file) => { // Remove package.json from the root directory - return path === '.' ? file !== './package.json' : true; + return path === "." ? file !== "./package.json" : true; }); } diff --git a/scripts/lib/index.ts b/scripts/lib/index.ts index 37dfbc8cf..0d9c97099 100644 --- a/scripts/lib/index.ts +++ b/scripts/lib/index.ts @@ -1,5 +1,5 @@ -export * from './command-check'; -export * from './command-help'; -export * from './command-list'; -export * from './command-set'; -export * from './command-update'; +export * from "./command-check"; +export * from "./command-help"; +export * from "./command-list"; +export * from "./command-set"; +export * from "./command-update"; diff --git a/scripts/sync-package-json.ts b/scripts/sync-package-json.ts index 1ecec29bd..56844c92e 100644 --- a/scripts/sync-package-json.ts +++ b/scripts/sync-package-json.ts @@ -1,18 +1,18 @@ -import { commandCheck, commandHelp, commandList, commandSet, commandUpdate } from './lib'; +import { commandCheck, commandHelp, commandList, commandSet, commandUpdate } from "./lib"; const params: string[] = process.argv.slice(3); switch (process.argv[2]) { - case 'check': + case "check": commandCheck(params[0]); break; - case 'list': + case "list": commandList(params[0]); break; - case 'set': + case "set": commandSet(params[0], params[1]); break; - case 'update': + case "update": commandUpdate(params[0], params.slice(1)); break; default: diff --git a/tokens/create-token/anchor/Anchor.toml b/tokens/create-token/anchor/Anchor.toml index 5ea5f5207..3a7c0d739 100644 --- a/tokens/create-token/anchor/Anchor.toml +++ b/tokens/create-token/anchor/Anchor.toml @@ -6,16 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -create_token = "GwvQ53QTu1xz3XXYfG5m5jEqwhMBvVBudPS8TUuFYnhT" - -# [registry] section removed — no longer used in Anchor 1.0 +create_token = "Ex6CEJiwPiCotaNYmrjLSKQTr27tXrrA7981XZuQHQWe" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests — the validator tests (test.ts) need Metaplex Token -# Metadata cloned from mainnet which is too slow/unreliable in CI. -# bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/bankrun.test.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/create-token/anchor/package.json b/tokens/create-token/anchor/package.json index 9dec90fba..ef819b42b 100644 --- a/tokens/create-token/anchor/package.json +++ b/tokens/create-token/anchor/package.json @@ -1,21 +1,21 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5" - }, - "scripts": { - "postinstall": "zx prepare.mjs" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "anchor-bankrun": "^0.4.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3", - "zx": "^8.1.4" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0" + }, + "scripts": { + "postinstall": "zx prepare.mjs" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "anchor-bankrun": "^0.4.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3", + "zx": "^8.1.4" + } } diff --git a/tokens/create-token/anchor/pnpm-lock.yaml b/tokens/create-token/anchor/pnpm-lock.yaml index 2562c11f2..ffe6cb8cb 100644 --- a/tokens/create-token/anchor/pnpm-lock.yaml +++ b/tokens/create-token/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) devDependencies: '@types/bn.js': specifier: ^5.1.0 @@ -45,18 +45,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -764,16 +764,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -791,7 +791,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/tokens/create-token/anchor/prepare.mjs b/tokens/create-token/anchor/prepare.mjs index 7c5ec464b..fb6b26225 100644 --- a/tokens/create-token/anchor/prepare.mjs +++ b/tokens/create-token/anchor/prepare.mjs @@ -1,17 +1,17 @@ #!/usr/bin/env zx -import { mkdir, rm } from 'node:fs/promises'; -import { join } from 'node:path'; -import { $ } from 'zx'; +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; const programs = [ { - id: 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s', - name: 'token_metadata.so', + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "token_metadata.so", }, ]; -const outputDir = 'tests/fixtures'; +const outputDir = "tests/fixtures"; const overwrite = true; try { diff --git a/tokens/create-token/anchor/programs/create-token/Cargo.toml b/tokens/create-token/anchor/programs/create-token/Cargo.toml index 88ec78c89..f0fbf0421 100644 --- a/tokens/create-token/anchor/programs/create-token/Cargo.toml +++ b/tokens/create-token/anchor/programs/create-token/Cargo.toml @@ -21,9 +21,15 @@ custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" -anchor-spl = { version = "1.0.0-rc.5", features = ["metadata"] } +anchor-lang = "1.0.0" +anchor-spl = { version = "1.0.0", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/create-token/anchor/programs/create-token/src/lib.rs b/tokens/create-token/anchor/programs/create-token/src/lib.rs index 599dfd9d6..c0117de76 100644 --- a/tokens/create-token/anchor/programs/create-token/src/lib.rs +++ b/tokens/create-token/anchor/programs/create-token/src/lib.rs @@ -9,7 +9,7 @@ use { }, }; -declare_id!("GwvQ53QTu1xz3XXYfG5m5jEqwhMBvVBudPS8TUuFYnhT"); +declare_id!("Ex6CEJiwPiCotaNYmrjLSKQTr27tXrrA7981XZuQHQWe"); #[program] pub mod create_token { diff --git a/tokens/create-token/anchor/programs/create-token/tests/test_create_token.rs b/tokens/create-token/anchor/programs/create-token/tests/test_create_token.rs new file mode 100644 index 000000000..8acc0195d --- /dev/null +++ b/tokens/create-token/anchor/programs/create-token/tests/test_create_token.rs @@ -0,0 +1,145 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn rent_sysvar_id() -> Pubkey { + "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = create_token::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/create_token.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +#[test] +fn test_create_spl_token() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + + let instruction = Instruction::new_with_bytes( + program_id, + &create_token::instruction::CreateTokenMint { + _token_decimals: 9, + token_name: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/token.json".to_string(), + } + .data(), + create_token::accounts::CreateTokenMint { + payer: payer.pubkey(), + metadata_account, + mint_account: mint_keypair.pubkey(), + token_metadata_program: metadata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the mint account exists + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint account should have data"); + + // Verify the metadata account was created + let meta_account = svm + .get_account(&metadata_account) + .expect("Metadata account should exist"); + assert!( + !meta_account.data.is_empty(), + "Metadata account should have data" + ); +} + +#[test] +fn test_create_nft() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + + let instruction = Instruction::new_with_bytes( + program_id, + &create_token::instruction::CreateTokenMint { + _token_decimals: 0, + token_name: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/nft.json".to_string(), + } + .data(), + create_token::accounts::CreateTokenMint { + payer: payer.pubkey(), + metadata_account, + mint_account: mint_keypair.pubkey(), + token_metadata_program: metadata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the mint account exists + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint account should have data"); +} diff --git a/tokens/create-token/anchor/tests/bankrun.test.ts b/tokens/create-token/anchor/tests/bankrun.test.ts index e2ce027f3..37a0ab291 100644 --- a/tokens/create-token/anchor/tests/bankrun.test.ts +++ b/tokens/create-token/anchor/tests/bankrun.test.ts @@ -8,9 +8,7 @@ import type { CreateToken } from "../target/types/create_token"; // requires TypeScript 5.3+, but this project uses typescript ^4.3.5 with ts-mocha. const IDL = require("../target/idl/create_token.json"); const PROGRAM_ID = new PublicKey(IDL.address); -const METADATA_PROGRAM_ID = new PublicKey( - "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", -); +const METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); describe("Bankrun example", async () => { const context = await startAnchor( diff --git a/tokens/create-token/anchor/tests/fixtures/mpl_token_metadata.so b/tokens/create-token/anchor/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 { +describe("Create Tokens", () => { const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); const payer = provider.wallet as anchor.Wallet; const program = anchor.workspace.CreateToken as anchor.Program; const metadata = { - name: 'Solana Gold', - symbol: 'GOLDSOL', - uri: 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json', + name: "Solana Gold", + symbol: "GOLDSOL", + uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", }; - it('Create an SPL Token!', async () => { + it("Create an SPL Token!", async () => { // Generate new keypair to use as address for mint account. const mintKeypair = new Keypair(); @@ -28,12 +28,12 @@ describe('Create Tokens', () => { .signers([mintKeypair]) .rpc(); - console.log('Success!'); + console.log("Success!"); console.log(` Mint Address: ${mintKeypair.publicKey}`); console.log(` Transaction Signature: ${transactionSignature}`); }); - it('Create an NFT!', async () => { + it("Create an NFT!", async () => { // Generate new keypair to use as address for mint account. const mintKeypair = new Keypair(); @@ -47,7 +47,7 @@ describe('Create Tokens', () => { .signers([mintKeypair]) .rpc(); - console.log('Success!'); + console.log("Success!"); console.log(` Mint Address: ${mintKeypair.publicKey}`); console.log(` Transaction Signature: ${transactionSignature}`); }); diff --git a/tokens/create-token/native/package.json b/tokens/create-token/native/package.json index 88dcb0d51..192560abc 100644 --- a/tokens/create-token/native/package.json +++ b/tokens/create-token/native/package.json @@ -1,26 +1,26 @@ { - "scripts": { - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", - "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", - "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", - "deploy": "solana program deploy ./program/target/so/hello_solana_program.so" - }, - "dependencies": { - "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5" - }, - "type": "module" + "scripts": { + "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", + "build-and-test": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./tests/fixtures && pnpm test", + "build": "cargo build-sbf --manifest-path=./program/Cargo.toml --sbf-out-dir=./program/target/so", + "deploy": "solana program deploy ./program/target/so/hello_solana_program.so" + }, + "dependencies": { + "@metaplex-foundation/mpl-token-metadata": "^2.5.2", + "@solana/spl-token": "^0.3.7", + "@solana/web3.js": "^1.98.4", + "borsh": "^2.0.0", + "buffer": "^6.0.3", + "fs": "^0.0.1-security" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.1", + "@types/mocha": "^9.1.1", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "ts-mocha": "^10.0.0", + "typescript": "^5" + }, + "type": "module" } diff --git a/tokens/create-token/native/tests/test.ts b/tokens/create-token/native/tests/test.ts index d583c7798..69a530d2a 100644 --- a/tokens/create-token/native/tests/test.ts +++ b/tokens/create-token/native/tests/test.ts @@ -1,6 +1,6 @@ -import { Buffer } from 'node:buffer'; -import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mpl-token-metadata'; -import { TOKEN_PROGRAM_ID } from '@solana/spl-token'; +import { Buffer } from "node:buffer"; +import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from "@metaplex-foundation/mpl-token-metadata"; +import { TOKEN_PROGRAM_ID } from "@solana/spl-token"; import { Connection, Keypair, @@ -10,19 +10,19 @@ import { sendAndConfirmTransaction, Transaction, TransactionInstruction, -} from '@solana/web3.js'; -import * as borsh from 'borsh'; +} from "@solana/web3.js"; +import * as borsh from "borsh"; function createKeypairFromFile(path: string): Keypair { - return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require('node:fs').readFileSync(path, 'utf-8')))); + return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require("node:fs").readFileSync(path, "utf-8")))); } const CreateTokenArgsSchema = { struct: { - token_title: 'string', - token_symbol: 'string', - token_uri: 'string', - token_decimals: 'u8', + token_title: "string", + token_symbol: "string", + token_uri: "string", + token_decimals: "u8", }, }; @@ -30,26 +30,27 @@ function borshSerialize(schema: borsh.Schema, data: object): Buffer { return Buffer.from(borsh.serialize(schema, data)); } -describe('Create Tokens!', async () => { +describe("Create Tokens!", async () => { // const connection = new Connection(`http://localhost:8899`, 'confirmed'); - const connection = new Connection('https://api.devnet.solana.com/', 'confirmed'); - const payer = createKeypairFromFile(`${require('node:os').homedir()}/.config/solana/id.json`); - const program = createKeypairFromFile('./program/target/deploy/program-keypair.json'); + const connection = new Connection("https://api.devnet.solana.com/", "confirmed"); + const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); + const program = createKeypairFromFile("./program/target/deploy/program-keypair.json"); - it('Create an SPL Token!', async () => { + it("Create an SPL Token!", async () => { const mintKeypair: Keypair = Keypair.generate(); const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], TOKEN_METADATA_PROGRAM_ID, )[0]; // SPL Token default = 9 decimals // const instructionData = borshSerialize(CreateTokenArgsSchema, { - token_title: 'Solana Gold', - token_symbol: 'GOLDSOL', - token_uri: 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json', + token_title: "Solana Gold", + token_symbol: "GOLDSOL", + token_uri: + "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", token_decimals: 9, }); @@ -74,25 +75,26 @@ describe('Create Tokens!', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, mintKeypair]); - console.log('Success!'); + console.log("Success!"); console.log(` Mint Address: ${mintKeypair.publicKey}`); console.log(` Tx Signature: ${sx}`); }); - it('Create an NFT!', async () => { + it("Create an NFT!", async () => { const mintKeypair: Keypair = Keypair.generate(); const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], TOKEN_METADATA_PROGRAM_ID, )[0]; // NFT default = 0 decimals // const instructionData = borshSerialize(CreateTokenArgsSchema, { - token_title: 'Homer NFT', - token_symbol: 'HOMR', - token_uri: 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json', + token_title: "Homer NFT", + token_symbol: "HOMR", + token_uri: + "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json", token_decimals: 9, }); @@ -117,7 +119,7 @@ describe('Create Tokens!', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, mintKeypair]); - console.log('Success!'); + console.log("Success!"); console.log(` Mint Address: ${mintKeypair.publicKey}`); console.log(` Tx Signature: ${sx}`); }); diff --git a/tokens/escrow/anchor/Anchor.toml b/tokens/escrow/anchor/Anchor.toml index 95d4c4342..07b29cef7 100644 --- a/tokens/escrow/anchor/Anchor.toml +++ b/tokens/escrow/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -escrow = "qbuMdeYxYJXBjU6C6qFKjZKjXmrU83eDQomHdrch826" - -# [registry] section removed — no longer used in Anchor 1.0 +escrow = "4uNGr59nikomHqBMi8ckLBiuBQu6eSTRsCvcSoygXhLK" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.test.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/escrow/anchor/migrations/deploy.ts b/tokens/escrow/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/escrow/anchor/migrations/deploy.ts +++ b/tokens/escrow/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/escrow/anchor/package.json b/tokens/escrow/anchor/package.json index 06fd044a4..29b7034ed 100644 --- a/tokens/escrow/anchor/package.json +++ b/tokens/escrow/anchor/package.json @@ -1,27 +1,27 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana-developers/helpers": "^2.8.1", - "@solana/spl-token": "^0.4.14", - "@solana/web3.js": "^1.98.4" - }, - "license": "MIT", - "devDependencies": { - "@types/bn.js": "^5.2.0", - "@types/chai": "^5.2.3", - "@types/mocha": "^10.0.10", - "anchor-bankrun": "^0.5.0", - "chai": "^6.2.2", - "mocha": "^11.7.5", - "prettier": "^3.7.4", - "solana-bankrun": "^0.4.0", - "ts-mocha": "^11.1.0", - "ts-node": "^10.9.2", - "typescript": "^5.9.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana-developers/helpers": "^2.8.1", + "@solana/spl-token": "^0.4.14", + "@solana/web3.js": "^1.98.4" + }, + "license": "MIT", + "devDependencies": { + "@types/bn.js": "^5.2.0", + "@types/chai": "^5.2.3", + "@types/mocha": "^10.0.10", + "anchor-bankrun": "^0.5.0", + "chai": "^6.2.2", + "mocha": "^11.7.5", + "prettier": "^3.7.4", + "solana-bankrun": "^0.4.0", + "ts-mocha": "^11.1.0", + "ts-node": "^10.9.2", + "typescript": "^5.9.3" + } } diff --git a/tokens/escrow/anchor/pnpm-lock.yaml b/tokens/escrow/anchor/pnpm-lock.yaml index 52b251d71..e855bc5b6 100644 --- a/tokens/escrow/anchor/pnpm-lock.yaml +++ b/tokens/escrow/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana-developers/helpers': specifier: ^2.8.1 version: 2.8.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -57,18 +57,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -890,16 +890,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -917,7 +917,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/tokens/escrow/anchor/programs/escrow/Cargo.toml b/tokens/escrow/anchor/programs/escrow/Cargo.toml index 5cab9dff0..7ae25149d 100644 --- a/tokens/escrow/anchor/programs/escrow/Cargo.toml +++ b/tokens/escrow/anchor/programs/escrow/Cargo.toml @@ -20,9 +20,15 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"]} -anchor-spl = "1.0.0-rc.5" +anchor-lang = { version = "1.0.0", features = ["init-if-needed"]} +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/escrow/anchor/programs/escrow/src/lib.rs b/tokens/escrow/anchor/programs/escrow/src/lib.rs index 686b770d6..a49633cec 100644 --- a/tokens/escrow/anchor/programs/escrow/src/lib.rs +++ b/tokens/escrow/anchor/programs/escrow/src/lib.rs @@ -9,7 +9,7 @@ pub use constants::*; pub use instructions::*; pub use state::*; -declare_id!("qbuMdeYxYJXBjU6C6qFKjZKjXmrU83eDQomHdrch826"); +declare_id!("4uNGr59nikomHqBMi8ckLBiuBQu6eSTRsCvcSoygXhLK"); #[program] pub mod escrow { diff --git a/tokens/escrow/anchor/programs/escrow/tests/test_escrow.rs b/tokens/escrow/anchor/programs/escrow/tests/test_escrow.rs new file mode 100644 index 000000000..3d97ccbac --- /dev/null +++ b/tokens/escrow/anchor/programs/escrow/tests/test_escrow.rs @@ -0,0 +1,279 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = escrow::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/escrow.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + (svm, program_id, payer) +} + +struct EscrowSetup { + svm: LiteSVM, + program_id: Pubkey, + payer: Keypair, + alice: Keypair, + bob: Keypair, + mint_a: Pubkey, + mint_b: Pubkey, + alice_ata_a: Pubkey, + alice_ata_b: Pubkey, + bob_ata_a: Pubkey, + bob_ata_b: Pubkey, +} + +fn full_setup() -> EscrowSetup { + let (mut svm, program_id, payer) = setup(); + + let alice = create_wallet(&mut svm, 10_000_000_000).unwrap(); + let bob = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + let decimals: u8 = 6; + let alice_amount: u64 = 1_000_000_000; + let bob_amount: u64 = 1_000_000_000; + + // Create mints (payer is mint authority) + let mint_a = create_token_mint(&mut svm, &payer, decimals, None).unwrap(); + let mint_b = create_token_mint(&mut svm, &payer, decimals, None).unwrap(); + + // Create ATAs + let alice_ata_a = + create_associated_token_account(&mut svm, &alice.pubkey(), &mint_a, &payer).unwrap(); + let alice_ata_b = + create_associated_token_account(&mut svm, &alice.pubkey(), &mint_b, &payer).unwrap(); + let bob_ata_b = + create_associated_token_account(&mut svm, &bob.pubkey(), &mint_b, &payer).unwrap(); + + // bob_ata_a is derived but not pre-created (program uses init_if_needed) + let bob_ata_a = derive_ata(&bob.pubkey(), &mint_a); + + // Mint tokens: Alice gets token A, Bob gets token B + mint_tokens_to_token_account(&mut svm, &mint_a, &alice_ata_a, alice_amount, &payer).unwrap(); + mint_tokens_to_token_account(&mut svm, &mint_b, &bob_ata_b, bob_amount, &payer).unwrap(); + + EscrowSetup { + svm, + program_id, + payer, + alice, + bob, + mint_a, + mint_b, + alice_ata_a, + alice_ata_b, + bob_ata_a, + bob_ata_b, + } +} + +#[test] +fn test_make_offer() { + let mut es = full_setup(); + + let offer_id: u64 = 1; + let token_a_offered_amount: u64 = 1_000_000; + let token_b_wanted_amount: u64 = 1_000_000; + + // Derive offer PDA + let (offer_pda, _bump) = Pubkey::find_program_address( + &[ + b"offer", + es.alice.pubkey().as_ref(), + &offer_id.to_le_bytes(), + ], + &es.program_id, + ); + + // Vault is the ATA of the offer PDA for mint_a + let vault = derive_ata(&offer_pda, &es.mint_a); + + let make_offer_ix = Instruction::new_with_bytes( + es.program_id, + &escrow::instruction::MakeOffer { + id: offer_id, + token_a_offered_amount, + token_b_wanted_amount, + } + .data(), + escrow::accounts::MakeOffer { + maker: es.alice.pubkey(), + token_mint_a: es.mint_a, + token_mint_b: es.mint_b, + maker_token_account_a: es.alice_ata_a, + offer: offer_pda, + vault, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut es.svm, + vec![make_offer_ix], + &[&es.payer, &es.alice], + &es.payer.pubkey(), + ) + .unwrap(); + + // Verify vault contains the offered tokens + assert_eq!( + get_token_account_balance(&es.svm, &vault).unwrap(), + token_a_offered_amount + ); + + // Verify offer account data + let offer_data = es.svm.get_account(&offer_pda).expect("Offer should exist"); + let data = &offer_data.data[8..]; // Skip 8-byte discriminator + let stored_id = u64::from_le_bytes(data[0..8].try_into().unwrap()); + assert_eq!(stored_id, offer_id); + let stored_maker = Pubkey::try_from(&data[8..40]).unwrap(); + assert_eq!(stored_maker, es.alice.pubkey()); +} + +#[test] +fn test_take_offer() { + let mut es = full_setup(); + + let offer_id: u64 = 2; + let token_a_offered_amount: u64 = 1_000_000; + let token_b_wanted_amount: u64 = 1_000_000; + + // Derive offer PDA + let (offer_pda, _bump) = Pubkey::find_program_address( + &[ + b"offer", + es.alice.pubkey().as_ref(), + &offer_id.to_le_bytes(), + ], + &es.program_id, + ); + + let vault = derive_ata(&offer_pda, &es.mint_a); + + // Step 1: Alice makes the offer + let make_offer_ix = Instruction::new_with_bytes( + es.program_id, + &escrow::instruction::MakeOffer { + id: offer_id, + token_a_offered_amount, + token_b_wanted_amount, + } + .data(), + escrow::accounts::MakeOffer { + maker: es.alice.pubkey(), + token_mint_a: es.mint_a, + token_mint_b: es.mint_b, + maker_token_account_a: es.alice_ata_a, + offer: offer_pda, + vault, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut es.svm, + vec![make_offer_ix], + &[&es.payer, &es.alice], + &es.payer.pubkey(), + ) + .unwrap(); + + // Verify vault has tokens + assert_eq!( + get_token_account_balance(&es.svm, &vault).unwrap(), + token_a_offered_amount + ); + + // Step 2: Bob takes the offer + let take_offer_ix = Instruction::new_with_bytes( + es.program_id, + &escrow::instruction::TakeOffer {}.data(), + escrow::accounts::TakeOffer { + taker: es.bob.pubkey(), + maker: es.alice.pubkey(), + token_mint_a: es.mint_a, + token_mint_b: es.mint_b, + taker_token_account_a: es.bob_ata_a, + taker_token_account_b: es.bob_ata_b, + maker_token_account_b: es.alice_ata_b, + offer: offer_pda, + vault, + associated_token_program: ata_program_id(), + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut es.svm, + vec![take_offer_ix], + &[&es.payer, &es.bob], + &es.payer.pubkey(), + ) + .unwrap(); + + // Verify Bob received token A from vault + assert_eq!( + get_token_account_balance(&es.svm, &es.bob_ata_a).unwrap(), + token_a_offered_amount + ); + + // Verify Alice received token B from Bob + assert_eq!( + get_token_account_balance(&es.svm, &es.alice_ata_b).unwrap(), + token_b_wanted_amount + ); + + // Verify vault is closed + assert!( + es.svm.get_account(&vault).is_none(), + "Vault should be closed after take_offer" + ); + + // Verify offer account is closed + assert!( + es.svm.get_account(&offer_pda).is_none(), + "Offer should be closed after take_offer" + ); +} diff --git a/tokens/escrow/anchor/register.js b/tokens/escrow/anchor/register.js index 9e438057f..b9c8afd2f 100644 --- a/tokens/escrow/anchor/register.js +++ b/tokens/escrow/anchor/register.js @@ -1,4 +1,4 @@ -import { register } from 'node:module'; -import { pathToFileURL } from 'node:url'; +import { register } from "node:module"; +import { pathToFileURL } from "node:url"; -register('ts-node/esm', pathToFileURL('./')); +register("ts-node/esm", pathToFileURL("./")); diff --git a/tokens/escrow/anchor/tests/bankrun.test.ts b/tokens/escrow/anchor/tests/bankrun.test.ts index d5cfa0768..4a9e34b93 100644 --- a/tokens/escrow/anchor/tests/bankrun.test.ts +++ b/tokens/escrow/anchor/tests/bankrun.test.ts @@ -1,41 +1,38 @@ -import { randomBytes } from 'node:crypto'; -import anchor from '@anchor-lang/core'; +import { randomBytes } from "node:crypto"; +import anchor from "@anchor-lang/core"; + const BN = anchor.BN; + import { createAssociatedTokenAccountIdempotentInstruction, createInitializeMint2Instruction, createMintToInstruction, + getAccount, getAssociatedTokenAddressSync, getMinimumBalanceForRentExemptMint, - getAccount, - unpackAccount, MINT_SIZE, TOKEN_2022_PROGRAM_ID, type TOKEN_PROGRAM_ID, -} from '@solana/spl-token'; -import { - LAMPORTS_PER_SOL, - PublicKey, - SystemProgram, - Transaction, - type TransactionInstruction, -} from '@solana/web3.js'; -import { makeKeypairs } from '@solana-developers/helpers'; -import { BankrunProvider } from 'anchor-bankrun'; -import { assert } from 'chai'; -import { ProgramTestContext, startAnchor } from 'solana-bankrun'; -import type { Escrow } from '../target/types/escrow'; - -const TOKEN_PROGRAM: typeof TOKEN_2022_PROGRAM_ID | typeof TOKEN_PROGRAM_ID = - TOKEN_2022_PROGRAM_ID; -import IDL from '../target/idl/escrow.json' with { type: 'json' }; + unpackAccount, +} from "@solana/spl-token"; +import { LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction, type TransactionInstruction } from "@solana/web3.js"; +import { makeKeypairs } from "@solana-developers/helpers"; +import { BankrunProvider } from "anchor-bankrun"; +import { assert } from "chai"; +import { type ProgramTestContext, startAnchor } from "solana-bankrun"; +import type { Escrow } from "../target/types/escrow"; + +const TOKEN_PROGRAM: typeof TOKEN_2022_PROGRAM_ID | typeof TOKEN_PROGRAM_ID = TOKEN_2022_PROGRAM_ID; + +import IDL from "../target/idl/escrow.json" with { type: "json" }; + const PROGRAM_ID = new PublicKey(IDL.address); const getRandomBigNumber = (size = 8) => { return new BN(randomBytes(size)); }; -describe('Escrow Bankrun example', () => { +describe("Escrow Bankrun example", () => { let context: ProgramTestContext; let provider: BankrunProvider; let connection: anchor.web3.Connection; @@ -49,41 +46,24 @@ describe('Escrow Bankrun example', () => { const [alice, bob, tokenMintA, tokenMintB] = makeKeypairs(4); before( - 'Creates Alice and Bob accounts, 2 token mints, and associated token accounts for both tokens for both users', + "Creates Alice and Bob accounts, 2 token mints, and associated token accounts for both tokens for both users", async () => { - context = await startAnchor( - '', - [{ name: 'escrow', programId: PROGRAM_ID }], - [], - ); + context = await startAnchor("", [{ name: "escrow", programId: PROGRAM_ID }], []); provider = new BankrunProvider(context); connection = provider.connection; program = new anchor.Program(IDL, provider); - const [ - aliceTokenAccountA, - aliceTokenAccountB, - bobTokenAccountA, - bobTokenAccountB, - ] = [alice, bob].flatMap((keypair) => - [tokenMintA, tokenMintB].map((mint) => - getAssociatedTokenAddressSync( - mint.publicKey, - keypair.publicKey, - false, - TOKEN_PROGRAM, + const [aliceTokenAccountA, aliceTokenAccountB, bobTokenAccountA, bobTokenAccountB] = [alice, bob].flatMap( + (keypair) => + [tokenMintA, tokenMintB].map((mint) => + getAssociatedTokenAddressSync(mint.publicKey, keypair.publicKey, false, TOKEN_PROGRAM), ), - ), ); // Airdrops to users, and creates two tokens mints 'A' and 'B'" - const minimumLamports = - await getMinimumBalanceForRentExemptMint(connection); + const minimumLamports = await getMinimumBalanceForRentExemptMint(connection); - const sendSolInstructions: Array = [ - alice, - bob, - ].map((account) => + const sendSolInstructions: Array = [alice, bob].map((account) => SystemProgram.transfer({ fromPubkey: provider.publicKey, toPubkey: account.publicKey, @@ -91,10 +71,7 @@ describe('Escrow Bankrun example', () => { }), ); - const createMintInstructions: Array = [ - tokenMintA, - tokenMintB, - ].map((mint) => + const createMintInstructions: Array = [tokenMintA, tokenMintB].map((mint) => SystemProgram.createAccount({ fromPubkey: provider.publicKey, newAccountPubkey: mint.publicKey, @@ -117,13 +94,7 @@ describe('Escrow Bankrun example', () => { ata: bobTokenAccountB, }, ].flatMap((mintDetails) => [ - createInitializeMint2Instruction( - mintDetails.mint, - 6, - mintDetails.authority, - null, - TOKEN_PROGRAM, - ), + createInitializeMint2Instruction(mintDetails.mint, 6, mintDetails.authority, null, TOKEN_PROGRAM), createAssociatedTokenAccountIdempotentInstruction( provider.publicKey, mintDetails.ata, @@ -143,11 +114,7 @@ describe('Escrow Bankrun example', () => { // Add all these instructions to our transaction const tx = new Transaction(); - tx.instructions = [ - ...sendSolInstructions, - ...createMintInstructions, - ...mintTokensInstructions, - ]; + tx.instructions = [...sendSolInstructions, ...createMintInstructions, ...mintTokensInstructions]; await provider.sendAndConfirm(tx, [tokenMintA, tokenMintB, alice, bob]); @@ -173,37 +140,23 @@ describe('Escrow Bankrun example', () => { // Then determine the account addresses we'll use for the offer and the vault const offer = PublicKey.findProgramAddressSync( - [ - Buffer.from('offer'), - accounts.maker.toBuffer(), - offerId.toArrayLike(Buffer, 'le', 8), - ], + [Buffer.from("offer"), accounts.maker.toBuffer(), offerId.toArrayLike(Buffer, "le", 8)], program.programId, )[0]; - const vault = getAssociatedTokenAddressSync( - accounts.tokenMintA, - offer, - true, - TOKEN_PROGRAM, - ); + const vault = getAssociatedTokenAddressSync(accounts.tokenMintA, offer, true, TOKEN_PROGRAM); accounts.offer = offer; accounts.vault = vault; - const transactionSignature = await program.methods + const _transactionSignature = await program.methods .makeOffer(offerId, tokenAOfferedAmount, tokenBWantedAmount) .accounts({ ...accounts }) .signers([alice]) .rpc(); // Check our vault contains the tokens offered - const vaultAccount = await getAccount( - connection, - vault, - 'processed', - TOKEN_PROGRAM, - ); + const vaultAccount = await getAccount(connection, vault, "processed", TOKEN_PROGRAM); const vaultBalance = new BN(vaultAccount.amount.toString()); assert(vaultBalance.eq(tokenAOfferedAmount)); @@ -218,7 +171,7 @@ describe('Escrow Bankrun example', () => { // We'll call this function from multiple tests, so let's seperate it out const take = async () => { - const transactionSignature = await program.methods + const _transactionSignature = await program.methods .takeOffer() .accounts({ ...accounts }) .signers([bob]) @@ -226,38 +179,22 @@ describe('Escrow Bankrun example', () => { // Check the offered tokens are now in Bob's account // (note: there is no before balance as Bob didn't have any offered tokens before the transaction) - const bobTokenAccountInfo = await connection.getAccountInfo( - accounts.takerTokenAccountA, - ); - const bobTokenAccount = unpackAccount( - accounts.takerTokenAccountA, - bobTokenAccountInfo, - TOKEN_PROGRAM, - ); - - const bobTokenAccountBalanceAfter = new BN( - bobTokenAccount.amount.toString(), - ); + const bobTokenAccountInfo = await connection.getAccountInfo(accounts.takerTokenAccountA); + const bobTokenAccount = unpackAccount(accounts.takerTokenAccountA, bobTokenAccountInfo, TOKEN_PROGRAM); + + const bobTokenAccountBalanceAfter = new BN(bobTokenAccount.amount.toString()); assert(bobTokenAccountBalanceAfter.eq(tokenAOfferedAmount)); // Check the wanted tokens are now in Alice's account // (note: there is no before balance as Alice didn't have any wanted tokens before the transaction) - const aliceTokenAccountInfo = await connection.getAccountInfo( - accounts.makerTokenAccountB, - ); - const aliceTokenAccount = unpackAccount( - accounts.makerTokenAccountB, - aliceTokenAccountInfo, - TOKEN_PROGRAM, - ); - - const aliceTokenAccountBalanceAfter = new BN( - aliceTokenAccount.amount.toString(), - ); + const aliceTokenAccountInfo = await connection.getAccountInfo(accounts.makerTokenAccountB); + const aliceTokenAccount = unpackAccount(accounts.makerTokenAccountB, aliceTokenAccountInfo, TOKEN_PROGRAM); + + const aliceTokenAccountBalanceAfter = new BN(aliceTokenAccount.amount.toString()); assert(aliceTokenAccountBalanceAfter.eq(tokenBWantedAmount)); }; - it('Puts the tokens Alice offers into the vault when Alice makes an offer', async () => { + it("Puts the tokens Alice offers into the vault when Alice makes an offer", async () => { await make(); }); diff --git a/tokens/escrow/anchor/tests/escrow.test.ts b/tokens/escrow/anchor/tests/escrow.test.ts index db5f9d96a..c9d44bf7f 100644 --- a/tokens/escrow/anchor/tests/escrow.test.ts +++ b/tokens/escrow/anchor/tests/escrow.test.ts @@ -1,23 +1,16 @@ -import { randomBytes } from 'node:crypto'; -import anchor from '@anchor-lang/core'; +import { randomBytes } from "node:crypto"; +import anchor from "@anchor-lang/core"; + const BN = anchor.BN; -import { - getAssociatedTokenAddressSync, - TOKEN_2022_PROGRAM_ID, - type TOKEN_PROGRAM_ID, -} from '@solana/spl-token'; -import { LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js'; -import { - confirmTransaction, - createAccountsMintsAndTokenAccounts, - makeKeypairs, -} from '@solana-developers/helpers'; -import { assert } from 'chai'; -import type { Escrow } from '../target/types/escrow'; + +import { getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID, type TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; +import { confirmTransaction, createAccountsMintsAndTokenAccounts, makeKeypairs } from "@solana-developers/helpers"; +import { assert } from "chai"; +import type { Escrow } from "../target/types/escrow"; // Work on both Token Program and new Token Extensions Program -const TOKEN_PROGRAM: typeof TOKEN_2022_PROGRAM_ID | typeof TOKEN_PROGRAM_ID = - TOKEN_2022_PROGRAM_ID; +const TOKEN_PROGRAM: typeof TOKEN_2022_PROGRAM_ID | typeof TOKEN_PROGRAM_ID = TOKEN_2022_PROGRAM_ID; const SECONDS = 1000; @@ -30,7 +23,7 @@ const getRandomBigNumber = (size = 8) => { return new BN(randomBytes(size)); }; -describe('escrow', async () => { +describe("escrow", async () => { // Use the cluster and the keypair from Anchor.toml const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); @@ -59,30 +52,29 @@ describe('escrow', async () => { const tokenBWantedAmount = new BN(1_000_000); before( - 'Creates Alice and Bob accounts, 2 token mints, and associated token accounts for both tokens for both users', + "Creates Alice and Bob accounts, 2 token mints, and associated token accounts for both tokens for both users", async () => { - const usersMintsAndTokenAccounts = - await createAccountsMintsAndTokenAccounts( + const usersMintsAndTokenAccounts = await createAccountsMintsAndTokenAccounts( + [ + // Alice's token balances + [ + // 1_000_000_000 of token A + 1_000_000_000, + // 0 of token B + 0, + ], + // Bob's token balances [ - // Alice's token balances - [ - // 1_000_000_000 of token A - 1_000_000_000, - // 0 of token B - 0, - ], - // Bob's token balances - [ - // 0 of token A - 0, - // 1_000_000_000 of token B - 1_000_000_000, - ], + // 0 of token A + 0, + // 1_000_000_000 of token B + 1_000_000_000, ], - 1 * LAMPORTS_PER_SOL, - connection, - payer, - ); + ], + 1 * LAMPORTS_PER_SOL, + connection, + payer, + ); // Alice will be the maker (creator) of the offer // Bob will be the taker (acceptor) of the offer @@ -120,26 +112,17 @@ describe('escrow', async () => { }, ); - it('Puts the tokens Alice offers into the vault when Alice makes an offer', async () => { + it("Puts the tokens Alice offers into the vault when Alice makes an offer", async () => { // Pick a random ID for the offer we'll make const offerId = getRandomBigNumber(); // Then determine the account addresses we'll use for the offer and the vault const offer = PublicKey.findProgramAddressSync( - [ - Buffer.from('offer'), - accounts.maker.toBuffer(), - offerId.toArrayLike(Buffer, 'le', 8), - ], + [Buffer.from("offer"), accounts.maker.toBuffer(), offerId.toArrayLike(Buffer, "le", 8)], program.programId, )[0]; - const vault = getAssociatedTokenAddressSync( - accounts.tokenMintA, - offer, - true, - TOKEN_PROGRAM, - ); + const vault = getAssociatedTokenAddressSync(accounts.tokenMintA, offer, true, TOKEN_PROGRAM); accounts.offer = offer; accounts.vault = vault; @@ -177,20 +160,14 @@ describe('escrow', async () => { // Check the offered tokens are now in Bob's account // (note: there is no before balance as Bob didn't have any offered tokens before the transaction) - const bobTokenAccountBalanceAfterResponse = - await connection.getTokenAccountBalance(accounts.takerTokenAccountA); - const bobTokenAccountBalanceAfter = new BN( - bobTokenAccountBalanceAfterResponse.value.amount, - ); + const bobTokenAccountBalanceAfterResponse = await connection.getTokenAccountBalance(accounts.takerTokenAccountA); + const bobTokenAccountBalanceAfter = new BN(bobTokenAccountBalanceAfterResponse.value.amount); assert(bobTokenAccountBalanceAfter.eq(tokenAOfferedAmount)); // Check the wanted tokens are now in Alice's account // (note: there is no before balance as Alice didn't have any wanted tokens before the transaction) - const aliceTokenAccountBalanceAfterResponse = - await connection.getTokenAccountBalance(accounts.makerTokenAccountB); - const aliceTokenAccountBalanceAfter = new BN( - aliceTokenAccountBalanceAfterResponse.value.amount, - ); + const aliceTokenAccountBalanceAfterResponse = await connection.getTokenAccountBalance(accounts.makerTokenAccountB); + const aliceTokenAccountBalanceAfter = new BN(aliceTokenAccountBalanceAfterResponse.value.amount); assert(aliceTokenAccountBalanceAfter.eq(tokenBWantedAmount)); }).slow(ANCHOR_SLOW_TEST_THRESHOLD); }); diff --git a/tokens/escrow/native/tests/account.ts b/tokens/escrow/native/tests/account.ts index 507ad647c..0e88dc80b 100644 --- a/tokens/escrow/native/tests/account.ts +++ b/tokens/escrow/native/tests/account.ts @@ -1,13 +1,13 @@ -import * as borsh from 'borsh'; +import * as borsh from "borsh"; export const OfferSchema = { struct: { - id: 'u64', - maker: { array: { type: 'u8', len: 32 } }, - token_mint_a: { array: { type: 'u8', len: 32 } }, - token_mint_b: { array: { type: 'u8', len: 32 } }, - token_b_wanted_amount: 'u64', - bump: 'u8', + id: "u64", + maker: { array: { type: "u8", len: 32 } }, + token_mint_a: { array: { type: "u8", len: 32 } }, + token_mint_b: { array: { type: "u8", len: 32 } }, + token_b_wanted_amount: "u64", + bump: "u8", }, }; diff --git a/tokens/escrow/native/tests/instruction.ts b/tokens/escrow/native/tests/instruction.ts index 7b033c089..19fa0e753 100644 --- a/tokens/escrow/native/tests/instruction.ts +++ b/tokens/escrow/native/tests/instruction.ts @@ -1,7 +1,7 @@ -import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID } from '@solana/spl-token'; -import { PublicKey, SystemProgram, TransactionInstruction } from '@solana/web3.js'; -import BN from 'bn.js'; -import * as borsh from 'borsh'; +import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { type PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js"; +import type BN from "bn.js"; +import * as borsh from "borsh"; enum EscrowInstruction { MakeOffer = 0, @@ -10,16 +10,16 @@ enum EscrowInstruction { const MakeOfferSchema = { struct: { - instruction: 'u8', - id: 'u64', - token_a_offered_amount: 'u64', - token_b_wanted_amount: 'u64', + instruction: "u8", + id: "u64", + token_a_offered_amount: "u64", + token_b_wanted_amount: "u64", }, }; const TakeOfferSchema = { struct: { - instruction: 'u8', + instruction: "u8", }, }; @@ -57,7 +57,11 @@ export function buildMakeOffer(props: { { pubkey: props.maker, isSigner: true, isWritable: true }, { pubkey: props.payer, isSigner: true, isWritable: true }, { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, - { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, + { + pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, ], programId: props.programId, @@ -95,7 +99,11 @@ export function buildTakeOffer(props: { { pubkey: props.taker, isSigner: true, isWritable: true }, { pubkey: props.payer, isSigner: true, isWritable: true }, { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, - { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, + { + pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, ], programId: props.programId, diff --git a/tokens/escrow/native/tests/test.ts b/tokens/escrow/native/tests/test.ts index 5ae49b304..62f40bad9 100644 --- a/tokens/escrow/native/tests/test.ts +++ b/tokens/escrow/native/tests/test.ts @@ -1,17 +1,17 @@ -import { describe, test } from 'node:test'; -import { AccountLayout } from '@solana/spl-token'; -import { PublicKey, Transaction } from '@solana/web3.js'; -import { assert } from 'chai'; -import { start } from 'solana-bankrun'; -import * as borsh from 'borsh'; -import { OfferSchema, type OfferRaw } from './account'; -import { buildMakeOffer, buildTakeOffer } from './instruction'; -import { createValues, mintingTokens } from './utils'; - -describe('Escrow!', async () => { +import { describe, test } from "node:test"; +import { AccountLayout } from "@solana/spl-token"; +import { PublicKey, Transaction } from "@solana/web3.js"; +import * as borsh from "borsh"; +import { assert } from "chai"; +import { start } from "solana-bankrun"; +import { type OfferRaw, OfferSchema } from "./account"; +import { buildMakeOffer, buildTakeOffer } from "./instruction"; +import { createValues, mintingTokens } from "./utils"; + +describe("Escrow!", async () => { const values = createValues(); - const context = await start([{ name: 'escrow_native_program', programId: values.programId }], []); + const context = await start([{ name: "escrow_native_program", programId: values.programId }], []); const client = context.banksClient; const payer = context.payer; @@ -19,7 +19,7 @@ describe('Escrow!', async () => { console.log(`Program Address : ${values.programId}`); console.log(`Payer Address : ${payer.publicKey}`); - test('mint tokens to maker and taker', async () => { + test("mint tokens to maker and taker", async () => { // mint token a to maker account await mintingTokens({ context, @@ -35,7 +35,7 @@ describe('Escrow!', async () => { }); }); - test('Make Offer', async () => { + test("Make Offer", async () => { const ix = buildMakeOffer({ id: values.id, maker: values.maker.publicKey, @@ -63,16 +63,16 @@ describe('Escrow!', async () => { const vaultInfo = await client.getAccount(values.vault); const vaultTokenAccount = AccountLayout.decode(vaultInfo.data); - assert(offer.id.toString() === values.id.toString(), 'wrong id'); + assert(offer.id.toString() === values.id.toString(), "wrong id"); // borsh deserializes pubkeys as raw byte arrays, wrap in PublicKey for comparison - assert(new PublicKey(offer.maker).toBase58() === values.maker.publicKey.toBase58(), 'maker key does not match'); - assert(new PublicKey(offer.token_mint_a).toBase58() === values.mintAKeypair.publicKey.toBase58(), 'wrong mint A'); - assert(new PublicKey(offer.token_mint_b).toBase58() === values.mintBKeypair.publicKey.toBase58(), 'wrong mint B'); - assert(offer.token_b_wanted_amount.toString() === values.amountB.toString(), 'unexpected amount B'); - assert(vaultTokenAccount.amount.toString() === values.amountA.toString(), 'unexpected amount A'); + assert(new PublicKey(offer.maker).toBase58() === values.maker.publicKey.toBase58(), "maker key does not match"); + assert(new PublicKey(offer.token_mint_a).toBase58() === values.mintAKeypair.publicKey.toBase58(), "wrong mint A"); + assert(new PublicKey(offer.token_mint_b).toBase58() === values.mintBKeypair.publicKey.toBase58(), "wrong mint B"); + assert(offer.token_b_wanted_amount.toString() === values.amountB.toString(), "unexpected amount B"); + assert(vaultTokenAccount.amount.toString() === values.amountA.toString(), "unexpected amount A"); }); - test('Take Offer', async () => { + test("Take Offer", async () => { const ix = buildTakeOffer({ maker: values.maker.publicKey, offer: values.offer, @@ -95,10 +95,10 @@ describe('Escrow!', async () => { await client.processTransaction(tx); const offerInfo = await client.getAccount(values.offer); - assert(offerInfo === null, 'offer account not closed'); + assert(offerInfo === null, "offer account not closed"); const vaultInfo = await client.getAccount(values.vault); - assert(vaultInfo === null, 'vault account not closed'); + assert(vaultInfo === null, "vault account not closed"); const makerTokenBInfo = await client.getAccount(values.makerAccountB); const makerTokenAccountB = AccountLayout.decode(makerTokenBInfo.data); @@ -106,7 +106,7 @@ describe('Escrow!', async () => { const takerTokenAInfo = await client.getAccount(values.takerAccountA); const takerTokenAccountA = AccountLayout.decode(takerTokenAInfo.data); - assert(takerTokenAccountA.amount.toString() === values.amountA.toString(), 'unexpected amount a'); - assert(makerTokenAccountB.amount.toString() === values.amountB.toString(), 'unexpected amount b'); + assert(takerTokenAccountA.amount.toString() === values.amountA.toString(), "unexpected amount a"); + assert(makerTokenAccountB.amount.toString() === values.amountB.toString(), "unexpected amount b"); }); }); diff --git a/tokens/escrow/native/tests/utils.ts b/tokens/escrow/native/tests/utils.ts index b21d7d1ef..57da01343 100644 --- a/tokens/escrow/native/tests/utils.ts +++ b/tokens/escrow/native/tests/utils.ts @@ -6,19 +6,19 @@ import { getAssociatedTokenAddressSync, MINT_SIZE, TOKEN_PROGRAM_ID, -} from '@solana/spl-token'; -import { Keypair, PublicKey, type Signer, SystemProgram, Transaction } from '@solana/web3.js'; -import BN from 'bn.js'; -import { ProgramTestContext } from 'solana-bankrun'; +} from "@solana/spl-token"; +import { Keypair, PublicKey, type Signer, SystemProgram, Transaction } from "@solana/web3.js"; +import BN from "bn.js"; +import type { ProgramTestContext } from "solana-bankrun"; export async function sleep(seconds: number) { new Promise((resolve) => setTimeout(resolve, seconds * 1000)); } -export const expectRevert = async (promise: Promise) => { +export const expectRevert = async (promise: Promise) => { try { await promise; - throw new Error('Expected a revert'); + throw new Error("Expected a revert"); } catch { return; } @@ -50,7 +50,13 @@ export const mintingTokens = async ({ lamports: new BN(lamports.toString()).toNumber(), programId: TOKEN_PROGRAM_ID, }), - createInitializeMint2Instruction(mint.publicKey, decimals, context.payer.publicKey, context.payer.publicKey, TOKEN_PROGRAM_ID), + createInitializeMint2Instruction( + mint.publicKey, + decimals, + context.payer.publicKey, + context.payer.publicKey, + TOKEN_PROGRAM_ID, + ), ); transaction.recentBlockhash = context.lastBlockhash; transaction.sign(context.payer, mint); @@ -82,7 +88,9 @@ export const mintingTokens = async ({ } async function mintTo(context: ProgramTestContext, mint: PublicKey, destination: PublicKey, amount: number | bigint) { - const transaction = new Transaction().add(createMintToInstruction(mint, destination, context.payer.publicKey, amount, [], TOKEN_PROGRAM_ID)); + const transaction = new Transaction().add( + createMintToInstruction(mint, destination, context.payer.publicKey, amount, [], TOKEN_PROGRAM_ID), + ); transaction.recentBlockhash = context.lastBlockhash; transaction.sign(context.payer); @@ -138,7 +146,10 @@ export function createValues(defaults?: TestValuesDefaults): TestValues { mintBKeypair = Keypair.generate(); } - const offer = PublicKey.findProgramAddressSync([Buffer.from('offer'), maker.publicKey.toBuffer(), Buffer.from(id.toArray('le', 8))], programId)[0]; + const offer = PublicKey.findProgramAddressSync( + [Buffer.from("offer"), maker.publicKey.toBuffer(), Buffer.from(id.toArray("le", 8))], + programId, + )[0]; return { id, diff --git a/tokens/external-delegate-token-master/anchor/Anchor.toml b/tokens/external-delegate-token-master/anchor/Anchor.toml index 59bdd22d4..f69a53548 100644 --- a/tokens/external-delegate-token-master/anchor/Anchor.toml +++ b/tokens/external-delegate-token-master/anchor/Anchor.toml @@ -2,17 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false +resolution = true skip-lint = false [programs.localnet] -external_delegate_token_master = "FYPkt5VWMvtyWZDMGCwoKFkE3wXTzphicTpnNGuHWVbD" - -# [registry] section removed — no longer used in Anchor 1.0 +external_delegate_token_master = "85ucSW6NvhoAUYMr9QBXggsGLh3h2EqdWSDuGLzPetFd" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "yarn test" \ No newline at end of file +test = "cargo test" + +[hooks] diff --git a/tokens/external-delegate-token-master/anchor/package.json b/tokens/external-delegate-token-master/anchor/package.json index 7b479380b..ac1e4fc12 100644 --- a/tokens/external-delegate-token-master/anchor/package.json +++ b/tokens/external-delegate-token-master/anchor/package.json @@ -1,35 +1,35 @@ { - "type": "module", - "name": "external-delegate-token-master", - "version": "1.0.0", - "license": "MIT", - "scripts": { - "test": "jest --detectOpenHandles --forceExit", - "test:watch": "jest --watch", - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check", - "build": "anchor build" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.3.9", - "@solana/web3.js": "^1.98.4", - "ethers": "^5.7.2" - }, - "devDependencies": { - "@babel/core": "^7.23.7", - "@babel/preset-env": "^7.23.7", - "@babel/preset-typescript": "^7.23.7", - "@testing-library/jest-dom": "^6.1.6", - "@types/chai": "^4.3.0", - "@types/jest": "^29.5.11", - "@types/node": "^18.0.0", - "babel-jest": "^29.7.0", - "chai": "^4.3.4", - "jest": "^29.7.0", - "prettier": "^2.6.2", - "solana-bankrun": "^0.2.0", - "ts-jest": "^29.1.1", - "typescript": "^5.3.3" - } + "type": "module", + "name": "external-delegate-token-master", + "version": "1.0.0", + "license": "MIT", + "scripts": { + "test": "jest --detectOpenHandles --forceExit", + "test:watch": "jest --watch", + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check", + "build": "anchor build" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.3.9", + "@solana/web3.js": "^1.98.4", + "ethers": "^5.7.2" + }, + "devDependencies": { + "@babel/core": "^7.23.7", + "@babel/preset-env": "^7.23.7", + "@babel/preset-typescript": "^7.23.7", + "@testing-library/jest-dom": "^6.1.6", + "@types/chai": "^4.3.0", + "@types/jest": "^29.5.11", + "@types/node": "^18.0.0", + "babel-jest": "^29.7.0", + "chai": "^4.3.4", + "jest": "^29.7.0", + "prettier": "^2.6.2", + "solana-bankrun": "^0.2.0", + "ts-jest": "^29.1.1", + "typescript": "^5.3.3" + } } diff --git a/tokens/external-delegate-token-master/anchor/pnpm-lock.yaml b/tokens/external-delegate-token-master/anchor/pnpm-lock.yaml index 8d6c1b87a..715bcac46 100644 --- a/tokens/external-delegate-token-master/anchor/pnpm-lock.yaml +++ b/tokens/external-delegate-token-master/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.3.9 version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -73,18 +73,18 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/code-frame@7.27.1': @@ -2271,16 +2271,16 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -2298,7 +2298,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/code-frame@7.27.1': dependencies: diff --git a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/Cargo.toml b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/Cargo.toml index 45a99dc2e..d9d1f08ff 100644 --- a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/Cargo.toml +++ b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/Cargo.toml @@ -20,11 +20,17 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } -anchor-spl = { version = "1.0.0-rc.5", features = ["metadata"] } +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = { version = "1.0.0", features = ["metadata"] } sha3 = "0.10.8" solana-secp256k1-recover = "2.0.0" +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/lib.rs b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/lib.rs index 425bf8aee..ac602dcc9 100644 --- a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/lib.rs +++ b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/src/lib.rs @@ -4,7 +4,7 @@ use anchor_spl::token::{Token, TokenAccount, Transfer}; use sha3::{Digest, Keccak256}; use solana_secp256k1_recover::secp256k1_recover; -declare_id!("FYPkt5VWMvtyWZDMGCwoKFkE3wXTzphicTpnNGuHWVbD"); +declare_id!("85ucSW6NvhoAUYMr9QBXggsGLh3h2EqdWSDuGLzPetFd"); #[program] pub mod external_delegate_token_master { diff --git a/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/tests/test_external_delegate.rs b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/tests/test_external_delegate.rs new file mode 100644 index 000000000..edc4ae81b --- /dev/null +++ b/tokens/external-delegate-token-master/anchor/programs/external-delegate-token-master/tests/test_external_delegate.rs @@ -0,0 +1,224 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let ata_program: Pubkey = "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap(); + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program, + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = external_delegate_token_master::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/external_delegate_token_master.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_initialize_user_account() { + let (mut svm, program_id, authority) = setup(); + let user_account = Keypair::new(); + + let init_ix = Instruction::new_with_bytes( + program_id, + &external_delegate_token_master::instruction::Initialize {}.data(), + external_delegate_token_master::accounts::Initialize { + user_account: user_account.pubkey(), + authority: authority.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&authority, &user_account], + &authority.pubkey(), + ) + .unwrap(); + + // Verify the account was created + let account_data = svm + .get_account(&user_account.pubkey()) + .expect("User account should exist"); + + // Skip 8-byte discriminator + let data = &account_data.data[8..]; + let stored_authority = Pubkey::try_from(&data[0..32]).unwrap(); + assert_eq!(stored_authority, authority.pubkey()); + + // ethereum_address: [u8; 20] — should be all zeros + let eth_addr = &data[32..52]; + assert_eq!(eth_addr, &[0u8; 20]); +} + +#[test] +fn test_set_ethereum_address() { + let (mut svm, program_id, authority) = setup(); + let user_account = Keypair::new(); + + // Initialize + let init_ix = Instruction::new_with_bytes( + program_id, + &external_delegate_token_master::instruction::Initialize {}.data(), + external_delegate_token_master::accounts::Initialize { + user_account: user_account.pubkey(), + authority: authority.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&authority, &user_account], + &authority.pubkey(), + ) + .unwrap(); + + // Set ethereum address + let ethereum_address: [u8; 20] = [ + 0x1C, 0x8c, 0xd0, 0xc3, 0x8F, 0x8D, 0xE3, 0x5d, 0x60, 0x56, 0xc7, 0xC7, 0xaB, 0xFa, + 0x7e, 0x65, 0xD2, 0x60, 0xE8, 0x16, + ]; + + let set_eth_ix = Instruction::new_with_bytes( + program_id, + &external_delegate_token_master::instruction::SetEthereumAddress { + ethereum_address, + } + .data(), + external_delegate_token_master::accounts::SetEthereumAddress { + user_account: user_account.pubkey(), + authority: authority.pubkey(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![set_eth_ix], + &[&authority], + &authority.pubkey(), + ) + .unwrap(); + + // Verify + let account_data = svm + .get_account(&user_account.pubkey()) + .expect("User account should exist"); + let data = &account_data.data[8..]; + let stored_eth_addr = &data[32..52]; + assert_eq!(stored_eth_addr, ðereum_address); +} + +#[test] +fn test_authority_transfer() { + let (mut svm, program_id, authority) = setup(); + let user_account = Keypair::new(); + + // Initialize user account + let init_ix = Instruction::new_with_bytes( + program_id, + &external_delegate_token_master::instruction::Initialize {}.data(), + external_delegate_token_master::accounts::Initialize { + user_account: user_account.pubkey(), + authority: authority.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![init_ix], + &[&authority, &user_account], + &authority.pubkey(), + ) + .unwrap(); + + // user_pda is derived from user_account key + let (user_pda, _bump) = + Pubkey::find_program_address(&[user_account.pubkey().as_ref()], &program_id); + + // Create mint and token accounts using Kite + let mint_pubkey = create_token_mint(&mut svm, &authority, 6, None).unwrap(); + + // Create ATA for the user_pda + let user_pda_ata = + create_associated_token_account(&mut svm, &user_pda, &mint_pubkey, &authority).unwrap(); + + // Mint tokens to user_pda's ATA + let mint_amount: u64 = 1_000_000_000; + mint_tokens_to_token_account(&mut svm, &mint_pubkey, &user_pda_ata, mint_amount, &authority) + .unwrap(); + + // Create recipient ATA + let recipient = Keypair::new(); + let recipient_ata = + create_associated_token_account(&mut svm, &recipient.pubkey(), &mint_pubkey, &authority) + .unwrap(); + + // Perform authority transfer + let transfer_amount: u64 = 500_000_000; + let authority_transfer_ix = Instruction::new_with_bytes( + program_id, + &external_delegate_token_master::instruction::AuthorityTransfer { + amount: transfer_amount, + } + .data(), + external_delegate_token_master::accounts::AuthorityTransfer { + user_account: user_account.pubkey(), + authority: authority.pubkey(), + user_token_account: user_pda_ata, + recipient_token_account: recipient_ata, + user_pda, + token_program: token_program_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![authority_transfer_ix], + &[&authority], + &authority.pubkey(), + ) + .unwrap(); + + // Verify recipient received tokens + assert_eq!( + get_token_account_balance(&svm, &recipient_ata).unwrap(), + transfer_amount + ); + + // Verify user_pda's balance decreased + assert_eq!( + get_token_account_balance(&svm, &user_pda_ata).unwrap(), + mint_amount - transfer_amount + ); +} diff --git a/tokens/external-delegate-token-master/anchor/tests/external-delegate-token-master.test.ts b/tokens/external-delegate-token-master/anchor/tests/external-delegate-token-master.test.ts index 3b9334897..713f9db17 100644 --- a/tokens/external-delegate-token-master/anchor/tests/external-delegate-token-master.test.ts +++ b/tokens/external-delegate-token-master/anchor/tests/external-delegate-token-master.test.ts @@ -1,12 +1,13 @@ -import { createMint, getOrCreateAssociatedTokenAccount, mintTo } from '@solana/spl-token'; -import { Connection, Keypair, PublicKey, SystemProgram } from '@solana/web3.js'; -import { expect } from 'chai'; -import { start } from 'solana-bankrun'; +import { createMint, getOrCreateAssociatedTokenAccount, mintTo } from "@solana/spl-token"; +import { Connection, Keypair, PublicKey, SystemProgram } from "@solana/web3.js"; +import { expect } from "chai"; +import { start } from "solana-bankrun"; jest.setTimeout(30000); // Set timeout to 30 seconds const ACCOUNT_SIZE = 8 + 32 + 20; // Define your account size here +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 async function retryWithBackoff(fn: () => Promise, retries = 5, delay = 500): Promise { try { return await fn(); @@ -17,8 +18,10 @@ async function retryWithBackoff(fn: () => Promise, retries = 5, delay = 500 } } -describe('External Delegate Token Master Tests', () => { +describe("External Delegate Token Master Tests", () => { + // biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 let context: any; + // biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 let _program: any; let authority: Keypair; let userAccount: Keypair; @@ -34,15 +37,15 @@ describe('External Delegate Token Master Tests', () => { const programs = [ { - name: 'external_delegate_token_master', - programId: new PublicKey('FYPkt5VWMvtyWZDMGCwoKFkE3wXTzphicTpnNGuHWVbD'), - program: 'target/deploy/external_delegate_token_master.so', + name: "external_delegate_token_master", + programId: new PublicKey("FYPkt5VWMvtyWZDMGCwoKFkE3wXTzphicTpnNGuHWVbD"), + program: "target/deploy/external_delegate_token_master.so", }, ]; context = await retryWithBackoff(async () => await start(programs, [])); - const connection = new Connection('https://api.devnet.solana.com', 'confirmed'); + const connection = new Connection("https://api.devnet.solana.com", "confirmed"); context.connection = connection; // Airdrop SOL to authority with retry logic @@ -64,7 +67,9 @@ describe('External Delegate Token Master Tests', () => { _recipientTokenAccount = recipientTokenAccountInfo.address; // Mint tokens to the user's account - await retryWithBackoff(async () => await mintTo(connection, authority, mint, userTokenAccount, authority, 1000000000)); + await retryWithBackoff( + async () => await mintTo(connection, authority, mint, userTokenAccount, authority, 1000000000), + ); // Find program-derived address (PDA) [_userPda, _bumpSeed] = await retryWithBackoff( @@ -72,7 +77,7 @@ describe('External Delegate Token Master Tests', () => { ); }); - it('should initialize user account', async () => { + it("should initialize user account", async () => { const space = ACCOUNT_SIZE; const rentExempt = await retryWithBackoff(async () => { return await context.connection.getMinimumBalanceForRentExemption(space); @@ -102,8 +107,8 @@ describe('External Delegate Token Master Tests', () => { expect(account.ethereumAddress).to.deep.equal(new Array(20).fill(0)); }); - it('should set ethereum address', async () => { - const ethereumAddress = Buffer.from('1C8cd0c38F8DE35d6056c7C7aBFa7e65D260E816', 'hex'); + it("should set ethereum address", async () => { + const ethereumAddress = Buffer.from("1C8cd0c38F8DE35d6056c7C7aBFa7e65D260E816", "hex"); await context.program.methods .setEthereumAddress(ethereumAddress) @@ -118,7 +123,7 @@ describe('External Delegate Token Master Tests', () => { expect(account.ethereumAddress).to.deep.equal(Array.from(ethereumAddress)); }); - it('should perform authority transfer', async () => { + it("should perform authority transfer", async () => { const newAuthority = Keypair.generate(); await context.program.methods @@ -135,7 +140,7 @@ describe('External Delegate Token Master Tests', () => { }); afterEach(async () => { - if (context && typeof context.terminate === 'function') { + if (context && typeof context.terminate === "function") { await context.terminate(); } }); diff --git a/tokens/external-delegate-token-master/anchor/tests/types.ts b/tokens/external-delegate-token-master/anchor/tests/types.ts index 191287b59..af8faa3a2 100644 --- a/tokens/external-delegate-token-master/anchor/tests/types.ts +++ b/tokens/external-delegate-token-master/anchor/tests/types.ts @@ -1,7 +1,8 @@ // tests/types.ts -import { PublicKey } from '@solana/web3.js'; +import type { PublicKey } from "@solana/web3.js"; export interface ProgramTestContext { + // biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 connection: any; programs: { programId: PublicKey; diff --git a/tokens/nft-minter/anchor/Anchor.toml b/tokens/nft-minter/anchor/Anchor.toml index 8335d19a6..01e0aa447 100644 --- a/tokens/nft-minter/anchor/Anchor.toml +++ b/tokens/nft-minter/anchor/Anchor.toml @@ -4,19 +4,15 @@ solana_version = "3.1.8" [features] resolution = true skip-lint = false -seeds = true [programs.localnet] -nft_minter = "52quezNUzc1Ej6Jh6L4bvtxPW8j6TEFHuLVAWiFvdnsc" - -# [registry] section removed — no longer used in Anchor 1.0 +nft_minter = "H7AFrTXDtmpPoc2kHD8hkEF1i8Pbhi17QUczbkWYYFBV" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests — the validator tests (test.ts) need Metaplex Token -# Metadata cloned from mainnet which is too slow/unreliable in CI. -# bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/bankrun.test.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/nft-minter/anchor/package.json b/tokens/nft-minter/anchor/package.json index 3b548a433..c5772e47f 100644 --- a/tokens/nft-minter/anchor/package.json +++ b/tokens/nft-minter/anchor/package.json @@ -1,20 +1,20 @@ { - "type": "module", - "scripts": { - "postinstall": "zx prepare.mjs" - }, - "devDependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.3.11", - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "anchor-bankrun": "^0.4.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3", - "zx": "^8.1.4" - } + "type": "module", + "scripts": { + "postinstall": "zx prepare.mjs" + }, + "devDependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.3.11", + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "anchor-bankrun": "^0.4.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3", + "zx": "^8.1.4" + } } diff --git a/tokens/nft-minter/anchor/pnpm-lock.yaml b/tokens/nft-minter/anchor/pnpm-lock.yaml index eed086d2d..6ac87288e 100644 --- a/tokens/nft-minter/anchor/pnpm-lock.yaml +++ b/tokens/nft-minter/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: devDependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.3.11 version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -47,18 +47,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -839,16 +839,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -866,7 +866,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/tokens/nft-minter/anchor/prepare.mjs b/tokens/nft-minter/anchor/prepare.mjs index 7c5ec464b..fb6b26225 100644 --- a/tokens/nft-minter/anchor/prepare.mjs +++ b/tokens/nft-minter/anchor/prepare.mjs @@ -1,17 +1,17 @@ #!/usr/bin/env zx -import { mkdir, rm } from 'node:fs/promises'; -import { join } from 'node:path'; -import { $ } from 'zx'; +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; const programs = [ { - id: 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s', - name: 'token_metadata.so', + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "token_metadata.so", }, ]; -const outputDir = 'tests/fixtures'; +const outputDir = "tests/fixtures"; const overwrite = true; try { diff --git a/tokens/nft-minter/anchor/programs/nft-minter/Cargo.toml b/tokens/nft-minter/anchor/programs/nft-minter/Cargo.toml index 1f2a9e5b6..bafce2b5f 100644 --- a/tokens/nft-minter/anchor/programs/nft-minter/Cargo.toml +++ b/tokens/nft-minter/anchor/programs/nft-minter/Cargo.toml @@ -20,9 +20,15 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } -anchor-spl = { version = "1.0.0-rc.5", features = ["metadata"] } +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = { version = "1.0.0", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/nft-minter/anchor/programs/nft-minter/src/lib.rs b/tokens/nft-minter/anchor/programs/nft-minter/src/lib.rs index 3f5af3893..443bc97e2 100644 --- a/tokens/nft-minter/anchor/programs/nft-minter/src/lib.rs +++ b/tokens/nft-minter/anchor/programs/nft-minter/src/lib.rs @@ -11,7 +11,7 @@ use { }, }; -declare_id!("52quezNUzc1Ej6Jh6L4bvtxPW8j6TEFHuLVAWiFvdnsc"); +declare_id!("H7AFrTXDtmpPoc2kHD8hkEF1i8Pbhi17QUczbkWYYFBV"); #[program] pub mod nft_minter { diff --git a/tokens/nft-minter/anchor/programs/nft-minter/tests/test_nft_minter.rs b/tokens/nft-minter/anchor/programs/nft-minter/tests/test_nft_minter.rs new file mode 100644 index 000000000..a619ac936 --- /dev/null +++ b/tokens/nft-minter/anchor/programs/nft-minter/tests/test_nft_minter.rs @@ -0,0 +1,145 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_wallet, get_token_account_balance, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn rent_sysvar_id() -> Pubkey { + "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ); + ata +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +fn derive_edition_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[ + b"metadata", + metadata_pid.as_ref(), + mint.as_ref(), + b"edition", + ], + &metadata_pid, + ); + pda +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = nft_minter::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/nft_minter.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_mint_nft() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + let edition_account = derive_edition_pda(&mint_keypair.pubkey()); + let associated_token_account = derive_ata(&payer.pubkey(), &mint_keypair.pubkey()); + + let instruction = Instruction::new_with_bytes( + program_id, + &nft_minter::instruction::MintNft { + nft_name: "Homer NFT".to_string(), + nft_symbol: "HOMR".to_string(), + nft_uri: "https://example.com/nft.json".to_string(), + } + .data(), + nft_minter::accounts::CreateToken { + payer: payer.pubkey(), + metadata_account, + edition_account, + mint_account: mint_keypair.pubkey(), + associated_token_account, + token_program: token_program_id(), + token_metadata_program: metadata_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the mint account exists (NFT = 0 decimals) + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty()); + + // Verify the metadata account was created + let meta_account = svm + .get_account(&metadata_account) + .expect("Metadata account should exist"); + assert!(!meta_account.data.is_empty()); + + // Verify the edition account was created + let edition = svm + .get_account(&edition_account) + .expect("Edition account should exist"); + assert!(!edition.data.is_empty()); + + // Verify 1 NFT was minted to the associated token account + let balance = get_token_account_balance(&svm, &associated_token_account).unwrap(); + assert_eq!(balance, 1, "Should have exactly 1 NFT"); +} diff --git a/tokens/nft-minter/anchor/tests/bankrun.test.ts b/tokens/nft-minter/anchor/tests/bankrun.test.ts index 77a9e535a..63958d563 100644 --- a/tokens/nft-minter/anchor/tests/bankrun.test.ts +++ b/tokens/nft-minter/anchor/tests/bankrun.test.ts @@ -8,9 +8,7 @@ import type { NftMinter } from "../target/types/nft_minter"; // Use require() for JSON import — "import ... with { type: "json" }" needs TS 5.3+ const IDL = require("../target/idl/nft_minter.json"); const PROGRAM_ID = new PublicKey(IDL.address); -const METADATA_PROGRAM_ID = new PublicKey( - "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", -); +const METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); describe("NFT bankrun Minter", async () => { const context = await startAnchor( @@ -38,10 +36,7 @@ describe("NFT bankrun Minter", async () => { const mintKeypair = new Keypair(); // Derive the associated token address account for the mint and payer. - const associatedTokenAccountAddress = getAssociatedTokenAddressSync( - mintKeypair.publicKey, - payer.publicKey, - ); + const associatedTokenAccountAddress = getAssociatedTokenAddressSync(mintKeypair.publicKey, payer.publicKey); const transactionSignature = await program.methods .mintNft(metadata.name, metadata.symbol, metadata.uri) diff --git a/tokens/nft-minter/anchor/tests/fixtures/mpl_token_metadata.so b/tokens/nft-minter/anchor/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�NxVp3=+hMEx8~E4|{zY)zZp=pRseR0g$vHa}JRk3T=1 zYW>yq%xbs#?-^d-5PHRR8^>!_Q4)x@g?IAJ9i5EtNb%X(BQmQ(qa9@ z^pETMp8A#clYV+v&QHG(aZB8bD(zE0^9Ow7iS=C7UrGkVaa8~McNgMewFf@$AwM?l z_vqC5w9Bi{w?jW(?7Hb^_vfiMZiS5r`$K=g@6&O=h5cEW>rXHG6T;_w!r{8TA^hFg zpA^ndWIkd3MO@c@vfRg5t|sIVyR=T`6G|7pAL9FAdk>{0{n@B#$20W*Km13{{o?(4 zq5si?s)Tz-uG|Ln1M?WQ6E`XRaQ*K&AEut&AmdoZ_e|(2hIkV%!o3>yKFlXwnZNfo z!ap{j`g}XCtDk}OEy0I)P+t?yB`+ZVJSO~Dsoy2|RJ(N@E^gc*>7;j!JmZ1)X}WKf zrU!4<^zs$*bh#SuUZAi)-p@%PfZyoL>^aw-=4WSoyItnpN$*y9 zIzL?ie(ymQKfjyw>VBdSpUE8GKn^$C`HXFUK)IVNbSf8C>V9qWKa$Q>+D^cCW5L-R zz{&ip<b-qjY~k{rBc#|`hTZQ)&!gSX_k;jL~9PyMv4zl)C>-io&H z)P83079BUdtJ=a-#yTFpcy-(QT|%$0zVlHB=9S5*3)|us*OiYbm#0n7*1yQt_=oRk z6{4r%>3q&K=acSt#SMk)ewW|ZTN#=r@>8C4mYv(Od12=fwHI}p7j_@kbi??t_mHLs zl<$*1)o0_cZxTz)V^X+UFK$@72DdVBhVXklXzeY4^NC-&Z|y2-Da`9~`&Ttu$oWQ3 z3mp&2yu#=k$T8(HoQMA1gU$MO59gIZ`RTcN=)qk1Vd#apuI+?yzkzbq^{SU~Zd>S= z%|oxY^e=B7dc^e8_qI__J}TpU!t19sl^5T4&~Cl-dcYrl-ucg}r*nERuB*NvUw?2N z?Vj>ervGNkIOBW2GM?^t#5L7}zAg~T6Y1Y>{wR9a{gX`s7T?iR{SptEo(|@bZyL$; zdWMe%bi?)p?hOi${rJe)=tnA7XXoU~<{>Hn+dL$dEAy*Ux#|!?_->=C4C6@ zTL^`>;>lZ}U`JEB*t(a|8RwvcZ_@LxwoXTW;EQrW@wy)D+J*Gn?aA*`k&=GzF8Esd z>+5`;pXnLXXQ`eseU|DO(`TukQGGU^p7H%^q1-gbMRdZP;c=em$+&Lu2>YH~Tra8L z+^y}#4U1p&Dqj8OXH*8YeipCLevB8d$l?OZm)M65>e0VZx}7rv1jo<6XN7e?8JBry zc|H^ieqleUABxdGNV!a|ZG4??EPmj2IouD(`7inAPMo(X$*sxoXDZT66t1s+eLLGZ zEbWBtb1GGg?4E(T$=eLApO1I6%GoO67q-8wtvu_vWqhmUU7pkPKo(C4;ZyGu?gso< zlCS!<@7Mk4m;1}{7~B0^_F~Zd(KHT(M)C9W64g1X_lwaE$seyh zoKqLNlna}s{5f~}_}`-STl96097=&{frX#*r@4HzrT;=g7sF~ zX}243eNj4I?_s%`!2^0rpnu}}iuCg{Gd^Pj?czl(Yye2M=A_Qv(&@4TJ*ai@%D38#lS<;Ol%NmuQjoVc+^(wO(lGq&?_ zxSv+jg9G}0`389wqu&!kgzdAva30|HZrl4ZJ5nyZTIc^mYVUl#KZLWv{PGvW{`8M* z6#DktxpueLS^REE3m$7w-|0+wxaUL7bh_p#`o9ZBA5yLtHSM3$xH!j=dLHAEmTTSz zW%{zVPVj>trTVqD#?q=E*Y3DR=ygBVr-UzdERu4BPYJ<&4w4T0pXcL+;H!|2Wt=xk zx6}QQ?B^vc7x1z0d%uDhD<$PA9)tEwrz5(VqMN9a($1pCbq4Sw5vG6%)5>{@sl$lzzzqgwUsfT%q;kRjAIOn#7qyA>TUrr~|_tvvO-{HN&pXCny{+#bu^nI|- zH%a&ACy7YhQ2t4JH)wi5>6`SelXNjUr#-&GxW2JzT&JJ#xJGUJ+Zulnxwt{l5q|oe zrv7$X{6*yh@pGYf*575CPW!t=(`kPfOM3kH3lsx>mAam%@%c?$|Dwvz99?*e?fi_d zL&o(z_Fnx-*Bh=ELcQ@hz%NEBZ=oIJ{_fCz2tCX$hVjSCzR>I^+)O_(usaVxzp?x* zv_rmmQLg+t#%YYsA>4&1SKYEf{ex|!0{Ca@G$alL@jJ_cC zLOziG1pOO}4<>w}nGdeyxCZqe$nn9GXgI`Q#-j}%{1oM?Tb77^2+I=>*O%<~Pr(|l zk4hc7?hy84ILDV`_2UOQyvF0_@8-&n#m|2y{ZM}Hx9{qe3VN^IQZO0$tW?nWOXi0q z!bq83-KX+k_89lnXgbw1yEUEanPEwfuV<9-;dn(HznU~J>)JxEKt9+{Kd0gQq~bxf zI~zYp$# z7X8O^P4^Xbs~+(6D|}~D_&u@vHT*sx*DrqWPkPT!_hc*Iq0jDVmhQ6jTzl#~0P98e zexcF6A9@dH{Zk|J zua0WEvqRJCr|Hx92L09d-TUo%P@agJD4sU2M!e6`T~a@;SwGVI_N;&DJ$u$~yI(Kl zqeIXGA)iq$InGtEepoJ|zO5gUb{RiB6Lj!-NoDA9$!ERqAs+QI_>H6!*C#I5%Z!g3cs-5uE%4n^M?6bVULT^WrByx!&>`}b)~jO#;uHVlcYmPU(u@- zX{N~@z5H3EllCiYN94S&<+(3NDW4d5Pq=wq}z9&iFQYfZm0PC!RfYN`6{K`K24`|+pFmT<%^_mx1`6n>+Wwp zE_|5zo4Wrh^EV$=ez$#$v7P5nEFSH8YV7%gem^kuw|HMysE33eZRQVOzyu^5ukpU8 z`I%h#?etTO&f)xFH_BCa>{NTUQP?_|KNw%7^9Pmh?0l}ux37cv{gok}`Tq6Lzienb zoIkL?oImi#@!x~@(3>)DnOwKdAEZC2zE(bD{o4`4$>t9a3!H2`zo`6>&L1AIwAv}m z2Q6*(s*T+_1UmYD-Oz67yy13{_ptxO6Zd8c-26CWelPjqc)Tk&ZV%+ zN$=S1Wewr3MY%Y=zjd$pLGIu6*H%fogxmP?c5xNj=QuFGD5pPlJ%OZgeh>S5)Z**6 zU>&*`-6QnqpTW_k-){awxAr@|-*c+I58=EC?Q%Sy1~}RN79E$6?yFEW(`)*D(h!cw z(`^brZgU^&S8+d$>$!~IEPiG3(CSCe6@88U!}{!;CQtesq*G$wvm~BPerV?*^*`5l zq~+NotQQy@oxfqs&)Dw6_H`)I zc^zU0;W_}n|5%n=WxzMb_}j5qD+s@(nz?!Qa#X|;GmX~LhfJBSMo3*Wom=(qSo zJX2mr)C*wq;Coyb$cy~Aru{Iz7TTZTUG2uT+!l`OMbhDP+Mo10%fFqo+dAKHyNmgb z>dn;t=)59M?T^hD&V)07U%G#8fyH~TkZj1+E98%UvnQ2?*`Wo~B|mQH{g26llBNGv z?a%`E%fD%9^{3aS>!a^&(MNkQURX~OJ_zagh~z6@laGmEIKR9V`+fcUN91e#lOHv+ ze-Fja9g&Vpao<9+L-{(Bi)MZe`Ay`st}y9O%XzYmnx-D(RG4tTy|>v8((examQj$T zQd=ke%j8+M@Dx^b@{Hv z3es!H(vxui3e!es(zlEEWSIZK^tnu1f0>?+bTN8~;1}v)fI|OYt^77(@ZnbN&&88u zoS|#@3+>arxp5uOzxi;ky!ZpA=R>%6pj>sm`ZtyI-j@y;|B(Ol{6~0hFWB$@pk7Gl zDP1y8N$r>Euh72Vh5DI&$mELpK9s9-1G!>+hb&l)NgeQcFfKpDIdGS!WWC9ee>Z+u z%kzGfd_TsLqy8NI@^W+)L?)yU{T|Zcy;yHAM(XGM()hDx_@ndQ&by?YVc{p2OZQi3 zZ#LxY%_ZPz;zzrYevf6E!i`_A_kflrsvKee<$v%E^tU|Yt6J}?Soj3sT&wj7w}kzM zm7#@CFo*GzUObD!1?mq`pY&V#*%LbCJOlZVXVpU0W>ufxq%o*28`?OCPcH zGD{!T^sX05x-$Gyd4_mIM?tSTq3FHDD}WdKzYyIeelsbDTOJcQ$?8YtSzUk7+R<@< zAJhVO|4+&H`vqS=-xD`<{0R4n8*_Zh@}2v%e9iCy4u>Uwul9RnzxC&UJo&vJl9uDHva?{x9ttsx-;h zUf@T*K9J+<+3&Bzg|smkM8u z7@ETQTc^7`ONAv7mU-}gRCYp^3h#+7l=OAcJbA8(o-NOB78K6c3T&@b7?K@+rNUt0 zVoATRz%G{xcS;1SRCqXAAnDuX`&y;KL*l{G&Oaad#ppZW1eK3}8qqmF)6^?8^&Cg` zlk!JT3Vxp8J8#ByLb#CMW&F+FaNP3uqc4+rh3N~leNiejbK=_Au!Wda}yA znQs#QDiu~eMLxoP+7py--aCO2tWx3b3CcGspHjZrHbMDj>jdSSTPBdTONCn}D8F3u z)bo%oMzP`rdcN_aS-;2!Jh$U~5c*A_ykq@Z_#*T(-g7_byb+c0!}&sa@AHv(K>29& zI(<+0kADmO#Q5+>e#1ZELwTbA@`T!#Czw&5D8r}oQDxU5k$=+t@?-U5BP!u{Ja}F9 zr?l^vru2z&-x;I^IuZITwDQ#xq|Xok74%WFHzs|G(X&%LUz6)UJ?ay|bA^?E^$Ftn z*Q3Bwr(I*>>FeXgNDnB)yVTxRhO+THIfp;F((zB$tACQLRzGHR5HIl?kKb7T^1tPH z7E?MsC)du2(rFReCERD7Af1kU7jzOVGJePRC&|u{(}R4xH(0l0`HBe4NpZ`WrC=c<1poJR!?;_uR~-&ddb{dYB$ z^9xX_2Ov&Uvyc0iw?8RxYYLZoT=YrZ(W8^m|-t(iV97jDw?8@m>@_(gd={llv*KIPcBsb}Z_o4{+q-uQ^>{^t+jHb_0v`>}V! zPljK~pW9dVi++d4G3ken;yw5E^4Gfl_JfJ1AwNG}gkSqG_+UisdHIw>6VF7s%&)ij zed_mH{5~BwT{nq$nZ2s8b(Qyj{DbE9WS%Kh)%W*6W|C7?E=rR$-jeSJ=S>{YV)Qjw zIO3)45buWw-|Zp#PnR|xPiE3KH%fw`h4CR1(4b)!+R+@$v5Sb_88tK4;BY)$9JoY?{?<+ z?soEBZI$w!$x~ckBk2S(&!6)f`H1Z%bY}7Mag483er?z8GHZ8luHBoZ-DSCUS7^GS z^hz$Wc4p`^-+oBtugcz& zFGOub@%fUBPPvd+rj_W?KkPq^H>B#BOvvnP3 zw^QH;_4m?yh|T|-LB&sdJS^`kGoC5wYUd{<-9KXS$6e~*RE8JHI%26~nXS_)Ut%AQ zjyHOD7!ar*ZihS}Uax#oSALY6lKg7ez$HnMDg;!U4#0|59 z0~WtsOs+?N2Q0q3*yy@Y@$-0cQD#@Lv-K-weo>t}UF+3fDd}YH8J5;~Z!(wGh~ug4 zCb_tD(bkKpe`sGk?p%zXEA?9Vz{01rut(knk2%dQ@CmY zJc9mUx`6RKAarzo&D#&k39Go@>-O+|50w9o#}yY*j0PD+!0 z^yIUUE=@XD7SmIc;2Lv#(@zim3ZEyQ#JlO=^2s4^Co@o$>#x1 z$X5rU|0pllL0*c{-%ERCj2M52|7v=ojyv{IYC8RH#otIegm(n+JdR!}{FS^%++FC! zcHSfHJfd(Ach`2lZsqo-Vi~_u;YF%PN0c8*g}Gw!N`+mbk4l9( zLdjBLw(JBd6+SL245h+M(Iln9`EqijRG1<1Un+c~@HDhgD*SnY6fYId6-!wv?2eux z>F>!-{!-y=Sq~`{z9T0EONE04PGL%gPZTJMrNXldlw8~|Q7Fmteu;~e3NI;8BbN$& z1!}xf;ghn`QY!p?)T!m7v*o!2I~e)?u$-JK75+#hyHr?OI8XBbCF+vrHNc$ZeyZmT z3!Bk1rnePnC%B$4Tb@tJj)78PQsDwgp9V^)A4xv1o`wJ6hx411_$GPddR~&gACmX3 z$3|DNG~yCa)BEuB`;6%y4Cmq}t2T%6cVgY#&M4BwNbOB1@0$P0r}E{AS6&ZbomcRK zo)P_0?fj1Jcd6U@p{+G}Y2WIjg~bU8!) zsAQJP>)Ja^AFq_x;9J!%#pnr>hs-|i1wHV6MCn(u<)FwN{ktAi4dr8){t@VzU$6Nd z{5ZeYA9_~w7|z)XoOpP*>b08U!Fld>(=&gEdeoP+3;5oy*iF*A9K_ABpG)$SEoz@V z?t$+>OFrvk$WdSIIO{i`2Uq(Cdti92kb3YlEWJ$9VL!!x4fFu@0_FelJK;wR91#CM z9z57G4`8`GeLQY9TGjp&&Jo<#nCTH;-%|S;;z4+EUF|gMT@S&o>{7q2eDa;xaR|Dn z>(0A%Tv@RK@dhc|acS17)#JYW_>5 zp?(kOA>*9!<*RhOj4$KH<(5|dj2kbqwDIXI<5TTE+PPQS;W+;K$1{6RKVb&iCmm?- zecjLF1?}S3U;AhB_4%nD>CC~S%YGv8o_~nj#{wCBEN{7w|!_ho(I87Y3x|5!7; zb50Py?|z#2;lpD1k$#`e!J}S3k^Wx(b;A1@*-YTA&A}tboCv({exC4-r0{m<=KExU z6M=Wu2;u#s!1K5kz6Yp!CymRh-6uWXnH#SVf7dIs3+00PssGGwOTQ1~`b`adB6$7- zE_^`THtqL&bMR>2PXyl2q~Bjo;r*g~b9fK&dr;|U>m{Vu#2lW_JOMnzc-?uQCHzmN z_}-Zt_p{o;ZL=PA<5vi0IEC~3IXK~Xruv}`oKJq4aPDpC?{ztNZRI5gFYM>JaM+8{ z9W8Ksb9~pfzZRFw>#-32PqD6Bj5eqJKR*YzZU4uBOMd&(j|uNxDZGx4H0z(PcH?pk zco%$%@NC}#_~-E)|D1P%@b3IW!dso>=>w0+WGJ82>e7o3m=V*=HTBuly%ig}c{1uD}QhUQ-UwV^e)v~^qPHRa{f zwD^`szV%=Kwa(ddW+clY^!E4rzWF&hTKnw1_S);U*M6S)`spo?%Q#D=lFcU<3#(E& zeLH8D%LL`A_{(K~134{Md?E60f0V;}`6=Ly?Q&esAW|EHe- z{v|0to|(gYDt;ODU!eZ@Nr+SXw?EF|yCkAB>leSQ<6EEi3QhXgV>vvSXYlrBc-~$> ze}}jo^ISe|s$kG6Ke;C-rE5zL->L8q_5SVw@a^vvUu>WGeZG17{DRPd@=ttR;@#o7XvODzy^Vr=n!5`Cwb@zB4eFSlCS=pldy_XwZe<$UVz5EVkvWwr@ z^8Foo`&-C9k4wHm`vapO7yKk1(7(dCjk|1I;c_oe+x)4;|H+l;eT1$R!Z+)1zlZY&;8&ID7)N4VBjy*@Gmw9UWP$uXlgqDi z-`R-wQOQ@?%6aA({}Z|{!|_s_uJk=fJg8^Geerw(9WV66f7ox}dhYXtF+Qx@0MF+I zPn?c%DAEs0y7a5cH^>M6Pv(mi_VFS5nd6ckmq&Y(E{?;2=eOj)?0o37+H-ae*~gD| z4mlk^a-Tyse)RL9r#gNdQjW+y6O7N#UP^x^|IdHN_DbdF7nOY;56!MoP|sm>2&Q~H zybRuMUVyjqUP7>g@|?AKbnG+U4H!;dept^MkY`L! zx4^;nNha%ibsi^7kZ!rx%3#u)tmnN6VS;qZcgyvCvZ;g5XSDITbt#{_TKU|o)8KMX z#0j34+IE~zy9dMXRdoO1=UHW*OY_C@QhOg4qUDG7K~K~8V1nZ{$Z=BTNIlEsxKy}@ zxQX))uK&o7Zz{|867_vtAMu;s+5QXU|I^>f&bjrsT&i{zrkKyy4fA;Xyc=c#@_PHZ z2wz5TJIIxN+=f@&;()*ncy}U~^v6x`eyS;6c$G#xF+aW}Q!Zg2?YaN-cAGCUIkxkh zaHyF)yX;)yxXHE0;?D^?Kfa#lwX*LA@tj@bdXb&8O4p0*+;_TO#C5`?VZG?v+Ma$m zcKOLZU46!U;(QqAC*3bVj_-U^HZR}bauxUeMf;=H?2`Fsopp!am>i^yCX# zjLv?*_kP)D)?Zkugt)(T|DDAt{BCSr|1J9v>cC$r2E-(dNm{PO4I7}t`qaQqHo8)Ti^a4i~p7TSag2W z_xYsv+s<@rdMp>T6MXybb43nQ=66MoQl-f8=e2(M?kfF7`zLLl()6n9!-U7J-|3kk zJYoIL`bP*aaGuh?GY2&iHa?lH7ko(Ri2LQ2D1EJIzlsb#4gp{G*R4kmk&cwFgNm;i zUq_9vV>!M0bLH!3bG}x0YkIT&A<%p9ck7+dbDQ67r$6s+dG{jlS@yZvIPq&17jT|C z>G~?+@r``n^EhE&?_U2H;f3*@NS~3-+*$`*r5hi&&4_L~dc4{v|#a`-OK3e`n}7!h@g! zezlEqoa)eLjHgxbczghQKPTnkN6`1ncObMsg&x+gbC_S=W_Gca_JDGTq`eq~e*dozp`Xn6!<|~d`y1E+ z;Y@ddf%C z@Ax`j7@suQ*Hb=daP#$)SPn;Jd;~uANdE@Cl7H#BnesTtIhUT+T7am0zrtItB!BT8 z=RzlAne(LJ8(zco{>5KCfxk+pEiND;DV?@N*JHzu4(kTX(CnKEY#jvOZa#Fxc0D4;pOu?b!D+>gt8xH2Xw7 z@2k`E6&%Oyqun=@yIt9>^zE)I_Z*g+F@ItC;_^qNy{K>Jz47?=MT#))N1vneyhz&- zm#>f4vTz{w7a(MdpA)TXmGr9AgnovvQ50!Js;t#@E{GqU{BPyP_eeg%Y z&N<3@y!MOWS8r4Q_GY#B*k5)F-@-kVPaf~=WlRUYHBIqxy*@7Y8L@BQFNku#pmM`* z5%J4a-hWckT_BwIV-51R{87}ea0xx8XEELbrU%#7=|QU&kM-a}#q&36=W%+o`48V8 zUOJuh#ra>Zc)na0$0DA?xY^?)#O?WWoGa_-LvLH(&bt*a@3|>0d1J%->-GJgu->R2 z8j$puANhXB&&#ZQB<_D)ub)r3SC1=Rj0@obi-kMn|HAKRJaSNAIiJJ%gDT!i|16nL z{2Sz&>DQw&o{@C{&FA}rL$zT2{qBbH$Fw}-Md-yxrM&xpzb_|l-<=}wqlr*P)g} zdx4ks9MXNTjGscfPnP{eSgzS6Kl_Qe-5uI)&a0x`=DsxOm-J-+ez7szA(7Wl(_e08%Hi0PxhVH}Eb_dgSQ;Bk~7kzaPd-EsQ8 z^t>?nl={6(1Of82T2d*ihfwOEEOs}Cf9M&;qyzN`%yWU zQ_@ujw)rpFXDam+hV==`X3D6DH3|lk?bN+Iyeb zbuYLqc)HonN(V+IB4;K`d;R+jKWRL^lk}wD4Hz;1bHM!1Zi6{LnY528?EI8-7b&cI z*v|6v$^RFc%AfOkK5sXdeZ=(d>};m6${&bO7eLN z`8r3v-v14q%@0eJbhm0_f9r7;?DRev`jq!^y{7+k-fx|)V?4Ec#=-*UKZ=EZZBOh6 z{#5z*51Jm!o9p82x8wOe_;L6vU)Q?jqxJ1Q+5JuBTz>R79v{SbUnlu0TX}zz>uII^ zl{()O)5(4%i_cHo-^_2Hx?X}V$m?6Of4d|zu=x4Bef&MIjq~ay=LMc_zY(|J?@iip z55}Dr%&V`>%JoUPv|qnMnG>-dCckD{O%V%$o>v~AMX!F?~8@Ub)L}AZ{husy7!0qejnS3eZu*B%3hh<@3KO& zqJ7VR-cDIL>38yR(jdxN{{}towsNPT+>DizscMWXeScT8dA}e1cD+5l4*9MBit(O6 zzNj5KuWo+I&+{QaraD0X_auLqWB$|EbwibLcBRREOfLo@_}cmC>m=E{D)p*gR~Z>+eo^J#qA%dT;K{Rik#StH!1)57@0hiCWN2hi%avMr z-(VPehr%K+wtr}c!HfgKP%!wgy{97)c`5AnkMUTak%Lf?w`XnFX?>%^5mjB5Qcz4Uw@gm=|gs$5j zX8jW9XnT@neVSk9wG7^9@Ckzl6dt~Bi=~qf$+BAwCZCdJ{aOZ-&%ddq zgf5d$%)cYTKg<`4Yc62j;1YR)?#I!eO%rda^;tSU9Q%LScHFS;8T)_lH?D)eM*M;1 zIDgN?tU*$d$TGUfgh&PNM?WPws<5w5?5yp+5JqNYDvX6r8UVp&a-=PSTm5{EC zL)J*c@U-uaL9Y=R`F+kQpDxpEP5Cuu`nD8$V*QfqPs~@@zNUKl%v`>1K^^DA_XNT3 z(@! zOuCb0ZpUm_vTQ)}-*zA6n(CL?A^e4yoZ8zBJL~P_QcHhXF8$?}eyyZKf6>rk`yL`- z?9Xh_=O*=Cox|((t;wZ(eJ_}!zGpS74^BjWSBZU}kmqIgyyyx|*8Pw|YGD?}FTW{q z3Zk}8Zjh&_bfL7EFW`?B2@F4h{E#N*P2{1!+3WedMdH{F`SVVDUV3_~=HDRYk$HoZ z$MgBWB>$7&?3H}pDfK~v`sImV|6XL z{PM)F|8$PSoUZ5hGu`nu=7(37^*W;u^n#9J;i&Rpcs1<-{DFuoHh*)cFinyQiOrw7 z-XX3#{6XTB*SdbVT%L$ew|^r`hu?Uy_#-?amwf*o`>&&TZ*oQcg94YW|LJd8%6TU1 z_YiknB=u$UT^E83IhS@^+jG|W3KoWj*tfGxD)J$H#M? zA|LxVxyZ3!4us8gm@Be(83{#WNlU z#q%fK?|?nSYYQDU-mlS}haD`4^V;Cd&tE{l=JzA{_#67ZE+;4X6!w!-;^akrpWGl% z_#s$6GZ%lvYVR$j!+D$oEC~z9ry;UO4`+ zob5{W)%3yjK+f%GhH~wP+OA615o_NQ`b>Hb6SnWRCF>6no+MwBO_W#VGWJ8sRcvo^ z1MM+EKq5asH*-?^++h8{4bl+#C0EgJR4yZ)ipe|X=d|g^?}>h3J`N?^PkaXm;{Nz!k*Y8aab}lGbzXKUYv*F^PuWnnlej;&cw`qwzEK zHy0?HRPJ;3k5%SFIh{|jP#W@mgZvlwL+_~w9ecgqpb8@)=a;cfWteT%3r#!+0=|#DNxpKRtJ#l@Y6ZCb6 z-2(n=AW>hg8aWGybiYi+~=M8TTkQoPxvZqlyNOq-5_7?pLF?y@6d>No$iRO z)4@=I|9k&k-j`9D^K@rQdYu2OLO0~JLf#|)w~VItzgKGc_LHhV?Hjec_dl|qZNd0{M({QA>+cO8 z@i?88_77-!xk^4(+V@yK`d`@>VleGZ_KhfftIbQ_*1p@`laEPzpTe;}oJ&7GD&IG0 z)Q|sR_=v~#+vzPWkx6;^mB&eUWz8i9lkSSy<*nnS>$Wx5==(5Ex|20m8O(MiYo2fA z4`{uWHLp#Gz=hg?=J$E|P-ANC?TSvp?^>LW z_(Q%gsq4aV`hHD6-jLp_c#buscW8P+=?S+|9-&M>eT(QN{F={;_qGiSYD~6)t+ku1xyBf71&h!e(~7q1-E})c4Qc zEbj~J6<@KydC_nS`}fir-=#iPHM_27wo1EvJqhE4{QYs8_P~#|YPtTFZl2%V(xC`S ztzXylP~mv5blS_c-msZ|A?7#gLBHGb0rUqQS}u!=+YCNNe7?Tp>&aHXoU_vRdAv?P z@c)^}RnC8DzW&p1RlbD@liRg6E^Rmad#MzVpPUP4z1LBmK3^2*<_bQK6eekZ$w}{H zlYm5iq1=Io$nhZYo4gRG;SK1$U*uIP(0{t4QyhZd*`{!*V`o4b&zS0?=)cJ#C*QnAT-NW_!wYmk0Y@gaY&<=-IrL)HA|PL_-D{gS>PARU{t z_g?-+d0*MKN8igiR6c7N-%l4>`}Ni%sb`=0sVT}oOtXE(0{f+O-L-wp@Hzhtf33ju z<)lN-KTs~VPL+7Sn4SZew)Z)^tkPf0et7l6XfHGi{ClCc*X*}O|DBw}^69#Fc7HYX z#rLmQNssRblk;Fouf$*aOm>kk8qc@DFW;aIN%>OVt?;9wKk{1aT7qu*0miRbc!fU0 zmO(ztBl`6Iq118>>1k&@A!jdh*-5DNlDO^pWPf39nb9MRcbe}{;R!|wHmRPrHVh+@9)ouy~uy~!Cuu~te*_EwlsgQya!+Y zS@KH%qUk=L665=}zVGDw2Z2@O7unl4rxi9`t#>(8QmCU&wb*}4Vg1YcuhK6qxWB(d2@X~2N%?Hj@AE@GkB{-5G+oY7x2j%M z?A&q1G2O}cGeq}SF(`e^srIS%Rk03iTu`h1 z<9UmucgXWjdzMZUg5_5_?IP7{xo=4Efu7^hc+>YC_uTb6Xjdu^8-@8Ro~Om;QcFeiGlB_jy9Re^FH4 z*Ugar!YCc~{rZ7y9WB4lAnc?)HCv}zEAqqmr6bZS;Oh{7A>VgVdkN-eN{ikm)WKi$ zGTr>`5SKOUz8fZJpY(XIblN#8PxuM^@LfB|vsk!U;kch0lX5O+44J?@M2uBf}DrJUr!597srJ5)b*@O?~2Rmx=Ros_fBe`n*?qm+Zq zH)r#P)FberPf*8vxUvZ!TtDObACUT!_jM{^q00J`^T7qsMLkT;w|KEiJx$K|A!Tn(>lxG7xB`jh3P$MGbqjgIB4KTVg(HI$eoyXF2q`it4i4UdhN zXCEev`2x@x9$^J|czhPe+aHwu0mZ`iNMBje z7hK;Uzute#`U~)FNaoFh=q-M7uZornGJi?OIwOQl5i{cn@A?W?MsL%F&>XZOvm zVm(v(;Jwc9bH;b4E9U!!bMXDm%6Ha_da$n{Jh)L2ueyx)V_an8!sK$M&n53>_5Ms; z?@rPSc@F0Ie3kIo_tCgs#Plx~JYkCcS*ex!2R{k>P4y|lKbph;+z5X&d3-|UCxpol ze9*X_;!N$kSv_O9dVUuAGDAB{c6TVgX5|j#%AGIelHHw}zgVz&^EC=)>)ce|y8dRZ zWP$$uD(;iBc~keNzFv^}Thn*<$7wqaultGox_Y>RcGN76!uSI6Je+IK*YART9H$*F zXFI~hA~5-d=@Yc`VWxxryXD+$zec(8eh1Sr?<4=x@1Ldgn!opbIVpd|&hP`iFWoaY z9&cw@+Nb#)PL|ihVJY=JdtVR#NB0}yl3t}ZtXQW{Yy-Sl{__3uXT4ODwfz_0`5)J> z%t8s}m)9G}3-qBMfE*#0%f;W!nkx@GIwV!(w3B)t?x7+kSMwR}kpl8duI4k`L;Xpv zHa!v<^F5!#moL{phA-&Qr~5# z)Q*xilxp-_ZWpKr_|kS$c2^%U*<2NF*{o%a1p3$gEWdbOe9T=Ea+ zhSXk`v;AkS<`ev>zCGhl$|sY5-0vS1xjia&2MOam5k!mf@4ZCE_qM*?FJEgz(d@k8 z0&%FyPWymUJ-Yo zMUeBQa)b-={acZ{-xn0?1LDAVyoqrd@?ZaQ$lv19+7Xpk|DtE=cpCmt{z?4I`54d( zlSEu{Ws`Xk;CtpSwhQI_oMB@8_jw;Ve@#7F(;>N}{_#Tww;6oUU_q$w4;V~6lY8$B z?zZ>lU)IpS1lzxvtm(D)=AYKAQ#e^k#qfQxc{@sa))IeLw?3Qk9hwNfZOXa!zhVrMS3d9I=TgCcq*qq5e6oz~FBWJQ3z5fH z-XU^0o#l{U@um94iJ@}!5w_RQvCf#jO&Q&1$han_KhuDH{3J@aQL=&$6Z^7p6Vx0M zjN@d__gj)Ld6;zhdPK#}b5`zSy^V4)J?NsoHj|5xs&eU&C+PWgl?(kwY!63r?ScG| z|J-ZfACFKjEtoBYeNf*#K4_E&JJ^NDV=5;PVNoP^(_SfZkTkC7aXUq>m|4X8q;9H;and6<9 z&+s#`-`Q<^p14ldenm-+aBI8NW{# z4B$6@;P=II@EiSpo*v}CtT)qRAMf-pGJXrQlwWp!)BVsw^!ZhF{3d@heuHYM*Ww4? zPoG>*dFJDXx&5*A54IlEj6YE6m_I+3{Z7sNG2|2T=b*sg&#U2&?L0B<{EK=iEv;Jw4eux3eVwT<6>}{_ZjT+^x??&mg_c_>6YMeEyDXq$%0` zjy^A5C=D(lhlspOB_i}51b zTahfFcQ-N46?@nBdAjCWPf6p|Q_w5e zSu?$wQoW+y`#j5hdgXjvFaFT)ndo0ayYzVhU$>3z7r(I%p?$PGdg( z+HQKXTApEs{LJ)gJNY}0eP3hxg?_^2)M($7OR;c;>DLa!J7{!{8hocdhkQSb-GdkF zQz!JPrf4)y*duV|^F!g&^DnZGb=ka;H z`N5m$2j@C3{&eak`i*9OuT}N3&E&n5Pu~yUq(61N{B?w0|W>i~^< zN%^^6W_rhdKi0eD(4$E2WO-KQi!K5E+?U7e`{}-1{{5D}+wy-&@+W)O89!Lxu-)qz z*LyPkeQi_yWuO()+W~q^U!j)+M#t|99lkE|lk1=Lw{xtQVVt9W!qz{0+!(iaqtFR{ zu9kJsr&BLm1#dIG{2lRMVcPW3&NI&EFR|_b`ldxM%XXhbDZt=fqL`tFzAly+<2fa?{y_O(u5q2a(#1GF*u4Nr5Br}m!Fk1G{T9t1CMox1(}2P! zi+_uSPf*UM5YHB*JT%qSw z#!1Vpzxw~$IBEMFdbLRPYLxnI@!5QS`LN)DKUxpHO4m``FCS4nGXAFCNB-r6mHS88 zZ{dE~?Qt$YocG%&^UJ~RImyOTyl+sxYiRBJhS7J>;Nu2=UY|oVq`zE!T;Wp7H+3IK zdcL~Kd`bJ1l_#FW&-JF~A@?mgJWi?? zrhn;r_cZCVdj)-7#K&DOf1kf77M`R1W_CVvxgPF*WFhmNN>^FcO3$5MB7dSkX%~93 zew=#d-_wZcbo+dc>D#IG0RR0z> z?ysz*JbXMG^Vz@u^FKs>Pp7}@7XCNW%TK|tPOqhXRlE6|M=#+YAn!-;y?qKle)D$f7x1m&!1i!b|=_$v# znVvFU$@KIQ(x2+-LxfLJPkn!GGd-1IiR!_hzy0ae(?P-8Oi#*Dt%Ao6WQM ze2~}MrFu*~%=hD2zkI;jbyS}*o!&2Znf;wwzs!C((>Lpf)A@Mohf{qs{-*l&Q|gyr zOM6St8>}^WC7*t;q0h@felHFZ;7)@UXFgw)xY!L_wVC; zNuQJe-n%wozZvzQU(UI5J%{7%x$49C0Qvk}W_Es*>p(y0cp!|i{gnmY>yoZFU!`nl z_%1|w#|eE=YFVuF=_NTwgP*s<{Z>(L!C?F|5#0xYd3f(9MBH`XN4Qz=_&Ceykp39r zN#*4GCgIQV1B~AWc_O8M5x?h?w6UCz-zsgS8|yHCnxh92hx|a#$>ffF6Jp3N=Tghj zCn3L|R8D@cax%yIg?#5z^*CNf!Z~2SSIYOBl$W2neEuoNk5iJ*a`L&Pw?Jn5fGRH~ z9q_Z@tK7Gt0?YFk{M=T@&wu(4;wSHEZRF=a&|h%+pswF>fBxBRh;NQ*KA+di_Cp+J z`I-nve%SYO9C}qIjD8J_Xp`yp(f8N;xsTtKoyYR~U1!^@+!=fhl{tU!{0?Piz`3M6 zzL)&6oKbK;xRd2${vQ##!2iFOXL@eYzq^;V?~t}9Yu`bGJzk^#4c5LmF7$EwDxo92 zuVavOxP33=e*HnC^OAdDcZ@^&Wk0q0O~22go%;c^eL;tHoFMmanVgO&?E9S2?psH| zAI`hPdhmH6(fyF$ms762OYu~?*0TNM_Y!YUH{pr92(RxXJo#3_n>zG)GW&MFnewGd zKEZwtVcaM3#difj_p_w`nic)Q?+kfve|V4jU+C4UUi_c_7|#s?BBj4YHbcuV*m>^I zL?1eY&$6FK`Gk6Y<8G;EMvLh^dxzz{-_zp#A@co7GrK0wPW~MP`qz_ve=D_HqZ|C+nB)IlG5>EM-Ex21zvD0W^TF<~k$ZtO zJy^SCy~N-_Ehzin3?49e+Te`_Z#1~i;DZLQGkDbCUW3OBUTbil!QBQA5MD#Y39CCS zeZS>1KD7@Tywu*05Waeg!m%FdzUv1yS?zeG-j7ee-QRMR`uAkl7M6c6^X1DYTi5CP z+07ZA(<3~ydzha2g&s`^(wE?u$0vS9@jO^lJHJTQBRcDyVTP z+9l%^O%GEhU-MhQ`@INnhHs4`XrO0in)r=RKK=lnZ#2cTsyUu1$~X4QS8jscvV9pH zmuh)gFVlJvS8Vxq=3h|ncW=i%0kAg2pR5mdi5b9R;c`tc*S$p!P*~pI1t{0d3nC~a8PrhfM?Oo_N$^FYu zTJJ*pht$91^vwHD$mIf=Z!Oz;ZT}M9S15j$d~HAeLzP2~{Zi6(jPN+)qNL|2;R)(P zvi^v|C%+f&TkP+4nVwFo`1O9YBQlR3$AfC`JNO=c9W%0^`$r$Dx5H27%6(P(59D7V zMUnsex%|^I-{k#KjQ4wzud;VP+f}7q2fGKl*?#;zf(L$kFz2_=k^WZffqKetF}qK9 zW=zxbb_+URAxqEY={DsL&bf;ziN4AU`DJqPd#znAyuUi6a^Zc~A(ad7**%$D{JWLu z_>0TnQva)j>-GFTDtaSvAN@=XZ#iy(yueTN7--L-9N$;u)+a7BIla;H|3NN4^uhgW zjQ6vU)2x%)ph=NiQ>!rLGO=IGV^VT9$+}A2kq_38VV!tms#xpAV9ct{4knd|F(8E#HUzfk^2QZj?jmwX~&LaJI zOkm*oE8jyZLfSk+~9)-cPJd!yT$7HpQvYMi{f#)hN(fq zkzd?s`41^w8})st4Y2;sjmqDot&h(UXt%_LdwTU5s;uAd>yh((N>9?(ZSP5c($;A( z+n2O;7)-t;ZEXf0wDQ6z`JtbLoRT*DpYvl&qkCLs-b#PopUQWT$d_FkjX!<*jQPWO zgK`byv=jfX73L?=FGEg$DfgGT{%8F?1I!p-pXeL%-zoikoDMxidPUO1)Tp-0=lSA% z@F)J><%Du8)&A(e`der(&F(WlA$|h+zajda#TjQSU*dTFWs*`Xd|cCI{!RTyrE9nH zNA^u9ob-$mp7<8w_1g(gevR;^5rr4p4;KrQT3_5=?dPU6S?~FSUBvA^T-T0gYsR=8 z7fDL7@P19t{Kqw({vwS3HQ^rmlc5R5QRPXNuh{9s7(T9w+voc5!a4L|xuh2hbd;gmrhF~6Y*W0l4?^_>@_fY|SO?JV zN7@_g{b2h3<#q4x()W+jOvF#^*L?7E_@Vy*Cg45ef*7wDz5L46*J-~GJ%|4L_^Q-; zr@lvjj7YLrkPE-@zN*O@zpoSdg=yN8#}%mOC4xHaTStE~)2Gk4+}fPn*Gm4(ju{6) z?nfuGcsj9jCdh{#Oupxoj_dnlztCP_oVC~DxvfW4?x{a%KcX=3*ZGt7!-pXZzDNDjQt*4Gll-3UZs2!Yj^EFa{Bb+(6uJ{T*MRe@(1T>#(_uJ?~VKL2go+YN^xX257Fed&` z?$=hjV|*xAEIb4hb^B)Crs)r8y6Caeb(Pe2LQ-U3tKy04fxn956z{jbBolyfzE?^E>-=B+uhW@t^LjH`|vKr4YcnpZh%zej^C>Fqc(ns?fspSCG+>!Y5tgw zW7yBqg#QnK|J7sGKE^Y$K4CE9ju_98oIKuP@_JfuYt~PERZr{WAw%+64uk(8?MGw?|)B9xGZQNK^whJF9znBm3 z>(c)mM-H@G{bPGu3U^4l^hXNIzF4EHpm2<*GiPtAUksCE{6qgACiZA~*#Brh`sYq< zPk+mYI1a0V3h4ud4$vj>dYZo|^3CGbZJJN?f%@IfxG&VqA9peC3*(eS(!;nfOdMhU z_0}&<(!ZtOy}48flVAGXo0lsn{-{g;i2c<4k`iiG-sS^}h0SVbSsd!|+rKi-Oyjq& z8_f2H@oy7O<2Tah@mo4C)pw!Nk;ZX-C54l2i{m=b8%rG5i>OBW0X9eIzwtjMU9tYa zUl$9XQu)N`c|GWWzewjRZ`O8Zdf@XYt_MDk;(FloD6R*zhp=EhSZV$681<;j?6Jyv zWZ#RXhjI2N;fgk;Prg?|yR`e6lP;s{3I?_^4`=T+yWD4Db{h59YNuVaQ;A>H{(c&E zS&Hm3^YeR*&m(Midmr0b-EQzkgGUV>FnG7YTl5*r75*1~V6XJY#li~}f4n}Jk5?Xt ze;Fcw5cjW;KT-aUM3Tpu-6`qTUd^}a97&L$e@{mI zxu*MfP=}W5YkaRo`8>6V>x3KRiE+@|?fnKp15Eub65Pu#)+3cyWG8(hzc8N3ZN+z+ z$!$RKNPKJUWxFMAF_?S__I*Y9zNn^$D%+dbcq*nNudkphr2XEQwl7R({ol_iUHN#b zqIAV}kZ<2K#ygQ6_?jleD2R4&AEl zLi;eE>-LuIqvJY8x#sqEi1HkFdpk&Y!tLz<;Yqi*{e(|(eJIus_jf;hi^#94`T6|bT9cp8?{%B}Y+SOb z^OWRQEYRL#I`VdiekS%aH#F@ZI#kd;9-436>5#-VSa%xDtvh{8`o~Z^r1~G0Q*W|; zuZJ~#cHHzy%7ZT0$x1o*QnGuieH=e4eic8wAH(>{{7AZQ;(Wd@79LZ6WpV6N<9D&p z|3hHR^!lmkSy66#1)jO+jpYRYkM_Ms>`cC&t>qT7zYP0XQ0`6N({Zkr>u-6n`jcea z7S=z-eSOKcQNlCF^qK74PI$NjWY+ah*l*F0la-+q`fJ$q}PmXGyJ_kBhF2IoY>KGVC+n!Nx$ho|@b zV7?DNymhcSJ}Vc-ssH)%rIvQJ!=H42br_>vEqs3m6*`tD_K!&%Oa7T2#r%PtK;Lhb z`-bB5?Uw$jH)r3k2ot@EXZBiUOW~{?d_umEw8W44e${#Pa_?WXSl{RA^6$bHWw$Xf z0T1G#$|ZnA5AEDevB3QrvmKh8?*HpQ&F)2fHRCgU=Thl-HRpf4pK$u%zwiT$-v*<* ze~~Q4$j|TpjQODYbA`Sx%)%MU5B&NC;ZLS7{GzSQ|JAo+CG-2aY`?cEr1!)h*8Cy8 zC;o`S<%zE`eUkVZ?$NzT29EOc`{8~4t7!hGfzM#7{C<;&n`d*mV7v>LkNS7rD)wpjQTV<}mx}5MTQ`lnRDou#>cblZ7 z-){vI?T3+dvvr)ZqoW{-UP9LI3|@C!>1aP_aIe7!4CXwA#3=@Io&UPUl!B6H_v|Q4DFUOa)wS>FwB0SzrxaX~eCsK`h1M4)t)BdS@pJZb@3Zz8->Sy1D*2pj9VGv% zCa0>&qe?j?ySCeV$|2b{qHsKqwME8d@p|kE=#7m7;`!OnyuW_ju@U)~J3$;;X|yMd zlV7lx4e~w6Os||ycxkc6y#u7@9t8{dKK%;$Gmk&a9Ic}}OpGcF{Lhi^);8jA++Vm3 ze2&`vchV#oFDjmFKi@i?he_HuGQHYoa3AZh8lB>I)(SqepT_vxdww-kJz`uzyr^mw2!8E>i4;9w{pGu6hC3`T7$>*nde`um)nJI=-FcM zncEPw|DAms_+j?ee#G#aeYYPr*zB(Tkiqm9vaeF%p&9xM*$-96*O;Dz#~sFT>CwlXEnZ=KdTNJJcqxwcrny6J^7zvpN)FLfCArZLyg74 zi?m*u&mtW%KZ0M}|6s^kEL^GS;S~K<7&}b5yE*VpIz)lwm-MkeuH@D=-44+ou9JN6 z`K8wg|FU@H#p)L;U2mt~t-a9v^oYTi8ti^`6=CzML*`e@lPsU@r(^k(?WZdieo^t2 zYfi^@);oTs)njx_Jdf~t`tvYJf0Aq>T_@Y0SS-9;%g6FKUHH;0uDcF=wKzoPpBu`7 z^TomsNYCD0m5ayQ*f+2Iu1Y5PVO&@c{ej&e9d>`3_~%=9?8a-cSL#dHF>Ua_(LQ$2 zF{b+#cI>tH$Lu{FlJ8pxJAfVdOinxc3^so4*l4iv)AkqmKB-XcP`-=*Apfgv2Ae#p zoHrK#WAE46`!R!i4W8C#dB;(!&-~$z;|9}@g(}}l1foTpX1GA=cJIAQc3vGn5#$9@d`v8a7@Rj&=G3nAL?B$?S+1RRO_Xj#6N4f zY<`ULtl0O;(eDWBWMADO%?E#jAxL~K7U!t*=VDP`r`1=L`jTxHpYCPc8q;}5`Nen@ z_2K8^eaH(*>AL?m#;?gX`uiA@A4XyD<8wl*@2}}^ z`3;TRW4yTc&+Q-i|5{?Q#`vJq^x5S84y$LnThn8FZPw2{E_i%?J$}Dm=oY(CerNH+ zMui*Whd#=07yD;f=Qh1$|D44Q?4MD-K5ppH@}b&c^sh6x&EQ^xdlm1n?Kcb$v}prH zPJI7>Fh+iEC*c866ot)R9#Bx;&t)%^E9iyYCec1D%iuwwkrP`$J0w2^a1<* z;h)e>jHd^3_+EC4ycfQ}4&=M!lmpo>dN``E$EmR%9kX);_d{PNjx*o*G4f%D@yYO_ z{tl~uBv=23Z-l<@*K$5TC+j!{H^y0Yc30bO^&a5U;yLjBM&V!C_OWGr=l%J9Uvtv7 zTnUZ*@Np!_y#4(3M|yy`GW7%F)PpdwMazSZkDd$pQ!g_*I6()#BUA{r!c#xDqY76kDV**Icj(~{~_}fhUcrQugRvv z3ZE=K%I0-H!}7HP%Xd-l!#M3&&OvH=dEyDH$Lx23@o9E0^i0K5={l~@Fus`e^&BHS z@k7O*tY>{;lJzB+yM>*;lC83Q5l)?kDa#%>B(44~E-0PZHbF z0Q|9?j9-V4EcP}c7xfkN_=N(`&XH7GT8dj_T2{4j%D0vF#T)NKBjOypP};- zk$r(b@q7m21MsOPQ!6nauY?^&<=!OyKH`KG(lX?KB$vNa{8v2x;dtLC`6|2EuZ9Pu zp!}MhXKj=6@Xxz*{_KEMEa!CSkIvEJ*?HFK4o#2gM*BeD%-PbOhnc@TL;01Kyk6s@ zm_PY`=#4r4czf^8wHM>>m_MUZ4*cnsDpCJPF8}M0Uwk`$F&~G)pS{$p_&!Hr_mh6U zE^c3|@F~og9Xv>UsPCZ6QH9Nf!&EEzHNCWfKPO~gR?;=1dV+GlE9KxfIq$JY^}aD~ z*-d-cWp=ZT_JVSV9DJP97_X4;p;}NnvhmCbtv|8zAaVOt9usT_?u$`Zx_FK~5GXHw=EliRRC!7DBOMkQbQ@!8(68n|({_R5s|Fu5lo)N<1c3-#M zS3YF-m6s>2{21w~r2EE*Ct2Wr^H`397JprQTQ(mPzgK;!9i+br=an{6GAA7-#>2c0VNFoyqjt=YuEM?&@}>=hBwfa6GtcQ0b2GAH#X3Y4c+{ zl{~fQ%izbV$IL&lK3TtPD1QXyBYt$49}|}({%BhDH?Hq}I&K})^acC7y|j}sL%$>A z8Kdh|{ohe5H>&l^xX)nP#m$KtRZK2EbZY=^#<_L~2z62^QC zs2UPjA9FD{nxN8>%?4A^3MD4wYQ z`al0H@=V8d+?OHa3gwIJVWUxeunQi?a^nku%795&t~==!0pEG{q}y;VB&>-;+NR> z1ps3{tkO=r4SbC3bPwcZa)CU~{3qBc^&|67zAkuB>m54V=FeNM(0aZ8O8ZwE;s?kr zm>&fGAIlPr0EsOV(D*v zJ`!>jwHTmILL0%?w-bMDTKVVun9h1YlM6$1YlXS!itYNS)Z=kNHV;O5 zA^wH`hCHs2w)?)V%)T$y3S+q~7r7pW!{5 z@DB$g|KR&C-H+k@@#sD9{^GslGuip%Sxtxwh+6h^)^qT6%pH~m|KA5Hx%|M*G$Xc!|sCz~(! z^Oz^|r;hJrah9L&O8x3K@-OwP>A9K1%CBVWA$^8<{OTCwemnI8{&9a!-xsN0ohBYT z-!NNY{#mNIt|J}Fl^cGgtb4bT-&n_0d+~nO{H*J7*vEFP+UfSga;ZPu!TN@;`!u$p|4`zZb$FT!du2>Ho6r@;yeyp;LZ(9px$ z4t?SAM>xmubTJP1^Kwbo7|WSIOS(8N_Bc@XcaXj+>j7VpuxW0VCVW~tUVG^U>+@=FZeLpXZ|yu_kQRh@n=(3PNuE)N9TpzkH-1m zjr@7Oncanbl%Lxb_;{^+c-r}x#jz}q$0Pd^wOw8>^zGe`W${sbfA_gM??w4!cyG~$ zB)j$yPekW-o#!&W+{yNWzAs9g?Qu_-+D^TAnD4{PXoH>%3LcdEL&WiWkGq`pDe)5F zcFwcQdauDJ^a*>1Cd>XLh2h`p_Z1w`^gLf;IbyyI@{oT8j|V}|#|EVx)q|WbZs&T8 zj5`gsb({3NVO)=p@vFV(I>k`+kik5+9n&!Yy@>cW4!)VagqZ=QJ4|h9puf-f^+Cyx z_RBwM|3Jfh##=;ReV?e@kF4*Ly=(QE@vU3oM!t1wx}3k)`sMt(!F>j=GnnlfZhwoy zar>~Ilg?MxD1WSv!7l{A&nb#OzAXC-`hDNxKKg^y4@^bhuv$RblppM+~nMI7vYKhl;irhDx92ee)2L=6yU##{xrEk zL5cI8rGLnGoV8q~Yt-;^-8<>oZg@Xwcx^wx1~pZYh3#T_HxMoHQ~3%7cqY&G?0A>q|@giiiPhmE=cEn zX-6TQ_a%QrI`2#VdOwuvO;wP~4|HQbEuQzq3{$*62j6AL=6%_(_&idqmw7*~{nVsZ zQ}Fr4**6kKyDJi}$oDQ(9+_XnDnk>${a{w^h|K%?_qY0&oX>G&>Q4@E{k>*-*0rDT zxanEXG~o&JC+o))E*ADHU*$U(N>8QB@QhP$lODq}LA_1Z8=gti+fBq%x$HtEG`Z?L zK5wvly*GfX(&p4&_`TS;KO4)f4=evn-{41mef$$LR*(69SFYSACGd;;!H?wfLrxyw zcpMtzpOXBQy(7w(cpsqBXMQEM2kTEE&*86&-jA{*1F6#{0YB_g&viU%~|a9qRwZyPNgzuU7;y zKNasz;zhYX@5|z=OiyoSxhReq5jhN1&ChuJ=zKVb_|kdp^8~T{!r2~QepvM`SwF#N z&m(+xJ)}?cE6|`yJMAUbn^;dmjebh`E%J!(4>}-n_xKp^-zk2_Vb=qfEA(ND)Q5aG zi#|wyt#TS}Urzf;?@^}y`~BfbyZQBW-OK!bI{!@j^7t;;{ST-Q5=VU-pszsy`C%r%f_7D&wDMkmx{gmgPh}k+ehvJ*9QIIE_GrHddqMh2NteD@>CW2m z)cEG#GlM+vOKd-x&j;qy0V8Xro%_sU`W{k0&i)wr;97%ym!qH8&!+Jb-izwUd+Kxl zB54s|8z1_;5nf-($^(Ypgz-Hbr(B`M3b#mNhx~b`J&_;v`@CYMeFgiED)S@Gi2EJz z^*jmX;`a24{|-|&?zx@ikng!NFBbOoYWx*u)-eu?@OGnIjeJ1+(mQYLhdsOuZ zaaH}ftRvK~y*3Wn%6I|gTD2VGg~s@uaYIP&7e1_bLbY4zO6)sbal3Tgx@LS3e!*YE zj^WRJJ_mF^>n+*1W4Qfd<=>F4XAieuVt#ii`7qCS9y){{@QX|Tz1}bWq3Cg_c364R zllDhbolG}<06lm8BgPGkU*?+s1Ha%JJx=xgvvK>~zCQb_S$_lkpB7l|!!`af&W+b^ zr!a1__y_tU|I+b>_fy5feQKAp=se`-=XvA$v5tZIR*GvZS2^$1-*SQGFHb$h@>K=Z z?&Eb2l)Fyk;@=B~U&Sx=YgLx7v_D(hQLgenx=MSSwQEfAOT1+;=k+9>R#?7|t?!51 zm-77#=Xvw=$K%=6b@aF$vmDk1a!@_Uu^oyp#HN}r6^^*JA1zbNYsjq-*!5j~iqeCI2_zOFpHiL|pizkFhR zz0w}gy+Q5ckhXVd=H&Hu$UXIqbhDpI_Hz7^Y&)QG8LB>LddYFikm;?A4;$o`kB85c z_1Bo*1K|HoZKm>jfA0O!-1}e2-Lrop_x?3l-@S)?^LtyM4;WG5UZss=nO}pP+a(?R zy6SBr=V$Cu`f;uZb|Cx06qfHh>a*zQPL1B7%SrdJ-!B#Uf#VVv`1vHv=fUzZU%%y> zS^cQ@)tL9Tds3wz(t46k((midc{)l<7^n3wIa~3@{LK5G7yex4w@NMF()_-kK>Ucx zQRc@?o=Xj;Uy*UV!e|G6VT^j{cJJqp5!&zP$YOds#NK2cnDro& z=G(0>@O6)5{AzYz^+qk`wNrYJR8N*M+lvRD<@O z^u>MycwEmQ*S~sercbi&NdIB`sj~Sa9QZ?VC3G-XioB3*1lb`IEi76;IqAx4&D_9`Q4xnsssgLxL~1 zGxTq;hb@v1e0;6&uv}&QR9QwxRkriXm1T?vhN_H@hL>F;rC>jdpOR(IHkk2Mvg}-i z%T>lNm1QdoW_(jwcA4d8Jd-Trcw4@MME)*&k-i_Y^U}l1u2b0Os}P62Oj6?ZsNazG zyh+m0o@>;;*OK4M{vRzb;{$`gU@-MFS@t=DJM8`MDqODiDO_3hguSPJCdjdHuaz~QGHAY@H6fGF@-Cf)+i(^JC$D9$E(lGu3B{bTP)alv8onVe~pE5$n9*^_r0nI-v4;q z=J$3K3olW*%wEm%vs9;S+##~Z5BRRWRrG{mfUL`RXnJfnM`0Hdo8pK3ACUZw`#+we z@6+}C>T&9co!1V&4`iPG2JkoT-x0rb=Ej9jyg~ZS+7ZR;_o=}?@dI5Sy;0=;UN*$n zALI3lN56)BxaVkox084r_Z=|||1KbDJRhI<`;+b4NN%$E((8pVl(+Tv%1ZhP z-=|g7-jd^Kj88pX<{R10IjhwquU3IDBsmhrpEpYcMNrXPv*YN_A> z9g9(JGwBcema^SbZTgJ!yZ--pEBS>Hzr+=q5Ar&*?t4xLS^u^Jd~V&(=dNjeW^v4z z!iZa-IUaujU;R4rZY$SHJa#TY=A{fitk0OE3?ZUbz{4d)3gJIF*iM7Nx+1pSK z`NEXR@pk8n$*)2fc%F4P=4VM)HZR+w8HQ}UJluX`1O7Z+H%fi5Bj^|K{=V)LH2t-> zHVnxN`K9sd5bezQZf%_bEQxf3dew&jy?DFI_h=K7=Xi zZ9G5qZLx*&*r3tD__ZXhgMImTaWVgZ23NWm?`Bz8A$)>Dr^up&I!) z+{L&L<>2Av`vLksFK^$s;q&Ua!w5g{`G)TzZehP4`*sZ;FLF;C`LT;~%lyz5O>gu=#@F=RN{cAfDJB5yXH zJ}z{-{{f#C#NS=U-)*PL-vOmp&h;99HyTVk8Qyzb)8qCmg}<7hzUcX0f%Ezm_H~mF z=D)B{7c-;K=S{y3f4)@l_P3PPUk&elLi0QSi$2diInDHmG2*LQy}}pVdvUUQQQ!4i z-*GM9-%`=~hGx7z;+Ju{)z5llUd7-&`jq(;eGc#al0IX8;Qp9c@4h5(+|T^8&PVkT zAHy;^f3cSEJ#0@X^Vufu;K0L62+04F_0&_$cj1?;_x{EDkr}3AT^9PD_8S)Wh6(C7 z`0(eyBK~E{@{3Zb9ES*d+>3RJ!?}2L1=b1j^%#DSW6|DjL4|rAcu&0_+bwj-y-3>L zIN!T+`3{2q&7>#JcfaJz_NSdNJ*9kP-)Dn<(tgMv*pK`ZJ8Rsp5Z{~P>+QZT2K<&L zX?r@vUK{T#xk?F*^}zkj%fw&D>EJW?GFB125Mt0jhgz@l!`Ekug=-aGx%ND5Pj)ZK z3WepK5bDdsg@n_4NzNl|_mYG$!+VnRZ|OcN^LN?#?lZ0a&$GT-k@&j~8vL*NOuA?f zVf;sgdnk_~yT_zFY2}@sbX}Nup31r~{5$w~yYSKd1mL>__Hhp2ZTg<}1$abZ>R(ZJ zg^4_C-p*reS9)KH^V#NiQa;mP`28=Z%I8=gTu+_^-BlI4j(c2BemR#8|AKb>lD30> z1n{p2+!zKxae>9}pz9VXf6D#V z)>G}bwo~uYerv>F_FFN1bHxRB$hyZ|alua#58NQ_57S%7uYH3J{L*+J;@7ptFZ!uz zwYQjl`m-@jUoc;{KGk?@Ajj8@b$orw@xT=I($DY2@xaEr;&@=>>5T_+^+G>iru7}y zcJ<45qv4M|9`OD>TTkdvzRUWK@uAJ&Jq9z5fm{T&-g}4kH5mV31svJa$N`4B1wS1D&dFM;{3x_D-j#WM&7<(F(awRlGT%L3z= zW4SoynKGX^XB^Wc?ihJ@V;s{g-Wks2LmbmA-g&d+`@b2-oFRVZRN|QD=K3M;pYGrM z|Hm<5@*wShf%6ElJ$fATTH#|H$5aH4?XRrwX@0`9D(}^N*mrN_)n9gX_sl zbLk$(^k_T!lz(W~%LGp2n45@aR_3~9Z((*%lkM>G^_C0Pt2augdd;0798>uf_Z#4ST`COyl);kwUzptajd>uqPYiOm+ zSxBdX@fF%TAnOrfbL04H)W$`xm#N%P_Va6p$ltQ}3kMZOe~I64`vHYz|D`_T`VXW2 zapuGRbLIO^!l2_Xd!?RzhqYY)>95uoVc(GkJkVeN4yTVtQT_uj5q&HhexYYT{zQ5e zdLE^3xAe!#_33*o{VHj%=f}M2I>Cj0*yDzY=ga%5WR@T7$;S)#3qJ5+K+;jp^Iwa7 zvc8Xh8l|M1yi|VdAnfCN&^sxDiu*z3lk0u$Xlj=-wVbxAS-eT!k* z=rDbCzG9ACL|q8?NC7-|k{|vacq+1v5zni?1Nmy^FVE3pP4(&Lp`Sy14?M4n{cxw1 zv-2@wN1rD6{@v_;bo0kMdhI>y4e9;p+}6BtY@god652=C8$=%EqKZ}K=Fz{RldO=DLpIkR`yD!bUeZOTY28QSm1d9 z*%wH@@3nE&rfI_K_w#A0S|cdT8dR6Iuy?0@bn+8{|y-DlO?x}gB z!r47FuOqzP`n$>35Z=W8E{vJn7dVesEX->8JfG06FTVu-;JCIwjGKMV&@Q1j@F+h2 z?|S6xo4(FcI*lDnjDI`iU~v}eSugX%DSoT3w5WMGrw8S(Yf?`9vC>;wECwjQe7$l{ zhQ3Gn7ooi6Z>WDs^YY$Lq5KQxDSwL;?~wZMv}fszH>*GHKjVuaOTLTp1wKzZ#OI>V z>ocBbKL$RTpM~CaR_paH`3LsvqRMiv#N=N!`>=KYxWC4Jx42(}UM5|XXS^X zui4Gh)ZT`6M*MHu&Id@Z#}~0YD>->?IZ6ATmuug1wSDFveoE~N`zYU7&*p2V?0-^y zC>A6bmS1Vn>-0IF-12s{^l7mx%6%brbwy4NSDi!-XXfPa?|%=w`svDH;rzFDTigx1 zS(au?yo7L!SN)2|_qE+xK1>|aC;0G9 z2?)zo^V1gpWc!jBzs2}KC(4aTXb8KPe}(?muP8qE1M*!Yh2uE>I>{&Ju{Awu633(e z1>Ua@U>xx?+K_A?_kQwo{BeCI>3ye<5neyW_mh7_*zOlw=)Kg<+V{G;_WicfT`cgN z=@ycS@~yXa<>oVEPW`NB`57i__L(9Q8iFM|=*wi|H9u`Hv9K z?aT*0{fT@J+53HrLwa-N#=hG`6Z}2 zEPu*(^_Va6?;VI&-JeJ0KQ86P9yGs?GsRvEw)v1I`^RuD#@GGjK4r}x#@UY9H)ixD zaz0h&fAxK)ufL!fV*c$Ge0~nr*Tun)4}rcJYtMt$PT}LA{2BY@gP><9tM`52OV#p= z@`GNv-&5&`xqx+&`#v#&Q1Ja`i%Q9DmHO5ws_YGn78#OQ=zQK;JO(&7mJIPvm>E zpQZ7`J;o-&Y$k=J+7af{Fqr^8N={zggn@po83{*|vA)j#@A zdtCbqKUXx=xmweQmUrvZ&liQ2oeGD`I{3U?5X&zt7sHUBe-ATUOgV<@7)U2QohpxT z-6PD`(_!#K2DcHuRtC57lYUv@xE)KypUM6LL~56J!G ztUvu89Q~uOze3-oi;;GZX#3DV*Y9r})O6$nr{(*3X})s6f)gnpo=Y|;4y@C$xM zhBgK41IxGj#kb(R>#>IR9hLSqC}G*1+e(#-DEFuhQ;d_xOb=$_wp7 zitwSK{`*z_gPNZ4Ym35-{2I{o^!)Fx-n1O~w>B+T&%bU>mw7#t*G7ZsN96txg@?D@ z&-5AURd}y9L)t}sOV_cdsBgZXyK�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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 { +describe("NFT Minter", () => { const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); const payer = provider.wallet as anchor.Wallet; @@ -11,12 +11,12 @@ describe('NFT Minter', () => { // The metadata for our NFT const metadata = { - name: 'Homer NFT', - symbol: 'HOMR', - uri: 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json', + name: "Homer NFT", + symbol: "HOMR", + uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json", }; - it('Create an NFT!', async () => { + it("Create an NFT!", async () => { // Generate a keypair to use as the address of our mint account const mintKeypair = new Keypair(); @@ -33,7 +33,7 @@ describe('NFT Minter', () => { .signers([mintKeypair]) .rpc({ skipPreflight: true }); - console.log('Success!'); + console.log("Success!"); console.log(` Mint Address: ${mintKeypair.publicKey}`); console.log(` Transaction Signature: ${transactionSignature}`); }); diff --git a/tokens/nft-minter/native/tests/instructions.ts b/tokens/nft-minter/native/tests/instructions.ts index 72e047d58..91caed0d2 100644 --- a/tokens/nft-minter/native/tests/instructions.ts +++ b/tokens/nft-minter/native/tests/instructions.ts @@ -1,4 +1,4 @@ -import * as borsh from 'borsh'; +import * as borsh from "borsh"; export enum NftMinterInstruction { Create = 0, @@ -7,14 +7,14 @@ export enum NftMinterInstruction { export const CreateTokenArgsSchema = { struct: { - instruction: 'u8', - token_title: 'string', - token_symbol: 'string', - token_uri: 'string', + instruction: "u8", + token_title: "string", + token_symbol: "string", + token_uri: "string", }, }; -export const MintToArgsSchema = { struct: { instruction: 'u8' } }; +export const MintToArgsSchema = { struct: { instruction: "u8" } }; export function borshSerialize(schema: borsh.Schema, data: object): Buffer { return Buffer.from(borsh.serialize(schema, data)); diff --git a/tokens/nft-minter/native/tests/test.ts b/tokens/nft-minter/native/tests/test.ts index cc26800f9..040f11cc5 100644 --- a/tokens/nft-minter/native/tests/test.ts +++ b/tokens/nft-minter/native/tests/test.ts @@ -1,6 +1,6 @@ -import { Buffer } from 'node:buffer'; -import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mpl-token-metadata'; -import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from '@solana/spl-token'; +import { Buffer } from "node:buffer"; +import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from "@metaplex-foundation/mpl-token-metadata"; +import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from "@solana/spl-token"; import { Connection, Keypair, @@ -10,32 +10,33 @@ import { sendAndConfirmTransaction, Transaction, TransactionInstruction, -} from '@solana/web3.js'; -import { borshSerialize, CreateTokenArgsSchema, MintToArgsSchema, NftMinterInstruction } from './instructions'; +} from "@solana/web3.js"; +import { borshSerialize, CreateTokenArgsSchema, MintToArgsSchema, NftMinterInstruction } from "./instructions"; function createKeypairFromFile(path: string): Keypair { - return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require('node:fs').readFileSync(path, 'utf-8')))); + return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require("node:fs").readFileSync(path, "utf-8")))); } -describe('NFT Minter', async () => { +describe("NFT Minter", async () => { // const connection = new Connection(`http://localhost:8899`, 'confirmed'); - const connection = new Connection('https://api.devnet.solana.com/', 'confirmed'); - const payer = createKeypairFromFile(`${require('node:os').homedir()}/.config/solana/id.json`); - const program = createKeypairFromFile('./program/target/deploy/program-keypair.json'); + const connection = new Connection("https://api.devnet.solana.com/", "confirmed"); + const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); + const program = createKeypairFromFile("./program/target/deploy/program-keypair.json"); const mintKeypair: Keypair = Keypair.generate(); - it('Create an NFT!', async () => { + it("Create an NFT!", async () => { const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], TOKEN_METADATA_PROGRAM_ID, )[0]; const instructionData = borshSerialize(CreateTokenArgsSchema, { instruction: NftMinterInstruction.Create, - nft_title: 'Homer NFT', - nft_symbol: 'HOMR', - nft_uri: 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json', + nft_title: "Homer NFT", + nft_symbol: "HOMR", + nft_uri: + "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json", }); const ix = new TransactionInstruction({ @@ -59,19 +60,24 @@ describe('NFT Minter', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, mintKeypair]); - console.log('Success!'); + console.log("Success!"); console.log(` Mint Address: ${mintKeypair.publicKey}`); console.log(` Tx Signature: ${sx}`); }); - it('Mint the NFT to your wallet!', async () => { + it("Mint the NFT to your wallet!", async () => { const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], TOKEN_METADATA_PROGRAM_ID, )[0]; const editionAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer(), Buffer.from('edition')], + [ + Buffer.from("metadata"), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + mintKeypair.publicKey.toBuffer(), + Buffer.from("edition"), + ], TOKEN_METADATA_PROGRAM_ID, )[0]; @@ -113,7 +119,7 @@ describe('NFT Minter', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - console.log('Success!'); + console.log("Success!"); console.log(` ATA Address: ${associatedTokenAccountAddress}`); console.log(` Tx Signature: ${sx}`); }); diff --git a/tokens/nft-operations/anchor/Anchor.toml b/tokens/nft-operations/anchor/Anchor.toml index 63d8c9a00..2cb03b630 100644 --- a/tokens/nft-operations/anchor/Anchor.toml +++ b/tokens/nft-operations/anchor/Anchor.toml @@ -2,23 +2,20 @@ solana_version = "3.1.8" [features] -seeds = false +resolution = true skip-lint = false -[programs.localnet] -mint_nft = "3EMcczaGi9ivdLxvvFwRbGYeEUEHpGwabXegARw4jLxa" - [programs.devnet] mint_nft = "3EMcczaGi9ivdLxvvFwRbGYeEUEHpGwabXegARw4jLxa" -# [registry] section removed — no longer used in Anchor 1.0 +[programs.localnet] +mint_nft = "Ezf9iNnBPVNr596tK59pTP1MdDWAS2VvNjyiK5gkbSEX" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests — the validator tests (mint-nft.ts) need Metaplex Token -# Metadata cloned from mainnet which is too slow/unreliable in CI. -# bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/bankrun.test.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/nft-operations/anchor/Cargo.lock b/tokens/nft-operations/anchor/Cargo.lock index 239b185ee..77fb88dac 100644 --- a/tokens/nft-operations/anchor/Cargo.lock +++ b/tokens/nft-operations/anchor/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.7", "generic-array", ] @@ -20,7 +20,7 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -38,13 +38,82 @@ dependencies = [ "zeroize", ] +[[package]] +name = "agave-feature-set" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e631ba26aeffe98dee3db0b8612fc7c67cda71bc57b0f82f28dc48231df6bc8" +dependencies = [ + "ahash", + "solana-epoch-schedule", + "solana-hash 3.1.0", + "solana-pubkey 3.0.0", + "solana-sha256-hasher", + "solana-svm-feature-set", +] + +[[package]] +name = "agave-reserved-account-keys" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d062865aedfbdc7511726d47e472687db0db4fb08e3c3ab2ac68570106c2f1b6" +dependencies = [ + "agave-feature-set", + "solana-pubkey 3.0.0", + "solana-sdk-ids", +] + +[[package]] +name = "agave-syscalls" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c89f228e93d1bc769578efd0c5a445715ae04ad96f9b6f8d16d018ad7f9221a" +dependencies = [ + "bincode", + "libsecp256k1", + "num-traits", + "solana-account", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-bn254", + "solana-clock", + "solana-cpi", + "solana-curve25519", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keccak-hasher", + "solana-loader-v3-interface", + "solana-poseidon", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-secp256k1-recover", + "solana-sha256-hasher", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-type-overrides", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction-context", + "thiserror 2.0.18", +] + [[package]] name = "ahash" -version = "0.8.11" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", + "getrandom 0.3.4", "once_cell", "version_check", "zerocopy", @@ -52,18 +121,24 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "anchor-attribute-access-control" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3db7f5f8a6b16fa2b6e1b0222e656249c3abedf052e3943babf248929571204" +checksum = "b972f5fbd02524c92e4eb487c3c648904572702670f3d6fc81aef5f1751b1569" dependencies = [ "proc-macro2", "quote", @@ -72,9 +147,9 @@ dependencies = [ [[package]] name = "anchor-attribute-account" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a12661acaba9866a5f2d8d8d46a1eed8b484f41dc9f94f808c3b07d35726816" +checksum = "9acfcb07a92084bcfa9f6cc49a5c2e8e0e986f25f4b7caa184b7a2c9c9e561c2" dependencies = [ "anchor-syn", "proc-macro2", @@ -84,9 +159,9 @@ dependencies = [ [[package]] name = "anchor-attribute-constant" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dff08bc0187aafc559da8f63b5adeab0bcdf97128765c72dd9a4861f70627fc" +checksum = "8f46cc38f819377f07663b8eb492a701427950065e79d2d7b622a782443deb7a" dependencies = [ "anchor-syn", "quote", @@ -95,9 +170,9 @@ dependencies = [ [[package]] name = "anchor-attribute-error" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2af8ce12fb8cf782a3e127d376698a4548a518e38b4686f9c439adce4730b48" +checksum = "9c34748789107c9838329e058ca7b253e67f37b39ceae5a0a6c8d99f5d1bf1fe" dependencies = [ "anchor-syn", "quote", @@ -106,9 +181,9 @@ dependencies = [ [[package]] name = "anchor-attribute-event" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338be5df076369b99585264aaa46c66229ead67568d61bd38c3ab0fa7a15e554" +checksum = "1a28a3e5eefa03d9c5ef02b2139198f652547d38dddafc9c5545152dfba54556" dependencies = [ "anchor-syn", "proc-macro2", @@ -118,9 +193,9 @@ dependencies = [ [[package]] name = "anchor-attribute-program" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c4ec70cef4ef7e2d87b4e9c550f727a43d691d3d7f3e4d6b2e3bd530ae098d" +checksum = "dfaa03865053cb168bfc4debe5992be87f397aa027dd81b69a2e44f2e5bae1c5" dependencies = [ "anchor-lang-idl", "anchor-syn", @@ -133,9 +208,9 @@ dependencies = [ [[package]] name = "anchor-derive-accounts" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f610cb50e10e4c404cc774f20a4eb602b904f68ea04590f8b1eb22a1e28b33e5" +checksum = "eef330db08f9ceee45c18ef96b15b869883d280c0ab5c6ff5d2e2f6481da7911" dependencies = [ "anchor-syn", "quote", @@ -144,9 +219,9 @@ dependencies = [ [[package]] name = "anchor-derive-serde" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be9ead49a9689493f8857a61dd1abf1d70eeeeb0683f8c1e09b015ab5bdd382d" +checksum = "e0e80ff4e3ddb8c85aafd37926335c28f820516311e7106e5b7482b42e798aaa" dependencies = [ "anchor-syn", "proc-macro-crate 3.5.0", @@ -157,9 +232,9 @@ dependencies = [ [[package]] name = "anchor-derive-space" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4d1372743444967347b60f9311d2ee54a630152fd1d6d805adebd7fcd72056" +checksum = "2672af0ef4dfd5f5b6199355867b580cd8b4048093ef5208dd2b441305c15b8b" dependencies = [ "proc-macro2", "quote", @@ -168,9 +243,9 @@ dependencies = [ [[package]] name = "anchor-lang" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "254d0cb160ea5c4c6a8c2f847bbd0f384fef733ebc36ef8426ae95f1bfda5757" +checksum = "8de9dce227fa0c08be20fef008c5b04681e1e0a15cb396e9619a9a1f800ff6cd" dependencies = [ "anchor-attribute-access-control", "anchor-attribute-account", @@ -184,7 +259,7 @@ dependencies = [ "anchor-lang-idl", "base64 0.21.7", "bincode", - "borsh 1.5.7", + "borsh 1.6.1", "bytemuck", "const-crypto", "solana-account-info", @@ -205,7 +280,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-sdk-ids", "solana-stake-interface", - "solana-system-interface", + "solana-system-interface 2.0.0", "solana-sysvar", "solana-sysvar-id", "thiserror 1.0.69", @@ -223,7 +298,7 @@ dependencies = [ "regex", "serde", "serde_json", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -238,9 +313,9 @@ dependencies = [ [[package]] name = "anchor-spl" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3f1da81d6a7486339833833db9285f3771c1c368db418d481b5584a901cd675" +checksum = "300e2e8058e674e8d6ea7c72dfb8be4349609dd9c3760ce729fc6406199624fe" dependencies = [ "anchor-lang", "mpl-token-metadata", @@ -255,9 +330,9 @@ dependencies = [ [[package]] name = "anchor-syn" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a855d34b1b0488f37ccc759c8bd4a696cd3a7bba8cb0734c2a965109f707da" +checksum = "c62f42cb7e348c033bd9bfba59979bcd66431c026ba23490af94045aa357a950" dependencies = [ "anyhow", "bs58", @@ -266,16 +341,266 @@ dependencies = [ "proc-macro2", "quote", "serde", - "sha2", + "sha2 0.10.9", "syn 1.0.109", "thiserror 1.0.69", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] [[package]] name = "arrayref" @@ -285,15 +610,21 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.4" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "ascii" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" [[package]] name = "autocfg" -version = "1.3.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "base16ct" @@ -301,6 +632,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" +[[package]] +name = "base64" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" + [[package]] name = "base64" version = "0.21.7" @@ -330,21 +667,32 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.9.4" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" [[package]] name = "blake3" -version = "1.8.2" +version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +checksum = "4d2d5991425dfd0785aed03aedcf0b321d61975c9b5b3689c774a2610ae0b51e" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", + "cpufeatures 0.3.0", + "digest 0.11.2", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", ] [[package]] @@ -356,31 +704,41 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +dependencies = [ + "hybrid-array", +] + [[package]] name = "borsh" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" dependencies = [ - "borsh-derive 0.10.3", + "borsh-derive 0.10.4", "hashbrown 0.13.2", ] [[package]] name = "borsh" -version = "1.5.7" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" dependencies = [ - "borsh-derive 1.5.7", + "borsh-derive 1.6.1", + "bytes", "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" dependencies = [ "borsh-derive-internal", "borsh-schema-derive-internal", @@ -391,9 +749,9 @@ dependencies = [ [[package]] name = "borsh-derive" -version = "1.5.7" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +checksum = "bfcfdc083699101d5a7965e49925975f2f55060f94f9a05e7187be95d530ca59" dependencies = [ "once_cell", "proc-macro-crate 3.5.0", @@ -404,9 +762,9 @@ dependencies = [ [[package]] name = "borsh-derive-internal" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" dependencies = [ "proc-macro2", "quote", @@ -415,9 +773,9 @@ dependencies = [ [[package]] name = "borsh-schema-derive-internal" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" dependencies = [ "proc-macro2", "quote", @@ -435,9 +793,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bv" @@ -451,9 +809,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" dependencies = [ "bytemuck_derive", ] @@ -475,6 +833,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + [[package]] name = "cargo_toml" version = "0.19.2" @@ -482,14 +846,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" dependencies = [ "serde", - "toml 0.8.14", + "toml 0.8.23", ] [[package]] name = "cc" -version = "1.2.41" +version = "1.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" +checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" dependencies = [ "find-msvc-tools", "shlex", @@ -497,9 +861,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -508,15 +872,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] -name = "cipher" -version = "0.4.4" +name = "cfg_eval" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" dependencies = [ - "crypto-common", - "inout", -] - + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.7", + "inout", +] + +[[package]] +name = "cmov" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746" + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + [[package]] name = "const-crypto" version = "0.3.0" @@ -535,19 +929,34 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ "libc", ] +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + [[package]] name = "crypto-bigint" version = "0.5.5" @@ -555,22 +964,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" +dependencies = [ + "hybrid-array", +] + [[package]] name = "ctr" version = "0.9.2" @@ -580,6 +998,15 @@ dependencies = [ "cipher", ] +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -587,11 +1014,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", - "rand_core", + "rand_core 0.6.4", "rustc_version", "serde", "subtle", @@ -615,8 +1042,18 @@ version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -633,13 +1070,37 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + [[package]] name = "darling_macro" version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ - "darling_core", + "darling_core 0.21.3", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", "quote", "syn 2.0.117", ] @@ -660,18 +1121,55 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", + "block-buffer 0.10.4", "const-oid", - "crypto-common", + "crypto-common 0.1.7", "subtle", ] +[[package]] +name = "digest" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" +dependencies = [ + "block-buffer 0.12.0", + "crypto-common 0.2.1", + "ctutils", +] + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + [[package]] name = "ecdsa" version = "0.16.9" @@ -679,18 +1177,55 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", "spki", ] +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2 0.10.9", + "subtle", + "zeroize", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "elliptic-curve" @@ -700,22 +1235,62 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", ] +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "feature-probe" @@ -729,7 +1304,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -741,9 +1316,9 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" [[package]] name = "find-msvc-tools" -version = "0.1.4" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] name = "five8" @@ -765,9 +1340,9 @@ dependencies = [ [[package]] name = "five8_core" -version = "0.1.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" +checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" [[package]] name = "fnv" @@ -788,17 +1363,40 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.15" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + [[package]] name = "group" version = "0.13.0" @@ -806,10 +1404,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.13.2" @@ -819,6 +1426,15 @@ dependencies = [ "ahash", ] +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", +] + [[package]] name = "hashbrown" version = "0.16.1" @@ -840,7 +1456,16 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", +] + +[[package]] +name = "hybrid-array" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +dependencies = [ + "typenum", ] [[package]] @@ -851,9 +1476,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" dependencies = [ "equivalent", "hashbrown 0.16.1", @@ -868,6 +1493,15 @@ dependencies = [ "generic-array", ] +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.12.1" @@ -877,17 +1511,35 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" dependencies = [ "once_cell", "wasm-bindgen", @@ -903,7 +1555,7 @@ dependencies = [ "ecdsa", "elliptic-curve", "once_cell", - "sha2", + "sha2 0.10.9", "signature", ] @@ -913,16 +1565,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f25ded719a2354f6b1a51d0c0741c25bc7afe038617664eb37f6418439eb084" dependencies = [ - "borsh 0.10.3", + "borsh 0.10.4", ] [[package]] name = "keccak" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -939,68 +1591,206 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.184" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" [[package]] -name = "lock_api" -version = "0.4.12" +name = "libsecp256k1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" dependencies = [ - "autocfg", - "scopeguard", + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", ] [[package]] -name = "log" -version = "0.4.28" +name = "libsecp256k1-core" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] [[package]] -name = "memchr" -version = "2.7.4" +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] [[package]] -name = "memoffset" -version = "0.9.1" +name = "libsecp256k1-gen-genmult" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" dependencies = [ - "autocfg", + "libsecp256k1-core", ] [[package]] -name = "merlin" -version = "3.0.0" +name = "light-poseidon" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" dependencies = [ - "byteorder", - "keccak", - "rand_core", - "zeroize", + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "num-bigint 0.4.6", + "thiserror 1.0.69", ] [[package]] -name = "mint-nft" -version = "0.1.0" +name = "light-poseidon" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a1ccadd0bb5a32c196da536fd72c59183de24a055f6bf0513bf845fefab862" dependencies = [ - "anchor-lang", - "anchor-spl", + "ark-bn254 0.5.0", + "ark-ff 0.5.0", + "num-bigint 0.4.6", + "thiserror 1.0.69", ] [[package]] -name = "mpl-token-metadata" +name = "litesvm" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "347d8c652d592c618ac996f2ab21f8c0b0f2da3fbbca227a6887ee61bb75f2de" +dependencies = [ + "agave-feature-set", + "agave-reserved-account-keys", + "agave-syscalls", + "ansi_term", + "bincode", + "indexmap", + "itertools 0.14.0", + "log", + "serde", + "solana-account", + "solana-address 2.5.0", + "solana-address-lookup-table-interface", + "solana-bpf-loader-program", + "solana-builtins", + "solana-clock", + "solana-compute-budget", + "solana-compute-budget-instruction", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-feature-gate-interface", + "solana-fee", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instructions-sysvar", + "solana-keypair", + "solana-last-restart-slot", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-message", + "solana-native-token", + "solana-nonce", + "solana-nonce-account", + "solana-precompile-error", + "solana-program-error", + "solana-program-runtime", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sha256-hasher", + "solana-signature", + "solana-signer", + "solana-slot-hashes", + "solana-slot-history", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-log-collector", + "solana-svm-timings", + "solana-svm-transaction", + "solana-system-interface 2.0.0", + "solana-system-program", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "thiserror 2.0.18", +] + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" + +[[package]] +name = "memchr" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "merlin" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" +dependencies = [ + "byteorder", + "keccak", + "rand_core 0.6.4", + "zeroize", +] + +[[package]] +name = "mint-nft" +version = "0.1.0" +dependencies = [ + "anchor-lang", + "anchor-spl", + "borsh 1.6.1", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", +] + +[[package]] +name = "mpl-token-metadata" version = "5.1.2-alpha.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9824d84a8e23b634256591ce2f05b3180f7be5fcd193d939c43764c804aac5ef" dependencies = [ - "borsh 1.5.7", + "borsh 1.6.1", "kaigan", "num-derive 0.3.3", "num-traits", @@ -1009,6 +1799,31 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -1019,6 +1834,16 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + [[package]] name = "num-derive" version = "0.3.3" @@ -1050,6 +1875,29 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -1083,9 +1931,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "opaque-debug" @@ -1095,9 +1943,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1105,17 +1953,23 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-link", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pastey" version = "0.2.1" @@ -1128,14 +1982,23 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "percentage" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] [[package]] name = "pkcs8" @@ -1154,16 +2017,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", "universal-hash", ] [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro-crate" @@ -1180,7 +2046,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.8+spec-1.1.0", + "toml_edit 0.25.10+spec-1.1.0", ] [[package]] @@ -1201,6 +2067,17 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "quote" version = "1.0.45" @@ -1210,6 +2087,25 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + [[package]] name = "rand" version = "0.8.5" @@ -1217,8 +2113,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", ] [[package]] @@ -1228,7 +2144,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", ] [[package]] @@ -1237,23 +2172,41 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", ] [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.10.5" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -1263,9 +2216,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -1274,9 +2227,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "rfc6979" @@ -1288,26 +2241,26 @@ dependencies = [ "subtle", ] +[[package]] +name = "rustc-demangle" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" + [[package]] name = "rustc_version" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ "semver", ] [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" - -[[package]] -name = "ryu" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "scopeguard" @@ -1331,9 +2284,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.23" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" @@ -1345,13 +2298,23 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -1376,35 +2339,70 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] name = "serde_spanned" -version = "0.6.6" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +dependencies = [ + "serde_core", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "sha2" -version = "0.10.8" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", ] [[package]] @@ -1419,7 +2417,7 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] @@ -1435,15 +2433,33 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", - "rand_core", + "digest 0.10.7", + "rand_core 0.6.4", ] [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "solana-account" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efc0ed36decb689413b9da5d57f2be49eea5bebb3cf7897015167b0c4336e731" +dependencies = [ + "bincode", + "serde", + "serde_bytes", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-instruction-error", + "solana-pubkey 4.1.0", + "solana-sdk-ids", + "solana-sysvar", +] [[package]] name = "solana-account-info" @@ -1453,7 +2469,7 @@ checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" dependencies = [ "bincode", "serde_core", - "solana-address 2.4.0", + "solana-address 2.5.0", "solana-program-error", "solana-program-memory", ] @@ -1464,16 +2480,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2ecac8e1b7f74c2baa9e774c42817e3e75b20787134b76cc4d45e8a604488f5" dependencies = [ - "solana-address 2.4.0", + "solana-address 2.5.0", ] [[package]] name = "solana-address" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f67735365edc7fb19ed74ec950597107c8ee9cbfebac57b8868b3e78fb6df16" +checksum = "5f08236dacd0e6dc8234becef58e27c8567856644ef509d7e97957d55a91dc72" dependencies = [ - "borsh 1.5.7", + "borsh 1.6.1", "bytemuck", "bytemuck_derive", "curve25519-dalek", @@ -1497,8 +2513,14 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e8df0b083c10ce32490410f3795016b1b5d9b4d094658c0a5e496753645b7cd" dependencies = [ + "bincode", + "bytemuck", + "serde", + "serde_derive", "solana-clock", - "solana-pubkey 4.1.0", + "solana-instruction", + "solana-instruction-error", + "solana-pubkey 4.1.0", "solana-sdk-ids", "solana-slot-hashes", ] @@ -1518,11 +2540,22 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" dependencies = [ - "num-bigint", + "num-bigint 0.4.6", "num-traits", "solana-define-syscall 3.0.0", ] +[[package]] +name = "solana-bincode" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278a1a5bad62cd9da89ac8d4b7ec444e83caa8ae96aa656dfc27684b28d49a5d" +dependencies = [ + "bincode", + "serde_core", + "solana-instruction-error", +] + [[package]] name = "solana-blake3-hasher" version = "3.1.0" @@ -1534,13 +2567,95 @@ dependencies = [ "solana-hash 4.2.0", ] +[[package]] +name = "solana-bn254" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ff13a8867fcc7b0f1114764e1bf6191b4551dcaf93729ddc676cd4ec6abc9f" +dependencies = [ + "ark-bn254 0.5.0", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "bytemuck", + "solana-define-syscall 5.0.0", + "thiserror 2.0.18", +] + [[package]] name = "solana-borsh" version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c04abbae16f57178a163125805637b8a076175bb5c0002fb04f4792bea901cf7" dependencies = [ - "borsh 1.5.7", + "borsh 1.6.1", +] + +[[package]] +name = "solana-bpf-loader-program" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe15f3c804c37fbff5971d34d81d5d2853ae2d03f11947f44f1d10c5b84c9df0" +dependencies = [ + "agave-syscalls", + "bincode", + "qualifier_attr", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-transaction-context", +] + +[[package]] +name = "solana-builtins" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d196c19ba1caf61782eba5de053061f298f36d9f2aec57073e2cf27403a926d3" +dependencies = [ + "agave-feature-set", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-hash 3.1.0", + "solana-loader-v4-program", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-program", + "solana-vote-program", + "solana-zk-elgamal-proof-program", + "solana-zk-token-proof-program", +] + +[[package]] +name = "solana-builtins-default-costs" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da4d19885c5ee02d942a9e13354a39ef3ff591ee31d55353070c204ae7b8fed" +dependencies = [ + "agave-feature-set", + "ahash", + "log", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-loader-v4-program", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-program", + "solana-vote-program", ] [[package]] @@ -1556,6 +2671,57 @@ dependencies = [ "solana-sysvar-id", ] +[[package]] +name = "solana-compute-budget" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98426b2f7788c089f4ab840347bff55901e65ceb5d76b850194f0802a733cd4e" +dependencies = [ + "solana-fee-structure", + "solana-program-runtime", +] + +[[package]] +name = "solana-compute-budget-instruction" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb3ea80152fc745fa95d9cd2fc019c3591cdc7598cb4d85a6acdea7a40938f0" +dependencies = [ + "agave-feature-set", + "log", + "solana-borsh", + "solana-builtins-default-costs", + "solana-compute-budget", + "solana-compute-budget-interface", + "solana-instruction", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-transaction", + "solana-transaction-error", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-compute-budget-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8292c436b269ad23cecc8b24f7da3ab07ca111661e25e00ce0e1d22771951ab9" +dependencies = [ + "borsh 1.6.1", + "solana-instruction", + "solana-sdk-ids", +] + +[[package]] +name = "solana-compute-budget-program" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688491544a91b94fcb17cffb5cc4dca4be93bc96460fa27325a404c24b584130" +dependencies = [ + "solana-program-runtime", +] + [[package]] name = "solana-cpi" version = "3.1.0" @@ -1667,7 +2833,7 @@ dependencies = [ "solana-nonce", "solana-pubkey 3.0.0", "solana-sdk-ids", - "solana-system-interface", + "solana-system-interface 2.0.0", "thiserror 2.0.18", ] @@ -1677,9 +2843,28 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account", + "solana-account-info", + "solana-instruction", "solana-program-error", "solana-pubkey 4.1.0", + "solana-rent 4.1.0", "solana-sdk-ids", + "solana-system-interface 3.1.0", +] + +[[package]] +name = "solana-fee" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487e4ba57d889e2ecf94a0cac3a3f385fe26d17425aaef3514b79975af2b5d7f" +dependencies = [ + "agave-feature-set", + "solana-fee-structure", + "solana-svm-transaction", ] [[package]] @@ -1693,6 +2878,12 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "solana-fee-structure" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2abdb1223eea8ec64136f39cb1ffcf257e00f915c957c35c0dd9e3f4e700b0" + [[package]] name = "solana-hash" version = "3.1.0" @@ -1708,7 +2899,7 @@ version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8064ea1d591ec791be95245058ca40f4f5345d390c200069d0f79bbf55bfae55" dependencies = [ - "borsh 1.5.7", + "borsh 1.6.1", "bytemuck", "bytemuck_derive", "five8", @@ -1726,7 +2917,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97881335fc698deb46c6571945969aae6d93a14e2fff792a368b4fac872f116" dependencies = [ "bincode", - "borsh 1.5.7", + "borsh 1.6.1", "serde", "serde_derive", "solana-define-syscall 5.0.0", @@ -1741,6 +2932,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d3d048edaaeef5a3dc8c01853e585539a74417e4c2d43a9e2c161270045b838" dependencies = [ "num-traits", + "serde", + "serde_derive", "solana-program-error", ] @@ -1786,6 +2979,39 @@ dependencies = [ "solana-hash 4.2.0", ] +[[package]] +name = "solana-keypair" +version = "3.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" +dependencies = [ + "ed25519-dalek", + "five8", + "five8_core", + "rand 0.9.2", + "solana-address 2.5.0", + "solana-seed-phrase", + "solana-signature", + "solana-signer", +] + +[[package]] +name = "solana-kite" +version = "0.3.0" +dependencies = [ + "litesvm", + "solana-account", + "solana-instruction", + "solana-keypair", + "solana-message", + "solana-program", + "solana-pubkey 3.0.0", + "solana-signer", + "solana-transaction", + "spl-associated-token-account", + "spl-token", +] + [[package]] name = "solana-last-restart-slot" version = "3.0.0" @@ -1811,7 +3037,46 @@ dependencies = [ "solana-instruction", "solana-pubkey 3.0.0", "solana-sdk-ids", - "solana-system-interface", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-loader-v4-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c948b33ff81fa89699911b207059e493defdba9647eaf18f23abdf3674e0fb" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-loader-v4-program" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b79ecebf56ff8acf46d5c0d77a11e1cb9a0f8eeb6dd1a69d739f3bf8ea8570e" +dependencies = [ + "log", + "solana-account", + "solana-bincode", + "solana-bpf-loader-program", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-transaction-context", ] [[package]] @@ -1820,10 +3085,12 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" dependencies = [ + "bincode", + "blake3", "lazy_static", "serde", "serde_derive", - "solana-address 2.4.0", + "solana-address 2.5.0", "solana-hash 4.2.0", "solana-instruction", "solana-sanitize", @@ -1853,21 +3120,67 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cbc469152a63284ef959b80c59cda015262a021da55d3b8fe42171d89c4b64f8" dependencies = [ + "serde", + "serde_derive", "solana-fee-calculator", "solana-hash 4.2.0", "solana-pubkey 4.1.0", "solana-sha256-hasher", ] +[[package]] +name = "solana-nonce-account" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805fd25b29e5a1a0e6c3dd6320c9da80f275fbe4ff6e392617c303a2085c435e" +dependencies = [ + "solana-account", + "solana-hash 3.1.0", + "solana-nonce", + "solana-sdk-ids", +] + [[package]] name = "solana-nullable" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90429a75d69fdcb31952c3dea79f5f3c8157cfe88221e066103c9c237876073" +checksum = "da028344c595c7416769ff648d206de7962571291a4cea24c38a60b6f40d53bb" dependencies = [ "bytemuck", ] +[[package]] +name = "solana-packet" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edf2f25743c95229ac0fdc32f8f5893ef738dbf332c669e9861d33ddb0f469d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "solana-poseidon" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d213ef5dc664927b43725e9aae1f0848e06d556e7a5f2857f37af9dbf9856c" +dependencies = [ + "ark-bn254 0.4.0", + "ark-bn254 0.5.0", + "light-poseidon 0.2.0", + "light-poseidon 0.4.0", + "solana-define-syscall 3.0.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-precompile-error" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cafcd950de74c6c39d55dc8ca108bbb007799842ab370ef26cf45a34453c31e1" +dependencies = [ + "num-traits", +] + [[package]] name = "solana-program" version = "3.0.0" @@ -1901,7 +3214,7 @@ dependencies = [ "solana-program-option", "solana-program-pack", "solana-pubkey 3.0.0", - "solana-rent", + "solana-rent 3.1.0", "solana-sdk-ids", "solana-secp256k1-recover", "solana-serde-varint", @@ -1933,7 +3246,7 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f04fa578707b3612b095f0c8e19b66a1233f7c42ca8082fcb3b745afcc0add6" dependencies = [ - "borsh 1.5.7", + "borsh 1.6.1", "serde", "serde_derive", ] @@ -1962,6 +3275,51 @@ dependencies = [ "solana-program-error", ] +[[package]] +name = "solana-program-runtime" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527e07453b083fa814e35bb56b8aaddb34d20eeeadeb0d13c115780365355c88" +dependencies = [ + "base64 0.22.1", + "bincode", + "itertools 0.12.1", + "log", + "percentage", + "rand 0.8.5", + "serde", + "solana-account", + "solana-account-info", + "solana-clock", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-loader-v3-interface", + "solana-program-entrypoint", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-slot-hashes", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-transaction", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction-context", + "thiserror 2.0.18", +] + [[package]] name = "solana-pubkey" version = "3.0.0" @@ -1977,7 +3335,7 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b06bd918d60111ee1f97de817113e2040ca0cedb740099ee8d646233f6b906c" dependencies = [ - "solana-address 2.4.0", + "solana-address 2.5.0", ] [[package]] @@ -1993,19 +3351,45 @@ dependencies = [ "solana-sysvar-id", ] +[[package]] +name = "solana-rent" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1771d726d4854f1818c750e14aff40b19d84720d0b1b6d53e50e8f16cb6bd62" +dependencies = [ + "solana-sdk-macro", +] + [[package]] name = "solana-sanitize" version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" +[[package]] +name = "solana-sbpf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15b079e08471a9dbfe1e48b2c7439c85aa2a055cbd54eddd8bd257b0a7dbb29" +dependencies = [ + "byteorder", + "combine", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "thiserror 2.0.18", + "winapi", +] + [[package]] name = "solana-sdk-ids" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" dependencies = [ - "solana-address 2.4.0", + "solana-address 2.5.0", ] [[package]] @@ -2048,7 +3432,7 @@ checksum = "dc905b200a95f2ea9146e43f2a7181e3aeb55de6bc12afb36462d00a3c7310de" dependencies = [ "hmac", "pbkdf2", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -2077,7 +3461,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db7dc3011ea4c0334aaaa7e7128cb390ecf546b28d412e9bf2064680f57f588f" dependencies = [ - "sha2", + "sha2 0.10.9", "solana-define-syscall 4.0.1", "solana-hash 4.2.0", ] @@ -2097,8 +3481,13 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "132a93134f1262aa832f1849b83bec6c9945669b866da18661a427943b9e801e" dependencies = [ + "ed25519-dalek", "five8", + "serde", + "serde-big-array", + "serde_derive", "solana-sanitize", + "wincode", ] [[package]] @@ -2152,105 +3541,384 @@ dependencies = [ name = "solana-stake-interface" version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9bc26191b533f9a6e5a14cca05174119819ced680a80febff2f5051a713f0db" +checksum = "b9bc26191b533f9a6e5a14cca05174119819ced680a80febff2f5051a713f0db" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-clock", + "solana-cpi", + "solana-instruction", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-system-interface 2.0.0", + "solana-sysvar", + "solana-sysvar-id", +] + +[[package]] +name = "solana-svm-callback" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c895f1add5c9ceff634f485554ddbcbceb88cba71b2f753c4caaba461690d2c6" +dependencies = [ + "solana-account", + "solana-clock", + "solana-precompile-error", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-svm-feature-set" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5addc8fc7beb262aed2df0c34322a04a1b07b82d35fac0a34cd01f5263f7e971" + +[[package]] +name = "solana-svm-log-collector" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e985304ae8370c2b14c5c31c3e4dfdd18bc38ba806ee341655119430116c1f0" +dependencies = [ + "log", +] + +[[package]] +name = "solana-svm-measure" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bc239ef12213c45a4077799a154f340b290938973ad11dc4aaedee8fe39319" + +[[package]] +name = "solana-svm-timings" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df7bc8099ec662531e751607c096a2b336502b592ddd2cf584ec8312fd499fa8" +dependencies = [ + "eager", + "enum-iterator", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-svm-transaction" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29a9d25c729620fc70664e17d787a7804e52903da6fc94810e5dac7ca3217064" +dependencies = [ + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-signature", + "solana-transaction", +] + +[[package]] +name = "solana-svm-type-overrides" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5093201eaac4a41edcaab9fc0060712d5bce2d2a0ca6134d18e9bcac2b3739bc" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "solana-system-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-system-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a95a6f2e23ed861d6444ad4a6d6896c418d7d101b960787e65a8e33157cee81b" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-address 2.5.0", + "solana-instruction", + "solana-msg", + "solana-program-error", +] + +[[package]] +name = "solana-system-program" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab198a979e1bfa90e5a481fd3cec77326660e182668a248020cbd427c0ea1b5f" +dependencies = [ + "bincode", + "log", + "serde", + "solana-account", + "solana-bincode", + "solana-fee-calculator", + "solana-instruction", + "solana-nonce", + "solana-nonce-account", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-sysvar", + "solana-transaction-context", +] + +[[package]] +name = "solana-sysvar" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +dependencies = [ + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-define-syscall 4.0.1", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash 4.2.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-pubkey 4.1.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-slot-hashes", + "solana-slot-history", + "solana-sysvar-id", +] + +[[package]] +name = "solana-sysvar-id" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" +dependencies = [ + "solana-address 2.5.0", + "solana-sdk-ids", +] + +[[package]] +name = "solana-transaction" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-address 2.5.0", + "solana-hash 4.2.0", + "solana-instruction", + "solana-instruction-error", + "solana-message", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-signature", + "solana-signer", + "solana-transaction-error", +] + +[[package]] +name = "solana-transaction-context" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c4936df4b86a943ea6d552ca2c64fcc0d1a06dee2193cbf463eaedc372736d" +dependencies = [ + "bincode", + "serde", + "solana-account", + "solana-instruction", + "solana-instructions-sysvar", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids", +] + +[[package]] +name = "solana-transaction-error" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8396904805b0b385b9de115a652fe80fd01e5b98ce0513f4fcd8184ada9bb792" +dependencies = [ + "serde", + "serde_derive", + "solana-instruction-error", + "solana-sanitize", +] + +[[package]] +name = "solana-vote-interface" +version = "4.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db6e123e16bfdd7a81d71b4c4699e0b29580b619f4cd2ef5b6aae1eb85e8979f" dependencies = [ + "bincode", + "cfg_eval", + "num-derive 0.4.2", "num-traits", "serde", "serde_derive", + "serde_with", "solana-clock", - "solana-cpi", + "solana-hash 3.1.0", "solana-instruction", - "solana-program-error", + "solana-instruction-error", "solana-pubkey 3.0.0", - "solana-system-interface", - "solana-sysvar", - "solana-sysvar-id", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-serde-varint", + "solana-serialize-utils", + "solana-short-vec", + "solana-system-interface 2.0.0", ] [[package]] -name = "solana-system-interface" -version = "2.0.0" +name = "solana-vote-program" +version = "3.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" +checksum = "55e2eab8557ff61ae2f58ebdb63aabf3579e04eb3dd07e8b4c4102704a137bae" dependencies = [ + "agave-feature-set", + "bincode", + "log", + "num-derive 0.4.2", "num-traits", "serde", - "serde_derive", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-epoch-schedule", + "solana-hash 3.1.0", "solana-instruction", - "solana-msg", - "solana-program-error", + "solana-keypair", + "solana-packet", + "solana-program-runtime", "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-signer", + "solana-slot-hashes", + "solana-transaction", + "solana-transaction-context", + "solana-vote-interface", + "thiserror 2.0.18", ] [[package]] -name = "solana-sysvar" -version = "3.1.1" +name = "solana-zero-copy" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +checksum = "94f52dd8f733a13f6a18e55de83cf97c4c3f5fdf27ea3830bcff0b35313efcc2" dependencies = [ - "base64 0.22.1", - "bincode", + "borsh 1.6.1", "bytemuck", "bytemuck_derive", - "lazy_static", - "serde", - "serde_derive", - "solana-account-info", - "solana-clock", - "solana-define-syscall 4.0.1", - "solana-epoch-rewards", - "solana-epoch-schedule", - "solana-fee-calculator", - "solana-hash 4.2.0", - "solana-instruction", - "solana-last-restart-slot", - "solana-program-entrypoint", - "solana-program-error", - "solana-program-memory", - "solana-pubkey 4.1.0", - "solana-rent", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-slot-hashes", - "solana-slot-history", - "solana-sysvar-id", ] [[package]] -name = "solana-sysvar-id" -version = "3.1.0" +name = "solana-zk-elgamal-proof-program" +version = "3.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" +checksum = "98ebd77845de672972a32c357d7a68f2cc16c1037cc0ebf550ebba167827c10c" dependencies = [ - "solana-address 2.4.0", + "agave-feature-set", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "solana-instruction", + "solana-program-runtime", "solana-sdk-ids", + "solana-svm-log-collector", + "solana-zk-sdk", ] [[package]] -name = "solana-transaction-error" -version = "3.1.0" +name = "solana-zk-sdk" +version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8396904805b0b385b9de115a652fe80fd01e5b98ce0513f4fcd8184ada9bb792" +checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" dependencies = [ - "solana-instruction-error", - "solana-sanitize", + "aes-gcm-siv", + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "getrandom 0.2.17", + "itertools 0.12.1", + "js-sys", + "merlin", + "num-derive 0.4.2", + "num-traits", + "rand 0.8.5", + "serde", + "serde_derive", + "serde_json", + "sha3", + "solana-derivation-path", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "subtle", + "thiserror 2.0.18", + "wasm-bindgen", + "zeroize", ] [[package]] -name = "solana-zero-copy" -version = "1.0.0" +name = "solana-zk-token-proof-program" +version = "3.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f52dd8f733a13f6a18e55de83cf97c4c3f5fdf27ea3830bcff0b35313efcc2" +checksum = "2c13a05831857b4e3320d98cdd77a3f7b645566508d8f66a07c9168ac1e8bc68" dependencies = [ + "agave-feature-set", "bytemuck", - "bytemuck_derive", + "num-derive 0.4.2", + "num-traits", + "solana-instruction", + "solana-program-runtime", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-zk-token-sdk", ] [[package]] -name = "solana-zk-sdk" -version = "4.0.0" +name = "solana-zk-token-sdk" +version = "3.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9602bcb1f7af15caef92b91132ec2347e1c51a72ecdbefdaefa3eac4b8711475" +checksum = "cd8dab3f2df045b7bec3cb3e1cff0889ec46d776191c3a2af19a77ddd3c4c6fc" dependencies = [ "aes-gcm-siv", "base64 0.22.1", @@ -2258,17 +3926,15 @@ dependencies = [ "bytemuck", "bytemuck_derive", "curve25519-dalek", - "getrandom", - "itertools", - "js-sys", + "itertools 0.12.1", "merlin", "num-derive 0.4.2", "num-traits", - "rand", + "rand 0.8.5", "serde", - "serde_derive", "serde_json", "sha3", + "solana-curve25519", "solana-derivation-path", "solana-instruction", "solana-pubkey 3.0.0", @@ -2279,7 +3945,6 @@ dependencies = [ "solana-signer", "subtle", "thiserror 2.0.18", - "wasm-bindgen", "zeroize", ] @@ -2293,12 +3958,39 @@ dependencies = [ "der", ] +[[package]] +name = "spl-associated-token-account" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0242277e290c023de8826f504abcf9206b3cd4e18d9ace4ec59a698b2828e88b" +dependencies = [ + "borsh 1.6.1", + "num-derive 0.4.2", + "num-traits", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-system-interface 2.0.0", + "solana-sysvar", + "spl-associated-token-account-interface", + "spl-token-2022-interface", + "spl-token-interface", + "thiserror 2.0.18", +] + [[package]] name = "spl-associated-token-account-interface" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6433917b60441d68d99a17e121d9db0ea15a9a69c0e5afa34649cf5ba12612f" dependencies = [ + "borsh 1.6.1", "solana-instruction", "solana-pubkey 3.0.0", ] @@ -2328,24 +4020,24 @@ dependencies = [ [[package]] name = "spl-discriminator-syn" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" +checksum = "5d1dbc82ab91422345b6df40a79e2b78c7bce1ebb366da323572dd60b7076b67" dependencies = [ "proc-macro2", "quote", - "sha2", + "sha2 0.10.9", "syn 2.0.117", "thiserror 1.0.69", ] [[package]] name = "spl-pod" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f3df240f67bea453d4bc5749761e45436d14b9457ed667e0300555d5c271f3" +checksum = "2f9c6e142cdf1e7e77f480053ec9f0ce989890768ddf91f619b50f39d1b456f5" dependencies = [ - "borsh 1.5.7", + "borsh 1.6.1", "bytemuck", "bytemuck_derive", "num-derive 0.4.2", @@ -2354,10 +4046,39 @@ dependencies = [ "solana-program-error", "solana-program-option", "solana-pubkey 3.0.0", + "solana-zero-copy", "solana-zk-sdk", "thiserror 2.0.18", ] +[[package]] +name = "spl-token" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878b0183d51fcd8a53e1604f4c13321894cf53227e6773c529b0d03d499a8dfd" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sysvar", + "spl-token-interface", + "thiserror 2.0.18", +] + [[package]] name = "spl-token-2022-interface" version = "2.1.0" @@ -2427,7 +4148,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "num_enum", - "solana-address 2.4.0", + "solana-address 2.5.0", "solana-instruction", "solana-nullable", "solana-program-error", @@ -2462,7 +4183,7 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c467c7c3bd056f8fe60119e7ec34ddd6f23052c2fa8f1f51999098063b72676" dependencies = [ - "borsh 1.5.7", + "borsh 1.6.1", "num-derive 0.4.2", "num-traits", "solana-borsh", @@ -2568,9 +4289,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -2592,85 +4313,92 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.14" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", - "toml_datetime 0.6.6", - "toml_edit 0.22.14", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", ] [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_datetime" -version = "1.1.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.22.14" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", "serde_spanned", - "toml_datetime 0.6.6", - "winnow 0.6.13", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", ] [[package]] name = "toml_edit" -version = "0.25.8+spec-1.1.0" +version = "0.25.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" +checksum = "a82418ca169e235e6c399a84e395ab6debeb3bc90edc959bf0f48647c6a32d1b" dependencies = [ "indexmap", - "toml_datetime 1.1.0+spec-1.1.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 1.0.0", + "winnow 1.0.1", ] [[package]] name = "toml_parser" -version = "1.1.0+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.0", + "winnow 1.0.1", ] +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "universal-hash" @@ -2678,10 +4406,19 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ - "crypto-common", + "crypto-common 0.1.7", "subtle", ] +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + [[package]] name = "uriparse" version = "0.6.4" @@ -2694,48 +4431,55 @@ dependencies = [ [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "void" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] -name = "wasm-bindgen" -version = "0.2.104" +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" +name = "wasm-bindgen" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.117", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2743,31 +4487,53 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn 2.0.117", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" dependencies = [ "unicode-ident", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "wincode" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc91ddd8c932a38bbec58ed536d9e93ce9cd01b6af9b6de3c501132cf98ddec6" +checksum = "657690780ce23e6f66576a782ffd88eb353512381817029cc1d7a99154bb6d1f" dependencies = [ "pastey", "proc-macro2", @@ -2782,108 +4548,56 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fca057fc9a13dd19cdb64ef558635d43c42667c0afa1ae7915ea1fa66993fd1a" dependencies = [ - "darling", + "darling 0.21.3", "proc-macro2", "quote", "syn 2.0.117", ] [[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" +name = "windows-link" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "winnow" -version = "0.6.13" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" dependencies = [ "memchr", ] [[package]] name = "winnow" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" dependencies = [ "memchr", ] +[[package]] +name = "wit-bindgen" +version = "0.51.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" + [[package]] name = "zerocopy" -version = "0.7.34" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae87e3fcd617500e5d106f0380cf7b77f3c6092aae37191433159dda23cfb087" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.34" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15e934569e47891f7d9411f1a451d947a60e000ab3bd24fbb970f000387d1b3b" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", @@ -2901,11 +4615,17 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", "syn 2.0.117", ] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/tokens/nft-operations/anchor/package.json b/tokens/nft-operations/anchor/package.json index d0d9862f2..c87ff64cd 100644 --- a/tokens/nft-operations/anchor/package.json +++ b/tokens/nft-operations/anchor/package.json @@ -1,29 +1,29 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check", - "postinstall": "zx prepare.mjs" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@metaplex-foundation/mpl-token-metadata": "^3.1.2", - "@metaplex-foundation/umi": "^0.9.0", - "@solana/spl-token": "^0.4.6", - "axios": "^1.6.7", - "node-fetch": "^3.3.2" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "anchor-bankrun": "^0.4.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3", - "zx": "^8.1.4" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check", + "postinstall": "zx prepare.mjs" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@metaplex-foundation/mpl-token-metadata": "^3.1.2", + "@metaplex-foundation/umi": "^0.9.0", + "@solana/spl-token": "^0.4.6", + "axios": "^1.6.7", + "node-fetch": "^3.3.2" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "anchor-bankrun": "^0.4.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3", + "zx": "^8.1.4" + } } diff --git a/tokens/nft-operations/anchor/pnpm-lock.yaml b/tokens/nft-operations/anchor/pnpm-lock.yaml index 9fa6868ba..a0aa3f928 100644 --- a/tokens/nft-operations/anchor/pnpm-lock.yaml +++ b/tokens/nft-operations/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@metaplex-foundation/mpl-token-metadata': specifier: ^3.1.2 version: 3.2.1(@metaplex-foundation/umi@0.9.2) @@ -63,18 +63,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.7': @@ -1075,16 +1075,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -1102,7 +1102,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.7': dependencies: diff --git a/tokens/nft-operations/anchor/prepare.mjs b/tokens/nft-operations/anchor/prepare.mjs index 7c5ec464b..fb6b26225 100644 --- a/tokens/nft-operations/anchor/prepare.mjs +++ b/tokens/nft-operations/anchor/prepare.mjs @@ -1,17 +1,17 @@ #!/usr/bin/env zx -import { mkdir, rm } from 'node:fs/promises'; -import { join } from 'node:path'; -import { $ } from 'zx'; +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; const programs = [ { - id: 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s', - name: 'token_metadata.so', + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "token_metadata.so", }, ]; -const outputDir = 'tests/fixtures'; +const outputDir = "tests/fixtures"; const overwrite = true; try { diff --git a/tokens/nft-operations/anchor/programs/mint-nft/Cargo.toml b/tokens/nft-operations/anchor/programs/mint-nft/Cargo.toml index 225819092..07383549e 100644 --- a/tokens/nft-operations/anchor/programs/mint-nft/Cargo.toml +++ b/tokens/nft-operations/anchor/programs/mint-nft/Cargo.toml @@ -20,8 +20,15 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = { version = "1.0.0-rc.5", features = ["metadata"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = { version = "1.0.0", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/nft-operations/anchor/programs/mint-nft/src/lib.rs b/tokens/nft-operations/anchor/programs/mint-nft/src/lib.rs index 09164ee35..3d5b66764 100644 --- a/tokens/nft-operations/anchor/programs/mint-nft/src/lib.rs +++ b/tokens/nft-operations/anchor/programs/mint-nft/src/lib.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; -declare_id!("3EMcczaGi9ivdLxvvFwRbGYeEUEHpGwabXegARw4jLxa"); +declare_id!("Ezf9iNnBPVNr596tK59pTP1MdDWAS2VvNjyiK5gkbSEX"); pub mod contexts; diff --git a/tokens/nft-operations/anchor/programs/mint-nft/tests/test_nft_operations.rs b/tokens/nft-operations/anchor/programs/mint-nft/tests/test_nft_operations.rs new file mode 100644 index 000000000..d22fdcf3b --- /dev/null +++ b/tokens/nft-operations/anchor/programs/mint-nft/tests/test_nft_operations.rs @@ -0,0 +1,332 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_wallet, get_token_account_balance, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn instructions_sysvar_id() -> Pubkey { + "Sysvar1nstructions1111111111111111111111111" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ); + ata +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +fn derive_edition_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[ + b"metadata", + metadata_pid.as_ref(), + mint.as_ref(), + b"edition", + ], + &metadata_pid, + ); + pda +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = mint_nft::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/mint_nft.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_collection() { + let (mut svm, program_id, payer) = setup(); + let collection_keypair = Keypair::new(); + + let (mint_authority, _) = Pubkey::find_program_address(&[b"authority"], &program_id); + + let metadata = derive_metadata_pda(&collection_keypair.pubkey()); + let master_edition = derive_edition_pda(&collection_keypair.pubkey()); + let destination = derive_ata(&payer.pubkey(), &collection_keypair.pubkey()); + + let instruction = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::CreateCollection {}.data(), + mint_nft::accounts::CreateCollection { + user: payer.pubkey(), + mint: collection_keypair.pubkey(), + mint_authority, + metadata, + master_edition, + destination, + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![instruction], + &[&payer, &collection_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify collection mint exists + let mint_account = svm + .get_account(&collection_keypair.pubkey()) + .expect("Collection mint should exist"); + assert!(!mint_account.data.is_empty()); + + // Verify metadata exists + let meta_account = svm + .get_account(&metadata) + .expect("Metadata should exist"); + assert!(!meta_account.data.is_empty()); + + // Verify master edition exists + let edition_account = svm + .get_account(&master_edition) + .expect("Master edition should exist"); + assert!(!edition_account.data.is_empty()); + + // Verify 1 token was minted to destination + let balance = get_token_account_balance(&svm, &destination).unwrap(); + assert_eq!(balance, 1, "Should have 1 collection token"); +} + +#[test] +fn test_mint_nft_to_collection() { + let (mut svm, program_id, payer) = setup(); + + let (mint_authority, _) = Pubkey::find_program_address(&[b"authority"], &program_id); + + // Step 1: Create the collection + let collection_keypair = Keypair::new(); + let collection_metadata = derive_metadata_pda(&collection_keypair.pubkey()); + let collection_master_edition = derive_edition_pda(&collection_keypair.pubkey()); + let collection_destination = derive_ata(&payer.pubkey(), &collection_keypair.pubkey()); + + let create_collection_ix = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::CreateCollection {}.data(), + mint_nft::accounts::CreateCollection { + user: payer.pubkey(), + mint: collection_keypair.pubkey(), + mint_authority, + metadata: collection_metadata, + master_edition: collection_master_edition, + destination: collection_destination, + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![create_collection_ix], + &[&payer, &collection_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Step 2: Mint an NFT into the collection + svm.expire_blockhash(); + let nft_keypair = Keypair::new(); + let nft_metadata = derive_metadata_pda(&nft_keypair.pubkey()); + let nft_master_edition = derive_edition_pda(&nft_keypair.pubkey()); + let nft_destination = derive_ata(&payer.pubkey(), &nft_keypair.pubkey()); + + let mint_nft_ix = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::MintNft {}.data(), + mint_nft::accounts::MintNFT { + owner: payer.pubkey(), + mint: nft_keypair.pubkey(), + destination: nft_destination, + metadata: nft_metadata, + master_edition: nft_master_edition, + mint_authority, + collection_mint: collection_keypair.pubkey(), + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![mint_nft_ix], + &[&payer, &nft_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify NFT was minted + let balance = get_token_account_balance(&svm, &nft_destination).unwrap(); + assert_eq!(balance, 1, "Should have 1 NFT"); + + // Verify NFT metadata exists + let nft_meta = svm + .get_account(&nft_metadata) + .expect("NFT metadata should exist"); + assert!(!nft_meta.data.is_empty()); +} + +#[test] +fn test_verify_collection() { + let (mut svm, program_id, payer) = setup(); + + let (mint_authority, _) = Pubkey::find_program_address(&[b"authority"], &program_id); + + // Step 1: Create collection + let collection_keypair = Keypair::new(); + let collection_metadata = derive_metadata_pda(&collection_keypair.pubkey()); + let collection_master_edition = derive_edition_pda(&collection_keypair.pubkey()); + let collection_destination = derive_ata(&payer.pubkey(), &collection_keypair.pubkey()); + + let create_collection_ix = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::CreateCollection {}.data(), + mint_nft::accounts::CreateCollection { + user: payer.pubkey(), + mint: collection_keypair.pubkey(), + mint_authority, + metadata: collection_metadata, + master_edition: collection_master_edition, + destination: collection_destination, + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![create_collection_ix], + &[&payer, &collection_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Step 2: Mint NFT + svm.expire_blockhash(); + let nft_keypair = Keypair::new(); + let nft_metadata = derive_metadata_pda(&nft_keypair.pubkey()); + let nft_master_edition = derive_edition_pda(&nft_keypair.pubkey()); + let nft_destination = derive_ata(&payer.pubkey(), &nft_keypair.pubkey()); + + let mint_nft_ix = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::MintNft {}.data(), + mint_nft::accounts::MintNFT { + owner: payer.pubkey(), + mint: nft_keypair.pubkey(), + destination: nft_destination, + metadata: nft_metadata, + master_edition: nft_master_edition, + mint_authority, + collection_mint: collection_keypair.pubkey(), + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![mint_nft_ix], + &[&payer, &nft_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Step 3: Verify collection + svm.expire_blockhash(); + let verify_ix = Instruction::new_with_bytes( + program_id, + &mint_nft::instruction::VerifyCollection {}.data(), + mint_nft::accounts::VerifyCollectionMint { + authority: payer.pubkey(), + metadata: nft_metadata, + mint: nft_keypair.pubkey(), + mint_authority, + collection_mint: collection_keypair.pubkey(), + collection_metadata, + collection_master_edition, + system_program: system_program::id(), + sysvar_instruction: instructions_sysvar_id(), + token_metadata_program: metadata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![verify_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify the metadata still exists after verification + let nft_meta = svm + .get_account(&nft_metadata) + .expect("NFT metadata should still exist after verification"); + assert!(!nft_meta.data.is_empty()); +} diff --git a/tokens/nft-operations/anchor/tests/bankrun.test.ts b/tokens/nft-operations/anchor/tests/bankrun.test.ts index 4babd06d9..b48ab0d3e 100644 --- a/tokens/nft-operations/anchor/tests/bankrun.test.ts +++ b/tokens/nft-operations/anchor/tests/bankrun.test.ts @@ -1,10 +1,6 @@ import * as anchor from "@anchor-lang/core"; import { ASSOCIATED_PROGRAM_ID } from "@anchor-lang/core/dist/cjs/utils/token"; -import { - ASSOCIATED_TOKEN_PROGRAM_ID, - TOKEN_PROGRAM_ID, - getAssociatedTokenAddressSync, -} from "@solana/spl-token"; +import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID } from "@solana/spl-token"; import { Keypair, PublicKey, SystemProgram } from "@solana/web3.js"; import { BankrunProvider } from "anchor-bankrun"; import { startAnchor } from "solana-bankrun"; @@ -12,166 +8,140 @@ import type { MintNft } from "../target/types/mint_nft"; const IDL = require("../target/idl/mint_nft.json"); const PROGRAM_ID = new PublicKey(IDL.address); -const METADATA_PROGRAM_ID = new PublicKey( - "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", -); +const METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); describe("mint-nft bankrun", async () => { - const context = await startAnchor( - "", - [ - { name: "mint_nft", programId: PROGRAM_ID }, - { name: "token_metadata", programId: METADATA_PROGRAM_ID }, - ], - [], - ); - const provider = new BankrunProvider(context); - anchor.setProvider(provider); - const wallet = provider.wallet as anchor.Wallet; - const program = new anchor.Program(IDL, provider); - - const TOKEN_METADATA_PROGRAM_ID = new anchor.web3.PublicKey( - "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", - ); - - const mintAuthority = anchor.web3.PublicKey.findProgramAddressSync( - [Buffer.from("authority")], - program.programId, - )[0]; - - const collectionKeypair = Keypair.generate(); - const collectionMint = collectionKeypair.publicKey; - - const mintKeypair = Keypair.generate(); - const mint = mintKeypair.publicKey; - - const getMetadata = async ( - mint: anchor.web3.PublicKey, - ): Promise => { - return anchor.web3.PublicKey.findProgramAddressSync( - [ - Buffer.from("metadata"), - TOKEN_METADATA_PROGRAM_ID.toBuffer(), - mint.toBuffer(), - ], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - }; - - const getMasterEdition = async ( - mint: anchor.web3.PublicKey, - ): Promise => { - return anchor.web3.PublicKey.findProgramAddressSync( - [ - Buffer.from("metadata"), - TOKEN_METADATA_PROGRAM_ID.toBuffer(), - mint.toBuffer(), - Buffer.from("edition"), - ], - TOKEN_METADATA_PROGRAM_ID, - )[0]; - }; - - it("Create Collection NFT", async () => { - console.log("\nCollection Mint Key: ", collectionMint.toBase58()); - - const metadata = await getMetadata(collectionMint); - console.log("Collection Metadata Account: ", metadata.toBase58()); - - const masterEdition = await getMasterEdition(collectionMint); - console.log("Master Edition Account: ", masterEdition.toBase58()); - - const destination = getAssociatedTokenAddressSync( - collectionMint, - wallet.publicKey, - ); - console.log("Destination ATA = ", destination.toBase58()); - - const tx = await program.methods - .createCollection() - .accountsPartial({ - user: wallet.publicKey, - mint: collectionMint, - mintAuthority, - metadata, - masterEdition, - destination, - systemProgram: SystemProgram.programId, - tokenProgram: TOKEN_PROGRAM_ID, - associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, - tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, - }) - .signers([collectionKeypair]) - .rpc({ - skipPreflight: true, - }); - console.log("\nCollection NFT minted: TxID - ", tx); - }); - - it("Mint NFT", async () => { - console.log("\nMint", mint.toBase58()); - - const metadata = await getMetadata(mint); - console.log("Metadata", metadata.toBase58()); - - const masterEdition = await getMasterEdition(mint); - console.log("Master Edition", masterEdition.toBase58()); - - const destination = getAssociatedTokenAddressSync(mint, wallet.publicKey); - console.log("Destination", destination.toBase58()); - - const tx = await program.methods - .mintNft() - .accountsPartial({ - owner: wallet.publicKey, - destination, - metadata, - masterEdition, - mint, - mintAuthority, - collectionMint, - systemProgram: SystemProgram.programId, - tokenProgram: TOKEN_PROGRAM_ID, - associatedTokenProgram: ASSOCIATED_PROGRAM_ID, - tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, - }) - .signers([mintKeypair]) - .rpc({ - skipPreflight: true, - }); - console.log("\nNFT Minted! Your transaction signature", tx); - }); - - it("Verify Collection", async () => { - const mintMetadata = await getMetadata(mint); - console.log("\nMint Metadata", mintMetadata.toBase58()); - - const collectionMetadata = await getMetadata(collectionMint); - console.log("Collection Metadata", collectionMetadata.toBase58()); - - const collectionMasterEdition = await getMasterEdition(collectionMint); - console.log( - "Collection Master Edition", - collectionMasterEdition.toBase58(), - ); - - const tx = await program.methods - .verifyCollection() - .accountsPartial({ - authority: wallet.publicKey, - metadata: mintMetadata, - mint, - mintAuthority, - collectionMint, - collectionMetadata, - collectionMasterEdition, - systemProgram: SystemProgram.programId, - sysvarInstruction: anchor.web3.SYSVAR_INSTRUCTIONS_PUBKEY, - tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, - }) - .rpc({ - skipPreflight: true, - }); - console.log("\nCollection Verified! Your transaction signature", tx); - }); + const context = await startAnchor( + "", + [ + { name: "mint_nft", programId: PROGRAM_ID }, + { name: "token_metadata", programId: METADATA_PROGRAM_ID }, + ], + [], + ); + const provider = new BankrunProvider(context); + anchor.setProvider(provider); + const wallet = provider.wallet as anchor.Wallet; + const program = new anchor.Program(IDL, provider); + + const TOKEN_METADATA_PROGRAM_ID = new anchor.web3.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); + + const mintAuthority = anchor.web3.PublicKey.findProgramAddressSync([Buffer.from("authority")], program.programId)[0]; + + const collectionKeypair = Keypair.generate(); + const collectionMint = collectionKeypair.publicKey; + + const mintKeypair = Keypair.generate(); + const mint = mintKeypair.publicKey; + + const getMetadata = async (mint: anchor.web3.PublicKey): Promise => { + return anchor.web3.PublicKey.findProgramAddressSync( + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()], + TOKEN_METADATA_PROGRAM_ID, + )[0]; + }; + + const getMasterEdition = async (mint: anchor.web3.PublicKey): Promise => { + return anchor.web3.PublicKey.findProgramAddressSync( + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer(), Buffer.from("edition")], + TOKEN_METADATA_PROGRAM_ID, + )[0]; + }; + + it("Create Collection NFT", async () => { + console.log("\nCollection Mint Key: ", collectionMint.toBase58()); + + const metadata = await getMetadata(collectionMint); + console.log("Collection Metadata Account: ", metadata.toBase58()); + + const masterEdition = await getMasterEdition(collectionMint); + console.log("Master Edition Account: ", masterEdition.toBase58()); + + const destination = getAssociatedTokenAddressSync(collectionMint, wallet.publicKey); + console.log("Destination ATA = ", destination.toBase58()); + + const tx = await program.methods + .createCollection() + .accountsPartial({ + user: wallet.publicKey, + mint: collectionMint, + mintAuthority, + metadata, + masterEdition, + destination, + systemProgram: SystemProgram.programId, + tokenProgram: TOKEN_PROGRAM_ID, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }) + .signers([collectionKeypair]) + .rpc({ + skipPreflight: true, + }); + console.log("\nCollection NFT minted: TxID - ", tx); + }); + + it("Mint NFT", async () => { + console.log("\nMint", mint.toBase58()); + + const metadata = await getMetadata(mint); + console.log("Metadata", metadata.toBase58()); + + const masterEdition = await getMasterEdition(mint); + console.log("Master Edition", masterEdition.toBase58()); + + const destination = getAssociatedTokenAddressSync(mint, wallet.publicKey); + console.log("Destination", destination.toBase58()); + + const tx = await program.methods + .mintNft() + .accountsPartial({ + owner: wallet.publicKey, + destination, + metadata, + masterEdition, + mint, + mintAuthority, + collectionMint, + systemProgram: SystemProgram.programId, + tokenProgram: TOKEN_PROGRAM_ID, + associatedTokenProgram: ASSOCIATED_PROGRAM_ID, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }) + .signers([mintKeypair]) + .rpc({ + skipPreflight: true, + }); + console.log("\nNFT Minted! Your transaction signature", tx); + }); + + it("Verify Collection", async () => { + const mintMetadata = await getMetadata(mint); + console.log("\nMint Metadata", mintMetadata.toBase58()); + + const collectionMetadata = await getMetadata(collectionMint); + console.log("Collection Metadata", collectionMetadata.toBase58()); + + const collectionMasterEdition = await getMasterEdition(collectionMint); + console.log("Collection Master Edition", collectionMasterEdition.toBase58()); + + const tx = await program.methods + .verifyCollection() + .accountsPartial({ + authority: wallet.publicKey, + metadata: mintMetadata, + mint, + mintAuthority, + collectionMint, + collectionMetadata, + collectionMasterEdition, + systemProgram: SystemProgram.programId, + sysvarInstruction: anchor.web3.SYSVAR_INSTRUCTIONS_PUBKEY, + tokenMetadataProgram: TOKEN_METADATA_PROGRAM_ID, + }) + .rpc({ + skipPreflight: true, + }); + console.log("\nCollection Verified! Your transaction signature", tx); + }); }); diff --git a/tokens/nft-operations/anchor/tests/fixtures/mpl_token_metadata.so b/tokens/nft-operations/anchor/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 zcmd>n34m2cm3F-cH$Y5mmb^eZiFC84O&hWi>~SGGqA_H70izKfO@!bQnoa_j8x^t` zf|?;wBZE$a~6iUKRQ4M)i5nRqUQ0Sd9wRlQiAPbE4~zCr1U z&lX7~Z3h_7FiHnUr;Z-Y1>z=-T*oof_(#XE(w&`I=1#+#h` z8;RfbQ;F|d5i^~BHk>GM+^ppqH%qy);5~Jm zmcLE%74paNk71M@C8|A=4!znGw2xe(Gr9%k(>*BJCMZ)%0niPaUTv>&Que=vSYgcK;n5fAMLM2H6Sauk&2#hn=23?Y}o`|Gi%O zZzTN}{ge61^xH%7=liS3D;^{CCT$|Oc#O11(zcuB7>l`eN#ibon>Bxr9EP4 zHp(yU66*Ud^t%eP&Gu!V>isi!MDa1u5@KrMYjGxHKE;&=^Y?!3* z`4StRs?t$COVX>V-CeKyF~dVxGh%>HP(n))tKJXcAK zdOjZDiB) zJxo0z;w^QzL#yDVW}&p2fs)T-JVDQTw`)9#BZ8iT)*`mae*% zlb!e10(#$0xCcw$N}><#IvDzXALWh;eM=65KFDvvAnAM6QIg-vfWDHrf3A>!2@AZC zAIln6$X_A-G=H`9)BHH;r};+K&_ezc>8JVUNI%VACH*wtB>gl$LHa3`=YE=>DE%~l z4fl{jezMqu{Cw^~h5Qtr0u=J6aStoxpX)$cA^$w?frb2;j?|j;bDwl^0FnQ$KI!N9{7Zv$)H9yzIp04YzA>!l zg+BdP?+(-3eERkv9r!R$h}?Pp`MtsO$erQSUmc{Q9J)}%y;9`$(%^aIrulLcf^?KS zjmzP$lsi829F{S1ll}7_XW9XnBc4?_R~jYb2KxOnO0SX}5z=uX=e|O4Bl8@V-t04;?+e-k{5J7(Xs7V|^$fp_{9OD3l<&?w$H-vz z8P9LYJjcib{xR;Gz3Mzx{I1X*;W_d>_c_4#XZCx{o>!&0Tvf#2Lc2SG@W&luKMOfx zhywgHBE_xLIGlIvCW5_PUBua4wNql$KlX1aomEjg=j+$`(D+qa?rw=!k}9L6tM{dN z9^FH9EfTtx5FL0Pm&Cp|G)q2j*KbeDee(>mza=TxaId5%Ckkxx8%N0Ym#I<>$@wy1 zY!`KN$@!8$IbZ6t`D1c^6PHNN7lDG`uLtc?RsPJ6!}C2PkL@H(jMMFn;=dMk{PzC* ziBi9fYesKe)_KB-LPuQI`GVFH>G%x%NNU&gc?KykKfTiW^&lh+>qSWenZYp zl!kUkT*%)_m=UjWZ{~Qd+Vk7gp5Lza{0`DNx~UxZu%#^Id)Y1)@>^XCr+>gbm*Wq*(>eZ-!}wFkf7m^b z@~FXXq=>K&f% zaL?!XlMW+AA^$1&4;+8my@2D-IE*ZX{Ab;ZIDXi@nB%IO#qmyeKF5#nNLR>z&Rxjx z=iNmdKk6>#_zUh5j=$(G<@if(Hpjc%OE~_ro5S(Hx|eeNn0pz=UvZal{8b)d3;BO@ zmoxk|H<#nx?h20ook!?G{y*GR41e8S&G9$LR|Wn5>8|1Un{FP*-*WRg-s4`u@weTz z9Dm2XlH>2XS8@D3cOA#ycdzF72W|n!kGq8&?{y`Pf9Mu*{3F-S@qf9+96#Z%=lI9& zH5~uME#dg5ZYjt6+zlN6jK{G;{^#zs4FAHtj^kgt*K_XnoVeWGV>$qlbqu{09%iq(<)d9)_KW+;2U6 z48y%4)}xhf7`<_oss*NhsQAdpB_Ge;jeqR!0^9&7$!S%U-R%-hQI1zj0}-` z%)=)!{ACZro<;6U9zL1jFL+q|zt4O4RDS-5hhgs`SM~6ChCl1!CWb%l;bw+E>EQ_s zLsLXQCNlgl9)^94+{ZjTnc;u-FzjXI9`f*1hCl4#X$*hR!>2L4)x)r-k?ZmBa~a;^ zVc6Hmb$Pgz;j)KeZzK1951+yCdp$gz;rDp>Ooso-!?4GZd$)(rX82tmhJB9QJ3M?Y z!}od^_BwL^=;8Aie!GWZza#fn4?mybyFCnh9=W?b{0|J@>0#LS$ldPY7c#uo!?5=e zkM7cbFJ}0S{`oA16Az!yaO~j=7+&e&3mLxI!x$eTwpN1wVum~XbBq@eTRVAvDZ{V# z&oO>PY%S&aOBlYvKgW0yv9*=wFJ<_8{~Y5>#MWA#U&e6BKYuyH3p{)|!`FEj<4?q+ zg_OU7;aB+QS28@$!&fm}^f1P!h({|ak0%k2W&&fpig>gW7?>g+4F$&d74c{(Flvr? zG!+=*S;V8Qz^`N&QWhBFTg0Qaz~C(6(Oh7RcM*^F0z(oJdjkS5WEff{FeDeTHz6>_ zLz`c2r{C=iL(Ank#>a@g6@k$*5qmQNW4yF^D9SHk7`;@UWBiQRTM`&8AF($j@G^#{ z(qDmJ%kX3mV|7r5IvzK|_UA%Bs(gW-$aog81{ z-oo*vY@rJI*=`-fFLAJ7h5Q`1p5vFYg)8J==HABeW$x`9zueu!@#SnG3;DTj1H)Ii zdpW++-N*4&Y+(zuPV`QOi_BAj)`{+Ccph8m0<9BmWcU^CpE$nOZQ}Tq?mZm8%00mG zb?&_!zuLWz;{`lI6!Ht*W`;|y%<&>u;kcbgm_mNB>t^_Rw}s=^xCc32!Xs26ztr_I ze1qG{@iO-Tj$i9O$nopkhd6${`!L6Ea3A6LMjjyx`Q>gK!yWFQIbPvD%5f);u!a0h z?&A#K?EZ!0Tiho&Ude4+$ggrc7>?a1IbQ8P#c|?3&GD`7GaSFseU{@lxraHxeAxlJC1 z9!74XhoO&=yWhjm%gDXc!|(ticb|u$r;*#>Vf4Ys-Q!{CZRFnO;de8<-ow!2$gT4* z^f_{G@i6o{a(8$b`W?C3JPbXL+!_x<->H2)484!stsZ_q!>c{Knc-C)Mt_LhEgnX{ zh}=yc?qYa_htW?Wx7@?%FOhqLhtY2$_c{;vFucse=tq%T>S6S!$i2qH=vR?j>|yk; z$Sv|P`dQ=_dKmpJa7}IzShI&hmo7_Vf4qyUE^W&%g9~r;g2zVrH9c^ zBRAK>=&!WC>|ylV$i2+Nu+5R1<6-pU$j$aJ`g7zi@i6*zyZa) z{vNp(c^LgZaxd`kPJ)-@WL;>b#)aI>gGevrj(3l6{A~9*jvL(PIUeaA<#?3)0>`7> z7daloGZyUA?P9p#zRdB7?q501@r)(V3`sr3?up3 zdfX_2OS-OC%n8SF*M2S+SN2Ky5*Ooj;5&bXdPZymtNx0c&-fYXy}#&N#n zl93Y67|wC~l%W!z$dMoa>(PmQIILq%dy>{)y994sk$UVr6rSJv+tiORJm3=);Q2Wt zat`a1d4g?y)BFzGua8Fyy#^^~q>F}P9yUBCXz!Gm$Pwv+0St>0H~lYHYM+Q$g!K)Dr9NL#s|rS!GlFLc26AdJ6T zV!tkZukh7?!I?tRA#pu4faJQ@4pg4p=0cFA*`XE;Fk(7r#( z>_44HS+L(QJHQY5FAZSe-%k7@CNu}DQv~l}^M^r_0?vyuf7%}P_&Xl_l_bCIqoDp_ z&oG~x{?2^vKeaxe51*EMM%(j^1Mr#c&yYJ#ObujTmy=$2z02rFJ$yet1iq_6`!xuB z-#rAr1&2xBzaIkM}9&@QY z{cmu*Na~9x5-~`hATZ05e%9jUY%W%NUdRKRjBmq82}@mcv| zo(fU0dXVq!$HI^LD`_G5UrImfX(JfVucJ6(F2r9m{1Bnxv2wr&>4!Y(N9OAE1y2&TRf6ur2=DToDExo9>N%4P@V&I>d!T&@Z z{3vJo@-hL3aV@B#U}CX;Ve zkT0#jLHFH9>3;WU-LD>@`_*G~zdF)=>Y=(%Ei1Z({AhO;(GNb(&hP>LZQU_!&yRBY zpP8?aU&w&=75k)z<$(`;eUjz!yFU4lema+zbI2iH>OO?`mwn`j=Z5b~gwON`>9e$+ zM>FZmHT{uH`esdkn9|Yiy9qXYpzG6=ZtZLBSSnE_3Wc2b-i4gJYg3^4AS_=YH&o7B z&$Jk2+a(jvx|(ih4J?Ff9!DKN;knwH$5lRlz#-%UC0mR{sOxP3BV4Md1gI& z7RPdq)#$VJY`{bk;iMlFLOz!eY;>BO@q8|&gOATsMaCD>mumV>N(bL-2)5_Q|5-{m ze8>+wfb>WENq;OzxB9n>d36Ok;6FXU-=Ka1@Vyp#L;1$hb34an^_o4dH;&AwayFjT zt8ZaH_1&QLfu3xA_3&)y2hYO8#Iv&>Jo63{PZPC;wNog^mk$CD$6^fe3OZeY`Y+R#NYbj8%40;3+w&lH~Z#WOm^Jz zS^vw{i~fZESIqzQAc=?jg&&WYo?3fLuW}HbVs8iXS8k&EJwNAyYw}MfN?aU*UM+qA zp*xtsh)}Ti4{)v!bR^B3?D?oSkM4dSbs!D!FGyrOkKUGJ)z zp|s-0#nl3SIrk8pOA2`2dHqc>elJ>l{Y{CUFMQ~Hq!53NyP5ao+FcxDeWJADdd7GC zlK6G@p4LNfB9VX2PRXzD)gb@P*LN<*v+G}fW9LIkf6}&t^To}0Li$;e810L72k7^^ zpM`Vqns1BLU%g85H7K6y6#}oMdd{YwOK5O7p5n`mPi@aI-x>70I#x zL4S3jz@UryP&%v12l6%1vn8Z|h%Z-pSi9o+bUe?AzF)5Lc}T|xPag(x3e}q>HhpMN zda5ell~m7jDGTsHq?ey5`KwoJIg%5Cy+4QiEZ<8ceF^c&@|_{Dr(>eP$lpXi?cC_) z+TVLf51=4bZI=dQqR^13@1b@{xAoJNR3FPx@c=K&agpY`Mq=b^qMy(g#Frc2I{(4* zK5{HkCJGPbB=&S^`!o#YWSvwXDufQRL?Sn`K*Y@#HuXC~*vl@EkS!QPL2Nb5b6et9`x zEajosEXNB423;&i(|_e3@A0Tf$x}0K!Y7<9%Mgl**-l@FoT=+v!b_(`>+)8@R z?L&CDA550#4Qdyvvjl!F%AcS+>Jar-2iz*fnRLnsV` zH%s_>IdXXa7W+TdwF1Lle*d_fOV;mUyBgZlJ;>LQ=6l~?4<5Alvh19DA$N=;5?yi& zMj;x131C>yy_?@zUCxg^y|C}a_xBxVVfwIMJpAWrI_P^3WkyWo`1NVP9i)K9XK|P` zM7AEIALBSe_}5Czi%$o27zTqn|V8~<2t zp*)*Vnx1R_Oxk2WD7jYlhpJ_Hj(G>xsLW#_m;B~bub>a;m%x8{AP=k~ z&DZn?g7wZ2A7$b9xcb9)ae&X(9sPT&6NPSj|J2r(Yy46)8U^gjA`C?Tc|ma zQ~r#wd=ppa^~v6w9Soi+As$i76wkSWH=a0+e-ws5isG-&r5Nq-hCtqNv+BKnZ(0!A zzHIs)wfJ3eGovHFbFbL3E`i~1!`=~TuC-44!;hVnu{Xt#4^Ow?D-MzNNZVD~)7F)< z?HFtSwDsI%kD+>bMfl%h1(K4{Tm#``Pwhb(tZ%8NmS$9Zz(77!`XFi}a zX%zp>_F>UI)p&M^e=2r+`o~u z=sf;*&gP(pD2Mjln`wt{kfE{jN_K7q_F?>9(kpdE?B1SvR6kk*_edbrTbJr@{Avp7 ztw%>PHuawd)2`ih+SSg9hw{Muz^`izLLQ%kJX86dsP7cKJI`yth|f4(-` zKePQYXh&+2BWg#KgZvHz@$u!-ueaE)FNfqF{X6{vX363$s&n-k0;ipPv=fXY1mj9>ec9KilwH zd!qdGRq4Fd<`H4}9xg9_Jl0##B*|(W?^laIALj3+{NXy!PJ&_Q?xAwFZf%F1->sIn{%DF$aC`(tlwiD4s@EIZu&shfDyuakiVpU$Uyawn{coc)C0>k*m^LJKmgzW{)g00 z4%1uc0EyA%@28j|<*G8><$1oO2w$xwL5#;*1^dzHTLUy{EP+1@5}F-!)zb&Rx6 z#J4U``!;iSzE9=F^z%}ByoTb=Mme{HbyHdbcb8JU6X`9Ak6`*o>t*5qg!`xe#_7}P zZ;HPjy^w6{81b{_5i+iy;x$yRvqk;X(ZC}2QGkxxd^)cT^5G;xZ9e6P_(Rrt6jK*v ze)m({*_iT$b~5?Y;;COB#Fr-+xor%*6HyiSub|o&hv-u#O-GNc@Y<9K8u0< zITStT5k1qXDClAP{|wOc>BFRFg3@z4#m|I%-X78;X2h?5#~soR@d{~|@j?IQexvOV zdEuw+gZOi%ozmb*o6K+GPQl~vi&Q_z-xt|QNGK$FAFOYG>cl9SEX%ZinX|M1%l=(O zVQNR{1L)cs@;6DIW4uLAYB)<^8()$CJK?xAQ=ez$qW2-i%KxdO#V5f&81UM8T-ygr z)~Y_Mewv(yIInAL@q>XZ%<@ z0RD#{-OexAc@gu^3&)IQeA|f(V8*=W(a(SW^GKvAcZj@A*V}US#V<^1N5@hUJ?Az7h<`6p|&9FXaE&AYVQH zQL=E1j0++EAN;@vJ^*YKFM(mbzLyve>#<2Ldc;J1IgjphmZqaaTrJr2kD%= zwfjJF_*sz8`*k{w6jXk;{{?)DXnu(KB3jXR-iJVb1j}#jFqrzT z*80%Hto#zHkJx`k>bpeiL;G8O;1BI~*!-y+jZfQ`Xm|-BqhNA@e-9D0zC#2B7@j?2}=?7o#2=Pt-Oa1ovBQ4PR_E7&kX`A_1aGtbG=QwQV&6Gb}f1FO|%E13m z|C#1gJ)7w?I?k<~#P7qEdb=5pxAt-z;+ae3LOk0DFZ`dm)WLyo(q!77+%%i(Z(o0r z#H(j<9G8VY+~bY_`&pnE`_;e7>{r9{0KW6dw%Ix+^5cCy+s_E;nx*_KrgL}^zfD4N zD+~Rw$6QYRP+Ld0dy_(bfXC)V;A^4sHG=r^^3IM6Wg?0Ke01!Om_Nni02yTS55dnH zzDMn|{s8w&v!niejqMlPcL^$rm*@}I9f0TZhv7faz(&FEU+eil>$k?I?StBWf$^QZ zMaLx_??ZXoy!IH9=h5K%@}tD}`#<~l;rpj_(Bx?FJ^d*0ea6ne58u0v65pea65sRx zPI|ueDDnNf?;f50{m^IrKJ87W$m_YSgPA=F?IO?9&t!AMcKLCl&-%yVlsoPS%k3gP zIFkClv*XCh-TJvBD_4Bv$jTib@MnID-**hg0ctLP{te^6bE|26hf{8JP~YLS-`S6* z^&L*R50d?|_A@&D`jg&I0DeA43r9YmuABIE9GT9$sWe{Ur>(~{lv2H1LmMgKIL7`h zty>^eX&gle$K%phF@DPWlKGWMKi?NA9zz2>1*6Z_nd22Qj@o&1@bO~uBk*1+#?kcs zPI=$X)_IWcPhUv!nOp|rS9cSBTNg8W22&pNquvMVl~+G9*6*s=_pY+?w0UVL$A^F~ zD@QwjzD)MR&HqSN%R0S%M_?-XSrdq^Vbng&6yy6o2!$cyCwAP?#Bj%*cuMWHh9ei> zEpm_FLJU!e?-B(`R_J%B7U_4X?)$0Cm-3Hu+>8^ zdFlFkV5k1O&bi!J{cp@?EKrrMbrBIl0op0Qj#|N5Rv#TK3IDzkts@lsFsPRjfZjA74rJ+j@BR z-T_aq?!zH}G1w2Y{pg~-ub}cw^!)@o|ATTrqxA~wemJ!*Z`A`B;5^U9c?pG5^~^&p{VN5^vqXvW$D=+)i;AsF8UuVw<1Y_rc;` zU2n_aGkY7}`!=sJec!g2qlzim_d!bKFLS-^jmtSMmA|5JC&wLSsi#QyOhB}W+E2ee zdOxG{a<%tmI~&(<`J`o);uZYujcXMa{Oyf*NWS$OC0@Nj;!W!~#ylPrCyl)V>-d~( z+NSw7a~z&8fLuep+YGov=&X0&*^P9*ARM<=A^!@=kM{Y)$Q-RbJc|>;{eAdXSg$RfuUq|qv&UM9Q;oH8;8S)GMZM_8ek0W2i-iI?eAbsQ?Y5n+q(c9!L z!f)ih$nxx%C~$}F6BdV(gF?aVguS0p@cJa{3$~wR>jswJ-Y2qsT-aT-E9iLNpVI#2 z{Wl#S!*E0BC zxLfqg-kW&gg|fc`xk4lZy*IHxl6@24v3{F~_^98(>JffDziR9M{k?zZ^}pskCkcXr zy&qZcJUrxu^FbRk=cTb;k*+66|Fru=lNRZ>-apfOJ(KfPPsVb!efrBr=$n`;mhaf_ zfIsceYFFZ|+E4G5@^MA$?UMS?u9XR}Qv%z*MqC!VVS1iy+R6G^7$E|U)jrw&P4@h& zotKQXjN7>AhS8lXFV{KEbE$ZS54f&v1H3AN-ZjPOYW&w+?-;#PD}iaGPFV zzN{a8kNgt&JA{V()}M1eJOAIGUWWA>p1Wu~j@(wMX9{Yg`czL!YIi{oIEKBvEcm`w zc>mo#Iu~R1!rpU1{+IQW|3{SH>{*EC-Jc8WNrs+|fF3mYK=gd`FzMOd4?S=FME~?; z>+jHUr;r!@7>NJRQGJ*%l8F5LHk8A|0sY<&F?q=Jhvq@juZx&~9zq@;5Ae}_$3B05 z?eh`JAFmTT1wJg`XX{!q7+E`P@3FM6AH4tgR~p~oeoi2~ray(@!cRT@xQ{YH?|J@4 z@z=OB=xu$+Q>@#;f9ay}G**Af{M~x*7v4$hC4<5D z)kzI*|JZX&w`o=ZpVRS;%qry{H1c7le9?!yA|(_5hXB>oRr*(Df4-ZA4#M5iRd?L0)7&mH;46OT{>wLKhx8# zel^M;>iwe|xxDzR>H9|;YvjBKd{&qZUXKIcknchAD{a1F^qF6pGz$ObHzrC~77ysg zyb1W)pbxi5J*F474{!VF@W0_3gm~5vJ@CWlE1pxD2~TD{!pleX)%UZ0^;jHyqi>*j z-MMx2*v=Qw_cfTIT75qB`)*l%zJm2x+PnYv-TLY?^uPivr0Ji1Un|t7ooMG^eIt2< z)}Zvg!9wmdMq~3T%maYBeTrbW`K*2C8FCYS-oyG-tIxY@^i1@5FQ@zV()S|=qtEr< zr;~Y8$S2SH1APYH(7!FL&pWvOqwyZyUb-i|y+)s9o?j|IDttmn6ikloC(83f>!*xg zgVE0)5*^l`kRSfU(bUVo(LB%QyZ!5>y@#pqo2h<8{1w{1<7QS5cl=AJhdF(ZtcB$k z>Ld6vIi~t3`39?x$VdOk4%h0<(bUhu=;KvKSs(8qJ+SsS`(%1y>vE-v=w;lsOZveK z(X)QP|8f-U=i4*-3Hhh*3(q2m##OaTsXuV|_H*l?^mM5D1F4=u;nMempU3os?U&Wp zk9?f&I6H*h?5wey6B+Md^)#&iXzFF^2h{3+e|Gb4{}^WC8L2)x$rBh~ZCubt7v@=vD70*I}a-!6i zT#}CeFc8m#ot~P}dvIdk>pmL#j`ifh+v%*nAKG8o!TyNu*Vb8AV12IfkHuf;Zyn+9 zWsl(>GktnbPuQ>f^N%+jWqtooI$Ke@PA2OHHXpY6ua`@I>t5pSx+C#lzX>{qr~WbQ zZ=(3$tyr68gB5%f*%D9M`Pl9;54C$6U?z zf^P()CmBZzJQO1S>NusZpIt-8n#}qa?)@q0xr1Wv^<3WMS=uV+ll*%+$M9oU7$F;Q z$hV4;s`p8H>%Bq{*3FQCxPg(F_-E=L%N#k7M`(8=UoS?$8fY%Ca=OALcZ$j5wN^4~uzP(Y--Np~DV>~vGGyT49wCH@+6>Iuug zndmZof&K|yy*2ghrF_}-b;vcxc5FZAw|$3n{a@Qj&tDl`Sv=s|*85)o`>_;U5Fcts zY@a{w6@1p;;>v8PceLi$dv|RA+Ri;%I~Q^XIKMBqNDPzzzN?l8egym8tIemZ{!o6V zUvJC2AFz$&1^FEKE%wvpUcdg=2U2?pISjO~&;t3?+_QTb)9dZ342y0s_vdBz6E0=D zDtgxcx^3V61TQZgPm&Xxn4ZY}1IMAfc0!L)^C$UD~Wei1ovu}n+pe25T~93%83mq`9j9UnWV z2)@n}1;5ELK0)%gPSW{@(ih$<*-Q5yn;bCzm`;?$Bc;9usm8a;xcYp94?Sc255MzD`iJ(0Zga6n3KGi>a z&&lw{r6$US_xfaA&d&Fs99XdDzzcmcKhxU5@L7LCIegFA{L=!@u1N1d90lNkKRAqj zLoVij*!b@8PT}nSoI3E$r6lxkv>@tv9*ujZ&vuUA&efuSAV2cG^%U}R^c*$tfYU_Z zle6zR3{>wd${*G{{t)#dKkB_TQ!m=1zk2PyzgUJfSBykY?R)Q4O>Za=5(?mh{<+qx z@mFBP^EADfI|ZQs-s1Qs2K~LO&=1rAJP5YmZ1d69Ns3q3M_O?yjOIgJL_<=rcAcm5 z*y1s0S?BJO&F@*$!KZWe~mUupKzxW7v4!MI9ycf13IEQEFBnHaA zImnOp_%q$ZgqYOspuLxvwCVg*zi*$k?U(tgzDJm}?Gtzcs3E#r_A(sK5B3s1;C(fX zccw>xp~5B~-%n{SiD3QD@>{)jkF~vzU%iX7JDksLqMy|V6()J3|I|A_yo~0*{<{im zCBLnIh3}RA8u)}9>i^JA*hiIzy|>&fu$^a)_57^wZ@R7)cZ=M@`^D%uUJai%{^Iq? zCaMo|!uPCA4)$KFy`N%ovhm8_SKI+=#hx@#Z2cbi=74{FZubO)eA8>Do^Qin$cbK> zeah-(JW}U#IxgG2#^3|}2=^)7g9c$OpZ%`_mUp;>RvIU*aCB9?ut? zC9v7kl_VSb$NFESfTxJ9U)lY-=pScOz;nb_-tw&^{NT{=+xnZ`Pk`sp087VuNCO4n zL%cxP;dPQ61*9WBL(@U$d6WkGv!CMe)D8&NuJKu-N1o3M?R%A==WC=yamCi*WPLVbYe4;Lh2RPG0yQLUtAs!0t92s% zpkVLep?#1tm14-u%CDqElz-uvQS?{FeWtrv=r%n_8vFk);cn2sg^N2|CxU!g&ZHD3 z=L-m>t?SvkMUn0qN3eAyTL%p7<3`}u{s=wY9oS{;H=rKK?K6ZQdMA`K+BN;XcbP0( z%JPcMPPN#2mgrg1vWuVl?;YFvv7SFNdXtu3$!F`iWLM#z*nUE?db!k7miD=B?RX|E z?ofTz^>VXMem!0Nc>i50$v+|E0T*~+&_iutX7JBWz*M_x1k9~J)2{qnK zO8Sz<)^A=vy1*I3dRZ^5KfriU2;Yl`sSWdkPP6Br_g2ysyGO&$`}a^8%64!G#jt1g z9(02$Rl^OGNFlyY;-p#P_&&2c665_d6v4g$^dWLp=6?z4FYv|_L=NN6lJfAUkk7tT zXEEqpMGw4vnk@OvZ#MrTJgLLt0(0k$7g??$|Jc} z_1M0nuKrk6rhU%*A(Y!sv{k7+5aP8`uiY2aq5WbW8Ar66?PuA23dLb!AIDoi)O$L- zAG3(jy6QV5Mty4-j|hNFI^(td%Oyky%VCZ3zfj8g_l3=mDogt%BgH>5IaV z1EXHBXwS`WL;CJM{EPe}_hZ&e^DAszuyNh)3x465pqB8KIr8(c?W8BDANa?S9vOYf zwL))V-?i8MPOE1np?f}+ga6&fA5g#E<`v%l>3tvZ6sh0zdch2VVRsJx?QeerMA6?c zPK5qcGG`a_Y2Wp+c8|5)?H;0sE){$>-k3krLwZ5%9bBOK7n~>giu!$Ly9da|OY{TC zWdV#31)gUF{+*>8pM`uY=d<@Ns;d~}_gGP{(bGdnnU1yc+}a7_JL&`9ef&JNFXNjv zzZ`SnaWeGx7HEHgA4aI0`D+cD-|RJ>LlZ0=eD(433_qp!X;)3h_vNs|)r4Jt3t1AVh~ zox6aPg6Xf>QPZ!6sq!52O^hDq4~Fxn60LuDK2*NrDF6Q89su*7;w!}Ow0jx~Iq7)j zpT$M_PB!cyB-A?k1xx_9577;PqVYB#ThPRh*&hch*U{ZC29l`r?Y%U;D04a>+EVAeqr5v3|ea>a}zG<5ju_!cRhnHcj1U3aBF|GxQ4eBy-fRw{7Hh zPFhs|%}%#-H4gfTdb0h;>$`sM2lGd?AMo#|o2l^}fs7CV44#KTU(Sm&vOYi&+#*UIki*Wj>lYne~`q={|HXo8*t& zSk7SMWW#NeKb|PD`Cahq-%J6ih%didp7)TvAYY7E=r70@w)=vsBwxdY5+`R#Z1OTc zJ8~iiOK;Ty!{ldvX@m09dY7ED0l#PmJMYknkJM1Gbz1X3hG{z>3LE!q9;;;0xWA3{C|)G_G2WqO8*h@94gCDN(;yY1uf!4S3FvJdEeW6t zOzc(&xe^Gwptx})OTjFl9+wiks@2bMKv+>`?bIAP? zdT#RY_GbkpQZRhuCn^kN6zqFM52+q47$fP{{;g-8%n7!x+(Yt&UV1q+Oa55Tf!RFI z{88&qMsLRi$)B|BVY%4+-{$?`<1xCo-uh=DH_{=ao$o2+WIXZxRqda@KTYM{d4bf^ zsd{JnVD>O_@?ATl%k(#-<5NV3A8$(;K2?tK7HO{r?T@fuptn=yY4dm3KlUTf6g<}7 zI?spJQv0a>Rn=dKE2=ko{s?k8o%&VWC3+TDq#qbR){n+(`$g_OqIddTF!KlP{IVan z$*yoeA0z$2);X#t2%YBlVmu7zZ`JAYykVBaF($bb7U+DiaLgoz&3`q&wTJRSe=MIp zUrG2$wb;&uadx3RxAAx-;ioK~js|^h>kN1f)wlF<1oxRQX@2;> zp}jq0ITfOS@t@~Qvj9;&)Gi3wbt$tWONc3$gfD4)J?+ba|Hz%nu9FHm_8)Aoqm z*QNbbU$XOO+Xo2uUx3&8XZAV95y;oZjqw5A2_#Su1G$=?vq0My_LJq=%;dTT;}^&% z;5o}v(-$n{WS5nf>05R`2zvbx(e3wrJEXkz?{Jt8Nrm7L_Tp1GNFn1>?&bj^QDCjaTkuk8@x?Vx<^ ztEUNnIu4+HDEmS4m%@6dQ99^p{u%l2+^gZ&K+F5;Ir7=~hWh3!UF}p~1r)2cG8}>NJ|A6LStoctw z{;i5{1nD30tA587sV~Go68&JkeDA0~KCC?Gd0rp=Cxc8Oq=)M(N&Tp28~sGNA*}!6 zNN44j>YtRO?;^2WQhm$Vdvq!ae%&c+?{6Qxy}#{A%yai}yBBj}FynP%Z{zZJL?0SI z$#GoP@3}R~Jq>YL?h{QK<$me7{9Dbxo8ykM_|2WRzqmr_E=wGa2lxB}3+_> zlb1cW&~cv-41DyD&(R>p`AJR%z3-^yy zKSH`YeSaW>Lm}iJGil@B_)D&pakTmp&Yt>>QxqPn@mh&N$0Yh`^HuOYj_DBuvEGMV z$i0*c#O+!>-~)1t^*l?sKK&n*UQ+vmbvE!7IkXz--PZ51T(a^vJfP#3zrlMNV!zVz zGBJ)H+$VC?eQERG3PWVVYvXJdKk)u#X^3~8gQjD!f_YT?+SdZ2iLIaVmZL6(Mpj_2n;YXycpzex2JoP3Wv#B&8@v2~YHMeJ^S%a??&ihRc< z@#lWDeeHZtm+Xt%`Jaw%Y46e&Dc?R1r%H*gE!s}=3JfRb9WU`zu}7VkO23VG)r0h^ zB6#dQuDDzEbjyB`^E~yxE+xh&*uCuSQw5LB2dzJ6`Ay{}eyZ(bCXN59d}}=|pA*>L zA8Y%Rz}?dB$()Z0J$k+5&)PmlxE^^Y>z#g={cfoT!d@ ztw)O;2>aJw%5Uq`$VV;#<&%C4`4uZE9f_VpOIEKFxs`FG7k+$rzG!(JdBr`_uD1S({b=+U$fJc+y;Ppd^%Qb5 zd0a^6HOALMrDu)OGhbohE7tPvcj$&$OEIBO#BVy}w1}4!<1*|KYdeIHhl+(5LfR8+SrJp=U?ZZm>*{$FIl* zvF~=Idgt4r>2uygQn z_pQRWoIx%~SGxj_p!Pgd__2p&W<(74_M85jh#(3pw%c zjn884PfWk*kI@ymUvv6E^4zHWy`SbACH0Gnxl_d+_4aak^PkMWtmju6o`3x=@JKo6 zH~5YC?Ub~glE(RrH)%Xa@tgb?3asZSl9r1!-wPzYYn#Arr%Rl@|8NFXMjUfY+6 z*Gjq{zs3C^x?au?N|gr`|7MB1mG3QDpS_QFiS(BwbI)kxE@C{%`dzZ#)2sE-AjEc{ zqA&>q>!7r*Ecui!tfNe#EYP#>6#A}*9>}Z*?WXd`KV9>G1NpZqei|ZQM$f$;aGRuu z`2P+01NwM9Q|U1K9p>Maq30W*rw-oFQ$9L3#(cFm?iRnGBJzlvmA)MH6YxJ;;Ck~x z)1x0yhe+oS>!e*O(k}k{K3&pY_Fh2TE%rZ|vt0C}@#7M=d`RN9Zi(ked!xV5Ki97B zIfVUwcSi0;*Y6I5>p1AOednXEBRK7^)Zi4d{nG4%&A$g)Pu)-Q!g}iR%sRruWRK#m z{mf5%7Q7wU4;hEdAC7qkisp6a@MBjPdaSH#&`U>HQHb<=U=3*dDu&gXSSbVcEk296V(fohuKxz2La#fGJIc2w4fNy`u$QWfO3!0eA>?I$33DaVY|<#eAW+;|6$4xy2Kw9djR{~*B@2A zwC}zx6MaQFw2b*PDA(5yT_x>T7Q2_IUu)k1FuydUZx86JC|@MsRRp8ILf&@%4s`dh zpDy}wr2AZPS>$W&7Sgdp<@x)4=nv8lOwa9prFQM-w%-?yYtTQ-XZFDKz|Md8^pG@P-u>^a4B{^Gw$7AcHVg2|Lp7m3!H*TKA#ei=Ymm|Sa2+P5P ziRjb;(r;*WqIXxfh_4;1U#^-M)&`I&*j;BE9Q5iJ%&>jd;h72b;Cm=(7CO>u^qni1Loi8%~VICDnKG z{s;J734YB^jpFRCV{{Y$NcSTIw)K=kPTt20P{Vy@>1c^qj?DK#%Ne+4o>9 zUm^bqEe|eepF#Bj=U5jL9C58-yNbh{wu{;?-w%4F-SixEGUu7?51}0A_tOvl9rwTW z&S$!c!=<6XKPdP6^jl@zHGTE(cdvz1Nbgoi3_Y7bdRnBn3pl+j>1JO;eVk1CSk!ev z+n4Vc)x-q~xqVzdv`=VX^TRNYBof)*fa_-G^RxZY?vn>U2&rAH9e-Nsx!J!^Zf4hJ z@1y>d;RpP_jO0i2HsKdUQt9M-+OAX2Suho6zEr4YH zg>r_sD#LZU4?U5yIrG~?xy^+hULeoG|HlcDt?w0S9}y%ct7YFizFX;9t90u*0s4-i z(7R6Q3fhJ7t3JX$h5NNQ9|;Xdy}d!buyd%lRCyh@V|&YTnU{4fW;khEDscC!1fH`{ z;4N1ReC>RO+YhmhWbJ5jOIA=G?9B1Ve_so*?LGW`=AAW5AOxL5$CGHyEFFn#GmoFA?3}E+54Kk{hvp<>>iS5&qkI{ao9+fd%AAh#OX)-Jc^B* zus5V;2koBN$mw@cw=(d1`cyAJ=s^BOoS!P9P;VZ9{kD4c z~(@y*WGQODebr7zl8Pe$@HUj1Vhgu ziEy6%DXb?v-Seb&K0?<4>go9o6q&<->;^Y1H$ z=^v%T_&~K2_-`i6`DY4t+Hu?8|LC+6=0{=nwAyWTA z^f1e}(HGWFE-mS;?0edHJrKRGr2HwpC@pjiNN?cpJQmQ~AAR;7LNZ6kznNT(8)$u= z?e}e(?;R3DKE3oa^)Du=f1!4=EcoNml##+fbM@c7qc9mt{)URY4DJ5jJHXn`Z<9+g#A*+;S2bA+8*jRdB1d=*lX{XjuhDYrNbFMT)))D zb-Ztg5XxaQ$ra<<6TvwF$l*!4udL`=IKP#rdvUm(t{Y8@eiTaO%?uZFvd@bC4+$iV zOPNma-@8v_hx|#SjE_j)5xgI2`}im?`D8rw>waZPhkm2oK<|zKFX%mo)*=zp<39WT z;%~?TmH9ET-Zx=%+WM-|XZK>*eqG#bbjfH=^eui@se9rG$nIG9bOyKh~^xZ+T|AWbYQ!t)k-h`v=z*7$JR4)~(vgdl1(4-VI z+W53_oS~riV%T}laNppvuae!R{ClY#aGtD*N~G&i2bh18hmGIf&!YCV0QyWW#wYsy zizpp*-yZN|<6JQ><7C+H)>D2vcif@(ocMLQ2~r#8@!&6<$Dc!d*!q5m?{3OxbeUhB z<;UnPO%nWtp~rB)C=8W(Q(@?F>`%o_#0Z6WGQ2o?-!u}#ZTn019C`pvYK_F-P4mmS zhSCf!?h14#0VEK)<2j+$pH(|HS?VoDa&Iy4L-euw#kP)6$UiCXbBh`?&dca;qW!`6 zw0*evY{7f#Vn~zLNheB!`t}X*yquof`Mp!8OTO#$Ub9mt?_)hl%l}0BO;G-FE`R8K ze)zM{7pxB)Eq^t%pYTt^^|EcWUJiXgzcszLeq#3xcgpl6U2l(qZSg{VNKS zexhCMJ|C=CjmzA3a1z~-Z0}JSebCP@D*1?u9hCQx9QcRq{m)9Q-q$u{$_-1Q8YJ{SqRH z;*;6_6mm_hCxzT(>f=ank$bDk1W>>@-V45{(D1H+FXHzkdT#F*g>+f|cVzO9<@^(Y zwvS(9`PXFf!xOOgW$WR;DU%~;rs4@?|7ojACog-rNN(`uRT)+hIpck3(1-4XHI~(K;vg~j$`nNU!Ag? z;M?2$92WvuY!F!vv;}=81f5z z_2d+>oRmJh52nn`!Q(LG8_Mb6&q+R;#BL<(#ZILB%lJ^szsSkXBb$8FbBrR_kbl?@ zvv1%ZU7#NSzaqcW`iWnMohJ0#dk&!-(C+o*@C5Odw#RaA$M`|?>b`!%2GDhz;75P| zKFalOko^7l$D#bbMfo8w^bFGj$m>8b4w*h=^(QTLN8!WZl>+CA2Liy?pb zY4zm)*--w6p?9B9IY6&XA0UTWedY_I7lYR?k&nsM&SjW9k3_%90e{K0(?lO;i=50Z z(Yi0Ex3}F#_5tCv@`Cb0KVlo$Fo)B9Y1)WruP;g z_i;VwcgJ;y^GNAu{~N}${~~|L%YVMwc`T+-u>0oB51l+T&wdH)&aw17au;yExMKsy z@H2WhrE-8>m`?3mbglf{0hyrvYYo&(*35>q_cB z{i*{V0wY&-2i@ zypQ>!@%gVPPxojG+_FdDF4<2?+I9=vEqu^@-V7%v%6>zC_tn@s3-r;#9rPnzpT}wp z(N*~+*W2E*?J2-<*AqfVTd%;~-xGMwW`VbSL*Q#SGJLrEZK0fZQTx#Qn2aYJchH^~ zZ*Wu@@@u1y5QOErsa%-O2zGB|t0FZ2qIIoguyt{} zPZ0W#Cy|qVj%2;yHGJ)jLT@Oin)j7R4&i&J$Gxdu|B^lnyl`nFC;NjT-?vk`=}}nU zUcwLgPo{nzIk_(<)i2d^uV1R?UcXe&y?%+F4_3eYdyTeVFu;6pKJ@1-VuFI*9}T*D z-$(7$D{?Fjm;OQX4e4)7a9$ohEh zlltQxX|J$9%?$9S_^uUv=rk1K%DB3C!O!%%<*$@-zI;>N@=41y))U~FS{KhtwEjJu zuRz~pLI~S|<UO|&mP|tS@-n#reyFbk4ogzt>kr5G9fv-XX)pMV zXa`t$t2Sv^}lgX~Wm;3x4#iE$)=L&tvWN0txYk{La{)o}}OS*S2a%Xdf(4L{c(m6zyZ0KI0@A016>La{g4u|ME8J-xcw@TSqr>{t!Rgi3%sP|Gk*>5%rwF^*qTk zER~;>@t@{xG9HtGp%8cNVY)(mS$Z4Rp*@AKVs0G!wWYF*$CGo-Bzx-r)GwhwH;x8Y zdS8>^=TmI&2m1R}ln=~fkw48t_O(SG>QBU7VlU!uEq{*cN7qv6C+CQM#5S+e??1IqQaus(g6NfdS7XoLbD2(? zS7Tj?)S2x)IB1>N!p{r2MB~eH(1b$nAK88uhRe7^_g{1S#Om+FWwpa~_(Z#*-Iqb% z(s7gdrTqx)_p&Y?mlrBLO`l8q`u&gFn5;hf-$e8S|Cjf|&)dKmLOG*;TQ@+y8724= zQg1Q$8C_>u$MvS|rSdMX5qk7}0NU?TSoKu-iTKn)-}e6qQDWb9^zs_$y#n=Lwq^X6 zX+MJ8W{bR4zN!B*w{AZHpRfEn+dHPWkXtT%KG-XK_A@TS-Xh?f8|!b6_U|SC$mxDw z*2^H@w+Q*0KY)6FOW*k z`D^E|8z{f|4@ryYC+K;c@*7|E?BLQsKf-zS?&JFUNgI)Gh0qh`dn}U=>vi?!>0iv` zJ3#s3%1my*5Z@z|kNkX2_wPrPRW8&%_55=1`Pna_y=DBy_hK+K8J<&5{52zpTpP!s z-^l%=qWH-Ous=?H1cB+II)VQqM3>32vvD2IAHsf?rHj`$+652F|A`EV(U*?DXGlF% z2h*$eGQIyq<|&2YQ#qgSM~7i|zDwi(Gii6)*zOPm6zZ*Wewx!?B=)Q#cD>Xk^U6}U z*r9l{*uByg8NX~?i*I4HJRgIdPL>Fq%I_3TK)ckJ-5+TDN|hHp1q8M8 z-g7uT@$=r(6}EZmB!=mJlNvq9+S_#tLwmcC?NH>dP2z85fx>nZ8D0=XeX?rx6h9ysl1(hm!{CeBbQKOlC# zQT*mm&)1+GbiFb3pROc36WTlWL)Ffb-Q;@E4=zK#z|L{MQ9Eb$0QqKzb}pEgvwTZT zKKIKDDPKqV_iS%FD!=16X|Z)teNTQ_KkvnF5j^G}*t$)45A$(vM8BQOa!mD(o84`v z_lrltZxZrP_COu^xe7_bbNb6GZPC)gLM!r?B>$ z@=%4P|HS2|n2vgO9&#f;g7b&%3HgU||K#KFBZQDJU)D~ted}a$dB6YkU>=3`dxXYN z>&L0wbYCxMPj3H`;0gVd;Te76`n^7l^!hXe`N~q>&wmyvKBW)u>pY8+K-UM^Z?<{R zlj1j5ljyByL3x>4_VvXfyt_(u9ElpeVU>f4cE zT!OqY9wFd-#c>&VzoU=5uR92PXzOpad>!e!-d#**YENDu^oZK>?{4}VxivNX;Czhv zC!sxf4ENsmYY$RC>5Ir0_+4yY)^e3}FPqvaZFk6ZC-V2mbG&B&yJh~Dt=k~qrzxNH z(|Y}e{iFK?Pw1z7=vj6AquXlp^D%dFLjRL< z1x2#^&$})*m`*7n|Ld?WpyLem_K`0@|7AW} z%)N%~d`*5GZ^Cm=OX$ToE0^}0S4;hxAM0aHL|Yc0t$&C3uB(gh>Kc4=>*AZmdK2Qi zsxH1cHTc%l#V7Ns5Z_Dc;+rM-VvhJ8qz&{l%df3x)I0C>qPlp`6}*8Q_t(Lj=zc;y zyl2W7x3liUcb^-JtsNh6mFj|{|>63_AC44W46+DafYt1Wca{6;h=A^=6`V}Kjalx zQa%iC8}qSC^x!s;V@Tg-DhEEE_kCPJzAt z?O^!O=elNc{UM#A54G!y(jL;U!N;S0_#lB%2>FoxD%tO#_dHlGu=8XtiN7hFKU;68 zPdDlO^kJ??<_R``;(0b9qWfv3A2jaMcrVAXuEWy%0tyS=^d6+-TfIx-^*i;s*lXJ7 zRCqe;5xqyQu-K2JQS1Tj2k3LL2XR@(4>~8x`OSZ(_u?6*?@)0Z^2he4#A4ueUi_*z zukIz$+IyFwe6c@J?|dW9k)nM@`~d#TTGoT?x#*-#_`zq3rV}3j-S{@`KY^XxMg1Y9 zd!*vO|9cqsMUKVX>v-IcdqloryY^T9o}hd>{^r z3|&cGd~-AS_756gM_qiEWbo}9G`=Nu@x6fY!EPbYI{i}|tDQQvnHrixxbKK|r+pgE zXWxxZ+V(IVbRIzUc5i*U)V@K_);^l*LE4Tpq`s^k)$s$Tz^-i6bx_C~l%ST+1_OFNMxVm`syjfY~iE}I)GW(2;eeCJU zTrcd%G4v~9@0{9I?{A|0J89o8v3H4{>n(MEh1)IOqU|?B_EG)$`)kOdr_i4HevSDB zrHY)ZZ*Q5Y`1M?Uo7ls+ThGW3+xjk@ma<)G`%UCM8p_z`rzL-co!tX~{@9DH2tWT3Be{|bL%x9D4i#m46-phuzq z@(*-2E#&8PDi_+zZ)E(Ub2IrdZ;UHaPl$IqIF z{9}_#+^q7a{y^gN-(iWI*!fWYxX&$V+|_TpnZGtP(+&@0+U*2wx5ZR7pNQLq?r9T!D9d<5>)ti= zE=51X;sgad-v>FPX5c-W+K;|>ulRO~K6!s@o8p&#llpPu2bdq1tQP+*S-(N*@8RnB z{xirc+srEeSqbH$?v7lw|v_VSD!H&tV-3<-SI8 zr0=haos!`-{XVjt>%1G-X`I*nOpG(TGWKBHLs2b!Pe~a{v^1Xpznr|_^@dPPf%p;Z3RS$rV?UBkqlnc(6vHXK`t-$}-kEs0G z*^GzImk55d%jI|4?_iW%e#Jft*t$mL0fX-oriTGr_0RMgO!*HCQtlp>nLGUJx zB6pOB#@IXw<@?^>CGAMxt5v!VD4tac@0Wg4W_Ea8r5Ez8D4eJFY^WcA@7;7hvg7}- z_bqU86;R4% zg@_U(tJ9CkOcXT;VnB38MGcA=6*MYHRM4oX+0|X+$}ZpepZ}?Qt8d@VOu~xa_pMES z+^M>!PMtb+UiG+DmwZ-V6!z}br<}L0cm^-IMbmQrgyH4*O3t6KG{;x6&(+e5Pe8w* zR{MZI zF>d7s^eOse>3&OZwe)O#E-D_P{yf&pVw#%?7~*D zi!#5d@ET7DX3%xB5aG9Xnm8EOP9N^36kNB!xpinCZX^Y_P~k|g4_6hqgzrO)Gd#Y) z4yElF=>6DN;O}XF5`X`hCO$!*HHxI!O6p-qs<&)?_$)`uk43vSi?aJf_{Kdi^$FTcHW;b$b?nD%=cOv!uD_womX zKb5(ZXS*k)Fy%g=k+`>)`TJ{9?pfnAJc>`8w=81uc=TMR3%Q#9;n%CPJZ%_1`3i%#T+dI+sfcfCXN?)mZtHxX9jxFR< z?IumjIT%dW>rD4-VtV*Srss`oy4-%4;)yyrFBo;(cSgO8Z`^lrK0jd}(Ej328ttWv z+tx{bKKPl&s|kHuHGT_Y`nE6~)3=%Fm_8TZ6|J2Q>-%!YRZ4$YeNfX;$6`x=+tTxy zuHDac*FsGX)*1hlhFQMcdzj)4hgm-AEf^oT4jQ$?YRSHk?nXYib3&4H8a7ycyLJvp zXmQ$P`S0Rq=q-Nv;B%Sd9rVkuehmKKZ2W(M=an2wK1C;)e9STVIN$hUBnkFZy_3#eb;ohIj}3O|$Y#t~&Ut}h}I3vFBw9iXop@N6|aquMWD*LbEB&ttWz z-SF#Get7)Rc3e%o=-*$%?wGym%e6P{b8+>pmHM2$&j%!IXYFKIMacm1AG7!0#xQ zyBo>R_*@=mXPiDdJLAsfadyU?%hNb+nyfy$@4Q^xJ&{qLfDxp5-miS87>n;($=c{k_H3RC-((Qe+XkULM)(SmJ?KYUlarVD#9 zKU_YG=_%(E&isbV!;qeeX6yXP7R;lX{-EEk{3_&*{7mA9bBJdN{mtOW1JtXX;CV$R zo>wcLux9;NF?uc|J*fYLWr#CGVC0t%F4AXs?Oc8O`lEDv<=&84-|JY;;9Aj*dS_>r zKa=&x^pf9hJb-e~X`r`E_>1I){IcSsAsN3xe)?1WeVq7H*?*zq&*pOrMw`Z^Xg}&7 zSStOsu3hz~Px@a(NyhKn=@*?ISGO_UVR~%siMmXW>+J8SXBG8&nEgCae3G6Aap#iz zdW?~oyGPB>N9gU&CHM0;Xg*reXn${(w6g~v(znv?>Yub-<&JNVZ`I#fJI5{U;)e}P z*B;^fu8o==tW%Cl!z^Du|1iZI4zql8enHdGNfs|0Yw^OIv|s$4+9z2rw)$Ot)(=)+ z$?6M-P5y_B&z;os$nN)udTAfZO>xOqt;gpV=BZ`fiuUFJGA1AV#O&q&EPq0yH;Jo^ zPZPvd`QTSgbYCu{<^%4(_w{;}_zzi6qMfR;JYCbgaG;Z{l#@I z-rFO3s&ZJ!QKJ3!tb(18cBjWN-+f5>d$ppK??6^ju1D7B(=WeN%7dP72|WDQ-cm&N ztHpk{ao)a7^X0sK%I^ZoG0H&_#cyan+R-@QW`4J_LhG0L7R4j;_m za(3*;av*J3x43?Iq1qw89ONR+5Ah?~e`x1J|Az4$?N{QrpdF3z9?mI9<3ag#;A^~2 zLV1Yo@VbS@=fzEY9xy(C>`CGC{1l%DTJm{u3qF5J`MlKZ{EEr(dBpsl%{zc!H)rzu zY~}Z0<$A^I^vmzZ-WL3S8~9&I@x9V(?b}E_UDw~l|8C>|n~nb>qF7&QYS*vSu58x) zL?1S38gkvJ596eNfs2D#zpUfN<*66+pUrwfIh6ShN57VneS4PPU}@ToMa5rf+UHX` zzFA*}pSQS7#x}GgCn>+f3iT{1KKeK^WWSL4A%52s*32(;J;3*M>T}d{AJdcc_xa#R ztkw`J7t(+#}?-GAKDIBx>Ghy3l5FaA*Nq+f0`=C{lr`S$Sv^LsO; zUX=gBp4f*#J1hG==_e6P$q(QCJqo=aWIC);zTnqf`CGKSljmvLFXaW>ly9=XfqG_f zgu{b+UoCVeae1>}!zTs#z~rm4L-Dx#e`I}A)3D2kpt8=bnbyKC{PCy0zniA|6Rw}$ zWCsGX1HTh^=r`s?W&T|G4EfpGaQ^Ug%}?yW1b%U?>C-Oz#WvG-=NAJ@H~YmQ>3_f9 zonPE0=U0XGQPa~6`b^7B+MmffsPY^A_SnDbyr-7y%k?(RBcNWu{fo-w>s4^%oOP9p zlZ0mY{jBxtq~e&}?ysfV zPA4~V{)?q4FLEwjsz2Lzxj#Ss1pD(VUVj#H$7z4cJdV-n>>kGniQVP=bz*n9-%IX@qA0=ei``I@J6{w?V3-%WZ?QM&9r#EOc) z&WpJAbhT*DG00zM@M3I6F^^JWTK4J1`u8;Sw_7Ln=0_I;-sVH24%%bzX>Wy}t%&^f zskwkRyB>AWt^+=&@bd}p(LY__-8d@h*bvk6SGi{tb`QU-{@;drF5-LmjZXO!^*oAu z=zRP#zH;+MKHRTTaB~57Su?($r{ER~oa391??HhBy&&1`tMloA-}LQ}liweG3G-N# z^JF}5juPURhkQCd$vt;5pMD^G^1sK1Jh=V}t4V)-7jPb5K#%jw&i{gc_XwQK4=8>a z_vy3G=J_3*FHdNPlP8qF3-x$@9`@GBLsmcB2L5{THZ6mGpU)do{ek@gt{qwO@Cm?s z^1lK7Tw*_G^lYKEOsIn9u(8&dU52VJY1k{ zH$;2t=4B?i&X*6?Yy2bQ2IYStSJJr5mt)AE?ElyIkiW$Ppqu^z`h;ITSg3e>IY_q~ z@vD;y@YThk7p3^6`sLXj2lpC*lkd5dj&OgiwqakwW{VFF{4wT@Il&G&+EYM%y8!&S zU-Br)-|qn8ku3mfR|Yw(k#lVRqWtvRqk331_$dMJ>ohs{+cP)S9_53z$B)PMl_~nf zE?uwvpAQDK0@?S_(jULQFX4Y*u3&zj`T>18LNGi_?l#BIjnf8gKGHuY6nxn4Km`lj z{l=e}!Std7!8MfsA^A{YKKSIzLs+wMg@7X-gM9q-DxbbvtX+#0L0J8@woA@8RlLdg zl=V0|OEu2NhBiKx?@9W|f2JER4QoKi-L?*L`mq?KNHVqw^>zi;fY(#f(1s^V+Ktxh>?l&YG+%Fs=@3kFtN|@HaF#taG12)U$=@ zVajbZkL`))$tP)#oqfy)YiXC)nH@0u@pkDq5!r_L3;hf^UYL^O?Q-wuh{U7l_w(fm z{dDouTS}l__O%N>{9?VQnuwm=&lJHqnPdj(dKR`6%OGJRfEJ zi|3<^fAM@2`IiqqrTlKzD~@lH`@lGk7I{^=C0=2Fr1TH>3FGJVLE=cZv!dC_I%w6> z!XMbl(3@XALG5w1?<#(C5Z$Zr^e~_=NKHiORQpSEq97j}MgD@-FW>jf)%3*Q?QyksRn z;d7au$Nrh^(APAdeyMVY^J-RQ zm0wQ$DF55c@;}w`ZXM63_b};Sl>5~Em~S{0-?Op0p36+=y*Wn`m*g>Uhb8A41dTz zWi2oBotECzgl~t9FOJmmoh-k82g{8FTF!6RHiJJ*;9>8uqt2bj0RA-I>$;Tky<{<; zYdM|@*RwxlJxuF~inMF;oxG)K*MOhvP_%2n-?%g#I~1;)<}of^s{&D!V_8-~RVP$2Zsk=kI!zkFH-A6+cdVBbu%D2L9KlL+Kji zd(d{jRN8uf{GV2+lP?|CS1MaIuz)%<3MI~UaaX4hS8cisGE&z+i{*iRxFkov36-oMWL z@#|Ty^T*XbOS64p?KMoBe;%w;?@PlhUq0_J(m&i!e|=s-)6t2HpQ2-Ie~z6uAp574 zUf(XAFD3H9rJDcurqB7SI`Xzm6-Dk&pLfh&1gwLb*+(YNr0H^W1<>!MX3J`U1UEhrZ5KpXGkB> z#oc#{r1|ZdX#e_GQ}Ea??dyZX`z3)ZFBoc)PoHmNSF=ALH!qcQMBRSz#7`Wj0CImL z+xKq5qd&&wPoHidZ&o~is)s*ZM}8&s@Z2rL!vk4(y*TXMUw}Ss)_zUO!+VO{yZE7^ zNgbEpXmRdKFrWp({X6vuew?ZBCotYx!^y``hnV zm1B>dZ^(YPW_jZ{DYm}`@AL`h?TU)1J>KI=(8cwaq#qt)|5hJif4lpMtM^-algY<} zOxu0MgLa-#X_)1cc!u&5O&HI7llGWu9nY^sUELaQHlMFHTl0PXY=GVM{Pt`cul(kF z=(i0@Z(r^moIe`bsOia+|G8H_(d)OepGGH-=SP`%a4NCL!AjdFvJ3dWlZo#l(p4c{ z@*V7?`Si6+e2`wTUopP+N#pxMCcams@J*jIzMC`gosq&fEfb&I3!(YY3U~pmX~w&*^Unq56UmdEZ=M=pa=3j zyq3@Mccn}`$F`uu`03GcL1y_QGRr&v5Bl$Vjp*Te#`AqskFj~pO|&EK{=Diq(;f6D zVa?>YYpMEqIbVYBdlqYY;_;fz`^9)!F05I-hPPC|Rq@I>7R0~H=e^yd<;orO8)5A( z;_0$>)bC`v$J#N>`l5NHXCglqpZ7LOc|bgp-UqGrZyDeF^Rk%H@a6Md#ATkHyi>+I z{&;0&3LfV;xO1v~yzdma^4ea;U!MP@{84_<@9*^bJvsM`{$J*S$d}@{`5o8)8_mzS z{@=iK-2bDRp1A*KP%b^bji%z?R(yM7iVxSM%BA^MPQh#cnEmkihLybX+NErd?YndP z@%?)-^!{1vPw;WC@B48gMkkH&1R@U?Px$>kZgJ*9Devd6GXMC`lAjOO2~{E|o?Ki3 zIq~ZMkME&=-oxkbzX=3x(9Xpxrwu$26nC&phwUi%wU8S+Nrqx6$R7y_-3(V zfcuryTd??PF!tl!3W)JAes2G{oZF#xuk|^dj3>r8y^_?=&x0HEMCq;(KfcpPfBJsp z7TKTHY|oD%J#}l>X)NC~uD5fN+;}<}*K^)AD&}b4_L<6O*ZzEV9IDSI{-)@3@2k^21*F zBp%uI`0{<3cy>R&ygC!#MJfPEJUIFIGR(xc`|;&lGV$$xeEIrJe7hcBuDCsshonCz zjxU#Gmg`o2H|cvue0hxA@7rvTCLdouBeQ&GX8k*hFAJG?CLdouEweoBYAZg#zAe7+ zAMvH!m!SS3jP2^*KE6CdEWY0_6UCROq~Ke{moF5!$;6j0^!okDk1uCYKXxO&JUqpR ziQ>ycQt++f%L9~ej4xeWHYdk(5)=P!H59;_rGU6I4Jwro9*v0ln;-7#LHniK0I)`!iCetkjXDB z$N&$|{q+%iULMkg!J>Uq@!>p+4_8`z*fqKM(2onZWzx-cAirNU9`@Ry@o+5}=k0(V zHqCF?e56;dRUEldLKV3uO8fE2iz7e9xR7B;&>SCfJl`B2a$N88XLD-)afS3V{L;M5 z;LB#wO4;X{d!fxgZqf8)%AezvPvVJApp$t+v-hKu$2T_S3E`s_#3_&e&5#D;(4VfxV|>QdFt{0qUu)d z$Eafs{cg?b?HbZ_$>znwVfIh7%kxT)D*kfE2E*^p1sY{KUYB8gVZ1IwdL|lA#q&yD zKVf|^DlSy~{`e1k_vbOrlo6vZzZ0zwo|=MRqvL7TBcn&Qm|b8ujt;6J&uye(oL)jN73p@w%-W_g|x64fLyAdE;o%2l={9_6Ie~x4e*F zDLx0wjhmmY`EpK#^3UCOh4p0o%EeXME}yTcCtj~vL^#xYu-ZdTO!$5lo*~&+;pAg0 z`BiiBF}ZcSiR2?0Zwn*k=hK04b(UXu>uX1fUykRMn$~p&{tA4}cC}ygeYw(p@%%@> z&0BruJHB0g<)rPZD?j3uPwduQkcEAs6WV8o=VO_8P9>iBoH3hs^7O1#yROf~_kt8Y z&T~zMPb)L=ab3Hqe1?60wVdDDEdS3@dYa0ceTV#xNYK(;F554JRq`jxFT6Cf{)zp< zZS$o5n)!u2+dULTLzi`B#*)~Nqsoq7ZOn=|(VbZP-PhhF&wxEt=n z_g1GgKKP_A`z*tQ}7{9{oU*+%q0Ef0wd5zFqjENSxpQ6UC#yOTjZ9Wj#J#>?n8f zXmh-Ggz_tiM;X_I)qa)#*6UD&OV**N$6>}gl8S#H$zFo5Vx-zE;0u8<~8Z`AV;R60csM?b(%hb#5k} zUd0owG&$Ub`1h1dd}ooaIQ}*LokaZm{7ihbOY(iP#^q6w{@<7HR`GO4Ccft?ed+Qp zK7d}GeOuCB3BOOuEa&Uv+{|*F+2tR|#H7jm@I1>-;Rl42&KAp2g zq)MX}H@E#GZblD9^LBqeWoL1-?`NK#@<$WJ%Y_ttt9W@D{MSmGXEFQN6eoLr6>;+J z#K$w$-hNN*ZPdZIeQ*ZlyC9cN&G$gB z-=zCCIIc_dn)>O+6@Yv0_x(7TcqS7k_on>HREhhWnF~+iKK}l3GWV6l`-xm!%8UiX1vP<&c(}5JT5kS zG0C{t_ur5IJS#44%anhAUP8wKW;dV@--kbpzw2<{dp|kzuD+hS`2Fo7clqFK_PZyS z?)@Tp@8VrIf3hp_{hT)xyyGsZvKr|KC$<2 zQaRX_xcO(9crH>r(aK&O@9he{A7&Q-j=9JGpaznzKi6>Mi5H#5GU48E^s z;yWXSFFUSxehvEb%UhHFOZY!W@ift4_5|e~$}HENT`nVzz9!Sp&(19G?1sNz|BB4= zoh{0G|>Oc;$%9@_rougY$hq{*O2w4BO>6epJ~UV86ZkJ1tHZxFchTE_8dy>apjy}1GXZsWItd~`WQn&9SR*Q`6c%*D>w*;p2Y`__vbl%07K* zdy4UovjbtBdL0f^FTvmCnQ;XJ#U~!`SbdX@cj$LO*U#j>-Xu;rNd06IPycP#hkbs! zIOL*l3m?7s#I2*ePV)1?yEMLNo=@FRJ8&>w$9am%FX9mS7c45aKL!9FZ@T|fe-&?;e2{^Kkiq=ic~neB*rPFBoqfN4)O*r>N_R&kO$GTM2!;6W`qHl~4TZ zuE#fD%fxe$Hh6d9n=fSI+x__F=1hFMAK#2*;@kE3=9{-9{g?26;`rvPndQ2b-%awJ z5#P+$eS7J7jLFA01DWM_J-#_V6VK%1o3k^^PaNOeah~u!UeEhSd;`IGGUA(e?P#>W z6U8@6Q}C_gn@Hd$6W>H$zc=sq{#(a4w1>Mh-}1T?A0~=#E=a+*nr}H*`Np^=@tb?8 z-#p*^W+B(S-vA~h*>6C*=g)&^98^(rlDH?@LA5OE^0<$%CQ>nmG-CHj@kS3rTIWu zn8HA;kb9QG6>=wNzZG&X(DP&qxh|djxtIeBsZ#t+LN!hUitu;!!x z@Jr5N9oKwcKE`Fe80QGC^6)|~uKr~*FXr0e=I;x+PNVw;Mt7IdeX5>6RLGs7^cQk3 z(UTAT`bMq3Uk@krVw}S`cCON!1^++_9uk@l{;4H=P)YFTgN~MPTN~iGF)FM6`@Q<} z+R8>h;@Wku2Zwg;t#mf8TR8Y}4?Z6>#~lvt_;r4J9%|}G2X~|ghx+lQbv`(}W&4jv z!AlW=Kcpr6$sWIe9}@2FWzOQ;(^B}M3U2>-7W{@3ewn%ucz!6I1^>9mKhU$Uz(an2 z`Dxql>)i+M^u^gVr&mrteEi!*PMh_J`U88g=FL)({p21c_Qwb_aNiU9L+t!f z{c>m)_kmU0Z9mv_K5NtXwDS!6awI4|x82TbcjvoDCmQ}iKJ&p-)zZj!1hRSpdo#r6 z0-g&GzX^bFbg|X5P@i(%v%<;wz?SAY8YFgI0EPs{ZnQiG6 zmhQAP?|msc5N{pI)`_mkmu<@ywh z*g*(^{jQg1KEVIcpYy3Fb}v%j6x7-X58IOu-mm%5yl#b$y5{n^&j6o2y?hoI>NDIQ zRvUJpU(;#(5iKbCz6kSxw#q#G{e&l0RC1FKAEpLP3udSbN9ix`B0Rg8rLVI46g5UC=0&jZZ z<2_N}$}6{Wy}h!5dT#Xk`uLcX2i}M7_V<%faQt>-#i6;~YlOl^`qdv*6Z>=fy@}mT z?BKOpF07b-7H5;b3iUHQkaj)myd&TTy;t4|{imNUwDCIypa1Fgjx_&anSf{i6hF^R z_1mRVANYE)!9OJhkNDf?zr(v1;MRdV5{pR?vLf}}v!0*q$-`WM13i!byOe`a$`9wX zcB9;NO#AgX_`d+Y!uL2YSmn;e0YbNf`;)+xSN77*RgK>>l5*0F$DKUOxiu~2WtQ*< zbbh2kUW$symlt@te8BUA6T956_B!eJUQ3%@F0RsaRGe%1W}k~IEWg|G4NrXUJ?E!F zyQd*KKnRqd>?dS7cP?{<<>Pj?;Df}EYA;Kb_p1J2UJ!94?1prQz61W(8UG5oW7V$8 z_pHjdzW9E$V*w^~43VF72a=|Kgt6VXc);{C=Kua$T;qBC70u(h^Wkv6;)~|-{Q2pk zt_|}t^LP%u+{eBh<$U>2Js3tV0 za&ela`z<}4^?G^+`x4*Re36o?;}}=pyQIEoEqWG4Zt zr+84`+?T+fupNDEt1T|?Ha+6HlYDQ;bO*oxmHp>TcWq(2>lVlNaNRZ^yw&Na@qLrh zQL_8vAuq^q^NC^QCiQdj9j@XHD|JhguCQ{WrODs0a=oS5-ZYL?+=VFWhQhe_Fwr087xu0nE1N0Y&`|)%BLhRjk zq#@_fzsdNC3&zo}?6*Dyuky}b_W11YWZ7dGkjl@e%h|I??5>~h?C}ppFWf%t zQuPYzanpGDa?Ow8@iOmciH>sP<%{h-Mz6_u*{{#hv7iMVUspQhk~H~+HqH<`N_uQw zC@Na~65D0!y?pOt_RH*3#q3wn>{l$uv~RxLs613rtHkqD#6H4bnjE2jW=lT$ajEoA zvhT2;b};_Vx|iwrJ8QtpDVT+epAguhCrsaGWo=y|_ws(+2fG74p8gqszG@TDH_2;QB_8;_ZK?UIpX<7O+V6cu@r0EX zMh^pgmv;1Ee2~U>LIXXwk)EnPR35fsykD`jv=V+>_@VVcK4!@)wCiN(uV;@`u1t>P z{2zq}+)wm7D(mMW(PSwn)dm$O5>MiJ{=-- zFIup%3102I#k1hk?QekmQg4!Y^RrsNUk~`?C<&mg}OJH!4E zf2Zv&7pb4%7k+a8mge`-Jc(cBz6duTSh8_oU+y!yt`k-lDtu_?J;ia(jCPnT=6mQfqRiEW02kA52KfWD+-wA7sYeTzlI2;~Texd)qbxzWM zeYrV|^DXWwa|9fM&F~GIZbGPmUKHMR2gO&HFy&bHsq}}as^9FXm-P-2)1C8%&{=kj<+<0z` zZb0qT)$(_#LOWi_J@j7~PnD`XU)s&LCiCUjv!7%C|6WTw|9_39<(vX#Ov&cY-F&{B z6G{0VraZd)m!n>j|8A4}&NeMyZnrps*$w`o-Ol;=%r_9XJWcWX@%mc9Aoomb{u7=5 z&j-gVJudFYJ{|o0I8o&xLvEI%pFO!ze~=+JSEl3v`r+miom@j676Z!kuG>*r1Vy;AcjUp_okO!m7p!GBoui<&=nfh6P?^=wf68av6- z9UGZO|G( zId^|tIbIhtzI9F0ad22SzQyZeCzFr!0)0Q(^YA`I^5x#u?iO?oDV=hENlfo&w_^Vx z+nM;+Uu%Dbm(6W~XN{JJeSZHvQ>|7R-%7V59swUdk%`yt;T;^%GEs3A=`nw+@my+N z6J^bi*9cyM?p;Yw~Q-eKJ4*I>F-*%w!3eS{cRqF;{cf-SNRI7 z90$bv3~JPysB1Rg*U87I$Hp%cp4WMIlU~5yCHr5$rtf{aJ0(7n_)h8e{V?P=>RO@s zh-2M)*DwC9F&=*^#zS5_e1^pFfS)P#qTe1&!3VPb5LQ{Ak9Ui}Nj$Fgm5Xg`e}!_9 zH9t1f)-jfT-JiFSisk3)Io7@M!4aAtR;b69NYKRqDXG{8@r|%1L?yfYc zq5Uw~uK)dhpKJX4rtmKxELXXRiZQO zTE=0!Q0@jPhw;FGl*4`lL`uN-6zp3zlj_&MT^Q>61#n-w2m05jZ{EGr?7zwmlLP9h zj}PNu*;l3Sf$vtuN4a?B_Fl+YBG=fsB`wUoyV5_lqsPP}6>Wo3*|H%}0If zP~TUYCE;fHFr z!a;Jx50YPvk8 zx5r-{XL$1cagle}dufW|yAbp-e5F81KRUY+kAvwy!x`jDyv{s>e3AJK zjdQ{oT3q-*y$dTgUsW}JWZeIKkrZ+EEn3+e|H4nE^>xg}!#4jK)>kPX(VlBRfq0L0 zB#DDARl;QasBo8vp0-QQ+wD1KbQh*9RJg<+eNoecBfKZTox7LJ4{X%_PWZCH(vB~q zmR2;<&LO7V`IRw$x1{iFPT|>)rg)%&#Tn) zQjO!a@`;Rx!rIF@t~jxvaAECCOFzxhFSfK868SB%`>Wmgvw64g6qVZVee%qTS71-j zo^kPWKHuO+k$;o=&0lDJr7G_mcm6x9o}v7XjyXtc39Bbt`l*(td`0p7+PtUsf1|#= z>-7Jf`u5wq6MakUH5Dt|4ZYhUaaTdL3GwJE+PfBd2LBF!nh!X?=Esq6G5O$Mw0z0* zFtl-^e3z*59uC{M@;t^5QOkSdNr#))7@MWyAGmwreZ5);fA?H_FEW82^z4_*#9q`_ z(4JM7@>yHVr`@k7^R=4p%Tw>8IY!s9f?jC2@hj)Gwc9e3}C*O6#t~J9`J^+7}2cOv8e^Ppy z%Ta#ZdIieQ)cFI}mz3|)^5H1k5nipy3_938;CXr`o)d_tWqI-iGae zGQZQfSon~9r|~i?XLighm!6k=O+&dewOljb$Oq6_@aPQJ(Y_{p>uyn=d`J2DuaN#7 zU95hmuk8$**QA}1c|@JJk@-E+G+nXTH9l_|7gecvvumG}AJ3X3zy z=OlhM{>JgM@%NY%f1Bd_e^Y$^y3~A`FZ9RJ8fTQW8ye2-Ja~Jf-8dsv?u!3zoM*<& zr7!ohWq!xs_u}TSpCWMOmEDxf3iaR3Px<99l=9%$tzY%$mz(V=Mo7)}^!eH#AD{X& z+wTs%@86Wz$wdE-(sHs7o$^|=_@hF9y|eEsfFF3zxea*fhvj=?wcEfCf0z%BHvCRs zH!^;V>)T*y7awfbw9MC8zUggoo8=E#zTt`eikrtGzGOc?@kDOiT48zThr+70cZQOw z`!r>EC-b44UoBOs$DxZi>*SN{n^Jy-L$nLKvu?c9`g@!7cRu(i<#yEQkZBZMpRHP2 zn5lBRjA_hk^~;~&|JWZIi**e{A|ZYSk^G_; zwDHL>L)v|V>WSYk?-z)C@EXle_%lb#`EbJu*WaXPDwjLavsqFO?LJ54ZpiE;=jFo6 zsHHj2ChL8cw)w^i$01RX^K||`8`baYl+3`_J6GQsQeU)Sa}&L)f6G|TeQ%)sg8N=Q zJym@!Ik+VLJq>Up%*Xd2YF7rE>FAU!;C)_7FNZKrzliYAO9%Jt6kI3l!fL~7^VR

F0xg$bY5ePhOAaaNH&G4#{` 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�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�uRqv&wKQHtBkj-jl>xKg%M|M^GyRSc{gK=|ruve!)4zlo^)fv#H%@&@dO9>;n4li{_Y=b;{pQKO>rpJcN*NKy zm!FZ8P_yzDUl#SNn)Us88`_i8Q}5sZU-sSwzK*iYAD>A$5D=vxC)5a%(vsFnH5DzT zatR2vRFt5eQV=wUgV0hhIRv4@xRN45trr4nt@W0Zv@~5=jfzqgO>|MJvf6dM)O%Fi zt=G-2x>iN|d%n+Q=AAh+Cuym={{MSE&^OP_^SlzU$|kC>v7|NM1QPt3h29yz7yy6 zv)mtRKSB3&uwDUg9q^ofo8_tfw#6%MJkUpUxbo-tLF;w#UP*Ycj{-F*>w6EKY)89< z4>f5w)>S~Kt9SH>^4G7YjliF5Req`6+dKjEu!&xweTR~r*Wasn1ZQ;Hfp!Cb)=Q~e zhaSj<`S}vWBceai{O>HO-}K>A&y|L`38 zUrF>Ayq}5wEf@b0E)jne@0;soIxz450%{uMhhOwv)r)Q2a-Pt8vH6Wog+)%(F9`f1 zUAMlteNxI1e;0^5@a+EklK(tDF;!hC6_)(xdf%fA)rF8E=Jzk~{)b_BCBV<|e#kI- z55VVpzhW5L2Kd?Ds~M(&48!MmcQB0J4e!tPzR$443nl+d-YHpKc(}fQmUk|{7dQe7zL8cOt?q=y-nacRjvmCs{V7d{T?gul@H7k)3}<&yt2@7oNM z!qKnfFYrFb@X-oCh3^%pE)+*q@}KNI!taG~C4Vk^xT>D7DETLQujBVc%|F}2NzUp* zM6W1+7LS;#3uS?;N^ghLKo5D}pQY?Xd(>bQ{>rs+rbaB?~ExrAF8j?X2$M&M|_{PhAy z=Mtp8>GtCV?%hzYjL$3ccQSv1VI7|@85ekquA463A@J4IVydmZA}Jg$SBZGH%PF^^uM+*3$@Xj~%nw$0--i0+N)RCrY1FIISm z!ZHrXvm-Z7wfde!^@TUJOF7&6g+F@U&uusR8}*YGKf3z(G1Ad`ea~d|Eu@NSSvbdhB;Q{Xz4;j29jwPYa$X2+BJg@2$L{&P2H-aho*O zlLGBNlR)QNEnW$iOC002oAuS=7L^D1@a~JLzUW>yiKF9wphxV&?hmnhexiP$Ti!?g zfW!;a?+4Cf2DpBX{lql<+#Lr)UvCipyW?``jrHeQ{;nT-yIK65OE=ruIw{YMOK!n; z%xdx+dWm?>jpJU6_uKV737_S3r_yzcq;7oB%k38ZiQ+e%k8mGs@( z1^At07X`j;4Swe#*0aj|5!E-jcRgG(DDam1ISrR@5_s#q0$(;D@T2Gt%}#I6vD1r) zZX5T<@yK4OSHE`>F7d>FZjtyP*eY>Kpmc?u+7Gl-!|4}xw{TkNB15NN!TTeZ7k^h= z+7;aca+2i3`X2sr<++LU1?O9rrPhD0f`1uN{^`D(=pIhBd$*j$q!*COBQ&K}-X?Zb zI_xMOhXu7&+`h2w6tzdO%W(c2frnSh`z6NE0aW!y@IwQsD#q z4mB;hKZS0mq9=sEVZHEK@1wBu%C`S6x@Ud_*s?!(2K3vp-wOe+llRc$IrJymc^v7n z+x`jIos$oC;OhO+Dg66^e@lJ2M-pD;rX3#ct)4Z0*Cprh9{xdoUp#C%3*VHBW zM{{+UO;xF}pM@ld$r9MPxw zr*j&|N7JY4))!;l=J{No+Yay({QDBUcb~Jrbo9dbd@l2Okm-o|yhYlvZAAE1wfIl@ z9NojBe2(s6Q9f5WdnTXL@-{yIEAcs~F6NB1UZC}MDs1)4Q`qWhS9tn-dw}IRuI-h0 z2m1Om=l*ewpPx=87rcPWPusOSPY=%*wu;;f-mQ%9@*VAS?a}x?pZP9yN8fdg{Db-% z{XQ+-II{SkmLvd zK>x8n`R+^O@5EyN2ALy&my@y(KYq*QG~&lU6Q1$I4$9H(CpOo)7Bx~c1}`xH2=Zn03Sc|Hz;?{>xilPvwc@?{ym(3lJmQ9 zQI_4fez>ED`bqPPL%TRX+C{}B{PioyFQob6>hotoukz2O%lLE#^Jy-(fcB3`zxFru zgFn6ueoz=~`>fEO<6ZqG<$WemZ2V}{{s*RLe>?H7z^l&LdUQPeZkgE=-4hD?qHdDw zpLIL=IlISao!}v!g`7fhv(bKkyH_n-KJX`Cj){BpZ2etx)5_I{H2 zb23*%^5SyB&Fdw-wx84B23Z%0?pwQsGSV+AP8<1?#A&^beW0GFkzNG0Zd)6Xa;-ni zh||_;KYu0s;K(l4qY~}who3RMGCQMtO!<9u@91#9z)Q3r*s@mO<>F6+t=hh#Ff=?_ z+7mug{6cs>H;?DvQD3FFj32n;M}GbUdG6ZB>4X_7-wR$3=cD_RxV`T9C++vqUK=;K z`tXC>l6rJ3@P@cp=Kt3S2L4s_2z>rl3V#R5!^SUexnCo^%7z)t7u%O)af<6#b|Sy( zAQp?BmS|ztDI~Tull&^=^)m9yu^y`5Yw%r& zO(bWGN7twP++8T=Zr!g^ll?c1#-rxv=0jh$i~LK6&rm-%BJFRxpXm;UWSkq$zgOVl zP0GJ}1m2>0vV4oc2khrW&%9(;CCwiSt)!T?_OD7?&(6>H$6X+p40bgrTtrYT9gqw=IRxcuK6hSVRONIy@jn>S@@I*B zto(v^6Sp7z<)C9XbbgKbgZ9#Y6c4K&w~4;H?U49c^d9*5*}gWEyI=A1HpvhFmzJyB zA46Y1P5#p4Mf;7o9e7S^74_SI3&bCjTO+^uInbTaznPr=jmjx_ZCsDdkGXug$vJ+FsbL)35EKe6Bq{1pE=@UklxnigMQp z?8X~r@1F<0!|ziZI$S+6{P7e$h;y>a{UqU4Ht%BnaruLFBJk&xE8O`fQSd~&P;Oc1 zM*CLMpU5{#Efup!n?R|NtJnv}d^1?+LceYYR z^b2$62Mhe(^vUjBcH>RND>fdp`P(dg=^}okU3*zyHZeWL!#nHrWlu`($d?tDz9}W2 zcOy=8^yS@@5B$7}=tI4?rSJz*@-)7$1D>NN%Tn|V0@nE>ln>8{@^3;uM;|dUk)@A@ ze|@T+ZqTpgy83ANuO$4+X6erj5B1(Lg?@3lj(&|Qy;o6rv3^OvYWvJ+zo7INL(-4Y z_ZkHr?pFPpA@G)!0xzG*aJW?U%I2LrTBtVY2Pg4(M*EWjQGj2pUuZ3j5y_9*PxMQm zNWV@K*v|iC>Dz?r+uP4Y|2n~Rmb722jy%k;Yp=k!^+@n_m6I>-k7sek#lueF)b49H zd6?X6e-z5OfG|ruTSxkllCO&g{fp-bWZ!@uO`;S%u|)h*Kg@>a=TSt0XO!B)v1t`NTyE_y827j}r8`j$c( z&>LA74TdJA-1*{ng5kZ1ddgZ)uyv0-H^0+CjGa--f=oMzPv%R>2>!g1^E(dS=C z)T`x1^-8&My~suNRn|*-Wk07`_3orMs2BCS^{&Laou{eF19k{KqVq`1Pr&%ucMI%0RSVuB8BYx4{ema7^B?ZII`qrd5h8!wC-`XJ zkI1zKL*}o{73NqI)O3%-sy}ZfPVtU-@~Kaj$mknQ=PH<=rXep!~~l57mgk*yl>ktBaq2SHgEMuh#Pm+Z3Pt0?Wnv*DK?4FG9Hve|A$` z77Wc}dQjeTQ|}S)(Ra;+-n*n6cieI2tx0|0aoR2Qc#BhbSXVQ>amzcE@Pb;G@JqI% z$LFqU!na_ilpk&of8(}iFY(FFyT^8<=L$CH`6Cr|XyCYA#M?&AS?!^i>*PlaSy)b&z&Vpf)2mCVq$NKoummscd zVLP(8F4!)5=kf=1Le7in5BE9R9c1hme(X6YSM0XvpTvwY`=N8qYS-dFLjB%ZFuX(T zc}b7F-y-%O>h~PNCx`$;Jy#i?P6|%HQ2nCa<5eD-!};U+$>X)$Wm>MTyGHYqN6PzX zep1>$-F>nyKa5Y0Pw@%%0RF-Mo4+a7WWKNHYaCqR=FmQp#`+nWK9WArf8^io{EO~m zn?f&xA+-lbFBeZ!FZZVO^5O=18TUUq`Z+A^MR>&H!<4?ddfJoF(<3pJ!6x=ww;kz9XxDXh(<=i^*ow9Yq| zU&r6eGJl}{aO~Oo{zZ~PkNUrhd4Jh|NcUKZ{_1*y%a=Xy|3i`w>wLS_j^95U_PK}i zA?`=qSm4vM=+`HOzH(gOrkCQqjAL9ro=qs$zZQ5mCY3uR@qI8Xfg zcO9SQrtyr~$)n-Zi>eb+r)LZheXZs5`_X<50&)WB$ zEZ)`cqek(+-Ya?yk=IUD+^A`hKDP%-qxE>T57hgr7boKg?uSXw@x%MMJ;)~y+<5dN zAt~fb|9J~~@vq1q=_UHSq~Eu( zarKFJ;w{OittU}_p!?af*5x-5zY!nIcqEQHK@V*;rucM|lykI{OY2Mwhsv*DmOO{t zK%vcB2ivrLde3K8z3a8!d8vAz$n~yI)jJ^Yu(T^&sPyF2f5IkE13Ae++_g)duh94f z@g9EY7w|*7w~`!8@8bE3IsD$_ihWRf-kIdr_b6Y%JAv_BJ3N)1#QtoalvCp*o6gXVwaVA76kjK)AG7aMnm!bpj^lD{U$5QYW_;t@1j!^EBq?%#Wjf{A^qWJzkk=_eRoH$d%Z#Z|qXRkH$$$Mmdg-_QhyC zZ~hngeo0$XPZ(Im8C^ZHb%b}m4EnN*%Zc^nD#nlZ@9yUJ@%M)&6dvc4#^(y}7)LZTZ~qMBc&po9gQ60e`d}TF2t|C}(r( zetq;~Ha-lm9g%XblzM6XFv|B<G*)E=ii z2-NuC;=P9O7ObKQ>1W^Har1$Gw|$Q|d^)i#^x|ANe$XqFv|yc-XL@G)%I!SJn3xgi z!6@r}tOsPg^s{v$v#&tHIdAM-e(fEVvi}8hv_ADumr#l)rRJMCLtyJkvm}3@b{hF% z9k156TjT})e~;Q-Pw)9szOHLU^d2MiESUT1MExf!-Qg5;6ubqTuijt$g7t;Y0W#l$ zVLdOrWL)4adaii6#96^sJ%4irTa7A2qu^ah>x5|&!eVKkc=O4U4%5}%%Y%k=4@B`n6dy;z0b~lW-XalHbODH!WY_J%2^g?nK|!PG85>B>I;JGxeaI5lvo!?xTzEE1u8q z%R{!`MCG$Z<+fGjIk=wr6LxF7*hK`=FYJ_nsM0QSDtISqd9Pu)(>WN`hwC||b1(vL zdAY#LHwnD;DuFN4_(1DBka0Hn1pajp|14gnb2(go#l8>-$CD+ zFVMQg-4k3+>Ch(D|NCg348H<%0e*Hbzqju%2GO`c=!oXQ+f;vSzE{8dn$_Or7h^r^ z5iYl4-_0G;xW?A?hGl#jkE3+`Y5BP1yH@xWE`OWQx8&WD&flWt-ot5D{k;?qN8bUc zNqgbv5$Ay~?}EMe$aB+^vDpHTsT`pPBhJ2NA>IGzsMb}>KTf9O9N&+Ha{we6|n(0`Im`%%AGflE3JGh5sn} zU*`4|{jc$evgq$-e_!;!%j46cKS8=p>wEsgd~ZzA-@`k|i~cWoUZCht@(fAQ{|&DX z75%;ZJ>R1L2!Cm_NXvqlVJZ5b;TZtBFW$%eLD4_VCsHZ>vtRLzqkNAG?XRU9Rq*@>zOldPKaOr( z0ep=ABu-oDMi#(remkch;Ps87|4-gY4Bz8Hg^KBbnOPxa9w(f8f_r*OK6XF!Yo5+9LA(XV+=<#dp59xnRtUXbYl+Sw|h%CJ>P#8rx*BV zaC#T-3@G{+`e!lRO*irY{|>K<)3@*!B8&c;`5vC4e=*(YgZCx>JWemA8-D;_;V~+LhXD8aIPq2VZ}czXH1xYUz1hE* z)7SY3U8r3Dg`B?8e-Wp5_$5x?>aXDR9sVVpzRO?9>HB;PsfzxqJ?a)H9r6+J7X7<@ z3Rft-j_(sH`rG}NFx>0Cl+#yvJ)FMZhe;Lv5BgVf`Vsn)E8sP}KZx|pe;LD{@UQ0d z)BZJ_e%8l`tmuEGUdeculg_N^c(&wIQ_Q&N=|#cS8@71zn9Y=`c+PU zLX;xkbUUYuo7QuB zM$;QO?P}V<>3L0Wf9&>CK#WH@$_^7d73%>B^=7PA_k|lhdB2yEwh7>8+fu zYI+-|FK>cxFZ#Vr8#%qc=^dP|ZQ8`?YntB4X@ApZPH$~`7pLo+-p%Qon%=|dK+}6U zeOuG}INj7V$mzSAYMc%>4RN}qX_(WIrY)S_)3lY-(WbjOy|-x_r#qTPIK97VJE!AK z|H$bBP4DM)XVX2LKGgJ2obGD+0H|srdm;Pip=gryb3o=X8GagPcBuK5cLFKYfGrEz~L z{UrB)PMlZpp4m)jypJon?kD}H-QSIJ@T2c@?L%7dPUU=A<&PeE1W@=#->1*T8%*HM z$;BH;;GLL@*Pp;^%f;(W;1zT6dJ=dua`Czoc#p}&>q_7qnv2(&!1HtQ+7oz>G=bq+ z@|cmp`&}-cm%#h)T)fGGE8kz{;!Py*_T=L2O5puC7jHa)_x)VF(FESNa`6TecwfuK z8%W@NB^R$hf%nB+yxs)f=W_9S5_sdec-;xSPv+uvCGb9$i`SXJ`%o@kdjjvCT)Y_x zyluI7UIK3@7jN;N6;wH;}-) zITx=#fp=3bUT*^L)wy^*3B2B1yzT_vnq0iD1m4xTc%2EnaxPwb0`Kx%ycr3+OLFnN z1l|jB@g|#H{d-<6-b4a#SuWnL1m3fA@x~K)XXWCJCh$(r#T!iEJtG%yAc6O^T)h4S z-uzs=-UQysxp+MZy!KqY?gZWwbMd+oc&)j3oe8|7bMe{}ct_^q%}C&3g)Y0F_7Zqa zxprUW(DHpFRf%o}byv_vPXL9k{6L|OM;>}3lNhF`8FJ1!g z!@1>6`mX-{Q!d^_0&gT2Z&w0uI2Ug`f%o2AywL>SJ9F^{6L@dS#T!WA-I0sepTOIY zi`SdLdwnimPXez$7q2^k7v|!1CGc*@#p_JqRdey$6L>Gr#ha19yCxUUOW<9Zi#Mrf zTHr?u-W9oc6A8SPxp=!0crVPw8&BXpKNoK_fp-1YSojURMHdRxVy=0`K@-y!Hg%ak+Ri5_ret z;&}6VAt(`>w5iSoAR;*BTpFuR*w z-e>|3v&GqXg9$v$K4;?%B=9hsosHL@z{Bi#HePQ653}vrcs&U`%-(0?btmxF<>GZE z@UXg&U0!Db533c~cSMY(u`3B2XGcmoN%^KIcS0_nm%y8ui#M5A4|#kp-b4cLak+TA5_qE9nf-JE z?~vT`Mjbrc*MN1L^&N)yKQ+!^eCivKA zf_)Fz*Rb+M`}S4!Ue%JGFRIo)!|OwRZQD34`m;GB=pA>~7b3cxa;Mt2F>is;fPbxh z?*5oCLe3X{XSq&rL6EzjVR-1HX^Xr?*NuEC;J_pjWc`&UME|H_AS|H@Bv|H`j*|BBC}!J>bZ{}?Xs1pi1* zpThfB>h($Z6x*4$U-t>Q?HXV`iT4vxv7}GZK9rl(GuapB=BMpSq-O)dKSzJl=b(&# z_tSo#cpsY38Sg`reM0d*G@--QCzRvr)9+p?{U|(;$urg~tTre2lOn&XS6_ZfyiW=H zlJP5eSp9bNM!$m?oo{aI=k`YDpWD_mY?lY#O`_9aI`?OxOkF_dS<4?Yvu@GJGzA$CIFUjQBRZ{OXm-Ipuf`!8qo ztOee!)>uEElS%jUrcHMxlWvLc4n#lU@q^(BkNw2CvvL~Ib2x?KRp&eeG8TBZANH}!KIux^`?;NE?O!Uo@rF?Z}{E}kw@Gwd_(1Cda_pGU7Utdzpz{3 z^_;>kj^KJ_JkzM&pJdkipw_eh^&-x(^MZ}){YGZJqVEU7XT()@zM)aQ4`$Z8{eav1 zSgO~~HwW9rzRiyWTSOk=(s_hMcw72KPD|Sr7J1q|X2F(~`o2rw_b9wf;Z+KEE8MH_ zN`}KlizV&olyoBn?(_?9gZ9U9R>8Z2^Tm9YdgC}r>W$+hsW-Yu#_px44M_cw9d1%s z+8IRO3lly-FKI|a{lU1@ulvgj-nSXfx>s$I;y#Q&-irIQ_1pvQmqPpy4DFTrI;4H^ zc~lvPTD%HB1pF}14>cGk(lG_D|Bc5`eIvrB^7cJkZ|U$ucszi1A+D&jj?%y2Hz%Zz zA_rF=`P}1>yvKO02XQfFUQdtE&YMH3r>5sF+RhU`)%09O+l36r=Qdu%aAk8Br{M-U z&*jz!`rWwswJ*eYSK3k1`^u^#^4+pV`L@%!fburUS3K--+}?8Sa;djX&x>sry-CFV zf2R7&(q6Q4MB8~KwKLo(^SO53tkR0zsTgMpANy_tHtZT&1HMT4kSFuIL;0OG?xT9a z&l@g^&nYw-C(ihj;IDWA_%q{AsITOU!c=QVGu+p96sJYrr7!zUlk)+4c|pVF<8I|b8x7-$#>+oX|?Qrz)XwpL$|K1e7-Rt=bst@|~7{ae? z7CQ?!2*2F?>2~~aOJW=lnq{juil>{6Q`lOsv^PvEl zACL>q@2?z`xjKGM?QEkzkpGD!uY&hqoWEN8naTMP;8klsRd|wN`d$M6suC7^eVe~o zr)PT~AwH70A%~e1KBy$39ir0e=OOLD}V44^4~-GKZ zYxsqJho5GzrZ05=R-HW1Pd4&1ooi$HWX(H%lk-p3l?(sn@&ob!-)^FQBpy$gKN0^G z`xDVu^LOcT&>r(AAH4$l`5vjiL4Q0*^q~G4=~q?bi;@rPgdW#8e_xx7ck<_LN9)=t z{2S-zCMWkCUvfTeZ(aWPIsA+L^bW=gZ`xUhpXRHz>!Ji-h0Zwc8sT!{xNK0$b^II3 zarwG|_*(C$DVU+3YbVI(`rostAGG)_9*<~0JR)>7%6}QhYeHZ2eG8p$o~mC6^gCOw zUCso(PCGFUg;!(D?O29QbU&1o@9GEq3iR=s z=Odn#eTDA(wB0;2Qx6a|Al{Pxp6*Xozhm|-{wTI@@mGII`+iD-FDseBbZ(H-M(sPF zY_uHN+wt6Qn18YUH*TNwyJ4HPZKfjTvMt|F<^S|MI@ju~wv3K)h<`)~a?^4`P9JTLA+dWiq4hO1t%D`9atJy=aXpw_SD z^(!CNE4-dz#0MCc75J2U<9_3Z341d6&4Rn|R_l0SjgFtHwIQyjuk9F4gPPo165E^H zUlQBfy^1e#itR@F>1s{%#Nvl)?W5Wbv&WAyTphVj>ofW8WIkHlwpzchyGHMGsn&$P zzP8PpPu6LsV}Cy-{~6m64^N4Y8<`&oIi=#N*Jj!uPT7;ZEDotL$Z_OU_V@7G>BS%T z4p2<5$?sHcx5UMC52WhJ|JffTP^}%f{e6h!G9CNFxP|zB_c2_WK))MlFw;&c z%})Vr7}s4xF~a|s`@1lqzg^6a0*_J~^JV$}`K`pb?ga@xl9JMIsyNg3jfESep9(ii z|3vFrthaRkBKwhq-%IsRJbyy6uz7{&v3<geZNP`S*-6LR=7vu z358cF{%(a=D!fbKWs3ih!rcn*RCul8Z&A2c-w!IhN#S=Z+|Tfu*3AkJFx=PrPK5^* z-lXt)hQroghQr%B_4znIue6?`@QCJnio&A`&sTVt!cSIskHW_(Ji&0-dX&Pu8Mf~a z(7tko`8C=14Cx;?2))ypN5aX;*pL6ipU_{1(KyxO{5`B!@jmrQg>9U@S794R3IF4M zK=_~V%c*_bNk}){wjs7o|O#8^(Dff_Ee53-?2RzE3%0xxMOdrax~^@Kxp6cJTFQzEe-EKiz*d{rQ+v|KC!79-wmw zvD{@pXTf_K>yO3xQ^#xVb$W_^$?d1o{fW3(`s#kQyT{)`~k%Q z!O%F@>&640;c{29UD19{&Tspi>^spxtykao==-$_OB@i7-+T4_dVRlEVezB(z14WX zM7O>dKN_~JRCtx{}Z-#>3i`{^j%p%a*{QFDl<4u1deSFpbPxTQhnWv9q5`LkdRQ=hc>0eeKgYBY!1@9HC zmyPx>j+0&@o<8e&7-x^O{@HhQ%-*WQdaiNF?fkyjd^X!*vH4`#ztG&l`xol>BkW>) zlp}oF%`nY#bL!g1B++5#JFQ+jUs%5%VQ*dj+d2Pa-SfP2jz6V!#DjUxan7Z(9|7@b z{eFa#nP0|-0^b^)oY#XK-2DmH&_;ZdN4yVaC$}%&$I8V<>!k%=eM5XB>o=7)Syw3Q zxzvi@FHZi2%dzud@xGt|e!g1ofwy%8(2e zy_CO5&Jzd2Qf|2DiTr-`@Fsr0X3=bh!w&5JkNIZvap>>xE6o$>dB z=OQ=BuT|5Uq}Uf@_Vl$2U3)r%5lpYEgKAGl=s98i?sm~rd!pODLC4?Hp4{`quAS!D z)6ECjo<6a%kv$3HV|&7>mB#iIkSdgi#J?5kt}m!oq}TdA@nDPTx2}J#n91daOJ%%M zStRoc6+Jg#c3$9BM#OoI?bGzy^v3j|EN0*pn_IZPBJIzG-nsK3c!PcaNa3$9 zk-kzUg^A+@okxt~g%eeuBwpxSB#Ie! z$oyiZRr>A9ZHyN6&-HPG`0XOyaSJ{KvybNt;X+A+*jfJ z7bnE$FAn4S!6($%=={acFQI-w?aJg8UMul^blyVc+IOw&({c5r9rNZyHrkza-lFBX z(C2m;mkh~xw(h(Ixhu51c&NlNr9&nDa_ixJ9D4o({nI@p>R_ak^`flj8%u}J<8p$# zg?_Xj5m-gnE8_ESSJ2bAf1~*aE(h^Y@_a)VKQ}v}c?gDGy2NjEM|ddL_T`|wsm?b% zEoWS@8}a%ON|SyW?MJ&`!v0|o*GKanoW}d`7b~oONB85U%Q3w`dGAcfU-G%_8%(Vi zE+#sl|Lch^z&)4v>rV|=g+FTPduJKl=bm)?HNk< zcQ`HA7Ah=!qVLr+O#981F3}^}7tiqOn&`!vwo!RMBJycO&u{5|oR}Wz#{*r*$G8mo z91M$oS7r||BSRSmCHA*W5MLpmt_$LGhSlvtf1~<;;?!?;6ps&uexsw(q4n!HrQrQ1 z^P{SKqVqt)|7|L7a!Z{ld4o<{XM&xSVoL;K|%=hBxdA?@9db8Bl^Pp!Wk<@|AfIij%H zm9*dOFTo$Tzx>FGta!R!KatP;4CMPpzNbpckNv6C4}VIk@8#Y%X6M=*Ke`s>4~bkc zZXX3)6&QYP9{q`W*VC0m=JzmvM2|e9%f)*g;pLxC`xWykOMhW6sOJ{eAF;oZ|70cv ze8VpuugUlx?ZvOyJYUm!4gFu*ULMUnuIuL>%{XnrLH2*EGWDv3`Q!SrEIl!Q5b2TH zf2BkG$aMU`2*q8H;{_~7iC;?oT`WP9S9N4N$1!~yj(ddV*K!WOFSZ=XH=Pw*Ud;X* zFsYzdYNGZmTTm@iY>G0OTPkRCb>v3MsRq40;j9ICvm#kJCW0Cy>?D7@Mm#)wSN+)tL3|j zE!TQ;7`~2XUQte;d{?pMdJitS*z#(&(_+g%c(9ma%SApcqS$h~haED-mN$Fw#Ko4k zdJ8yxmwZ>Tr6%81Y}qE?RcslN?<%%D-^WZzvE?h?shr*;-&Jh6SH7#*@@a1oKOgf> z< zxA8dTNyJ&912Z25?=tqRuvg416ugJHZ{s->Cfm_+4Cn$^QT_yi#?1u~dRaA;6YMh}x-owd=i8_G7Dn}Va{bp#S)SK9et3z-e8l(3tsQYW z@8x{p<1^_m(}VK%dssgT-uEK^0KZ@GmNR}MKF>it+g1M#zl;4H%13`e=SDd{U~szzp5+k?i9W+0C;YFDqYB>Zqk7Pw0{3>}*AQpWKC9?GBAxEd8HL_in;)(h9pUTlaX=ierP4@$Hd5!et57dsb&Lfum zEhIzGD|ViBe{0&0ui<(HzeL|LheAxJ-j^l(<|7>E2iwHn>3-5F_48X4{~4V{|4ha= zdx4&_zd)x=Kbr@!@s8DF_UG~^9arN1JLqL6l><4~NX{02jorz`d)U9(PJiC0Y0+Q3 z4+Od8LchcLB4<~RP@h}=+o^oek2s(9QPIC759Q1L(A!PaI0*EeUpn0YPmSKl8Uy)T^>y>kzk-WMvp=*g_V zIuL#6RQ_HtEqagMZ+fl#GnL+jOfN96U-T%{M|VvI-aN7GmP zY#-%IXUbC>hge)<_H1@Z_mr_;Pur1e@8(bXsYvMiaa4a$JA>!ZXx}0C13~RPg{6NB zqWcY`|0~yC#P4bSL-8+HeChAXwX5{K^mjpRmA;q$Er|AKOaBLda}?1tRr{@fp?lxB zUfO@e$bmziytt{Mp7+ONsH%4K2*ig7*{A zZyhJq`y;VaS8mWZS8i!Ozdpg|an*x^>yMxpv#14A`>XqL=-y8mCV41tfbupf?_V31C+ny#eeG0tqw*eXSl%A)H_YE-9j%-Gx9=5U ze^t7@pQ7@@BPQzd^>aR1C(FwBG0rFJkuLqCQ_%lG&L{f??EaI(4x{ll@=@%8Usio1 zS?yMQ=ofzXVX#QQU|8BylFw*H>)q%N`27~4yClb+xU{S8c@IBd%+JG(&{D!%(Jrak$+Z2M*kR<)GVBNQ=WEB zwHL=eS#R3LbM5mZoKNk=p&xqKh#&WGKGAzOE@1m?U}syi+MTkqsp5hAgzfZw8KK+y zfBVh~_Ko8g==rEpfs~$pW4Cfb&((hIIfPHYF;&3BC@x{UTA}vlJZHOF(Nl-dcC}(< z-E;1*R&>`rpQI<@3bi+<{2qSZMgLNNO#NynrBVE_RO}?IiyuT^;`l-I(c*_trt$0J zh73Ey`o8ITem`|7$n*B6pSn6r?hWh*{Ar|rmp3dg&wfN-v+U;utk3Ef9Q$ECXkd5G z<$U%16zr}M{pWE$wL7PuV!LZ#KWApOJ7qs{T&;Q@#nsaOgV9e(|I!0BNW|N02O0ei z+rfUs&jVEMU%lU%%gsrQTW8Rt*dE0G>ieC`Iinj#x0B0hB>zLQ$;a|&5TE^;^QqpimG&df+BJp#{(|$V-aF#}Y$0yc|NeyX89$?b^iHYQ z#s|T$v?GqMq}`^sk$!Jc{f^=+(eGf3&}IEX6lYzp?W6ty@nE>LpC61l&(VK{ON9~c z^F&uHTQ-#f>}lW&sqiT-5edkg1NJ8|fTJR8~h?VL~T#PRdck4EE> z{;YPZUH`@H_n8Gc**x$32Z-%jny^4sI!?^4xE2Y-N{t6pwA_=TfcRuG+{d4qaoa$?&M`v+9)jvm% zCXr9|BCEdBphx7R@H6|2{I2O!G|wjOF~4bXcpOg)-4;(<{9PAM-y-$7@ignp3gxpC z@3OwE5c#|KJyb+AU$(KG3$*w)T-qWqHlNYY?xl?Ulc=A`2o{^H1C4l zf-(OgN0GnqJBzPJy7IrBvwN5qh5Q@Iqu|Q_4VsVQ{Bh({{mZKF&t0_cvQF`dKIWUw zqr1tU)62bIAMkz^Xl*i_<4KX^B#Uav+j8(KcB(R zLtU4gj(%WBYjVt=-<~b?iC8$^7^f$V^y5y_kMIcf>rPw?J~Xn=4bUsn0sM@vNdMKY zr!&6|{mq)MX1*>`e%H-Qw{yMjd^Pjc=Hcu+VI7P{{-K5ci0n_-4czt3U3&hijaW$g zCT0Fo*C|R((ok!!eOJf&i%{dqV0bs@3l~X!=3i|7!uSztyQb?OTsn6vov)(v$aWu8 zFr@K+lS~AGPBL3M2RF*?HvKAiXD}QLtN&WkE%eS`CaIo-PuFL5fc3|o1FCm^s@_#v zZ;#fylG8@@UVK3Hiv7jy?bmwOYQ4Qv*83kcPrkY)axL*!-RL_bBlq9Os zpT5ZV3rN1AkJS+9mB=YiK5qMaRnBimKj_r6QlH3x}$o@Bv^E&!;%J~6J*x7mZ zc>liG8{KEm<&?L7cS?GGKK{<(l%fb)4b2 zedEG6TTh-Za#^kGtZSC+lK0z$&NYjE!1=?DZ%W$w6)mre@o1fc=?-ek6!s*)-bZ2I zW2O7p_5BQe-=pwMg;y!uu5hoy^AujIaHqok3NKc8lfsiq&w#>v6kf0J1jFT;=wGE( zI!@Zh&+jXGuXtehLATzl?H!T)trFPNeGm+R4YOPvo?GF8-YqZ>8l~^!ExK zksSYL+H(AZ({Gpf)H(5WWa@sphx9L&qwuGo`Z%3<;irjyUif7FAM^nGxbyCdi1eWC z-?*KT9_ac)tOw#>qkT;C#~DBFcXl#t^Ym*L&7oQ`o;+UC)?+#C+X$%j?T%`OEw`Iv0d>4q%}E$5Z|F<%rzJRPQ2xlJb`a(%%2P zi0r3D_}i#`f1-J;g4$Vx*PtB_Q@Q2`4<^08IFsZv4SFZ{linXvxpnk5@XzBK|6*M% zzMttiEZF?}nV!lX2>WdRUhZdlC-pxE^M0nUJx}IK(399c;P`%~)0ls5KL|d%)rWa-v&%0f@n0N3D~3szZAJ?JTXA z=%K2~YJbW6s@8tTX*XYl-_{9?{<|ITuM`;k+C}`reD5qgS3LLqAIN?S zp4_XI?gx1oPJpUoIuO9t~f%O~IFc zarx4~pJ6-=J{?Xj%;Jp_--d(u&&KuBj003}>|Xq;j_c{WA*@fqh{U0;9j3?g=O^Nx z`nbg>QRKz1(}|0o$@aIK>52WwuNkiD__{o#@rK@iRMvf;6@1)@epU4|eI4x#2YPR} z&1(ij5*OKeN?+?qjA#DH;@iHB&@PIHZW9Mm@cy0Y$kO9GmuBlRRLa%MHxXW1k1cMo z^)46xHZJ!MT<_}YGNxxuo51e)_Yd%6Wq!@$Usy8q=J#iiUtYVCUzA!7O-_GX@P5wq0{_As{ObunxUnZHm;a!DD2unCN{*X;;DP)l_th3W(X+};j|e}9 z7>(}_pkqymb|CUZJ0_?dbIDIZQWg&s5BsL%Unlw9cD$a-K|J(*q$ED%D|%x81yADF zEIGb#nsR*pe#&u~BS%->kf=-dNSDyvjprGD?QPG=@@sN0r^TVxuVl6FVxq(RVu^3- zitB;?rS4t~*xRuMkQ1HY(WQ985q_t{SVl8)03M309_{xRLs-dL~24>i*3Q`z4h z!*n;&=cf{0N$<5z>#eKjq*knZC~(1Xq-gZpAANoUwWp|7VScCReT~a3@To!1i}W4F zM8D!;s<#>XeryAMH@?|?aQd8z>+dJ19N60;lADc3?OaUBS;qlAw$5C?jwA6&xJ2WT z`Gedpo8M2@XK@|soqIs_+B%NaD{*KzU;Vt!TQ{nA<^k0U4WYP8_sNAzq~8kXi=6EI zSfhGBK=y9mOR;&R)gwO=zgFYoc^wCGarty7-Q#ESiPv%Va6ZJT_@(9J(y>$Jd^zd6 z`+QWNUz&QpNuRHv=Vtfux=k0?8{Jo`_ie}DsqNPHrUxq(R{dz}QFxToux*vXCcj>V zRjzGo1>Pp@we?2(j=imu+WL{*uSnlH<9u$v*$uvyg-wVq7;|lVdT2JI>uM<3k-Owc9{Z9(7lb)O0c|U~W z{TJb_UMukc`Z-YQmd~)3k8(eH{=R+I4wGLaKVWeu@)>`#)^pK6*WVMJUe6VIhVw^d)Q)J#zIuUGF;%s9y5}R_`X!llcRZwyhVvbL=@? z?*jG%yBRO`15>Z(&R{mX!R5dYWXZ>EzpWR32mPxwm7_o{{6X zuco5S&(VEcLf24}q{DxZc5L}?PQ#6_l6tpF`zkABeJt22?GIOM()YrjaK#|Ql^X^) zood~$;Ju6M&5FajY50{j?*V&t#{=JeR^#y^B3~E(3|dzxc{)CH;_{PIc&9O*%*&wv zI3Mpb#v4y3Jc}QrahI?6MN_|mU$hRC>i5$2fqv*AYPYS^m;7gP{^_i@JpF9fFZf!o z>=&KRyuuI9i|0?`c?EEV`uWXkSx%-aZ0$kH$~Th?ca#$68oJFU7t+Q1uaYZ;c2Z;wMu*v@v#+JhIvZmqpnBA@$*h@ zZ*|LFPWzVc;?(?7-_ol%f4Jy!NjqM|X?aNGQ|S;o%R?eR`_5W0B=QP7WIZbwTF>R$ zI#+c_Ca33{VDIyYk}P}w2(5FOofo{{ zOa0TZ>x&b1E$hhBvFleR^vvw~Xy#LFj|XXfa~k&eO7b%n@5b~06U+z1AC2_h^faEI zBu3LOo}WB~;dnk0wwm9zD|=wG-Iw?0FEAgy@)HSCae&;qTB;CYsQ+{*ev|IiQe zM$I-pu<-=OJ15d}_~jdy)cg5Ivrl4|#$k_Ry%0Mt`6q!KT3?rW4x9G~+x~;wVdp&T z+>qU8;PxYv==X=Y7+x1bJyCn8k=CB|q{mgA?=JbaF7#hqPsx`J40hjg@$h3gUtK-U z_~}ZgJevoz@vf~SyZJ%aQFjWR)gh_3Zjw}PAT`kk#OHJV>s#d;@tA6%#7 zqN)T6V-+rr^=+N&+flEK~x%zthvk}jVoyYx@*m<5Gv3=2h ziSIR1lcM{g;_o}FpBk2UsS=$((D-YS`kUba;n$)Qx!u*_O$<->dyQ%P0bjpKE@(RO z(LBcvBE468fuDdR-0>A{S&GJ2u&-r!pJ885r2aIHqh$SlI`eJw*njQj_Lul;A@E;1 zuUKRDWbW%fpY=iV#p4_8Z=-eMzux#^E%C|5c`-dC82Xu?HTy8X8r#oa(TB*sB>uAb zU5g8|))Uh6No&|Y8DHwhG0@w*{x)83w)kK5S=Wzkd=ba{;xOa!far5PUQm6H)}w9w zAa)ye=)9?}XNNj|=+p5-P*Xc;wQ@53D({U`(k*2#5U5hg5 z5`D9E&4Q=FX9cj{WFL)TuKf7~CsX6z4LqGr+hg4<7^pM?K=AMwxj3E6ydc|`f| z_z~c{{mPe#pJtD7zasoWze4}fx{?Uc*8NOhg6+!32Ic>h*V&{WF8aUOhw|ck4m4iU zd-B4KkT&8}PGWs&(0dxU-2SQk=m)s{k}qz*_@AlUFL+`NhDozDEs?dN9AXZ?)xn}0me^FDR+MSA|o=D8ZR@A^!-WZV(a)k>We{o;9{ zE{5y+h17YO{Qc`M<@{mCC6cyY#A$rKq+Mb4lPxtFNanNWA?{nneN;d!C;C(2CH_mwRJ|cJDQT4hH6E^ibO=PU} zYqT%pkBd>Cu8TYMeT4G4eEA>7`<~cA^VP`+Ego9{m8KnacL=**$xX7&fNzr9?YzCY;5p#vo}qT|FIItG~^?@@l3 zKR7g+m&)reid3H2Yr%Uv=QlfVM91Smhw7>82L_4$dOxs%%ZpIc74|NSHFBQJSBuET@fxaGBQdEc+Yn@Hiko$>U1r^*lfh2FX4VSju{_i>i1 z)7Pi3pXTb5#0}HYr!P}Jex|2IU(TV#`Xqj!(Y%z+^PWp`vH8Z5-znv4 z`SCpOHs)io`I-E_*nBeEQL*`HJZ^+tWXpm*q8W+R!U5|GDcN>ihv(6cf zVEj9z^-wTk?foV7M+bABcODHL&`$VSn~#a-d&$V?=Z>q=^S$38{>SI5Bwn_48jMT1 zT#XNGox#4}hI$Ew;t2dJbb#M>9?SNL8eKM?Px~30PwH!%{<_3BND-mO?1$8DTs^&r z>?NviE|cet&6M;$>Gr+8Yjf(;^01DH_P}3#XA$Y?I@Bg{9a89B!jC)adY6;^6!_~G z8U2TYcM0L)905FR)W19L|Bc4=7GI4i-D5qd-PtFv^09OD2g1+KQu|7LimfqUasIKs zKLMABevK>Z_%6$$b$STCewOC5WBZr+M>}WN*QR#w&*t*;?A+DwgK5u?W<96(Alv!- zmu9W!$hg66f7-t1()^$CH=cLe$^JBNJ;&r1t>?6gUntka&sTImNxUC=gv$$tWd13f zKg#fG{qDz_B|GH(7O8j5B9UjXYu=Ro!j)Vs z+wY%Azs-)Ueb&FBzaM^&?bw zogZ=N{tu#iI`aoVV*Ay3cqfiPO)kCAn3DGcmIwSN_vab@^HrI4F7h=yFL>YJa>hiQ zUioOW%JVLvHsJ;I3odKHG2$N}SHQV`ej&Z2pX+y@M(v8^)xeLOp7101dZYA5NYily z=)$kqe7dF!G@f`W_hg7G$o13vPVQfd%?sH-7n`5X^#48ip&xMnF7{{pUILwejMv4) zer??>9k)Pk#}Yr_uiG;H&@s$MH*SE$)9YXIl_=2*yf?juJRlOg=K?VJZ~Gnq!=7a{ zDf!V~+WrZ=hrXG=sOb64NN+mmCH<^_L_2;?6->u(e2@0+H}V_vQ0|pnJoD$bUFb(; zpDe-+v;#lzF9=|5V(%0lvh4s~@B~>u3D$N2^eUSl5xW{E~+1K2jlC0yh6sfrkn8H_I>Dd)FYx%pW#35A-wuH zLC;kZ|M83VAt39lL?`6cO$t!fecLwwRUVP?jNAVK-(7cl#o1WTkbWob|75?NOs_l9Jw_~tN?V1~a_tKW_i$?atHS79(gZ&b+qyZe>VBcVwv~dvUFvN_?*QMw zVD$cs*RjI3nOdLZ58K)qZdA@(@`o|MPGtrMHOUulZsGjlh8diK52OmweG10cXdhe4 zGdMr|K#Bgc?=~%12P+nPXyZQM%dA?5SxrWGUr$2AhwCGFV@8(PE$;$}e{8!1>bsLpeP?LIt zA*l!Lf!(7$6|yZ`UvtavhaNiiyNO`nf0+C+?2bU{*X16YK6yiUEkzG^fe|#c8zTyKu zO1?b%a_L#6d>JRdS@5iV_4R_E;NK@1PtGq{J>?;>&q{~TT^{OTx~(4whPs6x8gEvI z#2))PW(&PT%k;g(p~28vg_r63UWL097QTjhpRS$T3vcU|_hx7M9k-w+_G|lX?fgjC zD)DYmo5AH<|5fl_#c+C@jP^f<`lGCVtDS0g{q!Sbfa!h<{u+9l<*%{6RqwAwui|)b z`uAUb`mA^z`EPlz#2EEM=BH!-Kf(Nkev--2z61IPsjjD5+%TQ>@{c6SM`^IvUvv5O z`?hVLkLb7U^NIIupUC;+dnTk~40K{MdQb`9-01N+{F5HC0ED(@atzch=254DdJ}`XXX)dE|{tD&y8JNP-VmP z@yQmd34WOGaUi=miQxDi2VD;q_Gj*gLB9igJd^qY+mBZA zMSj!SS9h6XAFVmt9Q9+&wAyT7Hbf4YsuMfwh{f!~kqiqwnj z%Jh<7NB25dd}R33Ik)>*va^`aa=%e@?s0P$>r%Ku{5a@@C0hJZ9+v$%wtu+TOq*lz zo{-j3I`(u1y|KlTE?9`%64&tinmmWT_mbSLT(d{$!6`h>(tbnlPm0dt==s!e^C;8l z_J4b*JUf@}KK~X!mwwFR`1-g;ziZ&o2fcLTU)&fP-|y4K4GFY=EYFg_tYY{5&60Lj zY=7jC^mBne5A9yxS!6i$v+-himiVDc+k@Ob^P9ntwAc2-Tyc!(iQCRWq8I%8D)^`P zb4ht%kG5~-D6Ky_|Dtq9=UE{6I!pPjFX&xzSNodJGt@kqFF8PgTE zc1e1hC}yPZQC!h2Z#T8-?aa?hS(4TQ1lgZ)rXCn@~h4HfDk3Z7*B&*+O zCraIZV}Sf}y5B(j0a021;o@%~{DT>PeBex1?`2{t_Nxc!+*bx4)Asl8G{0~5mluCL zntQFjohTn#8^<5P zD*a8d`N=G=V)J~C6aJp&L(k-ReTVo>>*pTDeCXO|(;UDJ!nb(cRpTa|cd~It{d_29 zF-7medROnEs^+(C92@CX#(d^5$u-L_qo;QL?CB);EWb=$aHd~AmGGzSmyNEOR2cox zufLDz+MoLl)AXJ~^`n1g`qoLgZhPj@`?`A|o%#{4J(~JYo}&I)Zv73$3s{!~Ki*7f zynkNers?dTM?VtppBF>5`SR)PkN6_u%cX;ae&&zzb#lz(} zBB$aZ>faAh|4x-auOmGt7%d6rK+0fkpGR;-~*BW-3j^azx=;W?Y48vaU3G^JCHv#F;D*0nw~Sx zJwKuMg3K2F)%UY9FNk_Ud6Di1gdP;>`!dkGqTj+JNaTZNnqC72zPk>DeC|3B@<;ka zFQIY!6ED2^yo`SH@30-WKYf4Vp8vh_s8Ty3J8!Vw8?ruI{33D5)bWc6T|Wn%E}zj;y6fqn+x4S}NL@dQcDQ~N?Q!{zcI}TJ z{mnwhZvRg%#66Mo-&!sY{-0dfKL5Ab%WI!a`oUV_?Bo1DyZK*ZH&>9|)XAqoJhGbh z;n+UQk}q+_)bYs0++OT!=eW3ek;WsZX*{x6aepuUd)(hk{~q`E;;$r5NBPo^#Br7M@Ay~x8R_4VOJM2W zQH#LRzk@1)QL@|LBYw$?voLRQ?RVq;9q=nt@GDYqUkZNQ^4QM>(rlg|dJQqs;{8C_ z7tKRmLhnFv$)CaY5#TZj`USE~>IGGq7k)E6BNlmMH{dO;>k>0*nq^djIQ@v%BE_m(d#qAk;raTX3 zYyHhi&upnTTqvo%4;KnvAnHi-Ad=tejo0C1-0t32wwLIGUH|$)(Fx>4JDx)6Oj5pG zhsvBJo`dcOE|iqA?aP`^`3yZz&l6^?+dN2eMR{D#T$E1y$ncX`7qRtM&;`e4^F_#i z+xax_vq9PwuM1DgdR1+=&e!hY)ZJHw^;4q@Kmyr5^0q9r2!UffK`j==K;)M5!K1k(+dOtMy42=)xb2bm(OP_S~ zAe=Av>4t4Hgs(L%hsxhU?X&xMtsk@de4%HXzACzk9Ja3*&)W}+_00Ac1pJrYI@(V)mxMMfTMbA zySTon-r7!u>+9{}dgVKuS@nWq@Z;O4x14HkIn~~Bs=ej>_F{jYeK)sJz28K=cc$vS zGga@Mse12B)w^9_tiMAa()HQ**HiSRbn;XNjWcQxUS-9`V<&n@rJ6yADz zZ~n@~^HX^L2)tWRTC%)HE+=|M#6KDz(4Ka}v;8Y57hVJHF3}zxSB@;_A$mzae7^vG z&*TdHr#k#axr+(U=$%RBE=&27BM2XU>X5gDyHVzMe!BP4aHhx~&mVKyOYM7Z0Ifc zOC}oa^9@_2ffhg8I+2|#jr&{i@9BN^V=JWmaJlSP8Ixl<(Rq#74p%XKL1c$L3Y#6S zR9MT?efX{&_Cqfmz3B$LPVmvLBVqrM|J3>-|Ecvw{!{BKr|NV3&0to2ijVsKOff_3 zH${#?mOz@l<_~m-$W9H%ax`{omoW(jN5h?bL*5|G0i9#rEZe z8@fd=(tJ}t1v{nxykLvS5A}Rwu@eW+5&obb|Ljg^j{MBNt49lrbs+q(FN8?qc;%xh zd>OZ(HhF*Edz0l+)!x`S{F?p7sof48v*kI*pY&&3FDW+t4(2|TbBTugxYW4*K!$%b zevx)wL;OI^V+#cl{J{f+XZv@Ir~TPSkeU_~9t!cc^@@ za>iy!J<)zgVI$Y~v=>Ufq%Ql6p0O7wzJqt9gZI~<>v*TWMs)q2Xa(Oue@vI~If(cr zsmA^XQZukfPmkfm3$}|NKe@?g{RJNDaZTQ% z+(F7`<$&IcseQH&l;RquJG@Ke6W${EfRCEOCA;MP{GF1vjdSYyaf~O;Z@clrJj##y zCSOeSI`oVKU+cm9t>B-YQ;GX4txwMZ#Qm4hXYvV-r2^=;V2-5VGt=$#t36J9VeugP zTki|8zp{HHA~|V4ZsRGJ{#~H|>0B+h?*?bwZTcGsIo?t2f@k!m$M-?he`$ZSS~8v} z(^=lwCdq#q@#rM_)8bK=f8XvT{#_^e=92t@7gR-_wqMuoUmSa@ln1_lisTYhC7*rA zHat$?h%VJvH=Zj|(NTL^r978Elf)mCzjGPns{Q7Ww9oFLsEa$a9Ox@3NB&Px{~yUy z-&?(AufZ`I?`Xeea-{LJ=xI&pL%BxR*GP5;qnyKCK8QKTaneHJqv=ne^GP-i544}L zecQSAbgs}3dz`0yxefL-tnH%bY)@5zEv_EBRbcS(c`lugSG-x8sveuY1OM`_m_KQK zb@kx67h!$}(jt1woUq(38d^y#6XAnqca-zU`0OOX4SJ@#Zj-wM}2#%Bv;{-K_d?y81ZpjbYevalhOuy*LvHX1p;=;dC^xyZD z)$#pEfG+Y=efD*5KTnjVe-K?PzC#l9Nb|n|{t^Ekz!m<)>%*ugJW_nWh_Y$9ZArOC z@SXh!sqr3%*n&Qw1DYx9I_-E5(znF3KE=zie^w7srVvk{V)WxV5v}7Bzpo(P3BMmg z_f!0?f)1*j=-D6RxzY*mPYwPLOuorChU@}=l9zB(Ef0@(@%!lveKjvQ4P!p>&abiL z%4qndb?gUZn1%=CK>M@vD?=~BP6>}uKYm=yf91z+1n?fz-x5#aw+->WbGz}^<%|vV zo$Kc;PF9bY_MJP|>a77@SK!yH@Z5&y;Q8Jk`9I_j*j*W44jBk(IlgxpUyf99yeZ1m zKWf~o@H~d+Ae9w?{UJ$frZvRFk_&&Wh7)TH>KEY{-gs_9`rvc%13~z*KL-#`;Sl4R zy(R2~XXpM9&XEKT>2LIypndj(6nq5v><`vq*-hJDb!?2E6zd=@=DM77{M5S0BaV*A z{bmT>WXJiwOGsUO!{uswRPu{_{4V6J*VDVMiu_n#ko?ha8~&rV-$p#f znxArg1iB~kWj?Pi?mzS9tpDU#e(Q46nZD+^fDAY{I~?+f3F$a+5by|}?==d4HP&g0 z^_K3X22b~#@qQ~*vG(|6{a*(INPmW6+_}-mo&4;hR$u-!?F;?QynCU;y>+oa?^Z# zH}#vJg}OES8Y}pBV_ScAP4_hb!pHlXV|;S`oODm&Z)JQhbJ6d6{Fx00o!{+o(r*s+ zD$c9v`(fE|o4zjx9;5^5SF8AaL(=cQbKQRHo)wnE@P1-+(BW?cEy>5Oi#?uQ9nbUq z*>|kn z5z77^>m4lBTh4kkb_m&2uUDMAOYGW_q@MWFHQ@D9zU=74m(UC1`4tc_8`|l5*V^Iz zyxrksdtC3cy>0$11A!#(>Q5H;8?Zme6TArjLi8u!>HWyp2Yx{}-J2jeX8FHD5q)P* z?^nrxa<1>(cRGII?-cx=A8=zF=Q=X=DZBKzm9N(x@%~+U#GhAt`O9DTu*KA^e`~toY zvz3kTXIQQ){GaTa16ICo%JufFRs6oXadrnhA$=sz=Vd;YOve6v6BT8D#82u6^+5L{ zcapzt37;i@()+n#XHq$|_hPaS_j>T$Mb;~A8S?GR6(ZucQDUaNf5 z@Zxx7dfi-T0J43{EnW7!n7_0fKH+Xceesd>`13yYKlC=}yAk%&^ym(+H#hV*8`B0Lypho_qai3`@~=Aw0D~l`5->CR=52$&4)C;q~ly8X`l2V zK6;N*+(+1Q{MjzY8^V7D_@B!6;YjB|D1WkOcZ1g_o=X!vwJ%%#81q*r`D|zL%A_9` zIvm*-!QTkHNN4hca>#ls{x9r($VpDe3ZcL&_>*n4P7>cAf)RC_r9*yVojac$_BZg(XCHI>h4#r$*;Rdy zigAM<_{e|K`x?z>wN72D_`N0hbq-hi%47#eLm$*n?KhO4GWve+ch?$!&J8~1tBx9; z`2$DndHGT|AjLfEN-r;c(s)cdd~z-I$Ls5TT(OQH>!4ltdwtRQ@+`)!mecF=tE;@ahV=(|c#F3us>h>GtcL=+{@?E|#RM6!% zuRprPpKND8=psL296iEL75!e|^@@InUg^ARVc+L?xqWy5d}Sm4+xU%fiJ>j$ai3j$ zXM1k=`-L5jdEe;OUXS?Zpo{F?Xpg7M{^rZvUo7^=v^;+rkT7`(e^vg5;EobG1j3*5 z{k9y*-cR&C=<=)K;3E`#6u!wi&vWpefpDqc?e!$LNA2|^1JmwT%omz7J-t8Hb+Z|y zX43y*&!=BSe~|v|d7puDL|{L)pLb!&Uaxvp8?Vu5PvgxR)MHEf?kw#+J3z4fv#yuF zd_9sq(S2_PUmgcum!)`JYRy!%-?{!2?1!F+ek)7#o0sA_Kkz)qpM`!7d7R_7`Rk!i zod1$;lnWfiX!Cu6mzO+egDxliv2MWelNwEatW5a~cwE6IyqCjN>Rt)?12sFv0XrPy zQ@H12)(xp2oHvv2b0F56O8p%|zU)Y$7YiJ}JjT<(J6OBDZa6s0qDB9-f2O$4x#juP zPk=XncpLPukfSm^wt9Q)7ge@zd#?e=Vtp<3qfOuMarhbs*gw`|{|=V=cMJO$?|;=# z((~OfgM6bs2GYG;Zx`z2XCHR^-tuzn&k>}{-cP#yR@m{O7;j7T)qQKaPn~pN(EG{B z$jA3EMJ&sQ&T)wDdT(9Gandi!G3nC6^AT^p;II6N!tWdK0)20CL}hR1uJCm27b3h> zu;{Mpxl0wFNl zf4QFNyzIb@{ys3>2M94O&Jj?bDOc>rdnqsB-)aAY##iRQ2l?aZ7J4$;ODr&60;wK6 zx5V>;>eR}+5Z647aDE1H;U_u`bO)X-WFk-wInPY}RpQP1zs7NH*!@JU&!zA;cfgbN z-qs<#uvfhct=(+C6S_Xt&r|nLC3QewK9c<`q#HxM%3XTs-#&Yoe{iTo-^Ivc`}vwS z9prB^{oz-%^`O7%_l|1cXBO+snY%*;9rYf8^*@U#o8%^66#nXL$ER#pL@(BxjXq@~ zPRIImUvS7C3_m{>S~O2N?|EPdg7~KMB-uGVmQH@L1nI)(WcOD|-iXi3QBQs><%lHD zVt%CeCHaQ1+qWSTp_q5S9{><)IK9ND=uy0v3OUU-csb2y&zm`o#jy|8;cC5VF!Ugc z{jlnv_D>b?8&=);`(?y zz++wqJS4B=FZ0Q-UdZ$5(C6h`AB+BLo~U((Y-aE!@dwV;&@WNMAU}`MtNg!D z^0i+|`~3>L)5~6gUgA&e=OO&(ksi*T_IEH)mPyoqDq?xOVEgO}>o5I@Hr=`I7od<^ z*>>K=&agW6X)uUhtoO;Q+x$@fnEr(%y%;yc4iXRcyMCtI_eT&RWR9oT_V@SWX9bU1 zUyR4hXJ9_k+xhYR7OlT5z?6j$xt_p&X}pjf(>O}}z6e zpXLbW8;NC`j%=rulsg?dI3)W!y%QZM|IEc>T3?9{8$kzhY%+9s_!M*)IRzc=Px^N< zI&4eIb)o~Bfjqc?r1HQ%MmXaXbeP&V%O|>$2hss9`bp*BzEkvn$0_=MOVY2C^?!X* zu2cUhL7ntLoyT*=Df-{lNe-r>;$-At@Dy~QO*@%B^e6p086B=j$`$@zjLY@Vqpa8U ziTd*><{9)$nWFK20qi^Vys*FF=cnI;Lv~SKc4;#0eXv7&8_^#1>B(sC0~54IzC9W3 z{Zh0Ck{0w~|EMRY-Cpobbk+H(uAc%h1kEQj@9Mjkts>orX{-xPHM_5M==^@mF8qpY ztH)D+g7XmVE0$kDIpKam$~jx;+vV+OAI}B&Y^9C2$hRkm%M$7Q4bd6JcST5i1io+K zPuYF>g(*IqUu5xpvC(%}H5*T#jr9|qC(ri#ygnN`WH!5hiu=X+onAhFzso!Eam+1! zo7UmWe$LZL=l4H;I!~Vroyn)k(D?}D`A3n?cRYSNpHZfBD#z6K$wy8t`ZzI<0@c<1xbfZxg_~DTSx^J*U8v{k?Vqc#RZZtWV_2V*PZH zucwyjn6Be-otE&wgN^@kqcY3gd^Rr7iCcAuT ze$0A=H=unBh2O(ew&U~YB0uKk1s}`fb<3*R`rcvSuX&b@&oID}YvOY|Hk3aR_oRFm zL)}wxPs%61o5*kM3)H%(=Kt(p4@kiNed(p>ual$gf5bUEy*KJK?_QIHYyk=)qy{$UZLfFOdjiW`P~K%`^yiSotJ-JKg-*xPmBEyiM-i*@@-y^c)t!W7>jkxkmGFF z*FWp>Ttm(BJaaKCdJ z5I~S$F8pehb1Xd@asHLzso#44MEDxEn|+nk&yA$>mc%CY*jHIX0YzxFDQ0X`n2 z?^TYY9OnV&rtddEq|1OW-+Sy%+Tr`h14*24*IwOTk4y320l267{;JMN>w7zCf7ySH zTWn_&5YqlQ(Shl+V0U#-yY|i1DxWfXW-)GMaqhOT6FjhmkiIv1HsBO`9eQ4i@0&_b z^c?3`whWw&YZ{lYfZjCXy=Xt~*JWso_&EZ-Z%O5Tg#1eM^a~h|X4?LtBm(ox6zI`?5S=LM41J?e|mHQ)_KbP&H=uyab(7O#63_{TP zL%qjO`%QXLuC|rlYrh5j&^$}`b;z&D7r9>QeRpBEFLS!+y?)xxF3M97lX9~Ks*trp zU%Oqev;ComF}~>gh}p2W$9hv>KeLv{wJxB2zmntpfdj^u`dRKU73Y^`IX&9v?SqeD z*J_nNvwB896qP&_^C}uIrYG`7J(E32`}cF`U;e-`mycH1qu5`W#rX=I*Vq0juDSJ~ zi7oN$$NlvTqO;b+G;YeCi%+%6N3FdSKdx8Eo|AsRkA1n#7|#X2IrRB)^`u94LXSAk z0u092uSS0k+jAnhOxqWnyJ6^RmHpmM$uE^$_D^wsl;v0b)P67ij3hC@gRSgPC9%SKQxZ(JX_XpGp6S{d_I`!|Q(XboPstI>J($ji zd|7=A{RD4dlJGt-NqDcGB)oej3Gezz!rPI+WB;=xUigO%7qI^DcM5t(I_v!gFGv?uHRSMVpl!{hlao-g>4t5kmIC$Qcp|Fu2OI9a(zl5)c15o;ZN zZFqb7K1YiG8&O92eD98CPvo<_yzmn|&98{pKcSrTwr*Y?=z{tTgmVD-aN8?~3GYnT z^Ko)4|8}2MGe4i@dpBAhC;dssY{>CX={Se|9*%OLFZm?=vZ285KF=p!zXVw1GuLbN{lkH< z7kd9rKhD~VaaH_D+dYfzhCkg2uNw2Wx7+>0gb(F=B_v>4feJSa-fn`?m=?TYm z{Ht*Oki6IKUw4t0n;ZBr|0M`aYlJX;EKMr$``FZ z{fFhKLb)K_$-lotn?*aZ?}7J4Fcj(MTC|d#6MUqzji7P3EArVMYv#*h+z$VX^1}8s z?(YM!$S?X8|Kta;@hgk( zyUVXG?(e$U;b@;wo1R;pf5ErD`S^h#f1UEj6t0I;CRBe*@Z<7x&tY-9m&5SxsXF13sq;_RF;#^mg9Q_VJ7VALa$Ms`hAwxEF*znhPOwxJpF48CL67}$S zGA|0#FH~R%~!iZc#3m9_aGC2_Ha3#tbhJB&=ZiAMLDjK&$Y_Ot$!O) z&fv}Se$KrZg;)-4vYhr~>q&U)&|%q8`7c?Vd(FGu{uK8|-r#Vl_nd8MJl6hn!kYp7 zbUtn$kYqo}moav<*U+kDZ$brx{Kg&5pADX_bCzt!?D8^~pRS+>`@{aX<$jmdPw(kH zf_Al@M|!dU`KoPJE??#Pl=6xEB>tSIwEZj_!C)VP4q9i>{=1mB7w4E}y1W3UYL^41=#3l`t2d#;V^Su^xL?q8w51=3(%QMdB4du)gOmcK^$ zJpaq`q*u+P6Z~l&cRFaE**q3;=SS8I{nUD$+7Ex6@ECM&{mI&YZnO{7igRmogD#&& zBIWf?W+DuPz1bM)k}vr!sa+=hQoZ1rAsEYW*OU z8_v6RE;YZ=`IzP(Cja+19Nl-J`yO;Ykn4L3&mMd3_NP!q=R!0u)OV6a586kwFYCQO zWj|1SlmDE(B+AVXd_XtyP4=ho+b{Bb%ImBpkdubTQ@i;~$$O7{RnT==^nYQLkMV_Y z?gFl(u_UDNuIp|u*9ajsVL`u;QBVVoOyXdIItAbXe2&u%j~&R@zG;p%=# z?n5-X-4gV;-|EUp=Y~?behcJ!biJ1^>`K$)lwY=^^B3$l+bQrQQV2}ngo15) zxct>B|I78|5-%seO!Efq!@K+i94 zwf$FP<{RN(%f84T*FD_Xg~Wp6h4XzKWQBp_%ZVTU@Q3`3#}DbJrQ=P$>Y&@VxX-n# z!IGd`$V+~!>-&da<>{iI?9M(61L*FFby0rZWnQj7-o0c)USIwy^@Ma;H`B|Fn@2>t z`dOcX&G-m4Tg?ESw|YITvkISm0BU$__k8h*{x#bhH;=s7%gybL@_wwu=#|bV*S*m5 zw*Ux073VU$qP+Yi=2H@s&VG%VM+!dD$M7}Mw?Geg0$cu#)?3#_zSgy~b9+#V_Q=N} z>Dzxs8cpxIpbzPXe-)jRu2(*5eAYg@;-252xAaGLj(SH;keunhmIAM^6WZUW_XMYs zw_4>RhQ}5l`%=Kyc_GbDM}62X?(-SE6on9`f%wNMXXksoEA(OT64zJZuXER_iiHD&3|Eaex!ntD6UE_q#_Yfb-o9xt`1d1TJ*7r>$UtJ44 zpX)s|z48lm?t|@pDP50S>E(;_bs>iu|FZaAP1ZmDe!e5b>*lC`yFUqkK5*1{)gHfT z6_Fn2AtxHYH6CjoSd8QM0Wd;&eKyy)9&(b$_+FgPj&WXm%VXUjU$)Eb(V|D~S@d_n znz8#iN$S+zvcH;-=>0=Fzx_CDxWKjDQ&gG`|XWi?(obK<-!!C+m(xV!@LY7o|UkE(o z3}t_`?@qsWfc>S0X2U+t^j)NW0b$k)zk~f}IrWqD{Liat_klQq=1pBR8VGsVMaiq? z!GRX+)v!Gf&wSNx?@zo3 z&dynA8Ct*2w0<1@&GvhHnlEO14p@DT6C9^BkCXk9y&&CJAYb&*IJ!>ua zmy`Uac+3MH#Xh1aSM)R5%l10IxlFNbUDFsZP?{Z^LO<}dNeoqSF8M*)zf)Mjc0n#D*MfGlNe;@I{!3}8GWwf zp>eys-cj5exIFOn;i$4M{Mq`M=UaxxUyZx_P>%AWa?0NldQN*d=Doo+4u5XIB_64t zr+LJ>9xt~A@KL0|qiemV>)br^sYgnmgZLPKFUrq>u}JOhi#I!*EqIu}x7_3Fz!!$% z{vHY!!bIzDZ^k+Z`>*%-U19IF4$o~v)MH|2|PrJv<|jw3`( zlf`AgZ7t559A+Byx+nJQP{&PUupa~iT=@^dyK6HQhw z!;|AZyFor_oZk}ke@)o8G@WwZDV^FnP-q8VEci&Fs*&!b>$~bK z0Xiej!jk)X&8imr|N5&RI>8k7_fYyBDzyJ&Ob62rm-c;r9{bR3+(SEM`78AIT2w}; zRsOr_qV`SVy^pP(5TCaopY_>3;hlkj828dxzShwSzq5F66yvP!r;GPc?e|8zyuB7% zNB;qw-_gVSB!io->+T}{6iNiP|7%eBtmy`;-R@$`*Z$osE+W$VA$?~^?@8150*e8^ z+@AccwB7fi-Sj&pGgxoCHEVc%0%OAHevi|yAl~xxWsg&Mx3M21PDjCkf9!Nef9FMi zkNzy+MmwYv(>3lBp342NQn^>KT-dL)+~2TVEARw7>&I;#H+jK6h-UMMCD4Cl$eQ1^ zr|zfCn%|1}a^qvx{D+7yjrf-%zS#NvphfNdl+k4<;!|*cDCyMjIPnBZM$c@0o5uqt=(rL{pOv5e%BlQ<{3TOa`=-$AJOk65f}Y_JmR7sSAR(F$Ij>K zGh7b8yYS?4cnRpJc`oM>>p_oHZfSQZ&)>k9hjmV~Khh(t4@Era+4AoJ7xZkAx^BOz z$AojQ!Et)a-exVYFMD0saP(- z1^e~WafBnN#u54tt4r_yzVsd6?=;5lCf}hQV|SD9(2lXY$#-bS*xfmSU(=t&@9W@W z;ip0#81gummG@4MxIK{G6LIG&{jD+ky?ea@!7I<3vM2HTWZ(W7&~@1Hr2l>Z@*%#7 z-s$(r)+YVdyepdrf*?>|`74#ngCTE!OS#{7$mKrPz3TD(i0odc*9F+m#9#6&)A<_V zGf)KO57x{(MLgyel26V180QHkohL2BtyOF)T*<=kNb#ngaDC@2)aN?Irjoq97V?%2 zAMpMRJ!;RizV?^@(s7>KIcE9w>Rg+zWFtqtUi7=~c2_LTYYKdN(KteRpHF}FJfnm7 z!g&uN^j$4De?AT$?$cvGww3y^lKs&Br`VsNb3s~XFZV0;KMx0g-whn}enRW?{c)dN zaSk}%U&w!=9{tO=(0=F@{Y8K~q4PG9 z=g^iDhoXD?CC_Pp)jz-Y^RU71uezV7_iXKbWzOefejNQR_Qwq$ar|OGTps7L^JNY< z4?A10`h->Um;!I;7hly3TLECH}Rvm4|OQ|hyGF?BrmDIefh<(H< zQZJipt$}{5BQlWQuTH+FmBRgf=#jqP$Z|hDLAl>WInr%C;0ezZP6O>e!p0DuNcv4X z1^qJ6PwRsH(_u^yh-VL;o$#CuJj?5Yl%pdkPrV_3$d@y)ud_b&A3Z60rI=PD8X%$JxQYixJA4aB@C+rHTH z^KSQ}o7u2+B0(zES973B~8fIqVBS4RA>#T(nP_=GUf{px7X={TTy z@AlV5`K6ZM-2MiO561kxx!vUl_T1q0SAB1q@>+Z9`+=f6{lX8G?$e-M ztySD%&bAK*9-FLww*97vJKSvhK*Sw>w%yl>^X}DFUh6va(eGJK*UzTXowvxd}fB|8C&ZXe~B64Rp`3XQSovH_-ijr+3WT z@Led2H(LwsIoLfT%CEHNKzAkLE>8p9Q!U<}SNc4)*;;PtgWW!l&05Y^_yIPL&Eorf zTHnlC&R6(lk?(vh)*)NoFOEhU{vn9q)@SLXLkrFzG( zPZsm!arMf4e-r9aFIM7zYNuaAdk%Zg(1>|(V<_l8?0S`7<^}Ti`})+t0thU^0F?wG zYdK%?*`Cmh`SalHxt8B(IUgEB&Yx`9?LmH-zvsz@-5%tZxuG0b&|~!mW<&T8urI~v zJ~;adix=w+v)$0)y{xZ4%w8V(&Zm6#%818&fA;E#$NI!@Y z%jG+tz1iX#56S1P%pY>OPUqQ|kw1xFeZyJePFgvNSdv0T6}Q!t5D1N&!@%>-P_m69)7%J56OAmCy?6BKP{Cb$Eeqh zW00$$1LOaIcriX*NGw37ke`O^0cb+Pe$w)$Oef z>E3Ms3jd;e^6h*Y?T8Plzxlo~{c*jnRi0h61Ja)s{eJ%x{o%QA(W$s+--n?}*`L%r zCDVElk%>V1_1#A9!Y{{v|E2r#L0E)rwgVox>-%QsQ+{AO_?USOJznx-2>35RHNt#^ zKoIKF&$MSJ`pv|8DfiiOyrjR(dUfnRVTD4@T|A2YR;j($I>kqD;JFd|Rr{-M&&X%? zK>M*8!(TVJJfFo-pXz=V%Y6`W-AkqS^V&y7J8$_dt5%$!797eW1N;A{|IGD>gVv7L zAGB{(^X&ZAM?L?>Blgrf;YQ%m12|jaS+C9`*fHaq`4yq(Y;QH_m+e1laIy!F*|Yyl zpMRuuIt2Q%{3h6sTFl?Fcz>?_)7qDF{mhB$FU5RB<++Ybe(61bv7W5=k`0$1-A|?c z)LGnP#q(3>Y9-s}^r%(*p295N%abn*S)7wD&UfrT(QXf#+!D|Flof`6%1Q4EeT(z>#XiQkABg1%r|%-KpFgnK z+SmOjWqNWwmF2k(xhpw`N;=;Ry^?>g@0(?NLN8<8EQM!&W#CVE50&6OfIQtxo8O5> z5gIK&XE@O9`v)4W1BUN_&T%%pT=Bj~`WN?XH5)(_VNm;4M?UTS9df#7E$2fg{ofJt z^jloliSpzF*FT;Hp3_Hb%&-I z`aIY>*URsB{_uT2(1D$Gyy-{cAI1ld*DAm7{fc$!LM~$7uY1z65$~_|CuR?BvU+vA zykUb{hu8Y$xcxn7lq;Q__fGU3r`n64H*N;U*m2QwE$w%-tNVO3ZWn%C_N8)*qOh4tD$Zr|VS* zREM3XKGabTqKW4c^Y6H>x+{5qBKt`FVEMM)JZf-Ldj<1``LT~9g+9f3F2X(Z5e()L zI^Bb_&+5B>lENK9dg@oIzu(~dHl1_Vdw}9S&q2el{hr6|U>Oeaq<)fqxAnPP(X-Ka zvUKlFt>WulDPF`w@1a?LK1eJ2*Q+b7r}FbS4jSC>EA)P^@Hbjc7}}{a+-Yb>aQdq- z76>)_+8^v=e5juNpb6=_+xf2XN%t_Oc<&_M_Zpbu{soRNM@r+%=ea&Q9Ckm>SEu`} z4A1QjhyDK|?O4QV@5=E04)8kJxozy<&{mhHN#ON4;uYt-vmv+7`2shfdap)$b7YZS zO8Z}??^fu2o4(`{$19hYTE*pv@bC}tKxhQU`3vhSE@$z*^VB|_%I>d#yh*;uzf|sY zFP!koyFYC0G+V!CPtF5C^2!ZE4_o{-Gl>=aN8r_iXJhywPoK|J_Q&mj_HpPwIl@_r z{MTG$#jIaeevh9^$cFu%xol*_;N>fNtl+r!j(0fy_1>;l*<QKu9lU;~^Scv1uLC}s z-=+EFC+YV>U!~JHx-{VY7VJwS_DA(sUt<9B8)q1A8~a~o zPmX6}_P50QhxWL)(#mPymi9a5-D@L#y*<-;jLq8EA{_UdNCVEZ!rS`(?%pUJ2_pcaTwtJlN`k8-3 z`6PbLH!z=%c}uP0_BtC`Zv83bY8F>hK$kllj^sLv_bhq5AIw@SogR9hI5geq((Co| zc>hzp$Bp-l*~n5a*IMn*2VD;8)o*%yXt6!DZz3C77;(1?+0dMb_gF*OP*23&5Y;OG z$KpDlk;?6+(7!35L#^^5E2r_JlfKe!kdCiLOWJ?bUv<0F7>V!rC30zYCee#e!avtO z9^U7|p!aR^9|kTAd&f;F2yJ>FH~a=-+^bdo?6<0ttXZ+Cot zl(tu<@2@8G?XR9=`0KoPT2FL20J>=XuZB^974%(o$-nHs>``&=earQ`UiEc8$*1%< zzu%f~^KZZNuM-~EVjQbgzUBN3zNh6h-h3JzmcQR$U1SXi&*pHu-7er1%bD!-^IDJ@s|?tCR=#D&+sEJ?8I4e$Itkgxt+fA!o%s5b`_Re2>vn z)0+*^Za6Q5i=m*fN15)Sb2D1WV;`^ls`OmpeJg>-CICQ?y(;&Y^e6x8XFkiyNuJ); z@b^-w9HjUWFY2r8Cch8B(1|X0Ug~}=ietZH&}X9+FYqF~W>Rjn$MdgW9&j)AxW4Df z@>|irqF?L;g3g)gd@{@3az(p+y$|f4GR5>w_V5OjV<1|@@HLAWOW=q86W#{SZ$my9 ze-QBk57~+6UwK~_%fEIm>L>4Me+6;A-{AZ!g$wm+zrPK*n)eXS=U?FU@N-PP14tJ> zjhXBP_>1Ez&%smaDV)DYJGIL9T|c88eV4V4190n6Pk41Dc*AY6_i&4muX~dPU*mKN zXXgZP*gokrSvUtKfb*r3z!9G_A3klp17IrsHCHsQ*Q5H0{3@oRzvuh2eg>@v=!^&D zLiaA^SB4zNe7WfNrB=MsnD5X2sXk-M=95d%$BVpPF@Ngya;jhKx9j$CN#C>9Jz{M? zEynGrukj%DJCC4091o7C`vuSs&PaJr?ntt}M|nCEuR{4G9rRwa?04zheHQY6-b`92 zUvHqMYM-6f_w(5I^jN;fOjfA98g8j(JCdtx0b`KsX>O;ueu}P^zY{pUugO&SQ%?5c z`l@Z}EY&ql~0`=Nar?e99c9LPRuo*=%J>GX7d_m6tOVTe6{jNey$Lcja> zWzbji&B9N6tlw7*z0$eg^7uqOX1~eT&w>u}GpPqI3COJAJIOO$@A+Lz29|GK(w2Ym zRpT4;e=EuF)IR6!EcY91H}>b(r&5~G{}{Km&qn+ASpI>3NbG#bbs^`m4^``Cv_tHN z#xZ@zs<3aFHHULJ{_LMRrJx7UGW_&>HMX8=9X5;i@RMz)4ZmverJwB2a=>ji-4AZw z{6a&dIk?cC+1q>k`Hq;sUK`K*Eg5>~ikhDZKnPlA99-h{2QPGZgR>mI_%ymE>aSXB z`_iO;TK5t?Q+YXn^$6m79YEpzsMYJQZm|`v{Kn-L$38@R<`1m)=Uoduy*cNY;n%$~ z;xi(?)Z;h%Jy==h_aVc7_4?iGJzx9hx;I5U_Rn>1ws?x?df=HaT5RdWclG(;8|)N= z?A`?!&`mCo&S%zgd|Cb-@GoSy z!u5%VAV^w|%0|3B%}3epgUoM5d4N5Jeq=*VPv-NSNqVl1{E%OybydpsVt`=zWv_Dk zzVeUJcm(?2FNl1~b#|L)r02cI;5po;<6pxU!1{>w59{If%pP?96HnjHY<>qx&;I;jFXe8VjcdIBi>_C#;vGog5r39{812)J zy`|KDY6kPi^nahXOTWtcAAValywLi^^4E9h|KslWaI_1)89zmbSZ|?yR{!@W{m&kB zeQVQUn*r)XhkHQ>(x3FwyslQc%gSSY(E2wJ_i|^$e`fLa`JX@bc-$+T?frzuuY1V& zFmNG^7ec;-vr^h0pBLrVx*cz~_b$sPKPp*U9`o)U1}DXv@0IfS9$H&&j#|5EIm!+E zI7??a(h2MN7H2yL6Mqf!?V=nJ!TjIhmH9rzT=!p7{UZOLh4D=5^4M2vcuS6?hm5ZW z{?hO4c88~Pdsu(L%bhpDv?aK36 zt`+TpF07Z@mD$W6iF^zv*6-~BM{=0hl@G5NtG~2U!Yj2uA1syI&2k$8ZqSAD4bY~K zuk59MyB*=W7v(j@n|QI`*AY(AAL;uNq}M91HNG^4K48y*MVsuI4c}+aeA#-B?|Glc zSFQE<-uSNGb*nud`lb7s8bcp7z6~teWzTH*VSDDwc6xlzhdjP&hsXEs@%VMyJRa~S zt1oH))bF31px?8t-{%@(A8)@O3x1;inI-&$_w$i1zaziyA*07AWP@Sc{g@rrc@CjI z`Tpt`Qa)Ud`>U^WzvC_+hw@upZnBo^KfY7rbZ;GTK7_u*kBs<1$0L!WN6}6;68PQb z__5uU^MNPE1qO}ZOyB&1c3k%l&kcXFZ!@hCz9*u3k*Go%I?Lb5_BotXpBI<( zxk7kBC($h}zlh}nf3`P({`Q5xRIB)UZWiM_zN27x%b!l^VEvQ*yU)mF_TpFR*CqWk zdJTI%&#R~XN$t#|J(MH21O3&PjI%S6=MVAwTKk<2*big)$cSXTm&UldGRD=lF|LN5)G9lyeU0zgkmK3@ zPSLw9U+)cd&k^zcZ8XvTo(qVHQ1HRcNk#i%Cc}@70P$G(aYs+e5BYU|-*IE;oo0^* z7Wuk(HvD$C+wt9mY|mRgzG|1-?Y(dE_;ouyzB}mA6ZBjh^jseFTpjcTJs48_B?mV_ z4r-OPo}b9`vGY(q^qcf2$p&KoXJ3W{1g(FM=gZGpey8?+9_^LWQ@wsA3NLn(l^bM^Ip|!+nX;W{pdECD`O&7&x#Y)g_lIRCxG&M?C*EFGx({L;A1*euY~7Uf z$}#3J)GAGr<5TrFe{J;h%IIgTn-26wKb=iuC+MWlozn4Ic%6Mu#=D5m`jyK-~ecIpsooVu>aiBf#nr-#8 z{>pp?y$59cKOo*N?{cK~g?dk@_1;s}mz~jhJ?#t7y%Aa;6h2zl6Fyq^)V>kH%Yr|A z55q3xjwa62vp1NpDSf8LCC|sfBd${eG&vp593x=fJ;9{j-001>`Np0hV75m}!4jmdYP1mET+{&v|{{!csU;Eup=|9W; zkz(Ie>~G74wwayG7p-=CIlR^5%T{{4*srzR)3vW@g8Nufd_;%mz;31K2o4|HPUO9%gLTG_e?G)J%%jV#yO+Uc8^nTsHucIOgU)n_Wo&q zmA<=H?9*~Pt^3=wE~EW|slR#*c**W+zLK{0D`+o&V2-ty&Z`W+1Yh=B<5Mc<|Cw^$ zihe<8c9;4|x}@drES2XtnbL)HPs?vNdK`5*9XjH2x+uOIsP$B>8#Wvd>2*3!;SfUl z_RJlN?_spZbm~Xi56Q(WrU#!`ZV}^QuNa?(cws-?JuCc%PIid*0i^wVGwE>>JJeI6 z$GTGa&FEK(_v%vlH7F z`SS;6cYGbJZFkm&el50VHstmuU$oHU!)|Z#Wj!9>6ZU46>xstmV!v2?4Hr>S-gMH{^GX%o?&!K?ao2qD?Jha)Ar6pd-(&$ zteq6!vYllAq<^X2{P60ra#priWxY9GDqpr!Wxe@!seIW^mG$K7C=Wl_={Dqgl0ODJ zbw=>x7hf>8f0Cmml%wDu`PQO5B=+bXh?ngV<{746o$S$pl0EtY`+X97RJLEAEtTI4 z{8M=@^WoE^(^hjY#eVFiN``wQ9pM}W~LVN$V+o^0Q?A9XJ&un<9>1n=fde}9$fBCA4 z$M?oPD|Me>StMR-&iWYvsAvUhu4)&dW$9`S2BRYqf z$9bX@&trh2`9NFl#ez4{!}N8&dXS>=0BYj)cg>!AQbf9wx$_D+fTag&o~oI}^Vv{w0!r4ug0 zz%2HL>sY=H(S~;{>I>dC#=z^Z`h6m_*M#u6_xUvp4O=ImCa3=P5%7!p^`Ag*@k@BO z`{DJ=bWQbva8f?}I*weY{5!<_7*}{t@zLb{G~53h@J;6mvbbO40(_r!KAI*T=i|wG zmH%+IBZI%J_lcMK6X0==?qQ>&)^)WHmF4~i^FvO!Uc&M^_jx+~y8RUWnp48>;}i7j zwZNbKx&}}7YjLUG{*&~Ja)E8c#Xej1&+cKJZ2wxQj6gbw|C`XS_IldcwmziwD&32k zUF_pPeTpmA1yj0ge<=HbZF|;_m8E{{O#0Cn^7}vvczawAvc0ZPx%PLhK!*@?zpD1( zx7X>oY6rcz*d91vNa^tL-qy92c)IRasM+oa#8yI zde$lEHPZlJfPK}ZQ*kab@Ndpz>UjJI0<3i2KMWfx5p$>z_BAW5sYE!6I7+ z=eSS1xdw3N;;H+N>eX3h_v_W!CK2`OOp^!3S-xJK1K#lY>^cdUdMppXYa$dE%*#{T!6&I`AQ?#P1b&>bu>H zv)$s}2*fGT`o0kJH(T7-%o%5UHN(!~z0%^rSLE{x3VQ#>@=Gn>3Cs9<5ZC&&{1@60 zN}~38*7V)g2c4gd1~L(NFDmscwXa`BoP1*o(o^kY&2J0;(bb?hS1{Ux!U)G!XXGmd^R5bxhcJlpN|MEaYpcE6+VVy=Fpzy0o4_r1=?5Pb(w`|P_& zbcFm$e+rKFHx~DJCGE~k?3=!SHhPWMPx1RE7(hH}XVmYm#a>Qy>w|q@ko@ypB2&1Z z>qu!IA6HO0Zfq^-;b#C-?Fj$=sZ%R^2^Z!0Wd0SHKj^+d+C}`U4D_zVUzC$w=(T9U zFT!Eh2!~I?`4o6M9*);*!*Tu#pW?k*%gb>b8UbAh57$baXvDn%_31xuc%^>EyGg&H zs0Tbh#CVK*#EUE>obO#p`99=!D9%|o<2~G9tT#9J$9EJHJQkJU|0Uvt%QtC+`%S=2 z<#IjC-|YCL?SB>J>SxWf4Cx8`c?MEa{8>M(_rFjN`*9ubSqrUxGwwGXoV9oyyo*cl zh<}RjUjW|V{V>i519#X1{Nmd}wsSD(v)i6o?CZ-H?eciMm&QIXkMDWN%dgtu&sjYN zN8dxsmw-SB`3mPZ_H(XrF52~Ws@I%GC5g|{*e!R@obDZp8eCitey5fu|1CO z(0a#n(HxHtul4w{86MvgbY3;x(@*g}q1_+XlUl_cjZ{9T1Fw|7#5a{s)+GK9f-hOi z_vz)`yKSDBwfz2zVt;YV&okq`+Q|2NJG8&6x&NbvcPfw9b6%S0$H&k<<>BgR_x)%$ zEq{RJ6ZsW>_n=(;EL!=o@@nN9mTY!F<=jcY=xqijHENMBx{~F3S!XEX*e=@kY5NqIlCVNkM__O_<9Gyha z{)+Z{^+Tc0Dj#;v#kuH5eTvJ=pqoc~F9$SE&`y)@I-jq8_g#VxBNX2OzsTD!&iD0N zcBShof9kt8s?Tw}`q}or2ab>PQ8Yb&`URYSC%uV>(fx(v4VL?D-OW(K#JwY`;a~_YigB^`+%)J0QEx^q)@PZG_z5AMR6fJoFv*`Wa3S@rV0J z>1W?i_i|Z}KRI7!k8bd2<$7Ee%b$eLg3VHt@3T7->LC({*>_<3^_QR_Lst;ZMX01mZxst z>A4YfA&1L&-1Hdm*h4sRuWqdp_pi{|M$mroarPwq72RKu?h7M@G!NAMhz0!vzjPmX zhOKzyAH?HCx&QqXbOfDC*L=MH47U&R>tt66=S_ddah=)){MBCAXXd{J`IH+5;iq|G zagKP2=L>Jn^IW4WecO2#d;2=isrCr}XOsS@KGWZrq|2VP&qX_5({s+BIKS;jNsf8m znRpa;eGVT3dv`0)-pY4%Ur`_HHVgdTcc(3!FT|edN!jtxcDEHm# zh|8YvoUipW?sd)Y_j>A&_D`g8Nk2y4w~~Dz-TxHnkMn%>^5VXpkQ>@>;-_^R>0^oy z*W0r_;g`L`@h3i)UI6`wdv6~1`RZp7oj>yU={%zook{YP&K7SuJ!$7BqBE~vdcx>D z-`mqVS;}YnSG0eW2l96}`5yk0{3)hyLAvBu_fkv--p40^_qGI{>=4`e)R)`s6z$Cn z{1dv#@BdGPUz~p@bwRhG@DJkNeZu9s&}87UyU(TD^kB^?i_bk3oq`!Kl!OtI9Y;f{h7uu8dX&#!8ePX@y zfUnM5WZT2vjPu{wb`(Is{!Oc|?+4{NKfc|vk-ygQ9q~Bt&9eFYP{h&wwVY?WdtKbi zs_}|=%)u7#VqCk;>!p6sFJ6KCq~FT{Pxg@I&^43O{|$ds=gzgB(LP_T^^WCEmpE@t zy3phdbU44dgY=RAG30z=(}oH;Z#6FR+fa*AL%i{#iB@^TUp-#%jYKh?fH`2~5byQXq1{rw~CM@iGQPxNz0 zmwn1wqRS3%H@=6KwM4(2k-pOLEaG47kdzLc;N+gvYNk4Ah)#2*U!?NolmcSZa_#CKaf-Cy!P z@;m7t?W5*#?B8nO#r}Q$UIxAz6vR;R}eTTl_9Xdh9o@UZ=*!0V=4k6ZgSd;17_ZzXo%QReHhX+5U1 z-bL(B;8(n#*uY%R-w#B2F9a=y%BAzCy~w-i0dF^@lf9p77#Le8CgwGJ`$@cf{Ay-E z0HN52tnw&aMLO|25BTNLuam(ig;@T-K+Xmyfsf$7ALaAAPL03d-;MHmPn*)y`{x5^ za|@x5`lIEo6Fr&WFYAMjqaDw z{Izc@vG92vf9W3dT4m7E#b3z*<(oaBzVq2P+xsQ`AAP%3tMD8T```Df$oFO{yayWQ z!2Ah5`{Vr4Xw1WO9#Z~N-yOd1DZk6t6S-cxGkL$+>HZY6Uwa)7(Np)-XM1)TT}Zc= zbHBOHSq`~9NbUF$;Ky?BfI{8S@_j0ep(9qG{w@7L-3wpz-(RCu)}X(0kuN{;=Pz-5 z)_^Y8UHj}}JuJOvl9XD5Kde`e`}ynDmzds*F0~34XAx3*jGTfVyU`D=w-)EM2Mi4M z*SG2MW28r%E8+e%mtXEGf?O2mPj*`WwZDS&`7q%(99|bYfl$cDEKd-9D0e7+qJK)z zd$yOaResCi4*$@eH^q0JvpxS}@#22wy}mClzwV%=XS=`R`DeSm&K~sf^`<2+Fu?f= zpYZ3`KF8x{`U1sGu@6uCev17!@f`r|YuCM$lskpR_))XBlWl#;H-!Iv4+w&g$9YNm z4=yKe2U0k2cME;XV;s==Lg``Fa(e6gQiMlTbe{c*)AyT+c45zd6!rZ8_JvMH-~Sal zI#g9qP-S3s(Q-if2y>9q- zJtr9o{eSB8{6~LWzj~5-e(Oo~{DsCJja!q^^V1#IY4V>6eeZpY`p)~}{(W5kw?3}_ z=G<)yFYe#<{prpwY=6Y0ocRJq7r|Xf^pVdB(*=c?D5amzy>t42o{=VIxZ1)$xOL`wN zytBA3s*d$mQb2l<+N-&=S9g2;arUY-9#PKGeA`}~>-G9>cLCLV63P$tQQzTwyyxt6 zzh5DbfX^0n-YcbF&nf74Af=zivxI&FM!y3=KVK&;?j?!+OY9$2Nbh^4r;kNWHa|^r zvf?!5*wUh9p3Bq@AkyZiTMlnJq|h1c?jJDOZ)T>uooJaI^{o%aqwjMHzoP< zw^P55{tnwYhNtWj&)0HXl>e!Hhy7EYRp~)``F>7~qdJH5c>RQN<8k=8o$$uC%1Pl( z4n33b{?sJ#Uj8)VU6!|${*Q*-aNn2iS?tICF$}VkIUyFO>BxjNj$y)(G_7%!+)_kBi&l`5Sz%S%V`Xl|AOuv8QN3h@8r@?zpuK^#W z|9zLzOZPaRyf1eENi5Is;Vb>Q25BtWk9}JVsl0HVhvf;E^Y*2Qe^2}Kue6&Z;ji!W z^}KBOp^z6}*DJ$gz2~7`W88aOt?Pwcb?**14qy9#v|c{(Iqt>Q5A6%hm-Kjih31u) zTby*_JW2iIdIIBpmyjArN1UQ2x@ldE>736EgdZ^w@>{E1!fIIOoMU*W>lPi)`G-Hx zdENP_N4op~_b;UMS`7N9`@}f^WO??`=wB+op5@T{VSUbE=nE&E@ zYp)B+J~&^QP6}y0D?8E`8$@cAs|=ptcg?hDac|WH#r~Z6mN7Uh){%lAvJZ_RKQCU$ zQ|y1u_J%xM8+=~j>z3lP_6>_K76^<`*o}ro?cSj0;%7={(lMpqACZ1Z`K6`u zWe>-tlh7hxTAo$sYWo`B4i)Z+q-nt9;q@;kKv;`CVPAcPm&(c}8<5 zWY1H(#w8chlk_-!yXNwh>eXuU3wDigJK422nqAxE{n)qOpTleY8TYG};Sv9j|10g< zE-TlM`*+CtC;J`;-OrrbGou$82dPiPo~=dc_PR>jo-O|&(^GpkoqQT%D%J+k4(X}+ z1odDg(n*hjl03bU@9C0yA0Qu4{!LN-`cip2&ym>2TH+cWQXipQz&e%@)~ zeQrrk?A~w5$t3LAx1i5D*OLvcG(DJ%Jv*|XZO`PF>Ru+z6Z2jpXL~%-d@0h?bGYy6 zY0J|niHNWUPqL&R_X;v>!T;&_zXt!gpZWqw373d(ItDiC z``WW1hnEd|J830#zKcZKy;`@I!zSXDJt$e5U`2AkZ>)UpVqdnk9|K*Re zod=OlePw%nGx^u!_5{8F*WRxl{uue0$^+wX#{W9xiSq=(*Lmzt<*z{l(s!LF7oGA& zhn&uF9x{)8(TzQEZ{l9(W4>e#(X15n#%n2ckkb{;kFvb7zq~2u0({4wPjfpH|Eh_1 zRSb{dKZ;^r!@nNqQ}R?kAD{B!5a`ACb`13Q*YioHBTz11-$On}|KdH5zN=Ec=cCcI zYSIW;7uzK~s`@KEY z&-nbO`dPd2wO;-I?G1Om`lZVAtlZyL_=TK$^(z%zABpEt`|?t~`c=E{r(XS@eV?{o z{eGMa_+h2T%2lep_MB3kXU{XL^X)mKdcHkpRxhyUbE|ZTWhcl7m{ri`Tw`c6&Jm^g z$Tt2wM0?U;4E1mGC;9f9Ob`1{zlHmnQoe5k-&t-5gvo|?gq_%C&sya^10=Y_hlt=D zgyXZt1t!f$5#;AquhY38id3z#XTp4HK&`Ud@>95!58SgcF8xfT5dWR%C-Gyz{owYb z{o{^-bU&!w=jhi1fPY^Nx%^tl<<~mK<(`fDI!|%3a)hM&;!akM{2>3AQg%m-PK}jq_Q^i^g}sB_ByKw)YC^QOm%Z|G1NQ4MiN~G;Y4s z^vLH!+0f3=qn%bTg-erNtL(D$ClX&YZ}`5bgzxSN@SSh?j)dOt4t#GlyqX>KoBkE) zF^}+NZ*I2Y=+7^By$*JYc9!*?pVqt0>oI)}(*sT?JM~c5sb?F$j|RRE*;9BB&aXf& zsP{hs&^5aywJj&)Cp{3BI~(m~g+BOrEWfTk?Jb7b4ci^Ro4QXemjG>W-xKZA?~)&; zd&Pw(@t_}~?=p7M$JqhzJGf|WvU*Y6uOED2JM0r~B%f{8`_*t`CZO6g|`H+6;xbj@7WqV&> zKPKcGE?+}GV%JopYtXLU_A@ z*RMD_#d$*AQ%bn_hx)X7?q9keKuANM)Bc-+T(pI@;)$9dt)xR0Ow>*ZZeS)zmxp3My=xhd-+_r{9K(o6g=X`K)C-O;MUCQwA*7o;W9r% ze%7SabKZ2^?ON04J?-&|qcihk9@r$c7!SL&&!T4cOb&)3j&?XMsb6gGX0SkbN?z#a z_n->%{}GBQK8{}NaCF``U$)fk?Se>m@$KkOz6cCxw6JFHHsagxIPuvIM&)-c_I5|29GJbF<+gh~wKso?cC))3vAnzG^t>B@5c2L{ zjX0%+@w+2#QN-Wt?X*13d6(T!e4EEfC+Y|B`pOct(^_cd2fN*G=6sQy8|e0ar~bkw z;#=cZ;kjtd!~LK zgXb6+Qn@}1d(-|7(;@3e)^fh+ez^R`!=7H) znd1?c+#ZX#?99=KdwZSq&iXy%`6tu6BWNOhFL97|rKE@C*7&o-8mUr*;@^R07-n}d0tL=$<#v{Hq;v*4XAMuCmnc6G%zmvUs zj@hdVy=lv!w6@Kr= z&(~c_JNNY4=fA-e{bcs}m%xXAi}ra}$v*$p{7&|HrHvDl@t?Im`5KH>jX1a4U)>V^ z^HLvoZe4EAY-9M#n_~Xk3VVU^WIe_Q?l%}o-tTeT*unkl$@(aYOv3NoVt`Zr(ckXm z_hwii$>KXT?Rk~_4)<&F8+SPVh2IB1^nEnq!q5G`;@oTZAn7sRN#COlGdB zS9{%VhSSg8*pBz|bDluH(KfXG%X`9p9k+czIQMRFvW+qS-xTxzVqNc;mCG7#*Yut7 zRNvW-^jrIO+3p$el~Vm)IDvj&3;UYdv$wNcvaY1{xtk$>S!=rCJJ{{=%XI>D59@O- z-zl8cgpS-2TOMO?s=X3O2>0DekJV?>2<~!yZrdq zWno4i*Svp8$sVrz_G7V!lV6v;!0h2l<6m*F!!u}Iwr`Sl@F?i?bk6(dOknrE2)rh? z&pob3PoaJ8ngGuOz;nEPcD??$XP@0ZrS|#fUUD+O`Khzde~VY~C$rDL3_eWkH_JW; zzJ+~`@uaZNF`g9m*~gP7(>@<5+2_B;7)|>MGyAyKWmjYCLECSB{PvkMyvMUHdmHYd zk-x_N{l>SRT>H!|bkF4XW*OxjA%L5b_({4@k#bu19oQ7x)Am_h<4t?H}V6YHDXETBp4e@`>|h zCBJec;vgtO@xHs5SMQ2^%SQfAi>K=rr&<2ra+J5Gfi!br~ ztqJg42Rz67!9K5S<9Dz`&jS&E=C2=r@1m30*`Rx|PO;njRjgBloD}O6r!Oa3r}zcZ zKUt?JuOGkYq;~e1yM8?5+1wH9fpYfFo=$%7O4l!(DP=g>{xR9vZ(+_?@tQ+XP z+pkPX*L6QQ!Fh;<$LJqt8+!a%-XAd#=bo0udz69LAF*tX`PYN-{y1N>+2Y(s0C(gu z?Ni`=OzFDs*S|5=j&r~7srM=T7j|cioGhPUJ>qw;?)^+&_x*iLb5i>~(Yo(DAoow_ zd%52xo*nG>2E)tcq&=@cZgTQe?C-c|0=!-Wye9VFL(ZSV_l57B0MBK>bG-k)FzBaq zg4;^;+!}GMlek_!{rfq5{V9E4_{A5WY+MOBDb`7jdB2KvlA|6k)=7?7JY7$t9ZdK8 zmG=Q@o#YLqf3i+udY0_xI17B3*nfZKzAs!`8duifh&R_uK$a7uuQD@PDemEaVZ>*} zGoi&mP@7Y022PWyD0Yestsy_*=f+UH<> z9VaXH=`MG^7yERVM%>}(yW<=u<{>FPe|iS^Se!rIF8$f%^|u2-1g*_Ccgn>AJmDV%;NcIg{KQ^E+0`d7g&+8`rT8wtGmh(H+<2MrTM!Vj3 z{*mX#yDXtG=POdLK^s#By`dW+Tqa^;fTUyhiL{_nUC()m3 ziLQT1xE<*FeRO#6ewQ=cKWKCqoVD2C75?R{g%;;M0eB5NrhSu(r2Pw#Px<&3;OaXu zSHJonfKdKE*NK+sN972xSd4*cAP^04)dOYz20uBcT6I^?*2OU?y&FUZpyxg-%y;( zKkD=;-J8@tmw(vuQ~6z3(nIo#?ahYlXU(OCQ2V|M=XprBn^=rP@YuUs0tG>0=4(&=R_d}4o=3ww0OgFuc^A{RV z`Ta1H1O7os@py>v_jo!#(}<98Amn$7=Y z&wkh^kNRV?!js6)ee`7La(-YJnqBHmu>ZUp;wzN zKG8k;`3h^!+9QbuW_kO%SEezfb>Dr_?k63d&XWxNZp3$b{_w{g=iXjZ^!{SRozDH$FIZf1 zku}{=<30-0L)m%M{&lFE`Ivww*|0%xb zvtLR7k0$rIu-tOgCqL#|znp*htZhhTKZDP+wnp6fJuu7VWAJ{rBl#W6Ex%Uzh~pRY zjApMTo8Q4-b$s6fq%HJR{s#4y>C)R~FJrV1-!pj4UP?9N$0P1`fp&&L_m~k5!@w*U zCIsD!--hSoMH`;q1KaF%c>UF{8+_VdLU`Qk8Vy6k?DBN{O!;sGd?MXfAw&Ha-tB&P zeT~DT^F1#AmVWIIKla^)Og-HC#qaBU3e$hD`};q`^xOa2vlnRmV)~q`uKy_0|NgC? z{Y#BwOh5Cl|K-a}|HeCh`EN9ymGK>QH^}7WEf|l9CtRLNzj4p|LDtK!Ebv}H$moB_ z#Z!)V=sW5C8sZIeLsaT^OD6CdG4#wYCtu`;v;2PI9rfiOGJOT$)YWgmBOM0rcQ{4A z&-Xab&E|*P#xaF@N6W46501JyudIO?pNsT*?OGOtzC71js8?s1U9VT?*mzy9K0odO zeF0>g<$A6CdUd|tKUS|^825lKjC(*A#XX>XaX;uAZJw^J}Njlqo4svQ0Qz3)FgKpIn@2r%>Q;NzYF=JE)HfNo(B?14_Kd}8TwG? zp-O~oK36ZG8yAItGoQU@+}8uL`Ccx+h`mDjc~yJny>8zLmnj1mS#r^y?s?Cmz3Z>W z%OwQ*F<7R-{`Dhf=d&RnPx4p~F8qx+->3V%^VsK?4SBsBePhr)+oL$U#z22~F`oHV z{bV<3cjkkE8vhyJh`7o%s6+_-&M758>GWra5zAxQ z2kSTAxBfrXe4*Sdd*657LmYqML}kC|&h#I9_&xu~^mRXX+1+{2pXq<`nJ=$k`scou zeMo#@y2h(Ne{<_z@k9L;z0!Wa6SBhjIY=;uem5aq^#nh^h@~ip_9*g6R|eAYpFh{W zS2ELgv1WU{1@M0tqg;KO`{gOWFl^X*^C3Qg56jgm?&k=P(coh$7e`T^?e0R~v$)5- zKGhXVa;xvNvD{ZtUhw9Go)CA0ZRcI=`lJ3xuUYT&P)R;fy{OOl-zMpzZx-WveVWfh zct;y4#PK}|)BBp9z{coK7+`z8D4*<-`263CQ+P)RL2!22hm40mH*%Yl5O+YcC)wrMJB~Aqv*phSz>TKX%&b|nX3d&4Yd)SC z-P^tc{3C_cTRlU?&HyLPD3lc}Bq_sGB8^Nqd2edW`9rt`j_3p}Okj`#)Kx<|kI zfX54e>1Ob(c@5h|_pfQb!1{a^@vJ9H=se)%^d4}0%NI1Pe&h%1DLpp8x7|UXH*>KA zK7Yy%*#WwlKbI5ARk_dCje56wd8Fqz!C&1+SbpTG(0@;w-yQLHfvR^qeDy)+JLz!> zEPhwB_zQzicIXf}eFo+0y&#s$_Y7@Df>C;B;Nl4 zziF%Dl&=_Hbic$nm;jg7*~VjhS>*gGW8R_r7V~+e*@aV<-OBkKe&&2XfcoU^zZwnI zjd8aBzMj*Q?o~V0=}F&TpBm%h%mL$bb*gh;a+}LPQ#5~?c5@-=seyj*h||q`%B&u{ z`}O!;)+6dAxgsB_GgNLj?BsMG=BZH+t-GlnT6a@D0&iXq(mg;g%A=D!l$-rrLgy?f z0=Tm4>-e2lbM%Idywp7CXP48lWf9)szVPVX483>KW9NZm{muXm`e?R8n%DHM^zxh&rc@LT1Sr+dCU{TcL4rOPj)oirXyfEgr-?>>?*&>p$r?Ps9PSW=* z3Sj#%U(V+*AzpNmUb=F*`-J7a?F_+tJNZr5X$BoIGe|*or9~IL=nt)V!EbnMcePu! z!TU|!zUiG8`A-Xf#(lP<><`*6vNKu@Cq(u~75Sf7>omBaQTrzQhl?;iCo z4!EV^uW?`R=IlTwD}RH>Z}RFCJ@A39S$x^YiO_=sqPnb4%|WqN0k|_{MbNVSC(-bk&>fNGH2qc6_p{$30!}opW5@EeSqUYbXWCFZm4kv5P#P z@F_p#=*2ZTA}f2Zc6icvP9`_&F7^i0JT;9A8T^XV`*PN&%jLOGhvOF=>aVR4m+5k8 z)MHJIlf2Xru3F;*h~}r&nt(@{mLB#8@u6zPbjX9s>7DCv%HJA|@gm{(a+I#|QR7ox zKFZ*4l81*JKlQr$=__meeF;F=PY-1MlziTl@j2;{6^^gx?3iUQ(N4_o=O!faEW&(N z`v6I=taLopLT?AjVQ-tqGv8$(th&zYpZMj$B%kW<><2_ic_l{Xe;dPyC*P|Ry__oY zYdon=^oVj&>0YsN(&MWW+sNJT5A}Qb)&KHxZv=d`CFJEM$1@ilsa|16l;f-g_!aWj z8g)COJ4$Wi?bQC$OwXcS=~@k+ujTeF=MAz0DSxX0N4~ree69C?#&h@~66##JJ`{I+`?puNOVpkFW_1>H0fpjyS_?w_x z?V|a?zOSFr88pxb+YZ&`sLKr|xW`<5C;Oy3&-<OaCy^(>P>W4E@%@`|Bvt{-QgL%X6%E9m~4Wd$RfpKk0rTiyzR3-~r{Rb(}XC z*FzZQxc*z8_{1mhvw%0+nPe>Z;KW8`I(;~Hh3e$ z>W}z-`l%Q+;qv;gMwshQ6oJF>flNFcA0A`=!|>sCS^W;jhf6a!jl=!*L+4+<9@xVI zHpfAxNN;Oh^_bTMHC~22(u(%V%lm(#JW5(#9_8qm%ZqYUPkq<%tyqVo-liO|UdOTy zIjjHG)*;nTG#=-Aly=0h^~W{XAWGxJ!209od>->|5D6!JPCY=n!|iGoe>rqq{#Nq$ z!_Sewv-)?9zx8!q@|pelX!tzuuzddJt@F;X-D5v3U*|m^@fr`b{xEERgLVPOTedg# z<|pRB*U9n4zT1)T65o60z_&EV2ROPqy;>*IIwA4B7KBna($(QhAC8I~{@(#!aAmCD zX?>FTuFKN3ej_-o^J(5ncy3(?pZ0MWKlA&~jo)9w0+Z|;;XM*xbNlG8hve6KsQ5v% z2kbsnjXU4EBW~}ge*JVG4^%JF!+Fz6WTl-$2-f!(n$}YEh{mN~KfRjDP^o8J~>Z|diTp92y0)ED_+4`#4(_y#D{v)3M z%=VaZdsY21y@!0m7hT`RxR~B?oOZk`z+aAgY!5b7tKkCO!a5t>)H~bm-{}om?y_J} z-W_zl%jqoN9rN0ozvkuPqcK8O_kF?rk*Cd{zS8qgU*v0?EZ52h9sd>b!r|J&4VRy0 z@!u_<)*<`*@?Ng^M}D+{n*8{~7lY5pPse`CpE^HQ@5iN^Q)zys{>VFO>9lUQGw}D; zTXaG5uZ@43R(m+@3%8sPT9+Ez=IMHGWha&onPmr-r&xnc+dX~%xwGNMe3>z=JMKg> zrazXi1z+ovy*2`HOg|g{c7UIp@o$1pxBsH>qnv8e!_^f*=Q0oPME5)sKgX7On0P1w znxO(e)OHXnVe9i44 z?N8i6y>}GnBc6}?2%pwZ)UPG)lnZjQ6YD9GlZlAuc>y}@qtx{X?bki|`77k(Nhi*$ z+u!ADTFg&ATzi`PAnVY!RenAvU!TV_8#ce^h)MW2Bcfhj>Nk6d)%7>!BOfn!49TZ) zKCJ`S^5=HUkE4ynH|a(7Q>|xIx5qlp+E~BI@Y#5^!Rcc?-U&8zV_ie?tMeDyFRYHE zR6%b;nAjfGTP@h9V}*xBM_n%J`%f&F@}lvhi}RIqT5rztA0Yp{c(XeQ$NZPzU-h0i zM>gZ<2hzHg_V43<{2U+WM_R8W9)?@7KUKZU3(|R)dOpH$MEmLea`8)Yna1}R*VRs% zcWGXm*2#2kY34~APn*yttl#u1ABS`K1DPgAd*Xs0_YF5c%TqY zdYI+2Jl5xWrWgOq+AHCkFz|HFI;VFV;8lOTGyja?-Rkhfw;PN~ctlrL-`8gOb9%(z z38bg|=LH?=m%a^Foq9n-`q}@20fCipj++LT5w#^28j3~J0ML$dRP`h0e7iSCT0DQZmF>OAMiw!lB|T?vVRD^GX0x!Rfaen0q3JwQp7Jhim`pzm+ba6B3(32*g` za>QTSQ-&wXEtfgH-Fcp0_7wNgnZk7vYrl)4Ua{XodRb%b!w|2Pw+4}LDo^cMp6>Y% zSI^tNDfRSnzv=Zn-|L;~JMQK7V*KFzf-zbb>yEZ81NmnB4Zezx<-)e5FTTz9yLAp? z^7OE;W4&X^QUmMDH}nxDzB3(ik1$=g>0!-pSq_&99wYopz%R$Z4X1uV`JvNyZPf?7 zK9WPpv%VKe@7&%T{b8zY`E{OV-EF5>xI51g>pPI#PBi;E>eYLvffv-TyJ~vpry(aA zCztGYIQ92*UOVgWgy_ck_Z}+^C%qxPAbnl$H)V|LX&*k?Q}SJ&OFE z3hHai2YpRHje7{wO+08Rn zX2=ECpR7I$91y`}jx<%k;`qJ!(0Af@PRg1lD^g>mB*J$Gb+8 zeo{YA^Ce3pMt#-JFGV|-k9fbNJk$Qc_p_G2&(Ako#=4%@yh8i1W13e;4~<8= zQaQm*M0|JN4Hnk^e)*y6ygrx2_`UBygdvD<Caj02bc0~9`XW`#)MEECW!TWtmhok4< zEckPei2vDH@Z6>Gb5nDzH=j7GzAru^{K{GIOOFV@eil5x7Ct;ZSI>g?j&wNw+%yaR zq$A?LYZkn(PaF>ao>}lda2*c*@eH1NcLz*!`s{~?%U7J(w|}(WdN}xnv*7()D)ns} z9MC>mHE!%k^TlLG$9ei>N5}j~^Lypjc=gS~)4SB^8+fPTBOXtCg6m4jz6*Use&+je z)Q1-!i}sOdPp;1RL--fqeX(-4>!a$l&`Z0K09VELx#|AD(_Al=yDb^%?w6Aax9x|{ z^;V~a{+blN)s`;(R4$8hH$=IyE}(tUa#`rX4N>mtQBJg<#<%HlkC8fk|yFA^~MSeFBFZwjU(Y<6VFm8}T)kYuJs<1|k=BjJPDTK(TJ@CYyCUu{j{6VGE1X`v@7}x4;kDoK`h~6s z${8Owt3?i9#=V#6Uce72pO0td-bcK=hn#+mYpnm30Bsf*TZZ1dJRj{i(p`SU>s>zV z^=us<=N4}E`e`4Rc>WIKIr{dRyBKr#Rk|`bW7p zyM-Shx6p6gtm)qadxpnXi>|ivwC}I)*Y&-G`f<{Gu}+cn;v(+{s!t|9_`}&6!%a?c#qSa_FJQ0YW;SR^Huv2nny}L zHSbLOq4EBD`W`#pUzfh97H#qJ?hifj{?LC}eYddx-Qo4=#kw2og=p-zxg4;axUO67 zb-wr83yP5OGajF>cWgm?&R3R0yuXAAnDlM`ds$ylTL^y3p=t2_>Q$znTO%*<`-9Nm zSYm5riBZ-X8Hes-c&XnXG_u_0d99HZHa~8Syg0sxeMx)|8}|o|oay%mjjZwegGSEw z`-4W#_4|WH&bNNt8hN?jA2jmacE3++WSy;-wni>2U@jFoz2r}`_+I>-9S_zOlP5bL zTO(^NUGwFpN!M(6)~{KdYj8P!VrUj;4aBql>E57>fBe}jUOE8Jd2q7``#FPW&uXJgvZVFHwev{kdtk?aZ#1-|OT0Hm?^~wsp^09*^Vfh$ok4V4!CnY-1k;k_XPq|(Xx$bR208a9)^#j^@ za_m=Hm(aRUs}bW!%p-RKzKsk!AUyOpt-&8S+Rc=wR^zhppYQ#mvB>*Hx>xIkRs-TC zi&~8rdB12Z@qW>0$GuwP-Y*)bn;z!raMc$fF_lnEnW9J?LEu*)x{0QzpyymW8C zLR98c`S+(m59Q^zfSCDR&WXjtF5fKG!!FmP(!(y#td)mdj$K}f&*c|CBHiVdQseNX zRQo%UQ`L*>E*vnluh<$HF*#$pm)plfitG1QN#3hfKK^lDcrg3UR_lIRzf0>zi@s>% zR6brjgMOlW{0L8{ah-S{|Ge8O9{;T8f7rlmt)1&mI>%LSm;7AN0l=|6eir?g<*+@p zuciGZrtiV~ABkUH4El+8*jD2t=M(ai)cjt;%d`2N>O=Zx%~SB05K;E)>Gcu6a=y?$ zp^;U#?>OX(xo&ef3)(W`dJ@jMmvz7qnk_L$oHl+n@Eci=PeeZKBXnfY5wuXJC^ zOni@_`%-2;6X`6yU!Q^dQaD(`<@9hriuALmO~w9F7ks4?eK}um%Ig1($eGwN^7$B9Abyt{D@MBii64rl)_xiAbzZ3osCom+i< zTJrG5;A_)Pr8+%?ukgs4`%&K-pL6~l9LB$knH%(7<-YjXihESF@5A^XLH-GVS$k>! zEBGS&Lg#P#d{;ZTd?$N9^&_1F5&I_U?_M|UBte4V9ehzQf4K#(zA*k^R*8_b)fN7-+vkLa}SMS3=k_wnj{ zmd-=4Ji0#q7g<>C%lto%{F+ba^SpmRe2+#KoX#01y@>kIG5-wes{LQ3GyaXpf8%XV zfX-7Yo%}_0tc?yG`X3h){?}NZgWGvirf(1ZQ9obFadxi#gaDY~~OP}SJ%dMK}yB6vzlE`xr^mUF_=Pf28zI$BQeZjxZdUQ0n&Q;7sI~E1N zjlJ5uV(L8itKh5FTRZC=o?*J_Ne@qtdsy;zIDR})tKasle!VLkkIpr7K69`J|D!ql z>VU85sibFCdOFp68$Xl0-x2k2FOx^l(7D_bw9X{CozCu=BZTIq)ka_UV7*T~slRWL z)=6iA4x~SUcGS3_?>lhQ4eyAmpXhAb zEP{59+e_u%u(Qtac}BVS?@Z>aGicqT-|da>i_h>nlzaa?(!IfT@1gMb`C{4AxO}+w zf40`1%k%bhb(8c|xz+LNoH^HfNr~#&xtXotVfqsYGN#*zc@%y#+&SL|aMAn5MPK)N zW$)gsKSI0NdfbPA3@%^48e@Cud}f^2%-ajiWaAL&=J21g^I_{JHuGbSB-{JKRtFJ!>xhb_}p{v8UJjiM~tGc%=27 zyr0~a(LJo6aC}MqB23x2V&;U?fSraR*LSNmo<-`Ky;(#QL>z8d!C(X{_f z86WfUWv=mPPX^C={UZKJUUZ&4eb;#s65;f{Qx)e6t5wdgT+Z1)i089tAJP4dz{mIE zg)hnTWkyz^`wX&R)~|AZ^;zz>eVtZ%sfu;>bgnYi)zd!2 z9loxf_N~{3{h7{x?y>r(ed~B9rS#&lk8_Ww-x2$NtL}0=c>6B%(>taoJY!+f1rhGI zzt&Io8u|9!^VRI9AC55Wi`y997h&{U%7xzT$nPV<(c(0(W&8YmCO5tFJ%8EvEsfTw*d)yK2@s4PZcRD`WsWjos>yCWRsE-EcN{orlpSHbt{!Dl`EVDz&(zaRGe91n-_TXtfld1_~OChXxfho z^^Kb^vVyDilmf`->gZSP=vOBmTfeG8{w44AevtIvT=M@M+T-K3_IP#P9?wDk@BS9b zKl#R%OneJ|elz9y!5aTwlJhU@nI0$4aO%gh`_#^zct3&m>XX^HD0@WjB5J*h^Jdy} z^>I&j3ia3@eg*yF80^6>X5}*fb+Aul4{F>aeFx^4FFsz&|EpNoCmxV_sCT*7KlSHW z-_ZQ9y5RxSGkJX;Kt8?mrFv_gLcBi;254S90lM%%?CsT75b0#e7Qmlt0Z+FR|M;_W zj{#ub^fE@LbLwN51JFsIcX*j!gz3wUDnIOcvODr;jK=-`LBDtVLg!xCzQi#1y2ht0 zf3<3O{dJBeulJjV)LY*TG;MbV_Pvokcm1mqj=sDf99mxN*EoA{4r`^=L-znwJ3LH& zTYtp(K&N}l)DM(zI^;oeR^7hE+D`2?fxN6uE+2PMKH{9W)@O42dL{Ib&R>@^Zf{gt zC)0V3SjVd#d~`tmewp~=d_n%b!>>@DW4xi-+@xH~{?PY6 zl;^MEyv|gdqi8iQ34U!bKgYN0DDnM1@CpCaBR<|w&A5Hl?=L=H<@gUv@1;hL_3OWy zMXw7&vsi8bJQu~7a>^UFTIBc1;Con0*ZFFl!`6OAc{8O2<7n9RQxEz1o^oI0Pv@5% zuk>4WN#I=``CEpj(0Q$$Acpj)-qVYG9YWt5OvgI1)=6`I?5Xja{9$`t3q7CCtA##j z7Qbe4@R+j$a^Z4Zo$UQ#`VOb7S)5}(re?f;)HihHLjk`u;C;I->8Ytb!HPVXR< zGrwZxCO*!5Ji>0bl{3E=VYjEtnLmlJ^Hui{PJP(%=k+&vz0c{(_0VT2Ur|r-wG6uY z`pDbmNct!*Z>apeFUk-5S>LI!9lk<2-1E5AN9T^Z4enY~-@x#Pv+~hy7Qml;JfOs= zy^=l(eU;NiIbeA|g!x;uxWRCx_mo$BkD;F2>-^ic;^h|Bx>@;<^SL_T?auNcZ-?r9 zA8^t;iRYu^z-b?$I^P+r?^vqy+mY_`t?GQ2lQPaZR_Cv_^y;+r=1#Ap`S)N1R_Q=MOQSX*|(5ulDEoL5|<3_iqrU)4J%` zEgrscy|;_{?f$UyxUQDDU0Of>BMTZIRKq25?`tejy2c& z3QT8sYOjx<>AO8df)ul(;0?S7u6Ad=K<=T+yG2@O)Ve`=E^}i)l=EfykKrHvR(#jX zFrD5Ft6uHlE=nhydUEy@;e1EmUk`q5Pf6zH9)(0x3 zzaACyi#+{?EPXP@k=CfMN4G|odVNP%SUa^wU*hMfMqg$cvo*Q~bp@YC&++qAqZino zbZhi`%${qFuJ`j)qZj*ms?kgRJk{t%KTkFK{eGTm^a?*uHTpU~Pc^#5S@fZr_M!l0cyqK4PJIA8C1mi=Jdz--@g z!+)8LhfU1>dR?YRn#CoSAE-2pdRDsc zOXlgnJuBVEnLPdHvvl%{nx$F1Vt|gHtie$do3^?FeUkC*jv5>#sA<}4Hr$&tIDJ2# zKQ%~pVa=3N|r}w3(Zx#UlXyoO%EI;X?ML~JF zJd+pp!>u4x_W|VP|6@&V*+rXnihVZU{;CE?i$L#E=lDKVgY$EFJiRp=-_O_JPB(lm z`#HXoYxN^0*-JUxeKmY+GS>UQK(OAA-*gOLhX;cc*7!a(>FIn&n6A}W<$9;_-L7{U zuZ(k?H@n_x+zJ{9SH(HbU9NW;?{dA<_+XsleBAX;<4;ZRh+dAz&X*gkyfl8rcO$ty zw~PAWLk4E_|2@~O9=^-$qB7=5y_-C}Z_hqy5gK15Px<#8=VD&aEq;Fh4lGLVQCNId%qKm}GK?PDZ#mz8-RN=qOy^(v^z1c!q=)@>7(Mej z4;$dmPg=fa@t@2mJ?O$i=`njLlY@_%9B4k_cFmw1{CmSIdMF305tFyu@u+9Fc+UWw zwe!suZTx%|c5An|a{$ijo5B5^!R;D=LzB!Z_wxo<865exndy@joCWvQY+a`>S8m`o zMbEhBW541!%l7{q_?^bzXqW1SxSuTenEE3!H6!0%@U>Z7X9y)jDn_et81I!}xKq#*Yh(A72c99Grt6FEsq3 zhxKeDCa3EI#*fnm;Oh0f)9Oj<$>nc7eBsUU{n*fY`ub=(rwKY3GpwG^)av;HtLL*( zPhTgfw|g3ACxH}>^{mtX2BY84kBaVL?S7rXebvfid$NTDpV#v(L+k1H#`fPg`+IMf z*str4|FqILu6JVm|DG8CH^%rsKgRzzT90qxJsbA_R%1bo|8I`*|7|h;KN#cxFAR+T z(o^4Udg^g2_elDKdgG4_{$mE8>xo^p_W2m#j%+7<#PLj-XY*jT56fAJ{N2J8rS?Io zUzNVh(q}9q>7L6j*f6v`9<+ST;%Cgy>ruA@euDLw(+;>dl@HPC%L4~>IM!p$(DHq} zYZgvNUVeStzuU^6Yuw*$T#a+8;9QlXH!+*2>x6SbkN&lRsUu)@jV_n(Cs3ck z_Pf~NnuRam= zo9cix`$@os_D>nO*&A^qb=jQ{?ggyz9~fF6e+QvI&iTCnlxsTO_g9TOzjQxjHSXyeuhY82jK`Bsu2XTH z>#o|m!k54(@4J+UgYiK`!~d9ZoT&J2=@Sv6zV&ryq$Fp57k3Ib9v~0 z7eXzGb=&lPj`OYmU5Hi5?01?H{dH;1;xaizedwsS9t9)CFSSz&pXYFC|G|qdmc+hD zF3*35I+b?^J-eNbbPxa5z%%VW%l!wKoMWYjs|P$^DmUyPy|bwH*E?3?V>urAb*^W| z!<3JwXn*XDFzPG5t|y&3A3Evj+!uMYCP)7rvRE?9O55zZve_gX``t8N|y%vwc;Pico^s3G~5RO+h==-Q)>5DBr}}@w&&2G@p&A9jF9PX7igRy8WyaTnmJU${NzcO~Qfu(oIcLHuTqILius+Qi5+0Q`%PVY#J z0nWm0_jkghCB%F!_WQ8+`|`f3xRHcs6)=C+gqEPrd)m`ZBzUNa1wOdMDbA zbZWhcd^CC|4Xn_8pM+~8D!ps7&C_*{-v04`54qL%N8OC>}O@*ayXVh27b{cI@%U2 z_Or5Z;!iH;ZN#%3>8Jh>@b5<)o$iO!Jm>%P_vBmi<~v`|{$%-dybG1~lgBODzNdz| zI;8u}#82w){QLaJAP+A<7TOaRWaAk1+%61j^ofUXbXDLNzPaL+PV?*bE%X13dH>`k zYo1p8(Y*J5{mK3EkM_Oyqrv;O3~&8Cd(o%&>RA6*gLcVZN{?|PKQCx@!xU=@c<^&I zeCB@`4A!`p+n>*1T_NFP=MDIGz^|7leb772z--(kZ;Af__~oR>>$?$s&#L#*>))MF z4s!dkI?e5m%Ec?$CmPR0=Ro*;FSq{PL_TiP?o_?W7dq1Y=kPUdrg2-}Ro!b~#jyLE zei;0u-Jts42GAPqTMm+U2ea+|Q>Sr3)HQwz6f0>VT?SkJq z=ezK?Pv+Q>Np;@f3@Zsnrhdbx^fII;tRxbQq$eG?d3VTH555oEPj5H~c^ATo*o5GCLEf z2KB%)M8e6Q(Yt8uPwh;fr1`Jx+pR8m(i4kMCRNlMF8^cW7A&Sif6YhX4MbIEcs|Le z^cc(gIpz<%&BE7P)Xus`Q17=b3A)$Cdu`1BDDo$~(x)>{2j|14H@141d?KalZ_Lkj z)4Qnp4n5(UjC`mE^AY}^k%2zPvpRpC%e(KN|23|kvh~n@!8get%lQJ*NjIJ7)BPps z-Rko^J<)xEhwJpU7SP&6eK!CxTr2LIEHCo*>yEgb&ZT#Co;T;;)8K>FY4q-j&ZAJj z(&@dGrrnaq@;zSodbfC(_5CF4OQD5p*{)5-mxxdE{27O1JKH?(W)BN5@$E*G^tk3* zy1%Lao|^MR^r}6oc;{4nW;*^)?|+Hkw0jsIZr9?o*y}-myr&_2q-Q3RALVEK{w#iA zoCYr9ZynbnS{t|M-#F<4uXE)OqZuieJKa|#{4qQn$l-c40^pV}Xt;hrI{r`Ziaw0?HNL_pUt1%g_u{@&(N%5q_0MXR zuP4YJ(Y<(*uVL!~X7}wQ70^kj7uW4_zTSzjBjF)YlPo&w=bPt}A&B4ehRG z@!3QCCH<;-R9!w)AGY@&Sh=&;+f9xUFaB!1=SX;&@8fge`(TDo{f6)tLm#AamRdd1 zI>+JYekIG<ljFLFdKp?}Xg6@w2zy z!#m)$@lST!|9wZ;`62uB+uj zA%Nre<8;I~4`Yk$2I-Tz?v>Ja@7+er^2?smeGy|Xw&;TV1KH`_%g%i+U>aX05M+$L zYtnf7ZU-x_#a;)U-eVs7pojTgKF2-L+bQS5>+#*u@34%y9zH<*x!3u|`tJoV^qrNy zZ<0M*o#zAZT>3S~dk}av|JOb9#P9mr$3K1FqWw474Vr(XcdvIxeNheLBihZzdrs!y zI?wZlq#eayE8v4QX&piDzl!c=;rBk~^m05GAJnepzDG@-Nca85mnSW(eYs}w7cOrr zNCnCZIV*1?b>1%g)!FR{W$Yv7<(l1apMfX)h2tCZ@jUuXwe`8ZkavxDyswjR!`}J) zsrc7+K|5UU?*ime7INf`reIDHpq<$tjkiL-J)Ezy(Xd{2R?_`a4 zINfhwt?>%zyQOMP?028eQc>;^)`gNDTIukT6Y_5fq9pfPuPe8CePpMN#d^NC{R`?=27%8t?gl<(vr-<6gf>m7bRa4hVg>03Nr>jRvx;r~>Q-UAgM z)4S0ZK~UgyPC<6`l8Y?bQt*zVcBX$nVZO__r?~eBYii zlI!YSmYndD}$=%a4zF71Ak*x}T~(ugd$e&4;2N z>piO8t^M+r;-~JzDj!k*b$!qs`MmY#D#o?y-7f!}?m1!LuC-V8E?8$un2cK$x1J{3ieW$;o|AwslSUbi2Xqq>Fqt|_8M{<3hq|2_kKH7f=;wX8V z=c(W3`$E46fgBcpDw;;|S`Qj_Ze}f-blAC>@3wfC_QRcdU>)p^Yb_~S*z>3fm3~BoKrig-qP|>7WBGk@eQtgD+t8PZP8un2()Y1c)uq7mX3=^foI#2YNVJ(W+U*dMG^mkq!&sXN> z^od8`!zup+;&S}r3(NgDWIB~AzQsFOIov;Ga*)2=evB5#;MfGWk-yj%Jwl~hT_Ln@g;vHhj3FV?$+>5`k zqwvqe_gHv)W4^tZw7oHI=QXy+`#G(~YvVng25d&=zuVxM-@|uB{_nJVH@7#|*!;NF zcum2Z5?C(h%gy2rgJV7q@3!!E+{et3dV6EF-&fJNBEBPQSh!hKDIeGdJhw-_)poO0 ztMMv(8LHLz{$d$YSl)7jyT#yGo`|W=W5S*9H99cJ8g!ILBVtAUtoX(7R=X_we}vzsBz|f&8MI8-LhO zbZ-UWJ?sjNVRUz-^AwEpn{uoBE0|8JCcOuR-&CFHJt+L9-0A!b;VDisgNb9`1-F> zOUUqx@lSe_`tdVanD!<6%LJH21AY6*39k1>7P{UW3B8AR^BPF!dg)a^?X)3?edJ%G zXYuo%>cm!kGq3gd9y$g7y$s6;%>(Bb-HRIlb?Z8ic)*89O_1?%;CVzzgXwCj} zx%m%KPRI2g^08$I|A!fV^26KZ0}0;r-pD4CU&3#y)x+ibo&?W!YK^?gt>O26 z_a1|9jl9zJ9`K`RqvyA>cGG)_(}!uJPOTl#e5=k!wtTTO+Txb|d^R*5JK;d>mo=PuJ4P&t`Eo{(Aiv z?(NGP<-z;;RVn@68vQQ+n^XE9)cE1`du2-h%`9E>PSW*s4X^X@l9cbdp>%IZ=@-`W z`}pMJ2l4-7E#2k(5kvW59U9vhTq30Y6;K(N45MHAU>U|cdTp`QG#{YCDvB6LZ7gVxIMRpzfC+<)(S`l*3H`h&9^Y zINioA+D~*^|Ks`sIja3PZf~&M>URI$IA7P|eq^<1@V zMePK)J{u3KMGI5>7qfMoYEj%HGvoM37xxWx4>s|l$$&TRbNP_NX+Fnwl(kto><7mI zgzda~rmt_vSE?WNFWP&^TI@u<+wjE~!tws&3B=JJm_8x)Cm%)tj(oEH+2FIjKji+? z_hsdAACYtu-|wN^{CiH@7m57#y+y_k!haf!)I6Nwm!m?m&w7s-8O3~vh0(Fw!#N$T zoF5>9?Ls`ak`5nkY&{QA>Aqa@G3OWgNcy>sbU}^27iIJ@-=e%c7*vdYqHD zUsnIyYV>~{c`27GfNFZt7o4sP?-z&{>2$}!*M9WIZNodZeEI zgMcL*$guMz(?4|Uo3@>Z2srlNH@By6l3; zgV%bG)|s^bN4p+bVAn5jJ&5B^J+Zs77HN-M(8Yn!k2PRY}I5zGAgo}o3e()9+2 zU=Gsp6wV(=U*vjo7v%uu(-H1w=oRvL&wp{9&iE?sBhT|aihR|g2dv(NUzzbu_dQcC z@IUf9pVB(@46&jQB9Y(O>U(p-(@Ec#=|1$wgTK4X*LT4K`fAeiTYW*k)_v>ik@-H$ zehd?m=Yf6=dfGs_ZPEQ!?&0M9fBn+zakDP(Y!K3g>V5;{eUJ0u_D90^b|C*K2jVx| z=P*CC0{``zbus!d$_B>#85&p?P&E?43F_$B6|3?k} zaP9fiK%;gl_j-L>Bfo3;^gVUn?|v8U(JX%3(#iKf1&QK6{XfpaI#0{|q;`svVz}*% zm}k$izDT|KWTuaG{~_a-Wp*v`qDaW&uLfSNGq%nC;(8(N+g9Tm)1%CP>Sy|VW`4I% ze?IcZJiD>l=h=-3pJyZABiXp3dj<#B7q9a9HQ@Kv%5nSs!%>db7q5)<#jek@k#B2O z4(W6I^*=^FtuMYBb#{IGN40Xu;%4y^3Et+}Soh?7jrBiR!|(I7_a%7pv(?z-^K8Ix z8;YNrk#OH{`mhE3Al2}Hxd!j^+;<23W}k02uJrjf@Q>8sy*+jZe9XHWG4BTa?KS#+ zK34_&t7CofH9qeK{H_{)=cf&UpuZdIi&y)+8}OIZ@H_ll0{?{BHSTPWc^6% zxXkx+wS3O^D^tF=)adl|?@#Gx4o%;f(x0y3_j+EM(!Vw||3xYNmRf$Vm#^cJ{;@xw z-H%=F*QWeME#2iX=HJNw#aVngJLUV%TDdGm>$fcTKh)@Ux?YmXjYy6cT4DSe`b-`geT-=OcxS~~Sa(|Vhi|M41rr=PvZ(|@^^?)7IaJpE5= z_&q3Z_el#wAY?B zIN5Fa_|ADG`FTNxm-N34ajLKAOy9S!ae76k&XsHbnfX2q5amCbeaTP$Vt-#!c>8>r zUEW;r%EvX6VfO^ct|wiu0?!_Ev`G$>p6n(cX6+s`n{Q8g29Bqz@soId5h9=S^NHZ+ z=8T`YJwVB1Kl^zMD{bN4N;5~6Kx6T)xW0f7I^SqMJ&P8A*ob1sF1R2w9EVKAB_@;gI9q4;Z?_9>e zsLy5Q70Y3ul49EN^mSgoem=C-@QHr8)$6D8*6F*uMQ$JKJ)nW}vvEIJ-fq^u_4(+{ zP8ZvmBS!k(Zm+NBq<-;Mhtv64wXe<_4xTIad*^swkdFAT4IkoT`r*x4Sp3&_)Z)9o zk2_|*uL!=cVCmR<{{JxFIbwV>`Mw(X$$#GuQnBXYVmpS!jFeoOtuc$Rwx^q%^2%dAa~v(#XHJoR(oYXACo)YMDFtMxhJf6*-b z-tM}GK=4i$D30@09^hZhlPWm>L;oEScl+v zwky-0TCZUI6aU6>?w$-U`STxvGjD%ZIS>EyFZ9Rj{&yR$cXTgVHO^XPdVQ&fhn@3! zKeDRchdWm@0Uem&&U1Xd7l+Tu7TjaNMS5Gu(R#vs__&cI$Day4Lb=vDcivuqhI;k9 z8bx;j7SZ5_!Tn{9XSabB!^WLIg#pHPq~x+3q9z}I59J(gzk=tp#qVmD6I5*px!L07 zS-WTLmd>?;M|6o#XLwlSjNVIbHBPq#-7mrMf^G-sQQC@2St!~K0f)^yYxG&>(f_Jv#{td5(=+*erEdI{=GuxG}S`qET4FrZy zGq0#__jRRweVz7@^o7<#bNlJNkehrQJ^*;yqqFR%X~$1F`3Ka!YpWw!yYKe&T)r#H zcf@zG%RvZ*bGY3ZKZbqp_SH<^FyGn0!+oLlskF4*ab0?S7ABoHpbaF~^>IY}p!~Ig zVrTfozYF2c$uW)uzqjdL9EQR2&dJCCr}HzyH-Tu5Uzfq(1%G-`+)smkLW}7#_y-t& zd)!NdFi~osTm3`!+Urktfs@1OQLn{9Oo7-|p+|T94leqFJ8__yz~x;8w*wI-Cr`5ssR15H9!vJ`t3BLs7=JXW&mS z>hotF!Wu6J=^9?%z`Z@dZ}h?+);_d%$>}n_ClLRa>_#Nqx~Uj>oaT|nwR&l zp#L$n3-c5IaqOqArm(k0ZbMFn!2P=%Pt1oBAGTRG!^ck-st-C{)eaN@SO5M&^E{Rh zv}ycF^*qDzslJ5Uf-b4?wri_vsDI2q)Lyjn*MBxD!*bX9JcRLAXZoR9>+^Q$^J;C( z&)53ALgiHN3BC1@)5CFy^AytaD*SF)?*+ehdAjK5{xUhB{wBT4e3zjf8uy#HMVdJ| zX0Q9oAuHuKZu{Nygr^*5YJc1+ml4v}SKge}ll9=r&3o~WEqFBf%UXVFyn24p`=f}b z&vw$eh%(xzToLkji_;~!;rQ`j4L|jO@JoKXg|B~>yHNmKtHD)nv|F}sw&iVEd&WD! z`FQ2~BYTXGdHf#Go3F!wq}lsExje*uwHkM|P9r+22fdy0@hM-A(DzB?(+OycZgG*- zL+3ZkyDf4RS<2fv~pkuRjr?5su4euU8Hyy@Y)Uwdfe46`!)hf4JC^t{tmbLe)C#>Gps>i*3vwW18YSp987vx)=^JP`+ z`wiKbt;+?PEA8{;`+|2Jg?t>1JUju~q+fgY7#mXmWWPm|;+{H}uljvOl!vE=(82gw zdT!BE&Yu~_PdoXk&{OZifTRA~U#AK9eE|=p@eKRRM%RC|uV&%j82XaR1+LoYda>H* z?N+S{`eWTE?}rDdH_q~Wq=Vlli=M;fBRzROR4M5p>houFzDREeKdZG~ziREE{L#E^lR()p69oy-;oX$mF4)qMg0&@3+%lDA>I|#f<53%wF@A97W zH=n{?S?Wdm!k&$Nh~_-?e)z%<@;B*0;-b zU-`eazQp@vHCV5l?m8c4wPUPn-Irdi_4ch+IX|Sg zWM|OsqN`Q~|JHi@GoD=Aw#wT>=P{~PyNs_|zpqx^=HZh-81XE+%fcL|=xE2%>AOGL z)%YLxh&$Xgl`X^ZPGWhA>*I39@oIdoZgBd##e~7r?q)&dK5zf-{EZgh`+#{x=M@*( z550Fi_CAl-y7H3yJxnoXpoiX*J# zU}fRN=hi&m&(i%G+9w&iq7TO`@w|P}i})6-C{idqx|c)ySDmZ;eoXPBcd6s+j*J^U zV?Jyb;t$^~VL6@qp(Jj9GF{3N-ZQSFhPVxC5;RxEA_pw99ugKTL zYu1Dmy{re5${8*>AA35D+&H~76hTo0j>{LUq(v=dIr_I=sEI5bIqTgB(Be66p@ z9@aXI$|wIw*Hqk_DmuFjw@cNpr?z?rE3YSYI9qq`YV&(OUAFZgmS1i3`c>C>f9v9X zW;&fmBi+A{*~P5}BH$SRu`HhTp``FTCOU=*nchdgKkUfw^Zu)Pi+Ny zqVoMK&7ZvI9P_7s;sW!hV_vZB1n+m-wC{Dz7mbc8?51Rota{SoIi6iUYn*(-;&XlI z1^z0~e%7nRd3{?Y2A{?jbH-qKg)^PKPbddUIME4h(8Xg#r~rQAv==#O#N z9}{RV>Wyy01-l%#Pz|>Ut04R@_6RdzJ7U&%X?YVqgto#7JqGg(fc!!PsyX^ z{gTTx&)aRqVI1>&UNtUs!yZZH-yG#<>pH)Z)l+&u^(WQOtAly<9~*t*r`l)w!O(*@ zJ00b8^y_^d=DGPE`qi9z@Mdq}Oh4&~u#dVUFJv_I z!HCK4)Z|Gi%pc`--j391~FD(U9xC!vV%7MQN;iG@Y!S|;J=^S34f&CMdXZ)C>eA0{mXMG>VeGb|i&&R%q z^3^r^=M`{<>#ng3pkaN?=Kvmm9Kb~L-&8> zE%w>K53m^HRm=FIe)R1qZ+x${E(gaVcON}Qxns{#dDKS~t?3OuE^-}Ju8kkn21+-^ zgNUy-v>8M^1fKpH*VEOw1qboQz4ilmH$G$fnR=M6y8WPqtJ{6PQE44L)*p4gLhk@} z7x?+8^1PLnzjfT3%r9piH$3ISwuObC#|}s--!o%X%I7=%x=*@{^`Gu2rHXPz?E$#D zy?&qD4Z4?D<4?D^(cyPT`a3K*OTTbl&>!b_7y#FdSR&~oMWn}k6wh_v)^WbT(=5K^ z^?EsLfqC}v-*0|iKWgL^$j_Ece2DW@T+d<7a+_tt`wrYa%ivCKTX=G}>)maOe113; z`&@dTbu#vYG;d7f>pQ*Pt$993r!a z240kxIDg2CJ%{`^Q(oT$0yyC*H&`&;uT{l*w$?|>-7cTyJAGcLX=?)NJgC~&k#>GJzkShDn3 zZ#`2X50Zl)Snv$PE!?X@$N4XBM$!K2pfbXgXlDzey#iJyh8pR?5}|rx{v7J!p9#$`F%d3!@!mAjPfTfnBHeCAM$pT zJZqjp{<5CEn;bsLF(ct5@8V~YM^8@Y()2EX^v;-zwY^_URBS$U<3rsz|30?G5tJWt zy{qppd%Gfj-&5Alo5gH%P!8!-zup58zQ*+z$8&=8`4HpWrAUA)NgSN&O?abc zLCDj#wx##(H7~uR+o#9(ITAe~Polro_<7X(q(b?1o=1Et_c@*AhrB;?{zA>uE&h}7 zt9--4TKR6D)#bTceAwVw54!RZ@8??ASRC&Ult-wK#-Uc6FJhSd(0L^Bsk88bS>-j0 z4>-Ni|5Sf{M=?n6Jr1vXzr((pUKnyPn zd%)!tZ7Zj|3Jng&bw(E5ZJcPn&Yz|4Vy^La*LN}0^Mr2}KgjGw`C->@y*F48cBl8l z^iBZ!5nZ}(z2zNN`;*e+NiVy(Ta;HtKlwhdXVXs6!hVNbu!l^Y=ZGf|xDeq@J6H<% zd!G9ofAjHZ2hh<{>y@6q>2CMS(03fio8f2ON?4K zZWfe6cfX%DY$kzH+cWKWz1R3`hm~HjKbmjEU-aV{ z*W+ou@*|-aKj3mo`r3djAMt+BiTPCdaP*U~`?P;az55ZAmEI|dcirdOAJP3J(&J5> z?nH6PUQju$1>S$8Ka$=FJ#n=5!n!R!znQw1(&pn8eSWuK{VU|Y8Q&p2S9@Wu{W|Se z=>33Z@iD9K63H3*Bk8DaaJ!{7-|hVt6abo{=!IU`2{?vjm-C%=hLtb3>k*A{-SH`Z z^&W3ejZ+#|C!g}t6puwY8qd;u9wA5R{+Hb>74+Wcet(?z@vT{W&D%Nf zsr**sKE(IsQs-mT-gSA=xX{HZA(lk?=*owqz9FBBsSp@{lyr)(t)P=((?^qrCh?(j z+S_K8i+gV^Tz<&=hu+<5#e1Tiw)a!^E4sxaPM6MG=pN~@rJgRhsk1%I^?1{h;d349 z00_G=-hu7Kc%yR*y|(Am{X;1}^hOo?>$~3>JLo6FIzvHJdwGe5AhF4#ZLUADwExir?(?L zr%(48=^VS>=T*J5k1G2`@BgZv;{Wt%-cHl37+n24{eV3c{Ux0@*8X_#Lvow&FLJwP z`ULN9>YrHOdWPkdZ}9nlxjpWA%lOQ7HT4ha7vtl<@H-X1FAnx<;PLzC%I$vNobnO= z#{fSS{bOox*jZ#cTx-My<1zfE=%)Sjy{<<6~bw`xC~aza5SUyV-t>tRF> zoDWF$?@Fd3{Z#koYPTdO(+;P0oIcJORlUpQL+#3W7wOQt1H*LFXPjid_Uk3j19HU9 z4kx>&yw~wdFKV1gbVz<4^mZAb1Mj-hB|27lJL}wazTfjj%2kZ7vgar#U!t6RIL3u| zSEkkQbr$t!jT1UYP(JMRa9@@bOwD+?tp*eWoc7NrkVyGyH9}v9{w{~?(;s&KG{ynx z)w%ZjMdy+CP5;64;{?Y6(3kqbalubk0#5B%#W_-~vz6z2da3<|7?0C<8TDkloDNW} z1F>DnA<47asaw3z3Re4;kGS22_sJ|?^A?@&7`wyEui{+3+P{kPP&zlGeUYhs-t-75pHdE<`xr$6CVh8mEK!*hHHqJ-i(6LqCn5x}R|e5}7{LbV4Se z)QNA?YaCwoI@dkOpWeA1zXNbKFABVyuJCxSQ$B;Ao#lT2O2QxZ$pnfq{AUCnAUzpB zCrmtHH^+RTb=*^k#r!6#H|16Pr?R{9bT)|iNO>DUeyuxJ4<0y#WZdI5-{|J~5o%K2 z?@rfh{IcDj&2gKSV7jjxaBsG-+iR`HFPX*4`$C=0o z%r^$N0)7K-Cw$Iq8Bh6n7(Pt%G>)_yw}VfxXFv3$wR7i^yOD}^ZTdV!?+h-!)9rlS zr>*wVdRQ6b?AVo-y_kyn4A_I9*X+Tw-sa`RK2PWJTP(czoopq_(QW4Ip29l*YUATZ zuk4{EuQqVl&reyr#vj>n8h^TacLI$EF~YxBSw{BDHh%34e>?g$DQPu*oksU6xjsJ0 z#;4aIUFXNdk5<#)Vd!0gL^$dN612U!*xHfn9(0d^4?hfF>nHvE=SR6OFnGOx!*Z=( zhkTQ-ZNyMM=u3~*>FJJkkP3PM$NESQQ!npgc%SpJ-214v|F|m>!c*={e}m@E_}K^{ zjClMX`#U%<6LuBjDThtFU5R`<&EQ(i=UY7M?di`anndpo6vA@Y4>&^Sda{kM+T-oZ z5r88RqhxkAvvvq0o;H@`@G;0c9m^+#_^tJX`G~ZBdAWgseiQ&lc+y3D zTnS0{(;(jJkN8^=FMMi0$y@o*v&K)2kKJM|paK6*^V0fL(ql0`a6PKPn!fZC`O`+s z&hVFy{0zuF(cUd49nInqD`)It1mMzsYOJ#^(R^u->+vx*0$e%c`4*qZQG|F}hKKxO zPiz)HoWeI-xUz8ShZivy#=q0uC!I6}KN{2u>cc20+SeJd(N zpY4(ChKF1)wML!r&IR59G)^y$cQVyK6MbH-V#z`;cP_o4d0k&Wc>Ajz+5V>kMZG<% z6EuHzUv`!1I~I1tRM1i9kLce%^0&kJ6mmj7JzL|`x{OcSk5BzS%9UOuKVO#3SGB*D zzRw+pK(l_&Ynv}Sf%RU2n7Qq|u$PPbEg$y_Xg5sy@KJ0(KI{dcXFqKnzs}%V$G_a| z1?+RrvKIj7_5!7d@aMU`aQqshqjmghw-@fUWRsJX$kT5_W+xyYi<*FMc0#0U{=5_Mq<1XKXLbVeo1FmP>;(81 z0`6h>W+!|Q0XXSJ@l$pr^`z?y6adHY&Gey1*fQG3KI-umh0-3O{Mq>W3StG{g6>xH ze5>c+`08KUCw-6nHonHZrl0>zYv)$;d4?yAudFP}Rr}02zSijJjxP6nlg#hq#R~X? z`ojCmoZ}<-#rA31?X9S9v_JKRwJZL7Q^rTM7ajS=7SuZj1LI@VTXH~n(#3X~H9jI9 zB5mgOY*#$=)A3s(bAKk9eI;ZsXW3D!e9+eXuo1gz^ zJ3I>vuV1|Zzd+A=^DK?)Se@oeEuxC^bZLJ)=4G5$va>G)GWIJ1(?9dAmd);^*#*ZC zecfB4b(8%eM_Lc$^QMQs{`IdD9^Ti--pya=pTJB#aqX0cuXS>{DnjbE{>U0mUH?LT-+5NGw`>A*6WRH!#%fnMYneqP{^&NJ;KF9BMwZ6pij`q9rJ(lmF@ioWyDB@)ovtEDkwf;Q;M^oR+zs>9W z8^>7R>%PtFyCj-hU~dhR?@~9M0v@_1Uq= zvCIFF<@gxzG%?~&~{W9p(c*XTklG=%Vc&&$arI%c-;T}vMr?kIDEyI5r-_xji9<+ykN{p7~ee1WuCYyq^_hyGmjuUqq4CWG!t z^N*hHCB;GHXw6?*{CD_0ueNpH6`i-ag{R`Zdw4U)Q^xi@TVvmem-uk*1BMf49t z;`{yJmn^^LS<~-0$>^VcpX;gWVlbTf(T@1Ps6ubaew3X>JN@x&T&11$h5y;NyR;uo z`xT_xIW*3ndSUl2iSekj+zs;O%{y)1MEz{Z)uaM+pd3=vdB<)GYh7*v@x;q{CY{Em z#ix1$Xb{rOsPjqZ#klTb^@)0nEhm;fJxv=` z(EitZJdg31ehZ)N!E&}Ak2PKJg<-m8eCIkA_2TeFxcR6rzz%gs5dpUoOhHtkdsyo8 z%4Tty!A-?{fcu74e)x|e)yhBaAH95oX8CTpV-!kNR1D_?CZb55u~@T=rqw zmk2%3n&;!F^7meWOmLkIlqQr9G7iAkx+}+n|IK*NOQ-T%jZeEC+Uxcb*Ry8vbKK#T zuSem9!@EnCFV%Bog~cnZciL3%v7lRa@&xM1a(0AIyDMLhDalkgeUFjk1#u>?@J(K~ z;0N5bE}q5MW)HKUvK?s;ntnk0(dizEX7Nu(Kg-SKphu$Mt_^y3;k6#T>ipiuMUQ(wn=y3u-OPT_oA!H` zkt;ws?&V0^3Au1@`ftBjp?tn;1fc*mfB=qSTL ze`xB5d=H{NK5WN%m>$x#kKY-&!tyN+xoKjAq^nN2+{)AUfYmAwSBussItWL-H|t)= z6Rvi8Z`f>pXX)t#D>}=(VLNF)>2|Hj$@BZ`g4LpX96#y^QH5T4!0`>a=hfsQ*0-p) z=&D7#3_hRFZ$^FfeV~>1HkW0Gclk-@k!K8z$>(~@_v8S+3oQPC#S`DGevs~ObUDlE zSZ#cFyRx&?3D&+{wf3eyzB%|oQU1p9!|OH3kEe_dt+V9xJ3r>C_h5Z*GCn;zz`tFH z@5OjWd7u31pnWNM)_U%s94|0ArXHi~QCQ%J?}NZkAKszXD1N|o&T{>-c&X+!?n};d zxu$BTTtE3=`*PAO_IW)VT_OD&(~V*W@|b=N|1so0fbwsQ^Jo2b-r{(c0T6E8(sA?i zeF<#e9+KTlJd~8qYL^#=>AJ!j_0IDXa@~3d)cjK4X;L2^$mENBx&;M_U$UdeF12FP z_r5wuu;dLM&vBXcOYrA;yzE(ylSqah^7wlD-MHmh;{)MIZ|@w3(|6#Vi+nw6@iMQs z=9i0?Ej7TjeiQmn=RE8C?%PK?PDk9&KY?-LLYBA9%j0}w3B#*B%yuN_Hnlyx9DIHn zKbysJiy(fcPo0P#a1;1Pe49L&_S3lD!gT=ITbph|0FLv4XW(~syuiW<-$@_@j&_yd zJK2K84n*@O>9p@<&hmKS_4go70)0M@VSmo`F~=c(U#)W(Z0APa-@-1@d6K!#^=}`2 z((DAuvCbh7-;2@CNq)9CebmQnxos!B=@4T`$1eDt5ikIb>13IWljxeA5f@~}v#J&k z44oL47*B|5qw7hvf3@f~!_Ru(l*x5Ij<7#}>I=Gb|6$ytFMGD5^_I;JCp&-f$v%&n zTEWs$e%Re(w>sR^xcjt!DNl=IoxF+lW~OvD`@E)e=l2?*^jM1rb>T!8*CD}{L;3uM z2&OJKFthtf!Rr@#JG0+2EW52Iy7zfImyftz(XWTouY0ptE@O0lsD)06U?DxGc-=c8 zc+NX%**#|ZfO?7A2s-Q)=Gk|KZT$Qs;OO7@K7S|XVf}tJu&r_zP{kR?d`zBc^lsuZJiHZRFb-KJlP9JO8)@11jswaOV>K^)P*X ze@%J*ToZWUw-L{EEc$HM&*3-iD$B3)qX^S!U6IoKJC`Fr{5JmW44-xvdm7gpEPvQv zT7Ss%|KOV8`Dt->ln?cylV06)ZiIurO&3KN^~L|irsW=%e0H0EX8licO8xhXfB(M^ z(Vl1nG?zD!ob+60sgEmpzRiCzJm2QOJR!^H_cJKp1j;#xb{r_r$;9_rpEz{z!y~C5 z5FXdA9R~i_554H|5i5`UosT~!e*MdbsE67J?+kx=tbbmrzE;t*q5M_z5jpecS^1gF%E=YApgn5ro9S+bubDuTyKwgw%)M|{MLMI zdNZ{!LEYm+{lc!lym`FsKWe>~a<>cd)DyemcTVwpfv9&F&vt#Fc0TtW ze1Deg-}L~3o4`Liw+?z&<9Daw<1Y0D(_{yz+;@kZRf}BD=k}x3FYGPRS1p>Yf3;su zI*E#OekQ+n6ZJuo&5wTv`#I9T-;Vs=dW`%&|69!O2Zr!_azMUYpz_$|TjQnVT;tt0 zL(b1WD!%))9M4ssQ_i8% ziskc;q`$ce1ATrN{r%KGXZrgp15f9G2laToOOf=r%lo%NzQ6O^jL#o^j(m1`{?_sN zAnZ1cm->Eq@+^+(utS!)yi7nCVd53tc|ISez1v2(|6XgvV{oS7u5p@n!%rZr?e zNBhJ3Nyozj@ht5y<3-z&i)0TWzu8044<{hMq(k##+Sk^fnoYNd#y!96jlMnP3F%&7 zCu7jwnfLcLKjApw?dR(dbN2V=OmFo6Iq5yJ{dRROmvh!<4*M<2J)-?qqi?`|3;RxT zaX9P@pX9|)ZbiHb~&a$nC|;4$K2kR5S!22O&;eRtvtFx zCA&xG^#}F0-#6cvOTYK`-%jU|foGVg=fd{5=srI;}RF zvwu!2^w0SXPuKp@3M{S=UhAkj-=*^!6G-Q}=lSs80DQVPYQ=mHFS*HzDe`x&Kf`(9 zWggG{Clp!m{M~1>dC}N)o__ti+<)VarS@Y7{t}+@!yECrA2=%?!gSYfF|T;z{N?t8 z`(C`~etGkAhYlV5YLj79t5}Zr7q-Fwf7yEv__oUP@B2tzva_5(h#4U#kPrnj2L>Blx4b5X$x*k!7cxSy1=y18afb^f9noF zUDRFhT-Q1GE#22IHnh*v|NDME@B5rK9DT3ry6mFyA%Z2^=;+Y&f_cM2Yo9!I` ze2*ixcpuA2|3<}R9-yC{s{Hgmq2Bk}P4-Ut(Ag=Uh#QWt&CGjteC(q$|J+Ugaq>mK zMZT2(r#%44n2-D;$l-W=<}+Xawzs*yj-Tyr z9>;Dxe}BDU*E5$cLPyVWYJ8Yi<1p_J&xd_8%2Hw9OqYj_UzZ!F<9XxnE$IEOf}Oh0 zxy!4r7jrIG{5#IZ^}}!T_ua~zyA|%fAr%$fms0m()caEU`w%@Ue$G$L+r;;u+y_j; ze$jJ(_`lyPdYI~n>q$Syz|05xTb5&c;&$}1(T;l5ee1$^;nY5_UWe)ZTpf?zALDv| z^rv$Fmqbp#I@1`(^t>Lwr>^ghaeCGn_B|)4_RCI)4*mW0#|B*H=S_#HpXv8odEYHS zDvqa~5}@Co(f9xK^U$pS<{u4zGtZ4r_n)^*-(n+uy5H%3Q9*^wDc1YhZ?|85BJ_JM zJzc)+clpr!F=4&EO(y>bmn6u z-&KC3yN*=PrSSa^56SiOCi*>Y{k@~b^I6OBx%2e{ln$0mJKhnC=Ww`R^1Lf-)Te$f zEEaX`_tD8oH=S+zcR-!>bNCmB-0SJ*@cI4pn8#cyu|>EO8&4nxp1d zd|&u`W;wgjJN3^o;yi@&!-tMve{XrdcZ&5Rx|V*vRm=5vWAyt2`u;uMKU_S6b3@}e z#n1JyxWRp{dRmmFhmH^0uXDTRa_0G66#DrsUQ~9Cn@Pzs>UzYGeFSPh0ET#754o8LO^>upn_a5~7fr~rc^45O5@I23*?)^{wp7{ZCqBh05 zkK*O?wto5#9s2w4OINtObiO)A-Sf1RI;(c6|DM7$Tgg>_xWeNmSdZ5ayK3h-2KAFp z`O_EAa0`ydi{g=Azj%h*AUPb@Gwa=wV5|I9i)X0yw+f{FnZ9q&#q5kXB3>({p94HV zk#QEeo$-@IbJVO+)eg z%po-EaZW#v`+!QX?B7;O*NgVYvRtPXo|~)RPLb20=QXF)&b zdv}hU&W`*#CmLrThVwtaY`*nRvgh}p_;{?_J@Y<|tDo!Wc|3Fch+8bK5j{GvP5BF1 z-__Q(M%TpL-{5)j!_*%6(DMNr@d}UiCdu@7*JMA)U$ss3k1{LlB%p@MiOYq7PFLxD zs(MxNZYy_8=|9x&%MN!yw}blIT;1YA`e!-=*oY+In?wVfZbUDEaEx_Uj1=)d=b`I}AqJ$&fr$fbVl zs+lEjL^6JA_b0gVKX6Ds-RFhobh`TaB}Y1bitCN@!|j{>mhK1J=DBw5UGACvrA}^ASpK9;yKgD<-AR{^s&_7OZeT0eTIjVlyUX1t3UfXdy z;(X|FO+SyN-+yF1=SR!A-H7pC#m90n-W%x(Qh2Txp2^Koewdn*Gmh`3Gq?A4z6c$Q z)pNx3y;rw>DBcjsXL?or9M4v6`*-R`wHN(eKGQ!s^`rWSDR=5;9Jy0J>R8CI0@E}FU{L;BjxtzLZp2NC4cat5zuYBc-DXv_l zSI=8?`EWntcBj{edR;m#=>)SLJKsG|>v7MQ@k0xAboRSvJ?^xg>E`ocx~@|%E8K$D z;}GvJaXu5hB;_7>a!tL4k- z}=cJ-QxR5Bs}wUHyG1UiY#<=V!up ztlHb|GS{B{itrz*-{^GlILe2fuj_t#1v_{;3jLFQbGa-ob;tk0^R(=A=-_eH=`X4u z9@<}KyMDwqclPJF-gLWIyh`~K)gB6dYJnS|NA-)IW|uGKkI>S=`&LfB-C;I)$+2^_KY|eSEUbkEQevr;r z!&&a%_cr&>`F^#ozgXJU@1tmJ`uC(dYrj-O%>9i{&LP)f|95?>%cZlUVQFK0X={7q zl8#Oi#=5%Vt%)wXtKE(@HrfZ8yPE9w{qc^yE$s)|+U+h22FdN+jAly5fyHdOG*Vv|L5FwY_UQWprbb zOF{)XqrIcEX>+?nN~DstgOY0Gh;iIpsK_azj`jnaV$Cgu{L%F`wzYTfYf>g>$9r^y zR9sYG&6NGi#OSCb=l88`t8773uhguocGjaxBjO5XK%dpTK6qKuQ}u5M_y_9{tFKs^^bF|`O1_9 zZ+`u+{*gOx_=n1zy|J@_l549=Q~kCkY|i4kRxWzGl`7cY6Swzu#A99Y4!f%<)@ENG z?`U5#<^7qT&;HGvo@+lg_Q;uQJO@S|>RP;O^Q*J2{LyWP&!7D{Rfa0wbuARWv1fBJ zujP@)@Bir;_XOAHJr7+!<7?$#Y5DI@ogKPwXvUMbZeG#eYv&%fm@!OvTplD zE3SO=OOL+v;`KLvWd1E%=UxB%ubo=G@bH_bTr=r{!#?`LTh-T=-h9Q#Pkudie*X=r z-}bEZH$OP9tN#3-J@)<+>b`T>Pn!p?5}tk2Uk-fsSG)G#vG&?u z{`}SOz*WnaE&I~LD?a@51wHS3@1#Wh3%_{g-5Z0qZ@=o&(#OAFH`vm7RQjJ^-u%!r zkCcop+@$;8MCXLtgO+mt?ChelUD^@vjCbsJnmBdUmgYSjv5ual4ecFq*Qlkrf%K|_QpS7M}M*G{^qvEc+zg~?y}qW z+IzV5bgre^i`y;nHoLjgHm^^=8{(av?Hx<^#mR@O)y;Kl?R5#d^8UDOwDon} zT}|yB&0W+~I=lDoZEk3$j!Mqz(s)~^QUzU}eLx|=)58#M20i*iD?l$s~OAoYnT)H&T66+!d z-@3S~y}hLqk=hMecXln+&9Jkp(P@Rv?Ms_m6D^$-=U&If@j!BbDlBdvXlieX+k2?i z;vF%2LvtrxqQ_?IIA_gi*i<`I`fZdcawBohtlixfPbR1a;*Bjm|HsL61`yS!I;h_N z6In0xz_#wz;y9}NwK1NycGJ+9Xz7uIDjCwq=d{@kaUQ9<;xx{7cC~lJ_Qmba1PzKC z;+-_6ItAnmHj#KoE4SPBwhi&N=6Ivi+IkXkYRs*%u7;-djx*leNW)h<#m4`q9%HxB zIN^-k3#l%sCy)lzz7Xb@SqpK2_&rzPI(j<@z+8l&1`t?`C-Y8UQU!%nEH z(4U;4EZ)d7N?x<`JeKFWP3<%&bhl9|8k#sh${uAUPE!Wg>*(;U-Cd;aA@{>WV!ZMH zxOxj!LD%gdUr4^9k(*+ylUyfv5!-E)YwgZ>%ibl4c>L0Mr;F0 zSW4q?g3i===sH{u116>O{$^2G0ts}`@tS^ zA7_({OUYyDyt!q0NbZ){J88t*+uXsE7)nE7Iuo$T^VG7dq@w8PNwhb&by0fh8aytY zLuC8iMDsN_)0COzXVA6RCz{Xfj&(F{pv=&W^is;AGdJV@!D-ZeeP?rPym4E17q3zH z(D~(fwoo|j3#bu0^SMS9AE&9%oVjf)U+y@yqJriHdVWYY@kW|Mwzo}SsW?C+F*$cP@E^xx)gSHP&%yykq?M8(P{s_55-Ii$bej+Req>ytjvH)@bSfdN5}eXasgDmkLO` z3|;$n2TfbXk5-$|0@@w8DLD7tc%$y+JGx@zp!V(RYHpzsI6_m7t_{jI;?5|Y)=5ib zYUk`m))z9vbg0d)PFhIo{1zv}Wc!XiYJ7w7bEfKxyol47>sw=;G?M9RtlwW--_>5f zf7yiXsSw_oi5wDqIR%V63(E;E@9372_i^S$^)%g_@KSp_;_=JlOWjkUJ2uwS7{e>n zcM3-f)&u`WDBWY1HaIz>*f;NMqXh{~qY_-ZHg7D@l!o_4XpZ5`TixXeP3dB7jWjZh zpXEZttrW|Ii7r?<7bCNCnrWYfeYx+M@r2+lYp=_Fj*xUB1jULCw zNtE39DTaj|Ay)9b$KL49G3>3IcDk}XG?dV)mGa^21=6ljm${PPp|Z*1oxFax$yqub zgo96D>?Xgk$yF#hd;fABisDeEWL%Avx)^P~aw90+ay5kZdCS~vP}WqIw#QqY-3ada z)V-Y`s@BWo5{$KBHASPsebdCOG;vCnZFzOGa@-sQBn@rvFls0gj=3re=9F>OE3gJewhd9^%A zatqg)M{kWE(3i3IcC@!15}-L&Ofm1zh^wenkvpV`MUUM{-p}4oA)Kj`+5237qQ)f} zka!jX9eO;ILkBr!<&03{Mj*$^@lA^JzC+WfB+kTuLhIhU*3If#-EY_KXz%W5h&vks z?oZbV8=D0>sAE%TCz9NKTs`S=if!DH%FVXxxwi5wS5HFhM#@Yx?fBU1V{Hq%XiZ5& zBX8&|S>F<;T^x7w$FSF9*xSa^7}v3w1;mcHlQ$uuR9*So7Q8Yk7QC7c@fvfygU7tL zJq}HmS#kBe6vJ`cO@mX$lmR_N+Ro~dR<`jZ?bPtD&RV-LloeK_yqb8s5V}{E!(Kq^UWe> zt5OXL+|f708>o-Abna+s?`~;4BYpwhBoKEul%r5xl=q-{!^+(wqDgO?JHEKPyu4E2 zIhSJ*@6uzBn)BJtrY~({t9>kY!(*e`MzpmR`60S<(QV#gp&c|Q-sV#wUZr24D8;5guE=E1jU4H1) zYo`4UUOMV)(3nL%lZG(fhb!K8qlh6BoMmrJfAaAA9Tre^A<2&7(ggUG1=vGKWGflo4)x>3; zyVTG#9i1Djm#6P+Iw&b^_>3zx1YN<}-R&fSw|iBkU) zW;>3MqKt8^(Y=^LR`qRKohxc-&i1@Jg2ZTQ)6(49T-cs$EN+4qd>kj1=etxBdL5(7 zM!UgrOmw~rWgerJp~FFWsiJb`;(BdIh0~$#7dh)Z+7Vf-w?wG`kex=;Z2JKh&X$Bs(!`Tb(JD)yvh5Cu+fkyPn!)M`VktMpc|z z;TEB)$8BxoXt)rpD^r3Um#r%Qf>rS8(TagRPm@;zfJqoY-x04;|lpgBn7dSe=_h1&O{} z6Hk(_D!50{zG$0>_OH5Kf1%6hoh`lmhI8dXX^u<7 z2(K^QJ$AbBr`C$=^dfMH^WX`shdZ2yK-|Xa%&qv@8Xlly^Z-bkUFaZAZ`4<(fs0$1 z>P$`uy{^|6aD;j@mEt3ZN%ukAZ6%sv71Q6jL{GD5uD6HEO+53_8cQnw==w@+3obx; zLZzk64*f`jy@gsAJGl*f2a5Jm;)QvOj_Mp|(WbK|E~AAq`kg$E#nrw9{p2nXbN5yB zl9P8?`Kr2+)8y4@I)%JyU(NZTaoTlc#X{jl4@ax#7`BeUC^+tN&XC&B-r7ndsFN(2 zQfDY|I#^*Rv2*;?%W#g3=m2W!t8=}FHg{-zqPy=j_EL}B-%L}UCF^+#?i2?t-uPxR z8K_nE4mHL*Q_v+&{MQN~5}=1u1R%xy4Uow0jfVc{qZ5W1~?^Z)4m|t1@Z)HoG>q@+wqfv=nyd0=jw9 zE=-4R%`^}1=%Cur^Hu7}Jb0g{8ldg?272hs(5u<|l65qxbw(h*gqt_rOdapU4bpkm zMUO?!jj1l~4OAE%OA6~q=$u?Z?ml{PJmn`zSk8^iX$_Qz;+_+2MDYrPn@6*|*m5g# zeQ|rB;K{V@2A;%kr6g|T0p*?T*Quv>9P>`HkCTIhDg4x_7;)IAmZh7iu5$;KX>gP79zg+|}5mm;^^-&O_MYG!}e0H&k92#P>J1ck}$2 z_J$}L-mIlK=wT)jIZIO`!ws%$rH)Z>Cc3#B7uwuupW{47;`Ah{e}15Z+Hp&BBEjnd znhw*hL;U>qZkmm$d$bgswWlgc6WKd;M+ybhum~KJzL}oX@NyQYXbpiN>|85M@Ov3X=*yH zs#_~}NL5F5PYu+4I$6vfoifEGiL)+ME>1_euX%r*YmRDO?I=?@jMuQ}$>l;5F6+p#E&Xa!I0ICwoataook&}N^W z3wDtgq%9VwX*ciX34g(+g(q0t%v;*q_ObsJ`zMay;ti^pyX>YCR6T$_pVNHR5bm}$ zU08*Lxiceb5!8+NW^r*e=D>6R?N~(Dae^0mU_r&c&`sMR$)N29J#vXHCnu&t1WvyG z^{^XgaOUkZUfZhiP7UX(3fz6EBt0}kJ%!ziQ&{J4xjL;1o1a^*#akM?wr?&}(T<+h zJ@iCYp~hn5do(yPs@6?g0(xSH(Q|DSt#o-%YPhrNHse&8Q}cRB;J9TqjVX+$d@r8z zMNaLIfoS|Sm6{UkCVWV!@d`wh=7LVAh@BL=?W&XZ>Ua)$;Q}4sf<=0t$!>03Wb<>1 zi|hre%`UjOSSIJFJ^%lWNV$57G3k-MxL9o55~D{fX(ZVbYl*cr(9^AP+WDrTtgUNt z+24|c%vJ&zDHm@ zPj<-rBpi|X?g@w4eCTuO{~v!?_&@iEB|P7fmpCC=SCx~LHobX?x`uBRcko~DQHG}hT-bDX*}t96i? zz4P>Ctfk%wphiwwF}b5XML_NT-^iN218mzZuKRIr)vz0HqkHKpdRim$`%vl$a(4ri zM+4UvP_O4Z>CX6|_6KR|#7J{LcMHOKXycvUB6+8`h`1b`A+S)IZ|4sjpYi`_>!K%1 zJNPj(^Pyx;bKy>$dPeEc7Q)XS|4$z3vjP8OmvFzP^FJ27^KF^`x!CD_ZmK2cnFQ*g zwEwC51V8J$S+8uI89&`Q-b>po^a@0*MO*RoX*{_aDaTW7it{~a+U1@=={`rXA-*?8 zW4MZk_R{DHEqecgrT|@M#A(!TbA#_YhZehq#Hjg6gdZ}GcQ|R|C$M;O>pTYp*;A48 zOCYf}%9q}#*YOonY6#raX+gNX{ZjL{ic#E+cV-TH>SR>pJM~{fKmPOMTye&rZ`hCj zevICS!Iwq;1wZj`_*BEm!*Jm=H1ZPe(+^BB*JIWZSERgdf^}d$z z+Nn)<$!HbfY~-_j!a--W;U-KIeR?f{Hb-LoG!qNd+Fq~Y={66&h{>~J4$Tuzl@i+6 zaNicK*W(u((48h4yUbMas{{Yq%ewFQmM$5n7BtbDxSMH$t6#x23cJ?mf%RbmyY@aw6TBY3x*S@&?XM^;)3Hh@nvuW1i0T+D_f}JG9x; zoI7F9J=G5U=O$gwuvmC~i7!yUr-vHMf2>0l9DrL}J7~8jPV1+0sP4k_Xop*){G8?% zeguFXY16HGU0V;;;|~4ywkn*Rv3(n9uf37{tCG-GXa|VSp!b_Vw5w}xupnx8yd2#l zAg8^L953(q(-wVuhr7+?{&e4$rP~wj9X;K}SE~5kHd>wX3v+a{K&P&-amSmA6uz5Y z2csvz)%{zsAHxfKXZx|Gx$RPZwy?8vaU*S((wdSbypv0voYuIstZY!*oqRR&1D!oI zyg1JSI^am1eFC~toJrkgzO0*e*XSO+`)WP84vMvnw)6Ox<6_v>eOixqGQ0Q%C4ND; zSv^J7NR3hdc3vFgCub-{lrtKLDJgC7E`D{?DFwQr)z(NG^2N)yw6`ZX8|2mKO8^u|5tsH^BBd4=lJZN9tk5z019)!+FRd(VU3uTs6|nSU*(a#H-(y)I!>u zrj18dHMs9f#_7eh!i$qJddZP$U&m&=9cdVK#P{;vB|UjV8@#-KOgrfOf~PY~w9-?3 z^h)TqPTSv3w>6!YV;36U)a^=+e3#jXx6!n|gC6qUwwGre9X-XNZe#miXLjN?%yp_^ z@{L$>Qd?-3P<5tFREym9NO}%!k#FH9x}KXT?It^Ils>tjTP53`L2Z&YGn_WbzgfmH za)adGZi76R+oOI6hvhdbO?UpIBPwCv^=hcBSUs1joM!_EBaB2BPb;#=Kj#}S8} zMpwMV7HUg0ZZvMAn*v4Y2Hia9q8quEh+w03-GjIAAS9!d(RTOZ@suS-q5gW*_t(td)CAog3FdKrH%I{>Lv%;76+EpE?ctP z3D6Ncpe9QC#c(HuT35e6&aVI-l8_j$Pido%e9b<7W`^#Zz0-T)hsM9R)!ZWZ7v7#- zxP%|Bpe#6L>i(o#Ne+=KrOk3$4?BBwyi{MCh_y94kDAfe@&ej@jIOoqE2~Ev5IuDbs-@ZTr^-mIamvRs>cCRs~iEf`K))f!f;IWwpy| zSJbYoT~)ifHdwo6SzuZ1vSrJbFI%x}<+4@FRxb-KTeCc{ymt9A`mo)KD~<;s<-R<2$dT)AddU{&p^ zWviC2TCr;7s#U92uL`bOvpTT4cJ;E=%U7>hy>j)c)vH$rSFZ^Mg0;bA!R5gf!Ii;P z!PUWFaLpP@;u^aA8j5-i1zSU+aWm;okNpeXcfDyqpj}b7>~xECHT*oDvzf%>rJ8EH z>{>e^$%%K_P8HC=>VO*HTuT+qzYw=R&1VFq=^<&RHonyPAcONn4bO)8Yft}g9>yZ; zfAgpJZI2Q-O8GFZ#7`^m#~5hOsJmInae?jf(!#;i!7#6lW!|Mb3D@>b>Nl07%v^r^t^x*KlnJLYFor=7j!@Bdh`^z@4^u7CO3n{K}K1NVR7 zt6%%p6W{*M&tIXxds#Yt#=_batJj`<>gKa9zV>EPe(9@Ud*VA!J^jjmTcuN`I@+}- zZ``!`tV*WUW^+rRzP(^IA|B+=&G7hZG;y|;MNt@l%qZ+-j4SN=OcW%@?iq)%P@ z;3JPd_S}#2zrW_X8}7dM(Z{~^)0?+$+kO5e_1E8g%NHJc__1$1 z@#K%EA2I8~i{ALln{TCBFZ=n6Q|Gj`A2YlD%J+Q!fvdju$Pu%SowMo8t=sA@xagAi zT=nH|J^S2G^S}RdN9QeF-5)+-$^>yCZh*>4X&GxGee=npyB^~YWPV(HZzd`Fj-Pe1tCsj1JD z&8a+ibjguEPwCRq6{Qs=o{I8{=~az!O$Rx+vFGj(R! z){3Jmc2{`IXHAZjt}mf)@0Lz4pEh}I>FoLSc5CUo=BKh{S7%C&D!=-lCFfThQCU-Y z_~gSUzpK2e{HXHtD^4ogRJEvda;c}JcG9BKqsk|hq&`ckrM2gjr0({eQZlXNl!~D5 zq_V5unqK2uI(>1;+-Y;CrEV;}`Xfh9n%VoovZZAwS9qt^RHhz1u4{7YM@LOAOTAT= zdU5g}ZZBC~dGMmcQ-i+Lcgw13PA;h`5BfIwCYN_jI=1A3((@}**VG(SbwuTs($xFQ zKXdowS*5jimL7cJgo?>!WvP3s5B|BrW1m<~+M7yKkCq%=GHr@g?(tCOyk!*?UZ1bh zTU9p6JGHdhGu=C*?6B#FduDoPd5@fOOxbMT9M3$@yGk$hK2Y)n?<3x)z0Y``o%~$o zkGwzjzTnA~z2yB>>8STLJ6}5H{aeZ3J(CxleA?D+x7=~ZC$G5Swhw>m!LPpe3*{A+ zt4=-bygv>y1NVx7R=R+UpnW`O`n%+OhLvA78R`fq&QS={xVb z`@VtCef5$5DxWlY=IphnZ#?(j`@Z-6bj6WJ9XJ29(|`55*Wdcq6Q%a?^H1D<*ASe{gl>5mmmLlQ*s@Y4BABjwqX3a&(y| z6f8ZvY-wp#MP)_EUQjx@a#hLNvZE?WCs#x^uU&QukhR+{Q^&t@ zTVAzlQR%GIS59f%F*#gWwQ1wgVc(7^n=7hPZ)~cXU2^8;)g@DXRpo0cst&F?vf|{D zW6twTTQ=pIkMHfCl=`ptZ)uovZJ_#yTRwgDnRkBW>NOQ7mR?kTLe-`!f7xMIXD*DN zUAm@XdWf6EN5*{D{^-QYPyOoP@@bygy_ljjB#x zV&UOKDZ9_nPS&ww#*!<|*Z#(p_aoukaq6x~Q~q@_ALM&j)8uSyWm{J)%7Iv1>+3 zr%pCqXH!~M`KFR-Wku?{^Q*2cpU^=oM_tcLPV&(^ zJ9;+Jn}Iv{9+WdXbN=Hj-gy<|4CD3P33?|z&RkFP1Lxx**Oc1Utz}W`;=|I`j9K=a z$#!(k>x`$rpDGR zt+{he;FwtWkH_A*CA1*W6r}TKwu}5DxX>Dbt zr>4|XNu9jxq>@v7C)RlE)fAxAN8YKT$~)V$mV=l2$fU}9l*j8`L*Ag&OWx3PthdB7 ziMfmnJcoOaAYVb&6t~Y)QBvhS)^jq2olGJ96g|aSQbw+%!aK={m6Jpl^)eshT|?>9 zSDEbzdrCbNxyR=@*W<02?Azn^+*|^LSQI_0Sc|CVA#ndiIuj$|+IaBfX_1 z)umJDXSrvZhh8}=ne9E6{ulCkDtsRAq)HF@XivBIIM4o)Qg5ZFyyPcT2$b3ij?wEY zukv~Vb81Ti#AP0TzdNl5`q*805O{u0j=PX%AF#QQ|Z@;pA*D!IuMwXO1I zuT|=)vb_;6jpmg0BfVvwk9d!oF~xI&@5o6@N&=KOuXllGJ(axIJDKve)U%vo^?J)F z-zR!~p4Yh8JoM3->gsCxl#%CU&xhy(qLj;0e@Ut59*W=cMoKnKsx7_3vufHx%4bzc zEyY>kIkjY7na6jUXR>!iC3O=|eF+yO6^iF}Pl<1)Q?ee<5uT|PC1sEMI5V@jRH?4m z&g1pC&scyPnyDi3+H=6n*2TP-L=`b7t{4?5=~VGml^U}O0T}xXUe}-Qj|}09qP4Cj1%dz z^kya>|G1;lQlBlhen#JA)%WJ!{mDw_Z*j8Cag>hf{DY2(;>*R|`1t(oQr&}x`ruloIoBYx%*{j%QEe+AvtBuIZXMr z6UeWdK>lNr>vVRcD=qi0NI212w-8_A{Fq=0s@qr>k-e@9j#SE1BpWXtmLE?4_;`S>TkHOGz8$UYP5J4hKU3M5@-LE1_fu2;lp+5m#joq1 z+uSx4k16Le(B*8(*OOfP^sFj>Q@@?`x{OUZj~`m@yQk9mTkRxr>R<=|pabQ){7xtP zGh7p=ZnQnhwf#Y|pQ-Hm^kHJ%Cpf=HC|%;-O6U5Fr_ev$mQk+94^z(ZXnBU>S;LXg z;irEmJHO~VimH5GC;cKN<9?!TO?fxTHz*rZevo9F#*u$`0{e_1@1=HctFWAZUH+z= z#|QT>Lz5pf?9V3oY!&wC`zoEkxxjc9{i{;)9VB0+ew*^^NzUcK$0zBZ_FpfPT&H0R z$#uIk<@b|Z_gmjUWx+RaAJAb<`BG1@Kbi8CB%exQ_&~YqE$DCFQT%!wV7m}8_kVr- ziRKa7kF#tG>2;kmpG(Z;$_Llo4Cj|+jVga*>Un(QHpYi3_fk5!Z}4HtM@Y_ni4RkL z9?5mTzXH1;=*!lz6YrpX{$+!;rIQ;%f zYq|T=DF^M(O?fNnb$y&k_WD}f&a}NL=Q7duJ!C&$#lOq2zk}q3F^c5cFQ8oeg{R0~ z&r4gV9CeyeK383YTp5oI@~&N-zI({=S+$Lv?W?QZypIw#e6V3#Y`=Zun%>GKX(U#-qLWv|ae zJ6*k54&9VPUFN2IKgo4pH09Tje2P;l-mznY#C$PV10{KTtzKH(uVaCIL zOw0FEee1Ttb~h61IZ}#Pw|i6m1Cr}G&-4e1_T2WS(LX*+IgcsY7cV4x?Z?g|xvn!) z{&kWsrGI>w^68ZBd9GN<>qxHa+_b-t$R6@{|%ClS6?jW zxhx;1{WnRjeILrli|6qP;{P$pb=xrGVflFZdU=9)SRQnfDbo21l8={Pmg{tGq4ueL z=ocssJ?@zDGOG9S?D_B5=yq$`v;1(C9#ih0ARd;$gW?&;68sJw~^Z z?QUgn%5NuG)j0A$lT7;s(|#Alug7jv-azuTDxP7wuAZBIm}It+*JXPl=CH zcBY&+4QwS(Q1~O&Z$4db#K+^B?#HJ5Hj?Xfnexw)T<6=Ae~sjN{$k4CAi16!oASSs zT(=QZPP>`~e}i(}eogs8vL8>*^{M55qx|Y?(Pgb!Uns8QnZqA1t{a$Fl72q_P{#$t z+Gn!pJ;ZahlFpwb);^xaUnAE3pZSNNf1OzSRMuBLSezd+pF*tbgn0+CUaK)*My!1Z zbB5Tw{`ZI%vO*nyCf4nWMbo}0^+96odsu%7vGyU%2Z_z_A1Bsz%KFEN&Gf!Ntos1# z%fBSkKabcf&oHrhy-SI8-{tUk6K~=l>i7+@?w>50{^iPo&tMJ_oAEUe&t!!<256pZ zYoK$I^k(^fm{^YuY&HbppCdN&=Xt2Iu&2iMhZCFSaT2la`>el^*sQMu#OD0rCSo(a zpCZJ;bB>SA!6+_*kli}Szgx>oBrYsVlzEoB-V2m z4*v@1|4OXK2-epO%KV3kwU1~00b)I-Gha_^mS39KOz$^=Um-TrU-1>mClZ_Ky%6|D zVzWJFh|T_+B{ti~FNsg$gsNluS7mwm!JnK+db7Sa5u5dW5wTgmz5TL%UPgNJdY>RR z`|CGB|0=PW-br7R*PBahUT+oXw-B4<*-mV>hhAc{y=92?7|%uW3u3c>Ry`uicM0)o zU3hek6Py0(W@0n`hlo!z?Egf((%^+(m+9R?tk;5U)&qPmvDyBfBc5!;_Y$$$eyvAk z`sWdc4Esi6Jy&A!Cy34Q;~T_g|NlMk+{a{kw-TG}qmh{B|N7`BK1&0gUxx70hGhHj zLwj0D`csYY9mJ+TyMx&D_k+Y?!`}La>`%4CW_{NYuQTjFN^I8GQ^aO@yh*Ira2#yX zH>JNjhS>BEONh<(yPnu=?=cA9L2UYy>xs?le}&j=UxPGXFw6fhq&Lgw_{U}Yy?}U$ zk>6fobNu=SvDsgLMQr-B%Kwt>YccS-#AbT-5u5(t1H|U|I6`dB4`zK!wwD;OIX>J@ ztoI%`8&6UG&Gw%mz3CsHB{s*$H;K*uQ}u)#pN=Fp>-PlWkWpTHiOu$S7x5}X|2(nT zpWYHErOQT)9B$j7f~(yZt4cNlW>{_!73e!goi?*E?iol1+-&Bu4V#q|fuwQn}% zPfcLYa$Q$XQ2e{y=&jF`7S}zd{JSLAzQL3~Pjc-eO!>z>ekoP1p1Vy{5BffMfa+D(r#^Fbb-Vi=wHtknFv)eirku-vE(fB+ls6KO zCy$d{$7$MMOLE;-O!;+&ob#j8sn4XglB&J+y{X!xI8_;3e4=DTUk_t!H_1$8B z8X$@8Tkj>g_A_^o-0xV^{YFFnd6Lan@(+;Q?AK#kDlA*+%e3!t+TzhcM;KNUqm*rhM%L_9stZzlG$we$99;Cb>@gyzh_yoWRv2*Lx+mlKlzv zj}KG+DPo-$Q~o5$$FqNS0()M6>pC&x*+}w56owB|eiq5~y4;k%LUKKaFy*5p*JFVx zf0g9AZaz%;)p?mu{Z0D|Q@(xzdHn?PgA>T_m_Yu>1oG!6kiRj3{4nY=<8>i_1I?0uQ%jli*<`B_Gzvc{X9=(sjtwcik7s`wB9BASzTis%CcS>F8U$UubA>U z*=fIW>ob*wG35^=*Rg$)G4^ALIc>?+A6Uf(3Am2iAJ-0Q}&+_robIt^Ee*R=U z`%5N}$4IXIoO#`5l2g-m4pYweAGQ2(su$f~A0_!bW&cx>>%6e&kHk7nJYUygtRKkr zhiUgB#b&olKa!SN1}hDT<>R|LiR@}d(NAlN0@S+L+CV_^7#|k`$?|n(xyF+ z9plBnoaA%qA0MVY%k|i4%6Z)~UOekaK3+P{Ai1uG?UY|VKJs{~{WZ$9Uq-nuD^t$n zhfXKT$Gh$T*s0d+o^{OTSypo8mB`zMY^A5=Vr zL(damrf|A$uOn^2=KJGczxoF%z6tbo-+Oy~(=%_c54}TpztX3k(>Zjrlz7%xNP8g< zq>B97y&mgzTT&@-0)~HB)R($Z(c`|wBdhdD3a{t(X7~Y;^MUC(ex&FxSigkWOc$p| z$D_||7ckPJ<@(I}gwjV|kn_nF;)~dTjtl6Y-}y!R*S{bCI{rVnvG$Xmk3n^Qh2qiU z9LuxDb;@b|r2Abp*^gHqy1h@N$9^#|)9n{gb^Vk&>wXbdoK$Ddk3P)u)ay_GPm24k zjg($n8Mly}uy8beOzw-mkMxBxfviHr=J8Qt^Lohlg8n|@5+j1ax5iI*M)g#@9^2~> z`pnS{Ug4$-?LR};GxNvc$E%+@pBp|i(>?dka?cZ8uc^n?KT7fIF*;7^&})K;!dW$L zxEgi#9p&;}KP|@7OClZv`7q_TkX(-kexsh6$WD(RLllo$Uq2u|&WXwW&$D;P=g(08 zC$iVq;1E?mEBZm^S;TrQWL`w9=hDoVQhAu|VK?dZKKDmRulvyDKbQMkcN6PzlH+-l z*v!Xs#CmSQ`W&&D&QHU2-ypr-V_|#y&Pw6G8t;(hfZ_3ar7z0;#Q}=XY=0+`o|X@V z1LF&jUbmA9Dj-Cl?=WeA2CVfN;Gk+~TJKX6Kh1vN zFmMz&3ET&q0nP&FfVCsj>8VkUO>+=90-ONu1I_{K8{ay9dm1$yIy8rXqrfTPG_X%O z5*=Sk4PKgketA6`xMrc$M}d>Ty})C@;S(V~-~@0EIG_eVo&GRz9q>RomRtus z2%I}h+K0}TTnF3)+y|To9$?2!hb}+gIg)MQ0B{}fAaG)!f}V*!MoE zPXdQ~rM?$<;CiXAe!t`qVE+wLAHGrYAaLp?sUHFk-6HiF;6xwjfroFE`rrp7TenG$ z0H;1E^?BgThd>XU`}#o-Y<*1X6TnTkOZ@78aM|W{He4bd0F!CFC;g;A~_8l{*BZR0*}51 z`qw4bZw%;%H)wfDcd|dLtU6P0H zmt6Nb$^Hi=k9|pUN^Ll5{}uf@=!Yanzb)BT8_0_+WJn}2azE>sJ0SA9C^&@Xc z_Wwn46xe!G>W3zIg})jD&K@T9L$f6J&z5W-C%FkY4czaS_PzXKui-yOfCB-k?*+~Q zM{A}1&~nN43dvF6L0~&5?K7uJ4xc7@1i0yRsUHKj)=7O6aB`#6=Yaj2q&@{ac9zup z&y}139^5YV=^c{&J0%BqNzMWfoG10c-I51^{dH2`4{Y%Z-$r}MT_8Dfk>pX}-l)`% z#3cusC1+YBS0^ObbxQ6#AUSfm->aU;(esgjr$p3e9dIu&eZo@MCxDwOrG5Z7Jw@t=fb+oqsnXsz zO>%U)Wcygj$+?o#z**oNaP>SHJ_?)xPR^J1$rB_G0@p2;`hH+vKm+A^edkMkAMhw}-~wr%1_fYaAYeefp9Y2ff}QXl@PzX0fj{xUhkoxpbB-i{@a_DE0)4*fEeLt7>(HA8*y(GCGcoew* z6=@&+Z^nsBybiube4=idbZ>Y zaN-=P9{~<*mHN;&$!XvrV4wQdr0#Da;A-_vO0Cc9Z$vu1*s|*C0+mz=y%^2kM! z!Lc%woWDwP_@Lz8t0m{JksP>A@+k1&`=q}2 zddW5Km+Zema{5NedEn7Lskd&Goce&|@P{M^)dS(W{YO3~^~1mepOE_gwB#Y+F<|>s z(mo8FLcUwt4+4kpmHIy5%!5*2_hrdx;GwTd{pi;u_dX)I=26K_z`n<%zW;H_IpC4+ zN`1}uBsYCu@*r^VDXI7UP;%e1lC!|6=RprV`g5u8dr@-YWyu4;nO{i#FmN8&_lmUl z1BZb}fV01n;jK~0L%=!UF<_fNyh4ZWFMYq2ocNvOfmbDmUz6c`%coP0}ioq9V{r+)xA=qnTX8>y7sR3&*3I6YPBebXd|fJcFws-=Az*qSc&N#O7d zsm}rr9wGJiEXj4iW5CH8X`cbEK2qv?foqPI`aa<7@lu~zAlZMSsIC`1XCxJ)zOMUc!uUfr_sN)L(HvtbJzhA~T0&L$P^4%l~#j6VQe2b=;P03HS& z1Gf9*^}@gj;C|pC;8Eb}TV?z~;3#k}a0Yk;*!qBs-wzxCP6DTav%q=an%m^{LcmSH zeZYgjIbh!hW&8o)I^Y!W0PryI7_d!$sL=GcVc-OCKkyLnC~)rM`v7nqa0++;co=vL*#4xvUKlt5+z&hiJPKT$mhlIHqrknu8Q>9M>rNTJA2 z1Wp5If%CvMpOV)L0XG5n0S^M_fPHt#_yfRoz$xGX;9=k~VEb-)y)bYBxEDBhj|`s# z?!8aybHL#*OMNf!$iq?}8I+vSTk4yD)4-wQqrG1TGas)UXl=?B?-qWRi5IA~<)b|3{)Jc6Eu+=E_HgF1f0N59o;RC>Z zz=Oawdu8|#a2hxZY&Su8;6C6ia80ue9|2ASj{y7MCBsL7Gr*(3R;vsj1h(3wz79B< zkoq+6=w(vx?~pvyC3zG$v0v&lz^NOgeh9ekgHqoQ9JpQT6TrSZrQQbi-zD`4;9lS~ za1J;yAmbbOjN}pEG2p(8v>yN-{EE~^zbbj`5y|$WlIwu`fc=k2`|58hr*f?@N6zaLrRv9{?T#wx5>v*0AIta0)mFocy5-ANr+a z-|r;X0VjY{z=79f_z~dV-%EY|?~(_-6=J?JHbZjs2+2v{!DB%`N3wseZ`X&&h7#} zPjX$I5$0hfFLUQtx zl2d8P(Yquk?v@<6PjYlXa{p%}H+@!e-{&QdJ|Nlu1<6ehN{)O{a^IIEC%-It@FB_R zhb89*C5IoCocf03x^GJE1GXQR`p6TK{ZC4c0_VOX^-Vd+DPZ3(rQQY}0?z(M+UJ0y zd8tnVTW?5x4RHGJQa=bB{fE^1Jnl+WuUBp0EO4S++V=tnDx`j7lH@#aV20F(fs-?( zeyj#~uH>QPB#!{+fqlnIdp~d(xCuA~oCY2Q9tO?>SI?8_2>?fc6Tp4I1Hf5eU#+~J z4IEi6^_dltv%rZ}QlH-}*>{%Yd_=PET*)=SeZbasX`eh#vUR@XP`%_j-~@0la2j|J zco=vT*ow;Q*8m5A!@yDCByb<_0Pqm-2yh0hV9XKJm7dUX4)Q5q4kvpV)8aM|$)-CNL`z2Q&keo?M&I0Fv$AE`= zWcU$a-{n$22t0I!)QMNz*51a$8z6$JtL%?;wiTBFzqrlbglX^dJ?q;bU z1FpVB>ixj|z^U7$eHJ(eY<*DL`++0C3E)294DblB^&z+(a2U7=xDR*`cnrAu!}5AT z;3#k}a0Yk;*!qZ!zv*7dnE}a``dcrql>SD&`dcZQM>Amm19c5I6~(0Uiae z`H74#44ecW03HFhek$Yh1J?of0uKU@0@wUZ#vcT(15N_>0}lcZ1LuLOe=e^d0FD4R z0rvtA0B3=7z}AcM`ZjO~I0~EsP6H1C=YXvoT>mA>Vc;lm1~>~Gd|Aeq03HG!1Frss z3?BfF01p9=0aw2w&W~_`gfe0_TA9z+-R8@YU*XQ|a{NfNf8u*w0S^XMt_6v>yQult}#`a2_~RD($nt zIp9#4w9f$t%cZ^-cnmmMA?=5OE%mpy3gtIR+V@YEoB>Wuk^1yh$<{Q!N3vj1?&w)z`mI{!)F5%ssnv_5i_3?G>-IS*_Hq`nR~x=iXbz^Rj^ ze&7_zsr8brjgk|Q zu&++)>wpJyr9Vw`AXb$sypH15%#^_9dl0)FXKaxcYLbPXbq8A@xyUpZZ&O+CK)b zl=f-hLEuqf>pe1j3V0CtDrp}{Nsa>B2c>=#xaMl99~hN92s{it3T*vahOYq*00)6X zz+vDha1(F}xF0wJoCO{R9tF+=`+g(yYXb*?L%?;wQQ#zS3b-FQ1DplU0gnM!|5oP5 z4;%uH05<`rfct>cz=OcUz@xx<;4xt9cQQXUz&5ZSI0Re=oB-|xP6H1D4+D<^Td&IW zR|DI?LEs2*6L11J3ET(V51awc0_T9ofU94V`SSyZfa`!0z`ej};6dPF;8EZ_u}zyrWTz$3tUVC&B^z16@ra1b~G z+ytBeP6DTZdx86a`+?KI1Hc*JLEs_aEN~8Z6gUq&25h|{%hv~74O|0k1N(skz(L>; za2;?0xEDALJP14tJPK_6MdrU6*bf{6t^-a0_X4MZ2Z4uyM}e&|ncf=U0B{&M3Y-M) z10Db#0v-X*1N;6e(`y3UqhUO#XMxDGf0+zXrr9t0i+ z9tF1kF4I>78~_djM}ZT-y})VU3~&}W2RsH`{STRbKX3@R4mbha3!Dbd01p8V1LuJA zz}7!y`m2F$-~ez4I0766P5`HX`+(EH8Q>w{Vc;Ba9@u&l@(*kS2Y^Gs5#T6r0yqWS z2b>1Z01p8V1LuJAz}8!ke_$Ip02~6207ronz$xH9;52XscnEkHI0u{uwyY{~Kdl%2+0UiP# z2F?NJfh{lOAJ_&C0Ed7hz)|1?a0<8&I1QWu9s(W)&H?9vtrEyTuniml4gp7iqreH^ z6mTDK8aM+y1Uw9!1I`0mrI3GM8#n+Q0*(MjffK+f;6C6qa0Yk?co;YboCmhbApgKN zZ~!<290863CxBDHeZXnp4Db-}FmMhy4{Vh~{()`a0B{I60vrWS0H=WafYZPk;342) z;8EZ_uvG#12eyF&z+vDha00j&xDU7=I1M}qJOn%foCo&#WPWYnAaDe@2{;AZ51awc z0_T9ofU7HIdi}s5;4p9$xCuA~+z*@q&I0Fv$AGJ=Wcq7>ZD2oe2sjKJ0d4|L0rvwB z01p9Yfk%Kxfvri9U*G_67&r=?1nvVK03HG!0nP*aCd>5Nz(L>$a1(F}xF0wJoCVGS zj{#Rtk?HjVhk)yV6TrQ|Y2ZQNA>a|<9B>}kH&v$J1`Yy8fSZ6*!2Q4(;4E+scnr9D znoO@BI0Re=oB-|xP6H1D4+D<^Th%gsHNXMjFmN4k0yqWS51awc0_T9ofUBp=^!tHB zz;(b0;9lS~@F4Io@F=h~L#D3=H~<_5jsiCUr+|Bb`+x_4Gr(EkVc-$q9PlV`9(WAc zI!u<257-9w0|$VEz!Bgk-~@0la2j|3cnCNPoC6*Owho8<1KYrU;2>}WxDGf0oCNLz z?g!2Q4+3X_M}S9xt(lO2U>n#E90ZO4HvuPrlfWt9KHvf1A>b@<4tNwe4?G5J9RcM7 zTn$_UYy$^@L%?;wO~6UuUf_P<0pLO4Ebs_$9(WAcH%pd}4eSRF0*8U4z)ipj;3RM# za6fPcI14-sJOZ2p9s{nfk>%kB4g!aP>wueplfb>e{lEjjgTTYUIp937b)?K+HLwjF z01g31fTO?(;1qBla2hxRJOn%foCo$DCG%?o`+-BiVc;n6ka{18ui~M9qx>H_nE5XY zX5By6Qs5!?^DPA)1rDeOe|7k%oBV=(dLhSNjKB9p$%&IBj|3$r*GLY9B=@b896CdC z8aNLeT@UuaqrjOB(!Oq^WNVY;)cPNjlq|C|B9-XI-~$3K%tA_hHa@BW7iOcT+G?;a zyx-h&dgq+2xcd*(%zw_kH_2}@j|}F!du*5Y+Rp5=J$u;p;GpfX>)s=7?z;b|oljiX zPTF~)W4q}4O*?P6E}yaUe&6=wC)?@EwsTj-4@iAHH8w^2&RcRmS?!^mFH^gCWBdiG z-M-28WSi~YEw;0Aeo5Vbu*c2i{B1gK$@$x~b8k5aF% zAnQG9&s;Cc`i?qZ`P3dSE$cVxyzRPt)^1-rXFL6k?VRh>w|1U)o&L_w3$D}OySeMk zc{?ww9c>T&M1{^SrDNsQc&l+j-e_>H#}XyY9;RetNuytmmga zFYEbf7iB#^?Sib|r@iR9@4Eh?y**RkFWGtjW!ody9a*nVufHbi&uO=0eL3x-tRJU6 zll9`Xo3cKfc0tyI(;mwDZ`#ET@h=G4?Txn6n{8LN*zV+Q_gy!)+j-A*X@{NHcG~W^ z9^Yo?(>rXB@3cL0J>2Eyu1CA=Jaw1t+`YDodu@66-G18kOxAZ&|BS4!q&;<= zd&cfReb#pAIom7G+b+p^MSA?wD|X&LZF}H4`;MKrTu)t3-m}~1-?v?Io&Lbi3$C-W zevRJ#$tQOE)WCNAtnH5L=I3@^m-RaI_ybw5Lc8~~-M%R6Md-Zjda&;I`KzPfREDlc zuE(x3@_K(ge$Ms4b^3z4eHU$)U3V|pdEa$c)(g<<@4FtlZp`fQhOP^;-hdvj{kPq| zd)apSAKMvOUqJU?blq{?bv?f!{{O>t|BSqTU%Tyk$L6GF5CUxwp(}G zp4?-5Ag>44+c$FElh=dmeBinxuLsw8vuuxF+Go4FV7q<5_SALmAv@0;v|VxCT(a}2 z>zusaS#NJ;*=|2PY`grF?fwzlxns5)$8G0UZFj1+Q}TLKy*&ljy=#-_N8va1;=1QY zp=YO)=O>|Sw}$Tm@$>D_lbyD6pV`iTVSDPj{H2?_?tW$G*{^N)TxZYO`QmxoJ=d8Z z?7ZW;_M@FQez84ro&VL&Ypw^bv%lHxmtBusXQp=hitDcH^aZ!Q>yGQ0>-pd9{vFpd z*X2L#_AS>F*PV-Y`{pIv6W8TG?Y!-J>bm%s-M-;EH?#A$oWDGLy@bbiLC#;UU6S*c zYtJ4`o#DqaXsF6A^Ckf94~*sc6Z&+*DxRKOTIqCkvlhskH%l0 zp{nXq)3l&ooyq%i^S065lJW=zd1;hF!MEhgM#X@26hw z+%E&U$kHc~n34m2cm3F-cH$Y5mmb^eZiFC84O&hWi>~SGGqA_H70izKfO@!bQnoa_j8x^t` zf|?;wBZE$a~6iUKRQ4M)i5nRqUQ0Sd9wRlQiAPbE4~zCr1U z&lX7~Z3h_7FiHnUr;Z-Y1>z=-T*oof_(#XE(w&`I=1#+#h` z8;RfbQ;F|d5i^~BHk>GM+^ppqH%qy);5~Jm zmcLE%74paNk71M@C8|A=4!znGw2xe(Gr9%k(>*BJCMZ)%0niPaUTv>&Que=vSYgcK;n5fAMLM2H6Sauk&2#hn=23?Y}o`|Gi%O zZzTN}{ge61^xH%7=liS3D;^{CCT$|Oc#O11(zcuB7>l`eN#ibon>Bxr9EP4 zHp(yU66*Ud^t%eP&Gu!V>isi!MDa1u5@KrMYjGxHKE;&=^Y?!3* z`4StRs?t$COVX>V-CeKyF~dVxGh%>HP(n))tKJXcAK zdOjZDiB) zJxo0z;w^QzL#yDVW}&p2fs)T-JVDQTw`)9#BZ8iT)*`mae*% zlb!e10(#$0xCcw$N}><#IvDzXALWh;eM=65KFDvvAnAM6QIg-vfWDHrf3A>!2@AZC zAIln6$X_A-G=H`9)BHH;r};+K&_ezc>8JVUNI%VACH*wtB>gl$LHa3`=YE=>DE%~l z4fl{jezMqu{Cw^~h5Qtr0u=J6aStoxpX)$cA^$w?frb2;j?|j;bDwl^0FnQ$KI!N9{7Zv$)H9yzIp04YzA>!l zg+BdP?+(-3eERkv9r!R$h}?Pp`MtsO$erQSUmc{Q9J)}%y;9`$(%^aIrulLcf^?KS zjmzP$lsi829F{S1ll}7_XW9XnBc4?_R~jYb2KxOnO0SX}5z=uX=e|O4Bl8@V-t04;?+e-k{5J7(Xs7V|^$fp_{9OD3l<&?w$H-vz z8P9LYJjcib{xR;Gz3Mzx{I1X*;W_d>_c_4#XZCx{o>!&0Tvf#2Lc2SG@W&luKMOfx zhywgHBE_xLIGlIvCW5_PUBua4wNql$KlX1aomEjg=j+$`(D+qa?rw=!k}9L6tM{dN z9^FH9EfTtx5FL0Pm&Cp|G)q2j*KbeDee(>mza=TxaId5%Ckkxx8%N0Ym#I<>$@wy1 zY!`KN$@!8$IbZ6t`D1c^6PHNN7lDG`uLtc?RsPJ6!}C2PkL@H(jMMFn;=dMk{PzC* ziBi9fYesKe)_KB-LPuQI`GVFH>G%x%NNU&gc?KykKfTiW^&lh+>qSWenZYp zl!kUkT*%)_m=UjWZ{~Qd+Vk7gp5Lza{0`DNx~UxZu%#^Id)Y1)@>^XCr+>gbm*Wq*(>eZ-!}wFkf7m^b z@~FXXq=>K&f% zaL?!XlMW+AA^$1&4;+8my@2D-IE*ZX{Ab;ZIDXi@nB%IO#qmyeKF5#nNLR>z&Rxjx z=iNmdKk6>#_zUh5j=$(G<@if(Hpjc%OE~_ro5S(Hx|eeNn0pz=UvZal{8b)d3;BO@ zmoxk|H<#nx?h20ook!?G{y*GR41e8S&G9$LR|Wn5>8|1Un{FP*-*WRg-s4`u@weTz z9Dm2XlH>2XS8@D3cOA#ycdzF72W|n!kGq8&?{y`Pf9Mu*{3F-S@qf9+96#Z%=lI9& zH5~uME#dg5ZYjt6+zlN6jK{G;{^#zs4FAHtj^kgt*K_XnoVeWGV>$qlbqu{09%iq(<)d9)_KW+;2U6 z48y%4)}xhf7`<_oss*NhsQAdpB_Ge;jeqR!0^9&7$!S%U-R%-hQI1zj0}-` z%)=)!{ACZro<;6U9zL1jFL+q|zt4O4RDS-5hhgs`SM~6ChCl1!CWb%l;bw+E>EQ_s zLsLXQCNlgl9)^94+{ZjTnc;u-FzjXI9`f*1hCl4#X$*hR!>2L4)x)r-k?ZmBa~a;^ zVc6Hmb$Pgz;j)KeZzK1951+yCdp$gz;rDp>Ooso-!?4GZd$)(rX82tmhJB9QJ3M?Y z!}od^_BwL^=;8Aie!GWZza#fn4?mybyFCnh9=W?b{0|J@>0#LS$ldPY7c#uo!?5=e zkM7cbFJ}0S{`oA16Az!yaO~j=7+&e&3mLxI!x$eTwpN1wVum~XbBq@eTRVAvDZ{V# z&oO>PY%S&aOBlYvKgW0yv9*=wFJ<_8{~Y5>#MWA#U&e6BKYuyH3p{)|!`FEj<4?q+ zg_OU7;aB+QS28@$!&fm}^f1P!h({|ak0%k2W&&fpig>gW7?>g+4F$&d74c{(Flvr? zG!+=*S;V8Qz^`N&QWhBFTg0Qaz~C(6(Oh7RcM*^F0z(oJdjkS5WEff{FeDeTHz6>_ zLz`c2r{C=iL(Ank#>a@g6@k$*5qmQNW4yF^D9SHk7`;@UWBiQRTM`&8AF($j@G^#{ z(qDmJ%kX3mV|7r5IvzK|_UA%Bs(gW-$aog81{ z-oo*vY@rJI*=`-fFLAJ7h5Q`1p5vFYg)8J==HABeW$x`9zueu!@#SnG3;DTj1H)Ii zdpW++-N*4&Y+(zuPV`QOi_BAj)`{+Ccph8m0<9BmWcU^CpE$nOZQ}Tq?mZm8%00mG zb?&_!zuLWz;{`lI6!Ht*W`;|y%<&>u;kcbgm_mNB>t^_Rw}s=^xCc32!Xs26ztr_I ze1qG{@iO-Tj$i9O$nopkhd6${`!L6Ea3A6LMjjyx`Q>gK!yWFQIbPvD%5f);u!a0h z?&A#K?EZ!0Tiho&Ude4+$ggrc7>?a1IbQ8P#c|?3&GD`7GaSFseU{@lxraHxeAxlJC1 z9!74XhoO&=yWhjm%gDXc!|(ticb|u$r;*#>Vf4Ys-Q!{CZRFnO;de8<-ow!2$gT4* z^f_{G@i6o{a(8$b`W?C3JPbXL+!_x<->H2)484!stsZ_q!>c{Knc-C)Mt_LhEgnX{ zh}=yc?qYa_htW?Wx7@?%FOhqLhtY2$_c{;vFucse=tq%T>S6S!$i2qH=vR?j>|yk; z$Sv|P`dQ=_dKmpJa7}IzShI&hmo7_Vf4qyUE^W&%g9~r;g2zVrH9c^ zBRAK>=&!WC>|ylV$i2+Nu+5R1<6-pU$j$aJ`g7zi@i6*zyZa) z{vNp(c^LgZaxd`kPJ)-@WL;>b#)aI>gGevrj(3l6{A~9*jvL(PIUeaA<#?3)0>`7> z7daloGZyUA?P9p#zRdB7?q501@r)(V3`sr3?up3 zdfX_2OS-OC%n8SF*M2S+SN2Ky5*Ooj;5&bXdPZymtNx0c&-fYXy}#&N#n zl93Y67|wC~l%W!z$dMoa>(PmQIILq%dy>{)y994sk$UVr6rSJv+tiORJm3=);Q2Wt zat`a1d4g?y)BFzGua8Fyy#^^~q>F}P9yUBCXz!Gm$Pwv+0St>0H~lYHYM+Q$g!K)Dr9NL#s|rS!GlFLc26AdJ6T zV!tkZukh7?!I?tRA#pu4faJQ@4pg4p=0cFA*`XE;Fk(7r#( z>_44HS+L(QJHQY5FAZSe-%k7@CNu}DQv~l}^M^r_0?vyuf7%}P_&Xl_l_bCIqoDp_ z&oG~x{?2^vKeaxe51*EMM%(j^1Mr#c&yYJ#ObujTmy=$2z02rFJ$yet1iq_6`!xuB z-#rAr1&2xBzaIkM}9&@QY z{cmu*Na~9x5-~`hATZ05e%9jUY%W%NUdRKRjBmq82}@mcv| zo(fU0dXVq!$HI^LD`_G5UrImfX(JfVucJ6(F2r9m{1Bnxv2wr&>4!Y(N9OAE1y2&TRf6ur2=DToDExo9>N%4P@V&I>d!T&@Z z{3vJo@-hL3aV@B#U}CX;Ve zkT0#jLHFH9>3;WU-LD>@`_*G~zdF)=>Y=(%Ei1Z({AhO;(GNb(&hP>LZQU_!&yRBY zpP8?aU&w&=75k)z<$(`;eUjz!yFU4lema+zbI2iH>OO?`mwn`j=Z5b~gwON`>9e$+ zM>FZmHT{uH`esdkn9|Yiy9qXYpzG6=ZtZLBSSnE_3Wc2b-i4gJYg3^4AS_=YH&o7B z&$Jk2+a(jvx|(ih4J?Ff9!DKN;knwH$5lRlz#-%UC0mR{sOxP3BV4Md1gI& z7RPdq)#$VJY`{bk;iMlFLOz!eY;>BO@q8|&gOATsMaCD>mumV>N(bL-2)5_Q|5-{m ze8>+wfb>WENq;OzxB9n>d36Ok;6FXU-=Ka1@Vyp#L;1$hb34an^_o4dH;&AwayFjT zt8ZaH_1&QLfu3xA_3&)y2hYO8#Iv&>Jo63{PZPC;wNog^mk$CD$6^fe3OZeY`Y+R#NYbj8%40;3+w&lH~Z#WOm^Jz zS^vw{i~fZESIqzQAc=?jg&&WYo?3fLuW}HbVs8iXS8k&EJwNAyYw}MfN?aU*UM+qA zp*xtsh)}Ti4{)v!bR^B3?D?oSkM4dSbs!D!FGyrOkKUGJ)z zp|s-0#nl3SIrk8pOA2`2dHqc>elJ>l{Y{CUFMQ~Hq!53NyP5ao+FcxDeWJADdd7GC zlK6G@p4LNfB9VX2PRXzD)gb@P*LN<*v+G}fW9LIkf6}&t^To}0Li$;e810L72k7^^ zpM`Vqns1BLU%g85H7K6y6#}oMdd{YwOK5O7p5n`mPi@aI-x>70I#x zL4S3jz@UryP&%v12l6%1vn8Z|h%Z-pSi9o+bUe?AzF)5Lc}T|xPag(x3e}q>HhpMN zda5ell~m7jDGTsHq?ey5`KwoJIg%5Cy+4QiEZ<8ceF^c&@|_{Dr(>eP$lpXi?cC_) z+TVLf51=4bZI=dQqR^13@1b@{xAoJNR3FPx@c=K&agpY`Mq=b^qMy(g#Frc2I{(4* zK5{HkCJGPbB=&S^`!o#YWSvwXDufQRL?Sn`K*Y@#HuXC~*vl@EkS!QPL2Nb5b6et9`x zEajosEXNB423;&i(|_e3@A0Tf$x}0K!Y7<9%Mgl**-l@FoT=+v!b_(`>+)8@R z?L&CDA550#4Qdyvvjl!F%AcS+>Jar-2iz*fnRLnsV` zH%s_>IdXXa7W+TdwF1Lle*d_fOV;mUyBgZlJ;>LQ=6l~?4<5Alvh19DA$N=;5?yi& zMj;x131C>yy_?@zUCxg^y|C}a_xBxVVfwIMJpAWrI_P^3WkyWo`1NVP9i)K9XK|P` zM7AEIALBSe_}5Czi%$o27zTqn|V8~<2t zp*)*Vnx1R_Oxk2WD7jYlhpJ_Hj(G>xsLW#_m;B~bub>a;m%x8{AP=k~ z&DZn?g7wZ2A7$b9xcb9)ae&X(9sPT&6NPSj|J2r(Yy46)8U^gjA`C?Tc|ma zQ~r#wd=ppa^~v6w9Soi+As$i76wkSWH=a0+e-ws5isG-&r5Nq-hCtqNv+BKnZ(0!A zzHIs)wfJ3eGovHFbFbL3E`i~1!`=~TuC-44!;hVnu{Xt#4^Ow?D-MzNNZVD~)7F)< z?HFtSwDsI%kD+>bMfl%h1(K4{Tm#``Pwhb(tZ%8NmS$9Zz(77!`XFi}a zX%zp>_F>UI)p&M^e=2r+`o~u z=sf;*&gP(pD2Mjln`wt{kfE{jN_K7q_F?>9(kpdE?B1SvR6kk*_edbrTbJr@{Avp7 ztw%>PHuawd)2`ih+SSg9hw{Muz^`izLLQ%kJX86dsP7cKJI`yth|f4(-` zKePQYXh&+2BWg#KgZvHz@$u!-ueaE)FNfqF{X6{vX363$s&n-k0;ipPv=fXY1mj9>ec9KilwH zd!qdGRq4Fd<`H4}9xg9_Jl0##B*|(W?^laIALj3+{NXy!PJ&_Q?xAwFZf%F1->sIn{%DF$aC`(tlwiD4s@EIZu&shfDyuakiVpU$Uyawn{coc)C0>k*m^LJKmgzW{)g00 z4%1uc0EyA%@28j|<*G8><$1oO2w$xwL5#;*1^dzHTLUy{EP+1@5}F-!)zb&Rx6 z#J4U``!;iSzE9=F^z%}ByoTb=Mme{HbyHdbcb8JU6X`9Ak6`*o>t*5qg!`xe#_7}P zZ;HPjy^w6{81b{_5i+iy;x$yRvqk;X(ZC}2QGkxxd^)cT^5G;xZ9e6P_(Rrt6jK*v ze)m({*_iT$b~5?Y;;COB#Fr-+xor%*6HyiSub|o&hv-u#O-GNc@Y<9K8u0< zITStT5k1qXDClAP{|wOc>BFRFg3@z4#m|I%-X78;X2h?5#~soR@d{~|@j?IQexvOV zdEuw+gZOi%ozmb*o6K+GPQl~vi&Q_z-xt|QNGK$FAFOYG>cl9SEX%ZinX|M1%l=(O zVQNR{1L)cs@;6DIW4uLAYB)<^8()$CJK?xAQ=ez$qW2-i%KxdO#V5f&81UM8T-ygr z)~Y_Mewv(yIInAL@q>XZ%<@ z0RD#{-OexAc@gu^3&)IQeA|f(V8*=W(a(SW^GKvAcZj@A*V}US#V<^1N5@hUJ?Az7h<`6p|&9FXaE&AYVQH zQL=E1j0++EAN;@vJ^*YKFM(mbzLyve>#<2Ldc;J1IgjphmZqaaTrJr2kD%= zwfjJF_*sz8`*k{w6jXk;{{?)DXnu(KB3jXR-iJVb1j}#jFqrzT z*80%Hto#zHkJx`k>bpeiL;G8O;1BI~*!-y+jZfQ`Xm|-BqhNA@e-9D0zC#2B7@j?2}=?7o#2=Pt-Oa1ovBQ4PR_E7&kX`A_1aGtbG=QwQV&6Gb}f1FO|%E13m z|C#1gJ)7w?I?k<~#P7qEdb=5pxAt-z;+ae3LOk0DFZ`dm)WLyo(q!77+%%i(Z(o0r z#H(j<9G8VY+~bY_`&pnE`_;e7>{r9{0KW6dw%Ix+^5cCy+s_E;nx*_KrgL}^zfD4N zD+~Rw$6QYRP+Ld0dy_(bfXC)V;A^4sHG=r^^3IM6Wg?0Ke01!Om_Nni02yTS55dnH zzDMn|{s8w&v!niejqMlPcL^$rm*@}I9f0TZhv7faz(&FEU+eil>$k?I?StBWf$^QZ zMaLx_??ZXoy!IH9=h5K%@}tD}`#<~l;rpj_(Bx?FJ^d*0ea6ne58u0v65pea65sRx zPI|ueDDnNf?;f50{m^IrKJ87W$m_YSgPA=F?IO?9&t!AMcKLCl&-%yVlsoPS%k3gP zIFkClv*XCh-TJvBD_4Bv$jTib@MnID-**hg0ctLP{te^6bE|26hf{8JP~YLS-`S6* z^&L*R50d?|_A@&D`jg&I0DeA43r9YmuABIE9GT9$sWe{Ur>(~{lv2H1LmMgKIL7`h zty>^eX&gle$K%phF@DPWlKGWMKi?NA9zz2>1*6Z_nd22Qj@o&1@bO~uBk*1+#?kcs zPI=$X)_IWcPhUv!nOp|rS9cSBTNg8W22&pNquvMVl~+G9*6*s=_pY+?w0UVL$A^F~ zD@QwjzD)MR&HqSN%R0S%M_?-XSrdq^Vbng&6yy6o2!$cyCwAP?#Bj%*cuMWHh9ei> zEpm_FLJU!e?-B(`R_J%B7U_4X?)$0Cm-3Hu+>8^ zdFlFkV5k1O&bi!J{cp@?EKrrMbrBIl0op0Qj#|N5Rv#TK3IDzkts@lsFsPRjfZjA74rJ+j@BR z-T_aq?!zH}G1w2Y{pg~-ub}cw^!)@o|ATTrqxA~wemJ!*Z`A`B;5^U9c?pG5^~^&p{VN5^vqXvW$D=+)i;AsF8UuVw<1Y_rc;` zU2n_aGkY7}`!=sJec!g2qlzim_d!bKFLS-^jmtSMmA|5JC&wLSsi#QyOhB}W+E2ee zdOxG{a<%tmI~&(<`J`o);uZYujcXMa{Oyf*NWS$OC0@Nj;!W!~#ylPrCyl)V>-d~( z+NSw7a~z&8fLuep+YGov=&X0&*^P9*ARM<=A^!@=kM{Y)$Q-RbJc|>;{eAdXSg$RfuUq|qv&UM9Q;oH8;8S)GMZM_8ek0W2i-iI?eAbsQ?Y5n+q(c9!L z!f)ih$nxx%C~$}F6BdV(gF?aVguS0p@cJa{3$~wR>jswJ-Y2qsT-aT-E9iLNpVI#2 z{Wl#S!*E0BC zxLfqg-kW&gg|fc`xk4lZy*IHxl6@24v3{F~_^98(>JffDziR9M{k?zZ^}pskCkcXr zy&qZcJUrxu^FbRk=cTb;k*+66|Fru=lNRZ>-apfOJ(KfPPsVb!efrBr=$n`;mhaf_ zfIsceYFFZ|+E4G5@^MA$?UMS?u9XR}Qv%z*MqC!VVS1iy+R6G^7$E|U)jrw&P4@h& zotKQXjN7>AhS8lXFV{KEbE$ZS54f&v1H3AN-ZjPOYW&w+?-;#PD}iaGPFV zzN{a8kNgt&JA{V()}M1eJOAIGUWWA>p1Wu~j@(wMX9{Yg`czL!YIi{oIEKBvEcm`w zc>mo#Iu~R1!rpU1{+IQW|3{SH>{*EC-Jc8WNrs+|fF3mYK=gd`FzMOd4?S=FME~?; z>+jHUr;r!@7>NJRQGJ*%l8F5LHk8A|0sY<&F?q=Jhvq@juZx&~9zq@;5Ae}_$3B05 z?eh`JAFmTT1wJg`XX{!q7+E`P@3FM6AH4tgR~p~oeoi2~ray(@!cRT@xQ{YH?|J@4 z@z=OB=xu$+Q>@#;f9ay}G**Af{M~x*7v4$hC4<5D z)kzI*|JZX&w`o=ZpVRS;%qry{H1c7le9?!yA|(_5hXB>oRr*(Df4-ZA4#M5iRd?L0)7&mH;46OT{>wLKhx8# zel^M;>iwe|xxDzR>H9|;YvjBKd{&qZUXKIcknchAD{a1F^qF6pGz$ObHzrC~77ysg zyb1W)pbxi5J*F474{!VF@W0_3gm~5vJ@CWlE1pxD2~TD{!pleX)%UZ0^;jHyqi>*j z-MMx2*v=Qw_cfTIT75qB`)*l%zJm2x+PnYv-TLY?^uPivr0Ji1Un|t7ooMG^eIt2< z)}Zvg!9wmdMq~3T%maYBeTrbW`K*2C8FCYS-oyG-tIxY@^i1@5FQ@zV()S|=qtEr< zr;~Y8$S2SH1APYH(7!FL&pWvOqwyZyUb-i|y+)s9o?j|IDttmn6ikloC(83f>!*xg zgVE0)5*^l`kRSfU(bUVo(LB%QyZ!5>y@#pqo2h<8{1w{1<7QS5cl=AJhdF(ZtcB$k z>Ld6vIi~t3`39?x$VdOk4%h0<(bUhu=;KvKSs(8qJ+SsS`(%1y>vE-v=w;lsOZveK z(X)QP|8f-U=i4*-3Hhh*3(q2m##OaTsXuV|_H*l?^mM5D1F4=u;nMempU3os?U&Wp zk9?f&I6H*h?5wey6B+Md^)#&iXzFF^2h{3+e|Gb4{}^WC8L2)x$rBh~ZCubt7v@=vD70*I}a-!6i zT#}CeFc8m#ot~P}dvIdk>pmL#j`ifh+v%*nAKG8o!TyNu*Vb8AV12IfkHuf;Zyn+9 zWsl(>GktnbPuQ>f^N%+jWqtooI$Ke@PA2OHHXpY6ua`@I>t5pSx+C#lzX>{qr~WbQ zZ=(3$tyr68gB5%f*%D9M`Pl9;54C$6U?z zf^P()CmBZzJQO1S>NusZpIt-8n#}qa?)@q0xr1Wv^<3WMS=uV+ll*%+$M9oU7$F;Q z$hV4;s`p8H>%Bq{*3FQCxPg(F_-E=L%N#k7M`(8=UoS?$8fY%Ca=OALcZ$j5wN^4~uzP(Y--Np~DV>~vGGyT49wCH@+6>Iuug zndmZof&K|yy*2ghrF_}-b;vcxc5FZAw|$3n{a@Qj&tDl`Sv=s|*85)o`>_;U5Fcts zY@a{w6@1p;;>v8PceLi$dv|RA+Ri;%I~Q^XIKMBqNDPzzzN?l8egym8tIemZ{!o6V zUvJC2AFz$&1^FEKE%wvpUcdg=2U2?pISjO~&;t3?+_QTb)9dZ342y0s_vdBz6E0=D zDtgxcx^3V61TQZgPm&Xxn4ZY}1IMAfc0!L)^C$UD~Wei1ovu}n+pe25T~93%83mq`9j9UnWV z2)@n}1;5ELK0)%gPSW{@(ih$<*-Q5yn;bCzm`;?$Bc;9usm8a;xcYp94?Sc255MzD`iJ(0Zga6n3KGi>a z&&lw{r6$US_xfaA&d&Fs99XdDzzcmcKhxU5@L7LCIegFA{L=!@u1N1d90lNkKRAqj zLoVij*!b@8PT}nSoI3E$r6lxkv>@tv9*ujZ&vuUA&efuSAV2cG^%U}R^c*$tfYU_Z zle6zR3{>wd${*G{{t)#dKkB_TQ!m=1zk2PyzgUJfSBykY?R)Q4O>Za=5(?mh{<+qx z@mFBP^EADfI|ZQs-s1Qs2K~LO&=1rAJP5YmZ1d69Ns3q3M_O?yjOIgJL_<=rcAcm5 z*y1s0S?BJO&F@*$!KZWe~mUupKzxW7v4!MI9ycf13IEQEFBnHaA zImnOp_%q$ZgqYOspuLxvwCVg*zi*$k?U(tgzDJm}?Gtzcs3E#r_A(sK5B3s1;C(fX zccw>xp~5B~-%n{SiD3QD@>{)jkF~vzU%iX7JDksLqMy|V6()J3|I|A_yo~0*{<{im zCBLnIh3}RA8u)}9>i^JA*hiIzy|>&fu$^a)_57^wZ@R7)cZ=M@`^D%uUJai%{^Iq? zCaMo|!uPCA4)$KFy`N%ovhm8_SKI+=#hx@#Z2cbi=74{FZubO)eA8>Do^Qin$cbK> zeah-(JW}U#IxgG2#^3|}2=^)7g9c$OpZ%`_mUp;>RvIU*aCB9?ut? zC9v7kl_VSb$NFESfTxJ9U)lY-=pScOz;nb_-tw&^{NT{=+xnZ`Pk`sp087VuNCO4n zL%cxP;dPQ61*9WBL(@U$d6WkGv!CMe)D8&NuJKu-N1o3M?R%A==WC=yamCi*WPLVbYe4;Lh2RPG0yQLUtAs!0t92s% zpkVLep?#1tm14-u%CDqElz-uvQS?{FeWtrv=r%n_8vFk);cn2sg^N2|CxU!g&ZHD3 z=L-m>t?SvkMUn0qN3eAyTL%p7<3`}u{s=wY9oS{;H=rKK?K6ZQdMA`K+BN;XcbP0( z%JPcMPPN#2mgrg1vWuVl?;YFvv7SFNdXtu3$!F`iWLM#z*nUE?db!k7miD=B?RX|E z?ofTz^>VXMem!0Nc>i50$v+|E0T*~+&_iutX7JBWz*M_x1k9~J)2{qnK zO8Sz<)^A=vy1*I3dRZ^5KfriU2;Yl`sSWdkPP6Br_g2ysyGO&$`}a^8%64!G#jt1g z9(02$Rl^OGNFlyY;-p#P_&&2c665_d6v4g$^dWLp=6?z4FYv|_L=NN6lJfAUkk7tT zXEEqpMGw4vnk@OvZ#MrTJgLLt0(0k$7g??$|Jc} z_1M0nuKrk6rhU%*A(Y!sv{k7+5aP8`uiY2aq5WbW8Ar66?PuA23dLb!AIDoi)O$L- zAG3(jy6QV5Mty4-j|hNFI^(td%Oyky%VCZ3zfj8g_l3=mDogt%BgH>5IaV z1EXHBXwS`WL;CJM{EPe}_hZ&e^DAszuyNh)3x465pqB8KIr8(c?W8BDANa?S9vOYf zwL))V-?i8MPOE1np?f}+ga6&fA5g#E<`v%l>3tvZ6sh0zdch2VVRsJx?QeerMA6?c zPK5qcGG`a_Y2Wp+c8|5)?H;0sE){$>-k3krLwZ5%9bBOK7n~>giu!$Ly9da|OY{TC zWdV#31)gUF{+*>8pM`uY=d<@Ns;d~}_gGP{(bGdnnU1yc+}a7_JL&`9ef&JNFXNjv zzZ`SnaWeGx7HEHgA4aI0`D+cD-|RJ>LlZ0=eD(433_qp!X;)3h_vNs|)r4Jt3t1AVh~ zox6aPg6Xf>QPZ!6sq!52O^hDq4~Fxn60LuDK2*NrDF6Q89su*7;w!}Ow0jx~Iq7)j zpT$M_PB!cyB-A?k1xx_9577;PqVYB#ThPRh*&hch*U{ZC29l`r?Y%U;D04a>+EVAeqr5v3|ea>a}zG<5ju_!cRhnHcj1U3aBF|GxQ4eBy-fRw{7Hh zPFhs|%}%#-H4gfTdb0h;>$`sM2lGd?AMo#|o2l^}fs7CV44#KTU(Sm&vOYi&+#*UIki*Wj>lYne~`q={|HXo8*t& zSk7SMWW#NeKb|PD`Cahq-%J6ih%didp7)TvAYY7E=r70@w)=vsBwxdY5+`R#Z1OTc zJ8~iiOK;Ty!{ldvX@m09dY7ED0l#PmJMYknkJM1Gbz1X3hG{z>3LE!q9;;;0xWA3{C|)G_G2WqO8*h@94gCDN(;yY1uf!4S3FvJdEeW6t zOzc(&xe^Gwptx})OTjFl9+wiks@2bMKv+>`?bIAP? zdT#RY_GbkpQZRhuCn^kN6zqFM52+q47$fP{{;g-8%n7!x+(Yt&UV1q+Oa55Tf!RFI z{88&qMsLRi$)B|BVY%4+-{$?`<1xCo-uh=DH_{=ao$o2+WIXZxRqda@KTYM{d4bf^ zsd{JnVD>O_@?ATl%k(#-<5NV3A8$(;K2?tK7HO{r?T@fuptn=yY4dm3KlUTf6g<}7 zI?spJQv0a>Rn=dKE2=ko{s?k8o%&VWC3+TDq#qbR){n+(`$g_OqIddTF!KlP{IVan z$*yoeA0z$2);X#t2%YBlVmu7zZ`JAYykVBaF($bb7U+DiaLgoz&3`q&wTJRSe=MIp zUrG2$wb;&uadx3RxAAx-;ioK~js|^h>kN1f)wlF<1oxRQX@2;> zp}jq0ITfOS@t@~Qvj9;&)Gi3wbt$tWONc3$gfD4)J?+ba|Hz%nu9FHm_8)Aoqm z*QNbbU$XOO+Xo2uUx3&8XZAV95y;oZjqw5A2_#Su1G$=?vq0My_LJq=%;dTT;}^&% z;5o}v(-$n{WS5nf>05R`2zvbx(e3wrJEXkz?{Jt8Nrm7L_Tp1GNFn1>?&bj^QDCjaTkuk8@x?Vx<^ ztEUNnIu4+HDEmS4m%@6dQ99^p{u%l2+^gZ&K+F5;Ir7=~hWh3!UF}p~1r)2cG8}>NJ|A6LStoctw z{;i5{1nD30tA587sV~Go68&JkeDA0~KCC?Gd0rp=Cxc8Oq=)M(N&Tp28~sGNA*}!6 zNN44j>YtRO?;^2WQhm$Vdvq!ae%&c+?{6Qxy}#{A%yai}yBBj}FynP%Z{zZJL?0SI z$#GoP@3}R~Jq>YL?h{QK<$me7{9Dbxo8ykM_|2WRzqmr_E=wGa2lxB}3+_> zlb1cW&~cv-41DyD&(R>p`AJR%z3-^yy zKSH`YeSaW>Lm}iJGil@B_)D&pakTmp&Yt>>QxqPn@mh&N$0Yh`^HuOYj_DBuvEGMV z$i0*c#O+!>-~)1t^*l?sKK&n*UQ+vmbvE!7IkXz--PZ51T(a^vJfP#3zrlMNV!zVz zGBJ)H+$VC?eQERG3PWVVYvXJdKk)u#X^3~8gQjD!f_YT?+SdZ2iLIaVmZL6(Mpj_2n;YXycpzex2JoP3Wv#B&8@v2~YHMeJ^S%a??&ihRc< z@#lWDeeHZtm+Xt%`Jaw%Y46e&Dc?R1r%H*gE!s}=3JfRb9WU`zu}7VkO23VG)r0h^ zB6#dQuDDzEbjyB`^E~yxE+xh&*uCuSQw5LB2dzJ6`Ay{}eyZ(bCXN59d}}=|pA*>L zA8Y%Rz}?dB$()Z0J$k+5&)PmlxE^^Y>z#g={cfoT!d@ ztw)O;2>aJw%5Uq`$VV;#<&%C4`4uZE9f_VpOIEKFxs`FG7k+$rzG!(JdBr`_uD1S({b=+U$fJc+y;Ppd^%Qb5 zd0a^6HOALMrDu)OGhbohE7tPvcj$&$OEIBO#BVy}w1}4!<1*|KYdeIHhl+(5LfR8+SrJp=U?ZZm>*{$FIl* zvF~=Idgt4r>2uygQn z_pQRWoIx%~SGxj_p!Pgd__2p&W<(74_M85jh#(3pw%c zjn884PfWk*kI@ymUvv6E^4zHWy`SbACH0Gnxl_d+_4aak^PkMWtmju6o`3x=@JKo6 zH~5YC?Ub~glE(RrH)%Xa@tgb?3asZSl9r1!-wPzYYn#Arr%Rl@|8NFXMjUfY+6 z*Gjq{zs3C^x?au?N|gr`|7MB1mG3QDpS_QFiS(BwbI)kxE@C{%`dzZ#)2sE-AjEc{ zqA&>q>!7r*Ecui!tfNe#EYP#>6#A}*9>}Z*?WXd`KV9>G1NpZqei|ZQM$f$;aGRuu z`2P+01NwM9Q|U1K9p>Maq30W*rw-oFQ$9L3#(cFm?iRnGBJzlvmA)MH6YxJ;;Ck~x z)1x0yhe+oS>!e*O(k}k{K3&pY_Fh2TE%rZ|vt0C}@#7M=d`RN9Zi(ked!xV5Ki97B zIfVUwcSi0;*Y6I5>p1AOednXEBRK7^)Zi4d{nG4%&A$g)Pu)-Q!g}iR%sRruWRK#m z{mf5%7Q7wU4;hEdAC7qkisp6a@MBjPdaSH#&`U>HQHb<=U=3*dDu&gXSSbVcEk296V(fohuKxz2La#fGJIc2w4fNy`u$QWfO3!0eA>?I$33DaVY|<#eAW+;|6$4xy2Kw9djR{~*B@2A zwC}zx6MaQFw2b*PDA(5yT_x>T7Q2_IUu)k1FuydUZx86JC|@MsRRp8ILf&@%4s`dh zpDy}wr2AZPS>$W&7Sgdp<@x)4=nv8lOwa9prFQM-w%-?yYtTQ-XZFDKz|Md8^pG@P-u>^a4B{^Gw$7AcHVg2|Lp7m3!H*TKA#ei=Ymm|Sa2+P5P ziRjb;(r;*WqIXxfh_4;1U#^-M)&`I&*j;BE9Q5iJ%&>jd;h72b;Cm=(7CO>u^qni1Loi8%~VICDnKG z{s;J734YB^jpFRCV{{Y$NcSTIw)K=kPTt20P{Vy@>1c^qj?DK#%Ne+4o>9 zUm^bqEe|eepF#Bj=U5jL9C58-yNbh{wu{;?-w%4F-SixEGUu7?51}0A_tOvl9rwTW z&S$!c!=<6XKPdP6^jl@zHGTE(cdvz1Nbgoi3_Y7bdRnBn3pl+j>1JO;eVk1CSk!ev z+n4Vc)x-q~xqVzdv`=VX^TRNYBof)*fa_-G^RxZY?vn>U2&rAH9e-Nsx!J!^Zf4hJ z@1y>d;RpP_jO0i2HsKdUQt9M-+OAX2Suho6zEr4YH zg>r_sD#LZU4?U5yIrG~?xy^+hULeoG|HlcDt?w0S9}y%ct7YFizFX;9t90u*0s4-i z(7R6Q3fhJ7t3JX$h5NNQ9|;Xdy}d!buyd%lRCyh@V|&YTnU{4fW;khEDscC!1fH`{ z;4N1ReC>RO+YhmhWbJ5jOIA=G?9B1Ve_so*?LGW`=AAW5AOxL5$CGHyEFFn#GmoFA?3}E+54Kk{hvp<>>iS5&qkI{ao9+fd%AAh#OX)-Jc^B* zus5V;2koBN$mw@cw=(d1`cyAJ=s^BOoS!P9P;VZ9{kD4c z~(@y*WGQODebr7zl8Pe$@HUj1Vhgu ziEy6%DXb?v-Seb&K0?<4>go9o6q&<->;^Y1H$ z=^v%T_&~K2_-`i6`DY4t+Hu?8|LC+6=0{=nwAyWTA z^f1e}(HGWFE-mS;?0edHJrKRGr2HwpC@pjiNN?cpJQmQ~AAR;7LNZ6kznNT(8)$u= z?e}e(?;R3DKE3oa^)Du=f1!4=EcoNml##+fbM@c7qc9mt{)URY4DJ5jJHXn`Z<9+g#A*+;S2bA+8*jRdB1d=*lX{XjuhDYrNbFMT)))D zb-Ztg5XxaQ$ra<<6TvwF$l*!4udL`=IKP#rdvUm(t{Y8@eiTaO%?uZFvd@bC4+$iV zOPNma-@8v_hx|#SjE_j)5xgI2`}im?`D8rw>waZPhkm2oK<|zKFX%mo)*=zp<39WT z;%~?TmH9ET-Zx=%+WM-|XZK>*eqG#bbjfH=^eui@se9rG$nIG9bOyKh~^xZ+T|AWbYQ!t)k-h`v=z*7$JR4)~(vgdl1(4-VI z+W53_oS~riV%T}laNppvuae!R{ClY#aGtD*N~G&i2bh18hmGIf&!YCV0QyWW#wYsy zizpp*-yZN|<6JQ><7C+H)>D2vcif@(ocMLQ2~r#8@!&6<$Dc!d*!q5m?{3OxbeUhB z<;UnPO%nWtp~rB)C=8W(Q(@?F>`%o_#0Z6WGQ2o?-!u}#ZTn019C`pvYK_F-P4mmS zhSCf!?h14#0VEK)<2j+$pH(|HS?VoDa&Iy4L-euw#kP)6$UiCXbBh`?&dca;qW!`6 zw0*evY{7f#Vn~zLNheB!`t}X*yquof`Mp!8OTO#$Ub9mt?_)hl%l}0BO;G-FE`R8K ze)zM{7pxB)Eq^t%pYTt^^|EcWUJiXgzcszLeq#3xcgpl6U2l(qZSg{VNKS zexhCMJ|C=CjmzA3a1z~-Z0}JSebCP@D*1?u9hCQx9QcRq{m)9Q-q$u{$_-1Q8YJ{SqRH z;*;6_6mm_hCxzT(>f=ank$bDk1W>>@-V45{(D1H+FXHzkdT#F*g>+f|cVzO9<@^(Y zwvS(9`PXFf!xOOgW$WR;DU%~;rs4@?|7ojACog-rNN(`uRT)+hIpck3(1-4XHI~(K;vg~j$`nNU!Ag? z;M?2$92WvuY!F!vv;}=81f5z z_2d+>oRmJh52nn`!Q(LG8_Mb6&q+R;#BL<(#ZILB%lJ^szsSkXBb$8FbBrR_kbl?@ zvv1%ZU7#NSzaqcW`iWnMohJ0#dk&!-(C+o*@C5Odw#RaA$M`|?>b`!%2GDhz;75P| zKFalOko^7l$D#bbMfo8w^bFGj$m>8b4w*h=^(QTLN8!WZl>+CA2Liy?pb zY4zm)*--w6p?9B9IY6&XA0UTWedY_I7lYR?k&nsM&SjW9k3_%90e{K0(?lO;i=50Z z(Yi0Ex3}F#_5tCv@`Cb0KVlo$Fo)B9Y1)WruP;g z_i;VwcgJ;y^GNAu{~N}${~~|L%YVMwc`T+-u>0oB51l+T&wdH)&aw17au;yExMKsy z@H2WhrE-8>m`?3mbglf{0hyrvYYo&(*35>q_cB z{i*{V0wY&-2i@ zypQ>!@%gVPPxojG+_FdDF4<2?+I9=vEqu^@-V7%v%6>zC_tn@s3-r;#9rPnzpT}wp z(N*~+*W2E*?J2-<*AqfVTd%;~-xGMwW`VbSL*Q#SGJLrEZK0fZQTx#Qn2aYJchH^~ zZ*Wu@@@u1y5QOErsa%-O2zGB|t0FZ2qIIoguyt{} zPZ0W#Cy|qVj%2;yHGJ)jLT@Oin)j7R4&i&J$Gxdu|B^lnyl`nFC;NjT-?vk`=}}nU zUcwLgPo{nzIk_(<)i2d^uV1R?UcXe&y?%+F4_3eYdyTeVFu;6pKJ@1-VuFI*9}T*D z-$(7$D{?Fjm;OQX4e4)7a9$ohEh zlltQxX|J$9%?$9S_^uUv=rk1K%DB3C!O!%%<*$@-zI;>N@=41y))U~FS{KhtwEjJu zuRz~pLI~S|<UO|&mP|tS@-n#reyFbk4ogzt>kr5G9fv-XX)pMV zXa`t$t2Sv^}lgX~Wm;3x4#iE$)=L&tvWN0txYk{La{)o}}OS*S2a%Xdf(4L{c(m6zyZ0KI0@A016>La{g4u|ME8J-xcw@TSqr>{t!Rgi3%sP|Gk*>5%rwF^*qTk zER~;>@t@{xG9HtGp%8cNVY)(mS$Z4Rp*@AKVs0G!wWYF*$CGo-Bzx-r)GwhwH;x8Y zdS8>^=TmI&2m1R}ln=~fkw48t_O(SG>QBU7VlU!uEq{*cN7qv6C+CQM#5S+e??1IqQaus(g6NfdS7XoLbD2(? zS7Tj?)S2x)IB1>N!p{r2MB~eH(1b$nAK88uhRe7^_g{1S#Om+FWwpa~_(Z#*-Iqb% z(s7gdrTqx)_p&Y?mlrBLO`l8q`u&gFn5;hf-$e8S|Cjf|&)dKmLOG*;TQ@+y8724= zQg1Q$8C_>u$MvS|rSdMX5qk7}0NU?TSoKu-iTKn)-}e6qQDWb9^zs_$y#n=Lwq^X6 zX+MJ8W{bR4zN!B*w{AZHpRfEn+dHPWkXtT%KG-XK_A@TS-Xh?f8|!b6_U|SC$mxDw z*2^H@w+Q*0KY)6FOW*k z`D^E|8z{f|4@ryYC+K;c@*7|E?BLQsKf-zS?&JFUNgI)Gh0qh`dn}U=>vi?!>0iv` zJ3#s3%1my*5Z@z|kNkX2_wPrPRW8&%_55=1`Pna_y=DBy_hK+K8J<&5{52zpTpP!s z-^l%=qWH-Ous=?H1cB+II)VQqM3>32vvD2IAHsf?rHj`$+652F|A`EV(U*?DXGlF% z2h*$eGQIyq<|&2YQ#qgSM~7i|zDwi(Gii6)*zOPm6zZ*Wewx!?B=)Q#cD>Xk^U6}U z*r9l{*uByg8NX~?i*I4HJRgIdPL>Fq%I_3TK)ckJ-5+TDN|hHp1q8M8 z-g7uT@$=r(6}EZmB!=mJlNvq9+S_#tLwmcC?NH>dP2z85fx>nZ8D0=XeX?rx6h9ysl1(hm!{CeBbQKOlC# zQT*mm&)1+GbiFb3pROc36WTlWL)Ffb-Q;@E4=zK#z|L{MQ9Eb$0QqKzb}pEgvwTZT zKKIKDDPKqV_iS%FD!=16X|Z)teNTQ_KkvnF5j^G}*t$)45A$(vM8BQOa!mD(o84`v z_lrltZxZrP_COu^xe7_bbNb6GZPC)gLM!r?B>$ z@=%4P|HS2|n2vgO9&#f;g7b&%3HgU||K#KFBZQDJU)D~ted}a$dB6YkU>=3`dxXYN z>&L0wbYCxMPj3H`;0gVd;Te76`n^7l^!hXe`N~q>&wmyvKBW)u>pY8+K-UM^Z?<{R zlj1j5ljyByL3x>4_VvXfyt_(u9ElpeVU>f4cE zT!OqY9wFd-#c>&VzoU=5uR92PXzOpad>!e!-d#**YENDu^oZK>?{4}VxivNX;Czhv zC!sxf4ENsmYY$RC>5Ir0_+4yY)^e3}FPqvaZFk6ZC-V2mbG&B&yJh~Dt=k~qrzxNH z(|Y}e{iFK?Pw1z7=vj6AquXlp^D%dFLjRL< z1x2#^&$})*m`*7n|Ld?WpyLem_K`0@|7AW} z%)N%~d`*5GZ^Cm=OX$ToE0^}0S4;hxAM0aHL|Yc0t$&C3uB(gh>Kc4=>*AZmdK2Qi zsxH1cHTc%l#V7Ns5Z_Dc;+rM-VvhJ8qz&{l%df3x)I0C>qPlp`6}*8Q_t(Lj=zc;y zyl2W7x3liUcb^-JtsNh6mFj|{|>63_AC44W46+DafYt1Wca{6;h=A^=6`V}Kjalx zQa%iC8}qSC^x!s;V@Tg-DhEEE_kCPJzAt z?O^!O=elNc{UM#A54G!y(jL;U!N;S0_#lB%2>FoxD%tO#_dHlGu=8XtiN7hFKU;68 zPdDlO^kJ??<_R``;(0b9qWfv3A2jaMcrVAXuEWy%0tyS=^d6+-TfIx-^*i;s*lXJ7 zRCqe;5xqyQu-K2JQS1Tj2k3LL2XR@(4>~8x`OSZ(_u?6*?@)0Z^2he4#A4ueUi_*z zukIz$+IyFwe6c@J?|dW9k)nM@`~d#TTGoT?x#*-#_`zq3rV}3j-S{@`KY^XxMg1Y9 zd!*vO|9cqsMUKVX>v-IcdqloryY^T9o}hd>{^r z3|&cGd~-AS_756gM_qiEWbo}9G`=Nu@x6fY!EPbYI{i}|tDQQvnHrixxbKK|r+pgE zXWxxZ+V(IVbRIzUc5i*U)V@K_);^l*LE4Tpq`s^k)$s$Tz^-i6bx_C~l%ST+1_OFNMxVm`syjfY~iE}I)GW(2;eeCJU zTrcd%G4v~9@0{9I?{A|0J89o8v3H4{>n(MEh1)IOqU|?B_EG)$`)kOdr_i4HevSDB zrHY)ZZ*Q5Y`1M?Uo7ls+ThGW3+xjk@ma<)G`%UCM8p_z`rzL-co!tX~{@9DH2tWT3Be{|bL%x9D4i#m46-phuzq z@(*-2E#&8PDi_+zZ)E(Ub2IrdZ;UHaPl$IqIF z{9}_#+^q7a{y^gN-(iWI*!fWYxX&$V+|_TpnZGtP(+&@0+U*2wx5ZR7pNQLq?r9T!D9d<5>)ti= zE=51X;sgad-v>FPX5c-W+K;|>ulRO~K6!s@o8p&#llpPu2bdq1tQP+*S-(N*@8RnB z{xirc+srEeSqbH$?v7lw|v_VSD!H&tV-3<-SI8 zr0=haos!`-{XVjt>%1G-X`I*nOpG(TGWKBHLs2b!Pe~a{v^1Xpznr|_^@dPPf%p;Z3RS$rV?UBkqlnc(6vHXK`t-$}-kEs0G z*^GzImk55d%jI|4?_iW%e#Jft*t$mL0fX-oriTGr_0RMgO!*HCQtlp>nLGUJx zB6pOB#@IXw<@?^>CGAMxt5v!VD4tac@0Wg4W_Ea8r5Ez8D4eJFY^WcA@7;7hvg7}- z_bqU86;R4% zg@_U(tJ9CkOcXT;VnB38MGcA=6*MYHRM4oX+0|X+$}ZpepZ}?Qt8d@VOu~xa_pMES z+^M>!PMtb+UiG+DmwZ-V6!z}br<}L0cm^-IMbmQrgyH4*O3t6KG{;x6&(+e5Pe8w* zR{MZI zF>d7s^eOse>3&OZwe)O#E-D_P{yf&pVw#%?7~*D zi!#5d@ET7DX3%xB5aG9Xnm8EOP9N^36kNB!xpinCZX^Y_P~k|g4_6hqgzrO)Gd#Y) z4yElF=>6DN;O}XF5`X`hCO$!*HHxI!O6p-qs<&)?_$)`uk43vSi?aJf_{Kdi^$FTcHW;b$b?nD%=cOv!uD_womX zKb5(ZXS*k)Fy%g=k+`>)`TJ{9?pfnAJc>`8w=81uc=TMR3%Q#9;n%CPJZ%_1`3i%#T+dI+sfcfCXN?)mZtHxX9jxFR< z?IumjIT%dW>rD4-VtV*Srss`oy4-%4;)yyrFBo;(cSgO8Z`^lrK0jd}(Ej328ttWv z+tx{bKKPl&s|kHuHGT_Y`nE6~)3=%Fm_8TZ6|J2Q>-%!YRZ4$YeNfX;$6`x=+tTxy zuHDac*FsGX)*1hlhFQMcdzj)4hgm-AEf^oT4jQ$?YRSHk?nXYib3&4H8a7ycyLJvp zXmQ$P`S0Rq=q-Nv;B%Sd9rVkuehmKKZ2W(M=an2wK1C;)e9STVIN$hUBnkFZy_3#eb;ohIj}3O|$Y#t~&Ut}h}I3vFBw9iXop@N6|aquMWD*LbEB&ttWz z-SF#Get7)Rc3e%o=-*$%?wGym%e6P{b8+>pmHM2$&j%!IXYFKIMacm1AG7!0#xQ zyBo>R_*@=mXPiDdJLAsfadyU?%hNb+nyfy$@4Q^xJ&{qLfDxp5-miS87>n;($=c{k_H3RC-((Qe+XkULM)(SmJ?KYUlarVD#9 zKU_YG=_%(E&isbV!;qeeX6yXP7R;lX{-EEk{3_&*{7mA9bBJdN{mtOW1JtXX;CV$R zo>wcLux9;NF?uc|J*fYLWr#CGVC0t%F4AXs?Oc8O`lEDv<=&84-|JY;;9Aj*dS_>r zKa=&x^pf9hJb-e~X`r`E_>1I){IcSsAsN3xe)?1WeVq7H*?*zq&*pOrMw`Z^Xg}&7 zSStOsu3hz~Px@a(NyhKn=@*?ISGO_UVR~%siMmXW>+J8SXBG8&nEgCae3G6Aap#iz zdW?~oyGPB>N9gU&CHM0;Xg*reXn${(w6g~v(znv?>Yub-<&JNVZ`I#fJI5{U;)e}P z*B;^fu8o==tW%Cl!z^Du|1iZI4zql8enHdGNfs|0Yw^OIv|s$4+9z2rw)$Ot)(=)+ z$?6M-P5y_B&z;os$nN)udTAfZO>xOqt;gpV=BZ`fiuUFJGA1AV#O&q&EPq0yH;Jo^ zPZPvd`QTSgbYCu{<^%4(_w{;}_zzi6qMfR;JYCbgaG;Z{l#@I z-rFO3s&ZJ!QKJ3!tb(18cBjWN-+f5>d$ppK??6^ju1D7B(=WeN%7dP72|WDQ-cm&N ztHpk{ao)a7^X0sK%I^ZoG0H&_#cyan+R-@QW`4J_LhG0L7R4j;_m za(3*;av*J3x43?Iq1qw89ONR+5Ah?~e`x1J|Az4$?N{QrpdF3z9?mI9<3ag#;A^~2 zLV1Yo@VbS@=fzEY9xy(C>`CGC{1l%DTJm{u3qF5J`MlKZ{EEr(dBpsl%{zc!H)rzu zY~}Z0<$A^I^vmzZ-WL3S8~9&I@x9V(?b}E_UDw~l|8C>|n~nb>qF7&QYS*vSu58x) zL?1S38gkvJ596eNfs2D#zpUfN<*66+pUrwfIh6ShN57VneS4PPU}@ToMa5rf+UHX` zzFA*}pSQS7#x}GgCn>+f3iT{1KKeK^WWSL4A%52s*32(;J;3*M>T}d{AJdcc_xa#R ztkw`J7t(+#}?-GAKDIBx>Ghy3l5FaA*Nq+f0`=C{lr`S$Sv^LsO; zUX=gBp4f*#J1hG==_e6P$q(QCJqo=aWIC);zTnqf`CGKSljmvLFXaW>ly9=XfqG_f zgu{b+UoCVeae1>}!zTs#z~rm4L-Dx#e`I}A)3D2kpt8=bnbyKC{PCy0zniA|6Rw}$ zWCsGX1HTh^=r`s?W&T|G4EfpGaQ^Ug%}?yW1b%U?>C-Oz#WvG-=NAJ@H~YmQ>3_f9 zonPE0=U0XGQPa~6`b^7B+MmffsPY^A_SnDbyr-7y%k?(RBcNWu{fo-w>s4^%oOP9p zlZ0mY{jBxtq~e&}?ysfV zPA4~V{)?q4FLEwjsz2Lzxj#Ss1pD(VUVj#H$7z4cJdV-n>>kGniQVP=bz*n9-%IX@qA0=ei``I@J6{w?V3-%WZ?QM&9r#EOc) z&WpJAbhT*DG00zM@M3I6F^^JWTK4J1`u8;Sw_7Ln=0_I;-sVH24%%bzX>Wy}t%&^f zskwkRyB>AWt^+=&@bd}p(LY__-8d@h*bvk6SGi{tb`QU-{@;drF5-LmjZXO!^*oAu z=zRP#zH;+MKHRTTaB~57Su?($r{ER~oa391??HhBy&&1`tMloA-}LQ}liweG3G-N# z^JF}5juPURhkQCd$vt;5pMD^G^1sK1Jh=V}t4V)-7jPb5K#%jw&i{gc_XwQK4=8>a z_vy3G=J_3*FHdNPlP8qF3-x$@9`@GBLsmcB2L5{THZ6mGpU)do{ek@gt{qwO@Cm?s z^1lK7Tw*_G^lYKEOsIn9u(8&dU52VJY1k{ zH$;2t=4B?i&X*6?Yy2bQ2IYStSJJr5mt)AE?ElyIkiW$Ppqu^z`h;ITSg3e>IY_q~ z@vD;y@YThk7p3^6`sLXj2lpC*lkd5dj&OgiwqakwW{VFF{4wT@Il&G&+EYM%y8!&S zU-Br)-|qn8ku3mfR|Yw(k#lVRqWtvRqk331_$dMJ>ohs{+cP)S9_53z$B)PMl_~nf zE?uwvpAQDK0@?S_(jULQFX4Y*u3&zj`T>18LNGi_?l#BIjnf8gKGHuY6nxn4Km`lj z{l=e}!Std7!8MfsA^A{YKKSIzLs+wMg@7X-gM9q-DxbbvtX+#0L0J8@woA@8RlLdg zl=V0|OEu2NhBiKx?@9W|f2JER4QoKi-L?*L`mq?KNHVqw^>zi;fY(#f(1s^V+Ktxh>?l&YG+%Fs=@3kFtN|@HaF#taG12)U$=@ zVajbZkL`))$tP)#oqfy)YiXC)nH@0u@pkDq5!r_L3;hf^UYL^O?Q-wuh{U7l_w(fm z{dDouTS}l__O%N>{9?VQnuwm=&lJHqnPdj(dKR`6%OGJRfEJ zi|3<^fAM@2`IiqqrTlKzD~@lH`@lGk7I{^=C0=2Fr1TH>3FGJVLE=cZv!dC_I%w6> z!XMbl(3@XALG5w1?<#(C5Z$Zr^e~_=NKHiORQpSEq97j}MgD@-FW>jf)%3*Q?QyksRn z;d7au$Nrh^(APAdeyMVY^J-RQ zm0wQ$DF55c@;}w`ZXM63_b};Sl>5~Em~S{0-?Op0p36+=y*Wn`m*g>Uhb8A41dTz zWi2oBotECzgl~t9FOJmmoh-k82g{8FTF!6RHiJJ*;9>8uqt2bj0RA-I>$;Tky<{<; zYdM|@*RwxlJxuF~inMF;oxG)K*MOhvP_%2n-?%g#I~1;)<}of^s{&D!V_8-~RVP$2Zsk=kI!zkFH-A6+cdVBbu%D2L9KlL+Kji zd(d{jRN8uf{GV2+lP?|CS1MaIuz)%<3MI~UaaX4hS8cisGE&z+i{*iRxFkov36-oMWL z@#|Ty^T*XbOS64p?KMoBe;%w;?@PlhUq0_J(m&i!e|=s-)6t2HpQ2-Ie~z6uAp574 zUf(XAFD3H9rJDcurqB7SI`Xzm6-Dk&pLfh&1gwLb*+(YNr0H^W1<>!MX3J`U1UEhrZ5KpXGkB> z#oc#{r1|ZdX#e_GQ}Ea??dyZX`z3)ZFBoc)PoHmNSF=ALH!qcQMBRSz#7`Wj0CImL z+xKq5qd&&wPoHidZ&o~is)s*ZM}8&s@Z2rL!vk4(y*TXMUw}Ss)_zUO!+VO{yZE7^ zNgbEpXmRdKFrWp({X6vuew?ZBCotYx!^y``hnV zm1B>dZ^(YPW_jZ{DYm}`@AL`h?TU)1J>KI=(8cwaq#qt)|5hJif4lpMtM^-algY<} zOxu0MgLa-#X_)1cc!u&5O&HI7llGWu9nY^sUELaQHlMFHTl0PXY=GVM{Pt`cul(kF z=(i0@Z(r^moIe`bsOia+|G8H_(d)OepGGH-=SP`%a4NCL!AjdFvJ3dWlZo#l(p4c{ z@*V7?`Si6+e2`wTUopP+N#pxMCcams@J*jIzMC`gosq&fEfb&I3!(YY3U~pmX~w&*^Unq56UmdEZ=M=pa=3j zyq3@Mccn}`$F`uu`03GcL1y_QGRr&v5Bl$Vjp*Te#`AqskFj~pO|&EK{=Diq(;f6D zVa?>YYpMEqIbVYBdlqYY;_;fz`^9)!F05I-hPPC|Rq@I>7R0~H=e^yd<;orO8)5A( z;_0$>)bC`v$J#N>`l5NHXCglqpZ7LOc|bgp-UqGrZyDeF^Rk%H@a6Md#ATkHyi>+I z{&;0&3LfV;xO1v~yzdma^4ea;U!MP@{84_<@9*^bJvsM`{$J*S$d}@{`5o8)8_mzS z{@=iK-2bDRp1A*KP%b^bji%z?R(yM7iVxSM%BA^MPQh#cnEmkihLybX+NErd?YndP z@%?)-^!{1vPw;WC@B48gMkkH&1R@U?Px$>kZgJ*9Devd6GXMC`lAjOO2~{E|o?Ki3 zIq~ZMkME&=-oxkbzX=3x(9Xpxrwu$26nC&phwUi%wU8S+Nrqx6$R7y_-3(V zfcuryTd??PF!tl!3W)JAes2G{oZF#xuk|^dj3>r8y^_?=&x0HEMCq;(KfcpPfBJsp z7TKTHY|oD%J#}l>X)NC~uD5fN+;}<}*K^)AD&}b4_L<6O*ZzEV9IDSI{-)@3@2k^21*F zBp%uI`0{<3cy>R&ygC!#MJfPEJUIFIGR(xc`|;&lGV$$xeEIrJe7hcBuDCsshonCz zjxU#Gmg`o2H|cvue0hxA@7rvTCLdouBeQ&GX8k*hFAJG?CLdouEweoBYAZg#zAe7+ zAMvH!m!SS3jP2^*KE6CdEWY0_6UCROq~Ke{moF5!$;6j0^!okDk1uCYKXxO&JUqpR ziQ>ycQt++f%L9~ej4xeWHYdk(5)=P!H59;_rGU6I4Jwro9*v0ln;-7#LHniK0I)`!iCetkjXDB z$N&$|{q+%iULMkg!J>Uq@!>p+4_8`z*fqKM(2onZWzx-cAirNU9`@Ry@o+5}=k0(V zHqCF?e56;dRUEldLKV3uO8fE2iz7e9xR7B;&>SCfJl`B2a$N88XLD-)afS3V{L;M5 z;LB#wO4;X{d!fxgZqf8)%AezvPvVJApp$t+v-hKu$2T_S3E`s_#3_&e&5#D;(4VfxV|>QdFt{0qUu)d z$Eafs{cg?b?HbZ_$>znwVfIh7%kxT)D*kfE2E*^p1sY{KUYB8gVZ1IwdL|lA#q&yD zKVf|^DlSy~{`e1k_vbOrlo6vZzZ0zwo|=MRqvL7TBcn&Qm|b8ujt;6J&uye(oL)jN73p@w%-W_g|x64fLyAdE;o%2l={9_6Ie~x4e*F zDLx0wjhmmY`EpK#^3UCOh4p0o%EeXME}yTcCtj~vL^#xYu-ZdTO!$5lo*~&+;pAg0 z`BiiBF}ZcSiR2?0Zwn*k=hK04b(UXu>uX1fUykRMn$~p&{tA4}cC}ygeYw(p@%%@> z&0BruJHB0g<)rPZD?j3uPwduQkcEAs6WV8o=VO_8P9>iBoH3hs^7O1#yROf~_kt8Y z&T~zMPb)L=ab3Hqe1?60wVdDDEdS3@dYa0ceTV#xNYK(;F554JRq`jxFT6Cf{)zp< zZS$o5n)!u2+dULTLzi`B#*)~Nqsoq7ZOn=|(VbZP-PhhF&wxEt=n z_g1GgKKP_A`z*tQ}7{9{oU*+%q0Ef0wd5zFqjENSxpQ6UC#yOTjZ9Wj#J#>?n8f zXmh-Ggz_tiM;X_I)qa)#*6UD&OV**N$6>}gl8S#H$zFo5Vx-zE;0u8<~8Z`AV;R60csM?b(%hb#5k} zUd0owG&$Ub`1h1dd}ooaIQ}*LokaZm{7ihbOY(iP#^q6w{@<7HR`GO4Ccft?ed+Qp zK7d}GeOuCB3BOOuEa&Uv+{|*F+2tR|#H7jm@I1>-;Rl42&KAp2g zq)MX}H@E#GZblD9^LBqeWoL1-?`NK#@<$WJ%Y_ttt9W@D{MSmGXEFQN6eoLr6>;+J z#K$w$-hNN*ZPdZIeQ*ZlyC9cN&G$gB z-=zCCIIc_dn)>O+6@Yv0_x(7TcqS7k_on>HREhhWnF~+iKK}l3GWV6l`-xm!%8UiX1vP<&c(}5JT5kS zG0C{t_ur5IJS#44%anhAUP8wKW;dV@--kbpzw2<{dp|kzuD+hS`2Fo7clqFK_PZyS z?)@Tp@8VrIf3hp_{hT)xyyGsZvKr|KC$<2 zQaRX_xcO(9crH>r(aK&O@9he{A7&Q-j=9JGpaznzKi6>Mi5H#5GU48E^s z;yWXSFFUSxehvEb%UhHFOZY!W@ift4_5|e~$}HENT`nVzz9!Sp&(19G?1sNz|BB4= zoh{0G|>Oc;$%9@_rougY$hq{*O2w4BO>6epJ~UV86ZkJ1tHZxFchTE_8dy>apjy}1GXZsWItd~`WQn&9SR*Q`6c%*D>w*;p2Y`__vbl%07K* zdy4UovjbtBdL0f^FTvmCnQ;XJ#U~!`SbdX@cj$LO*U#j>-Xu;rNd06IPycP#hkbs! zIOL*l3m?7s#I2*ePV)1?yEMLNo=@FRJ8&>w$9am%FX9mS7c45aKL!9FZ@T|fe-&?;e2{^Kkiq=ic~neB*rPFBoqfN4)O*r>N_R&kO$GTM2!;6W`qHl~4TZ zuE#fD%fxe$Hh6d9n=fSI+x__F=1hFMAK#2*;@kE3=9{-9{g?26;`rvPndQ2b-%awJ z5#P+$eS7J7jLFA01DWM_J-#_V6VK%1o3k^^PaNOeah~u!UeEhSd;`IGGUA(e?P#>W z6U8@6Q}C_gn@Hd$6W>H$zc=sq{#(a4w1>Mh-}1T?A0~=#E=a+*nr}H*`Np^=@tb?8 z-#p*^W+B(S-vA~h*>6C*=g)&^98^(rlDH?@LA5OE^0<$%CQ>nmG-CHj@kS3rTIWu zn8HA;kb9QG6>=wNzZG&X(DP&qxh|djxtIeBsZ#t+LN!hUitu;!!x z@Jr5N9oKwcKE`Fe80QGC^6)|~uKr~*FXr0e=I;x+PNVw;Mt7IdeX5>6RLGs7^cQk3 z(UTAT`bMq3Uk@krVw}S`cCON!1^++_9uk@l{;4H=P)YFTgN~MPTN~iGF)FM6`@Q<} z+R8>h;@Wku2Zwg;t#mf8TR8Y}4?Z6>#~lvt_;r4J9%|}G2X~|ghx+lQbv`(}W&4jv z!AlW=Kcpr6$sWIe9}@2FWzOQ;(^B}M3U2>-7W{@3ewn%ucz!6I1^>9mKhU$Uz(an2 z`Dxql>)i+M^u^gVr&mrteEi!*PMh_J`U88g=FL)({p21c_Qwb_aNiU9L+t!f z{c>m)_kmU0Z9mv_K5NtXwDS!6awI4|x82TbcjvoDCmQ}iKJ&p-)zZj!1hRSpdo#r6 z0-g&GzX^bFbg|X5P@i(%v%<;wz?SAY8YFgI0EPs{ZnQiG6 zmhQAP?|msc5N{pI)`_mkmu<@ywh z*g*(^{jQg1KEVIcpYy3Fb}v%j6x7-X58IOu-mm%5yl#b$y5{n^&j6o2y?hoI>NDIQ zRvUJpU(;#(5iKbCz6kSxw#q#G{e&l0RC1FKAEpLP3udSbN9ix`B0Rg8rLVI46g5UC=0&jZZ z<2_N}$}6{Wy}h!5dT#Xk`uLcX2i}M7_V<%faQt>-#i6;~YlOl^`qdv*6Z>=fy@}mT z?BKOpF07b-7H5;b3iUHQkaj)myd&TTy;t4|{imNUwDCIypa1Fgjx_&anSf{i6hF^R z_1mRVANYE)!9OJhkNDf?zr(v1;MRdV5{pR?vLf}}v!0*q$-`WM13i!byOe`a$`9wX zcB9;NO#AgX_`d+Y!uL2YSmn;e0YbNf`;)+xSN77*RgK>>l5*0F$DKUOxiu~2WtQ*< zbbh2kUW$symlt@te8BUA6T956_B!eJUQ3%@F0RsaRGe%1W}k~IEWg|G4NrXUJ?E!F zyQd*KKnRqd>?dS7cP?{<<>Pj?;Df}EYA;Kb_p1J2UJ!94?1prQz61W(8UG5oW7V$8 z_pHjdzW9E$V*w^~43VF72a=|Kgt6VXc);{C=Kua$T;qBC70u(h^Wkv6;)~|-{Q2pk zt_|}t^LP%u+{eBh<$U>2Js3tV0 za&ela`z<}4^?G^+`x4*Re36o?;}}=pyQIEoEqWG4Zt zr+84`+?T+fupNDEt1T|?Ha+6HlYDQ;bO*oxmHp>TcWq(2>lVlNaNRZ^yw&Na@qLrh zQL_8vAuq^q^NC^QCiQdj9j@XHD|JhguCQ{WrODs0a=oS5-ZYL?+=VFWhQhe_Fwr087xu0nE1N0Y&`|)%BLhRjk zq#@_fzsdNC3&zo}?6*Dyuky}b_W11YWZ7dGkjl@e%h|I??5>~h?C}ppFWf%t zQuPYzanpGDa?Ow8@iOmciH>sP<%{h-Mz6_u*{{#hv7iMVUspQhk~H~+HqH<`N_uQw zC@Na~65D0!y?pOt_RH*3#q3wn>{l$uv~RxLs613rtHkqD#6H4bnjE2jW=lT$ajEoA zvhT2;b};_Vx|iwrJ8QtpDVT+epAguhCrsaGWo=y|_ws(+2fG74p8gqszG@TDH_2;QB_8;_ZK?UIpX<7O+V6cu@r0EX zMh^pgmv;1Ee2~U>LIXXwk)EnPR35fsykD`jv=V+>_@VVcK4!@)wCiN(uV;@`u1t>P z{2zq}+)wm7D(mMW(PSwn)dm$O5>MiJ{=-- zFIup%3102I#k1hk?QekmQg4!Y^RrsNUk~`?C<&mg}OJH!4E zf2Zv&7pb4%7k+a8mge`-Jc(cBz6duTSh8_oU+y!yt`k-lDtu_?J;ia(jCPnT=6mQfqRiEW02kA52KfWD+-wA7sYeTzlI2;~Texd)qbxzWM zeYrV|^DXWwa|9fM&F~GIZbGPmUKHMR2gO&HFy&bHsq}}as^9FXm-P-2)1C8%&{=kj<+<0z` zZb0qT)$(_#LOWi_J@j7~PnD`XU)s&LCiCUjv!7%C|6WTw|9_39<(vX#Ov&cY-F&{B z6G{0VraZd)m!n>j|8A4}&NeMyZnrps*$w`o-Ol;=%r_9XJWcWX@%mc9Aoomb{u7=5 z&j-gVJudFYJ{|o0I8o&xLvEI%pFO!ze~=+JSEl3v`r+miom@j676Z!kuG>*r1Vy;AcjUp_okO!m7p!GBoui<&=nfh6P?^=wf68av6- z9UGZO|G( zId^|tIbIhtzI9F0ad22SzQyZeCzFr!0)0Q(^YA`I^5x#u?iO?oDV=hENlfo&w_^Vx z+nM;+Uu%Dbm(6W~XN{JJeSZHvQ>|7R-%7V59swUdk%`yt;T;^%GEs3A=`nw+@my+N z6J^bi*9cyM?p;Yw~Q-eKJ4*I>F-*%w!3eS{cRqF;{cf-SNRI7 z90$bv3~JPysB1Rg*U87I$Hp%cp4WMIlU~5yCHr5$rtf{aJ0(7n_)h8e{V?P=>RO@s zh-2M)*DwC9F&=*^#zS5_e1^pFfS)P#qTe1&!3VPb5LQ{Ak9Ui}Nj$Fgm5Xg`e}!_9 zH9t1f)-jfT-JiFSisk3)Io7@M!4aAtR;b69NYKRqDXG{8@r|%1L?yfYc zq5Uw~uK)dhpKJX4rtmKxELXXRiZQO zTE=0!Q0@jPhw;FGl*4`lL`uN-6zp3zlj_&MT^Q>61#n-w2m05jZ{EGr?7zwmlLP9h zj}PNu*;l3Sf$vtuN4a?B_Fl+YBG=fsB`wUoyV5_lqsPP}6>Wo3*|H%}0If zP~TUYCE;fHFr z!a;Jx50YPvk8 zx5r-{XL$1cagle}dufW|yAbp-e5F81KRUY+kAvwy!x`jDyv{s>e3AJK zjdQ{oT3q-*y$dTgUsW}JWZeIKkrZ+EEn3+e|H4nE^>xg}!#4jK)>kPX(VlBRfq0L0 zB#DDARl;QasBo8vp0-QQ+wD1KbQh*9RJg<+eNoecBfKZTox7LJ4{X%_PWZCH(vB~q zmR2;<&LO7V`IRw$x1{iFPT|>)rg)%&#Tn) zQjO!a@`;Rx!rIF@t~jxvaAECCOFzxhFSfK868SB%`>Wmgvw64g6qVZVee%qTS71-j zo^kPWKHuO+k$;o=&0lDJr7G_mcm6x9o}v7XjyXtc39Bbt`l*(td`0p7+PtUsf1|#= z>-7Jf`u5wq6MakUH5Dt|4ZYhUaaTdL3GwJE+PfBd2LBF!nh!X?=Esq6G5O$Mw0z0* zFtl-^e3z*59uC{M@;t^5QOkSdNr#))7@MWyAGmwreZ5);fA?H_FEW82^z4_*#9q`_ z(4JM7@>yHVr`@k7^R=4p%Tw>8IY!s9f?jC2@hj)Gwc9e3}C*O6#t~J9`J^+7}2cOv8e^Ppy z%Ta#ZdIieQ)cFI}mz3|)^5H1k5nipy3_938;CXr`o)d_tWqI-iGae zGQZQfSon~9r|~i?XLighm!6k=O+&dewOljb$Oq6_@aPQJ(Y_{p>uyn=d`J2DuaN#7 zU95hmuk8$**QA}1c|@JJk@-E+G+nXTH9l_|7gecvvumG}AJ3X3zy z=OlhM{>JgM@%NY%f1Bd_e^Y$^y3~A`FZ9RJ8fTQW8ye2-Ja~Jf-8dsv?u!3zoM*<& zr7!ohWq!xs_u}TSpCWMOmEDxf3iaR3Px<99l=9%$tzY%$mz(V=Mo7)}^!eH#AD{X& z+wTs%@86Wz$wdE-(sHs7o$^|=_@hF9y|eEsfFF3zxea*fhvj=?wcEfCf0z%BHvCRs zH!^;V>)T*y7awfbw9MC8zUggoo8=E#zTt`eikrtGzGOc?@kDOiT48zThr+70cZQOw z`!r>EC-b44UoBOs$DxZi>*SN{n^Jy-L$nLKvu?c9`g@!7cRu(i<#yEQkZBZMpRHP2 zn5lBRjA_hk^~;~&|JWZIi**e{A|ZYSk^G_; zwDHL>L)v|V>WSYk?-z)C@EXle_%lb#`EbJu*WaXPDwjLavsqFO?LJ54ZpiE;=jFo6 zsHHj2ChL8cw)w^i$01RX^K||`8`baYl+3`_J6GQsQeU)Sa}&L)f6G|TeQ%)sg8N=Q zJym@!Ik+VLJq>Up%*Xd2YF7rE>FAU!;C)_7FNZKrzliYAO9%Jt6kI3l!fL~7^VR

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 { +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import type NodeWallet from "@anchor-lang/core/dist/cjs/nodewallet"; +import { ASSOCIATED_PROGRAM_ID } from "@anchor-lang/core/dist/cjs/utils/token"; +import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID } from "@solana/spl-token"; +import { Keypair, SystemProgram } from "@solana/web3.js"; +import type { MintNft } from "../target/types/mint_nft"; + +describe("mint-nft", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); @@ -15,9 +15,9 @@ describe('mint-nft', () => { const program = anchor.workspace.MintNft as Program; - const TOKEN_METADATA_PROGRAM_ID = new anchor.web3.PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s'); + const TOKEN_METADATA_PROGRAM_ID = new anchor.web3.PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); - const mintAuthority = anchor.web3.PublicKey.findProgramAddressSync([Buffer.from('authority')], program.programId)[0]; + const mintAuthority = anchor.web3.PublicKey.findProgramAddressSync([Buffer.from("authority")], program.programId)[0]; const collectionKeypair = Keypair.generate(); const collectionMint = collectionKeypair.publicKey; @@ -27,29 +27,29 @@ describe('mint-nft', () => { const getMetadata = async (mint: anchor.web3.PublicKey): Promise => { return anchor.web3.PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()], TOKEN_METADATA_PROGRAM_ID, )[0]; }; const getMasterEdition = async (mint: anchor.web3.PublicKey): Promise => { return anchor.web3.PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer(), Buffer.from('edition')], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer(), Buffer.from("edition")], TOKEN_METADATA_PROGRAM_ID, )[0]; }; - it('Create Collection NFT', async () => { - console.log('\nCollection Mint Key: ', collectionMint.toBase58()); + it("Create Collection NFT", async () => { + console.log("\nCollection Mint Key: ", collectionMint.toBase58()); const metadata = await getMetadata(collectionMint); - console.log('Collection Metadata Account: ', metadata.toBase58()); + console.log("Collection Metadata Account: ", metadata.toBase58()); const masterEdition = await getMasterEdition(collectionMint); - console.log('Master Edition Account: ', masterEdition.toBase58()); + console.log("Master Edition Account: ", masterEdition.toBase58()); const destination = getAssociatedTokenAddressSync(collectionMint, wallet.publicKey); - console.log('Destination ATA = ', destination.toBase58()); + console.log("Destination ATA = ", destination.toBase58()); const tx = await program.methods .createCollection() @@ -69,20 +69,20 @@ describe('mint-nft', () => { .rpc({ skipPreflight: true, }); - console.log('\nCollection NFT minted: TxID - ', tx); + console.log("\nCollection NFT minted: TxID - ", tx); }); - it('Mint NFT', async () => { - console.log('\nMint', mint.toBase58()); + it("Mint NFT", async () => { + console.log("\nMint", mint.toBase58()); const metadata = await getMetadata(mint); - console.log('Metadata', metadata.toBase58()); + console.log("Metadata", metadata.toBase58()); const masterEdition = await getMasterEdition(mint); - console.log('Master Edition', masterEdition.toBase58()); + console.log("Master Edition", masterEdition.toBase58()); const destination = getAssociatedTokenAddressSync(mint, wallet.publicKey); - console.log('Destination', destination.toBase58()); + console.log("Destination", destination.toBase58()); const tx = await program.methods .mintNft() @@ -103,18 +103,18 @@ describe('mint-nft', () => { .rpc({ skipPreflight: true, }); - console.log('\nNFT Minted! Your transaction signature', tx); + console.log("\nNFT Minted! Your transaction signature", tx); }); - it('Verify Collection', async () => { + it("Verify Collection", async () => { const mintMetadata = await getMetadata(mint); - console.log('\nMint Metadata', mintMetadata.toBase58()); + console.log("\nMint Metadata", mintMetadata.toBase58()); const collectionMetadata = await getMetadata(collectionMint); - console.log('Collection Metadata', collectionMetadata.toBase58()); + console.log("Collection Metadata", collectionMetadata.toBase58()); const collectionMasterEdition = await getMasterEdition(collectionMint); - console.log('Collection Master Edition', collectionMasterEdition.toBase58()); + console.log("Collection Master Edition", collectionMasterEdition.toBase58()); const tx = await program.methods .verifyCollection() @@ -133,6 +133,6 @@ describe('mint-nft', () => { .rpc({ skipPreflight: true, }); - console.log('\nCollection Verified! Your transaction signature', tx); + console.log("\nCollection Verified! Your transaction signature", tx); }); }); diff --git a/tokens/pda-mint-authority/anchor/Anchor.toml b/tokens/pda-mint-authority/anchor/Anchor.toml index 803ab7c40..3251fb3a1 100644 --- a/tokens/pda-mint-authority/anchor/Anchor.toml +++ b/tokens/pda-mint-authority/anchor/Anchor.toml @@ -6,16 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -token_minter = "3LFrPHqwk5jMrmiz48BFj6NV2k4NjobgTe1jChzx3JGD" - -# [registry] section removed — no longer used in Anchor 1.0 +token_minter = "3PMgRxk5r8i9ZFmaKPR55DGAKrBZncLSTqB4tpSxJjb5" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests — the validator tests (test.ts) need Metaplex Token -# Metadata cloned from mainnet which is too slow/unreliable in CI. -# bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/bankrun.test.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/pda-mint-authority/anchor/package.json b/tokens/pda-mint-authority/anchor/package.json index 4042e17fa..bcc1cea1b 100644 --- a/tokens/pda-mint-authority/anchor/package.json +++ b/tokens/pda-mint-authority/anchor/package.json @@ -1,22 +1,22 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.3.8" - }, - "scripts": { - "postinstall": "zx prepare.mjs" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "anchor-bankrun": "^0.4.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3", - "zx": "^8.1.4" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.3.8" + }, + "scripts": { + "postinstall": "zx prepare.mjs" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "anchor-bankrun": "^0.4.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3", + "zx": "^8.1.4" + } } diff --git a/tokens/pda-mint-authority/anchor/pnpm-lock.yaml b/tokens/pda-mint-authority/anchor/pnpm-lock.yaml index 6c962e400..8858fc042 100644 --- a/tokens/pda-mint-authority/anchor/pnpm-lock.yaml +++ b/tokens/pda-mint-authority/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.3.8 version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -48,18 +48,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -840,16 +840,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -867,7 +867,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/tokens/pda-mint-authority/anchor/prepare.mjs b/tokens/pda-mint-authority/anchor/prepare.mjs index 7c5ec464b..fb6b26225 100644 --- a/tokens/pda-mint-authority/anchor/prepare.mjs +++ b/tokens/pda-mint-authority/anchor/prepare.mjs @@ -1,17 +1,17 @@ #!/usr/bin/env zx -import { mkdir, rm } from 'node:fs/promises'; -import { join } from 'node:path'; -import { $ } from 'zx'; +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; const programs = [ { - id: 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s', - name: 'token_metadata.so', + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "token_metadata.so", }, ]; -const outputDir = 'tests/fixtures'; +const outputDir = "tests/fixtures"; const overwrite = true; try { diff --git a/tokens/pda-mint-authority/anchor/programs/token-minter/Cargo.toml b/tokens/pda-mint-authority/anchor/programs/token-minter/Cargo.toml index eed800f70..cd0690857 100644 --- a/tokens/pda-mint-authority/anchor/programs/token-minter/Cargo.toml +++ b/tokens/pda-mint-authority/anchor/programs/token-minter/Cargo.toml @@ -20,8 +20,15 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = { version = "1.0.0-rc.5", features = ["metadata"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = { version = "1.0.0", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs b/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs index 9d28f4ccc..b2b59922f 100644 --- a/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs +++ b/tokens/pda-mint-authority/anchor/programs/token-minter/src/lib.rs @@ -2,7 +2,7 @@ use anchor_lang::prelude::*; use instructions::*; pub mod instructions; -declare_id!("3LFrPHqwk5jMrmiz48BFj6NV2k4NjobgTe1jChzx3JGD"); +declare_id!("3PMgRxk5r8i9ZFmaKPR55DGAKrBZncLSTqB4tpSxJjb5"); #[program] pub mod token_minter { diff --git a/tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs b/tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs new file mode 100644 index 000000000..35f7ff18d --- /dev/null +++ b/tokens/pda-mint-authority/anchor/programs/token-minter/tests/test_pda_mint.rs @@ -0,0 +1,148 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_wallet, get_token_account_balance, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn rent_sysvar_id() -> Pubkey { + "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap() +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[ + wallet.as_ref(), + token_program_id().as_ref(), + mint.as_ref(), + ], + &associated_token_program_id(), + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = token_minter::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/token_minter.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_token_and_mint() { + let (mut svm, program_id, payer) = setup(); + + // Derive the PDA mint account (seeds = [b"mint"]) + let (mint_pda, _bump) = Pubkey::find_program_address(&[b"mint"], &program_id); + let metadata_account = derive_metadata_pda(&mint_pda); + + // 1. Create token + let create_ix = Instruction::new_with_bytes( + program_id, + &token_minter::instruction::CreateToken { + token_name: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/token.json".to_string(), + } + .data(), + token_minter::accounts::CreateToken { + payer: payer.pubkey(), + mint_account: mint_pda, + metadata_account, + token_program: token_program_id(), + token_metadata_program: metadata_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify mint created + let mint_account = svm.get_account(&mint_pda).expect("Mint PDA should exist"); + assert!(!mint_account.data.is_empty()); + + // Verify metadata created + let meta = svm + .get_account(&metadata_account) + .expect("Metadata should exist"); + assert!(!meta.data.is_empty()); + + // 2. Mint tokens (100 tokens to payer's ATA) + svm.expire_blockhash(); + let ata = derive_ata(&payer.pubkey(), &mint_pda); + + let mint_ix = Instruction::new_with_bytes( + program_id, + &token_minter::instruction::MintToken { amount: 100 }.data(), + token_minter::accounts::MintToken { + payer: payer.pubkey(), + mint_account: mint_pda, + associated_token_account: ata, + token_program: token_program_id(), + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![mint_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify: 100 * 10^9 = 100_000_000_000 tokens (9 decimals) + let balance = get_token_account_balance(&svm, &ata).unwrap(); + assert_eq!(balance, 100_000_000_000, "Should have 100 tokens"); +} diff --git a/tokens/pda-mint-authority/anchor/tests/bankrun.test.ts b/tokens/pda-mint-authority/anchor/tests/bankrun.test.ts index 7c4b0a991..2948ee994 100644 --- a/tokens/pda-mint-authority/anchor/tests/bankrun.test.ts +++ b/tokens/pda-mint-authority/anchor/tests/bankrun.test.ts @@ -4,76 +4,66 @@ import { PublicKey } from "@solana/web3.js"; import { BankrunProvider } from "anchor-bankrun"; import { BN } from "bn.js"; import { startAnchor } from "solana-bankrun"; +import IDL from "../target/idl/token_minter.json"; import type { TokenMinter } from "../target/types/token_minter"; -import IDL from "../target/idl/token_minter.json"; const PROGRAM_ID = new PublicKey(IDL.address); -const METADATA_PROGRAM_ID = new PublicKey( - "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", -); +const METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); describe("NFT Minter", async () => { - const context = await startAnchor( - "", - [ - { name: "token_minter", programId: PROGRAM_ID }, - { name: "token_metadata", programId: METADATA_PROGRAM_ID }, - ], - [], - ); - const provider = new BankrunProvider(context); - anchor.setProvider(provider); - const payer = provider.wallet as anchor.Wallet; - const program = new anchor.Program(IDL, provider); + const context = await startAnchor( + "", + [ + { name: "token_minter", programId: PROGRAM_ID }, + { name: "token_metadata", programId: METADATA_PROGRAM_ID }, + ], + [], + ); + const provider = new BankrunProvider(context); + anchor.setProvider(provider); + const payer = provider.wallet as anchor.Wallet; + const program = new anchor.Program(IDL, provider); - // Derive the PDA to use as mint account address. - // This same PDA is also used as the mint authority. - const [mintPDA] = PublicKey.findProgramAddressSync( - [Buffer.from("mint")], - program.programId, - ); + // Derive the PDA to use as mint account address. + // This same PDA is also used as the mint authority. + const [mintPDA] = PublicKey.findProgramAddressSync([Buffer.from("mint")], program.programId); - const metadata = { - name: "Solana Gold", - symbol: "GOLDSOL", - uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", - }; + const metadata = { + name: "Solana Gold", + symbol: "GOLDSOL", + uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", + }; - it("Create a token!", async () => { - const transactionSignature = await program.methods - .createToken(metadata.name, metadata.symbol, metadata.uri) - .accounts({ - payer: payer.publicKey, - }) - .rpc(); + it("Create a token!", async () => { + const transactionSignature = await program.methods + .createToken(metadata.name, metadata.symbol, metadata.uri) + .accounts({ + payer: payer.publicKey, + }) + .rpc(); - console.log("Success!"); - console.log(` Mint Address: ${mintPDA}`); - console.log(` Transaction Signature: ${transactionSignature}`); - }); + console.log("Success!"); + console.log(` Mint Address: ${mintPDA}`); + console.log(` Transaction Signature: ${transactionSignature}`); + }); - it("Mint 1 Token!", async () => { - // Derive the associated token address account for the mint and payer. - const associatedTokenAccountAddress = getAssociatedTokenAddressSync( - mintPDA, - payer.publicKey, - ); + it("Mint 1 Token!", async () => { + // Derive the associated token address account for the mint and payer. + const associatedTokenAccountAddress = getAssociatedTokenAddressSync(mintPDA, payer.publicKey); - // Amount of tokens to mint. - const amount = new BN(100); + // Amount of tokens to mint. + const amount = new BN(100); - const transactionSignature = await program.methods - .mintToken(amount) - .accounts({ - payer: payer.publicKey, - associatedTokenAccount: associatedTokenAccountAddress, - }) - .rpc(); + const transactionSignature = await program.methods + .mintToken(amount) + .accounts({ + payer: payer.publicKey, + associatedTokenAccount: associatedTokenAccountAddress, + }) + .rpc(); - console.log("Success!"); - console.log( - ` Associated Token Account Address: ${associatedTokenAccountAddress}`, - ); - console.log(` Transaction Signature: ${transactionSignature}`); - }); + console.log("Success!"); + console.log(` Associated Token Account Address: ${associatedTokenAccountAddress}`); + console.log(` Transaction Signature: ${transactionSignature}`); + }); }); diff --git a/tokens/pda-mint-authority/anchor/tests/fixtures/mpl_token_metadata.so b/tokens/pda-mint-authority/anchor/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const payer = provider.wallet as anchor.Wallet; - const program = anchor.workspace.TokenMinter as anchor.Program; - - // Derive the PDA to use as mint account address. - // This same PDA is also used as the mint authority. - const [mintPDA] = PublicKey.findProgramAddressSync( - [Buffer.from("mint")], - program.programId, - ); - - const metadata = { - name: "Solana Gold", - symbol: "GOLDSOL", - uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", - }; - - it("Create a token!", async () => { - const transactionSignature = await program.methods - .createToken(metadata.name, metadata.symbol, metadata.uri) - .accounts({ - payer: payer.publicKey, - }) - .rpc(); - - console.log("Success!"); - console.log(` Mint Address: ${mintPDA}`); - console.log(` Transaction Signature: ${transactionSignature}`); - }); - - it("Mint 1 Token!", async () => { - // Derive the associated token address account for the mint and payer. - const associatedTokenAccountAddress = getAssociatedTokenAddressSync( - mintPDA, - payer.publicKey, - ); - - // Amount of tokens to mint. - const amount = new BN(100); - - const transactionSignature = await program.methods - .mintToken(amount) - .accounts({ - payer: payer.publicKey, - associatedTokenAccount: associatedTokenAccountAddress, - }) - .rpc(); - - console.log("Success!"); - console.log( - ` Associated Token Account Address: ${associatedTokenAccountAddress}`, - ); - console.log(` Transaction Signature: ${transactionSignature}`); - }); + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + const payer = provider.wallet as anchor.Wallet; + const program = anchor.workspace.TokenMinter as anchor.Program; + + // Derive the PDA to use as mint account address. + // This same PDA is also used as the mint authority. + const [mintPDA] = PublicKey.findProgramAddressSync([Buffer.from("mint")], program.programId); + + const metadata = { + name: "Solana Gold", + symbol: "GOLDSOL", + uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", + }; + + it("Create a token!", async () => { + const transactionSignature = await program.methods + .createToken(metadata.name, metadata.symbol, metadata.uri) + .accounts({ + payer: payer.publicKey, + }) + .rpc(); + + console.log("Success!"); + console.log(` Mint Address: ${mintPDA}`); + console.log(` Transaction Signature: ${transactionSignature}`); + }); + + it("Mint 1 Token!", async () => { + // Derive the associated token address account for the mint and payer. + const associatedTokenAccountAddress = getAssociatedTokenAddressSync(mintPDA, payer.publicKey); + + // Amount of tokens to mint. + const amount = new BN(100); + + const transactionSignature = await program.methods + .mintToken(amount) + .accounts({ + payer: payer.publicKey, + associatedTokenAccount: associatedTokenAccountAddress, + }) + .rpc(); + + console.log("Success!"); + console.log(` Associated Token Account Address: ${associatedTokenAccountAddress}`); + console.log(` Transaction Signature: ${transactionSignature}`); + }); }); diff --git a/tokens/pda-mint-authority/native/tests/instructions.ts b/tokens/pda-mint-authority/native/tests/instructions.ts index c06932ef9..0995c6c98 100644 --- a/tokens/pda-mint-authority/native/tests/instructions.ts +++ b/tokens/pda-mint-authority/native/tests/instructions.ts @@ -1,4 +1,4 @@ -import * as borsh from 'borsh'; +import * as borsh from "borsh"; export enum NftMinterInstruction { Init = 0, @@ -6,18 +6,18 @@ export enum NftMinterInstruction { Mint = 2, } -export const InitArgsSchema = { struct: { instruction: 'u8' } }; +export const InitArgsSchema = { struct: { instruction: "u8" } }; export const CreateTokenArgsSchema = { struct: { - instruction: 'u8', - nft_title: 'string', - nft_symbol: 'string', - nft_uri: 'string', + instruction: "u8", + nft_title: "string", + nft_symbol: "string", + nft_uri: "string", }, }; -export const MintToArgsSchema = { struct: { instruction: 'u8' } }; +export const MintToArgsSchema = { struct: { instruction: "u8" } }; export function borshSerialize(schema: borsh.Schema, data: object): Buffer { return Buffer.from(borsh.serialize(schema, data)); diff --git a/tokens/pda-mint-authority/native/tests/test.ts b/tokens/pda-mint-authority/native/tests/test.ts index 5528d3c11..65e31ee38 100644 --- a/tokens/pda-mint-authority/native/tests/test.ts +++ b/tokens/pda-mint-authority/native/tests/test.ts @@ -1,6 +1,6 @@ -import { Buffer } from 'node:buffer'; -import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mpl-token-metadata'; -import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from '@solana/spl-token'; +import { Buffer } from "node:buffer"; +import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from "@metaplex-foundation/mpl-token-metadata"; +import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from "@solana/spl-token"; import { Connection, Keypair, @@ -10,24 +10,33 @@ import { sendAndConfirmTransaction, Transaction, TransactionInstruction, -} from '@solana/web3.js'; -import { borshSerialize, InitArgsSchema, CreateTokenArgsSchema, MintToArgsSchema, NftMinterInstruction } from './instructions'; +} from "@solana/web3.js"; +import { + borshSerialize, + CreateTokenArgsSchema, + InitArgsSchema, + MintToArgsSchema, + NftMinterInstruction, +} from "./instructions"; function createKeypairFromFile(path: string): Keypair { - return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require('node:fs').readFileSync(path, 'utf-8')))); + return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require("node:fs").readFileSync(path, "utf-8")))); } -describe('NFT Minter', async () => { +describe("NFT Minter", async () => { // const connection = new Connection(`http://localhost:8899`, 'confirmed'); - const connection = new Connection('https://api.devnet.solana.com/', 'confirmed'); - const payer = createKeypairFromFile(`${require('node:os').homedir()}/.config/solana/id.json`); - const program = createKeypairFromFile('./program/target/deploy/program-keypair.json'); + const connection = new Connection("https://api.devnet.solana.com/", "confirmed"); + const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); + const program = createKeypairFromFile("./program/target/deploy/program-keypair.json"); - const mintAuthorityPublicKey = PublicKey.findProgramAddressSync([Buffer.from('mint_authority')], program.publicKey)[0]; + const mintAuthorityPublicKey = PublicKey.findProgramAddressSync( + [Buffer.from("mint_authority")], + program.publicKey, + )[0]; const mintKeypair: Keypair = Keypair.generate(); - it('Init Mint Authority PDA', async () => { + it("Init Mint Authority PDA", async () => { const instructionData = borshSerialize(InitArgsSchema, { instruction: NftMinterInstruction.Init, }); @@ -44,22 +53,23 @@ describe('NFT Minter', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer], { skipPreflight: true }); - console.log('Success!'); + console.log("Success!"); console.log(` Mint Address: ${mintKeypair.publicKey}`); console.log(` Tx Signature: ${sx}`); }); - it('Create an NFT!', async () => { + it("Create an NFT!", async () => { const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], TOKEN_METADATA_PROGRAM_ID, )[0]; const instructionData = borshSerialize(CreateTokenArgsSchema, { instruction: NftMinterInstruction.Create, - nft_title: 'Homer NFT', - nft_symbol: 'HOMR', - nft_uri: 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json', + nft_title: "Homer NFT", + nft_symbol: "HOMR", + nft_uri: + "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json", }); const ix = new TransactionInstruction({ @@ -81,21 +91,28 @@ describe('NFT Minter', async () => { data: instructionData, }); - const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, mintKeypair], { skipPreflight: true }); + const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, mintKeypair], { + skipPreflight: true, + }); - console.log('Success!'); + console.log("Success!"); console.log(` Mint Address: ${mintKeypair.publicKey}`); console.log(` Tx Signature: ${sx}`); }); - it('Mint the NFT to your wallet!', async () => { + it("Mint the NFT to your wallet!", async () => { const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], TOKEN_METADATA_PROGRAM_ID, )[0]; const editionAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer(), Buffer.from('edition')], + [ + Buffer.from("metadata"), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + mintKeypair.publicKey.toBuffer(), + Buffer.from("edition"), + ], TOKEN_METADATA_PROGRAM_ID, )[0]; @@ -137,7 +154,7 @@ describe('NFT Minter', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - console.log('Success!'); + console.log("Success!"); console.log(` ATA Address: ${associatedTokenAccountAddress}`); console.log(` Tx Signature: ${sx}`); }); diff --git a/tokens/spl-token-minter/anchor/Anchor.toml b/tokens/spl-token-minter/anchor/Anchor.toml index 85224170a..a4ce5be52 100644 --- a/tokens/spl-token-minter/anchor/Anchor.toml +++ b/tokens/spl-token-minter/anchor/Anchor.toml @@ -6,16 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -spl_token_minter = "3of89Z9jwek9zrFgpCWc9jZvQvitpVMxpZNsrAD2vQUD" - -# [registry] section removed — no longer used in Anchor 1.0 +spl_token_minter = "37nJupU7iBErqAjq5RTRRMvRbmkzngJRGBKG4yA2CxaH" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests — the validator tests (test.ts) need Metaplex Token -# Metadata cloned from mainnet which is too slow/unreliable in CI. -# bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/bankrun.test.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/spl-token-minter/anchor/package.json b/tokens/spl-token-minter/anchor/package.json index 4042e17fa..bcc1cea1b 100644 --- a/tokens/spl-token-minter/anchor/package.json +++ b/tokens/spl-token-minter/anchor/package.json @@ -1,22 +1,22 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.3.8" - }, - "scripts": { - "postinstall": "zx prepare.mjs" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "anchor-bankrun": "^0.4.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3", - "zx": "^8.1.4" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.3.8" + }, + "scripts": { + "postinstall": "zx prepare.mjs" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "anchor-bankrun": "^0.4.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3", + "zx": "^8.1.4" + } } diff --git a/tokens/spl-token-minter/anchor/pnpm-lock.yaml b/tokens/spl-token-minter/anchor/pnpm-lock.yaml index 6c962e400..8858fc042 100644 --- a/tokens/spl-token-minter/anchor/pnpm-lock.yaml +++ b/tokens/spl-token-minter/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.3.8 version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -48,18 +48,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -840,16 +840,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -867,7 +867,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/tokens/spl-token-minter/anchor/prepare.mjs b/tokens/spl-token-minter/anchor/prepare.mjs index 7c5ec464b..fb6b26225 100644 --- a/tokens/spl-token-minter/anchor/prepare.mjs +++ b/tokens/spl-token-minter/anchor/prepare.mjs @@ -1,17 +1,17 @@ #!/usr/bin/env zx -import { mkdir, rm } from 'node:fs/promises'; -import { join } from 'node:path'; -import { $ } from 'zx'; +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; const programs = [ { - id: 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s', - name: 'token_metadata.so', + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "token_metadata.so", }, ]; -const outputDir = 'tests/fixtures'; +const outputDir = "tests/fixtures"; const overwrite = true; try { diff --git a/tokens/spl-token-minter/anchor/programs/spl-token-minter/Cargo.toml b/tokens/spl-token-minter/anchor/programs/spl-token-minter/Cargo.toml index 2cbd907a1..9d602f735 100644 --- a/tokens/spl-token-minter/anchor/programs/spl-token-minter/Cargo.toml +++ b/tokens/spl-token-minter/anchor/programs/spl-token-minter/Cargo.toml @@ -20,8 +20,15 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = { version = "1.0.0-rc.5", features = ["metadata"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = { version = "1.0.0", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/spl-token-minter/anchor/programs/spl-token-minter/src/lib.rs b/tokens/spl-token-minter/anchor/programs/spl-token-minter/src/lib.rs index 56515e829..119e56617 100644 --- a/tokens/spl-token-minter/anchor/programs/spl-token-minter/src/lib.rs +++ b/tokens/spl-token-minter/anchor/programs/spl-token-minter/src/lib.rs @@ -3,7 +3,7 @@ use anchor_lang::prelude::*; pub mod instructions; use instructions::*; -declare_id!("3of89Z9jwek9zrFgpCWc9jZvQvitpVMxpZNsrAD2vQUD"); +declare_id!("37nJupU7iBErqAjq5RTRRMvRbmkzngJRGBKG4yA2CxaH"); #[program] pub mod spl_token_minter { diff --git a/tokens/spl-token-minter/anchor/programs/spl-token-minter/tests/test_spl_token_minter.rs b/tokens/spl-token-minter/anchor/programs/spl-token-minter/tests/test_spl_token_minter.rs new file mode 100644 index 000000000..a51678762 --- /dev/null +++ b/tokens/spl-token-minter/anchor/programs/spl-token-minter/tests/test_spl_token_minter.rs @@ -0,0 +1,183 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_wallet, get_token_account_balance, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn rent_sysvar_id() -> Pubkey { + "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap() +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[ + wallet.as_ref(), + token_program_id().as_ref(), + mint.as_ref(), + ], + &associated_token_program_id(), + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = spl_token_minter::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/spl_token_minter.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_token() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + + let create_ix = Instruction::new_with_bytes( + program_id, + &spl_token_minter::instruction::CreateToken { + token_name: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/token.json".to_string(), + } + .data(), + spl_token_minter::accounts::CreateToken { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + metadata_account, + token_program: token_program_id(), + token_metadata_program: metadata_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_ix], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify mint created + let mint = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint should exist"); + assert!(!mint.data.is_empty()); + + // Verify metadata created + let meta = svm + .get_account(&metadata_account) + .expect("Metadata should exist"); + assert!(!meta.data.is_empty()); +} + +#[test] +fn test_create_and_mint_tokens() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + + // 1. Create token + let create_ix = Instruction::new_with_bytes( + program_id, + &spl_token_minter::instruction::CreateToken { + token_name: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/token.json".to_string(), + } + .data(), + spl_token_minter::accounts::CreateToken { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + metadata_account, + token_program: token_program_id(), + token_metadata_program: metadata_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_ix], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // 2. Mint 100 tokens + svm.expire_blockhash(); + let ata = derive_ata(&payer.pubkey(), &mint_keypair.pubkey()); + + let mint_ix = Instruction::new_with_bytes( + program_id, + &spl_token_minter::instruction::MintToken { amount: 100 }.data(), + spl_token_minter::accounts::MintToken { + mint_authority: payer.pubkey(), + recipient: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + associated_token_account: ata, + token_program: token_program_id(), + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![mint_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify: 100 * 10^9 = 100_000_000_000 tokens minted (9 decimals) + let balance = get_token_account_balance(&svm, &ata).unwrap(); + assert_eq!(balance, 100_000_000_000, "Should have 100 tokens"); +} diff --git a/tokens/spl-token-minter/anchor/tests/bankrun.test.ts b/tokens/spl-token-minter/anchor/tests/bankrun.test.ts index c740d1ddb..7c59e6eee 100644 --- a/tokens/spl-token-minter/anchor/tests/bankrun.test.ts +++ b/tokens/spl-token-minter/anchor/tests/bankrun.test.ts @@ -4,78 +4,71 @@ import { Keypair, PublicKey } from "@solana/web3.js"; import { BankrunProvider } from "anchor-bankrun"; import { BN } from "bn.js"; import { startAnchor } from "solana-bankrun"; +import IDL from "../target/idl/spl_token_minter.json"; import type { SplTokenMinter } from "../target/types/spl_token_minter"; -import IDL from "../target/idl/spl_token_minter.json"; const PROGRAM_ID = new PublicKey(IDL.address); -const METADATA_PROGRAM_ID = new PublicKey( - "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", -); +const METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); describe("SPL Token Minter", async () => { - const context = await startAnchor( - "", - [ - { name: "spl_token_minter", programId: PROGRAM_ID }, - { name: "token_metadata", programId: METADATA_PROGRAM_ID }, - ], - [], - ); + const context = await startAnchor( + "", + [ + { name: "spl_token_minter", programId: PROGRAM_ID }, + { name: "token_metadata", programId: METADATA_PROGRAM_ID }, + ], + [], + ); - const provider = new BankrunProvider(context); - anchor.setProvider(provider); - const payer = provider.wallet as anchor.Wallet; - const program = new anchor.Program(IDL, provider); + const provider = new BankrunProvider(context); + anchor.setProvider(provider); + const payer = provider.wallet as anchor.Wallet; + const program = new anchor.Program(IDL, provider); - const metadata = { - name: "Solana Gold", - symbol: "GOLDSOL", - uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", - }; + const metadata = { + name: "Solana Gold", + symbol: "GOLDSOL", + uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", + }; - // Generate new keypair to use as address for mint account. - const mintKeypair = new Keypair(); + // Generate new keypair to use as address for mint account. + const mintKeypair = new Keypair(); - it("Create an SPL Token!", async () => { - const transactionSignature = await program.methods - .createToken(metadata.name, metadata.symbol, metadata.uri) - .accounts({ - payer: payer.publicKey, - mintAccount: mintKeypair.publicKey, - }) - .signers([mintKeypair]) - .rpc(); + it("Create an SPL Token!", async () => { + const transactionSignature = await program.methods + .createToken(metadata.name, metadata.symbol, metadata.uri) + .accounts({ + payer: payer.publicKey, + mintAccount: mintKeypair.publicKey, + }) + .signers([mintKeypair]) + .rpc(); - console.log("Success!"); - console.log(` Mint Address: ${mintKeypair.publicKey}`); - console.log(` Transaction Signature: ${transactionSignature}`); - }); + console.log("Success!"); + console.log(` Mint Address: ${mintKeypair.publicKey}`); + console.log(` Transaction Signature: ${transactionSignature}`); + }); - it("Mint some tokens to your wallet!", async () => { - // Derive the associated token address account for the mint and payer. - const associatedTokenAccountAddress = getAssociatedTokenAddressSync( - mintKeypair.publicKey, - payer.publicKey, - ); + it("Mint some tokens to your wallet!", async () => { + // Derive the associated token address account for the mint and payer. + const associatedTokenAccountAddress = getAssociatedTokenAddressSync(mintKeypair.publicKey, payer.publicKey); - // Amount of tokens to mint. - const amount = new BN(100); + // Amount of tokens to mint. + const amount = new BN(100); - // Mint the tokens to the associated token account. - const transactionSignature = await program.methods - .mintToken(amount) - .accounts({ - mintAuthority: payer.publicKey, - recipient: payer.publicKey, - mintAccount: mintKeypair.publicKey, - associatedTokenAccount: associatedTokenAccountAddress, - }) - .rpc(); + // Mint the tokens to the associated token account. + const transactionSignature = await program.methods + .mintToken(amount) + .accounts({ + mintAuthority: payer.publicKey, + recipient: payer.publicKey, + mintAccount: mintKeypair.publicKey, + associatedTokenAccount: associatedTokenAccountAddress, + }) + .rpc(); - console.log("Success!"); - console.log( - ` Associated Token Account Address: ${associatedTokenAccountAddress}`, - ); - console.log(` Transaction Signature: ${transactionSignature}`); - }); + console.log("Success!"); + console.log(` Associated Token Account Address: ${associatedTokenAccountAddress}`); + console.log(` Transaction Signature: ${transactionSignature}`); + }); }); diff --git a/tokens/spl-token-minter/anchor/tests/fixtures/mpl_token_metadata.so b/tokens/spl-token-minter/anchor/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 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

F0xg$bY5ePhOAaaNH&G4#{` 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�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�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

F0xg$bY5ePhOAaaNH&G4#{` z2OVLR<+Jvoz2^b&jrAq`@6F`D!-M(`I9>QQ%69a%^;tab^kP2S8PA^#FkM^4c6Cwz z+d)2r|0d;xvRJgUK`?8$S2`Fe)#TE_0sfN=7m&#P~Z3EJ}=)7s$OR3@4bNY^jGaetiP-m z`0fT=3;hkN$++t-fg7y+R{hIh^*5X!N$=NN(!B1Z_7KKWezE>uZD|A#@&g?!Ukm-E z{VwD_^f>gXRK1gYY8o%ys`*L(-DGLke|1ggbruSE{-?)Xn@N|&wX#m9{ha6T>>*^hG_+f3iK%Jld0RnC*$?nLSx)cE{%Do~i4#xMh zc0e42{`JNu)Bj4v(vD9bN%8SIOFKR{#!WsQ&=<(tD@50l_(>d>{7RKu6%XzuL?Cwf zAoB}yP7pfS*W(K%oe%nzzkdE&&F|BEje`VFxk$V&E?QLFsP!zeduC z6}N{qv*UG}2ObVoAJMK;UygQ+syz1PUPixEadu{oP}dmW1Hao}nPt~E{{(iO_!7H* z8u57cO7%R$UcESFuUf?$vs3n}G2Te*)$>yJO8H~)hHtN)y_@z*-q-95 z<8sk&OVdBdytJl$`N6nH#=lMZ%3t4}m|om3u~?}>J?hIHZ0kB#G|Bm;($ajeL*=$q zy^C}-+37nqKe5xdTH4uZ-dC6pUZwd@)L-X=9>c@$x0>hK+;?0Y;Dpr+Q}mpx>3nb+ z^XJ(*Ko9k741+fLjj@{pcOFu>2BYUjz3PX3Uar~d-|iR%U;C9`@&4J>y_w~rj%2>_ z7Oz~gf0pwI<&N2^_hIc)#T(ymTECd-o>_c9d?C~GEDk#6Fs(N_k$i~GVt+*ES-itx zSUk@r`$>prO?M`}uAOfG4eZcM)NZi7iGFNTzJ@o<&Bk+?X6wCwt@hELmWlU4;=OJ_ z5xDO^vi8q@K=_&1{UYJ7o8MF}Jx{%&prz@^rh0@qXVipeQj?4tohF(=Z)pN z8}>`b0OuWQ1J;lIOxMXjiEA}I@jUb7_RmI3IN#yNeZ8r99&L}=RrqT+{}{Ke6c}!2k>kvg@-opIr{+d+%ovZ!7uV%=1RjLoo`*4re z_mFo~oDY6L_!~G6(YNQNuf>$ZqKl`T+|H$*#pf7yTiWE-;$XkO zW}9ERT>1<2aen1xne_SdfRK}LJ^RN$*X$Q^u7tCriCuY{;&c7%zWa(gES|OVSmfMB z)kk*^a@4VkY3pZqu0cLnnMt3|zZ2*B{QJ@4;Gf^_v_8E?_zyXsBXHpV0V3yePJr>* z?4re=ZhmL5a;LsuWandD-53gzcgA`e5LiAXDU@b zsPD_gTeKfbcAkOEgId3`T(ZtSr1?>ic1!koTAKYY;~PuUZppl+rpqQ5r3&jQ7hk0L zGB0BAv~M!s>B=izgOwecUR0!g^!cmy$?OC8dEW@^`svzlkh2Trukyk4XD;r}2QSw5 zt?=yZ`;E(foXA~YZdTK}aGIV4U-RX|oj1K$>ksYRsL;;;+}XMa@S=Usxdr$(n7lAf zg#3#s5IbY?AJ6xUQ?6q@wQ*p4-slc}FY%(mnV%_cw|pBHR*1*>9hraT`-6ob`N{mG zrQ0lR>mwFFgv&HLUI&S228G@a>I=6XQtmK+7{@W@592t-{9zo&P+r{n-b8UsK6oeV zt5ELB#rG)PvOiJfOTHJ@^k9Yc%J@vvi;5%qlyg~4kF34Lk6XU^Wm{j0iZ^I}dF==J zT=@aQnV$=}-9q?g{>Av==K0ajTke7!A7K1!$+wKdy5*ZzlEVm{H z7Dq=#vl}Dk&okl$*kSPXz;VP2dD2_bhxk**wSL_CTbVP<2d654?~k7@Ir-p4nqR6i zo(?Tu3+rYNhs{q;xQ~tF9zXtCC4SQPe`-$#Nhkb9zx;`Iy!6q=e!ejkf8A<+=3;|C zGX)QS?BXvUZ#Uq?hT?~L{OypJs-?xq%tbkm9&vw4&kIq`n+F(0x$9WYugAeZFGY{~ zNs~*^ zWL?Pgo^fkdeNNuKruF?%?MqA_)i!wI@d?i(ipQg7Z;#${itfXMzuQOJlMg89zJB`W zYGuv$to{-FT(|m}zTC^{=WYPEC>NdbY{F-HmxXVIhcAiO{z>tTtc*isGavmm&50_-(ozaAM zdnR7a_n_T3i+ytalkk&{B)qO&dS2vO+MPZ}cah4Y)mPDK)i0|&SpNb4T`v**wqLk! z?;~tI#>EF_Z>znGLptVCFKcs|?&@Z`PWg#?W^3BT50N`x{Y2?-`9)`u4tL&!v#aF} z&QpZ7a}6*3U|4?{(>=CMJ$we!^EghJY&?*)f9M^c$Mh&4{8jbVm-E?TM`RvO$Bn*S z1pi>S-1zv0-!|&UK`HzEvefwax)gjH#y$4EyN~z10#{x#P5J5D>Ei`HT0(yN^lHDF z{-9rvZ?J#x-i`JTE-+hJ1Z9aH+3w&{eM^WIdv zbVLe%p}@y-Z0oRooN}n@CC3Yi{L@aTJ^d2mj@1?iaQu+O?VM2d+l~6%Ih81Xr?2q;*M2P4)9<3GW7|J?$h1&h@-4r9Disx1o61@ASo!naDV!dsA%iqJ+=h^sT0MZ`4RL|Si#5#-a6WkZ6t(ObD8Rw zi%)oe=3vGAK+)u(V)Y7*)vjlwuyAb{%xG;*uQOLI`(gz-^d3iYK4A0 z*)BQxpikiwzjn6jNm%9gdXe*=Res+m_cQQ)joq|mvQ*pc(}jL>@fPGdKgW-I zOkU%0;XT%G7N>N$^(c!|y0{J{-y2!{VCzs5oJZl)19=7=n?xV;!2+$%_ru_$&%ZN3 z{~+ZM?R}a2iSi#z@kRGLTKwh1yKc77<7(woGM`7j$$kcVPyI{V6~F!HKeTtI+An@6<+p=+ zNxS6h_g}^5HpjR0pRhX!(d51rrNh^^wVMA_ZKt1qh2}Gs*crY3BA=jlU!~Xajpx4j z_^uRuNu2Zrr6bXAvmbHXYW5?JTg`sNajVUbPOu&)-vwzsZoM(;TBGX^$BO&x6ngeM zU7IcUGOW^kpU+z$hgH7U@sRn|$L<85w`f22%^FXRX3}%D;+qUT-^irrO{AxqO^@7nqjHc%kNUqR{?JfO zhMv!5(!+T`vG0_hRDVSs12H}6alCw{OyVXfWJ49buJr zQMR*d1L>(h z%ybXw35Q8fG>`O7G!G)*D>wPicL*K%;P*}WpVNGvC*b$jX7QJDUWwA<`xnRq;utp{ z^44EB%F9iuxba~bw*Y>o)PsJ1OA3BS=R;VJk9UE}xseL={9y7oFONB4#`3tn`hOY`e#+R_N zRNL$NRpLEM&t^Y+d|GI6#0R82;xf+POjCVDyBp_k+B83`5Ra^HYkR{A`&IT^Xc~CX zA{mcp8h9G#aoDf2?rn4hhIgT*cW61k-H=m%9tU!e=7Z~Je;#L8&Y6_^f>pkf{+_}9 ztI&VQyph%`_dV!S_l=@|E$!a>^q~H*n#k3kYgux2wARyHZobxoe*5D6ps!uqFY{TN z-$3f{M~a^9l$Gwh(lf49K9^SsLL zoaI=bsb8RD(Vd9b+qB=@Im?9{=i~f#slIrA_);w=iYULlt|~R!HGkgN$Ft4s!w;mq zd|#&g^X*}~;@d&FshA#F{Ndx-F8T}lFB!|4*Rpbxp4TEBQO{voZ`5@VpB+!tC+rVe zD(5$9+Sx^)9^E%9I*T9XwIBze@5_=7>-{V@JfKg%T$bJO*PRbhdqex?*4+lpuPiF^ z-XYm9qIli@Ala8->20jn_U(%O)HK>7q&1wUH{&ZJe-%(K^vnCVK#l<@D#p=V`EhXSXFzb96P?U9`iiHo?QjK1=or_0 zACD|oYq?j5{`q>hOiH?VGatM`@g(;1&x$9k{!ZH!br?UZ4_cb-4r`Av-9>r^Egmin zvwUL5O%8Tv{$J?N2j`N$3eUqV7r72lsywW8mW%JzXS8yaJ_oH|7P^SbMsEhrC{QixXE<(N>A@e!8ry_=*{V(TSh5R?|`PFYn z)_%Z0W#Q{@M*c6pd&QYim&r%!oIcT4wcqZ%(P%BtJ5TqU-~TEPGS`Qnvln5V<4MTH z>LJ7r?EfTAp&|A0DxS*}jq20zILeXEq#WbRaD?r3`}5qm)y2jBe4TXDI2G08Q17Dtlg*2sA~h$bgO28xb{TW&ap$uckrWA{`Ai`eT(di9V6Kd>nEE9 zZ#qszJu|){erDZfwrgaIKK*`%-pjd@nh*G=1K#9A)|E9snl(!ail(>ox!A@P^QD0N zKqp9wrjxLyIGo@?^lrWfyr_Vj@5%DfTGk&~yM6i~hhdfd4f+mwk)kucp$U$vsNij!R_Fv8UvZy-QyQ`@N0NXaW1%og+|yqn2On&&{v&O@UR%c!P41 zrW5o%B=@|@zDKPO{qbw>K5+O6i~s@mV`01-zlT?oFWA=tj=1uGyI^c!TR}iM=>iYHo~gThZ}skB+4LX-@s1H4{JZB z@yNVP%l3UbvweS5d}%zsA9wor?M!;MYWddmY-&l*jhXcPY|`|6A(NhaNl(o0an>(( zCA|(*xdY?M$=CO(%=*St^=*vnYuheH-+s`)4{Cis(45Ke`{SAQeOAjS^0XnYZ&hl( z{GD3gwrZ=Q&<3Y4G7L znXd`!qwJsI4Vm^M9k;o-9p#Ie`uag7K*sxuZ&7iK`0d{GWWO5gm3c)Sf64jL3g_-e zLmVbmG{l!jNxb3naZK8=lkvXc+iuT5$15^!;dsyX*SPOiWISzj&bRm5H0{?n4nBH* z2Yy}dhf%)!1sE+W~J!5Lfh3&x=ilk zeOQ%Qq^n4K>$ekp1D&6~33}LR<4D>`#6i%gd~mBaROTNH&wPz5-S;LUH}MmtTJSX={DE}a`7&}31LeDB z?dYPs%eou+Hf;1yuqi$`zZO-MY#>@4>R3kdNs^?qIslaqH(7i zFS_{OpKp1G_6zyq=cA|c@*jSF{wbPI`{?Im9WI%-;kks#K3jed?!HfqIxe+#QXiwP ziz+e437E(xbLUncKj9iRv8@Q7{J|| zf*X~2booxy;Al4hcXtX-?X%gRu*!DBPIn5+0RM$YQv8wnWj;;u`f#_U;BcO0SY^9? zxSLaO_}(V0vfV!1O)0oF3deT)a3d+WO$x_$`*7719L_I^?SGB@#`$7yeE;Hc*xezW z|L)7ZNaH47PMm$d;*LhSfZTy^U%wslI$QP0FV`TKDL)B%`;G7KP0^b^PxSfHPQYJm z@b5~&qyJs|e7wuja4L7B+MmAP-YDf!Zm!{9k}8LFkwm^&-iNi}>fKN8yk=T|M>1pf~d{wMn-xgXKDuZW=KK0WzA`~}aQlJhm_|7v#L zR97d{bvtjWXBN}LJZ~zR*RJWw`U_tUocuh$h5Woj<%jcCvW~9&c-EnLrPqB2UdZvi z->!EGL|&tVMnAJu@|{2N=|H>&e!WTSJDTmQY@*$;b(X9+Y?_oq9M+wRcU~*)k@ZHk z|8C!U67Ni>pC}T)Plw~js!#gy4)rpLcWCgvc*oYK%l&7$=)Y6nE(K}01j$}M$dZOqW;s__t%ayL@T76p#o^q9?SApqOe@d_Z zDEb*z0+h-*JoM7}JKrw6Ck>}@XEQwm zDgC`BRgQ73(?^!~_5B?wc-k$(`F6$W?_z-u%}Kz#p`8?R!04LuvV_1Cr2x1$E%eyZJz&#!Dgw-S2d&MC%xPI{c6 z^9AcUKhigq`)Cq<8K)e^z(F*Y`xRzMeFg{J}ubW5*t`fBMln)da8_TT!?`Wf=$>N`>Di`Fh?x%J>a*Y6t73EZmv z5Bg@yeb+vI%BPbz+DX7YF9k>cMf>H>8vxw1Q*hK<@=4Yo<9d%v!J*&d^@Y`>8|~_p zKY{n@DZOaZ@kOFP4({L-9LGPT)5o`e3XbC+(&@uJRp7+mnO)yNd5X^m9Bm;Nlxxfj zsy-B(_Zzf}op5q4`>CmqHS!zdANi;49{v*IFvhp=6PVh`2hUOl`Tgen%lAZoCo@mB z{V$9g7pDB%A?n|@H`<2-+q6EJ_t1P{V$QJ0XI*U_%%o;_(=aApO0$iu_Wi= zn4X$HOYRSF@uK;q;*jadMtwT{P0qy;fzkR#?Y*O)MTVIF#_DTup z&8@!x-)EUUp?vxM20eD)`}yTQCFT73U>E%Q;OE>vF_i1J`qrUbMak8DZfbWteRgma z(BB9>-+Uh z7jp*axC=yNqeyPh9}G5rdQcEUE{CO#6Q7+*G~vQ>4q+ zn@%Z;`p=Sf`E=4xnO&FmJGj$QaPU)Zo)dg>a3`nW;HO+We7KVYF7Z<)Ke3;p{P=WH zE++OzeHw?%K|Do%@HQo^4DI@2T<>&D*N!Ct`Ph-GaW8mA-|P+Y_~U$+@(LGJUk%uLl1O zdxe>yvgPN4KPy038rNr5eEX@}Fn<2NzK@n{(s}=}OEjtHL#>iOeZEaY|6IoR;NMN( zk$pO&)0DnK+r2si6|EgtJkgSk#P>$SH`UJn8A- zs@!ZT=ga3WQt*GmxXkGG@%~ic$}9PuiaV#MslBG}VU7F&J#xi{e3xPEj^m^+Xv3Py zSFOEMq&=YfYNmnbW8hyCp3i3ExhN_3segg|r|Xx&zWm(1d)R;0De3U_7%ef_3`#ENP90{rTD{gC!ZIM z^I00uC)V8>?hTs9aY=lS-8|fehW@c}xn~#D&I~J>z|{}>{$)d>9K(Ldxh<3mk@1vRmRq$}{RIU@zeF6Z?|6d^Tzgd1K(=W;ls@lIGLAJxsbR-&(I6>W7fS* z8b2G~V|g{Z0RJnj)&AdlC+v@ni`LQJCw{m`2~NvD__asM&!PX2|2pwQpv#Z9-FE^0 zeBCLaJN9o+*Lvh0SZ!}qd_dbDR%s8Sj{BId(H=xy_b^?jJ&1bl(sXp_bj1@LCxpl^ zdLgWaJYS*@8UOM;=u(yAu5!l~!)xQNuFZy*@k7+JiRodBALflSJw!g0+YclDPEK@1 z-8|1C>V+2<*&`Y8x$H^3KO~+i*K1_|qNNLLe}~mmJDlk*(lJ;k9i?F_@95|y9pNzX zM7`X-SK+eDyHN0x)n^v>vc;ty*u$4 z>=5MhCXr8Ho}JvbrSf540UxCDVP}#5U!Oy~c^CEbZxGKd68ujjp1bVcCnui!%+DI_ z+(hx*`V@Stc&;vRyA#iKX2vUCdbt9b6JJN`cL z+_VjicA!-}w=EUV-HJHkU2NB6;<@ASo#`avxtV~g7{79|e>)Y=wd4IR#B&FTJ@WCj ziszmtaDUHuZk_1o?!F!5}mdyUE!ms80y3E7d_=)Sr zvfsqgTsM~cdsuIUbVNn2?}Y1(z6!@fQIYfWGB2#~GTzjBeETqf`D7a(V?6855Ble= zLZ^*8_m*J?=ABEG`?NgfU1VD5@$>Cj$ZA}h?Eq{lu zdkj{3EzNa7pDyhen?La9XAbLzU1WQb@$HeQPVU*|`r+7zH5v06{dwa?oZC1{UzF-> zM^k;q2fx0(`;+?QK1OYSvaWfy;*)hv-4+${*n1UZ{V_IWbB{SmXQhQHN=MSbdoE9cBCY zsvM_BM{(R6Ryj_Ojxu{`>t}A=d9Xx27IHI*&+eZq>~S>Hw$3|d^uX`PKe-XvYt0iIg8ix zHflOrvcdA*`Y_M+iWUs<{mM1^Y|@hp6n!vu4xixbzzMid^t-AbrP_2Y*SE(MU4OuO zs{E67iy@JpTVL(l!{h-k{`=+nWMJ2QP(V$6aRa$O=6hj zKE9^>6|(=#$<>(cXM$Yf2YmRmZ%?B~()h`FN{T1y;yh_Ak8XanLO9sN`Pe5~v$T|7 zgLK`}qDH=)hIXGA`1U86nk!Z2YdaHrcDNRF{R=w_k_x%!XujM37miS`aqm3dL(Xm< zk;zf}fp5|+IzK4px*;x9dX^Iqblm!4p<^BAE&KMmSo_QQJNe#B=T~Jt*6bSR=j9xB zrn@*lAJ)y!^st|zL(HBXD;3BuI?3$W9M+o;xIR*QYOm z?bMJ~Fj%GE?3=<0!z%se(NoT3f9F2>I7&LZln*|le%9AlU~>0lO8eDsjm=Q>(jRYE zz9;)LsW;^g>W%nq`dd@jLT;HB6gj6K+2ehh_Vo+rulwUe$PxNy_47nO>>QJ@+N_fup zX8+6yYbVc%+~#zhG#}ige0Tf`ce3BTTljCj{oH% z@AH7Yf&AxnRZr-u5+C?5OXSX-8wfhU6422h_?_J>+kR7De$#g48=udThk{lVuA@DX z^*+WaZl9UO4L)9{2iu=3a=zZ;u%M`T+vi3-)%D?!#i+sQZ3%_62 z$@{eb%?AwJB~BrIX79qf(LHQ&-uY(d=19e;$Lw4g2Z+e8Z1KON+nwj?*FPd~`QYoU zrv=?{JC`e3?T_P5ZIq|2W-kuDMdZ=!j_f;7yncOnl@B&*{u7OR^1<1UgQ8Gu6n^_j zAK?eN0S6X6_i?_rer?t>u3wDJ)?&&1z83`Bk%Rk{5II2Z_K{~kI0xC{pGV2BS6ZA{ zTw`hHuZJ`}cCCVE?w@FfU%ZU({kZ=Fr$BDGPSuy2t?{8-mxR9uVQwAU&mY%(u46|_ zIF9q*59oXPB|pDY^XZ?Wl^jp_^IA&hpa99wUw<5xH01sBKZX2S`)8P+Eppv4oT0^p z-c8yM;G_J*xoS*{-e^44LBHYKfi18{=4br;O`30hrAWUb-(e`f-8!bT6FZBW)Ly_C z%MZr|ZO3@r;(7UAh5dIq-=m%Pz9h?@FrXVN5zejS0{&~#k9oaiRm#QtIN2{@ypNOp zk?iASKZNlDyZxB0m||YdT)vuJ$wCVRBaM zWx9)U7S`u7-80VTbhDGQh%cILaypmwVtxc~Tt9+;Zx%b251y?6(Mrab{`~Sd=&xFN zkz;MoGNxgFI^|E`dDTxvU)PfFzTe&gdGpFI1wPMjcU$?FqWl8((-@qE{6Oz?z^CNS zulEco=hN%cH+B*6`0%Hoo+aeF@Bfsp)d_sJ{E2qW27Zqo<%iKD-?98RN&vruf3Cp0 z`5@U(pzodC8@m|L#G8|+xsPD%EX@w$d+(e-o6r91Yonj@{mZBni40Em^Cy-1Wc+j{>sv6*>Z4;x*C+SA^Zh!~ zHCARj!Pg;O?;#xtUeYc0`7eNsmIPYf$GZyOuUNkV&%BKSx0d_n!;f@p1)=q0IJ%1U zkF06JvsCb){5dGUWIM+>EBQSg>?$}f<1)<$-y8Q)k?t`5jxON%E&h&fhnDl{#&`Yx zcoqD0?FiSAPmVv>FC-$R^7j_y(~#1i@aY6?XV(5bA1~VX$cv=^?7j)PuT1guP3^Yv zr?tDdP2*UZS0f)fwlZB~`=hQcOxM|NId@*u6OTV>SLB=p#Vh9{vOj7(Us=u*WV-$^ z>+Kn3diVjR=ds=8V-M5zMkmn^MRRQb$obR@7ysooiiRJ0vg$iP>5_dKN_V;ASH{QB zXFZ}X6Inv+`RRN9~667(Pr!S2REh4JuKriz|RyA$lt0Iyy}5xmmS{s2%MaIul#ax zn;SR!_1$H9`}~{z@7@u;Hhu?=@7|q#bo`KWwH3~NXA>SeU(-H*ZMWGE(0`<7ryQO{ z54k=aeo)ag@I~>^EGr+TczBZX1PGT)Me@t~PIjTR7vu5isqy&xr5|Pgo63#jQ~dq; z=wi)Jw+rpL>U`J(v%6ETRy*LsK@KFoWce!F1-c#(d*%0QU#ed_Q+^%`7=Z5-6sY&? z6#P>KKCH4HA8(J!L7VzbcP=u<0}=*29!)1brOLS~Cped0LWE$ByoV(y+~*&z=+?B8qwpGoqj_nNEA|h+`vBc@mNx3+5cpK&cXs~w z9mh)G($LQeXWy;(@(#H5tRMS82hgw9Za?ln9B`us*Jj^$EHk>TUqRpWRK3s(@vG|J z-FMHvoa~d5lQxl~(EGjxJpsJ=6x?jg4_P~Wd_f9sKHy9*eYn3q(8$Mj;g9%3(phW% z9^=EGM_kmdad)E6hiiZPd`5dg@3+KW`T6Ka4%Gtnjf=xq2pnuYZfnbJ-~F`;)NcrJ53ZH zw9@Z<@F?qFXL|fb5it1`roKv_KHURiAHxxgFE7*ADj$bP|AeJ(&4}&ex&i9v==>)8 z*lT`env_HQx3`p(arJ)z0ph>LefVvfFL5gQvtU=_#(u3|){7NSSn0Ji`R%t){W8sq z-q)&r#oFo4tM>2rI8M&>mHA<_kM4U`Ti3AoPu5c@*A^!no%^v`GTB$GcDFCLg?w{% zblF^{570-0J*peuuDSvCaGv&?KTZK3^TB48cXn-gH`8VpOEubaw+;lo#81Be+^)}z z`Euoh&0{z|K%d^wr+TS;?aLkYB*nQOZfZB@8~>pEl=(mHk8;N)lwve=Rv* z?+VI&alW?0`Qg6Yq3U-_c5fx@Aq=70_agUrD7@Uap!$-`b5L(&-NoM1euzF;n*JF2 z2!4jk%??a~*O&B>`e=|xXK%NEhWoMZ6p(^Yf?rs*xcY!SH4VJ@l})bm!5!qwY7r#) zWyNFN7LRqN;;{>1$1B~mFNQCU$JWhlvNw*-56T=;X?;88b?QMWc_rVHaT)tLjK^i< zTNsbaOn!#h&ZxkEDLR_%iC#edMQ3XB8s_iC-97HU+m>}Y<%6%s2nF4GjX!VNE9Lxn zO7(J(_@T$J9MH@C9%%Hhhhh8+r1ArwXIi{?v7`Y%H3hGB(CnU%cTa&UubuuF@PsA& zU+_u4`t5OYTFC98@uFMLpCk1`5(;uS9-d*%{LKmTfhLIk#))W!q)+JP^Q2BbZQfMo zsoC!bYIaOV`n#WS*yc6naXz=z_d@Qw72gl|_742Xj|x5O=|B3W9z%L6Zai=PJ08z> zsy-!hGmGh1ZWzaelaw2||JUrA`)+@l;eS5$wyVwXbKN2837C%OdpZBRJ8_EBn~KCK zK7U+1^(WE$e872MUw(yU@pv#FY*qUG_!aSWyRa8gJ4@jBI7t~;jNm8?ryJYUx0!I-x`b(QYt zVO-FcyHV$_>&j|HI+OG(VcRh3{QlHOcSQ z()5Eb`4;k2Qu+9_+6CV(eOxHd2X9yU{rt6>&xWV#ar%jQq4a$gpOb~d=6MX__wjUM z+~nDfL7C5p<0`KVHvQZBPJQ}#+AaQnqm)NH_0K~0;QwLoTj1=fs=LokxMV;p zN#J4_0!+w*I3+qjjB$Jri(njIQMn{WT5`Fe#MIUdQOwCvn*_uVwI+ZPBahsBXEHO2 z8f%oO&v7J$=ibRAKHBg5{l5DPoZ0*Az4qE` zuh(Ataq6%8Pj-m+xbxRvdwrT_PAV7mxeB+@B~PBWN4NA>dnYePRF|9;4Q(zjFc zSq>@-<+e+D8q!Vkv%am8pY(3f=Z-a65A=dc#Jpma)vQ!w zd8YK4LMYI4R1Wx+3NMl;`%h2P?KjhJleF@GNH@`=LH|Vm+I)ulXu@%IJxBg}9QTR0 zj_<|Ne&*-6{sCd|3)^)&`6RZ6m7{&~K3*%2)Ne`Uc=jrNe}0cV)AglUT0U8B@sZbQ z`d8`id>=L_^LI?&r25bNkJR5W|0DI2&HqUK9kmaBk0tl<@fSC2elSzhOEG>_Al1{A zj>Tv}i~P#G#O4*rRIOKxE|PLt9LMx?8pm0o`Z|r{n0`*Lk4B_)h-SLe#nFLHSd%Uy?ZnZ7wF{1U>aK0zF~C13la_LueX5BjQ&e&V>B zK1%&9^Gm{W@&C1l{?EpV(>#4m z50Bogd`kEe#NX+XaV!^}ZT^nl(+s^J^r`x}_=cWGNbDRu^n$!k`u52adO_36_sY}t zU&zO#ug@z&`kse=rt2!3dIZ669F?y!IXa8<3&xFfPUkrRozEcLO=@StaS?gin9W#1pJj`Tf`q-Sa5jmt=lS zI9_YW2bXDiwzK`s(C_JfCA}{pu5A~-Oy?iZQs94=QTBJH~s#H;g!yda(EA~5xhb6HhReqghw;@A54D&6AO`uHl{Mq_P<>ycf6?fQv+ z^5GvL(|*Kr&c`+G%Pe1?_44J8iGmmLI~DK!p2K3aMj$xfaUiA^UnBX-PhtKd z$ydG%^CwIGTA3;;#$CmtklCOSw zi04+x*ZF+Ycp!iDM*I&y?sMtEljC{@p7S<7gW1vOI(bMOY%A%zQPcVH^Y}nwaRHA9 zke?pC5Bxc({!Q%r(i?|G5BYePqGt)9{1F`|Q1r2kv{dw2p&+{|NrL zbg8D3zAlL)_`Exwu~}ZE=W}Olu=FA+7tc@zfLvR8jlExIY4tn&JV^Yk74kl|_!aon z$}O>a9hP2X>B*K}Xz6K|mL&MR$I?CaewC%?T6%@0yDYuT($g%x!O|cQe$WS+o~a5r zp4%b$p*`Sza!KzRDVN&!o1~c7tDQg<>%%fXEf=0C{v^IT`!kk^`&|zo(e&GOT=VeV zkK(xf^#Z^fR{1D*oNen@hXuaxpTs^CO?PYDE^gTUbG-+ily(OcAKW7)>GA!7Kamb$ zT~**#yLT&H8v32`q<2`;_Wf?ejWj*@h~lw)yQGhQzxQXPy=47ip-ZykkUYcr2Jhbw z=gAxg*JHE?zR&Fw2cd^*0#5YpK(5}Sn0K-KEEFMqhjZomeIWPCL%0o;t8UpT^t<0o zVrA%+k}koZ&`)&z84oL8xjtk&kL||zHV4phW91DW=Y0Roc}@O;g4P* z9fUqHKG66C=1s;28lS*=l%{(hF+MQ9=zCbwMfs{B;)femUP=Y^2Q$CM&)KOwr|0l? zn4eu!IdK0cq`UOT{T}NV^pWrd>G5K0{c<@e6{d)sWc+69)G5CiU#I+Le4X-}^7VN9 zR+O(CFcjC_C7aku`mpEpD4dOypB z3#6YoFDC7k5MSpnj7#rCx)^og|IPWgAno57^6$TMoQSW-{o|UC(-?Zi#v`s9f12Kk z2UIT--|p8E-)Tml>HkCe=3;iYi4L3DFY|l-{6wbbbiCt+@w@3c+>0P|g+HNuKkj$_ z&X;!M+SO*4-7i>a>4Rb)v2VlDhb;Y8OCQ#>$$NRy6qzYj>^nb{SB{V0_lI+~QXcou zE1orl2R&|SZ4ds6r4=8N}S{^R&P_%ZI={j~LKiO3uMvHbUNKPBae9r2^~ zQvZ&Bx!)ebKV!P;$IpRJ(EaRO z*Wir182vl`4|yEwk#GHbmcl)S+NRJ+@*MROqztmpVOfPntUPJw_p^70@2iHt>rL0AbESWo9Bco^)2kfU zrge-q@vY*^LjChb`;PlUY0v2&+SR+bKe=1^EzA$?E&KJRCjR*=AyBBtCLyO7y~pH5 z^-{V&_huV6KM(HXIHYuGw=PS1LoUQGVEd1(Z?>P2#J~2d-(cg#a(g}xdp@M?aUEX# zWt)%1^-S-5lI3bv4x_|*Kjco~ZPI+g`)ID*0V$_&;<}C-%MG&Ju)%{HDfHW@X`EXU zxb!c2kj3(Mf`noF5#z(wkFeZrxpLeWj(xr@@ZO&*$9T2(H-xu2S8fU81$CvfpQ~a# zn(|0IXZ|7iX^D($7LQi{A;jP1ZyEGOnD27)G4PMu*>pd4ZG-Zq^Ml#5be~X7{fBsp z(lLwQsh`3$1uXeF_W#KEn0;hF-`$|zQNN%(=^SY=(<3@B%Sl8Q;f{{7U`J@~ozDt(B6_;#ya0+TvRA;FX$Q-lO&AOcy+p1)QaW4p-PY zo~t-|?e)5k6ZLvAS}x^6zNK8X=mFzn@)1X#^tu#$g!!-8#iOb>YaN!3%zjO_bcdzY z&+vV~c|O5DN#O^NbA|0)g!cSgS%|O5cPeMfPsHz%oF0(4UaAK&xqWt9`BwQt+)?l$ zyl3Uhab9TpDa5zO=yP^X&c>4OGjrv}lJ6 zxP_&4K8kpQq?7e?EkCkyU6$^!wDL914_R9I9{Y4Ht#T3ESE6vYsJ@A7)2y7%@8Y4w znqKdIqtZX~8;^+o&-_N4N1NZ6AII>XAC7n4kBA4lq&@Qa?B|hh)DOz^{cnh#xSsK1 z{PlKwmQHcM4T~B0h3%?6ReHF55dJ=VuPKyY+Ebr*h4%CdEH@%xBgU!8j~*{}J4tw- zWx2rKi(XIVT*sB=K812P|9XTFv-z(2V*I!s8nW6c`XoK)$D9`ueRWW*1Oa2bY@00vWUE>hdZkrc1Y@bB0 z&6@@^4w3ZPylT+n5IjxT%r7!-=Kr+YhjkL}P4#(osWAB8oGNDV18?8sRo?!iIuA(O z_juI-88_TBBJV5p_o+Qizn68hq_gj3y+hOK_p;uqY5QJQG5V3fDNWLT(eDIXKQ-?L z9~X6S;)|u*(P@F7M@zld^2Zt<*T16`t&jZ+BLC#C-$%T#h_6cU4aaXo9l~Ni#?v{( zr02REU;XrpYR8GE&tF(>Yp&e6Ukb`WH}E(5EPL8~y^Qb2@JG37UI%KuFG|({t^dUT z1@keE!^$7!j$iZmgY+lWcPDy}*SO!ES}*t}JJyKb(xhh?XROO>*+(zv> zsWcGQXS>AbC9iG9e{+Bj-@jou^wscY_3K8qDxGSIFW1x7v3x+M2Mq4(P>*~-m523F zkrVP|(|$r*uS#|t)^Xl)NS>^RsT1lQlr-x#?I-L!Ao+1^gW!{N9<}s3OCOPR*x&ta z#*=iW+{FV*cj3c7RJ_q-w6?QP=-zK}gteWoXc-5A8}RW4=y}*p)dPqFQ8bFtbo?Lf z45jfMd7qwRnJTZF?52;;2xP2e-x+tg5ATaQ1ph8JJIC=L-hMv27@aMEp&x}F)ozV{ zWcRliKI#1}7H>-LZ_$2?A79md3zhoA+OLMe88G;R+HP{yG{Gmi0*r-UvVfxu{+`28 zAf5C%R)5GBq-WbWmGRwQjAU`DbR9jXr+6EwFK?Pa*G*@O2X|A@S8LMDFXlUufO zoRtsDg|h{(mh#3Ip?qH0RzB4(j8&iQ-FXSx8!`QOO1d5-Kf6V~GX5FX zbjm-vP712KP45JHhT{?H$=~~C^LUM?hgapwQ{LjbwiCjw zqFi-{>fd-|q003s=L;Vs>$QA5v`F$VfU@J8(xe&kJ~n=Ff0g5S#(mI$_{rGt7#_2`M*Pd8ok%rm8aJ3aIIW9pfb z)C>K_3y{<9zF5W$viSZpq~5sq)cp_Wjh8`h6r)cn-H9ZAz8;?Rs$Jo=csz{Yb z`fT?n7lW>ieKKz4iF3?vRK4uq^YZ(mlJ0$GpOjun?_Nz0DBelmZb^^7PX08(D}$?k zNZhb?d(~g63_Kv?8xLB0SM?CCe3`@$_zb z-&#$_f&Rm8(YFhguj`hNLFTw29x3^uejI(Id3@iO^RqBrYg%{zT(0~E(YxAS2zL+4 zVVz0Zt9EXdaS8d7>-+va<}jal#&zXa^2h6k!~1O1zX{;f3-{d_#M_ zbRYfgJm0@u;KU=UHxLh!ew=gGl?s2GJY=5&^-0pH<-&GXu$@g>j{P_czY_bN1dh)S zu^uMrq*LjHIFqGq{DN^^0(gY;9l)WTnI!G1pWNz~t3Qr=R1Kc;wT}nnO8Aa&=)qy% zl%!kzbfpXSCmEbWQV#o^EPYVYVZRS^9-8Aj;{AB;dvBsgZd3aBdIifxZS}}}DHsnN z5j_zP9#uUb&`01Iy~FYSr-#~&uNr_5?~w1p`p|D~V^obkF&zU_iJ>IAEtvEfe zu=&dZG8*`P4!Ixxp{=tNqi+dcW&QZF+L!uQh0jy_Q-9FX-u{;~ZT6_&>_%l!>sPOu zF73dMsC~Lh{jFqy`sc|UEP&y+_6pT+#mMcG*_~fDfK5@S72H%GHzJ74F@bfH{ zyD{QNzl?d=H~xTpspEGd^RigvT*Su^I=6BA286W-p^RhR=g)Z5B-tFdPJ3k41HfH?i z|NVK{9YevqY^JbT)IUX^r2@Seo)dnW#B)l8)5QO$U&8Uiek;*8^h<_=c((7$YFF-H zQ#qaMv@5s2shsNFcIEa4G@aJuk(yFE*?`-gOzYIHh1Vgv2)-S98j{O;$*w+7(&aXvwOxej$Wpab## z_Ctz4UOz>=Q51dv{|~(IA6<|$G8nW0FUdW-@{tH8 zHaNPji*;>F`#N)E>B$DC!_pm=K49(my7M%B{~@JEN{1SIr{lfu35JJMQT`GNJ{ z)V99Gck0S7CF9Q)I6=Qww1wmGoypRl;};iOO|D$1(d}*yEC)eTU~U zOFv!vQGe9Zs=uqJOE%yt&JNe-PjTJg%{jyB8@xF=c($I=&QGR%kPaV(U32}GY}qGr z(Mm_c?aQjiNx?{KW zGagoc3HMoi7Jgi|U;lC)r<%#Jx7Nc&;AMY(bdrJUj!mU}_29KXld z&OR*2mFoa~;=0n=<2&Jg)US!3t?SC=!mPG>pY)srIm?e9^Or-fxPC82FBAe*YFDfL z*u4#zKW67)%pN4|?pY##4=SDAE;!!tKsLVr)kk}!_PAU)$Kut$YB^r0{j2NzJJV-+ z4nIltncnl1r25S6c{+wZBR`Rz-v&L~(Rm*7)3{4*rTG=pG%iwmv!%N%{Z>oQwe&kI z-6LrqpHksuIk`Z;65(F)mD#~-W+?s3xWAej9rtER{Ziq##j_0Y6FIm|%M<^tqm1+A z?Vb8LIBzBV&-U`?Dc&;}+9yVn)vrDo&)}XJ;j4`9zqlPaVs_*R+Al_z2o11LImL6; z51Z}o4T9(6R!;p%_9uUS<9DUp_oZA(4p2kC+5D2_qkn6Ld%cu@1G^19s&+d&&!GMu z?r}V#?^S=L=j8*xk@~*fxd$01lPk6#o_oN0i}W`h$n50J54Ib}Uc=Ay{xQDOwhDOA zZ|TVO^UtX-YOB;vOciiZx_@J2jpXO~i+okRlYFRlnSK;WSd7dswEeV6=Pcpxq|?qZ z+4uL7&I?rz>gJDk+rGBWM>W4;dZX9&T@0xIlgyeX2qtF$0sImTe`9=X-`g3+*Jdv` zPlFgem7FETf!`k*pQzknexmlargDjSwWU>VF;BF#%C+x@rv7|0K*sgSLZ8yH?w2(^ zG7J2~dJmvpDY{kgsGh0*nd{?XbhqTYe-{7J{Jz@-F598}`g|n2$MysAKHO)T_lF** z9WZ&J9d!R@`PX><(C1ysuc2KQ`@K==@B3QA`maO%kiTT#(Izb)mU|V-#oIJLKdxbW z^i$k#a(hL7eHFh?J!JJU9j2e+{fPs=d@;)f{)gaW?c!b|8E?Y7jOBJ2JP=j-Sz=6VY%~B z4*MwtU+6E9zYyPH*1NV9{@JMKe2aSGcZc;3qF!8A`x3TyhP0=AvexcPcl(F+zP9=% z9G{&Sn^t@F0YNa{VdoGUN<7>uLC{SnIrd@KAN;IlX2W72uC!T&z%4J)3!=Zt=* z%SFg9UjFZM?Fc_xKg0Qom;W1-ukKi(`r7zDl}n3bx!sJ@w918_cS_~J=PjnE?+3or zjO4G$e1h&wlg_I@3Oj~;jkG|&BR`pp3iyR_7ZgFhWJ~_x4`=or=f2JVa=oQ-qKu#C z>iaFqN3_p-?g{F5t3T!T!tDs+n_@3u@2$SZt^B?S@VDiA{A-Ef;c=;D_Fnxv+>@l~ z9g}rExuN~xclqw4U(wqk`Ef(#Ea{DG{Y}?X@%?ofAKXKrPdkSTe0AJv*3Zsq3a7Tv z@R@6A!`IGd?OP8ikU1Ism?73K;aji?_9Q2a%q23TV2>6@w z$8o=LHsyX;>{J%FxmXBN8QP=vt7i1U;4g!`vEEVK6X*9BlqU6xd}rr6Fv-Oa_fjc6 z>Z%9lO_gCp{xZqGU&E)coBsYkq+T()Ql1ryx5O5ghzCp$4Vr(k)BKku)1-W|NEtJ+ z@5xuY$lZ`9<5%prmo)ryAjzMc`rtPrFhrxlk$~@j!QhSPtx(A(cyAycVMr=y<9t9 zeXhovlG#QNi))1Z;p6%s#`|kJdV0?};pM3HB-Oc(@^!!G? zMZW1_`paE8fB7q%4_djr-%hx*-i!LqFE#Vyr)Ym!KGZ`je=f>raUDfGjoTcf-ZR;b z_cP#omzOsTJoVHy*K2>UzeVJ&RM3<0)RW=-GTx={uQ5GcI(eq(+dN&vIG6Z`fgPL- znC#EA1LMI;H3+T8oN9X;ZGxaf1Dn=uwH=6rFJwQ$=%Bo7U{=Y}^ZxRB;HM2WY zCE4U}E;Rk}!!6-BtdN3De1~$yNEyTRSE;bf;O`f{DiyA>w9XgP^Zah#+O+R}$a4`t z&g6Za_1EQnjip`QS6SNSe1)Y|ulhc!5PzPRCfyG-_47KzSN+-(!S}o-e7EQD-I~L9 za}M7PmR7p8!*_$>`}rn(U(<~5G3L9=Y`(iB$5%guTtKgjJb1h5e7Cm3?2__XNIxH^ z^F9PSv`g)J>13bxUTS!`zCM_v$AKI@OuyQGGx*=8*G9k z*Vp?jEoi}RX@BAwns&Y2?p~IAQN+)6gz~-u{GZCv6ocz=WuJGKz+m{rrniz#UB5_{ zTU@Bm))jhneS-3hfBf#T^uHawzm4zKW%}_Zu@_;v?Z7Lw&yH7WrwN_?xkl=R{^4Ha z`#d;lBbU@~l$ReiDEA)|KOn5XL*V{Y@fl_-h{=NddH+S`3mf%4{c~yz!d?59(0?_} z=Xm7j8Tt9b@8-(OJYZ8R+*K?W;3Iy2;7_dx<^kb+p^}5Y5AxT}@4p)5Vmk+f^#J2* z^ZPo7Eqzevg?r^JZGLFyUQLg|k3J5RD~?<-xuxyHY zUu@wMjsx~Jr*KxzL_daAzm_|mVexAB!_8l@_4A}#{S?3N3g00W_}F);a@(hVY3kpM z^BtWm4(0k>>6hsN_1`mlVDQtpnzf(C(+s~_GyWle(cp*jJlW=>3qdc^bq2;Y*`nhX zo1cyNm-@x{cnay9-ScC9TRM+WdbvLz+rHtX^IwHNaZULk>HLAEl~0n+zqhpVQPTO> zl6JkYwvApm40#Xx;d=Qqb?S*f8e`nmF0!Aqo5ua=Htsr({dVp&ZYUjNk2}tv#_r?3 zvx3fl=BuKK8&3$n$$Xs~uAQa&H?j4%V)Qn_r&60P^&EcEt@Aa+N3?#o>gUoa9l805 z`or{RDG#N>WbiilzkqyXgnWND@{7@R(w_Uj^pE)Sb>FZ&m;T%7#qE-RwZI|0wsKv| z{LH0z@!HSv7}O*$Us!XojrG4Hc^!pjAp{+hyF+j)xeZ%yH^?KJtY^=FTFc>OF6 zqWtY~Adi>$IT`jOFdj^H2KjlbAMyRpFXRUd@*;8~(S zTwYY}$|p~-@+z<8!pkHb;-z-Q;5CjaUtm(goyw&1g|8rf>fdDeJy+n6Upc>VKO~FC zpCj*a|A6Y>mURGKC&~7I*!ssz#XGk1s>w{7N1LA(;_d#;*U)dj|L>RGo}YUS_0F4v z{<^&n@$&V*HG!zo6O3Y^q`PWNZz=ZQT{^Aggnc|Ya&_j`!m9TfHv{`*fT^mr%|I+iCrLtbQl zMVI20?XS^vw!cQx+5Q?$dmLw6KgayAWB8+j??%Np)TgIGuOaRvcxQfv>E+JI{7Ti^ z;0sH4S^3G54%cTye^j)c(64pq;f z@c6G9_0~G!$I+SE-)#T1IxMBasp2=eKMDIIUb@D9pqIBYU%QSu3_vrk71HX62_h%I&W$dKa^mTV6_<Y2Q;-ZeqJOun8kbc=UczimHUX+nqO=ixEl9PR@l+`<>Q z??drvfm>HPmnP`^qaD1l&NV;r`F3!h-4-uj$0dGa!TXoC@Metx&&IQ%{L6km*0%n1 zrJwoR?e_O_957!KJ|mpJX$wakAfGQV4xisg^n;yYoT*dVrJPa%vi-PkR=#ZLcxL-? z?S9>vYS`oY)ykKtzPr-W&Hk9{9o#1;@3VbW1~1*eX7JMeYX?0BhtNmnPi(b(l|$%j%inDI2FLaTB~w*jVqH*C;D)srs>Bm!=D_7Z#~@XU##SQlAzvw7=O@H^gHXVw0eJ;t0(@|rdIfW#&W}& zFW;}FzZAfi{Sg6Piw*vtuwLN5@qRkDW1(N>Ab#6`;q6j zV7y*v>m8>x@g1X$t$gSE9$jyx>;5(M^GbzhNxg8K=E5GuyUbrTJlT)oT^yfgImqHg z#>YcF>gNXdPBZ(q6ZL7QIg`Qnw8f56PMYsy+o1M$z3IW4!c97r4_LoL>Z{&l{pNew zlplQE7x!8SJnWk=|8|X}!~V*+4+t6Ld$cm{*6-N%A@F`@dIY4y-p|n=Q+~_*yqyAo z>CE5zdw&4crsvb~p5poYM6ckyxx_Cy9`yXe zeP18L{#lPhb9~@h$dB|(Y+k~At2X~uvseVWmEb)Ch(jmSd1ioz7hEC}1`_a5ywToP*@)hn2fghs$+PT%98DBT; zL+dm>wSK3T>sJ0v)|-Aaeoxjbf8x7wT5kPrD?e=My_Vi*>HYTHV9x{g{-C7~$v*y>>3$<_g zbzaIl<+#?>ELS_>-&E?len)v>yf?l7WLWn{RfcqZjrGsR{>G3mc~1%R&$E4x4+Qiq zbzCBRMgN?1Bt7rJv)rLKl#%`)3(Ax4C~|~H|B~gmA?^CSI+fC-aQMvP(PuM>^)K7k zHDLR?26Y`UPW?&%X1PK2N8Qh?E~0c`{CgCBwM&wM$4O)Kw}AYjNEP&6{gp!hN@Jxw z;{lt0&8LRAtTgGFqUTDJIz``< zC;iz|)EKVki*h@1mM%@0Cwi(FeM#qGP*T*BUcNNpInqusdT5OIzi#`f9+dZ4J&hZe zCQKK+iqYrBs6W%@%Q|nMK5cIQJhLaC8l(Q%Vuy>-$K`#0L)S&i6F(;DxUoj;OL^jm zy+2^-p{J;y`x{@g^q{0GjYllqkn)vAB=)5|v1aLMk}gezAmCSw?veb_8IpuQt#;D; zLA%U$+#ZH}vl8~x?*$C=uZCTzJX7ISM)ZDY+7r^n&ryZt)t@zgDA=!f=yHss#evGW z7lL}EGNSW6-{*Key3vLFx7(BJ#captCmzo_XR69Y$k*>dIqaJdKF;Qm<}aDNCFwf2 z*_Zhy?>65|=BqucntT-_J$J%(pvHu@XePzy8uKSg6ISYe!y4bJeieVIZfOvm@eKMw z%K(e=^t3;Re%hh*^z}9OKPnBC$B?eefIv7;oCbVCzq|+O(!>`?gQbbRqF0^Xp*`3D zIB8r2`ze7A_(ad;kw0`?X9=9J9@~$vRr-`Bbjkbv+E>h<`+Z4!e9HIX^-q~A`I$eW z>p#8@7WOaiZ_0dNP^w3MeuH%TD9+7Rh8BxHu;_9rxlFfF3o3n zSnhK}9)E=Y#66&^rF|bQ$8D9pf8@_HJ|1=b8;tW0I8F@#7jd8aVbc4g>m;Le(n_WG zN!N%RmT=!KibSQ8+)w?4lncj|bT3AUr#HXJn`H9_M7@w{VX=3+a#iy&D z_IP(Zg`=JMj}`m=CjDWskMJk;!@Sc~;PKrt;rUE&s9vnpCJX(`h0CNLm5qkaCY7h8 zdz!qj+WDAb^a+7esdZVs9g^;^>G`@+VY{S5x^;2>SQB*9I9s^hy##>~=Wjn}T#W1- zSTMfA2R5D@->GGc|B%6jeiuKe4WGR0bIt7woB-}o*jeX~(W=5De8J23vy25Z@+bBa zN&no>$9^J98{K@r5)0#3#O*A6R%+@mR68G+I2^uAG7q8mVVUI>Sy4*qNJ_~erN6mNr(77gq&jZ4#^Mu|2XALm9*JD;*#M;pF&{p@@^db8GJ`FCRfs_R?l z=MaC9pNf{Jo}7U{S?@W4o=n#tenEaNMpsEg{dJ8a_`2y*w9An!O;o>_AwbP z|Gp;s%lB)$6;7+)0mXoy`%kowQhJx!<>hq^rE`vhEnuaGGCxt^U} zc(#o1QmAJP|5MlF*@gH1-Ig-;(Xl6f?~32&lBL~`>p`jJe%^t!-%@y-b##XK9@`C!No=w6>pgzDUxc zJc)l%$@+Er<<0#*z&Nw@J8oq0*{>~x9vyPMs{9tx`QrfT>nk3Q3F%3{kaX<32k_1A zwDO<(H42~f7CU0|wrpN|s&t@IGy9OfpDy`vP3=T7RUMVMrgkEks`FW#I~O~V*u1%_ zYO87deLnfEyXlAgf#~1S1xmMgnfi0HO&@dIh*5QhzAr{EAX`M(FRJZyMp8f7qUUYn z*XsQPh)c=)_ziZS$I{mC{wxOFd^||M;R`Sh!%M_YmOCbkJZI}*$_H`X;z`bD=2s`Z z%180QVzFOI-y-FgLBnsHeL=pT75Cgoe{kMF`?=oM+jbn%{?xQz$?C(B4*73UE*5M?J27%U7EDa(b@bmFBn2LRHdbL$3T}+70L9U5ZBte?7`qx2V4s@@Yu#xS``m z_>*woFXFsHH|j(3Wigr~i2HZxTj12SUtDJse5#rzyz}YL8$73H23Pf!)4Q^9t5oEB zN=7k)Fye=EjY8jkf%$I*+V znP@3qli{!)EbWyFvG5)34{Meu-Y5n8Yx|^rx$suW5A}okDT$P;)ODS_>UyzZ>*VP= zj;)iY>o~7eeqC<-x>NbJ+BIF^B|R$ViN~v!sQ&PCnNCNib20kk|5ZG2jzHRP;g?O4 zE$d5kX~-wD!KeMThlH-B!o^xI@Wt zJ@))mr66JWr+5?*| zqa1J3G~dsHKK8V?AJ%_rKk5hc*$w^KZ|4}w1wBU`!ru@0{q|is_ji{u-$Q<0gEt;G3iDrp{J3uVbgEQGx$EVRN?qqM)$XIBzvG6@V|tHhdcfu}eY)Q* z9(<|j=VZC=ON&pC??e6~y-B|(?~?ea;Ip<@<<;Y6F6Z2T2NFc21LfP-pPUcNh@bEm z_WR{XxAq%O6@F{Gm4Cx=5k9iiUmqJ?DQF45Mc5CT@vYt4W&GxNkiTZ23i0?f`KzY&>DT7lJ4kyS@ZS-%pT_a3 zS-Y!0o3)$iee+kgp&|UzdGodoOY76`Q)#yzM)@b6pT{_dc&@Pg`*Zp0EPqcff4k*x zKtA;+f5qq`;nV+3KKB0Ilf&2h_mNz__iuYH-}|>R=wC=L@)zm&A-=~r<6p%6Nc=I) zALWIAmJ4ccGCQqtMc;QtIPV9X4@xcY&-3*U-~UNJlJZ8l;z!cCz^@qnt~`@&wezFf zB`N0>SK!YO-vbyg-~Yn)rbxU{<5*>^TM$0%fZEZ{-C|F09!AsM!>69+}RX?9O zP3bZR2;=8*N57x97|oabkY4+9{%oFJ?g!7#^?$tk%FoM{mvJ$A#dcpO$HU>DC3M>< z{m9eJ=^Qtd|2Q7I#BWu;$n;i+_OB)nnLmg8$o;2_cfgq2k8tj8f-^<@gK~=?hueAt^N>D%4rk{_!u_YMcJbFyvlwC0h9Bj7lB9p6_P#b( z__b6xSKf#4h0p7fE%6lpj^S<6-r4ek@bC}c1=M+6SYPOG!;^U$HI?v)%l&qZ_@qvrk6uHZ>8S7O#4Z?>{*U}5A77Z z$_z;27uSXr&-!k|d#~ZWPoBvb-|@gX39UbD-Wnuq-PK0h5gB&57<{DU)cCe6)-s8q4p~tS}1sh zaJo$HK8Jd)NBp}-q(k$*Ipc@*Htt)LA6bta>HCyeuX(?mjx+Z0N&EgitGL!>Y31J# zuSLKswEL6?^1*)W13{cg>fwC7Ji~e{m#0fSY<|v7N)N($829Tr|7Chh*Xi=`uudlQ zXT8g2)6Q=AD08QcX3_ml5}r3J8yE)yVdNx(j)2He4KXvtAcpQm!qV&=?(Y) zGX8vv(x*PC{MT*#S^uD=l^^5A-J0%Ie(fJneyt2@{p@=@T0a@*dpvFji}GcIWvbN`}6L~#p#}wD^EY$*J(nyC!-wJ52f8|=L+>tHfDVB zihG;eeFxxxU!{C@&qSA0XyKC~lhYd%Uc2)`J3_w$N*ceA?{uH}7RetAPP=}u4)BYIRjuKr&uc$K7G z?9Y?&C>7o=X+QVteoJ-_uhOsG{s{6%yYsv?9!O7?x+ zV)Qa8&_bVM@WmAYeaeMPl^!*1hw%X7<$kvN&&T42O9ObBe$)BFxcqQi*1yF<_fgSz z*pDJ~kB@QB65}t#YdB|*_rcEMJ^p$Q@+@DG= z)^w@xLY+4wZp{!vF}hk_5_p|(5 zCiWYs-t5%*UcTMXZtVl!Dc{_z_{W3lPZ6IbJ((X=!u}7c^h}SNJxToxvnQ#aVfG~T zGt{0Oub&a(y%Xa`d~U*chxxR_%zq#9i_yix2OcM-eB}MK3BoTjtQePPNryxIF$p>C z{P8=G@Aj-1>HXay9>V`aHl8L&#OsM!pqKftrBm*RsGq`hd!c__(2)7g9grjU8)+9% zUE%?k{VDijNd4ikUHQ(ZszHehc=;Ehe6oJG*pKQCrF&RU^hnSy?Vrzg;{nru0Utcv z#0S0(^kG5V^`x(Fvfr!jK|ggGAb#5ljK#c-zp3SKKmq(@eF)DGugK(c(a)Oa&98)f za#}$-^LS}&ayoC5k0*>Hez^CzNnTIeDA`fJPLHA(GRB{;&nHtg9pWMMv2lzWMvnoN z3!a0x2K`|_mtGdihtuV90T|Nb3ev;6G*&x=H-d7RzIJ$+T;Z4O(DsupYB%B$_2c4U z_21%6Ht(|jl7ILk+%G}4TiOlApZ133F2woExUTvq9#XiaNh<|TvP1bh>9#n%wV&)b zDsqSW2viT>Y1w>eku z+ILcKDt$_Ys+9BbP3dCtId7`-%XLyNHat(`=4bpoZnk!&rbD_N2LF*xKm0K89CMzp z_BGTiUjZnb_YrxdAHbh~k0H~i1M)tu+q|v&E=$|It@{p3+q|v&eUdIl=Lx(_@4KIG zet+uco8O=M`R4bVpYQv7GdOk+NZsK)qT}0eI1g)jz~Sh*&+)%!^HQys!gYLe^OCy3 z?N&QdscXNh)^GnFaiy+wt9GlsiyKO}q*wRV#RE#Wq|fZ-pwcZ_uJ*JT%@cgGad0?3 ze|9)Ne|9*EPcixrsUPwQ^(pz}?i%>X;s)eL4!z&+U#TfSWd6@T3LNqW?QAhRH%)VZ zeLaW%%f7&W@%u#GZt(rGoO~?Zqk4e)lYF_Mp6OS@odNi)w=-97R#*@3_Xh8a(NDDB zR}nktm$~+|`BF%a?PxcRCtarHNT2Pf8xQUlII-<7!u(Xz14`%eN%W#nZeY9QCrd5P z^*jK;FS$VVO`>84x=ojSoZHg!otqV2&Gb~~22GC~*7sYsYI@kly=LRR^N_wjRnv$& zSb61}q;IdLckI^sHHDkleHw91+eQ3I%k}QmXZLn}E+3X>xDQt7WO@a9Sl;tq6#i&; z$Umgp^YG;U3-)}pg8$*i{3Y;je7-&U3yjNk|9@Pf;~5u@2gij!(w{@sZd}d@$7Pum z$M*?`f5yMkb+HRH-`B_D+mz2kIXY@~`uo36KjEnOIc0o*^GsBYZ|f2O`SMBkPHBhu z9SZ7|3ePZq{tU4r(4SH+ZaiJm(4U$fI7!oe`!zlIq_hkDDe2?&=bbN;E!!2&_JwWn z_4&Tred2wi%wx5`nZ8u{jqg;&lkd03SE$#j|I2d z7Vg&-?zTnJZ~v|U=PBWNO7{0t7^f_r)2ZdREpDl|e@CXrS?{Aw_0*whq01%#BmDZ{ z`QW4BNal;>jwu!|oUG$*-^qYKt?BMa{pv&g2kxX?eMt3bP3_6`sNV%pZ?`AEKZifjuC6bY3Jav6N=?6SSHk`kdY06` z=&rzG0snp-%b$dFyd4eVSL(P(o*{pT{@EniLeIUjuS)s9T=Yw7gy1pM$ zzZ2^lk`DFo)j$RNvt@iL!w<-Nr+Yj45_6w-lnV0;te>4v-(dLcmuGelh2nwp@CrZZ zzw4#hB5xOQ_?qJTdyy_iZ;<|mc+ld-%@Vh=JDnE$KF}~}w$n~i`d*sP}HQ$?{RZ?XSh(xev$FzMFurkpLTW&R58DYtq$E=jlYZ>SHcSFjIE%K5r4=2u!TJs;Ac z<8I%-!TO4&t)HD;miGS6wY2xUN7Bjq$@)BXk);>gbD=za9~$Ct(tfB1L@(EM%;}fV zE|5>&23~S`^?Ui+eg9{j#S4xi{>F2zr`zw#K+}mAND6> zUBk!G=++HSqo6BdssTDr$3;TEVySN|b2`P|o-|YbXCq<8GJDDHz z<72{MdpALc#v_V<`IM#5@RakphW|bpr?}pw>GU3alZW&ke4~fmgAe~f=v=A$JjnED zIuBC)6{qtc<>xq^2Pq$qHxDXCKUVtIO+R<5{zH6O`K;IIKVbJ(4C=iVe%?2+eRkEW z^gK^;1-S%%C?|jTh4goR`h?s&`aK(0x2GT^e(mD#yCKgUuY*B+NyZua7;(WSdz|i< zs_m70d`DTHAs)_$uY3{YV93UM(r<~M8J45`;C?%;AIQ;@@Q>(6%mTi|v=1W zTO`Z%99FyaX7O(Z6%Oft0eqQwMCGe|iaMOd$ku_z?8i$5KsesiAI>jvUHOvmf5dx} zYTBOrL(UiBJm?3xa@4oj-=q9v{xRV_#&RPD52i=@W1?@b#$JnokAOT*|spm-4Ou8XP1-)8dXc3I=(xR=HB)B~!w8m5Q5J=m4Zh|Uzg9HeyEx5Zohtle16~X9)OH%s;|=d zTwV25(%qx|Yp6X*dKXGMueW?&SG~pb){Tm1F?wwaUSsjcM|0yI>Wz>;26N@c;*Xuj z$sZs274gS)myka$lKzMO?7bjOF?v$?BlGW-U$8$y?S*~+6nfdx$}iXtU}@F2?Z*3a z7}v19d!)S|Nqb>FHBd47XUWg(quJTiJ}N$$eN=oh`>6O7qq7As_b2{u&}Y3(`b_Vc z$^4~Nif};%oT1Jtck% za`Gf`1k<;!pIGjqoP37z?(qheyO8CAxQ5WBU-5ANlKA!*ea;2GVgKgBAMo|&u-sX> za?4Q8@e9kH!EzOCFWzNzy4KoXt52@a00kMJPu_*{h9B|&4)vLFbWPxg1A;r|~Gk-y9z z^|)W^uc}^;8`^%-YkGe`@k{zNUKbB)f0E^3&$XQ}J$ryGh5JaNY{V z*b3)#g)?OH1>2wQ`&2yMAFeC8{oQ#t<5>WVpRfPAUtf$Aze@cPu@lv99iO=Iu%we- z8~=eXYP!$(V^HHae$Q*Au4&9Sq+C2;cn%(rbTN9P^4F<*C7tg-`~8IvHrtJjz}Mr~ zuFvVW;a`-Ud(ivsMwha87%!Wz@cb8}0qk${`LE|oxukot`eD7(63qew0t~^G?GiKRYG91-+%|?(LdxY}a(}R!t9V)pXxxNsq7B&lmiX z^&N_Dptm;X;=F=yAb)-?>6V9@`<1_c`Yy;Z<#iTX;&^PxmFM@KTz|5h!%a}Gx-?v4&jQb|}D@I3DpAFf#$C4fK8o~`I;`=EWPs*RK`Zctdt+%ju&HZ>W z(#7Zp0w4aoj#B`?2k*mv$T;0bC`#{z?;yRDFEafBhQ!b5&Uy6;rfbXvzXE5%L7Xhr zL(ge~84_;vwDw+F;` zAMi#TPw>s=L5DTnsq@9Kf8@J%^GBhd&6hCWQF`A_s-V4_^+`Vd@qMySS^AgJRo7uh z*J(M*{Z`fs=(>>l-S+!pom=X=zD>_JOwsy&?`v3pU(PNPU&cR<#}tXETcil>r_NDnQP^6~JZmU?roULWdFKeIu!BYGml?>jQ@J}CJt z$C(}086?el#Pl%U+qqZrlP$aTxqeumJB;5)wEwZmJAzN7Xn@YAM#m~l+Cv*G;b^=PjcRYhK~Kg{IwUWHp9RC#p! zQU9Q&4Ufj%nl^ia^DC0B3~K%C{EGH(yz?u#r%dHGkcZu%iTmNyhxzY>ti*oGW9h?p zN&j9ZaGlTM8PkwUI;*{mXMph}ZSplk^&R3Z(w}&Syymz_I^+-9J&&Jo{J7rc=O37+ z3Gnj|ar(Vby_X||)0LYag?h!~Y%YJ4lR41om0FkdE7K=>-x~Ha2tSl2JXa8pYw8Eh zn|g_)v+qu6KrO^W+BH9v?OX!BX|)IMR=C4PuMwlu?Mk=U>`5Lj;Vn6<9lTo&PxDu7 zKN6~x*+F##?7S~kH*4jQbm#eD7xy|t0Ce1eOgF1k5AfA`q zg>{PPPATB?n^Eu|e|-P0yC^qm`78Ao3LaJ8H{4LXl3v9#9=K5P?K`OW4$ji_a_v_! z(sU@7SD_vF2`a~dJS+iEd3+(HZ)u*RR zcKSWK*v1{_O!U3km3$o4_vt0e^}egI;;*T_9MN{@-!$>H(Vz5OiG3PP{lPduuB0D6 zzop&k_%VRkkM+L7`DXxs4duwkHQ?h*@!jYU{!W3f{!wh-+atVQmJ9q^@`L*gq5u8d z9K0^riMXzGBbIBOWllF=+BU&b}4D2f4pCL->K~uKZQ!*z-*Gg7WfSk(bPlEtK|gPFVFwZ;z%^ zKXb08Q$JJn>3Du-5tfv{N`1Q2$Gtz&ZrnIS(n+t%Z9MRFP4^wv_k$;CdifzqkJpa- zvmu?G{+}Cz{!d4KF~P#Urd=lh-mYm`49Iki$Pe2Xq@&I+r_q-l}mHkBh|hxq^S<_arvDG;MK|cwm~Q zJ-#yTe!TM)-yH{3p9K11GUcak_=2wlU(+Aq{PL5d&HZ{jH{YEF{%84F07W?%$(26@ z{T#}@&szsjuDa#0_*<~c^33L~cUbzDH*cK_youjuZ~q16t;0sgTa9i|$@JKdHE&&j z_KxMJy%?afdFy^1rvQEr-na0T`5Ej_Wj*zm@CmvLK6Yk4D-i{u>AprY_r;D7&Yt3IXJ(7n{IK^r0=+h@~sK4+ps+b<} zeLMWl03o|Q>2IhW^6w9@9)Iq4pL5wVN&Eh}r3SZLC`*3mzr6uD9yjuPdMow$(w}Pg zT(gH4svhg@()7SAP4`XH^q}@1>(`P#UVBlDHj15reNy^azvBVbtMQ=e+i~sgzYCnO zUspEu>tgBmuex8pUpH�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�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 { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const payer = provider.wallet as anchor.Wallet; - const program = anchor.workspace - .SplTokenMinter as anchor.Program; - - const metadata = { - name: "Solana Gold", - symbol: "GOLDSOL", - uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", - }; - - // Generate new keypair to use as address for mint account. - const mintKeypair = new Keypair(); - - it("Create an SPL Token!", async () => { - const transactionSignature = await program.methods - .createToken(metadata.name, metadata.symbol, metadata.uri) - .accounts({ - payer: payer.publicKey, - mintAccount: mintKeypair.publicKey, - }) - .signers([mintKeypair]) - .rpc(); - - console.log("Success!"); - console.log(` Mint Address: ${mintKeypair.publicKey}`); - console.log(` Transaction Signature: ${transactionSignature}`); - }); - - it("Mint some tokens to your wallet!", async () => { - // Derive the associated token address account for the mint and payer. - const associatedTokenAccountAddress = getAssociatedTokenAddressSync( - mintKeypair.publicKey, - payer.publicKey, - ); - - // Amount of tokens to mint. - const amount = new BN(100); - - // Mint the tokens to the associated token account. - const transactionSignature = await program.methods - .mintToken(amount) - .accounts({ - mintAuthority: payer.publicKey, - recipient: payer.publicKey, - mintAccount: mintKeypair.publicKey, - associatedTokenAccount: associatedTokenAccountAddress, - }) - .rpc(); - - console.log("Success!"); - console.log( - ` Associated Token Account Address: ${associatedTokenAccountAddress}`, - ); - console.log(` Transaction Signature: ${transactionSignature}`); - }); + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + const payer = provider.wallet as anchor.Wallet; + const program = anchor.workspace.SplTokenMinter as anchor.Program; + + const metadata = { + name: "Solana Gold", + symbol: "GOLDSOL", + uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", + }; + + // Generate new keypair to use as address for mint account. + const mintKeypair = new Keypair(); + + it("Create an SPL Token!", async () => { + const transactionSignature = await program.methods + .createToken(metadata.name, metadata.symbol, metadata.uri) + .accounts({ + payer: payer.publicKey, + mintAccount: mintKeypair.publicKey, + }) + .signers([mintKeypair]) + .rpc(); + + console.log("Success!"); + console.log(` Mint Address: ${mintKeypair.publicKey}`); + console.log(` Transaction Signature: ${transactionSignature}`); + }); + + it("Mint some tokens to your wallet!", async () => { + // Derive the associated token address account for the mint and payer. + const associatedTokenAccountAddress = getAssociatedTokenAddressSync(mintKeypair.publicKey, payer.publicKey); + + // Amount of tokens to mint. + const amount = new BN(100); + + // Mint the tokens to the associated token account. + const transactionSignature = await program.methods + .mintToken(amount) + .accounts({ + mintAuthority: payer.publicKey, + recipient: payer.publicKey, + mintAccount: mintKeypair.publicKey, + associatedTokenAccount: associatedTokenAccountAddress, + }) + .rpc(); + + console.log("Success!"); + console.log(` Associated Token Account Address: ${associatedTokenAccountAddress}`); + console.log(` Transaction Signature: ${transactionSignature}`); + }); }); diff --git a/tokens/spl-token-minter/native/tests/instructions.ts b/tokens/spl-token-minter/native/tests/instructions.ts index e62cde477..70df73542 100644 --- a/tokens/spl-token-minter/native/tests/instructions.ts +++ b/tokens/spl-token-minter/native/tests/instructions.ts @@ -1,4 +1,4 @@ -import * as borsh from 'borsh'; +import * as borsh from "borsh"; export enum SplMinterInstruction { Create = 0, @@ -7,17 +7,17 @@ export enum SplMinterInstruction { export const CreateTokenArgsSchema = { struct: { - instruction: 'u8', - token_title: 'string', - token_symbol: 'string', - token_uri: 'string', + instruction: "u8", + token_title: "string", + token_symbol: "string", + token_uri: "string", }, }; export const MintToArgsSchema = { struct: { - instruction: 'u8', - quantity: 'u64', + instruction: "u8", + quantity: "u64", }, }; diff --git a/tokens/spl-token-minter/native/tests/test.ts b/tokens/spl-token-minter/native/tests/test.ts index 9a9c956ab..e15166765 100644 --- a/tokens/spl-token-minter/native/tests/test.ts +++ b/tokens/spl-token-minter/native/tests/test.ts @@ -1,6 +1,6 @@ -import { Buffer } from 'node:buffer'; -import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mpl-token-metadata'; -import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from '@solana/spl-token'; +import { Buffer } from "node:buffer"; +import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from "@metaplex-foundation/mpl-token-metadata"; +import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from "@solana/spl-token"; import { Connection, Keypair, @@ -10,33 +10,34 @@ import { sendAndConfirmTransaction, Transaction, TransactionInstruction, -} from '@solana/web3.js'; -import { BN } from 'bn.js'; -import { borshSerialize, CreateTokenArgsSchema, MintToArgsSchema, SplMinterInstruction } from './instructions'; +} from "@solana/web3.js"; +import { BN } from "bn.js"; +import { borshSerialize, CreateTokenArgsSchema, MintToArgsSchema, SplMinterInstruction } from "./instructions"; function createKeypairFromFile(path: string): Keypair { - return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require('node:fs').readFileSync(path, 'utf-8')))); + return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require("node:fs").readFileSync(path, "utf-8")))); } -describe('SPL Token Minter', async () => { +describe("SPL Token Minter", async () => { // const connection = new Connection(`http://localhost:8899`, 'confirmed'); - const connection = new Connection('https://api.devnet.solana.com/', 'confirmed'); - const payer = createKeypairFromFile(`${require('node:os').homedir()}/.config/solana/id.json`); - const program = createKeypairFromFile('./program/target/deploy/program-keypair.json'); + const connection = new Connection("https://api.devnet.solana.com/", "confirmed"); + const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); + const program = createKeypairFromFile("./program/target/deploy/program-keypair.json"); const mintKeypair: Keypair = Keypair.generate(); - it('Create an SPL Token!', async () => { + it("Create an SPL Token!", async () => { const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mintKeypair.publicKey.toBuffer()], TOKEN_METADATA_PROGRAM_ID, )[0]; const instructionData = borshSerialize(CreateTokenArgsSchema, { instruction: SplMinterInstruction.Create, - token_title: 'Solana Gold', - token_symbol: 'GOLDSOL', - token_uri: 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json', + token_title: "Solana Gold", + token_symbol: "GOLDSOL", + token_uri: + "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", }); const ix = new TransactionInstruction({ @@ -60,12 +61,12 @@ describe('SPL Token Minter', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, mintKeypair]); - console.log('Success!'); + console.log("Success!"); console.log(` Mint Address: ${mintKeypair.publicKey}`); console.log(` Tx Signature: ${sx}`); }); - it('Mint some tokens to your wallet!', async () => { + it("Mint some tokens to your wallet!", async () => { const associatedTokenAccountAddress = await getAssociatedTokenAddress(mintKeypair.publicKey, payer.publicKey); const instructionData = borshSerialize(MintToArgsSchema, { @@ -97,7 +98,7 @@ describe('SPL Token Minter', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - console.log('Success!'); + console.log("Success!"); console.log(` ATA Address: ${associatedTokenAccountAddress}`); console.log(` Tx Signature: ${sx}`); }); diff --git a/tokens/token-2022/basics/anchor/Anchor.toml b/tokens/token-2022/basics/anchor/Anchor.toml index be2283b26..91f84f721 100644 --- a/tokens/token-2022/basics/anchor/Anchor.toml +++ b/tokens/token-2022/basics/anchor/Anchor.toml @@ -2,22 +2,22 @@ solana_version = "3.1.8" [features] -seeds = false +resolution = true skip-lint = false -[programs.localnet] -anchor = "6qNqxkRF791FXFeQwqYQLEzAbGiqDULC5SSHVsfRoG89" -# [registry] section removed — no longer used in Anchor 1.0 +[programs.localnet] +anchor = "Gd65x65gsd55JTEbpbB7B5ukg8Q6hctXzyGcWiTmzxjK" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" -# This project has both bankrun and validator tests. No [test.validator] -# section needed because Token-2022 is built into the local validator -# and doesn't require cloning from mainnet. +[scripts] +test = "cargo test" + +[hooks] + [test] startup_wait = 25000 - -[scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +shutdown_wait = 2000 +upgradeable = false diff --git a/tokens/token-2022/basics/anchor/migrations/deploy.ts b/tokens/token-2022/basics/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/basics/anchor/migrations/deploy.ts +++ b/tokens/token-2022/basics/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/basics/anchor/package.json b/tokens/token-2022/basics/anchor/package.json index 5b2bb974f..790a0a4f1 100644 --- a/tokens/token-2022/basics/anchor/package.json +++ b/tokens/token-2022/basics/anchor/package.json @@ -1,23 +1,23 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "anchor-bankrun": "^0.4.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/web3.js": "^1.98.4" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "anchor-bankrun": "^0.4.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/basics/anchor/pnpm-lock.yaml b/tokens/token-2022/basics/anchor/pnpm-lock.yaml index 5eaa9f1db..8c4b29df1 100644 --- a/tokens/token-2022/basics/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/basics/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.98.4 version: 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -48,18 +48,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -767,16 +767,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -794,7 +794,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/tokens/token-2022/basics/anchor/programs/basics/Cargo.toml b/tokens/token-2022/basics/anchor/programs/basics/Cargo.toml index 69e048e68..d0bbc6f05 100644 --- a/tokens/token-2022/basics/anchor/programs/basics/Cargo.toml +++ b/tokens/token-2022/basics/anchor/programs/basics/Cargo.toml @@ -20,8 +20,15 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = { version = "1.0.0-rc.5", features= ["init-if-needed"]} # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-spl = "1.0.0" +anchor-lang = { version = "1.0.0", features= ["init-if-needed"]} + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/basics/anchor/programs/basics/src/lib.rs b/tokens/token-2022/basics/anchor/programs/basics/src/lib.rs index cccd6a657..461bfaa4e 100644 --- a/tokens/token-2022/basics/anchor/programs/basics/src/lib.rs +++ b/tokens/token-2022/basics/anchor/programs/basics/src/lib.rs @@ -4,7 +4,7 @@ use anchor_spl::token_interface::{ self, Mint, MintTo, TokenAccount, TokenInterface, TransferChecked, }; -declare_id!("6qNqxkRF791FXFeQwqYQLEzAbGiqDULC5SSHVsfRoG89"); +declare_id!("Gd65x65gsd55JTEbpbB7B5ukg8Q6hctXzyGcWiTmzxjK"); #[program] pub mod anchor { diff --git a/tokens/token-2022/basics/anchor/programs/basics/tests/test_basics.rs b/tokens/token-2022/basics/anchor/programs/basics/tests/test_basics.rs new file mode 100644 index 000000000..ca0d8da65 --- /dev/null +++ b/tokens/token-2022/basics/anchor/programs/basics/tests/test_basics.rs @@ -0,0 +1,169 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + assert_token_account_balance, create_wallet, send_transaction_from_instructions, + token_extensions::{ + get_token_extensions_account_address, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = anchor::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/anchor.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_token_and_mint_and_transfer() { + let (mut svm, program_id, payer) = setup(); + + let token_name = "TestToken".to_string(); + + // Derive the mint PDA + let (mint, _bump) = Pubkey::find_program_address( + &[ + b"token-2022-token", + payer.pubkey().as_ref(), + token_name.as_bytes(), + ], + &program_id, + ); + + // Step 1: Create Token via the program's own instruction + let create_token_ix = Instruction::new_with_bytes( + program_id, + &anchor::instruction::CreateToken { + _token_name: token_name.clone(), + } + .data(), + anchor::accounts::CreateToken { + signer: payer.pubkey(), + mint, + system_program: system_program::id(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![create_token_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify mint account exists + let mint_account = svm.get_account(&mint).expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint should have data"); + + svm.expire_blockhash(); + + // Step 2: Create Associated Token Account for payer via the program's own instruction + let payer_ata = get_token_extensions_account_address(&payer.pubkey(), &mint); + + let create_ata_ix = Instruction::new_with_bytes( + program_id, + &anchor::instruction::CreateAssociatedTokenAccount {}.data(), + anchor::accounts::CreateAssociatedTokenAccount { + signer: payer.pubkey(), + mint, + token_account: payer_ata, + system_program: system_program::id(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: associated_token_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![create_ata_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify ATA exists + let ata_account = svm + .get_account(&payer_ata) + .expect("Payer ATA should exist"); + assert!(!ata_account.data.is_empty(), "ATA should have data"); + + svm.expire_blockhash(); + + // Step 3: Mint tokens to payer ATA via the program's own instruction + let mint_amount: u64 = 200_000_000; + + let mint_token_ix = Instruction::new_with_bytes( + program_id, + &anchor::instruction::MintToken { + amount: mint_amount, + } + .data(), + anchor::accounts::MintToken { + signer: payer.pubkey(), + mint, + receiver: payer_ata, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![mint_token_ix], &[&payer], &payer.pubkey()).unwrap(); + + assert_token_account_balance( + &svm, + &payer_ata, + mint_amount, + &format!("Should have minted {} tokens", mint_amount), + ); + + svm.expire_blockhash(); + + // Step 4: Transfer tokens to receiver via the program's own instruction + let receiver = create_wallet(&mut svm, 1_000_000_000).unwrap(); + let receiver_ata = get_token_extensions_account_address(&receiver.pubkey(), &mint); + + let transfer_amount: u64 = 100; + + let transfer_ix = Instruction::new_with_bytes( + program_id, + &anchor::instruction::TransferToken { + amount: transfer_amount, + } + .data(), + anchor::accounts::TransferToken { + signer: payer.pubkey(), + from: payer_ata, + to: receiver.pubkey(), + to_ata: receiver_ata, + mint, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + associated_token_program: associated_token_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![transfer_ix], &[&payer], &payer.pubkey()).unwrap(); + + assert_token_account_balance( + &svm, + &receiver_ata, + transfer_amount, + &format!("Receiver should have {} tokens", transfer_amount), + ); + assert_token_account_balance( + &svm, + &payer_ata, + mint_amount - transfer_amount, + "Payer should have remaining tokens", + ); +} diff --git a/tokens/token-2022/basics/anchor/tests/anchor.ts b/tokens/token-2022/basics/anchor/tests/anchor.ts index f46a2078f..92e50943a 100644 --- a/tokens/token-2022/basics/anchor/tests/anchor.ts +++ b/tokens/token-2022/basics/anchor/tests/anchor.ts @@ -5,96 +5,72 @@ import BN from "bn.js"; import type { Anchor } from "../target/types/anchor"; describe("anchor", () => { - // Configure the client to use the local cluster. - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - - const program = anchor.workspace.Anchor as Program; - const connection = program.provider.connection; - const TOKEN_2022_PROGRAM_ID = new anchor.web3.PublicKey( - "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", - ); - const wallet = provider.wallet as anchor.Wallet; - const ATA_PROGRAM_ID = new anchor.web3.PublicKey( - "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", - ); - - const tokenName = "TestToken"; - const [mint] = anchor.web3.PublicKey.findProgramAddressSync( - [ - Buffer.from("token-2022-token"), - wallet.publicKey.toBytes(), - Buffer.from(tokenName), - ], - program.programId, - ); - const [payerATA] = anchor.web3.PublicKey.findProgramAddressSync( - [ - wallet.publicKey.toBytes(), - TOKEN_2022_PROGRAM_ID.toBytes(), - mint.toBytes(), - ], - ATA_PROGRAM_ID, - ); - - const receiver = anchor.web3.Keypair.generate(); - - const [receiverATA] = anchor.web3.PublicKey.findProgramAddressSync( - [ - receiver.publicKey.toBytes(), - TOKEN_2022_PROGRAM_ID.toBytes(), - mint.toBytes(), - ], - ATA_PROGRAM_ID, - ); - - it("Create Token-2022 Token", async () => { - await connection.requestAirdrop(receiver.publicKey, 1000000000); - await connection.requestAirdrop(wallet.publicKey, 1000000000); - const tx = new anchor.web3.Transaction(); - - const ix = await program.methods - .createToken(tokenName) - .accounts({ - signer: wallet.publicKey, - tokenProgram: TOKEN_2022_PROGRAM_ID, - }) - .instruction(); - - tx.add(ix); - - const sig = await sendAndConfirmTransaction( - program.provider.connection, - tx, - [wallet.payer], - ); - console.log("Your transaction signature", sig); - }); - - it("Initialize payer ATA", async () => { - const tx = new anchor.web3.Transaction(); - - const ix = await program.methods - .createAssociatedTokenAccount() - .accounts({ - tokenAccount: payerATA, - mint: mint, - signer: wallet.publicKey, - tokenProgram: TOKEN_2022_PROGRAM_ID, - }) - .instruction(); - - tx.add(ix); - - const sig = await sendAndConfirmTransaction( - program.provider.connection, - tx, - [wallet.payer], - ); - console.log("Your transaction signature", sig); - }); - - /* + // Configure the client to use the local cluster. + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + + const program = anchor.workspace.Anchor as Program; + const connection = program.provider.connection; + const TOKEN_2022_PROGRAM_ID = new anchor.web3.PublicKey("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); + const wallet = provider.wallet as anchor.Wallet; + const ATA_PROGRAM_ID = new anchor.web3.PublicKey("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); + + const tokenName = "TestToken"; + const [mint] = anchor.web3.PublicKey.findProgramAddressSync( + [Buffer.from("token-2022-token"), wallet.publicKey.toBytes(), Buffer.from(tokenName)], + program.programId, + ); + const [payerATA] = anchor.web3.PublicKey.findProgramAddressSync( + [wallet.publicKey.toBytes(), TOKEN_2022_PROGRAM_ID.toBytes(), mint.toBytes()], + ATA_PROGRAM_ID, + ); + + const receiver = anchor.web3.Keypair.generate(); + + const [receiverATA] = anchor.web3.PublicKey.findProgramAddressSync( + [receiver.publicKey.toBytes(), TOKEN_2022_PROGRAM_ID.toBytes(), mint.toBytes()], + ATA_PROGRAM_ID, + ); + + it("Create Token-2022 Token", async () => { + await connection.requestAirdrop(receiver.publicKey, 1000000000); + await connection.requestAirdrop(wallet.publicKey, 1000000000); + const tx = new anchor.web3.Transaction(); + + const ix = await program.methods + .createToken(tokenName) + .accounts({ + signer: wallet.publicKey, + tokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .instruction(); + + tx.add(ix); + + const sig = await sendAndConfirmTransaction(program.provider.connection, tx, [wallet.payer]); + console.log("Your transaction signature", sig); + }); + + it("Initialize payer ATA", async () => { + const tx = new anchor.web3.Transaction(); + + const ix = await program.methods + .createAssociatedTokenAccount() + .accounts({ + tokenAccount: payerATA, + mint: mint, + signer: wallet.publicKey, + tokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .instruction(); + + tx.add(ix); + + const sig = await sendAndConfirmTransaction(program.provider.connection, tx, [wallet.payer]); + console.log("Your transaction signature", sig); + }); + + /* // This instruction is included only as a reference, but is not required to run this test, because we are using "init" in the program's transfer instruction. The create_associated_token_account instruction on the program is provided as a reference as well. it("Initialize receiver ATA", async () => { const tx = new anchor.web3.Transaction(); @@ -119,52 +95,44 @@ describe("anchor", () => { }); */ - it("Mint Token to payer", async () => { - const tx = new anchor.web3.Transaction(); - - const ix = await program.methods - .mintToken(new BN(200000000)) - .accounts({ - mint: mint, - signer: wallet.publicKey, - receiver: payerATA, - tokenProgram: TOKEN_2022_PROGRAM_ID, - }) - .instruction(); - - tx.add(ix); - - const sig = await sendAndConfirmTransaction( - program.provider.connection, - tx, - [wallet.payer], - ); - console.log("Your transaction signature", sig); - }); - - // Using init in the transfer instruction, as init if needed is bot working with Token 2022 yet. - it("Transfer Token", async () => { - const tx = new anchor.web3.Transaction(); - - const ix = await program.methods - .transferToken(new BN(100)) - .accounts({ - mint: mint, - signer: wallet.publicKey, - from: payerATA, - to: receiver.publicKey, - tokenProgram: TOKEN_2022_PROGRAM_ID, - toAta: receiverATA, - }) - .instruction(); - - tx.add(ix); - - const sig = await sendAndConfirmTransaction( - program.provider.connection, - tx, - [wallet.payer], - ); - console.log("Your transaction signature", sig); - }); + it("Mint Token to payer", async () => { + const tx = new anchor.web3.Transaction(); + + const ix = await program.methods + .mintToken(new BN(200000000)) + .accounts({ + mint: mint, + signer: wallet.publicKey, + receiver: payerATA, + tokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .instruction(); + + tx.add(ix); + + const sig = await sendAndConfirmTransaction(program.provider.connection, tx, [wallet.payer]); + console.log("Your transaction signature", sig); + }); + + // Using init in the transfer instruction, as init if needed is bot working with Token 2022 yet. + it("Transfer Token", async () => { + const tx = new anchor.web3.Transaction(); + + const ix = await program.methods + .transferToken(new BN(100)) + .accounts({ + mint: mint, + signer: wallet.publicKey, + from: payerATA, + to: receiver.publicKey, + tokenProgram: TOKEN_2022_PROGRAM_ID, + toAta: receiverATA, + }) + .instruction(); + + tx.add(ix); + + const sig = await sendAndConfirmTransaction(program.provider.connection, tx, [wallet.payer]); + console.log("Your transaction signature", sig); + }); }); diff --git a/tokens/token-2022/basics/anchor/tests/bankrun.test.ts b/tokens/token-2022/basics/anchor/tests/bankrun.test.ts index b62269651..2edae2ed8 100644 --- a/tokens/token-2022/basics/anchor/tests/bankrun.test.ts +++ b/tokens/token-2022/basics/anchor/tests/bankrun.test.ts @@ -11,95 +11,75 @@ const IDL = require("../target/idl/anchor.json"); const PROGRAM_ID = new PublicKey(IDL.address); describe("anchor", async () => { - const context = await startAnchor( - "", - [{ name: "anchor", programId: PROGRAM_ID }], - [], - ); - const provider = new BankrunProvider(context); - anchor.setProvider(provider); - const program = new anchor.Program(IDL, provider); - const client = context.banksClient; - const TOKEN_2022_PROGRAM_ID = new anchor.web3.PublicKey( - "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", - ); - const wallet = provider.wallet as anchor.Wallet; - const ATA_PROGRAM_ID = new anchor.web3.PublicKey( - "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", - ); - - const tokenName = "TestToken"; - const [mint] = anchor.web3.PublicKey.findProgramAddressSync( - [ - Buffer.from("token-2022-token"), - wallet.publicKey.toBytes(), - Buffer.from(tokenName), - ], - program.programId, - ); - const [payerATA] = anchor.web3.PublicKey.findProgramAddressSync( - [ - wallet.publicKey.toBytes(), - TOKEN_2022_PROGRAM_ID.toBytes(), - mint.toBytes(), - ], - ATA_PROGRAM_ID, - ); - - const receiver = anchor.web3.Keypair.generate(); - - const [receiverATA] = anchor.web3.PublicKey.findProgramAddressSync( - [ - receiver.publicKey.toBytes(), - TOKEN_2022_PROGRAM_ID.toBytes(), - mint.toBytes(), - ], - ATA_PROGRAM_ID, - ); - - it("Create Token-2022 Token", async () => { - // await connection.requestAirdrop(receiver.publicKey, 1000000000); - // await connection.requestAirdrop(wallet.publicKey, 1000000000); - const tx = new anchor.web3.Transaction(); - const [blockhash, _height] = await client.getLatestBlockhash(); - - const ix = await program.methods - .createToken(tokenName) - .accounts({ - signer: wallet.publicKey, - tokenProgram: TOKEN_2022_PROGRAM_ID, - }) - .instruction(); - - tx.recentBlockhash = blockhash; - tx.add(ix); - tx.sign(wallet.payer); - const sig = await client.processTransaction(tx); - console.log("Your transaction signature", sig); - }); - - it("Initialize payer ATA", async () => { - const tx = new anchor.web3.Transaction(); - const [blockhash, _height] = await client.getLatestBlockhash(); - - const ix = await program.methods - .createAssociatedTokenAccount() - .accounts({ - tokenAccount: payerATA, - mint: mint, - signer: wallet.publicKey, - tokenProgram: TOKEN_2022_PROGRAM_ID, - }) - .instruction(); - - tx.recentBlockhash = blockhash; - tx.add(ix); - tx.sign(wallet.payer); - const sig = await client.processTransaction(tx); - console.log("Your transaction signature", sig); - }); - - /* + const context = await startAnchor("", [{ name: "anchor", programId: PROGRAM_ID }], []); + const provider = new BankrunProvider(context); + anchor.setProvider(provider); + const program = new anchor.Program(IDL, provider); + const client = context.banksClient; + const TOKEN_2022_PROGRAM_ID = new anchor.web3.PublicKey("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb"); + const wallet = provider.wallet as anchor.Wallet; + const ATA_PROGRAM_ID = new anchor.web3.PublicKey("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); + + const tokenName = "TestToken"; + const [mint] = anchor.web3.PublicKey.findProgramAddressSync( + [Buffer.from("token-2022-token"), wallet.publicKey.toBytes(), Buffer.from(tokenName)], + program.programId, + ); + const [payerATA] = anchor.web3.PublicKey.findProgramAddressSync( + [wallet.publicKey.toBytes(), TOKEN_2022_PROGRAM_ID.toBytes(), mint.toBytes()], + ATA_PROGRAM_ID, + ); + + const receiver = anchor.web3.Keypair.generate(); + + const [receiverATA] = anchor.web3.PublicKey.findProgramAddressSync( + [receiver.publicKey.toBytes(), TOKEN_2022_PROGRAM_ID.toBytes(), mint.toBytes()], + ATA_PROGRAM_ID, + ); + + it("Create Token-2022 Token", async () => { + // await connection.requestAirdrop(receiver.publicKey, 1000000000); + // await connection.requestAirdrop(wallet.publicKey, 1000000000); + const tx = new anchor.web3.Transaction(); + const [blockhash, _height] = await client.getLatestBlockhash(); + + const ix = await program.methods + .createToken(tokenName) + .accounts({ + signer: wallet.publicKey, + tokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .instruction(); + + tx.recentBlockhash = blockhash; + tx.add(ix); + tx.sign(wallet.payer); + const sig = await client.processTransaction(tx); + console.log("Your transaction signature", sig); + }); + + it("Initialize payer ATA", async () => { + const tx = new anchor.web3.Transaction(); + const [blockhash, _height] = await client.getLatestBlockhash(); + + const ix = await program.methods + .createAssociatedTokenAccount() + .accounts({ + tokenAccount: payerATA, + mint: mint, + signer: wallet.publicKey, + tokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .instruction(); + + tx.recentBlockhash = blockhash; + tx.add(ix); + tx.sign(wallet.payer); + const sig = await client.processTransaction(tx); + console.log("Your transaction signature", sig); + }); + + /* // This instruction is included only as a reference, but is not required to run this test, because we are using "init" in the program's transfer instruction. The create_associated_token_account instruction on the program is provided as a reference as well. it("Initialize receiver ATA", async () => { const tx = new anchor.web3.Transaction(); @@ -124,48 +104,48 @@ describe("anchor", async () => { }); */ - it("Mint Token to payer", async () => { - const tx = new anchor.web3.Transaction(); - const [blockhash, _height] = await client.getLatestBlockhash(); - - const ix = await program.methods - .mintToken(new BN(200000000)) - .accounts({ - mint: mint, - signer: wallet.publicKey, - receiver: payerATA, - tokenProgram: TOKEN_2022_PROGRAM_ID, - }) - .instruction(); - - tx.recentBlockhash = blockhash; - tx.add(ix); - tx.sign(wallet.payer); - const sig = await client.processTransaction(tx); - console.log("Your transaction signature", sig); - }); - - // Using init in the transfer instruction, as init if needed is bot working with Token 2022 yet. - it("Transfer Token", async () => { - const tx = new anchor.web3.Transaction(); - const [blockhash, _height] = await client.getLatestBlockhash(); - - const ix = await program.methods - .transferToken(new BN(100)) - .accounts({ - mint: mint, - signer: wallet.publicKey, - from: payerATA, - to: receiver.publicKey, - tokenProgram: TOKEN_2022_PROGRAM_ID, - toAta: receiverATA, - }) - .instruction(); - - tx.recentBlockhash = blockhash; - tx.add(ix); - tx.sign(wallet.payer); - const sig = await client.processTransaction(tx); - console.log("Your transaction signature", sig); - }); + it("Mint Token to payer", async () => { + const tx = new anchor.web3.Transaction(); + const [blockhash, _height] = await client.getLatestBlockhash(); + + const ix = await program.methods + .mintToken(new BN(200000000)) + .accounts({ + mint: mint, + signer: wallet.publicKey, + receiver: payerATA, + tokenProgram: TOKEN_2022_PROGRAM_ID, + }) + .instruction(); + + tx.recentBlockhash = blockhash; + tx.add(ix); + tx.sign(wallet.payer); + const sig = await client.processTransaction(tx); + console.log("Your transaction signature", sig); + }); + + // Using init in the transfer instruction, as init if needed is bot working with Token 2022 yet. + it("Transfer Token", async () => { + const tx = new anchor.web3.Transaction(); + const [blockhash, _height] = await client.getLatestBlockhash(); + + const ix = await program.methods + .transferToken(new BN(100)) + .accounts({ + mint: mint, + signer: wallet.publicKey, + from: payerATA, + to: receiver.publicKey, + tokenProgram: TOKEN_2022_PROGRAM_ID, + toAta: receiverATA, + }) + .instruction(); + + tx.recentBlockhash = blockhash; + tx.add(ix); + tx.sign(wallet.payer); + const sig = await client.processTransaction(tx); + console.log("Your transaction signature", sig); + }); }); diff --git a/tokens/token-2022/cpi-guard/anchor/Anchor.toml b/tokens/token-2022/cpi-guard/anchor/Anchor.toml index 2de4c34ae..84ecbf174 100644 --- a/tokens/token-2022/cpi-guard/anchor/Anchor.toml +++ b/tokens/token-2022/cpi-guard/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -cpi_guard = "6tU3MEowU6oxxeDZLSxEwzcEZsZrhBJsfUR6xECvShid" - -# [registry] section removed — no longer used in Anchor 1.0 +cpi_guard = "PWPfSkM5ntHyS68woBexCrrDVE23AdtdQbUoyx5q7GR" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/cpi-guard/anchor/migrations/deploy.ts b/tokens/token-2022/cpi-guard/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/cpi-guard/anchor/migrations/deploy.ts +++ b/tokens/token-2022/cpi-guard/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/cpi-guard/anchor/package.json b/tokens/token-2022/cpi-guard/anchor/package.json index ec93e2a0e..78c8eba57 100644 --- a/tokens/token-2022/cpi-guard/anchor/package.json +++ b/tokens/token-2022/cpi-guard/anchor/package.json @@ -1,23 +1,23 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.6" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "anchor-bankrun": "^0.4.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.6" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "anchor-bankrun": "^0.4.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/cpi-guard/anchor/pnpm-lock.yaml b/tokens/token-2022/cpi-guard/anchor/pnpm-lock.yaml index e2f036e39..4d2f0bd66 100644 --- a/tokens/token-2022/cpi-guard/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/cpi-guard/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.6 version: 0.4.14(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -48,18 +48,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -846,16 +846,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -873,7 +873,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/Cargo.toml b/tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/Cargo.toml index 1d2b8f3dc..f2ced8eca 100644 --- a/tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/Cargo.toml +++ b/tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/Cargo.toml @@ -20,8 +20,16 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/src/lib.rs b/tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/src/lib.rs index 25419c3f7..adbf6cc97 100644 --- a/tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/src/lib.rs +++ b/tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/src/lib.rs @@ -6,7 +6,7 @@ use anchor_spl::{ // Note that you cannot initialize or update the CpiGuard extension through a CPI // https://github.com/solana-labs/solana-program-library/blob/6968859e2ee0a1764da572de340cdb58e2b4586f/token/program-2022/src/extension/cpi_guard/processor.rs#L44-L46 -declare_id!("6tU3MEowU6oxxeDZLSxEwzcEZsZrhBJsfUR6xECvShid"); +declare_id!("PWPfSkM5ntHyS68woBexCrrDVE23AdtdQbUoyx5q7GR"); #[program] pub mod cpi_guard { diff --git a/tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs b/tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs new file mode 100644 index 000000000..378b35503 --- /dev/null +++ b/tokens/token-2022/cpi-guard/anchor/programs/cpi-guard/tests/test_cpi_guard.rs @@ -0,0 +1,205 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + assert_token_account_balance, create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_mint, mint_tokens_to_token_extensions_account, + TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = cpi_guard::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/cpi_guard.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +/// Create a basic Token Extensions token account (165 bytes, no extensions). +/// Uses explicit keypair — kite's ATA creation won't work here because +/// we need to reallocate and add the CPI Guard extension later. +fn create_basic_token_account_instructions( + payer: &Pubkey, + token_account: &Pubkey, + mint: &Pubkey, + owner: &Pubkey, +) -> Vec { + let rent_sysvar: Pubkey = "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap(); + let create_account_ix = anchor_lang::solana_program::system_instruction::create_account( + payer, + token_account, + 3_000_000, + 165, + &TOKEN_EXTENSIONS_PROGRAM_ID, + ); + let init_account_ix = Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new_readonly(*mint, false), + AccountMeta::new_readonly(*owner, false), + AccountMeta::new_readonly(rent_sysvar, false), + ], + data: vec![1], // InitializeAccount + }; + vec![create_account_ix, init_account_ix] +} + +/// Reallocate instruction (instruction 29) to add extension types to a token account. +fn reallocate_instruction( + token_account: &Pubkey, + payer: &Pubkey, + owner: &Pubkey, + extension_types: &[u16], +) -> Instruction { + let mut data = vec![29u8]; + for et in extension_types { + data.extend_from_slice(&et.to_le_bytes()); + } + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new(*payer, true), + AccountMeta::new_readonly(system_program::id(), false), + AccountMeta::new_readonly(*owner, true), + ], + data, + } +} + +/// EnableCpiGuard instruction (instruction 34, sub-instruction 0). +fn enable_cpi_guard_instruction(token_account: &Pubkey, owner: &Pubkey) -> Instruction { + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new_readonly(*owner, true), + ], + data: vec![34, 0], + } +} + +/// DisableCpiGuard instruction (instruction 34, sub-instruction 1). +fn disable_cpi_guard_instruction(token_account: &Pubkey, owner: &Pubkey) -> Instruction { + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new_readonly(*owner, true), + ], + data: vec![34, 1], + } +} + +#[test] +fn test_cpi_guard_prevents_transfer_then_allows_after_disable() { + let (mut svm, program_id, payer) = setup(); + let token_keypair = Keypair::new(); + + // Step 1: Create a Token Extensions mint (no extensions needed on the mint itself) + let mint = create_token_extensions_mint(&mut svm, &payer, 2, None, &[]).unwrap(); + svm.expire_blockhash(); + + // Step 2: Create basic token account (needs explicit keypair for reallocate flow) + let token_ixs = create_basic_token_account_instructions( + &payer.pubkey(), + &token_keypair.pubkey(), + &mint, + &payer.pubkey(), + ); + send_transaction_from_instructions(&mut svm, token_ixs, &[&payer, &token_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 3: Reallocate to add CPI Guard extension space + let cpi_guard_extension_type: u16 = 11; // ExtensionType::CpiGuard + let reallocate_ix = reallocate_instruction( + &token_keypair.pubkey(), + &payer.pubkey(), + &payer.pubkey(), + &[cpi_guard_extension_type], + ); + send_transaction_from_instructions(&mut svm, vec![reallocate_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Enable CPI Guard + let enable_ix = enable_cpi_guard_instruction(&token_keypair.pubkey(), &payer.pubkey()); + send_transaction_from_instructions(&mut svm, vec![enable_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 5: Mint 1 token to the token account + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &token_keypair.pubkey(), + 1, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 6: Try CPI transfer — should fail because CPI Guard is enabled + let (recipient_token_account, _bump) = + Pubkey::find_program_address(&[b"pda"], &program_id); + + let transfer_ix = Instruction::new_with_bytes( + program_id, + &cpi_guard::instruction::CpiTransfer {}.data(), + cpi_guard::accounts::CpiTransfer { + sender: payer.pubkey(), + sender_token_account: token_keypair.pubkey(), + recipient_token_account, + mint_account: mint, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + let result = send_transaction_from_instructions(&mut svm, vec![transfer_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Transfer should fail when CPI Guard is enabled" + ); + svm.expire_blockhash(); + + // Step 7: Disable CPI Guard + let disable_ix = disable_cpi_guard_instruction(&token_keypair.pubkey(), &payer.pubkey()); + send_transaction_from_instructions(&mut svm, vec![disable_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 8: Transfer should now succeed + let transfer_ix2 = Instruction::new_with_bytes( + program_id, + &cpi_guard::instruction::CpiTransfer {}.data(), + cpi_guard::accounts::CpiTransfer { + sender: payer.pubkey(), + sender_token_account: token_keypair.pubkey(), + recipient_token_account, + mint_account: mint, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![transfer_ix2], &[&payer], &payer.pubkey()).unwrap(); + + assert_token_account_balance(&svm, &recipient_token_account, 1, "Recipient should have 1 token"); +} diff --git a/tokens/token-2022/cpi-guard/anchor/tests/cpi-guard.ts b/tokens/token-2022/cpi-guard/anchor/tests/cpi-guard.ts index 6a727a599..f9b3969b4 100644 --- a/tokens/token-2022/cpi-guard/anchor/tests/cpi-guard.ts +++ b/tokens/token-2022/cpi-guard/anchor/tests/cpi-guard.ts @@ -1,5 +1,5 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; import { createEnableCpiGuardInstruction, createInitializeAccountInstruction, @@ -9,11 +9,11 @@ import { getAccountLen, mintTo, TOKEN_2022_PROGRAM_ID, -} from '@solana/spl-token'; -import { SystemProgram, sendAndConfirmTransaction, Transaction } from '@solana/web3.js'; -import type { CpiGuard } from '../target/types/cpi_guard'; +} from "@solana/spl-token"; +import { SystemProgram, sendAndConfirmTransaction, Transaction } from "@solana/web3.js"; +import type { CpiGuard } from "../target/types/cpi_guard"; -describe('cpi-guard', () => { +describe("cpi-guard", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); const connection = provider.connection; @@ -25,7 +25,7 @@ describe('cpi-guard', () => { const mintKeypair = new anchor.web3.Keypair(); const tokenKeypair = new anchor.web3.Keypair(); - it('Create Token Account with CpiGuard extension', async () => { + it("Create Token Account with CpiGuard extension", async () => { await createMint( connection, wallet.payer, // Payer of the transaction and initialization fees @@ -60,9 +60,18 @@ describe('cpi-guard', () => { ); // Instruction to initialize the CpiGuard Extension - const enableCpiGuiardInstruction = createEnableCpiGuardInstruction(tokenKeypair.publicKey, wallet.publicKey, [], TOKEN_2022_PROGRAM_ID); + const enableCpiGuiardInstruction = createEnableCpiGuardInstruction( + tokenKeypair.publicKey, + wallet.publicKey, + [], + TOKEN_2022_PROGRAM_ID, + ); - const transaction = new Transaction().add(createAccountInstruction, initializeAccountInstruction, enableCpiGuiardInstruction); + const transaction = new Transaction().add( + createAccountInstruction, + initializeAccountInstruction, + enableCpiGuiardInstruction, + ); const transactionSignature = await sendAndConfirmTransaction( connection, @@ -70,12 +79,22 @@ describe('cpi-guard', () => { [wallet.payer, tokenKeypair], // Signers ); - await mintTo(connection, wallet.payer, mintKeypair.publicKey, tokenKeypair.publicKey, wallet.payer, 1, [], null, TOKEN_2022_PROGRAM_ID); + await mintTo( + connection, + wallet.payer, + mintKeypair.publicKey, + tokenKeypair.publicKey, + wallet.payer, + 1, + [], + null, + TOKEN_2022_PROGRAM_ID, + ); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Transfer, expect fail', async () => { + it("Transfer, expect fail", async () => { try { await program.methods .cpiTransfer() @@ -86,16 +105,21 @@ describe('cpi-guard', () => { }) .rpc({ skipPreflight: true }); } catch (error) { - console.log('\nExpect Error:', error.message); + console.log("\nExpect Error:", error.message); } }); - it('Disable CpiGuard', async () => { - const transactionSignature = await disableCpiGuard(connection, wallet.payer, tokenKeypair.publicKey, wallet.publicKey); - console.log('Your transaction signature', transactionSignature); + it("Disable CpiGuard", async () => { + const transactionSignature = await disableCpiGuard( + connection, + wallet.payer, + tokenKeypair.publicKey, + wallet.publicKey, + ); + console.log("Your transaction signature", transactionSignature); }); - it('Transfer, expect success', async () => { + it("Transfer, expect success", async () => { const transactionSignature = await program.methods .cpiTransfer() .accounts({ @@ -104,6 +128,6 @@ describe('cpi-guard', () => { mintAccount: mintKeypair.publicKey, }) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); }); diff --git a/tokens/token-2022/default-account-state/anchor/Anchor.toml b/tokens/token-2022/default-account-state/anchor/Anchor.toml index a6d6e4ee0..c3916c51e 100644 --- a/tokens/token-2022/default-account-state/anchor/Anchor.toml +++ b/tokens/token-2022/default-account-state/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -default_account_state = "5LdYbHiUsFxVG8bfqoeBkhBYMRmWZb3BoLuABgYW7coB" - -# [registry] section removed — no longer used in Anchor 1.0 +default_account_state = "HVMebUevbwW8QbUxSyCtNwsJcpgWj9jVkW38g69hTHRT" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/default-account-state/anchor/migrations/deploy.ts b/tokens/token-2022/default-account-state/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/default-account-state/anchor/migrations/deploy.ts +++ b/tokens/token-2022/default-account-state/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/default-account-state/anchor/package.json b/tokens/token-2022/default-account-state/anchor/package.json index f800607c4..cc320fb64 100644 --- a/tokens/token-2022/default-account-state/anchor/package.json +++ b/tokens/token-2022/default-account-state/anchor/package.json @@ -1,21 +1,21 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.6" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.6" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/default-account-state/anchor/pnpm-lock.yaml b/tokens/token-2022/default-account-state/anchor/pnpm-lock.yaml index 4ad69fa59..6470efa7e 100644 --- a/tokens/token-2022/default-account-state/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/default-account-state/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.6 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -860,16 +860,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -887,7 +887,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/token-2022/default-account-state/anchor/programs/default-account-state/Cargo.toml b/tokens/token-2022/default-account-state/anchor/programs/default-account-state/Cargo.toml index d596d8b63..5537d63af 100644 --- a/tokens/token-2022/default-account-state/anchor/programs/default-account-state/Cargo.toml +++ b/tokens/token-2022/default-account-state/anchor/programs/default-account-state/Cargo.toml @@ -20,8 +20,15 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/default-account-state/anchor/programs/default-account-state/src/lib.rs b/tokens/token-2022/default-account-state/anchor/programs/default-account-state/src/lib.rs index c1b5c3da6..c03c2cb1c 100644 --- a/tokens/token-2022/default-account-state/anchor/programs/default-account-state/src/lib.rs +++ b/tokens/token-2022/default-account-state/anchor/programs/default-account-state/src/lib.rs @@ -12,7 +12,7 @@ use anchor_spl::{ }, }; -declare_id!("5LdYbHiUsFxVG8bfqoeBkhBYMRmWZb3BoLuABgYW7coB"); +declare_id!("HVMebUevbwW8QbUxSyCtNwsJcpgWj9jVkW38g69hTHRT"); #[program] pub mod default_account_state { diff --git a/tokens/token-2022/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs b/tokens/token-2022/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs new file mode 100644 index 000000000..c0666812b --- /dev/null +++ b/tokens/token-2022/default-account-state/anchor/programs/default-account-state/tests/test_default_account_state.rs @@ -0,0 +1,165 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + assert_token_account_balance, create_wallet, send_transaction_from_instructions, + token_extensions::{ + mint_tokens_to_token_extensions_account, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +/// Create a Token Extensions token account (165 bytes, no extra extensions). +/// Uses explicit keypair — not an ATA — so we can inspect account state bytes. +fn create_token_account_instruction( + payer: &Pubkey, + token_account: &Pubkey, + mint: &Pubkey, + owner: &Pubkey, +) -> Vec { + let rent_sysvar: Pubkey = "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap(); + let create_ix = anchor_lang::solana_program::system_instruction::create_account( + payer, + token_account, + 3_000_000, + 165, + &TOKEN_EXTENSIONS_PROGRAM_ID, + ); + let init_ix = Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new_readonly(*mint, false), + AccountMeta::new_readonly(*owner, false), + AccountMeta::new_readonly(rent_sysvar, false), + ], + data: vec![1], // InitializeAccount + }; + vec![create_ix, init_ix] +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = default_account_state::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/default_account_state.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_default_account_state() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Initialize mint with DefaultAccountState extension (frozen) + let initialize_ix = Instruction::new_with_bytes( + program_id, + &default_account_state::instruction::Initialize {}.data(), + default_account_state::accounts::Initialize { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Verify mint exists + let mint_account = svm.get_account(&mint_keypair.pubkey()).unwrap(); + assert!(!mint_account.data.is_empty(), "Mint should have data"); + + // Step 2: Create a token account (it will be frozen by default due to DefaultAccountState extension) + let token1 = Keypair::new(); + let create_token1_ixs = create_token_account_instruction( + &payer.pubkey(), + &token1.pubkey(), + &mint_keypair.pubkey(), + &payer.pubkey(), + ); + send_transaction_from_instructions(&mut svm, create_token1_ixs, &[&payer, &token1], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Verify token account state is frozen (byte 108 = account state: 0=uninitialized, 1=initialized, 2=frozen) + let token1_data = svm.get_account(&token1.pubkey()).unwrap(); + assert_eq!( + token1_data.data[108], 2, + "Token account should be frozen (state=2)" + ); + + // Step 3: Attempt to mint to the frozen account — should fail + let result = mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &token1.pubkey(), + 1, + &payer, + ); + assert!( + result.is_err(), + "Minting to a frozen account should fail" + ); + svm.expire_blockhash(); + + // Step 4: Update default state to Initialized + let update_ix = Instruction::new_with_bytes( + program_id, + &default_account_state::instruction::UpdateDefaultState { + account_state: default_account_state::AnchorAccountState::Initialized, + } + .data(), + default_account_state::accounts::UpdateDefaultState { + freeze_authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 5: Create a new token account — should be initialized (not frozen) now + let token2 = Keypair::new(); + let create_token2_ixs = create_token_account_instruction( + &payer.pubkey(), + &token2.pubkey(), + &mint_keypair.pubkey(), + &payer.pubkey(), + ); + send_transaction_from_instructions(&mut svm, create_token2_ixs, &[&payer, &token2], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Verify token2 is initialized (not frozen) + let token2_data = svm.get_account(&token2.pubkey()).unwrap(); + assert_eq!( + token2_data.data[108], 1, + "Token account should be initialized (state=1)" + ); + + // Step 6: Mint to the new account — should succeed + mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &token2.pubkey(), + 1, + &payer, + ).unwrap(); + + assert_token_account_balance(&svm, &token2.pubkey(), 1, "Should have minted 1 token"); +} diff --git a/tokens/token-2022/default-account-state/anchor/tests/default-account-state.ts b/tokens/token-2022/default-account-state/anchor/tests/default-account-state.ts index ae32cccbb..3e82cc4c2 100644 --- a/tokens/token-2022/default-account-state/anchor/tests/default-account-state.ts +++ b/tokens/token-2022/default-account-state/anchor/tests/default-account-state.ts @@ -1,9 +1,9 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { createAccount, mintTo, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; -import type { DefaultAccountState } from '../target/types/default_account_state'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { createAccount, mintTo, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import type { DefaultAccountState } from "../target/types/default_account_state"; -describe('default-account-state', () => { +describe("default-account-state", () => { const provider = anchor.AnchorProvider.env(); const connection = provider.connection; const wallet = provider.wallet as anchor.Wallet; @@ -13,16 +13,16 @@ describe('default-account-state', () => { const mintKeypair = new anchor.web3.Keypair(); - it('Create Mint with DefaultAccountState extension', async () => { + it("Create Mint with DefaultAccountState extension", async () => { const transactionSignature = await program.methods .initialize() .accounts({ mintAccount: mintKeypair.publicKey }) .signers([mintKeypair]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Attempt Mint Token, expect fail', async () => { + it("Attempt Mint Token, expect fail", async () => { const amount = 1; // Create a token account, default state is frozen @@ -50,20 +50,20 @@ describe('default-account-state', () => { TOKEN_2022_PROGRAM_ID, // Token Extension Program ID ); } catch (error) { - console.log('\nExpect Error:', error.logs); + console.log("\nExpect Error:", error.logs); } }); - it('Update DefaultAccountState', async () => { + it("Update DefaultAccountState", async () => { // Update the default state to initialized (not frozen) const transactionSignature = await program.methods .updateDefaultState({ initialized: {} }) .accounts({ mintAccount: mintKeypair.publicKey }) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Attempt Mint Token, expect success', async () => { + it("Attempt Mint Token, expect success", async () => { const amount = 1; // Create a token account, default state is initialized (not frozen) diff --git a/tokens/token-2022/default-account-state/native/tests/test.ts b/tokens/token-2022/default-account-state/native/tests/test.ts index 01631bd34..381e14945 100644 --- a/tokens/token-2022/default-account-state/native/tests/test.ts +++ b/tokens/token-2022/default-account-state/native/tests/test.ts @@ -1,24 +1,30 @@ -import { Buffer } from 'node:buffer'; -import { describe, test } from 'node:test'; -import { TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; -import { Keypair, PublicKey, SYSVAR_RENT_PUBKEY, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { assert } from 'chai'; -import { start } from 'solana-bankrun'; +import { Buffer } from "node:buffer"; +import { describe, test } from "node:test"; +import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import { + Keypair, + PublicKey, + SYSVAR_RENT_PUBKEY, + SystemProgram, + Transaction, + TransactionInstruction, +} from "@solana/web3.js"; +import * as borsh from "borsh"; +import { assert } from "chai"; +import { start } from "solana-bankrun"; - -const CreateTokenArgsSchema = { struct: { token_decimals: 'u8' } }; +const CreateTokenArgsSchema = { struct: { token_decimals: "u8" } }; function borshSerialize(schema: borsh.Schema, data: object): Buffer { return Buffer.from(borsh.serialize(schema, data)); } -describe('Create Token', async () => { +describe("Create Token", async () => { const PROGRAM_ID = PublicKey.unique(); const context = await start( [ { - name: 'token_2022_default_account_state_program', + name: "token_2022_default_account_state_program", programId: PROGRAM_ID, }, ], @@ -27,7 +33,7 @@ describe('Create Token', async () => { const client = context.banksClient; const payer = context.payer; - test('Create a Token-22 SPL-Token !', async () => { + test("Create a Token-22 SPL-Token !", async () => { const blockhash = context.lastBlockhash; const mintKeypair: Keypair = Keypair.generate(); @@ -56,6 +62,6 @@ describe('Create Token', async () => { const transaction = await client.processTransaction(tx); assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - console.log('Token Mint Address: ', mintKeypair.publicKey.toBase58()); + console.log("Token Mint Address: ", mintKeypair.publicKey.toBase58()); }); }); diff --git a/tokens/token-2022/group/anchor/Anchor.toml b/tokens/token-2022/group/anchor/Anchor.toml index f3192c85d..b6a1e6c30 100644 --- a/tokens/token-2022/group/anchor/Anchor.toml +++ b/tokens/token-2022/group/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -group = "4XCDGMD8fsdjUzmYj6d9if8twFt1f23Ym52iDmWK8fFs" - -# [registry] section removed — no longer used in Anchor 1.0 +group = "8cToQMRhi1w6SLMLCcPniNix9eivQV3oFWwPucR5XxdR" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/group/anchor/migrations/deploy.ts b/tokens/token-2022/group/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/group/anchor/migrations/deploy.ts +++ b/tokens/token-2022/group/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/group/anchor/package.json b/tokens/token-2022/group/anchor/package.json index 198383d3f..4c69440ef 100644 --- a/tokens/token-2022/group/anchor/package.json +++ b/tokens/token-2022/group/anchor/package.json @@ -1,20 +1,20 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/group/anchor/pnpm-lock.yaml b/tokens/token-2022/group/anchor/pnpm-lock.yaml index 5e7783487..243a77181 100644 --- a/tokens/token-2022/group/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/group/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) devDependencies: '@types/bn.js': specifier: ^5.1.0 @@ -39,18 +39,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -705,16 +705,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -732,7 +732,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/tokens/token-2022/group/anchor/programs/group/Cargo.toml b/tokens/token-2022/group/anchor/programs/group/Cargo.toml index ceda62bcf..b8941f668 100644 --- a/tokens/token-2022/group/anchor/programs/group/Cargo.toml +++ b/tokens/token-2022/group/anchor/programs/group/Cargo.toml @@ -20,9 +20,16 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -spl-token-group-interface = "0.2.5" +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" +# spl-token-group-interface removed — unused, caused version conflicts with litesvm + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/group/anchor/programs/group/src/lib.rs b/tokens/token-2022/group/anchor/programs/group/src/lib.rs index f817c5c13..0cbe25339 100644 --- a/tokens/token-2022/group/anchor/programs/group/src/lib.rs +++ b/tokens/token-2022/group/anchor/programs/group/src/lib.rs @@ -8,7 +8,7 @@ use anchor_spl::token_interface::{ token_group_initialize, Mint, Token2022, TokenGroupInitialize, }; -declare_id!("4XCDGMD8fsdjUzmYj6d9if8twFt1f23Ym52iDmWK8fFs"); +declare_id!("8cToQMRhi1w6SLMLCcPniNix9eivQV3oFWwPucR5XxdR"); #[program] pub mod group { diff --git a/tokens/token-2022/group/anchor/programs/group/tests/test_group.rs b/tokens/token-2022/group/anchor/programs/group/tests/test_group.rs new file mode 100644 index 000000000..4d6135a04 --- /dev/null +++ b/tokens/token-2022/group/anchor/programs/group/tests/test_group.rs @@ -0,0 +1,50 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID, + }, + solana_signer::Signer, +}; + +#[test] +fn test_initialize_group() { + let program_id = group::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/group.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + // Derive the mint PDA + let (mint_account, _bump) = Pubkey::find_program_address(&[b"group"], &program_id); + + let instruction = Instruction::new_with_bytes( + program_id, + &group::instruction::TestInitializeGroup {}.data(), + group::accounts::InitializeGroup { + payer: payer.pubkey(), + mint_account, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions(&mut svm, vec![instruction], &[&payer], &payer.pubkey()).unwrap(); + + // Verify mint was created with group pointer extension + let mint_data = svm + .get_account(&mint_account) + .expect("Mint account should exist"); + assert!( + mint_data.data.len() > 82, + "Mint should have extension data (size > 82, got {})", + mint_data.data.len() + ); +} diff --git a/tokens/token-2022/group/anchor/tests/group.ts b/tokens/token-2022/group/anchor/tests/group.ts index 7756b0ca3..c3344bce5 100644 --- a/tokens/token-2022/group/anchor/tests/group.ts +++ b/tokens/token-2022/group/anchor/tests/group.ts @@ -1,8 +1,8 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import type { Group } from '../target/types/group'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import type { Group } from "../target/types/group"; -describe('group', () => { +describe("group", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); const _connection = provider.connection; @@ -11,8 +11,8 @@ describe('group', () => { const program = anchor.workspace.Group as Program; - it('Create Mint with Group Pointer', async () => { + it("Create Mint with Group Pointer", async () => { const transactionSignature = await program.methods.testInitializeGroup().accounts({}).rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); }); diff --git a/tokens/token-2022/immutable-owner/anchor/Anchor.toml b/tokens/token-2022/immutable-owner/anchor/Anchor.toml index 8716f3857..98bbf37d4 100644 --- a/tokens/token-2022/immutable-owner/anchor/Anchor.toml +++ b/tokens/token-2022/immutable-owner/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -immutable_owner = "6g5URpqqurW8RbKjuGeRCVZBKky3J4kYcLeotQ6vj6UT" - -# [registry] section removed — no longer used in Anchor 1.0 +immutable_owner = "FwsJpDYJ1UkYHq6rGYD7sXY1fStiBTfLpApazzj9khS7" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/immutable-owner/anchor/migrations/deploy.ts b/tokens/token-2022/immutable-owner/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/immutable-owner/anchor/migrations/deploy.ts +++ b/tokens/token-2022/immutable-owner/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/immutable-owner/anchor/package.json b/tokens/token-2022/immutable-owner/anchor/package.json index f800607c4..cc320fb64 100644 --- a/tokens/token-2022/immutable-owner/anchor/package.json +++ b/tokens/token-2022/immutable-owner/anchor/package.json @@ -1,21 +1,21 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.6" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.6" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/immutable-owner/anchor/pnpm-lock.yaml b/tokens/token-2022/immutable-owner/anchor/pnpm-lock.yaml index bb8d11208..54f388346 100644 --- a/tokens/token-2022/immutable-owner/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/immutable-owner/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.6 version: 0.4.14(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -783,16 +783,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -810,7 +810,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/Cargo.toml b/tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/Cargo.toml index 233e36b2c..a66b664fc 100644 --- a/tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/Cargo.toml +++ b/tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/Cargo.toml @@ -20,8 +20,15 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/src/lib.rs b/tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/src/lib.rs index 47c6a53ee..2e53bb1c2 100644 --- a/tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/src/lib.rs +++ b/tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/src/lib.rs @@ -9,7 +9,7 @@ use anchor_spl::{ token_interface::{immutable_owner_initialize, ImmutableOwnerInitialize, Mint, Token2022}, }; -declare_id!("6g5URpqqurW8RbKjuGeRCVZBKky3J4kYcLeotQ6vj6UT"); +declare_id!("FwsJpDYJ1UkYHq6rGYD7sXY1fStiBTfLpApazzj9khS7"); #[program] pub mod immutable_owner { diff --git a/tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs b/tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs new file mode 100644 index 000000000..dad6478b0 --- /dev/null +++ b/tokens/token-2022/immutable-owner/anchor/programs/immutable-owner/tests/test_immutable_owner.rs @@ -0,0 +1,106 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{create_token_extensions_mint, TOKEN_EXTENSIONS_PROGRAM_ID}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +/// SetAuthority instruction for Token Extensions (instruction 6). +fn set_authority_instruction( + account: &Pubkey, + current_authority: &Pubkey, + new_authority: Option<&Pubkey>, + authority_type: u8, +) -> Instruction { + let mut data = vec![6u8, authority_type]; + match new_authority { + Some(new_auth) => { + data.push(1); // COption::Some + data.extend_from_slice(new_auth.as_ref()); + } + None => { + data.push(0); // COption::None + data.extend_from_slice(&[0u8; 32]); + } + } + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*account, false), + AccountMeta::new_readonly(*current_authority, true), + ], + data, + } +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = immutable_owner::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/immutable_owner.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_token_account_with_immutable_owner() { + let (mut svm, program_id, payer) = setup(); + let token_keypair = Keypair::new(); + + // Step 1: Create a Token Extensions mint with 2 decimals (no extensions needed on mint) + let mint = create_token_extensions_mint(&mut svm, &payer, 2, None, &[]).unwrap(); + svm.expire_blockhash(); + + // Step 2: Call program to create token account with ImmutableOwner extension + let initialize_ix = Instruction::new_with_bytes( + program_id, + &immutable_owner::instruction::Initialize {}.data(), + immutable_owner::accounts::Initialize { + payer: payer.pubkey(), + token_account: token_keypair.pubkey(), + mint_account: mint, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &token_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Verify token account was created + let token_data = svm + .get_account(&token_keypair.pubkey()) + .expect("Token account should exist"); + assert!( + token_data.data.len() > 165, + "Token account should have extension data (size > 165, got {})", + token_data.data.len() + ); + + // Step 3: Attempt to change the account owner — should fail due to immutable owner + let new_owner = Keypair::new(); + let set_authority_ix = set_authority_instruction( + &token_keypair.pubkey(), + &payer.pubkey(), + Some(&new_owner.pubkey()), + 2, // AuthorityType::AccountOwner + ); + let result = send_transaction_from_instructions(&mut svm, vec![set_authority_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Setting a new owner should fail due to ImmutableOwner extension" + ); +} diff --git a/tokens/token-2022/immutable-owner/anchor/tests/immutable-owner.ts b/tokens/token-2022/immutable-owner/anchor/tests/immutable-owner.ts index 8e2015dba..7202b1d5b 100644 --- a/tokens/token-2022/immutable-owner/anchor/tests/immutable-owner.ts +++ b/tokens/token-2022/immutable-owner/anchor/tests/immutable-owner.ts @@ -1,9 +1,9 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { AuthorityType, createMint, setAuthority, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; -import type { ImmutableOwner } from '../target/types/immutable_owner'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { AuthorityType, createMint, setAuthority, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import type { ImmutableOwner } from "../target/types/immutable_owner"; -describe('immutable-owner', () => { +describe("immutable-owner", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); const connection = provider.connection; @@ -14,7 +14,7 @@ describe('immutable-owner', () => { const tokenKeypair = new anchor.web3.Keypair(); - it('Create Token Account with ImmutableOwner extension', async () => { + it("Create Token Account with ImmutableOwner extension", async () => { const mint = await createMint( connection, wallet.payer, // Payer of the transaction and initialization fees @@ -34,10 +34,10 @@ describe('immutable-owner', () => { }) .signers([tokenKeypair]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Attempt to change token account owner, expect fail', async () => { + it("Attempt to change token account owner, expect fail", async () => { try { await setAuthority( connection, // Connection to use @@ -51,7 +51,7 @@ describe('immutable-owner', () => { TOKEN_2022_PROGRAM_ID, // Token Extension Program ID ); } catch (error) { - console.log('\nExpect Error:', error.logs); + console.log("\nExpect Error:", error.logs); } }); }); diff --git a/tokens/token-2022/interest-bearing/anchor/Anchor.toml b/tokens/token-2022/interest-bearing/anchor/Anchor.toml index f37dff156..6618e4fee 100644 --- a/tokens/token-2022/interest-bearing/anchor/Anchor.toml +++ b/tokens/token-2022/interest-bearing/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -interest_bearing = "DMQdkzRJz8uQSN8Kx2QYmQJn6xLKhsu3LcPYxs314MgC" - -# [registry] section removed — no longer used in Anchor 1.0 +interest_bearing = "2tinFpSK55kJu1wjcwW1PZBDF3HrP7PaYJjDCAFJMDD8" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/interest-bearing/anchor/migrations/deploy.ts b/tokens/token-2022/interest-bearing/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/interest-bearing/anchor/migrations/deploy.ts +++ b/tokens/token-2022/interest-bearing/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/interest-bearing/anchor/package.json b/tokens/token-2022/interest-bearing/anchor/package.json index f800607c4..cc320fb64 100644 --- a/tokens/token-2022/interest-bearing/anchor/package.json +++ b/tokens/token-2022/interest-bearing/anchor/package.json @@ -1,21 +1,21 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.6" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.6" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/interest-bearing/anchor/pnpm-lock.yaml b/tokens/token-2022/interest-bearing/anchor/pnpm-lock.yaml index 841b2d24e..349da1833 100644 --- a/tokens/token-2022/interest-bearing/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/interest-bearing/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.6 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -860,16 +860,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -887,7 +887,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/Cargo.toml b/tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/Cargo.toml index 45359f68b..4de1d7d84 100644 --- a/tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/Cargo.toml +++ b/tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/Cargo.toml @@ -21,8 +21,15 @@ custom-panic = [] [dependencies] -anchor-lang = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/src/lib.rs b/tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/src/lib.rs index bef10631e..104c325c2 100644 --- a/tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/src/lib.rs +++ b/tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/src/lib.rs @@ -19,7 +19,7 @@ use anchor_spl::{ InterestBearingMintUpdateRate, Mint, Token2022, }, }; -declare_id!("DMQdkzRJz8uQSN8Kx2QYmQJn6xLKhsu3LcPYxs314MgC"); +declare_id!("2tinFpSK55kJu1wjcwW1PZBDF3HrP7PaYJjDCAFJMDD8"); #[program] pub mod interest_bearing { diff --git a/tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/tests/test_interest_bearing.rs b/tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/tests/test_interest_bearing.rs new file mode 100644 index 000000000..c354d3ba7 --- /dev/null +++ b/tokens/token-2022/interest-bearing/anchor/programs/interest-bearing/tests/test_interest_bearing.rs @@ -0,0 +1,72 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = interest_bearing::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/interest_bearing.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_initialize_and_update_rate() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Initialize mint with InterestBearingConfig extension (rate=0) + let initialize_ix = Instruction::new_with_bytes( + program_id, + &interest_bearing::instruction::Initialize { rate: 0 }.data(), + interest_bearing::accounts::Initialize { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + + // Verify mint account exists + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint should have data"); + + svm.expire_blockhash(); + + // Step 2: Update the interest rate to 100 + let update_rate_ix = Instruction::new_with_bytes( + program_id, + &interest_bearing::instruction::UpdateRate { rate: 100 }.data(), + interest_bearing::accounts::UpdateRate { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_rate_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify mint still exists after rate update + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should still exist"); + assert!(!mint_account.data.is_empty(), "Mint should still have data"); +} diff --git a/tokens/token-2022/interest-bearing/anchor/tests/interest-bearing.ts b/tokens/token-2022/interest-bearing/anchor/tests/interest-bearing.ts index 45a2938a7..bc1f83a19 100644 --- a/tokens/token-2022/interest-bearing/anchor/tests/interest-bearing.ts +++ b/tokens/token-2022/interest-bearing/anchor/tests/interest-bearing.ts @@ -1,9 +1,9 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { amountToUiAmount, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; -import type { InterestBearing } from '../target/types/interest_bearing'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { amountToUiAmount, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import type { InterestBearing } from "../target/types/interest_bearing"; -describe('interest-bearing', () => { +describe("interest-bearing", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); const connection = provider.connection; @@ -14,7 +14,7 @@ describe('interest-bearing', () => { const mintKeypair = new anchor.web3.Keypair(); - it('Create Mint with InterestBearingConfig extension', async () => { + it("Create Mint with InterestBearingConfig extension", async () => { const rate = 0; const transactionSignature = await program.methods @@ -22,17 +22,20 @@ describe('interest-bearing', () => { .accounts({ mintAccount: mintKeypair.publicKey }) .signers([mintKeypair]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Update Mint with Interest Rate', async () => { + it("Update Mint with Interest Rate", async () => { const rate = 100; - const transactionSignature = await program.methods.updateRate(rate).accounts({ mintAccount: mintKeypair.publicKey }).rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + const transactionSignature = await program.methods + .updateRate(rate) + .accounts({ mintAccount: mintKeypair.publicKey }) + .rpc({ skipPreflight: true }); + console.log("Your transaction signature", transactionSignature); }); - it('Calculate accrued interest', async () => { + it("Calculate accrued interest", async () => { await sleep(1); const amount = 1000; @@ -46,7 +49,7 @@ describe('interest-bearing', () => { TOKEN_2022_PROGRAM_ID, // Token Extension Program ID ); - console.log('\nAmount with Accrued Interest:', uiAmount); + console.log("\nAmount with Accrued Interest:", uiAmount); }); }); diff --git a/tokens/token-2022/memo-transfer/anchor/Anchor.toml b/tokens/token-2022/memo-transfer/anchor/Anchor.toml index 5ac2fc3c0..8a6ff1188 100644 --- a/tokens/token-2022/memo-transfer/anchor/Anchor.toml +++ b/tokens/token-2022/memo-transfer/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -memo_transfer = "5BQyC7y2Pc283woThq11uZRqsgcRbBRLKz4yQ8BJadi2" - -# [registry] section removed — no longer used in Anchor 1.0 +memo_transfer = "C3zvHFYvrYgydPXv6vPZkcZvx24YE6pTUTZmtQJnAZQs" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/memo-transfer/anchor/migrations/deploy.ts b/tokens/token-2022/memo-transfer/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/memo-transfer/anchor/migrations/deploy.ts +++ b/tokens/token-2022/memo-transfer/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/memo-transfer/anchor/package.json b/tokens/token-2022/memo-transfer/anchor/package.json index a3f2b8fe6..2e989a504 100644 --- a/tokens/token-2022/memo-transfer/anchor/package.json +++ b/tokens/token-2022/memo-transfer/anchor/package.json @@ -1,22 +1,22 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-memo": "^0.2.5", - "@solana/spl-token": "^0.4.6" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-memo": "^0.2.5", + "@solana/spl-token": "^0.4.6" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/memo-transfer/anchor/pnpm-lock.yaml b/tokens/token-2022/memo-transfer/anchor/pnpm-lock.yaml index 93e2d0007..79f0e36b2 100644 --- a/tokens/token-2022/memo-transfer/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/memo-transfer/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-memo': specifier: ^0.2.5 version: 0.2.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) @@ -45,18 +45,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -869,16 +869,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -896,7 +896,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/Cargo.toml b/tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/Cargo.toml index e181b17b7..2fce0e80e 100644 --- a/tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/Cargo.toml +++ b/tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/Cargo.toml @@ -20,8 +20,15 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/src/lib.rs b/tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/src/lib.rs index afaaabc5e..122bc6da0 100644 --- a/tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/src/lib.rs +++ b/tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/src/lib.rs @@ -12,7 +12,7 @@ use anchor_spl::{ }, }; -declare_id!("5BQyC7y2Pc283woThq11uZRqsgcRbBRLKz4yQ8BJadi2"); +declare_id!("C3zvHFYvrYgydPXv6vPZkcZvx24YE6pTUTZmtQJnAZQs"); #[program] pub mod memo_transfer { diff --git a/tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs b/tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs new file mode 100644 index 000000000..85c85e8c9 --- /dev/null +++ b/tokens/token-2022/memo-transfer/anchor/programs/memo-transfer/tests/test_memo_transfer.rs @@ -0,0 +1,239 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + assert_token_account_balance, create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_mint, mint_tokens_to_token_extensions_account, + TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn memo_program_id() -> Pubkey { + "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr" + .parse() + .unwrap() +} + +/// Create a Token Extensions token account (165 bytes, no extra extensions). +/// Uses explicit keypair — not an ATA — because the test needs multiple +/// source accounts for the same owner+mint. +fn create_token_account_instructions( + payer: &Pubkey, + token_account: &Pubkey, + mint: &Pubkey, + owner: &Pubkey, +) -> Vec { + let rent_sysvar: Pubkey = "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap(); + let create_ix = anchor_lang::solana_program::system_instruction::create_account( + payer, + token_account, + 3_000_000, + 165, + &TOKEN_EXTENSIONS_PROGRAM_ID, + ); + let init_ix = Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*token_account, false), + AccountMeta::new_readonly(*mint, false), + AccountMeta::new_readonly(*owner, false), + AccountMeta::new_readonly(rent_sysvar, false), + ], + data: vec![1], // InitializeAccount + }; + vec![create_ix, init_ix] +} + +/// Transfer instruction for Token Extensions (instruction 3). +fn transfer_instruction( + source: &Pubkey, + dest: &Pubkey, + authority: &Pubkey, + amount: u64, +) -> Instruction { + let mut data = vec![3u8]; + data.extend_from_slice(&amount.to_le_bytes()); + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*source, false), + AccountMeta::new(*dest, false), + AccountMeta::new_readonly(*authority, true), + ], + data, + } +} + +/// Memo instruction: just the memo text as bytes. +fn memo_instruction(memo_text: &str, signers: &[&Pubkey]) -> Instruction { + let accounts: Vec = signers + .iter() + .map(|s| AccountMeta::new_readonly(**s, true)) + .collect(); + Instruction { + program_id: memo_program_id(), + accounts, + data: memo_text.as_bytes().to_vec(), + } +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = memo_transfer::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/memo_transfer.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + // Load SPL Memo program (needed for memo instructions) + let memo_program_bytes = include_bytes!("../../../tests/fixtures/spl_memo.so"); + svm.add_program(memo_program_id(), memo_program_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_memo_transfer() { + let (mut svm, program_id, payer) = setup(); + let token_keypair = Keypair::new(); + + // Step 1: Create a standard Token Extensions mint (no extensions on the mint) + let mint = create_token_extensions_mint(&mut svm, &payer, 2, None, &[]).unwrap(); + svm.expire_blockhash(); + + // Step 2: Create token account with RequiredMemo extension via program + let initialize_ix = Instruction::new_with_bytes( + program_id, + &memo_transfer::instruction::Initialize {}.data(), + memo_transfer::accounts::Initialize { + payer: payer.pubkey(), + token_account: token_keypair.pubkey(), + mint_account: mint, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &token_keypair], &payer.pubkey()).unwrap(); + + // Verify token account exists + let token_account = svm + .get_account(&token_keypair.pubkey()) + .expect("Token account should exist"); + assert!( + !token_account.data.is_empty(), + "Token account should have data" + ); + + svm.expire_blockhash(); + + // Step 3: Create a source token account and mint tokens to it + let source_keypair = Keypair::new(); + let create_source_ixs = create_token_account_instructions( + &payer.pubkey(), + &source_keypair.pubkey(), + &mint, + &payer.pubkey(), + ); + send_transaction_from_instructions(&mut svm, create_source_ixs, &[&payer, &source_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source_keypair.pubkey(), + 100, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 4: Transfer without memo — should fail + let transfer_ix = transfer_instruction( + &source_keypair.pubkey(), + &token_keypair.pubkey(), + &payer.pubkey(), + 1, + ); + let result = send_transaction_from_instructions(&mut svm, vec![transfer_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Transfer without memo should fail" + ); + svm.expire_blockhash(); + + // Step 5: Transfer with memo — should succeed + let memo_ix = memo_instruction("hello, world", &[&payer.pubkey()]); + let transfer_ix = transfer_instruction( + &source_keypair.pubkey(), + &token_keypair.pubkey(), + &payer.pubkey(), + 1, + ); + send_transaction_from_instructions(&mut svm, vec![memo_ix, transfer_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + assert_token_account_balance(&svm, &token_keypair.pubkey(), 1, "Should have 1 token after transfer with memo"); + + // Step 6: Disable RequiredMemo extension + let disable_ix = Instruction::new_with_bytes( + program_id, + &memo_transfer::instruction::Disable {}.data(), + memo_transfer::accounts::Disable { + owner: payer.pubkey(), + token_account: token_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![disable_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 7: Transfer without memo should now succeed (memo disabled) + let source2_keypair = Keypair::new(); + let create_source2_ixs = create_token_account_instructions( + &payer.pubkey(), + &source2_keypair.pubkey(), + &mint, + &payer.pubkey(), + ); + send_transaction_from_instructions(&mut svm, create_source2_ixs, &[&payer, &source2_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source2_keypair.pubkey(), + 100, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let transfer_ix2 = transfer_instruction( + &source2_keypair.pubkey(), + &token_keypair.pubkey(), + &payer.pubkey(), + 1, + ); + send_transaction_from_instructions(&mut svm, vec![transfer_ix2], &[&payer], &payer.pubkey()).unwrap(); + + assert_token_account_balance( + &svm, + &token_keypair.pubkey(), + 2, + "Should have 2 tokens after transfer without memo (memo disabled)", + ); +} diff --git a/tokens/token-2022/memo-transfer/anchor/tests/fixtures/spl_memo.so b/tokens/token-2022/memo-transfer/anchor/tests/fixtures/spl_memo.so new file mode 100644 index 0000000000000000000000000000000000000000..88385a01dec7b2f375cc33959fc8ee06e6eef409 GIT binary patch literal 74800 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 g^LN5a(; { +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { createMemoInstruction } from "@solana/spl-memo"; +import { createAccount, createMint, createTransferInstruction, mintTo, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import { sendAndConfirmTransaction, Transaction } from "@solana/web3.js"; +import type { MemoTransfer } from "../target/types/memo_transfer"; + +describe("memo-transfer", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); const connection = provider.connection; @@ -17,7 +17,7 @@ describe('memo-transfer', () => { const mintKeypair = new anchor.web3.Keypair(); const tokenKeypair = new anchor.web3.Keypair(); - it('Create Token Account with RequiredMemo extension', async () => { + it("Create Token Account with RequiredMemo extension", async () => { await createMint( connection, wallet.payer, // Payer of the transaction and initialization fees @@ -37,10 +37,10 @@ describe('memo-transfer', () => { }) .signers([tokenKeypair]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Attempt transfer without memo, expect fail', async () => { + it("Attempt transfer without memo, expect fail", async () => { // Create a new token account to transfer to const sourceTokenAccount = await createAccount( connection, @@ -52,7 +52,17 @@ describe('memo-transfer', () => { TOKEN_2022_PROGRAM_ID, // Token Extension Program ID ); - await mintTo(connection, wallet.payer, mintKeypair.publicKey, sourceTokenAccount, wallet.payer, 1, [], null, TOKEN_2022_PROGRAM_ID); + await mintTo( + connection, + wallet.payer, + mintKeypair.publicKey, + sourceTokenAccount, + wallet.payer, + 1, + [], + null, + TOKEN_2022_PROGRAM_ID, + ); const transferInstruction = createTransferInstruction( sourceTokenAccount, // Source Token Account @@ -73,11 +83,11 @@ describe('memo-transfer', () => { [wallet.payer], // Signers ); } catch (error) { - console.log('\nExpect Error:', error.logs); + console.log("\nExpect Error:", error.logs); } }); - it('Attempt transfer with memo, expect success', async () => { + it("Attempt transfer with memo, expect success", async () => { // Create a new token account to transfer to const sourceTokenAccount = await createAccount( connection, @@ -89,9 +99,19 @@ describe('memo-transfer', () => { TOKEN_2022_PROGRAM_ID, // Token Extension Program ID ); - await mintTo(connection, wallet.payer, mintKeypair.publicKey, sourceTokenAccount, wallet.payer, 1, [], null, TOKEN_2022_PROGRAM_ID); + await mintTo( + connection, + wallet.payer, + mintKeypair.publicKey, + sourceTokenAccount, + wallet.payer, + 1, + [], + null, + TOKEN_2022_PROGRAM_ID, + ); - const memoInstruction = createMemoInstruction('hello, world', [wallet.publicKey]); + const memoInstruction = createMemoInstruction("hello, world", [wallet.publicKey]); const transferInstruction = createTransferInstruction( sourceTokenAccount, // Source Token Account @@ -110,20 +130,20 @@ describe('memo-transfer', () => { [wallet.payer], // Signers ); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Disable RequiredMemo extension', async () => { + it("Disable RequiredMemo extension", async () => { const transactionSignature = await program.methods .disable() .accounts({ tokenAccount: tokenKeypair.publicKey, }) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Attempt transfer without memo, expect success', async () => { + it("Attempt transfer without memo, expect success", async () => { // Create a new token account to transfer to const sourceTokenAccount = await createAccount( connection, @@ -135,7 +155,17 @@ describe('memo-transfer', () => { TOKEN_2022_PROGRAM_ID, // Token Extension Program ID ); - await mintTo(connection, wallet.payer, mintKeypair.publicKey, sourceTokenAccount, wallet.payer, 1, [], null, TOKEN_2022_PROGRAM_ID); + await mintTo( + connection, + wallet.payer, + mintKeypair.publicKey, + sourceTokenAccount, + wallet.payer, + 1, + [], + null, + TOKEN_2022_PROGRAM_ID, + ); const transferInstruction = createTransferInstruction( sourceTokenAccount, // Source Token Account @@ -154,6 +184,6 @@ describe('memo-transfer', () => { [wallet.payer], // Signers ); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); }); diff --git a/tokens/token-2022/metadata/anchor/Anchor.toml b/tokens/token-2022/metadata/anchor/Anchor.toml index 539f4bdb8..55e77777e 100644 --- a/tokens/token-2022/metadata/anchor/Anchor.toml +++ b/tokens/token-2022/metadata/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -metadata = "BJHEDXSQfD9kBFvhw8ZCGmPFRihzvbMoxoHUKpXdpn4D" - -# [registry] section removed — no longer used in Anchor 1.0 +metadata = "DY2T6zhjngLvpkCMReQFzMHc6g4d4bqQWznntroEVDhG" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/metadata/anchor/migrations/deploy.ts b/tokens/token-2022/metadata/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/metadata/anchor/migrations/deploy.ts +++ b/tokens/token-2022/metadata/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/metadata/anchor/package.json b/tokens/token-2022/metadata/anchor/package.json index 95288be45..f209d0891 100644 --- a/tokens/token-2022/metadata/anchor/package.json +++ b/tokens/token-2022/metadata/anchor/package.json @@ -1,21 +1,21 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token-metadata": "^0.1.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token-metadata": "^0.1.4" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/metadata/anchor/pnpm-lock.yaml b/tokens/token-2022/metadata/anchor/pnpm-lock.yaml index 733244d50..ac2c534ed 100644 --- a/tokens/token-2022/metadata/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/metadata/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token-metadata': specifier: ^0.1.4 version: 0.1.4(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -753,16 +753,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -780,7 +780,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/tokens/token-2022/metadata/anchor/programs/metadata/Cargo.toml b/tokens/token-2022/metadata/anchor/programs/metadata/Cargo.toml index 52389758d..306c196bc 100644 --- a/tokens/token-2022/metadata/anchor/programs/metadata/Cargo.toml +++ b/tokens/token-2022/metadata/anchor/programs/metadata/Cargo.toml @@ -20,10 +20,18 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -spl-token-metadata-interface = "0.3.3" -spl-type-length-value = "0.4.3" +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" +# Updated from 0.3.3/0.4.3 — old versions pulled in broken solana-zk-token-sdk transitive deps +spl-token-metadata-interface = "0.8.0" +spl-type-length-value = "0.9.1" + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs index f657138d1..a482bd4f9 100644 --- a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs +++ b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/initialize.rs @@ -1,7 +1,8 @@ use anchor_lang::prelude::*; -use anchor_lang::solana_program::rent::{ - DEFAULT_EXEMPTION_THRESHOLD, DEFAULT_LAMPORTS_PER_BYTE_YEAR, -}; +// DEFAULT_EXEMPTION_THRESHOLD=2.0 years, DEFAULT_LAMPORTS_PER_BYTE_YEAR=3480 +// These constants were removed from public API in newer Solana versions +const DEFAULT_LAMPORTS_PER_BYTE_YEAR: u64 = 3480; +const DEFAULT_EXEMPTION_THRESHOLD: f64 = 2.0; use anchor_lang::system_program::{transfer, Transfer}; use anchor_spl::token_interface::{ token_metadata_initialize, Mint, Token2022, TokenMetadataInitialize, @@ -62,7 +63,7 @@ pub fn process_initialize(ctx: Context, args: TokenMetadataArgs) -> CpiContext::new( ctx.accounts.token_program.key(), TokenMetadataInitialize { - token_program_id: ctx.accounts.token_program.to_account_info(), + program_id: ctx.accounts.token_program.to_account_info(), mint: ctx.accounts.mint_account.to_account_info(), metadata: ctx.accounts.mint_account.to_account_info(), mint_authority: ctx.accounts.payer.to_account_info(), diff --git a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_authority.rs b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_authority.rs index 994712325..f68b619a7 100644 --- a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_authority.rs +++ b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_authority.rs @@ -29,7 +29,7 @@ pub fn process_update_authority(ctx: Context) -> Result<()> { CpiContext::new( ctx.accounts.token_program.key(), TokenMetadataUpdateAuthority { - token_program_id: ctx.accounts.token_program.to_account_info(), + program_id: ctx.accounts.token_program.to_account_info(), metadata: ctx.accounts.mint_account.to_account_info(), current_authority: ctx.accounts.current_authority.to_account_info(), diff --git a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_field.rs b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_field.rs index 2e94c7b1c..adb20b8f2 100644 --- a/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_field.rs +++ b/tokens/token-2022/metadata/anchor/programs/metadata/src/instructions/update_field.rs @@ -80,7 +80,7 @@ pub fn process_update_field(ctx: Context, args: UpdateFieldArgs) -> CpiContext::new( ctx.accounts.token_program.key(), TokenMetadataUpdateField { - token_program_id: ctx.accounts.token_program.to_account_info(), + program_id: ctx.accounts.token_program.to_account_info(), metadata: ctx.accounts.mint_account.to_account_info(), update_authority: ctx.accounts.authority.to_account_info(), }, diff --git a/tokens/token-2022/metadata/anchor/programs/metadata/src/lib.rs b/tokens/token-2022/metadata/anchor/programs/metadata/src/lib.rs index c543cd324..590302b61 100644 --- a/tokens/token-2022/metadata/anchor/programs/metadata/src/lib.rs +++ b/tokens/token-2022/metadata/anchor/programs/metadata/src/lib.rs @@ -1,9 +1,9 @@ use anchor_lang::prelude::*; use instructions::*; -mod instructions; +pub mod instructions; -declare_id!("BJHEDXSQfD9kBFvhw8ZCGmPFRihzvbMoxoHUKpXdpn4D"); +declare_id!("DY2T6zhjngLvpkCMReQFzMHc6g4d4bqQWznntroEVDhG"); #[program] pub mod metadata { diff --git a/tokens/token-2022/metadata/anchor/programs/metadata/tests/test_metadata.rs b/tokens/token-2022/metadata/anchor/programs/metadata/tests/test_metadata.rs new file mode 100644 index 000000000..5ed4c5ce9 --- /dev/null +++ b/tokens/token-2022/metadata/anchor/programs/metadata/tests/test_metadata.rs @@ -0,0 +1,156 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = metadata::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/metadata.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_metadata_full_flow() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Initialize mint with MetadataPointer and TokenMetadata extensions + let initialize_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::Initialize { + args: metadata::instructions::TokenMetadataArgs { + name: "OPOS".to_string(), + symbol: "OPOS".to_string(), + uri: "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json".to_string(), + }, + } + .data(), + metadata::accounts::Initialize { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + + // Verify mint exists + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint should have data"); + + svm.expire_blockhash(); + + // Step 2: Update existing metadata field (name) + let update_name_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::UpdateField { + args: metadata::instructions::UpdateFieldArgs { + field: metadata::instructions::AnchorField::Name, + value: "Solana".to_string(), + }, + } + .data(), + metadata::accounts::UpdateField { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_name_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 3: Add custom field + let add_custom_field_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::UpdateField { + args: metadata::instructions::UpdateFieldArgs { + field: metadata::instructions::AnchorField::Key("color".to_string()), + value: "red".to_string(), + }, + } + .data(), + metadata::accounts::UpdateField { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![add_custom_field_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Remove custom field + let remove_key_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::RemoveKey { + key: "color".to_string(), + } + .data(), + metadata::accounts::RemoveKey { + update_authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![remove_key_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 5: Update authority to None + let update_authority_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::UpdateAuthority {}.data(), + metadata::accounts::UpdateAuthority { + current_authority: payer.pubkey(), + new_authority: None, + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_authority_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 6: Emit metadata (verify it doesn't fail) + let emit_ix = Instruction::new_with_bytes( + program_id, + &metadata::instruction::Emit {}.data(), + metadata::accounts::Emit { + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![emit_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify mint still exists after all operations + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should still exist after all metadata operations"); + assert!( + !mint_account.data.is_empty(), + "Mint should still have data" + ); +} diff --git a/tokens/token-2022/metadata/anchor/tests/metadata.ts b/tokens/token-2022/metadata/anchor/tests/metadata.ts index c788bd0f9..b88a03944 100644 --- a/tokens/token-2022/metadata/anchor/tests/metadata.ts +++ b/tokens/token-2022/metadata/anchor/tests/metadata.ts @@ -1,9 +1,9 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { unpack } from '@solana/spl-token-metadata'; -import type { Metadata } from '../target/types/metadata'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { unpack } from "@solana/spl-token-metadata"; +import type { Metadata } from "../target/types/metadata"; -describe('metadata', () => { +describe("metadata", () => { const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); @@ -12,52 +12,52 @@ describe('metadata', () => { const mintKeypair = new anchor.web3.Keypair(); const metadata = { - name: 'OPOS', - symbol: 'OPOS', - uri: 'https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json', + name: "OPOS", + symbol: "OPOS", + uri: "https://raw.githubusercontent.com/solana-developers/opos-asset/main/assets/DeveloperPortal/metadata.json", }; - it('Create Mint with MetadataPointer and TokenMetadata Extensions', async () => { + it("Create Mint with MetadataPointer and TokenMetadata Extensions", async () => { const tx = await program.methods .initialize(metadata) .accounts({ mintAccount: mintKeypair.publicKey }) .signers([mintKeypair]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', tx); + console.log("Your transaction signature", tx); }); - it('Update existing metadata field', async () => { + it("Update existing metadata field", async () => { // Add your test here. const tx = await program.methods .updateField({ field: { name: {} }, // Update the name field - value: 'Solana', + value: "Solana", }) .accounts({ mintAccount: mintKeypair.publicKey }) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', tx); + console.log("Your transaction signature", tx); }); - it('Update metadata with custom field', async () => { + it("Update metadata with custom field", async () => { const tx = await program.methods .updateField({ - field: { key: { 0: 'color' } }, // Add a custom field named "color" - value: 'red', + field: { key: { 0: "color" } }, // Add a custom field named "color" + value: "red", }) .accounts({ mintAccount: mintKeypair.publicKey }) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', tx); + console.log("Your transaction signature", tx); }); - it('Remove custom field', async () => { + it("Remove custom field", async () => { const tx = await program.methods - .removeKey('color') // Remove the custom field named "color" + .removeKey("color") // Remove the custom field named "color" .accounts({ mintAccount: mintKeypair.publicKey }) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', tx); + console.log("Your transaction signature", tx); }); - it('Change update authority', async () => { + it("Change update authority", async () => { const tx = await program.methods .updateAuthority() .accounts({ @@ -65,45 +65,45 @@ describe('metadata', () => { newAuthority: null, // Set the update authority to null }) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', tx); + console.log("Your transaction signature", tx); }); - it('Emit metadata, decode transaction logs', async () => { + it("Emit metadata, decode transaction logs", async () => { const txSignature = await program.methods .emit() .accounts({ mintAccount: mintKeypair.publicKey }) - .rpc({ commitment: 'confirmed', skipPreflight: true }); - console.log('Your transaction signature', txSignature); + .rpc({ commitment: "confirmed", skipPreflight: true }); + console.log("Your transaction signature", txSignature); // Fetch the transaction response const transactionResponse = await provider.connection.getTransaction(txSignature, { - commitment: 'confirmed', + commitment: "confirmed", }); // Extract the log message that starts with "Program return:" - const prefix = 'Program return: '; + const prefix = "Program return: "; let log = transactionResponse.meta.logMessages.find((log) => log.startsWith(prefix)); log = log.slice(prefix.length); - const [_, data] = log.split(' ', 2); + const [_, data] = log.split(" ", 2); // Decode the data from base64 and unpack it into TokenMetadata - const buffer = Buffer.from(data, 'base64'); + const buffer = Buffer.from(data, "base64"); const metadata = unpack(buffer); - console.log('Metadata', metadata); + console.log("Metadata", metadata); }); - it('Emit metadata, decode simulated transaction', async () => { + it("Emit metadata, decode simulated transaction", async () => { const simulateResponse = await program.methods.emit().accounts({ mintAccount: mintKeypair.publicKey }).simulate(); // Extract the log message that starts with "Program return:" - const prefix = 'Program return: '; + const prefix = "Program return: "; let log = simulateResponse.raw.find((log) => log.startsWith(prefix)); log = log.slice(prefix.length); - const [_, data] = log.split(' ', 2); + const [_, data] = log.split(" ", 2); // Decode the data from base64 and unpack it into TokenMetadata - const buffer = Buffer.from(data, 'base64'); + const buffer = Buffer.from(data, "base64"); const metadata = unpack(buffer); - console.log('Metadata', metadata); + console.log("Metadata", metadata); }); }); diff --git a/tokens/token-2022/mint-close-authority/anchor/Anchor.toml b/tokens/token-2022/mint-close-authority/anchor/Anchor.toml index 0f826c9c0..2abc42bff 100644 --- a/tokens/token-2022/mint-close-authority/anchor/Anchor.toml +++ b/tokens/token-2022/mint-close-authority/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -mint_close_authority = "AcfQLsYKuzprcCNH1n96pKKgAbAnZchwpbr3gbVN742n" - -# [registry] section removed — no longer used in Anchor 1.0 +mint_close_authority = "2wT6WQQqD4P35mDQJAWbWAMzFfCeLsYEELTde6jLQyKN" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/mint-close-authority/anchor/migrations/deploy.ts b/tokens/token-2022/mint-close-authority/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/mint-close-authority/anchor/migrations/deploy.ts +++ b/tokens/token-2022/mint-close-authority/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/mint-close-authority/anchor/package.json b/tokens/token-2022/mint-close-authority/anchor/package.json index f800607c4..cc320fb64 100644 --- a/tokens/token-2022/mint-close-authority/anchor/package.json +++ b/tokens/token-2022/mint-close-authority/anchor/package.json @@ -1,21 +1,21 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.6" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.6" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/mint-close-authority/anchor/pnpm-lock.yaml b/tokens/token-2022/mint-close-authority/anchor/pnpm-lock.yaml index 841b2d24e..349da1833 100644 --- a/tokens/token-2022/mint-close-authority/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/mint-close-authority/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.6 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -860,16 +860,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -887,7 +887,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/Cargo.toml b/tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/Cargo.toml index 685accde4..e97b9f2be 100644 --- a/tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/Cargo.toml +++ b/tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/Cargo.toml @@ -17,5 +17,12 @@ no-log-ix-name = [] idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] [dependencies] -anchor-lang = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" diff --git a/tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/src/lib.rs b/tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/src/lib.rs index 3be5a5390..8cda7fade 100644 --- a/tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/src/lib.rs +++ b/tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/src/lib.rs @@ -13,7 +13,7 @@ use anchor_spl::{ Mint, Token2022, }, }; -declare_id!("AcfQLsYKuzprcCNH1n96pKKgAbAnZchwpbr3gbVN742n"); +declare_id!("2wT6WQQqD4P35mDQJAWbWAMzFfCeLsYEELTde6jLQyKN"); #[program] pub mod mint_close_authority { diff --git a/tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/tests/test_mint_close_authority.rs b/tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/tests/test_mint_close_authority.rs new file mode 100644 index 000000000..2530914f9 --- /dev/null +++ b/tokens/token-2022/mint-close-authority/anchor/programs/mint-close-authority/tests/test_mint_close_authority.rs @@ -0,0 +1,127 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = mint_close_authority::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/mint_close_authority.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_and_close_mint() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Create Mint with Close Authority + let initialize_ix = Instruction::new_with_bytes( + program_id, + &mint_close_authority::instruction::Initialize {}.data(), + mint_close_authority::accounts::Initialize { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + + // Verify mint exists + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!(!mint_account.data.is_empty(), "Mint should have data"); + + svm.expire_blockhash(); + + // Step 2: Close Mint using Anchor CPI + let close_ix = Instruction::new_with_bytes( + program_id, + &mint_close_authority::instruction::Close {}.data(), + mint_close_authority::accounts::Close { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![close_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify mint no longer exists (lamports returned to authority) + let mint_account = svm.get_account(&mint_keypair.pubkey()); + assert!( + mint_account.is_none(), + "Mint account should be closed" + ); + + svm.expire_blockhash(); + + // Step 3: Create Mint with Close Authority again (re-use same keypair) + let initialize_ix2 = Instruction::new_with_bytes( + program_id, + &mint_close_authority::instruction::Initialize {}.data(), + mint_close_authority::accounts::Initialize { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix2], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + + // Verify mint exists again + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist after re-creation"); + assert!( + !mint_account.data.is_empty(), + "Mint should have data after re-creation" + ); + + svm.expire_blockhash(); + + // Step 4: Close Mint directly using Token Extensions CloseAccount instruction + let close_direct_ix = Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + anchor_lang::solana_program::instruction::AccountMeta::new( + mint_keypair.pubkey(), + false, + ), + anchor_lang::solana_program::instruction::AccountMeta::new( + payer.pubkey(), + false, + ), + anchor_lang::solana_program::instruction::AccountMeta::new_readonly( + payer.pubkey(), + true, + ), + ], + data: vec![9], // CloseAccount + }; + send_transaction_from_instructions(&mut svm, vec![close_direct_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify mint is closed again + let mint_account = svm.get_account(&mint_keypair.pubkey()); + assert!( + mint_account.is_none(), + "Mint account should be closed via direct Token Extensions instruction" + ); +} diff --git a/tokens/token-2022/mint-close-authority/anchor/tests/mint-close-authority.ts b/tokens/token-2022/mint-close-authority/anchor/tests/mint-close-authority.ts index 73b08722a..05d1bc7a5 100644 --- a/tokens/token-2022/mint-close-authority/anchor/tests/mint-close-authority.ts +++ b/tokens/token-2022/mint-close-authority/anchor/tests/mint-close-authority.ts @@ -1,9 +1,9 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { closeAccount, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; -import type { MintCloseAuthority } from '../target/types/mint_close_authority'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { closeAccount, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import type { MintCloseAuthority } from "../target/types/mint_close_authority"; -describe('mint-close-authority', () => { +describe("mint-close-authority", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); const connection = provider.connection; @@ -14,30 +14,33 @@ describe('mint-close-authority', () => { const mintKeypair = new anchor.web3.Keypair(); - it('Create Mint with Close Authority', async () => { + it("Create Mint with Close Authority", async () => { const transactionSignature = await program.methods .initialize() .accounts({ mintAccount: mintKeypair.publicKey }) .signers([mintKeypair]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Close Mint with Anchor CPI', async () => { - const transactionSignature = await program.methods.close().accounts({ mintAccount: mintKeypair.publicKey }).rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + it("Close Mint with Anchor CPI", async () => { + const transactionSignature = await program.methods + .close() + .accounts({ mintAccount: mintKeypair.publicKey }) + .rpc({ skipPreflight: true }); + console.log("Your transaction signature", transactionSignature); }); - it('Create Mint with Close Authority again', async () => { + it("Create Mint with Close Authority again", async () => { const transactionSignature = await program.methods .initialize() .accounts({ mintAccount: mintKeypair.publicKey }) .signers([mintKeypair]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Close Mint using @solana/spl-token', async () => { + it("Close Mint using @solana/spl-token", async () => { const transactionSignature = await closeAccount( connection, wallet.payer, // Transaction fee payer @@ -48,6 +51,6 @@ describe('mint-close-authority', () => { undefined, // Confirmation options TOKEN_2022_PROGRAM_ID, // Token Extension Program ID ); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); }); diff --git a/tokens/token-2022/mint-close-authority/native/tests/test.ts b/tokens/token-2022/mint-close-authority/native/tests/test.ts index 8d4ce50f2..822c359df 100644 --- a/tokens/token-2022/mint-close-authority/native/tests/test.ts +++ b/tokens/token-2022/mint-close-authority/native/tests/test.ts @@ -1,24 +1,30 @@ -import { Buffer } from 'node:buffer'; -import { describe, test } from 'node:test'; -import { TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; -import { Keypair, PublicKey, SYSVAR_RENT_PUBKEY, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { assert } from 'chai'; -import { start } from 'solana-bankrun'; +import { Buffer } from "node:buffer"; +import { describe, test } from "node:test"; +import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import { + Keypair, + PublicKey, + SYSVAR_RENT_PUBKEY, + SystemProgram, + Transaction, + TransactionInstruction, +} from "@solana/web3.js"; +import * as borsh from "borsh"; +import { assert } from "chai"; +import { start } from "solana-bankrun"; - -const CreateTokenArgsSchema = { struct: { token_decimals: 'u8' } }; +const CreateTokenArgsSchema = { struct: { token_decimals: "u8" } }; function borshSerialize(schema: borsh.Schema, data: object): Buffer { return Buffer.from(borsh.serialize(schema, data)); } -describe('Create Token', async () => { +describe("Create Token", async () => { const PROGRAM_ID = PublicKey.unique(); const context = await start( [ { - name: 'token_2022_mint_close_authority_program', + name: "token_2022_mint_close_authority_program", programId: PROGRAM_ID, }, ], @@ -27,7 +33,7 @@ describe('Create Token', async () => { const client = context.banksClient; const payer = context.payer; - test('Create a Token-22 SPL-Token !', async () => { + test("Create a Token-22 SPL-Token !", async () => { const mintKeypair: Keypair = Keypair.generate(); const instructionData = borshSerialize(CreateTokenArgsSchema, { @@ -56,6 +62,6 @@ describe('Create Token', async () => { const transaction = await client.processTransaction(tx); assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - console.log('Token Mint Address: ', mintKeypair.publicKey.toBase58()); + console.log("Token Mint Address: ", mintKeypair.publicKey.toBase58()); }); }); diff --git a/tokens/token-2022/multiple-extensions/native/tests/test.ts b/tokens/token-2022/multiple-extensions/native/tests/test.ts index 94757d648..f5b165793 100644 --- a/tokens/token-2022/multiple-extensions/native/tests/test.ts +++ b/tokens/token-2022/multiple-extensions/native/tests/test.ts @@ -1,25 +1,31 @@ -import { Buffer } from 'node:buffer'; -import { describe, test } from 'node:test'; -import { TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; -import { Keypair, PublicKey, SYSVAR_RENT_PUBKEY, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { assert } from 'chai'; -import { start } from 'solana-bankrun'; - - -const CreateTokenArgsSchema = { struct: { token_decimals: 'u8' } }; +import { Buffer } from "node:buffer"; +import { describe, test } from "node:test"; +import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import { + Keypair, + PublicKey, + SYSVAR_RENT_PUBKEY, + SystemProgram, + Transaction, + TransactionInstruction, +} from "@solana/web3.js"; +import * as borsh from "borsh"; +import { assert } from "chai"; +import { start } from "solana-bankrun"; + +const CreateTokenArgsSchema = { struct: { token_decimals: "u8" } }; function borshSerialize(schema: borsh.Schema, data: object): Buffer { return Buffer.from(borsh.serialize(schema, data)); } -describe('Create Token', async () => { +describe("Create Token", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'token_2022_multiple_extensions_program', programId: PROGRAM_ID }], []); + const context = await start([{ name: "token_2022_multiple_extensions_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; - test('Create a Token-22 SPL-Token !', async () => { + test("Create a Token-22 SPL-Token !", async () => { const blockhash = context.lastBlockhash; const mintKeypair: Keypair = Keypair.generate(); @@ -48,6 +54,6 @@ describe('Create Token', async () => { const transaction = await client.processTransaction(tx); assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - console.log('Token Mint Address: ', mintKeypair.publicKey.toBase58()); + console.log("Token Mint Address: ", mintKeypair.publicKey.toBase58()); }); }); diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml index 4d5cc7caf..e456b3fb2 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/Anchor.toml @@ -2,12 +2,11 @@ solana_version = "3.1.8" [features] -seeds = false -[programs.localnet] -extension_nft = "9aZZ7TJ2fQZxY8hMtWXywp5y6BgqC4N2BPcr9FDT47sW" +resolution = true +skip-lint = false -[registry] -url = "https://anchor.projectserum.com" +[programs.localnet] +extension_nft = "EUMxHm5RdorS96YVEh1SwhacqhWyKTRoaRezUZuhBBzN" [provider] cluster = "localnet" @@ -15,3 +14,5 @@ wallet = "~/.config/solana/id.json" [scripts] test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" + +[hooks] diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/migrations/deploy.ts b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/migrations/deploy.ts index 0a1222c93..20e6e1c1b 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/migrations/deploy.ts +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@project-serum/anchor'); +const anchor = require("@project-serum/anchor"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/package.json b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/package.json index 691d96bb6..3763466c1 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/package.json +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/package.json @@ -1,24 +1,24 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@coral-xyz/spl-token": "0.30.0", - "@solana/spl-token": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "browserify-sign": ">=4.2.2", - "chai": "^4.3.4", - "crypto-js": ">=4.2.0", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@coral-xyz/spl-token": "0.30.0", + "@solana/spl-token": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "browserify-sign": ">=4.2.2", + "chai": "^4.3.4", + "crypto-js": ">=4.2.0", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^4.3.5" + } } diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/pnpm-lock.yaml b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/pnpm-lock.yaml index e9f9bc3a7..a3ab4efcf 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@5.0.10) '@coral-xyz/spl-token': specifier: 0.30.0 version: 0.30.0(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@5.0.10) @@ -51,18 +51,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.6': @@ -1004,16 +1004,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@4.9.5)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -1031,7 +1031,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.6': dependencies: diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/Cargo.toml b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/Cargo.toml index 2456842a5..3549014b5 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/Cargo.toml +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/Cargo.toml @@ -21,10 +21,10 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } -anchor-spl = { version = "1.0.0-rc.5" } -# session-keys pinned to 2.0.3 — check compatibility with Anchor 1.0/Solana 3.x +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = { version = "1.0.0" } +# session-keys pinned to 2.0.3 — NOT compatible with Anchor 1.0/Solana 3.x +# Program cannot build until session-keys releases an Anchor 1.0-compatible version session-keys = { version = "2.0.3", features = ["no-entrypoint"] } # Removed solana-program pin (=2.1.15) — Anchor 1.0 requires Solana 3.x deps spl-token-2022 = { version="6", features = [ "no-entrypoint" ] } diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs index cd5637f76..194befcc7 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/programs/extension_nft/src/lib.rs @@ -7,7 +7,7 @@ pub mod instructions; pub mod state; use instructions::*; -declare_id!("9aZZ7TJ2fQZxY8hMtWXywp5y6BgqC4N2BPcr9FDT47sW"); +declare_id!("EUMxHm5RdorS96YVEh1SwhacqhWyKTRoaRezUZuhBBzN"); #[program] pub mod extension_nft { diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/tests/lumberjack.ts b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/tests/lumberjack.ts index bbba9941f..ebb22db4e 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/tests/lumberjack.ts +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/anchor/tests/lumberjack.ts @@ -1,30 +1,30 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, getOrCreateAssociatedTokenAccount, TOKEN_2022_PROGRAM_ID, -} from '@solana/spl-token'; -import { Keypair } from '@solana/web3.js'; -import type { ExtensionNft } from '../target/types/extension_nft'; +} from "@solana/spl-token"; +import { Keypair } from "@solana/web3.js"; +import type { ExtensionNft } from "../target/types/extension_nft"; -describe('extension_nft', () => { +describe("extension_nft", () => { const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); const program = anchor.workspace.ExtensionNft as Program; const payer = provider.wallet as anchor.Wallet; - it('Mint nft!', async () => { + it("Mint nft!", async () => { const balance = await anchor.getProvider().connection.getBalance(payer.publicKey); if (balance < 1e8) { const res = await anchor.getProvider().connection.requestAirdrop(payer.publicKey, 1e9); - await anchor.getProvider().connection.confirmTransaction(res, 'confirmed'); + await anchor.getProvider().connection.confirmTransaction(res, "confirmed"); } const mint = new Keypair(); - console.log('Mint public key', mint.publicKey.toBase58()); + console.log("Mint public key", mint.publicKey.toBase58()); const destinationTokenAccount = getAssociatedTokenAddressSync( mint.publicKey, @@ -45,7 +45,7 @@ describe('extension_nft', () => { .signers([mint]) .rpc(); - console.log('Mint nft tx', tx); - await anchor.getProvider().connection.confirmTransaction(tx, 'confirmed'); + console.log("Mint nft tx", tx); + await anchor.getProvider().connection.confirmTransaction(tx, "confirmed"); }); }); diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/ChopTreeButton.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/ChopTreeButton.tsx index 4e3aefb1e..be58a2616 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/ChopTreeButton.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/ChopTreeButton.tsx @@ -1,40 +1,37 @@ -import Image from "next/image" -import { useCallback, useState } from "react" -import { Button, HStack, VStack } from "@chakra-ui/react" -import { useConnection, useWallet } from "@solana/wallet-adapter-react" -import { useSessionWallet } from "@magicblock-labs/gum-react-sdk" -import { useGameState } from "@/contexts/GameStateProvider" -import { GAME_DATA_SEED, gameDataPDA, program } from "@/utils/anchor" -import { PublicKey } from "@solana/web3.js" -import { useNftState } from "@/contexts/NftProvider" -import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token" +import { Button, HStack, VStack } from "@chakra-ui/react"; +import { useSessionWallet } from "@magicblock-labs/gum-react-sdk"; +import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import { useConnection, useWallet } from "@solana/wallet-adapter-react"; +import { PublicKey } from "@solana/web3.js"; +import Image from "next/image"; +import { useCallback, useState } from "react"; +import { useGameState } from "@/contexts/GameStateProvider"; +import { useNftState } from "@/contexts/NftProvider"; +import { GAME_DATA_SEED, gameDataPDA, program } from "@/utils/anchor"; const ChopTreeButton = () => { - const { publicKey, sendTransaction } = useWallet() - const { connection } = useConnection() - const sessionWallet = useSessionWallet() - const { gameState, playerDataPDA } = useGameState() - const [isLoadingSession, setIsLoadingSession] = useState(false) - const [isLoadingMainWallet, setIsLoadingMainWallet] = useState(false) - const [transactionCounter, setTransactionCounter] = useState(0) - const { nftState: nftState } = useNftState() + const { publicKey, sendTransaction } = useWallet(); + const { connection } = useConnection(); + const sessionWallet = useSessionWallet(); + const { gameState, playerDataPDA } = useGameState(); + const [isLoadingSession, setIsLoadingSession] = useState(false); + const [isLoadingMainWallet, setIsLoadingMainWallet] = useState(false); + const [transactionCounter, setTransactionCounter] = useState(0); + const { nftState } = useNftState(); const onChopClick = useCallback(async () => { - setIsLoadingSession(true) - if (!playerDataPDA || !sessionWallet) return + setIsLoadingSession(true); + if (!playerDataPDA || !sessionWallet?.publicKey) return; setTransactionCounter(transactionCounter + 1); - const nftAuthority = await PublicKey.findProgramAddress( - [Buffer.from("nft_authority")], - program.programId - ); + const nftAuthority = await PublicKey.findProgramAddress([Buffer.from("nft_authority")], program.programId); let nft = null; - - for (var i = 0; i < nftState.items.length; i++) { + + for (let i = 0; i < nftState.items.length; i++) { try { const nftData = nftState.items[i]; - if (nftData.authorities[0] == nftAuthority[0].toBase58()) { + if (nftData.authorities[0] === nftAuthority[0].toBase58()) { nft = nftData; } console.log("NFT data", nftData); @@ -56,35 +53,32 @@ const ChopTreeButton = () => { .accounts({ player: playerDataPDA, gameData: gameDataPDA, - signer: sessionWallet.publicKey!, + signer: sessionWallet.publicKey, sessionToken: sessionWallet.sessionToken, nftAuthority: nftAuthority[0], mint: nft.id, }) - .transaction() + .transaction(); - const txids = await sessionWallet.signAndSendTransaction!(transaction) + const txids = await sessionWallet.signAndSendTransaction?.(transaction); if (txids && txids.length > 0) { - console.log("Transaction sent:", txids) + console.log("Transaction sent:", txids); } else { - console.error("Failed to send transaction") + console.error("Failed to send transaction"); } - } catch (error: any) { - console.log("error", `Chopping failed! ${error?.message}`) + } catch (error) { + console.log("error", `Chopping failed! ${error instanceof Error ? error.message : String(error)}`); } finally { - setIsLoadingSession(false) + setIsLoadingSession(false); } - }, [sessionWallet, nftState]) + }, [sessionWallet, nftState, playerDataPDA, transactionCounter]); const onChopMainWalletClick = useCallback(async () => { - if (!publicKey || !playerDataPDA) return + if (!publicKey || !playerDataPDA) return; - setIsLoadingMainWallet(true) - const nftAuthority = await PublicKey.findProgramAddress( - [Buffer.from("nft_authority")], - program.programId - ); + setIsLoadingMainWallet(true); + const nftAuthority = await PublicKey.findProgramAddress([Buffer.from("nft_authority")], program.programId); if (nftState == null) { window.alert("Load NFT state first"); @@ -94,11 +88,11 @@ const ChopTreeButton = () => { console.log("NFT state", nftState); let nft = null; - for (var i = 0; i < nftState.items.length; i++) { + for (let i = 0; i < nftState.items.length; i++) { try { const nftData = nftState.items[i]; - console.log(nftData.authorities[0].address + " == " + nftAuthority[0].toBase58()); - + console.log(`${nftData.authorities[0].address} == ${nftAuthority[0].toBase58()}`); + if (nftData.authorities[0].address === nftAuthority[0].toBase58()) { nft = nftData; } @@ -115,7 +109,6 @@ const ChopTreeButton = () => { return; } try { - console.log("NFTid", nft.id, "NFT authority", nft.authorities[0].address); const transaction = await program.methods .chopTree(GAME_DATA_SEED, transactionCounter) @@ -126,20 +119,20 @@ const ChopTreeButton = () => { sessionToken: null, nftAuthority: nftAuthority[0].toBase58(), mint: nft.id, - tokenProgram: TOKEN_2022_PROGRAM_ID + tokenProgram: TOKEN_2022_PROGRAM_ID, }) - .transaction() + .transaction(); const txSig = await sendTransaction(transaction, connection, { skipPreflight: true, - }) - console.log(`https://explorer.solana.com/tx/${txSig}?cluster=devnet`) - } catch (error: any) { - console.log("error", `Chopping failed! ${error?.message}`) + }); + console.log(`https://explorer.solana.com/tx/${txSig}?cluster=devnet`); + } catch (error) { + console.log("error", `Chopping failed! ${error instanceof Error ? error.message : String(error)}`); } finally { - setIsLoadingMainWallet(false) + setIsLoadingMainWallet(false); } - }, [publicKey, playerDataPDA, connection, nftState]) + }, [publicKey, playerDataPDA, connection, nftState, transactionCounter, sendTransaction]); return ( <> @@ -148,26 +141,18 @@ const ChopTreeButton = () => { Energy Icon {sessionWallet && sessionWallet.sessionToken != null && ( - )} - )} - ) -} + ); +}; -export default ChopTreeButton +export default ChopTreeButton; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/DisplayGameState.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/DisplayGameState.tsx index f272d664e..86f60b377 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/DisplayGameState.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/DisplayGameState.tsx @@ -1,12 +1,12 @@ -import Image from "next/image" -import { HStack, VStack, Text } from "@chakra-ui/react" -import { useWallet } from "@solana/wallet-adapter-react" -import { useGameState } from "@/contexts/GameStateProvider" -import { TOTAL_WOOD_AVAILABLE } from "@/utils/anchor" +import { HStack, Text, VStack } from "@chakra-ui/react"; +import { useWallet } from "@solana/wallet-adapter-react"; +import Image from "next/image"; +import { useGameState } from "@/contexts/GameStateProvider"; +import { TOTAL_WOOD_AVAILABLE } from "@/utils/anchor"; const DisplayPlayerData = () => { - const { publicKey } = useWallet() - const { gameState, nextEnergyIn, totalWoodAvailable } = useGameState() + const { publicKey } = useWallet(); + const { gameState, nextEnergyIn, totalWoodAvailable } = useGameState(); return ( <> @@ -27,7 +27,7 @@ const DisplayPlayerData = () => { )} - ) -} + ); +}; -export default DisplayPlayerData +export default DisplayPlayerData; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/DisplayNfts.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/DisplayNfts.tsx index 01483c94e..986d338d5 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/DisplayNfts.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/DisplayNfts.tsx @@ -1,7 +1,7 @@ -import Image from "next/image" -import { useWallet } from "@solana/wallet-adapter-react" -import { useNftState } from "@/contexts/NftProvider" +import { useWallet } from "@solana/wallet-adapter-react"; +import Image from "next/image"; import { useState } from "react"; +import { useNftState } from "@/contexts/NftProvider"; export class Nft { name: string; @@ -14,26 +14,25 @@ export class Nft { } const DisplayNfts = () => { - const { publicKey } = useWallet() - const { nftState: nftState } = useNftState() + const { publicKey } = useWallet(); + const { nftState } = useNftState(); const [showItems, setShowItems] = useState(false); const handleButtonClick = () => { setShowItems(!showItems); }; - var myNfts = new Array(); + const myNfts: Nft[] = []; if (nftState != null) { - for (var i = 0; i < nftState.items.length; i++) { + for (let i = 0; i < nftState.items.length; i++) { try { - const nftData = nftState.items[i]; - let nft = new Nft(); - + const nft = new Nft(); + nft.name = nftData.content.metadata.name; nft.url = nftData.content.links.image; - + myNfts.push(nft); } catch (error) { console.log(error); @@ -42,14 +41,16 @@ const DisplayNfts = () => { } function onNftClickedCallback(nft: Nft): void { - window.alert("Nft clicked: " + nft.name); + window.alert(`Nft clicked: ${nft.name}`); } return ( <> {nftState && publicKey && (

))} @@ -77,6 +77,6 @@ const DisplayNfts = () => { )} ); -} +}; -export default DisplayNfts +export default DisplayNfts; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/InitPlayerButton.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/InitPlayerButton.tsx index 091308e54..47d2a1cc1 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/InitPlayerButton.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/InitPlayerButton.tsx @@ -1,21 +1,21 @@ -import { useCallback, useState } from "react" -import { Button } from "@chakra-ui/react" -import { SystemProgram } from "@solana/web3.js" -import { useConnection, useWallet } from "@solana/wallet-adapter-react" -import { useGameState } from "@/contexts/GameStateProvider" -import { GAME_DATA_SEED, gameDataPDA, program } from "@/utils/anchor" +import { Button } from "@chakra-ui/react"; +import { useConnection, useWallet } from "@solana/wallet-adapter-react"; +import { SystemProgram } from "@solana/web3.js"; +import { useCallback, useState } from "react"; +import { useGameState } from "@/contexts/GameStateProvider"; +import { GAME_DATA_SEED, gameDataPDA, program } from "@/utils/anchor"; const InitPlayerButton = () => { - const { publicKey, sendTransaction } = useWallet() - const { connection } = useConnection() - const [isLoading, setIsLoading] = useState(false) - const { gameState, playerDataPDA } = useGameState() + const { publicKey, sendTransaction } = useWallet(); + const { connection } = useConnection(); + const [isLoading, setIsLoading] = useState(false); + const { gameState, playerDataPDA } = useGameState(); // Init player button click handler const handleClick = useCallback(async () => { - if (!publicKey || !playerDataPDA) return + if (!publicKey || !playerDataPDA) return; - setIsLoading(true) + setIsLoading(true); try { const transaction = await program.methods @@ -26,19 +26,19 @@ const InitPlayerButton = () => { signer: publicKey, systemProgram: SystemProgram.programId, }) - .transaction() + .transaction(); const txSig = await sendTransaction(transaction, connection, { skipPreflight: true, - }) + }); - console.log(`https://explorer.solana.com/tx/${txSig}?cluster=devnet`) + console.log(`https://explorer.solana.com/tx/${txSig}?cluster=devnet`); } catch (error) { - console.log(error) + console.log(error); } finally { - setIsLoading(false) // set loading state back to false + setIsLoading(false); // set loading state back to false } - }, [publicKey, playerDataPDA, connection]) + }, [publicKey, playerDataPDA, connection, sendTransaction]); return ( <> @@ -48,7 +48,7 @@ const InitPlayerButton = () => { )} - ) -} + ); +}; -export default InitPlayerButton +export default InitPlayerButton; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/MintNftButton.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/MintNftButton.tsx index 2590c697b..48115b136 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/MintNftButton.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/MintNftButton.tsx @@ -1,30 +1,26 @@ -import Image from "next/image" -import { useCallback, useState } from "react" -import { Button, HStack, VStack } from "@chakra-ui/react" -import { useConnection, useWallet } from "@solana/wallet-adapter-react" -import { useGameState } from "@/contexts/GameStateProvider" -import { program } from "@/utils/anchor" -import { Keypair, PublicKey, SystemProgram } from "@solana/web3.js" -import { web3 } from "@coral-xyz/anchor" -import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, getAssociatedTokenAddressSync } from "@solana/spl-token"; +import { Button, HStack, VStack } from "@chakra-ui/react"; +import { web3 } from "@coral-xyz/anchor"; +import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import { useConnection, useWallet } from "@solana/wallet-adapter-react"; +import { Keypair, PublicKey, SystemProgram } from "@solana/web3.js"; +import Image from "next/image"; +import { useCallback, useState } from "react"; +import { useGameState } from "@/contexts/GameStateProvider"; +import { program } from "@/utils/anchor"; const MintNftButton = () => { - const { publicKey, sendTransaction, wallet } = useWallet() - const { connection } = useConnection() - const { gameState, playerDataPDA } = useGameState() - const [isLoadingMainWallet, showSpinner] = useState(false) + const { publicKey, sendTransaction } = useWallet(); + const { connection } = useConnection(); + const { gameState, playerDataPDA } = useGameState(); + const [isLoadingMainWallet, showSpinner] = useState(false); const onMintNftClick = useCallback(async () => { - if (!publicKey || !playerDataPDA) return + if (!publicKey || !playerDataPDA) return; - showSpinner(true) + showSpinner(true); try { - - const nftAuthority = await PublicKey.findProgramAddress( - [Buffer.from("nft_authority")], - program.programId - ); + const nftAuthority = await PublicKey.findProgramAddress([Buffer.from("nft_authority")], program.programId); const mint = new Keypair(); @@ -52,19 +48,18 @@ const MintNftButton = () => { console.log("transaction", transaction); - const txSig = await sendTransaction(transaction, connection,{ + const txSig = await sendTransaction(transaction, connection, { signers: [mint], - skipPreflight: true - } ); + skipPreflight: true, + }); - console.log(`https://explorer.solana.com/tx/${txSig}?cluster=devnet`) - - } catch (error: any) { - console.log("error", `Minting failed! ${error?.message} ${error?.stack}`) + console.log(`https://explorer.solana.com/tx/${txSig}?cluster=devnet`); + } catch (error) { + console.log("error", `Minting failed! ${error instanceof Error ? error.message : String(error)}`); } finally { - showSpinner(false) + showSpinner(false); } - }, [publicKey, playerDataPDA, connection]) + }, [publicKey, playerDataPDA, connection, sendTransaction]); return ( <> @@ -72,18 +67,14 @@ const MintNftButton = () => { Energy Icon - )} - ) -} + ); +}; -export default MintNftButton +export default MintNftButton; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/RequestAirdrop.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/RequestAirdrop.tsx index a6f8e77cc..da9b89e68 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/RequestAirdrop.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/RequestAirdrop.tsx @@ -1,37 +1,37 @@ -import { useCallback, useEffect, useState } from "react" -import { Button, Text } from "@chakra-ui/react" -import { LAMPORTS_PER_SOL } from "@solana/web3.js" -import { useConnection, useWallet } from "@solana/wallet-adapter-react" +import { Button, Text } from "@chakra-ui/react"; +import { useConnection, useWallet } from "@solana/wallet-adapter-react"; +import { LAMPORTS_PER_SOL } from "@solana/web3.js"; +import { useCallback, useEffect, useState } from "react"; const RequestAirdrop = () => { - const { publicKey } = useWallet() - const { connection } = useConnection() - const [balance, setBalance] = useState(0) - const [isLoading, setIsLoading] = useState(false) + const { publicKey } = useWallet(); + const { connection } = useConnection(); + const [balance, setBalance] = useState(0); + const [isLoading, setIsLoading] = useState(false); const getBalance = useCallback(async () => { - if (!publicKey) return - const balance = await connection.getBalance(publicKey, "confirmed") - setBalance(balance / LAMPORTS_PER_SOL) - }, [publicKey, connection]) + if (!publicKey) return; + const balance = await connection.getBalance(publicKey, "confirmed"); + setBalance(balance / LAMPORTS_PER_SOL); + }, [publicKey, connection]); const onClick = useCallback(async () => { - setIsLoading(true) - if (!publicKey) return + setIsLoading(true); + if (!publicKey) return; try { - const txSig = await connection.requestAirdrop(publicKey, LAMPORTS_PER_SOL) - await connection.confirmTransaction(txSig) - getBalance() - } catch (error: any) { - alert(error.message) + const txSig = await connection.requestAirdrop(publicKey, LAMPORTS_PER_SOL); + await connection.confirmTransaction(txSig); + getBalance(); + } catch (error) { + alert(error instanceof Error ? error.message : String(error)); } finally { - setIsLoading(false) + setIsLoading(false); } - }, [publicKey, connection, getBalance]) + }, [publicKey, connection, getBalance]); useEffect(() => { - getBalance() - }, [getBalance]) + getBalance(); + }, [getBalance]); return ( <> @@ -44,7 +44,7 @@ const RequestAirdrop = () => { Balance: {Number(balance).toFixed(3)} ))} - ) -} + ); +}; -export default RequestAirdrop +export default RequestAirdrop; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/SessionKeyButton.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/SessionKeyButton.tsx index 7567e9efb..e3036c776 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/SessionKeyButton.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/SessionKeyButton.tsx @@ -1,65 +1,55 @@ -import { useState } from "react" -import { Button } from "@chakra-ui/react" -import { useWallet } from "@solana/wallet-adapter-react" -import { useSessionWallet } from "@magicblock-labs/gum-react-sdk" -import { useGameState } from "@/contexts/GameStateProvider" -import { program } from "@/utils/anchor" +import { Button } from "@chakra-ui/react"; +import { useSessionWallet } from "@magicblock-labs/gum-react-sdk"; +import { useWallet } from "@solana/wallet-adapter-react"; +import { useState } from "react"; +import { useGameState } from "@/contexts/GameStateProvider"; +import { program } from "@/utils/anchor"; const SessionKeyButton = () => { - const { publicKey } = useWallet() - const { gameState } = useGameState() - const sessionWallet = useSessionWallet() - const [isLoading, setIsLoading] = useState(false) + const { publicKey } = useWallet(); + const { gameState } = useGameState(); + const sessionWallet = useSessionWallet(); + const [isLoading, setIsLoading] = useState(false); const handleCreateSession = async () => { - setIsLoading(true) - const topUp = true - const expiryInMinutes = 600 + setIsLoading(true); + const topUp = true; + const expiryInMinutes = 600; try { - const session = await sessionWallet.createSession( - program.programId, - topUp, - expiryInMinutes - ) - console.log("Session created:", session) + const session = await sessionWallet.createSession(program.programId, topUp, expiryInMinutes); + console.log("Session created:", session); } catch (error) { - console.error("Failed to create session:", error) + console.error("Failed to create session:", error); } finally { - setIsLoading(false) + setIsLoading(false); } - } + }; const handleRevokeSession = async () => { - setIsLoading(true) + setIsLoading(true); try { - await sessionWallet.revokeSession() - console.log("Session revoked") + await sessionWallet.revokeSession(); + console.log("Session revoked"); } catch (error) { - console.error("Failed to revoke session:", error) + console.error("Failed to revoke session:", error); } finally { - setIsLoading(false) + setIsLoading(false); } - } + }; return ( <> {publicKey && gameState && ( )} - ) -} + ); +}; -export default SessionKeyButton +export default SessionKeyButton; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/WalletMultiButton.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/WalletMultiButton.tsx index 8f2380015..d3cfefe14 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/WalletMultiButton.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/components/WalletMultiButton.tsx @@ -1,13 +1,12 @@ -import dynamic from "next/dynamic" +import dynamic from "next/dynamic"; export const WalletMultiButtonDynamic = dynamic( - async () => - (await import("@solana/wallet-adapter-react-ui")).WalletMultiButton, - { ssr: false } -) + async () => (await import("@solana/wallet-adapter-react-ui")).WalletMultiButton, + { ssr: false }, +); const WalletMultiButton = () => { - return -} + return ; +}; -export default WalletMultiButton +export default WalletMultiButton; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/GameStateProvider.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/GameStateProvider.tsx index 4e9127870..182a752af 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/GameStateProvider.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/GameStateProvider.tsx @@ -1,128 +1,116 @@ -import { createContext, useContext, useEffect, useState } from "react" -import { PublicKey } from "@solana/web3.js" -import { useConnection, useWallet } from "@solana/wallet-adapter-react" +import { BN } from "@coral-xyz/anchor"; +import { useConnection, useWallet } from "@solana/wallet-adapter-react"; +import { PublicKey } from "@solana/web3.js"; +import { createContext, useContext, useEffect, useState } from "react"; import { - program, - PlayerData, + GAME_DATA_SEED, + type GameData, MAX_ENERGY, + type PlayerData, + program, TIME_TO_REFILL_ENERGY, - GameData, - GAME_DATA_SEED, -} from "@/utils/anchor" -import { BN } from "@coral-xyz/anchor" +} from "@/utils/anchor"; const GameStateContext = createContext<{ - playerDataPDA: PublicKey | null - gameState: PlayerData | null - nextEnergyIn: number - totalWoodAvailable: number | null + playerDataPDA: PublicKey | null; + gameState: PlayerData | null; + nextEnergyIn: number; + totalWoodAvailable: number | null; }>({ playerDataPDA: null, gameState: null, nextEnergyIn: 0, - totalWoodAvailable: 0 -}) - -export const useGameState = () => useContext(GameStateContext) - -export const GameStateProvider = ({ - children, -}: { - children: React.ReactNode -}) => { - const { publicKey } = useWallet() - const { connection } = useConnection() - - const [playerDataPDA, setPlayerData] = useState(null) - const [playerState, setPlayerState] = useState(null) - const [timePassed, setTimePassed] = useState([]) - const [nextEnergyIn, setEnergyNextIn] = useState(0) - const [gameDataPDA, setGameDataPDA] = useState(null) - const [gameData, setGameData] = useState(null) - const [totalWoodAvailable, setTotalWoodAvailable] = useState(0) + totalWoodAvailable: 0, +}); + +export const useGameState = () => useContext(GameStateContext); + +export const GameStateProvider = ({ children }: { children: React.ReactNode }) => { + const { publicKey } = useWallet(); + const { connection } = useConnection(); + + const [playerDataPDA, setPlayerData] = useState(null); + const [playerState, setPlayerState] = useState(null); + const [_timePassed, setTimePassed] = useState(0); + const [nextEnergyIn, setEnergyNextIn] = useState(0); + const [gameDataPDA, setGameDataPDA] = useState(null); + const [_gameData, setGameData] = useState(null); + const [totalWoodAvailable, setTotalWoodAvailable] = useState(0); useEffect(() => { - setPlayerState(null) + setPlayerState(null); if (!publicKey) { - return + return; } const [pda] = PublicKey.findProgramAddressSync( [Buffer.from("player", "utf8"), publicKey.toBuffer()], - program.programId - ) - setPlayerData(pda) + program.programId, + ); + setPlayerData(pda); program.account.playerData .fetch(pda) .then((data) => { - setPlayerState(data) - }) - .catch((error) => { - window.alert("No player data found, please init!") + setPlayerState(data); }) + .catch((_error) => { + window.alert("No player data found, please init!"); + }); connection.onAccountChange(pda, (account) => { - setPlayerState(program.coder.accounts.decode("playerData", account.data)) - }) - }, [publicKey]) + setPlayerState(program.coder.accounts.decode("playerData", account.data)); + }); + }, [publicKey, connection.onAccountChange]); useEffect(() => { - setGameData(null) + setGameData(null); if (!publicKey) { - return + return; } - const [pda] = PublicKey.findProgramAddressSync( - [Buffer.from(GAME_DATA_SEED, "utf8")], - program.programId - ) - setGameDataPDA(gameDataPDA) + const [pda] = PublicKey.findProgramAddressSync([Buffer.from(GAME_DATA_SEED, "utf8")], program.programId); + setGameDataPDA(gameDataPDA); program.account.gameData .fetch(pda) .then((data) => { - setGameData(data) + setGameData(data); setTotalWoodAvailable(data.totalWoodCollected.toNumber()); }) - .catch((error) => { - window.alert("No game data found, please init!") - }) + .catch((_error) => { + window.alert("No game data found, please init!"); + }); connection.onAccountChange(pda, (account) => { - const newGameData = program.coder.accounts.decode("gameData", account.data) + const newGameData = program.coder.accounts.decode("gameData", account.data); setGameData(newGameData); setTotalWoodAvailable(newGameData.totalWoodCollected.toNumber()); - }) - }, [publicKey]) - + }); + }, [publicKey, connection.onAccountChange, gameDataPDA]); useEffect(() => { const interval = setInterval(async () => { - if ( - playerState == null || - playerState.lastLogin == undefined || - playerState.energy.toNumber() >= MAX_ENERGY - ) { + if (playerState == null || playerState.lastLogin === undefined || playerState.energy.toNumber() >= MAX_ENERGY) { return; } - + const lastLoginTime = playerState.lastLogin.toNumber() * 1000; const currentTime = Date.now(); let timePassed = (currentTime - lastLoginTime) / 1000; - + while (timePassed >= TIME_TO_REFILL_ENERGY.toNumber() && playerState.energy.toNumber() < MAX_ENERGY) { playerState.energy = playerState.energy.add(new BN(1)); playerState.lastLogin = playerState.lastLogin.add(TIME_TO_REFILL_ENERGY); timePassed -= TIME_TO_REFILL_ENERGY.toNumber(); } - + setTimePassed(timePassed); - + const nextEnergyIn = Math.floor(TIME_TO_REFILL_ENERGY.toNumber() - timePassed); setEnergyNextIn(nextEnergyIn > 0 ? nextEnergyIn : 0); }, 1000); - return () => clearInterval(interval) - }, [playerState, timePassed, nextEnergyIn]) + return () => clearInterval(interval); + }, [playerState]); return ( {children} - ) -} + ); +}; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/NftProvider.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/NftProvider.tsx index 8f115f789..376cdc018 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/NftProvider.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/NftProvider.tsx @@ -1,38 +1,35 @@ -import { createContext, useContext, useEffect, useState } from "react" -import { PublicKey } from "@solana/web3.js" -import { useWallet } from "@solana/wallet-adapter-react" -import { - CONNECTION, -} from "@/utils/anchor" +import { useWallet } from "@solana/wallet-adapter-react"; +import type { PublicKey } from "@solana/web3.js"; +import { createContext, useCallback, useContext, useEffect, useState } from "react"; +import { CONNECTION } from "@/utils/anchor"; + +interface DasNftItem { + id: string; + authorities: Array<{ address: string } | string>; + content: { + metadata: { name: string }; + links: { image: string }; + }; +} + +interface DasNftState { + items: DasNftItem[]; +} const NftContext = createContext<{ - nftState: any | null + nftState: DasNftState | null; }>({ nftState: null, -}) +}); -export const useNftState = () => useContext(NftContext) +export const useNftState = () => useContext(NftContext); -export const NftProvider = ({ - children, -}: { - children: React.ReactNode -}) => { - const { publicKey } = useWallet() +export const NftProvider = ({ children }: { children: React.ReactNode }) => { + const { publicKey } = useWallet(); - const [nftState, setNftState] = useState(null) - - useEffect( () => { - setNftState(null) - if (!publicKey) { - return - } - - getAssetsByOwner(publicKey); + const [nftState, setNftState] = useState(null); - }, [publicKey]); - - async function getAssetsByOwner(ownerAddress: PublicKey) { + const getAssetsByOwner = useCallback(async (ownerAddress: PublicKey) => { const sortBy = { sortBy: "created", sortDirection: "asc", @@ -47,12 +44,21 @@ export const NftProvider = ({ limit, page, before, - after + after, ); - setNftState(allAssetsOwned); + setNftState(allAssetsOwned as DasNftState); console.log(allAssetsOwned); - } + }, []); + + useEffect(() => { + setNftState(null); + if (!publicKey) { + return; + } + + getAssetsByOwner(publicKey); + }, [publicKey, getAssetsByOwner]); return ( {children} - ) -} + ); +}; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/SessionProvider.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/SessionProvider.tsx index 619d442d5..57d8a2baf 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/SessionProvider.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/SessionProvider.tsx @@ -1,26 +1,18 @@ -import { SessionWalletProvider, useSessionKeyManager } from "@magicblock-labs/gum-react-sdk" +import { SessionWalletProvider, useSessionKeyManager } from "@magicblock-labs/gum-react-sdk"; -import { - AnchorWallet, - useAnchorWallet, - useConnection, -} from "@solana/wallet-adapter-react" +import { type AnchorWallet, useAnchorWallet, useConnection } from "@solana/wallet-adapter-react"; interface SessionProviderProps { - children: React.ReactNode + children: React.ReactNode; } const SessionProvider: React.FC = ({ children }) => { - const { connection } = useConnection() - const anchorWallet = useAnchorWallet() as AnchorWallet - const cluster = "devnet" // or "mainnet-beta", "testnet", "localnet" - const sessionWallet = useSessionKeyManager(anchorWallet, connection, cluster) + const { connection } = useConnection(); + const anchorWallet = useAnchorWallet() as AnchorWallet; + const cluster = "devnet"; // or "mainnet-beta", "testnet", "localnet" + const sessionWallet = useSessionKeyManager(anchorWallet, connection, cluster); - return ( - - {children} - - ) -} + return {children}; +}; -export default SessionProvider +export default SessionProvider; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/WalletContextProvider.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/WalletContextProvider.tsx index 97a625de2..1b3e9cdc7 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/WalletContextProvider.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/contexts/WalletContextProvider.tsx @@ -1,28 +1,17 @@ -import { FC, ReactNode, useMemo } from "react" -import { WalletAdapterNetwork } from "@solana/wallet-adapter-base" -import { - ConnectionProvider, - WalletProvider, -} from "@solana/wallet-adapter-react" -import { WalletModalProvider } from "@solana/wallet-adapter-react-ui" -import { - PhantomWalletAdapter, - SolflareWalletAdapter, -} from "@solana/wallet-adapter-wallets" -import { clusterApiUrl } from "@solana/web3.js" -require("@solana/wallet-adapter-react-ui/styles.css") +import { WalletAdapterNetwork } from "@solana/wallet-adapter-base"; +import { ConnectionProvider, WalletProvider } from "@solana/wallet-adapter-react"; +import { WalletModalProvider } from "@solana/wallet-adapter-react-ui"; +import { PhantomWalletAdapter, SolflareWalletAdapter } from "@solana/wallet-adapter-wallets"; +import { clusterApiUrl } from "@solana/web3.js"; +import { type FC, type ReactNode, useMemo } from "react"; + +require("@solana/wallet-adapter-react-ui/styles.css"); const WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => { - const network = WalletAdapterNetwork.Devnet - const endpoint = useMemo(() => clusterApiUrl(network), [network]) + const network = WalletAdapterNetwork.Devnet; + const endpoint = useMemo(() => clusterApiUrl(network), []); - const wallets = useMemo( - () => [ - new PhantomWalletAdapter(), - new SolflareWalletAdapter(), - ], - [network] - ) + const wallets = useMemo(() => [new PhantomWalletAdapter(), new SolflareWalletAdapter()], []); return ( @@ -30,7 +19,7 @@ const WalletContextProvider: FC<{ children: ReactNode }> = ({ children }) => { {children} - ) -} + ); +}; -export default WalletContextProvider +export default WalletContextProvider; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/idl/extension_nft.ts b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/idl/extension_nft.ts index b77acef1c..f31836532 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/idl/extension_nft.ts +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/idl/extension_nft.ts @@ -1,134 +1,134 @@ export type ExtensionNft = { - version: '0.1.0'; - name: 'extension_nft'; + version: "0.1.0"; + name: "extension_nft"; instructions: [ { - name: 'initPlayer'; + name: "initPlayer"; accounts: [ { - name: 'player'; + name: "player"; isMut: true; isSigner: false; }, { - name: 'gameData'; + name: "gameData"; isMut: true; isSigner: false; }, { - name: 'signer'; + name: "signer"; isMut: true; isSigner: true; }, { - name: 'systemProgram'; + name: "systemProgram"; isMut: false; isSigner: false; }, ]; args: [ { - name: 'levelSeed'; - type: 'string'; + name: "levelSeed"; + type: "string"; }, ]; }, { - name: 'chopTree'; + name: "chopTree"; accounts: [ { - name: 'sessionToken'; + name: "sessionToken"; isMut: false; isSigner: false; isOptional: true; }, { - name: 'player'; + name: "player"; isMut: true; isSigner: false; }, { - name: 'gameData'; + name: "gameData"; isMut: true; isSigner: false; }, { - name: 'signer'; + name: "signer"; isMut: true; isSigner: true; }, { - name: 'systemProgram'; + name: "systemProgram"; isMut: false; isSigner: false; }, { - name: 'mint'; + name: "mint"; isMut: true; isSigner: false; }, { - name: 'nftAuthority'; + name: "nftAuthority"; isMut: true; isSigner: false; }, { - name: 'tokenProgram'; + name: "tokenProgram"; isMut: false; isSigner: false; }, ]; args: [ { - name: 'levelSeed'; - type: 'string'; + name: "levelSeed"; + type: "string"; }, { - name: 'counter'; - type: 'u16'; + name: "counter"; + type: "u16"; }, ]; }, { - name: 'mintNft'; + name: "mintNft"; accounts: [ { - name: 'signer'; + name: "signer"; isMut: true; isSigner: true; }, { - name: 'systemProgram'; + name: "systemProgram"; isMut: false; isSigner: false; }, { - name: 'tokenProgram'; + name: "tokenProgram"; isMut: false; isSigner: false; }, { - name: 'tokenAccount'; + name: "tokenAccount"; isMut: true; isSigner: false; }, { - name: 'mint'; + name: "mint"; isMut: true; isSigner: true; }, { - name: 'rent'; + name: "rent"; isMut: false; isSigner: false; }, { - name: 'associatedTokenProgram'; + name: "associatedTokenProgram"; isMut: false; isSigner: false; }, { - name: 'nftAuthority'; + name: "nftAuthority"; isMut: true; isSigner: false; }, @@ -138,60 +138,60 @@ export type ExtensionNft = { ]; accounts: [ { - name: 'nftAuthority'; + name: "nftAuthority"; type: { - kind: 'struct'; + kind: "struct"; fields: []; }; }, { - name: 'gameData'; + name: "gameData"; type: { - kind: 'struct'; + kind: "struct"; fields: [ { - name: 'totalWoodCollected'; - type: 'u64'; + name: "totalWoodCollected"; + type: "u64"; }, ]; }; }, { - name: 'playerData'; + name: "playerData"; type: { - kind: 'struct'; + kind: "struct"; fields: [ { - name: 'authority'; - type: 'publicKey'; + name: "authority"; + type: "publicKey"; }, { - name: 'name'; - type: 'string'; + name: "name"; + type: "string"; }, { - name: 'level'; - type: 'u8'; + name: "level"; + type: "u8"; }, { - name: 'xp'; - type: 'u64'; + name: "xp"; + type: "u64"; }, { - name: 'wood'; - type: 'u64'; + name: "wood"; + type: "u64"; }, { - name: 'energy'; - type: 'u64'; + name: "energy"; + type: "u64"; }, { - name: 'lastLogin'; - type: 'i64'; + name: "lastLogin"; + type: "i64"; }, { - name: 'lastId'; - type: 'u16'; + name: "lastId"; + type: "u16"; }, ]; }; @@ -200,148 +200,148 @@ export type ExtensionNft = { errors: [ { code: 6000; - name: 'NotEnoughEnergy'; - msg: 'Not enough energy'; + name: "NotEnoughEnergy"; + msg: "Not enough energy"; }, { code: 6001; - name: 'WrongAuthority'; - msg: 'Wrong Authority'; + name: "WrongAuthority"; + msg: "Wrong Authority"; }, ]; }; export const IDL: ExtensionNft = { - version: '0.1.0', - name: 'extension_nft', + version: "0.1.0", + name: "extension_nft", instructions: [ { - name: 'initPlayer', + name: "initPlayer", accounts: [ { - name: 'player', + name: "player", isMut: true, isSigner: false, }, { - name: 'gameData', + name: "gameData", isMut: true, isSigner: false, }, { - name: 'signer', + name: "signer", isMut: true, isSigner: true, }, { - name: 'systemProgram', + name: "systemProgram", isMut: false, isSigner: false, }, ], args: [ { - name: 'levelSeed', - type: 'string', + name: "levelSeed", + type: "string", }, ], }, { - name: 'chopTree', + name: "chopTree", accounts: [ { - name: 'sessionToken', + name: "sessionToken", isMut: false, isSigner: false, isOptional: true, }, { - name: 'player', + name: "player", isMut: true, isSigner: false, }, { - name: 'gameData', + name: "gameData", isMut: true, isSigner: false, }, { - name: 'signer', + name: "signer", isMut: true, isSigner: true, }, { - name: 'systemProgram', + name: "systemProgram", isMut: false, isSigner: false, }, { - name: 'mint', + name: "mint", isMut: true, isSigner: false, }, { - name: 'nftAuthority', + name: "nftAuthority", isMut: true, isSigner: false, }, { - name: 'tokenProgram', + name: "tokenProgram", isMut: false, isSigner: false, }, ], args: [ { - name: 'levelSeed', - type: 'string', + name: "levelSeed", + type: "string", }, { - name: 'counter', - type: 'u16', + name: "counter", + type: "u16", }, ], }, { - name: 'mintNft', + name: "mintNft", accounts: [ { - name: 'signer', + name: "signer", isMut: true, isSigner: true, }, { - name: 'systemProgram', + name: "systemProgram", isMut: false, isSigner: false, }, { - name: 'tokenProgram', + name: "tokenProgram", isMut: false, isSigner: false, }, { - name: 'tokenAccount', + name: "tokenAccount", isMut: true, isSigner: false, }, { - name: 'mint', + name: "mint", isMut: true, isSigner: true, }, { - name: 'rent', + name: "rent", isMut: false, isSigner: false, }, { - name: 'associatedTokenProgram', + name: "associatedTokenProgram", isMut: false, isSigner: false, }, { - name: 'nftAuthority', + name: "nftAuthority", isMut: true, isSigner: false, }, @@ -351,60 +351,60 @@ export const IDL: ExtensionNft = { ], accounts: [ { - name: 'nftAuthority', + name: "nftAuthority", type: { - kind: 'struct', + kind: "struct", fields: [], }, }, { - name: 'gameData', + name: "gameData", type: { - kind: 'struct', + kind: "struct", fields: [ { - name: 'totalWoodCollected', - type: 'u64', + name: "totalWoodCollected", + type: "u64", }, ], }, }, { - name: 'playerData', + name: "playerData", type: { - kind: 'struct', + kind: "struct", fields: [ { - name: 'authority', - type: 'publicKey', + name: "authority", + type: "publicKey", }, { - name: 'name', - type: 'string', + name: "name", + type: "string", }, { - name: 'level', - type: 'u8', + name: "level", + type: "u8", }, { - name: 'xp', - type: 'u64', + name: "xp", + type: "u64", }, { - name: 'wood', - type: 'u64', + name: "wood", + type: "u64", }, { - name: 'energy', - type: 'u64', + name: "energy", + type: "u64", }, { - name: 'lastLogin', - type: 'i64', + name: "lastLogin", + type: "i64", }, { - name: 'lastId', - type: 'u16', + name: "lastId", + type: "u16", }, ], }, @@ -413,13 +413,13 @@ export const IDL: ExtensionNft = { errors: [ { code: 6000, - name: 'NotEnoughEnergy', - msg: 'Not enough energy', + name: "NotEnoughEnergy", + msg: "Not enough energy", }, { code: 6001, - name: 'WrongAuthority', - msg: 'Wrong Authority', + name: "WrongAuthority", + msg: "Wrong Authority", }, ], }; diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/next.config.js b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/next.config.js index f4fad9bea..9d6954c83 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/next.config.js +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/next.config.js @@ -6,8 +6,8 @@ const nextConfig = { images: { remotePatterns: [ { - protocol: 'https', - hostname: '**', + protocol: "https", + hostname: "**", }, ], }, diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/package.json b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/package.json index befffb0a7..bccff5cb3 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/package.json +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/package.json @@ -11,7 +11,7 @@ "dependencies": { "@chakra-ui/next-js": "^2.1.3", "@chakra-ui/react": "^2.6.1", - "@anchor-lang/core": "1.0.0-rc.5", + "@anchor-lang/core": "1.0.0", "@coral-xyz/spl-token": "0.30.0", "@emotion/react": "^11.11.0", "@emotion/styled": "^11.11.0", diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/_app.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/_app.tsx index fd00cdf93..7bb118b2b 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/_app.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/_app.tsx @@ -1,22 +1,22 @@ -import { ChakraProvider } from "@chakra-ui/react" -import WalletContextProvider from "../contexts/WalletContextProvider" -import SessionProvider from "@/contexts/SessionProvider" -import { GameStateProvider } from "@/contexts/GameStateProvider" -import type { AppProps } from "next/app" -import { NftProvider } from "@/contexts/NftProvider" +import { ChakraProvider } from "@chakra-ui/react"; +import type { AppProps } from "next/app"; +import { GameStateProvider } from "@/contexts/GameStateProvider"; +import { NftProvider } from "@/contexts/NftProvider"; +import SessionProvider from "@/contexts/SessionProvider"; +import WalletContextProvider from "../contexts/WalletContextProvider"; export default function App({ Component, pageProps }: AppProps) { return ( - - - - + + + + - ) + ); } diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/_document.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/_document.tsx index 54e8bf3e2..ffc3f3ccc 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/_document.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/_document.tsx @@ -1,4 +1,4 @@ -import { Html, Head, Main, NextScript } from 'next/document' +import { Head, Html, Main, NextScript } from "next/document"; export default function Document() { return ( @@ -9,5 +9,5 @@ export default function Document() { - ) + ); } diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/api/hello.ts b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/api/hello.ts index 32a1340fe..e1b0dd0d2 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/api/hello.ts +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/api/hello.ts @@ -1,10 +1,10 @@ // Next.js API route support: https://nextjs.org/docs/api-routes/introduction -import type { NextApiRequest, NextApiResponse } from 'next'; +import type { NextApiRequest, NextApiResponse } from "next"; type Data = { name: string; }; export default function handler(_req: NextApiRequest, res: NextApiResponse) { - res.status(200).json({ name: 'John Doe' }); + res.status(200).json({ name: "John Doe" }); } diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/index.tsx b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/index.tsx index a578072d2..865c00100 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/index.tsx +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/pages/index.tsx @@ -1,16 +1,16 @@ -import { Box, Flex, Heading, Spacer, VStack, Text } from "@chakra-ui/react" -import { useWallet } from "@solana/wallet-adapter-react" -import WalletMultiButton from "@/components/WalletMultiButton" -import DisplayGameState from "@/components/DisplayGameState" -import InitPlayerButton from "@/components/InitPlayerButton" -import SessionKeyButton from "@/components/SessionKeyButton" -import ChopTreeButton from "@/components/ChopTreeButton" -import RequestAirdrop from "@/components/RequestAirdrop" -import DisplayNfts from "@/components/DisplayNfts" -import MintNftButton from "@/components/MintNftButton" +import { Box, Flex, Heading, Spacer, Text, VStack } from "@chakra-ui/react"; +import { useWallet } from "@solana/wallet-adapter-react"; +import ChopTreeButton from "@/components/ChopTreeButton"; +import DisplayGameState from "@/components/DisplayGameState"; +import DisplayNfts from "@/components/DisplayNfts"; +import InitPlayerButton from "@/components/InitPlayerButton"; +import MintNftButton from "@/components/MintNftButton"; +import RequestAirdrop from "@/components/RequestAirdrop"; +import SessionKeyButton from "@/components/SessionKeyButton"; +import WalletMultiButton from "@/components/WalletMultiButton"; export default function Home() { - const { publicKey } = useWallet() + const { publicKey } = useWallet(); return ( @@ -30,5 +30,5 @@ export default function Home() { - ) + ); } diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/styles/Home.module.css b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/styles/Home.module.css index 9411a5e6f..25760859a 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/styles/Home.module.css +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/styles/Home.module.css @@ -51,7 +51,9 @@ border-radius: var(--border-radius); background: rgba(var(--card-rgb), 0); border: 1px solid rgba(var(--card-border-rgb), 0); - transition: background 200ms, border 200ms; + transition: + background 200ms, + border 200ms; } .card span { @@ -97,7 +99,7 @@ .center::before, .center::after { - content: ''; + content: ""; left: 50%; position: absolute; filter: blur(45px); @@ -178,11 +180,7 @@ border-radius: 0; border: none; border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); - background: linear-gradient( - to bottom, - rgba(var(--background-start-rgb), 1), - rgba(var(--callout-rgb), 0.5) - ); + background: linear-gradient(to bottom, rgba(var(--background-start-rgb), 1), rgba(var(--callout-rgb), 0.5)); background-clip: padding-box; backdrop-filter: blur(24px); } @@ -193,11 +191,7 @@ inset: auto 0 0; padding: 2rem; height: 200px; - background: linear-gradient( - to bottom, - transparent 0%, - rgb(var(--background-end-rgb)) 40% - ); + background: linear-gradient(to bottom, transparent 0%, rgb(var(--background-end-rgb)) 40%); z-index: 1; } } diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/styles/globals.css b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/styles/globals.css index d4f491e15..bcc3a6c25 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/styles/globals.css +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/styles/globals.css @@ -1,9 +1,10 @@ :root { --max-width: 1100px; --border-radius: 12px; - --font-mono: ui-monospace, Menlo, Monaco, 'Cascadia Mono', 'Segoe UI Mono', - 'Roboto Mono', 'Oxygen Mono', 'Ubuntu Monospace', 'Source Code Pro', - 'Fira Mono', 'Droid Sans Mono', 'Courier New', monospace; + --font-mono: + ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono", + "Roboto Mono", "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro", + "Fira Mono", "Droid Sans Mono", "Courier New", monospace; --foreground-rgb: 0, 0, 0; --background-start-rgb: 214, 219, 220; @@ -17,22 +18,11 @@ #0071ff33 160deg, transparent 360deg ); - --secondary-glow: radial-gradient( - rgba(255, 255, 255, 1), - rgba(255, 255, 255, 0) - ); + --secondary-glow: radial-gradient(rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)); --tile-start-rgb: 239, 245, 249; --tile-end-rgb: 228, 232, 233; - --tile-border: conic-gradient( - #00000080, - #00000040, - #00000030, - #00000020, - #00000010, - #00000010, - #00000080 - ); + --tile-border: conic-gradient(#00000080, #00000040, #00000030, #00000020, #00000010, #00000010, #00000080); --callout-rgb: 238, 240, 241; --callout-border-rgb: 172, 175, 176; @@ -47,24 +37,11 @@ --background-end-rgb: 0, 0, 0; --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); - --secondary-glow: linear-gradient( - to bottom right, - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0), - rgba(1, 65, 255, 0.3) - ); + --secondary-glow: linear-gradient(to bottom right, rgba(1, 65, 255, 0), rgba(1, 65, 255, 0), rgba(1, 65, 255, 0.3)); --tile-start-rgb: 2, 13, 46; --tile-end-rgb: 2, 5, 19; - --tile-border: conic-gradient( - #ffffff80, - #ffffff40, - #ffffff30, - #ffffff20, - #ffffff10, - #ffffff10, - #ffffff80 - ); + --tile-border: conic-gradient(#ffffff80, #ffffff40, #ffffff30, #ffffff20, #ffffff10, #ffffff10, #ffffff80); --callout-rgb: 20, 20, 20; --callout-border-rgb: 108, 108, 108; @@ -87,12 +64,7 @@ body { body { color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); + background: linear-gradient(to bottom, transparent, rgb(var(--background-end-rgb))) rgb(var(--background-start-rgb)); } a { diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/utils/anchor.ts b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/utils/anchor.ts index fe83416f4..8db5bcd23 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/utils/anchor.ts +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/utils/anchor.ts @@ -1,31 +1,34 @@ -import { BN, type IdlAccounts, Program } from '@anchor-lang/core'; -import { PublicKey } from '@solana/web3.js'; -import { type ExtensionNft, IDL } from '../idl/extension_nft'; -import { WrappedConnection } from './wrappedConnection'; - -export const CONNECTION = new WrappedConnection(process.env.NEXT_PUBLIC_RPC ? process.env.NEXT_PUBLIC_RPC : 'https://rpc.magicblock.app/devnet', { - wsEndpoint: process.env.NEXT_PUBLIC_WSS_RPC ? process.env.NEXT_PUBLIC_WSS_RPC : 'wss://rpc.magicblock.app/devnet', - commitment: 'confirmed', -}); +import { BN, type IdlAccounts, Program } from "@anchor-lang/core"; +import { PublicKey } from "@solana/web3.js"; +import { type ExtensionNft, IDL } from "../idl/extension_nft"; +import { WrappedConnection } from "./wrappedConnection"; + +export const CONNECTION = new WrappedConnection( + process.env.NEXT_PUBLIC_RPC ? process.env.NEXT_PUBLIC_RPC : "https://rpc.magicblock.app/devnet", + { + wsEndpoint: process.env.NEXT_PUBLIC_WSS_RPC ? process.env.NEXT_PUBLIC_WSS_RPC : "wss://rpc.magicblock.app/devnet", + commitment: "confirmed", + }, +); -export const METAPLEX_READAPI = 'https://devnet.helius-rpc.com/?api-key=78065db3-87fb-431c-8d43-fcd190212125'; +export const METAPLEX_READAPI = "https://devnet.helius-rpc.com/?api-key=78065db3-87fb-431c-8d43-fcd190212125"; // Here you can basically use what ever seed you want. For example one per level or city or whatever. -export const GAME_DATA_SEED = 'level_2'; +export const GAME_DATA_SEED = "level_2"; // ExtensionNft game program ID -const programId = new PublicKey('H31ofLpWqeAzF2Pg54HSPQGYifJad843tTJg8vCYVoh3'); +const programId = new PublicKey("H31ofLpWqeAzF2Pg54HSPQGYifJad843tTJg8vCYVoh3"); // Create the program interface using the idl, program ID, and provider export const program = new Program(IDL, programId, { connection: CONNECTION, }); -export const [gameDataPDA] = PublicKey.findProgramAddressSync([Buffer.from(GAME_DATA_SEED, 'utf8')], program.programId); +export const [gameDataPDA] = PublicKey.findProgramAddressSync([Buffer.from(GAME_DATA_SEED, "utf8")], program.programId); // Player Data Account Type from Idl -export type PlayerData = IdlAccounts['playerData']; -export type GameData = IdlAccounts['gameData']; +export type PlayerData = IdlAccounts["playerData"]; +export type GameData = IdlAccounts["gameData"]; // Constants for the game export const TIME_TO_REFILL_ENERGY: BN = new BN(60); diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/utils/wrappedConnection.ts b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/utils/wrappedConnection.ts index 2275dac50..a57b111e9 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/utils/wrappedConnection.ts +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/app/utils/wrappedConnection.ts @@ -1,14 +1,19 @@ -import { Connection } from '@solana/web3.js'; -import axios from 'axios'; -import { METAPLEX_READAPI } from './anchor'; +import { Connection } from "@solana/web3.js"; +import axios from "axios"; +import { METAPLEX_READAPI } from "./anchor"; + +interface SortBy { + sortBy: string; + sortDirection: string; +} export class WrappedConnection extends Connection { - async getAsset(assetId: any): Promise { + async getAsset(assetId: string): Promise { try { const response = await axios.post(process.env.NEXT_PUBLIC_RPC ? process.env.NEXT_PUBLIC_RPC : METAPLEX_READAPI, { - jsonrpc: '2.0', - method: 'getAsset', - id: 'compression-example', + jsonrpc: "2.0", + method: "getAsset", + id: "compression-example", params: [assetId], }); return response.data.result; @@ -17,12 +22,12 @@ export class WrappedConnection extends Connection { } } - async getAssetProof(assetId: any): Promise { + async getAssetProof(assetId: string): Promise { try { const response = await axios.post(process.env.NEXT_PUBLIC_RPC ? process.env.NEXT_PUBLIC_RPC : METAPLEX_READAPI, { - jsonrpc: '2.0', - method: 'getAssetProof', - id: 'compression-example', + jsonrpc: "2.0", + method: "getAssetProof", + id: "compression-example", params: [assetId], }); return response.data.result; @@ -31,12 +36,19 @@ export class WrappedConnection extends Connection { } } - async getAssetsByOwner(assetId: string, sortBy: any, limit: number, page: number, before: string, after: string): Promise { + async getAssetsByOwner( + assetId: string, + sortBy: SortBy, + limit: number, + page: number, + before: string, + after: string, + ): Promise { try { const response = await axios.post(process.env.NEXT_PUBLIC_RPC ? process.env.NEXT_PUBLIC_RPC : METAPLEX_READAPI, { - jsonrpc: '2.0', - method: 'getAssetsByOwner', - id: 'rpd-op-123', + jsonrpc: "2.0", + method: "getAssetsByOwner", + id: "rpd-op-123", params: [assetId, sortBy, limit, page, before, after], }); //console.log("getAssetsByOwner: " + JSON.stringify(response.data)); @@ -46,12 +58,19 @@ export class WrappedConnection extends Connection { } } - async getAssetsByCreator(assetId: string, sortBy: any, limit: number, page: number, _before: string, _after: string): Promise { + async getAssetsByCreator( + assetId: string, + sortBy: SortBy, + limit: number, + page: number, + _before: string, + _after: string, + ): Promise { try { const response = await axios.post(process.env.NEXT_PUBLIC_RPC ? process.env.NEXT_PUBLIC_RPC : METAPLEX_READAPI, { - jsonrpc: '2.0', - method: 'getAssetsByCreator', - id: 'compression-example', + jsonrpc: "2.0", + method: "getAssetsByCreator", + id: "compression-example", params: [assetId, true, sortBy, limit, page, null, null], }); @@ -61,12 +80,19 @@ export class WrappedConnection extends Connection { } } - async getAssetsByAuthority(assetId: string, sortBy: any, limit: number, page: number, before: string, after: string): Promise { + async getAssetsByAuthority( + assetId: string, + sortBy: SortBy, + limit: number, + page: number, + before: string, + after: string, + ): Promise { try { const response = await axios.post(process.env.NEXT_PUBLIC_RPC ? process.env.NEXT_PUBLIC_RPC : METAPLEX_READAPI, { - jsonrpc: '2.0', - method: 'getAssetsByAuthority', - id: 'compression-example', + jsonrpc: "2.0", + method: "getAssetsByAuthority", + id: "compression-example", params: [assetId, sortBy, limit, page, before, after], }); return response.data.result; @@ -78,19 +104,19 @@ export class WrappedConnection extends Connection { async getAssetsByGroup( groupKey: string, groupValue: string, - sortBy: any, + sortBy: SortBy, limit: number, page: number, before: string, after: string, - ): Promise { + ): Promise { try { const events = []; const response = await axios.post(process.env.NEXT_PUBLIC_RPC ? process.env.NEXT_PUBLIC_RPC : METAPLEX_READAPI, { - jsonrpc: '2.0', - method: 'getAssetsByGroup', - id: 'rpd-op-123', + jsonrpc: "2.0", + method: "getAssetsByGroup", + id: "rpd-op-123", params: [groupKey, groupValue, sortBy, limit, page, before, after], }); events.push(...response.data.result.items); @@ -105,19 +131,19 @@ export class WrappedConnection extends Connection { async getAllAssetsByGroup( groupKey: string, groupValue: string, - sortBy: any, + sortBy: SortBy, limit: number, startPage: number, before: string, after: string, - ): Promise { + ): Promise { let page = startPage; try { const events = []; let response = await axios.post(process.env.NEXT_PUBLIC_RPC ? process.env.NEXT_PUBLIC_RPC : METAPLEX_READAPI, { - jsonrpc: '2.0', - method: 'getAssetsByGroup', - id: 'rpd-op-123', + jsonrpc: "2.0", + method: "getAssetsByGroup", + id: "rpd-op-123", params: [groupKey, groupValue, sortBy, limit, page, before, after], }); @@ -128,9 +154,9 @@ export class WrappedConnection extends Connection { page += 1; response = await axios.post(process.env.NEXT_PUBLIC_RPC ? process.env.NEXT_PUBLIC_RPC : METAPLEX_READAPI, { - jsonrpc: '2.0', - method: 'getAssetsByGroup', - id: 'rpd-op-123', + jsonrpc: "2.0", + method: "getAssetsByGroup", + id: "rpd-op-123", params: [groupKey, groupValue, sortBy, limit, page, before, after], }); diff --git a/tokens/token-2022/nft-meta-data-pointer/anchor-example/unity/ExtensionNft/Assets/TextMesh Pro/Sprites/EmojiOne.json b/tokens/token-2022/nft-meta-data-pointer/anchor-example/unity/ExtensionNft/Assets/TextMesh Pro/Sprites/EmojiOne.json index 2b5e1e6a6..53663458b 100644 --- a/tokens/token-2022/nft-meta-data-pointer/anchor-example/unity/ExtensionNft/Assets/TextMesh Pro/Sprites/EmojiOne.json +++ b/tokens/token-2022/nft-meta-data-pointer/anchor-example/unity/ExtensionNft/Assets/TextMesh Pro/Sprites/EmojiOne.json @@ -1,157 +1,157 @@ { - "frames": [ - { - "filename": "1f60a.png", - "frame": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f60b.png", - "frame": { "x": 128, "y": 0, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f60d.png", - "frame": { "x": 256, "y": 0, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f60e.png", - "frame": { "x": 384, "y": 0, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f600.png", - "frame": { "x": 0, "y": 128, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f601.png", - "frame": { "x": 128, "y": 128, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f602.png", - "frame": { "x": 256, "y": 128, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f603.png", - "frame": { "x": 384, "y": 128, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f604.png", - "frame": { "x": 0, "y": 256, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f605.png", - "frame": { "x": 128, "y": 256, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f606.png", - "frame": { "x": 256, "y": 256, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f609.png", - "frame": { "x": 384, "y": 256, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f618.png", - "frame": { "x": 0, "y": 384, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "1f923.png", - "frame": { "x": 128, "y": 384, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "263a.png", - "frame": { "x": 256, "y": 384, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - }, - { - "filename": "2639.png", - "frame": { "x": 384, "y": 384, "w": 128, "h": 128 }, - "rotated": false, - "trimmed": false, - "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, - "sourceSize": { "w": 128, "h": 128 }, - "pivot": { "x": 0.5, "y": 0.5 } - } - ], - "meta": { - "app": "http://www.codeandweb.com/texturepacker", - "version": "1.0", - "image": "EmojiOne.png", - "format": "RGBA8888", - "size": { "w": 512, "h": 512 }, - "scale": "1", - "smartupdate": "$TexturePacker:SmartUpdate:196a26a2e149d875b91ffc8fa3581e76:fc928c7e275404b7e0649307410475cb:424723c3774975ddb2053fd5c4b85f6e$" - } + "frames": [ + { + "filename": "1f60a.png", + "frame": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f60b.png", + "frame": { "x": 128, "y": 0, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f60d.png", + "frame": { "x": 256, "y": 0, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f60e.png", + "frame": { "x": 384, "y": 0, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f600.png", + "frame": { "x": 0, "y": 128, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f601.png", + "frame": { "x": 128, "y": 128, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f602.png", + "frame": { "x": 256, "y": 128, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f603.png", + "frame": { "x": 384, "y": 128, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f604.png", + "frame": { "x": 0, "y": 256, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f605.png", + "frame": { "x": 128, "y": 256, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f606.png", + "frame": { "x": 256, "y": 256, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f609.png", + "frame": { "x": 384, "y": 256, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f618.png", + "frame": { "x": 0, "y": 384, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "1f923.png", + "frame": { "x": 128, "y": 384, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "263a.png", + "frame": { "x": 256, "y": 384, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + }, + { + "filename": "2639.png", + "frame": { "x": 384, "y": 384, "w": 128, "h": 128 }, + "rotated": false, + "trimmed": false, + "spriteSourceSize": { "x": 0, "y": 0, "w": 128, "h": 128 }, + "sourceSize": { "w": 128, "h": 128 }, + "pivot": { "x": 0.5, "y": 0.5 } + } + ], + "meta": { + "app": "http://www.codeandweb.com/texturepacker", + "version": "1.0", + "image": "EmojiOne.png", + "format": "RGBA8888", + "size": { "w": 512, "h": 512 }, + "scale": "1", + "smartupdate": "$TexturePacker:SmartUpdate:196a26a2e149d875b91ffc8fa3581e76:fc928c7e275404b7e0649307410475cb:424723c3774975ddb2053fd5c4b85f6e$" + } } diff --git a/tokens/token-2022/non-transferable/anchor/Anchor.toml b/tokens/token-2022/non-transferable/anchor/Anchor.toml index ff3f4fc51..5200062d6 100644 --- a/tokens/token-2022/non-transferable/anchor/Anchor.toml +++ b/tokens/token-2022/non-transferable/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -non_transferable = "8Bz4wpHaUckiC169Rg5ZfaBHFemp5S8RwTSDTKzhJ9W" - -# [registry] section removed — no longer used in Anchor 1.0 +non_transferable = "9GpYDDJUM7CCrruDsg9v1aff5BouEzGfXifu8Woyhnbn" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/non-transferable/anchor/migrations/deploy.ts b/tokens/token-2022/non-transferable/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/non-transferable/anchor/migrations/deploy.ts +++ b/tokens/token-2022/non-transferable/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/non-transferable/anchor/package.json b/tokens/token-2022/non-transferable/anchor/package.json index f800607c4..cc320fb64 100644 --- a/tokens/token-2022/non-transferable/anchor/package.json +++ b/tokens/token-2022/non-transferable/anchor/package.json @@ -1,21 +1,21 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.6" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.6" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/non-transferable/anchor/pnpm-lock.yaml b/tokens/token-2022/non-transferable/anchor/pnpm-lock.yaml index 841b2d24e..349da1833 100644 --- a/tokens/token-2022/non-transferable/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/non-transferable/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.6 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -860,16 +860,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -887,7 +887,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/token-2022/non-transferable/anchor/programs/non-transferable/Cargo.toml b/tokens/token-2022/non-transferable/anchor/programs/non-transferable/Cargo.toml index 749c0e75b..b06a6f980 100644 --- a/tokens/token-2022/non-transferable/anchor/programs/non-transferable/Cargo.toml +++ b/tokens/token-2022/non-transferable/anchor/programs/non-transferable/Cargo.toml @@ -17,5 +17,12 @@ no-log-ix-name = [] idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] [dependencies] -anchor-lang = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" diff --git a/tokens/token-2022/non-transferable/anchor/programs/non-transferable/src/lib.rs b/tokens/token-2022/non-transferable/anchor/programs/non-transferable/src/lib.rs index 05d096f72..65e8b142c 100644 --- a/tokens/token-2022/non-transferable/anchor/programs/non-transferable/src/lib.rs +++ b/tokens/token-2022/non-transferable/anchor/programs/non-transferable/src/lib.rs @@ -9,7 +9,7 @@ use anchor_spl::{ token_interface::{non_transferable_mint_initialize, NonTransferableMintInitialize, Token2022}, }; -declare_id!("8Bz4wpHaUckiC169Rg5ZfaBHFemp5S8RwTSDTKzhJ9W"); +declare_id!("9GpYDDJUM7CCrruDsg9v1aff5BouEzGfXifu8Woyhnbn"); #[program] pub mod non_transferable { diff --git a/tokens/token-2022/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs b/tokens/token-2022/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs new file mode 100644 index 000000000..3ec60c6bb --- /dev/null +++ b/tokens/token-2022/non-transferable/anchor/programs/non-transferable/tests/test_non_transferable.rs @@ -0,0 +1,107 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, get_token_extensions_account_address, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = non_transferable::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/non_transferable.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_non_transferable_mint_and_attempt_transfer() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Create mint with NonTransferable extension via our program + let initialize_ix = Instruction::new_with_bytes( + program_id, + &non_transferable::instruction::Initialize {}.data(), + non_transferable::accounts::Initialize { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Verify mint account was created and has extension data + let mint_data = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint account should exist"); + assert!( + mint_data.data.len() > 82, + "Mint should have extension data (size > 82, got {})", + mint_data.data.len() + ); + + // Step 2: Create ATAs for sender and recipient + let recipient = Keypair::new(); + let source_ata = create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint_keypair.pubkey(), + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint_keypair.pubkey(), + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Mint 1 token to sender + mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &source_ata, + 1, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 4: Attempt transfer — should fail because mint is NonTransferable + let result = transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint_keypair.pubkey(), + &dest_ata, + &payer, + 1, + 2, // decimals + &[], + ); + assert!( + result.is_err(), + "Transfer should fail because the mint is non-transferable" + ); +} diff --git a/tokens/token-2022/non-transferable/anchor/tests/non-transferable.ts b/tokens/token-2022/non-transferable/anchor/tests/non-transferable.ts index 112a9eb13..414c651d2 100644 --- a/tokens/token-2022/non-transferable/anchor/tests/non-transferable.ts +++ b/tokens/token-2022/non-transferable/anchor/tests/non-transferable.ts @@ -1,9 +1,15 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { ASSOCIATED_TOKEN_PROGRAM_ID, getOrCreateAssociatedTokenAccount, mintTo, TOKEN_2022_PROGRAM_ID, transfer } from '@solana/spl-token'; -import type { NonTransferable } from '../target/types/non_transferable'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { + ASSOCIATED_TOKEN_PROGRAM_ID, + getOrCreateAssociatedTokenAccount, + mintTo, + TOKEN_2022_PROGRAM_ID, + transfer, +} from "@solana/spl-token"; +import type { NonTransferable } from "../target/types/non_transferable"; -describe('non-transferable', () => { +describe("non-transferable", () => { const provider = anchor.AnchorProvider.env(); const connection = provider.connection; const wallet = provider.wallet as anchor.Wallet; @@ -14,16 +20,16 @@ describe('non-transferable', () => { const mintKeypair = new anchor.web3.Keypair(); const recipient = new anchor.web3.Keypair(); - it('Create Mint with NonTransferable extension', async () => { + it("Create Mint with NonTransferable extension", async () => { const transactionSignature = await program.methods .initialize() .accounts({ mintAccount: mintKeypair.publicKey }) .signers([mintKeypair]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Attempt Token Transfer', async () => { + it("Attempt Token Transfer", async () => { const amount = 1; const sourceTokenAccount = await getOrCreateAssociatedTokenAccount( @@ -76,7 +82,7 @@ describe('non-transferable', () => { TOKEN_2022_PROGRAM_ID, // Token Extension Program ID ); } catch (error) { - console.log('\nExpect Error:', error.logs); + console.log("\nExpect Error:", error.logs); } }); }); diff --git a/tokens/token-2022/non-transferable/native/tests/test.ts b/tokens/token-2022/non-transferable/native/tests/test.ts index 8b67b66b2..c9c0fc870 100644 --- a/tokens/token-2022/non-transferable/native/tests/test.ts +++ b/tokens/token-2022/non-transferable/native/tests/test.ts @@ -1,25 +1,31 @@ -import { Buffer } from 'node:buffer'; -import { describe, test } from 'node:test'; -import { TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; -import { Keypair, PublicKey, SYSVAR_RENT_PUBKEY, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { assert } from 'chai'; -import { start } from 'solana-bankrun'; - - -const CreateTokenArgsSchema = { struct: { token_decimals: 'u8' } }; +import { Buffer } from "node:buffer"; +import { describe, test } from "node:test"; +import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import { + Keypair, + PublicKey, + SYSVAR_RENT_PUBKEY, + SystemProgram, + Transaction, + TransactionInstruction, +} from "@solana/web3.js"; +import * as borsh from "borsh"; +import { assert } from "chai"; +import { start } from "solana-bankrun"; + +const CreateTokenArgsSchema = { struct: { token_decimals: "u8" } }; function borshSerialize(schema: borsh.Schema, data: object): Buffer { return Buffer.from(borsh.serialize(schema, data)); } -describe('Create Token', async () => { +describe("Create Token", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'token_2022_non_transferable_program', programId: PROGRAM_ID }], []); + const context = await start([{ name: "token_2022_non_transferable_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; - test('Create a Token-22 SPL-Token !', async () => { + test("Create a Token-22 SPL-Token !", async () => { const blockhash = context.lastBlockhash; const mintKeypair: Keypair = Keypair.generate(); @@ -47,6 +53,6 @@ describe('Create Token', async () => { const transaction = await client.processTransaction(tx); assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - console.log('Token Mint Address: ', mintKeypair.publicKey.toBase58()); + console.log("Token Mint Address: ", mintKeypair.publicKey.toBase58()); }); }); diff --git a/tokens/token-2022/permanent-delegate/anchor/Anchor.toml b/tokens/token-2022/permanent-delegate/anchor/Anchor.toml index 5482905c8..747c431bc 100644 --- a/tokens/token-2022/permanent-delegate/anchor/Anchor.toml +++ b/tokens/token-2022/permanent-delegate/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -permanent_delegate = "A9rxKS84ZoJVyeTfQbCEfxME2vvAM4uwSMjkmhR5XWb1" - -# [registry] section removed — no longer used in Anchor 1.0 +permanent_delegate = "g63s55bPYTvuuXFRMCzDaKTjCnXhDPNmwjafnQUNexa" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/permanent-delegate/anchor/migrations/deploy.ts b/tokens/token-2022/permanent-delegate/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/permanent-delegate/anchor/migrations/deploy.ts +++ b/tokens/token-2022/permanent-delegate/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/permanent-delegate/anchor/package.json b/tokens/token-2022/permanent-delegate/anchor/package.json index f800607c4..cc320fb64 100644 --- a/tokens/token-2022/permanent-delegate/anchor/package.json +++ b/tokens/token-2022/permanent-delegate/anchor/package.json @@ -1,21 +1,21 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.6" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.6" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/permanent-delegate/anchor/pnpm-lock.yaml b/tokens/token-2022/permanent-delegate/anchor/pnpm-lock.yaml index 841b2d24e..349da1833 100644 --- a/tokens/token-2022/permanent-delegate/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/permanent-delegate/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.6 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -860,16 +860,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -887,7 +887,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/Cargo.toml b/tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/Cargo.toml index 41b66d80e..0640343cb 100644 --- a/tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/Cargo.toml +++ b/tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/Cargo.toml @@ -21,8 +21,15 @@ custom-panic = [] [dependencies] -anchor-lang = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/src/lib.rs b/tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/src/lib.rs index 76f03648b..2d181361f 100644 --- a/tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/src/lib.rs +++ b/tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/src/lib.rs @@ -11,7 +11,7 @@ use anchor_spl::{ }, }; -declare_id!("A9rxKS84ZoJVyeTfQbCEfxME2vvAM4uwSMjkmhR5XWb1"); +declare_id!("g63s55bPYTvuuXFRMCzDaKTjCnXhDPNmwjafnQUNexa"); #[program] pub mod permanent_delegate { diff --git a/tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/tests/test_permanent_delegate.rs b/tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/tests/test_permanent_delegate.rs new file mode 100644 index 000000000..894f3f17f --- /dev/null +++ b/tokens/token-2022/permanent-delegate/anchor/programs/permanent-delegate/tests/test_permanent_delegate.rs @@ -0,0 +1,134 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + assert_token_account_balance, create_wallet, send_transaction_from_instructions, + token_extensions::{ + mint_tokens_to_token_extensions_account, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = permanent_delegate::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/permanent_delegate.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +/// Create a Token Extensions token account (CreateAccount + InitializeAccount3). +/// This creates a non-ATA token account with explicit keypair, which kite doesn't provide. +fn create_token_account_instructions( + payer: &Pubkey, + account: &Pubkey, + mint: &Pubkey, + owner: &Pubkey, +) -> Vec { + let space: u64 = 200; + let lamports: u64 = 3_000_000; + let create_account_ix = anchor_lang::solana_program::system_instruction::create_account( + payer, account, lamports, space, &TOKEN_EXTENSIONS_PROGRAM_ID, + ); + // InitializeAccount3 (instruction 18): [18, owner(32)] + let mut init_data = vec![18u8]; + init_data.extend_from_slice(owner.as_ref()); + let init_account_ix = Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*account, false), + AccountMeta::new_readonly(*mint, false), + ], + data: init_data, + }; + vec![create_account_ix, init_account_ix] +} + +/// BurnChecked instruction for Token Extensions (instruction 15). +fn burn_checked_ix( + account: &Pubkey, + mint: &Pubkey, + authority: &Pubkey, + amount: u64, + decimals: u8, +) -> Instruction { + let mut data = vec![15u8]; + data.extend_from_slice(&amount.to_le_bytes()); + data.push(decimals); + Instruction { + program_id: TOKEN_EXTENSIONS_PROGRAM_ID, + accounts: vec![ + AccountMeta::new(*account, false), + AccountMeta::new(*mint, false), + AccountMeta::new_readonly(*authority, true), + ], + data, + } +} + +#[test] +fn test_create_mint_with_permanent_delegate_and_burn() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Step 1: Create mint with PermanentDelegate extension via program + let initialize_ix = Instruction::new_with_bytes( + program_id, + &permanent_delegate::instruction::Initialize {}.data(), + permanent_delegate::accounts::Initialize { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 2: Create a token account owned by a random keypair + let random_owner = Keypair::new(); + let token_account = Keypair::new(); + let create_ata_ixs = create_token_account_instructions( + &payer.pubkey(), + &token_account.pubkey(), + &mint_keypair.pubkey(), + &random_owner.pubkey(), + ); + send_transaction_from_instructions(&mut svm, create_ata_ixs, &[&payer, &token_account], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 3: Mint 100 tokens to the token account + mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &token_account.pubkey(), + 100, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 4: Burn all 100 tokens using the permanent delegate (payer) + let burn_ix = burn_checked_ix( + &token_account.pubkey(), + &mint_keypair.pubkey(), + &payer.pubkey(), + 100, + 2, // decimals + ); + send_transaction_from_instructions(&mut svm, vec![burn_ix], &[&payer], &payer.pubkey()).unwrap(); + + assert_token_account_balance(&svm, &token_account.pubkey(), 0, "Token account balance should be 0 after burn"); +} diff --git a/tokens/token-2022/permanent-delegate/anchor/tests/permanent-delegate.ts b/tokens/token-2022/permanent-delegate/anchor/tests/permanent-delegate.ts index 0c9da2467..38d77576a 100644 --- a/tokens/token-2022/permanent-delegate/anchor/tests/permanent-delegate.ts +++ b/tokens/token-2022/permanent-delegate/anchor/tests/permanent-delegate.ts @@ -1,9 +1,9 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { burnChecked, createAccount, getAccount, mintTo, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; -import type { PermanentDelegate } from '../target/types/permanent_delegate'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { burnChecked, createAccount, getAccount, mintTo, TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import type { PermanentDelegate } from "../target/types/permanent_delegate"; -describe('permanent-delegate', () => { +describe("permanent-delegate", () => { const provider = anchor.AnchorProvider.env(); const connection = provider.connection; const wallet = provider.wallet as anchor.Wallet; @@ -13,16 +13,16 @@ describe('permanent-delegate', () => { const mintKeypair = new anchor.web3.Keypair(); - it('Create Mint with Permanent Delegate', async () => { + it("Create Mint with Permanent Delegate", async () => { const transactionSignature = await program.methods .initialize() .accounts({ mintAccount: mintKeypair.publicKey }) .signers([mintKeypair]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Create Token Account, Mint Tokens, and burn with Permanent Delegate', async () => { + it("Create Token Account, Mint Tokens, and burn with Permanent Delegate", async () => { const amount = 100; // Random keypair to use as owner of Token Account @@ -66,9 +66,9 @@ describe('permanent-delegate', () => { undefined, // Confirmation options TOKEN_2022_PROGRAM_ID, // Token Extension Program ID ); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); const tokenAccount = await getAccount(connection, sourceTokenAccount, null, TOKEN_2022_PROGRAM_ID); - console.log('Token Account Balance:', Number(tokenAccount.amount)); + console.log("Token Account Balance:", Number(tokenAccount.amount)); }); }); diff --git a/tokens/token-2022/transfer-fee/anchor/Anchor.toml b/tokens/token-2022/transfer-fee/anchor/Anchor.toml index 6759948ba..2275a32dc 100644 --- a/tokens/token-2022/transfer-fee/anchor/Anchor.toml +++ b/tokens/token-2022/transfer-fee/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -transfer_fee = "4evptdGtALCNT8uTxJhbWBRZpBE8w5oNtmgfSyfQu7td" - -# [registry] section removed — no longer used in Anchor 1.0 +transfer_fee = "FRB5Ln5fbH4sA1dyJRZz9M5mXQij8Tfr4cKtnP3gNaC1" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/transfer-fee/anchor/migrations/deploy.ts b/tokens/token-2022/transfer-fee/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/transfer-fee/anchor/migrations/deploy.ts +++ b/tokens/token-2022/transfer-fee/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/transfer-fee/anchor/package.json b/tokens/token-2022/transfer-fee/anchor/package.json index f800607c4..cc320fb64 100644 --- a/tokens/token-2022/transfer-fee/anchor/package.json +++ b/tokens/token-2022/transfer-fee/anchor/package.json @@ -1,21 +1,21 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.6" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.6" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/transfer-fee/anchor/pnpm-lock.yaml b/tokens/token-2022/transfer-fee/anchor/pnpm-lock.yaml index 841b2d24e..349da1833 100644 --- a/tokens/token-2022/transfer-fee/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/transfer-fee/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.6 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -860,16 +860,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -887,7 +887,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/Cargo.toml b/tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/Cargo.toml index a3ac9f655..c29fae100 100644 --- a/tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/Cargo.toml +++ b/tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/Cargo.toml @@ -17,5 +17,12 @@ no-log-ix-name = [] idl-build = ["anchor-lang/idl-build", "anchor-spl/idl-build"] [dependencies] -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" diff --git a/tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/src/lib.rs b/tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/src/lib.rs index f264757c3..38365fea9 100644 --- a/tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/src/lib.rs +++ b/tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/src/lib.rs @@ -3,7 +3,7 @@ use anchor_lang::prelude::*; mod instructions; use instructions::*; -declare_id!("4evptdGtALCNT8uTxJhbWBRZpBE8w5oNtmgfSyfQu7td"); +declare_id!("FRB5Ln5fbH4sA1dyJRZz9M5mXQij8Tfr4cKtnP3gNaC1"); #[program] pub mod transfer_fee { diff --git a/tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/tests/test_transfer_fee.rs b/tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/tests/test_transfer_fee.rs new file mode 100644 index 000000000..5a734aa50 --- /dev/null +++ b/tokens/token-2022/transfer-fee/anchor/programs/transfer-fee/tests/test_transfer_fee.rs @@ -0,0 +1,172 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::{AccountMeta, Instruction}, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, get_token_extensions_account_address, + mint_tokens_to_token_extensions_account, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_fee::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_fee.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_transfer_fee_full_flow() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let recipient = Keypair::new(); + let ata_program = associated_token_program_id(); + + let sender_ata = get_token_extensions_account_address(&payer.pubkey(), &mint_keypair.pubkey()); + let recipient_ata = get_token_extensions_account_address(&recipient.pubkey(), &mint_keypair.pubkey()); + + // Step 1: Create mint with transfer fee (100 basis points = 1%, max fee = 1) + let initialize_ix = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::Initialize { + transfer_fee_basis_points: 100, + maximum_fee: 1, + } + .data(), + transfer_fee::accounts::Initialize { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 2: Create sender ATA and mint 300 tokens + create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint_keypair.pubkey(), + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &sender_ata, + 300, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Transfer 100 tokens (fee = min(1% * 100 = 1, max_fee = 1) = 1) + let transfer_ix = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::Transfer { amount: 100 }.data(), + transfer_fee::accounts::Transfer { + sender: payer.pubkey(), + recipient: recipient.pubkey(), + mint_account: mint_keypair.pubkey(), + sender_token_account: sender_ata, + recipient_token_account: recipient_ata, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: ata_program, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![transfer_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Transfer 200 tokens (fee = min(1% * 200 = 2, max_fee = 1) = 1, capped by maximumFee) + let transfer_ix2 = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::Transfer { amount: 200 }.data(), + transfer_fee::accounts::Transfer { + sender: payer.pubkey(), + recipient: recipient.pubkey(), + mint_account: mint_keypair.pubkey(), + sender_token_account: sender_ata, + recipient_token_account: recipient_ata, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: ata_program, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![transfer_ix2], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 5: Harvest transfer fees from recipient token account to mint + let harvest_ix = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::Harvest {}.data(), + { + let mut metas = transfer_fee::accounts::Harvest { + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None); + metas.push(AccountMeta::new(recipient_ata, false)); + metas + }, + ); + send_transaction_from_instructions(&mut svm, vec![harvest_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 6: Withdraw harvested fees from mint to sender's token account + let withdraw_ix = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::Withdraw {}.data(), + transfer_fee::accounts::Withdraw { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_account: sender_ata, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![withdraw_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 7: Update transfer fee to 0 + let update_fee_ix = Instruction::new_with_bytes( + program_id, + &transfer_fee::instruction::UpdateFee { + transfer_fee_basis_points: 0, + maximum_fee: 0, + } + .data(), + transfer_fee::accounts::UpdateFee { + authority: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![update_fee_ix], &[&payer], &payer.pubkey()).unwrap(); +} diff --git a/tokens/token-2022/transfer-fee/anchor/tests/transfer-fee.ts b/tokens/token-2022/transfer-fee/anchor/tests/transfer-fee.ts index e717fb53a..78726bc74 100644 --- a/tokens/token-2022/transfer-fee/anchor/tests/transfer-fee.ts +++ b/tokens/token-2022/transfer-fee/anchor/tests/transfer-fee.ts @@ -1,10 +1,15 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { ASSOCIATED_PROGRAM_ID } from '@anchor-lang/core/dist/cjs/utils/token'; -import { getAssociatedTokenAddressSync, getOrCreateAssociatedTokenAccount, mintTo, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; -import type { TransferFee } from '../target/types/transfer_fee'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { ASSOCIATED_PROGRAM_ID } from "@anchor-lang/core/dist/cjs/utils/token"; +import { + getAssociatedTokenAddressSync, + getOrCreateAssociatedTokenAccount, + mintTo, + TOKEN_2022_PROGRAM_ID, +} from "@solana/spl-token"; +import type { TransferFee } from "../target/types/transfer_fee"; -describe('transfer-fee', () => { +describe("transfer-fee", () => { const provider = anchor.AnchorProvider.env(); const connection = provider.connection; const wallet = provider.wallet as anchor.Wallet; @@ -15,11 +20,21 @@ describe('transfer-fee', () => { const mintKeypair = new anchor.web3.Keypair(); const recipient = new anchor.web3.Keypair(); - const senderTokenAccountAddress = getAssociatedTokenAddressSync(mintKeypair.publicKey, wallet.publicKey, false, TOKEN_2022_PROGRAM_ID); + const senderTokenAccountAddress = getAssociatedTokenAddressSync( + mintKeypair.publicKey, + wallet.publicKey, + false, + TOKEN_2022_PROGRAM_ID, + ); - const recipientTokenAccountAddress = getAssociatedTokenAddressSync(mintKeypair.publicKey, recipient.publicKey, false, TOKEN_2022_PROGRAM_ID); + const recipientTokenAccountAddress = getAssociatedTokenAddressSync( + mintKeypair.publicKey, + recipient.publicKey, + false, + TOKEN_2022_PROGRAM_ID, + ); - it('Create Mint with Transfer Fee', async () => { + it("Create Mint with Transfer Fee", async () => { const transferFeeBasisPoints = 100; const maximumFee = 1; @@ -28,10 +43,10 @@ describe('transfer-fee', () => { .accounts({ mintAccount: mintKeypair.publicKey }) .signers([mintKeypair]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Mint Tokens', async () => { + it("Mint Tokens", async () => { await getOrCreateAssociatedTokenAccount( connection, wallet.payer, @@ -44,10 +59,20 @@ describe('transfer-fee', () => { ASSOCIATED_PROGRAM_ID, ); - await mintTo(connection, wallet.payer, mintKeypair.publicKey, senderTokenAccountAddress, wallet.payer, 300, [], null, TOKEN_2022_PROGRAM_ID); + await mintTo( + connection, + wallet.payer, + mintKeypair.publicKey, + senderTokenAccountAddress, + wallet.payer, + 300, + [], + null, + TOKEN_2022_PROGRAM_ID, + ); }); - it('Transfer', async () => { + it("Transfer", async () => { const transactionSignature = await program.methods .transfer(new anchor.BN(100)) .accounts({ @@ -58,10 +83,10 @@ describe('transfer-fee', () => { recipientTokenAccount: recipientTokenAccountAddress, }) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Transfer Again, fee limit by maximumFee', async () => { + it("Transfer Again, fee limit by maximumFee", async () => { const transactionSignature = await program.methods .transfer(new anchor.BN(200)) .accounts({ @@ -72,10 +97,10 @@ describe('transfer-fee', () => { recipientTokenAccount: recipientTokenAccountAddress, }) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Harvest Transfer Fees to Mint Account', async () => { + it("Harvest Transfer Fees to Mint Account", async () => { const transactionSignature = await program.methods .harvest() .accounts({ mintAccount: mintKeypair.publicKey }) @@ -87,10 +112,10 @@ describe('transfer-fee', () => { }, ]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Withdraw Transfer Fees from Mint Account', async () => { + it("Withdraw Transfer Fees from Mint Account", async () => { const transactionSignature = await program.methods .withdraw() .accounts({ @@ -98,10 +123,10 @@ describe('transfer-fee', () => { tokenAccount: senderTokenAccountAddress, }) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); - it('Update Transfer Fee', async () => { + it("Update Transfer Fee", async () => { const transferFeeBasisPoints = 0; const maximumFee = 0; @@ -109,6 +134,6 @@ describe('transfer-fee', () => { .updateFee(transferFeeBasisPoints, new anchor.BN(maximumFee)) .accounts({ mintAccount: mintKeypair.publicKey }) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); }); diff --git a/tokens/token-2022/transfer-fee/native/tests/test.ts b/tokens/token-2022/transfer-fee/native/tests/test.ts index c0f846883..e6cde2528 100644 --- a/tokens/token-2022/transfer-fee/native/tests/test.ts +++ b/tokens/token-2022/transfer-fee/native/tests/test.ts @@ -1,25 +1,31 @@ -import { Buffer } from 'node:buffer'; -import { describe, test } from 'node:test'; -import { TOKEN_2022_PROGRAM_ID } from '@solana/spl-token'; -import { Keypair, PublicKey, SYSVAR_RENT_PUBKEY, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js'; -import * as borsh from 'borsh'; -import { assert } from 'chai'; -import { start } from 'solana-bankrun'; - - -const CreateTokenArgsSchema = { struct: { token_decimals: 'u8' } }; +import { Buffer } from "node:buffer"; +import { describe, test } from "node:test"; +import { TOKEN_2022_PROGRAM_ID } from "@solana/spl-token"; +import { + Keypair, + PublicKey, + SYSVAR_RENT_PUBKEY, + SystemProgram, + Transaction, + TransactionInstruction, +} from "@solana/web3.js"; +import * as borsh from "borsh"; +import { assert } from "chai"; +import { start } from "solana-bankrun"; + +const CreateTokenArgsSchema = { struct: { token_decimals: "u8" } }; function borshSerialize(schema: borsh.Schema, data: object): Buffer { return Buffer.from(borsh.serialize(schema, data)); } -describe('Create Token', async () => { +describe("Create Token", async () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start([{ name: 'token_2022_transfer_fees_program', programId: PROGRAM_ID }], []); + const context = await start([{ name: "token_2022_transfer_fees_program", programId: PROGRAM_ID }], []); const client = context.banksClient; const payer = context.payer; - test('Create a Token-22 SPL-Token !', async () => { + test("Create a Token-22 SPL-Token !", async () => { const blockhash = context.lastBlockhash; const mintKeypair: Keypair = Keypair.generate(); @@ -47,6 +53,6 @@ describe('Create Token', async () => { const transaction = await client.processTransaction(tx); assert(transaction.logMessages[0].startsWith(`Program ${PROGRAM_ID}`)); - console.log('Token Mint Address: ', mintKeypair.publicKey.toBase58()); + console.log("Token Mint Address: ", mintKeypair.publicKey.toBase58()); }); }); diff --git a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/.prettierrc b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/.prettierrc deleted file mode 100644 index d2f009f9d..000000000 --- a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/.prettierrc +++ /dev/null @@ -1,10 +0,0 @@ -{ - "tabWidth": 2, - "useTabs": false, - "singleQuote": false, - "printWidth": 80, - "trailingComma": "all", - "arrowParens": "avoid", - "endOfLine": "auto", - "proseWrap": "always" -} diff --git a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/Anchor.toml b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/Anchor.toml index 3ad7e2a52..1907597b1 100644 --- a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/Anchor.toml +++ b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -transfer_hook = "1qahDxKHeCLZhbBU2NyMU6vQCQmEUmdeSEBrG5drffK" - -# [registry] section removed — no longer used in Anchor 1.0 +transfer_hook = "9H8q3XCs1iCCPV7bshK88geGPQQ5jMPySbyNa35ctHyF" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 100000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/migrations/deploy.ts b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/migrations/deploy.ts +++ b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/package.json b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/package.json index 3c254f5f9..466b8ee71 100644 --- a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/package.json +++ b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/package.json @@ -1,24 +1,24 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.0", - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/chai-as-promised": "^7.1.8", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "chai-as-promised": "^7.1.2", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.0", + "@solana/web3.js": "^1.98.4" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/chai-as-promised": "^7.1.8", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.2", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/pnpm-lock.yaml b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/pnpm-lock.yaml index 17b058e96..fc594a80b 100644 --- a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) '@solana/spl-token': specifier: ^0.4.0 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) @@ -51,18 +51,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.29.2': @@ -797,16 +797,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) bn.js: 5.2.2 @@ -824,7 +824,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.29.2': {} diff --git a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/Cargo.toml b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/Cargo.toml index ff4cc96fd..841067236 100644 --- a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/Cargo.toml +++ b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/Cargo.toml @@ -20,12 +20,18 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" -anchor-spl = "1.0.0-rc.5" +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" spl-discriminator = "0.4.1" spl-tlv-account-resolution = "0.9.0" spl-transfer-hook-interface = "0.9.0" +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs index c485708a6..44db67886 100644 --- a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/src/lib.rs @@ -23,7 +23,7 @@ use spl_transfer_hook_interface::instruction::{ ExecuteInstruction, InitializeExtraAccountMetaListInstruction, }; -declare_id!("1qahDxKHeCLZhbBU2NyMU6vQCQmEUmdeSEBrG5drffK"); +declare_id!("9H8q3XCs1iCCPV7bshK88geGPQQ5jMPySbyNa35ctHyF"); #[error_code] pub enum TransferError { diff --git a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs new file mode 100644 index 000000000..4bcf15b17 --- /dev/null +++ b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/programs/transfer-hook/tests/test_transfer_hook.rs @@ -0,0 +1,154 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, create_token_extensions_mint, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + MintExtension, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::{build_hook_accounts, get_hook_accounts_address, HookAccount}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_hook::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_hook.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_transfer_hook_account_data_as_seed() { + let (mut svm, program_id, payer) = setup(); + let recipient = Keypair::new(); + let decimals: u8 = 9; + + // PDAs + let (counter_pda, _) = + Pubkey::find_program_address(&[b"counter", payer.pubkey().as_ref()], &program_id); + + // Step 1: Create mint with TransferHook extension + let mint = create_token_extensions_mint( + &mut svm, + &payer, + decimals, + None, + &[MintExtension::TransferHook { + program_id: program_id, + }], + ) + .unwrap(); + svm.expire_blockhash(); + + let extra_account_meta_list = + get_hook_accounts_address(&mint, &program_id); + + // Step 2: Create token accounts and mint tokens + let amount: u64 = 100 * 10u64.pow(decimals as u32); + let source_ata = create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source_ata, + amount, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Initialize ExtraAccountMetaList (also creates counter PDA) + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), + transfer_hook::accounts::InitializeExtraAccountMetaList { + payer: payer.pubkey(), + extra_account_meta_list, + mint, + counter_account: counter_pda, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Transfer with hook + let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); + let extra_accounts = build_hook_accounts( + &mint, + &program_id, + &[HookAccount { + pubkey: counter_pda, + is_signer: false, + is_writable: true, + }], + ); + transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint, + &dest_ata, + &payer, + transfer_amount, + decimals, + &extra_accounts, + ).unwrap(); + svm.expire_blockhash(); + + // Step 5: Try calling transfer_hook directly (should fail — not transferring) + let direct_hook_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::TransferHook { amount: 1 }.data(), + transfer_hook::accounts::TransferHook { + source_token: source_ata, + mint, + destination_token: dest_ata, + owner: payer.pubkey(), + extra_account_meta_list, + counter_account: counter_pda, + } + .to_account_metas(None), + ); + let result = send_transaction_from_instructions(&mut svm, vec![direct_hook_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Calling transfer_hook directly should fail because token is not transferring" + ); +} diff --git a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/tests/transfer-hook.ts b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/tests/transfer-hook.ts index cac2820fe..b13374d8c 100644 --- a/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/tests/transfer-hook.ts +++ b/tokens/token-2022/transfer-hook/account-data-as-seed/anchor/tests/transfer-hook.ts @@ -1,5 +1,5 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; import { ASSOCIATED_TOKEN_PROGRAM_ID, createAssociatedTokenAccountInstruction, @@ -11,16 +11,23 @@ import { getAssociatedTokenAddressSync, getMintLen, TOKEN_2022_PROGRAM_ID, -} from '@solana/spl-token'; -import { Keypair, PublicKey, SendTransactionError, SystemProgram, sendAndConfirmTransaction, Transaction } from '@solana/web3.js'; -import { BN } from 'bn.js'; -import chai, { expect } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import type { TransferHook } from '../target/types/transfer_hook'; +} from "@solana/spl-token"; +import { + Keypair, + PublicKey, + SendTransactionError, + SystemProgram, + sendAndConfirmTransaction, + Transaction, +} from "@solana/web3.js"; +import { BN } from "bn.js"; +import chai, { expect } from "chai"; +import chaiAsPromised from "chai-as-promised"; +import type { TransferHook } from "../target/types/transfer_hook"; chai.use(chaiAsPromised); -describe('transfer-hook', () => { +describe("transfer-hook", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); @@ -55,13 +62,16 @@ describe('transfer-hook', () => { // ExtraAccountMetaList address // Store extra accounts required by the custom transfer hook instruction const [extraAccountMetaListPDA] = PublicKey.findProgramAddressSync( - [Buffer.from('extra-account-metas'), mint.publicKey.toBuffer()], + [Buffer.from("extra-account-metas"), mint.publicKey.toBuffer()], program.programId, ); - const [counterPDA] = PublicKey.findProgramAddressSync([Buffer.from('counter'), wallet.publicKey.toBuffer()], program.programId); + const [counterPDA] = PublicKey.findProgramAddressSync( + [Buffer.from("counter"), wallet.publicKey.toBuffer()], + program.programId, + ); - it('Create Mint Account with Transfer Hook Extension', async () => { + it("Create Mint Account with Transfer Hook Extension", async () => { const extensions = [ExtensionType.TransferHook]; const mintLen = getMintLen(extensions); const lamports = await provider.connection.getMinimumBalanceForRentExemption(mintLen); @@ -85,12 +95,12 @@ describe('transfer-hook', () => { const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer, mint], { skipPreflight: true, - commitment: 'finalized', + commitment: "finalized", }); const txDetails = await program.provider.connection.getTransaction(txSig, { maxSupportedTransactionVersion: 0, - commitment: 'confirmed', + commitment: "confirmed", }); console.log(txDetails.meta.logMessages); @@ -99,7 +109,7 @@ describe('transfer-hook', () => { // Create the two token accounts for the transfer-hook enabled mint // Fund the sender token account with 100 tokens - it('Create Token Accounts and Mint Tokens', async () => { + it("Create Token Accounts and Mint Tokens", async () => { // 100 tokens const amount = 100 * 10 ** decimals; @@ -129,7 +139,7 @@ describe('transfer-hook', () => { }); // Account to store extra accounts required by the transfer hook instruction - it('Create ExtraAccountMetaList Account', async () => { + it("Create ExtraAccountMetaList Account", async () => { const initializeExtraAccountMetaListInstruction = await program.methods .initializeExtraAccountMetaList() .accounts({ @@ -139,11 +149,14 @@ describe('transfer-hook', () => { const transaction = new Transaction().add(initializeExtraAccountMetaListInstruction); - const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer], { skipPreflight: true, commitment: 'confirmed' }); - console.log('Transaction Signature:', txSig); + const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer], { + skipPreflight: true, + commitment: "confirmed", + }); + console.log("Transaction Signature:", txSig); }); - it('Transfer Hook with Extra Account Meta', async () => { + it("Transfer Hook with Extra Account Meta", async () => { // 1 tokens const amount = 1 * 10 ** decimals; const amountBigInt = BigInt(amount); @@ -157,7 +170,7 @@ describe('transfer-hook', () => { amountBigInt, decimals, [], - 'confirmed', + "confirmed", TOKEN_2022_PROGRAM_ID, ); @@ -168,10 +181,10 @@ describe('transfer-hook', () => { const transaction = new Transaction().add(transferInstructionWithHelper); const txSig = await sendAndConfirmTransaction(connection, transaction, [wallet.payer], { skipPreflight: true }); - console.log('Transfer Signature:', txSig); + console.log("Transfer Signature:", txSig); }); - it('Try call transfer hook without transfer', async () => { + it("Try call transfer hook without transfer", async () => { const transferHookIx = await program.methods .transferHook(new BN(1)) .accounts({ diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/.prettierrc b/tokens/token-2022/transfer-hook/allow-block-list-token/.prettierrc deleted file mode 100644 index d6c3437b9..000000000 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/.prettierrc +++ /dev/null @@ -1,7 +0,0 @@ -{ - "arrowParens": "always", - "printWidth": 120, - "semi": false, - "singleQuote": true, - "trailingComma": "all" -} diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/Anchor.toml b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/Anchor.toml index f449ee744..d517c1a46 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/Anchor.toml +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/Anchor.toml @@ -16,4 +16,4 @@ cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "../node_modules/.bin/jest --preset ts-jest" +test = "cargo test" diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/Cargo.toml b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/Cargo.toml index 60684ee07..f6d424dbe 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/Cargo.toml +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/Cargo.toml @@ -21,10 +21,9 @@ custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release # interface-instructions feature removed in Anchor 1.0 -anchor-lang = "1.0.0-rc.5" -anchor-spl = { version = "1.0.0-rc.5", features = [ +anchor-lang = "1.0.0" +anchor-spl = { version = "1.0.0", features = [ "token_2022_extensions", "token_2022", ] } @@ -34,6 +33,11 @@ spl-transfer-hook-interface = { version = "2.1.0" } spl-discriminator = "0.5.1" [dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/lib.rs b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/lib.rs index b3c370483..f8643aa66 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/lib.rs +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/src/lib.rs @@ -13,7 +13,7 @@ pub use instructions::*; pub use state::*; pub use utils::*; -declare_id!("3ku1ZEGvBEEfhaYsAzBZuecTPEa58ZRhoVqHVGpGxVGi"); +declare_id!("9kSUqBeRgchrr9HpGneGHxqZ19qLTYzRyYYm2qQgtDmU"); #[program] pub mod abl_token { diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/tests/test_abl_token.rs b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/tests/test_abl_token.rs new file mode 100644 index 000000000..286d30604 --- /dev/null +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/programs/abl-token/tests/test_abl_token.rs @@ -0,0 +1,86 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::TOKEN_EXTENSIONS_PROGRAM_ID, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = abl_token::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/abl_token.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_init_config_and_init_mint() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + + // Derive PDAs + let (config_pda, _) = + Pubkey::find_program_address(&[b"config"], &program_id); + let (extra_account_meta_list, _) = Pubkey::find_program_address( + &[b"extra-account-metas", mint_keypair.pubkey().as_ref()], + &program_id, + ); + + // Step 1: Initialize config + let init_config_ix = Instruction::new_with_bytes( + program_id, + &abl_token::instruction::InitConfig {}.data(), + abl_token::accounts::InitConfig { + payer: payer.pubkey(), + config: config_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_config_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 2: Initialize mint with transfer hook and metadata + let init_mint_args = abl_token::instructions::InitMintArgs { + name: "Test Token".to_string(), + symbol: "TEST".to_string(), + uri: "https://test.com".to_string(), + decimals: 6, + mint_authority: payer.pubkey(), + freeze_authority: payer.pubkey(), + permanent_delegate: payer.pubkey(), + transfer_hook_authority: payer.pubkey(), + mode: abl_token::Mode::Allow, + threshold: 0, + }; + let init_mint_ix = Instruction::new_with_bytes( + program_id, + &abl_token::instruction::InitMint { + args: init_mint_args, + } + .data(), + abl_token::accounts::InitMint { + payer: payer.pubkey(), + mint: mint_keypair.pubkey(), + extra_metas_account: extra_account_meta_list, + system_program: system_program::id(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_mint_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); +} diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/src/abl-token-exports.ts b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/src/abl-token-exports.ts index 6d4b27af6..9e147ff51 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/src/abl-token-exports.ts +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/src/abl-token-exports.ts @@ -1,8 +1,8 @@ // Here we export some useful types and functions for interacting with the Anchor program. -import { AnchorProvider, Program } from '@anchor-lang/core'; -import { Cluster, PublicKey } from '@solana/web3.js'; -import ABLTokenIDL from '../target/idl/abl_token.json'; -import type { AblToken } from '../target/types/abl_token'; +import { type AnchorProvider, Program } from "@anchor-lang/core"; +import { type Cluster, PublicKey } from "@solana/web3.js"; +import ABLTokenIDL from "../target/idl/abl_token.json"; +import type { AblToken } from "../target/types/abl_token"; // Re-export the generated IDL and type export { ABLTokenIDL }; @@ -12,16 +12,22 @@ export const ABL_TOKEN_PROGRAM_ID = new PublicKey(ABLTokenIDL.address); // This is a helper function to get the Basic Anchor program. export function getABLTokenProgram(provider: AnchorProvider, address?: PublicKey): Program { - return new Program({ ...ABLTokenIDL, address: address ? address.toBase58() : ABLTokenIDL.address } as AblToken, provider); + return new Program( + { + ...ABLTokenIDL, + address: address ? address.toBase58() : ABLTokenIDL.address, + } as AblToken, + provider, + ); } // This is a helper function to get the program ID for the Basic program depending on the cluster. export function getABLTokenProgramId(cluster: Cluster) { switch (cluster) { - case 'devnet': - case 'testnet': + case "devnet": + case "testnet": // This is the program ID for the Basic program on devnet and testnet. - return new PublicKey('6z68wfurCMYkZG51s1Et9BJEd9nJGUusjHXNt4dGbNNF'); + return new PublicKey("6z68wfurCMYkZG51s1Et9BJEd9nJGUusjHXNt4dGbNNF"); default: return ABL_TOKEN_PROGRAM_ID; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/src/index.ts b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/src/index.ts index 04fdd85fb..d7552798e 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/src/index.ts +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/src/index.ts @@ -1 +1 @@ -export * from './abl-token-exports'; +export * from "./abl-token-exports"; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/tests/basic.test.ts b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/tests/basic.test.ts index c024a5251..b4c288f90 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/tests/basic.test.ts +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/anchor/tests/basic.test.ts @@ -1,14 +1,14 @@ -import * as anchor from '@anchor-lang/core'; -import { Program } from '@anchor-lang/core'; -import { AblToken } from '../target/types/abl_token'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import type { AblToken } from "../target/types/abl_token"; -describe('abl-token', () => { +describe("abl-token", () => { // Configure the client to use the local cluster. anchor.setProvider(anchor.AnchorProvider.env()); const _program = anchor.workspace.ABLToken as Program; - it('should run the program', async () => { + it("should run the program", async () => { // Add your test here. }); }); diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/eslint.config.mjs b/tokens/token-2022/transfer-hook/allow-block-list-token/eslint.config.mjs index 835e40116..6bcf64707 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/eslint.config.mjs +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/eslint.config.mjs @@ -1,6 +1,6 @@ -import { dirname } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { FlatCompat } from '@eslint/eslintrc'; +import { dirname } from "node:path"; +import { fileURLToPath } from "node:url"; +import { FlatCompat } from "@eslint/eslintrc"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -9,6 +9,6 @@ const compat = new FlatCompat({ baseDirectory: __dirname, }); -const eslintConfig = [...compat.extends('next/core-web-vitals', 'next/typescript')]; +const eslintConfig = [...compat.extends("next/core-web-vitals", "next/typescript")]; export default eslintConfig; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/next.config.ts b/tokens/token-2022/transfer-hook/allow-block-list-token/next.config.ts index 5e891cf00..e9ffa3083 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/next.config.ts +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/next.config.ts @@ -1,4 +1,4 @@ -import type { NextConfig } from 'next'; +import type { NextConfig } from "next"; const nextConfig: NextConfig = { /* config options here */ diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/package.json b/tokens/token-2022/transfer-hook/allow-block-list-token/package.json index e6885b10e..0ee93b631 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/package.json +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/package.json @@ -1,58 +1,58 @@ { - "name": "legacy-next-tailwind-basic", - "version": "0.0.0", - "private": true, - "scripts": { - "anchor": "cd anchor && anchor", - "anchor-build": "cd anchor && anchor build", - "anchor-localnet": "cd anchor && anchor localnet", - "anchor-test": "cd anchor && anchor test", - "build": "next build", - "ci": "npm run build && npm run lint && npm run format:check", - "dev": "next dev --turbopack", - "format": "prettier --write .", - "format:check": "prettier --check .", - "lint": "next lint", - "start": "next start" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@radix-ui/react-dialog": "^1.1.14", - "@radix-ui/react-dropdown-menu": "^2.1.15", - "@radix-ui/react-label": "^2.1.7", - "@radix-ui/react-slot": "^1.2.3", - "@solana/spl-token": "0.4.13", - "@solana/wallet-adapter-base": "0.9.27", - "@solana/wallet-adapter-react": "0.15.39", - "@solana/wallet-adapter-react-ui": "0.9.39", - "@solana/web3.js": "^1.98.4", - "@tanstack/react-query": "^5.82.0", - "class-variance-authority": "^0.7.1", - "clsx": "^2.1.1", - "jotai": "^2.12.5", - "lucide-react": "^0.525.0", - "next": "15.3.5", - "next-themes": "^0.4.6", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "sonner": "^2.0.6", - "tailwind-merge": "^3.3.1", - "tw-animate-css": "^1.3.5" - }, - "devDependencies": { - "@eslint/eslintrc": "^3.3.1", - "@tailwindcss/postcss": "^4.1.4", - "@types/bn.js": "^5.1.6", - "@types/jest": "^29.5.14", - "@types/node": "^22.15.3", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.2", - "eslint": "^9.25.1", - "eslint-config-next": "15.3.1", - "jest": "^29.7.0", - "prettier": "^3.5.3", - "tailwindcss": "^4.1.4", - "ts-jest": "^29.3.2", - "typescript": "^5.8.3" - } + "name": "legacy-next-tailwind-basic", + "version": "0.0.0", + "private": true, + "scripts": { + "anchor": "cd anchor && anchor", + "anchor-build": "cd anchor && anchor build", + "anchor-localnet": "cd anchor && anchor localnet", + "anchor-test": "cd anchor && anchor test", + "build": "next build", + "ci": "npm run build && npm run lint && npm run format:check", + "dev": "next dev --turbopack", + "format": "prettier --write .", + "format:check": "prettier --check .", + "lint": "next lint", + "start": "next start" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@radix-ui/react-dialog": "^1.1.14", + "@radix-ui/react-dropdown-menu": "^2.1.15", + "@radix-ui/react-label": "^2.1.7", + "@radix-ui/react-slot": "^1.2.3", + "@solana/spl-token": "0.4.13", + "@solana/wallet-adapter-base": "0.9.27", + "@solana/wallet-adapter-react": "0.15.39", + "@solana/wallet-adapter-react-ui": "0.9.39", + "@solana/web3.js": "^1.98.4", + "@tanstack/react-query": "^5.82.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "jotai": "^2.12.5", + "lucide-react": "^0.525.0", + "next": "15.3.5", + "next-themes": "^0.4.6", + "react": "^19.1.0", + "react-dom": "^19.1.0", + "sonner": "^2.0.6", + "tailwind-merge": "^3.3.1", + "tw-animate-css": "^1.3.5" + }, + "devDependencies": { + "@eslint/eslintrc": "^3.3.1", + "@tailwindcss/postcss": "^4.1.4", + "@types/bn.js": "^5.1.6", + "@types/jest": "^29.5.14", + "@types/node": "^22.15.3", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "eslint": "^9.25.1", + "eslint-config-next": "15.3.1", + "jest": "^29.7.0", + "prettier": "^3.5.3", + "tailwindcss": "^4.1.4", + "ts-jest": "^29.3.2", + "typescript": "^5.8.3" + } } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/pnpm-lock.yaml b/tokens/token-2022/transfer-hook/allow-block-list-token/pnpm-lock.yaml index 86e88fcf3..669a20099 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/pnpm-lock.yaml +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@radix-ui/react-dialog': specifier: ^1.1.14 version: 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -124,18 +124,18 @@ packages: resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} engines: {node: '>=10'} - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/code-frame@7.27.1': @@ -4226,16 +4226,16 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -4253,7 +4253,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/code-frame@7.27.1': dependencies: diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/postcss.config.mjs b/tokens/token-2022/transfer-hook/allow-block-list-token/postcss.config.mjs index ba720fe55..c7bcb4b1e 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/postcss.config.mjs +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/postcss.config.mjs @@ -1,5 +1,5 @@ const config = { - plugins: ['@tailwindcss/postcss'], + plugins: ["@tailwindcss/postcss"], }; export default config; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/account/[address]/page.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/account/[address]/page.tsx index 5bb6688e9..0f46f881f 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/account/[address]/page.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/account/[address]/page.tsx @@ -1,5 +1,5 @@ -import AccountDetailFeature from '@/components/account/account-detail-feature' +import AccountDetailFeature from "@/components/account/account-detail-feature"; export default function Page() { - return + return ; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/account/page.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/account/page.tsx index 1b0e27684..cf7d07d31 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/account/page.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/account/page.tsx @@ -1,5 +1,5 @@ -import AccountListFeature from '@/components/account/account-list-feature' +import AccountListFeature from "@/components/account/account-list-feature"; export default function Page() { - return + return ; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/config/page.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/config/page.tsx index e1cde08f1..15749c63c 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/config/page.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/config/page.tsx @@ -1,6 +1,5 @@ - -import AblTokenConfig from '@/components/abl-token/abl-token-config' +import AblTokenConfig from "@/components/abl-token/abl-token-config"; export default function Page() { - return + return ; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/create-token/page.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/create-token/page.tsx index 39c705292..93a0c913e 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/create-token/page.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/create-token/page.tsx @@ -1,5 +1,5 @@ -import AblTokenFeature from '@/components/abl-token/abl-token-feature' +import AblTokenFeature from "@/components/abl-token/abl-token-feature"; export default function Page() { - return + return ; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/globals.css b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/globals.css index 2edb31d83..00bfb4477 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/globals.css +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/globals.css @@ -1,5 +1,5 @@ -@import 'tailwindcss'; -@import 'tw-animate-css'; +@import "tailwindcss"; +@import "tw-animate-css"; @custom-variant dark (&:is(.dark *)); @@ -121,7 +121,7 @@ } .wallet-adapter-button-trigger { - height: auto !important; + height: auto; @apply !border !bg-background !shadow-xs hover:!bg-accent !text-accent-foreground hover:!text-accent-foreground dark:!bg-input/30 !border-input/10 dark:!border-input dark:hover:!bg-input/50; @apply !px-2 !py-[6px] !rounded-md !text-sm !font-semibold !shadow-sm !transition-all; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/layout.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/layout.tsx index 6cfdc1d13..7cc19d2be 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/layout.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/layout.tsx @@ -1,22 +1,22 @@ -import type { Metadata } from 'next' -import './globals.css' -import { AppProviders } from '@/components/app-providers' -import { AppLayout } from '@/components/app-layout' -import React from 'react' +import type { Metadata } from "next"; +import "./globals.css"; +import type React from "react"; +import { AppLayout } from "@/components/app-layout"; +import { AppProviders } from "@/components/app-providers"; export const metadata: Metadata = { - title: 'ABL Token', - description: 'ABL Token', -} + title: "ABL Token", + description: "ABL Token", +}; const links: { label: string; path: string }[] = [ // More links... - { label: 'Home', path: '/' }, - { label: 'Account', path: '/account' }, - { label: 'Config', path: '/config' }, - { label: 'Create New Token', path: '/create-token' }, - { label: 'Manage Token', path: '/manage-token' }, -] + { label: "Home", path: "/" }, + { label: "Account", path: "/account" }, + { label: "Config", path: "/config" }, + { label: "Create New Token", path: "/create-token" }, + { label: "Manage Token", path: "/manage-token" }, +]; export default function RootLayout({ children }: Readonly<{ children: React.ReactNode }>) { return ( @@ -27,15 +27,15 @@ export default function RootLayout({ children }: Readonly<{ children: React.Reac - ) + ); } // Patch BigInt so we can log it using JSON.stringify without any errors declare global { interface BigInt { - toJSON(): string + toJSON(): string; } } BigInt.prototype.toJSON = function () { - return this.toString() -} + return this.toString(); +}; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/manage-token/[address]/page.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/manage-token/[address]/page.tsx index 7a5c53e12..b7cd18e03 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/manage-token/[address]/page.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/manage-token/[address]/page.tsx @@ -1,5 +1,5 @@ -import AblTokenManageTokenDetail from '@/components/abl-token/abl-token-manage-token-detail' +import AblTokenManageTokenDetail from "@/components/abl-token/abl-token-manage-token-detail"; export default function Page() { - return + return ; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/manage-token/page.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/manage-token/page.tsx index 175476840..8c33d78e8 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/manage-token/page.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/manage-token/page.tsx @@ -1,5 +1,5 @@ -import AblTokenManageToken from '@/components/abl-token/abl-token-manage-token' +import AblTokenManageToken from "@/components/abl-token/abl-token-manage-token"; export default function Page() { - return + return ; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/page.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/page.tsx index b0e9cd11b..a7d176adc 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/page.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/app/page.tsx @@ -1,5 +1,5 @@ -import { DashboardFeature } from '@/components/dashboard/dashboard-feature' +import { DashboardFeature } from "@/components/dashboard/dashboard-feature"; export default function Home() { - return + return ; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-config.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-config.tsx index 57a42b9fd..6cfd261e2 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-config.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-config.tsx @@ -1,18 +1,18 @@ -'use client' +"use client"; -import { useWallet } from '@solana/wallet-adapter-react' -import { ExplorerLink } from '../cluster/cluster-ui' -import { WalletButton } from '../solana/solana-provider' -import { useAblTokenProgram } from './abl-token-data-access' -import { AppHero } from '../app-hero' -import { ellipsify } from '@/lib/utils' -import { Button } from '@/components/ui/button' -import React from 'react' -import { PublicKey } from '@solana/web3.js' +import { useWallet } from "@solana/wallet-adapter-react"; +import { PublicKey } from "@solana/web3.js"; +import React from "react"; +import { Button } from "@/components/ui/button"; +import { ellipsify } from "@/lib/utils"; +import { AppHero } from "../app-hero"; +import { ExplorerLink } from "../cluster/cluster-ui"; +import { WalletButton } from "../solana/solana-provider"; +import { useAblTokenProgram } from "./abl-token-data-access"; export default function AblTokenConfig() { - const { publicKey } = useWallet() - const { programId, getConfig, getAbWallets } = useAblTokenProgram() + const { publicKey } = useWallet(); + const { programId, getConfig, getAbWallets } = useAblTokenProgram(); const config = getConfig.data; let abWallets = getAbWallets.data; @@ -20,11 +20,11 @@ export default function AblTokenConfig() { const handleWalletListUpdate = React.useCallback(async () => { await getAbWallets.refetch(); abWallets = getAbWallets.data; - }, []) + }, [getAbWallets.refetch, getAbWallets.data]); return publicKey ? (
- +

@@ -56,13 +56,12 @@ export default function AblTokenConfig() {
- ) + ); } - export function AblTokenConfigCreate() { - const { initConfig, getConfig } = useAblTokenProgram() - const { publicKey } = useWallet() + const { initConfig, getConfig } = useAblTokenProgram(); + const { publicKey } = useWallet(); const handleCreate = async () => { if (!publicKey) return; @@ -71,7 +70,7 @@ export function AblTokenConfigCreate() { // Refresh the config list getConfig.refetch(); } catch (err) { - console.error('Failed to create config:', err); + console.error("Failed to create config:", err); } }; @@ -81,17 +80,23 @@ export function AblTokenConfigCreate() {

Initialize the ABL Token configuration. This will set up the necessary accounts for managing allow/block lists.

- ); } -export function AblTokenConfigList({ abWallets }: { abWallets: {publicKey: PublicKey, account: {wallet: PublicKey, allowed: boolean}}[] | undefined }) { +export function AblTokenConfigList({ + abWallets, +}: { + abWallets: + | { + publicKey: PublicKey; + account: { wallet: PublicKey; allowed: boolean }; + }[] + | undefined; +}) { return (

ABL Token Config List

@@ -109,8 +114,8 @@ export function AblTokenConfigList({ abWallets }: { abWallets: {publicKey: Publi {wallet.account.wallet.toString()} - - {wallet.account.allowed ? 'Allowed' : 'Blocked'} + + {wallet.account.allowed ? "Allowed" : "Blocked"} @@ -127,139 +132,139 @@ export function AblTokenConfigList({ abWallets }: { abWallets: {publicKey: Publi interface WalletChange { address: string; - mode: 'allow' | 'block' | 'remove'; - status?: 'pending' | 'success' | 'error'; + mode: "allow" | "block" | "remove"; + status?: "pending" | "success" | "error"; error?: string; } export function AblTokenConfigListChange({ onWalletListUpdate }: { onWalletListUpdate: () => void }) { - const { getAbWallets, processBatchWallets } = useAblTokenProgram() - const [isEditing, setIsEditing] = React.useState(false) - const [walletChanges, setWalletChanges] = React.useState([]) - const [isProcessing, setIsProcessing] = React.useState(false) + const { getAbWallets, processBatchWallets } = useAblTokenProgram(); + const [isEditing, setIsEditing] = React.useState(false); + const [walletChanges, setWalletChanges] = React.useState([]); + const [isProcessing, setIsProcessing] = React.useState(false); const existingWallets = React.useMemo(() => { - const wallets = getAbWallets.data || [] - return new Map(wallets.map(w => [w.account.wallet.toString(), w.account.allowed])) - }, [getAbWallets.data]) + const wallets = getAbWallets.data || []; + return new Map(wallets.map((w) => [w.account.wallet.toString(), w.account.allowed])); + }, [getAbWallets.data]); const handleDragOver = (e: React.DragEvent) => { - e.preventDefault() - } + e.preventDefault(); + }; const handleDrop = async (e: React.DragEvent) => { - e.preventDefault() - const file = e.dataTransfer.files[0] - if (file && file.type === 'text/csv') { - const text = await file.text() - const rows = text.split('\n') - + e.preventDefault(); + const file = e.dataTransfer.files[0]; + if (file && file.type === "text/csv") { + const text = await file.text(); + const rows = text.split("\n"); + // Create a Set of existing wallet addresses for deduplication const existingAddresses = new Set([ ...Array.from(existingWallets.keys()), - ...walletChanges.map(w => w.address) - ]) - + ...walletChanges.map((w) => w.address), + ]); + const parsed: WalletChange[] = rows - .filter(row => row.trim()) - .map(row => { - const [address, mode] = row.split(',').map(field => field.trim()) + .filter((row) => row.trim()) + .map((row) => { + const [address, mode] = row.split(",").map((field) => field.trim()); return { address, - mode: mode.toLowerCase() as 'allow' | 'block' | 'remove' - } + mode: mode.toLowerCase() as "allow" | "block" | "remove", + }; }) - .filter(entry => { + .filter((entry) => { try { - new PublicKey(entry.address) - return ['allow', 'block', 'remove'].includes(entry.mode) + new PublicKey(entry.address); + return ["allow", "block", "remove"].includes(entry.mode); } catch { - return false + return false; } }) - .filter(entry => { + .filter((entry) => { // Only allow 'remove' for existing wallets - if (entry.mode === 'remove') { - return existingWallets.has(entry.address) + if (entry.mode === "remove") { + return existingWallets.has(entry.address); } - return true + return true; }) // Deduplicate entries, keeping the last occurrence of each address .reduce((acc, entry) => { - const existingIndex = acc.findIndex(w => w.address === entry.address) + const existingIndex = acc.findIndex((w) => w.address === entry.address); if (existingIndex >= 0) { - acc[existingIndex] = entry + acc[existingIndex] = entry; } else { - acc.push(entry) + acc.push(entry); } - return acc + return acc; }, [] as WalletChange[]) // Filter out entries that already exist in the current state - .filter(entry => !existingAddresses.has(entry.address)) + .filter((entry) => !existingAddresses.has(entry.address)); if (parsed.length > 0) { - setWalletChanges(prev => [...prev, ...parsed]) - setIsEditing(true) + setWalletChanges((prev) => [...prev, ...parsed]); + setIsEditing(true); } } - } + }; const handleAddWallet = () => { - setWalletChanges(prev => [...prev, { address: '', mode: 'allow' }]) - setIsEditing(true) - } + setWalletChanges((prev) => [...prev, { address: "", mode: "allow" }]); + setIsEditing(true); + }; const handleUpdateWallet = (index: number, field: keyof WalletChange, value: string) => { - setWalletChanges(prev => prev.map((wallet, i) => - i === index ? { ...wallet, [field]: value } : wallet - )) - } + setWalletChanges((prev) => prev.map((wallet, i) => (i === index ? { ...wallet, [field]: value } : wallet))); + }; const handleRemoveWallet = (index: number) => { - setWalletChanges(prev => prev.filter((_, i) => i !== index)) - } + setWalletChanges((prev) => prev.filter((_, i) => i !== index)); + }; const processWallets = async () => { - setIsProcessing(true) - const batchSize = 10 - const batches = [] - + setIsProcessing(true); + const batchSize = 10; + const batches = []; + for (let i = 0; i < walletChanges.length; i += batchSize) { - batches.push(walletChanges.slice(i, i + batchSize)) + batches.push(walletChanges.slice(i, i + batchSize)); } for (const batch of batches) { try { await processBatchWallets.mutateAsync({ - wallets: batch.map(w => ({ + wallets: batch.map((w) => ({ wallet: new PublicKey(w.address), - mode: w.mode - })) - }) - + mode: w.mode, + })), + }); + // Mark batch as successful - setWalletChanges(prev => prev.map(wallet => - batch.some(b => b.address === wallet.address) - ? { ...wallet, status: 'success' } - : wallet - )) + setWalletChanges((prev) => + prev.map((wallet) => + batch.some((b) => b.address === wallet.address) ? { ...wallet, status: "success" } : wallet, + ), + ); } catch (error: unknown) { - const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred' + const errorMessage = error instanceof Error ? error.message : "Unknown error occurred"; // Mark batch as failed - setWalletChanges(prev => prev.map(wallet => - batch.some(b => b.address === wallet.address) - ? { ...wallet, status: 'error', error: errorMessage } - : wallet - )) + setWalletChanges((prev) => + prev.map((wallet) => + batch.some((b) => b.address === wallet.address) + ? { ...wallet, status: "error", error: errorMessage } + : wallet, + ), + ); } } // Refresh wallet list and clear successful changes - await getAbWallets.refetch() - setWalletChanges(prev => prev.filter(w => w.status !== 'success')) - setIsProcessing(false) + await getAbWallets.refetch(); + setWalletChanges((prev) => prev.filter((w) => w.status !== "success")); + setIsProcessing(false); // Notify parent component to update the wallet list - onWalletListUpdate() - } + onWalletListUpdate(); + }; return (
@@ -270,17 +275,15 @@ export function AblTokenConfigListChange({ onWalletListUpdate }: { onWalletListU Add Wallet {isEditing && ( - )}
-
Mode can be: allow, block, or remove (remove only works for existing wallets)

-
+ {walletChanges.length > 0 && (
@@ -304,13 +307,13 @@ export function AblTokenConfigListChange({ onWalletListUpdate }: { onWalletListU {walletChanges.map((wallet, index) => ( - + handleUpdateWallet(index, 'address', e.target.value)} + onChange={(e) => handleUpdateWallet(index, "address", e.target.value)} placeholder="Wallet address" disabled={isProcessing} /> @@ -319,30 +322,26 @@ export function AblTokenConfigListChange({ onWalletListUpdate }: { onWalletListU - {wallet.status === 'success' && ( - - )} - {wallet.status === 'error' && ( - + {wallet.status === "success" && } + {wallet.status === "error" && ( + + ✗ + )} - @@ -353,5 +352,5 @@ export function AblTokenConfigListChange({ onWalletListUpdate }: { onWalletListU
)} - ) -} \ No newline at end of file + ); +} diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-data-access.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-data-access.tsx index 3b1194a3e..505550dac 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-data-access.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-data-access.tsx @@ -1,290 +1,281 @@ -'use client' - -import { getABLTokenProgram, getABLTokenProgramId } from '@project/anchor' -import { useConnection } from '@solana/wallet-adapter-react' -import { Cluster, Keypair, PublicKey, Transaction } from '@solana/web3.js' -import { useMutation, useQuery } from '@tanstack/react-query' -import { useMemo } from 'react' -import { useCluster } from '../cluster/cluster-data-access' -import { useAnchorProvider } from '../solana/solana-provider' -import { useTransactionToast } from '../use-transaction-toast' -import { toast } from 'sonner' -import { BN } from '@anchor-lang/core' -import { createAssociatedTokenAccountIdempotentInstruction, createMintToCheckedInstruction, getAssociatedTokenAddressSync, getMint, getPermanentDelegate, getTokenMetadata, getTransferHook, TOKEN_2022_PROGRAM_ID } from '@solana/spl-token' +"use client"; + +import type { BN } from "@anchor-lang/core"; +import { getABLTokenProgram, getABLTokenProgramId } from "@project/anchor"; +import { + createAssociatedTokenAccountIdempotentInstruction, + createMintToCheckedInstruction, + getAssociatedTokenAddressSync, + getMint, + getPermanentDelegate, + getTokenMetadata, + getTransferHook, + TOKEN_2022_PROGRAM_ID, +} from "@solana/spl-token"; +import { useConnection } from "@solana/wallet-adapter-react"; +import { type Cluster, Keypair, PublicKey, Transaction } from "@solana/web3.js"; +import { useMutation, useQuery } from "@tanstack/react-query"; +import { useMemo } from "react"; +import { toast } from "sonner"; +import { useCluster } from "../cluster/cluster-data-access"; +import { useAnchorProvider } from "../solana/solana-provider"; +import { useTransactionToast } from "../use-transaction-toast"; export function useHasTransferHookEnabled(mint: PublicKey) { - const { connection } = useConnection() - const { cluster } = useCluster() - const programId = useMemo(() => getABLTokenProgramId(cluster.network as Cluster), [cluster]) + const { connection } = useConnection(); + const { cluster } = useCluster(); + const programId = useMemo(() => getABLTokenProgramId(cluster.network as Cluster), [cluster]); return useQuery({ - queryKey: ['has-transfer-hook', { cluster }], + queryKey: ["has-transfer-hook", { cluster }], queryFn: async () => { - const mintInfo = await getMint( - connection, - mint, - "confirmed", - TOKEN_2022_PROGRAM_ID, - ); + const mintInfo = await getMint(connection, mint, "confirmed", TOKEN_2022_PROGRAM_ID); const transferHook = getTransferHook(mintInfo); return transferHook !== null && programId.equals(transferHook.programId); }, - }) + }); } export function useGetToken(mint: PublicKey) { - const { connection } = useConnection() - const { cluster } = useCluster() - const programId = useMemo(() => getABLTokenProgramId(cluster.network as Cluster), [cluster]) + const { connection } = useConnection(); + const { cluster } = useCluster(); + const programId = useMemo(() => getABLTokenProgramId(cluster.network as Cluster), [cluster]); return useQuery({ - queryKey: ['get-token', { endpoint: connection.rpcEndpoint, mint }], - queryFn: async () => { - const mintInfo = await getMint( - connection, - mint, - "confirmed", - TOKEN_2022_PROGRAM_ID, - ); - - const metadata = await getTokenMetadata( - connection, - mint, - "confirmed", - TOKEN_2022_PROGRAM_ID, - ); + queryKey: ["get-token", { endpoint: connection.rpcEndpoint, mint }], + queryFn: async () => { + const mintInfo = await getMint(connection, mint, "confirmed", TOKEN_2022_PROGRAM_ID); - const mode = metadata?.additionalMetadata.find((metadata) => metadata[0] === "AB")?.[1] || null; - const threshold = metadata?.additionalMetadata.find((metadata) => metadata[0] === "threshold")?.[1] || null; + const metadata = await getTokenMetadata(connection, mint, "confirmed", TOKEN_2022_PROGRAM_ID); - const permanentDelegate = await getPermanentDelegate(mintInfo); + const mode = metadata?.additionalMetadata.find((metadata) => metadata[0] === "AB")?.[1] || null; + const threshold = metadata?.additionalMetadata.find((metadata) => metadata[0] === "threshold")?.[1] || null; - const transferHook = getTransferHook(mintInfo); + const permanentDelegate = await getPermanentDelegate(mintInfo); - const isTransferHookEnabled = transferHook !== null; - const isTransferHookSet = transferHook?.programId?.equals(programId) || false; - const transferHookProgramId = transferHook?.programId || null; + const transferHook = getTransferHook(mintInfo); - return { - name: metadata?.name, - symbol: metadata?.symbol, - uri: metadata?.uri, - decimals: mintInfo.decimals, - supply: mintInfo.supply, - mintAuthority: mintInfo.mintAuthority, - freezeAuthority: mintInfo.freezeAuthority, - permanentDelegate: permanentDelegate?.delegate ?? null, - isTransferHookEnabled, - isTransferHookSet, - transferHookProgramId, - mode, - threshold, - } - }, -}) + const isTransferHookEnabled = transferHook !== null; + const isTransferHookSet = transferHook?.programId?.equals(programId) || false; + const transferHookProgramId = transferHook?.programId || null; + + return { + name: metadata?.name, + symbol: metadata?.symbol, + uri: metadata?.uri, + decimals: mintInfo.decimals, + supply: mintInfo.supply, + mintAuthority: mintInfo.mintAuthority, + freezeAuthority: mintInfo.freezeAuthority, + permanentDelegate: permanentDelegate?.delegate ?? null, + isTransferHookEnabled, + isTransferHookSet, + transferHookProgramId, + mode, + threshold, + }; + }, + }); } - export function useAblTokenProgram() { - const { connection } = useConnection() - const { cluster } = useCluster() - const transactionToast = useTransactionToast() - const provider = useAnchorProvider() - const programId = useMemo(() => getABLTokenProgramId(cluster.network as Cluster), [cluster]) - const program = useMemo(() => getABLTokenProgram(provider, programId), [provider, programId]) + const { connection } = useConnection(); + const { cluster } = useCluster(); + const transactionToast = useTransactionToast(); + const provider = useAnchorProvider(); + const programId = useMemo(() => getABLTokenProgramId(cluster.network as Cluster), [cluster]); + const program = useMemo(() => getABLTokenProgram(provider, programId), [provider, programId]); const getProgramAccount = useQuery({ - queryKey: ['get-program-account', { cluster }], + queryKey: ["get-program-account", { cluster }], queryFn: () => connection.getParsedAccountInfo(programId), - }) + }); const initToken = useMutation({ - mutationKey: ['abl-token', 'init-token', { cluster }], + mutationKey: ["abl-token", "init-token", { cluster }], mutationFn: (args: { - mintAuthority: PublicKey, - freezeAuthority: PublicKey, - permanentDelegate: PublicKey, - transferHookAuthority: PublicKey, - mode: string, - threshold: BN, - name: string, - symbol: string, - uri: string, - decimals: number, + mintAuthority: PublicKey; + freezeAuthority: PublicKey; + permanentDelegate: PublicKey; + transferHookAuthority: PublicKey; + mode: string; + threshold: BN; + name: string; + symbol: string; + uri: string; + decimals: number; }) => { - const modeEnum = args.mode === 'allow' ? { allow: {} } : args.mode === 'block' ? { block: {}} : { mixed: {}}; + const modeEnum = args.mode === "allow" ? { allow: {} } : args.mode === "block" ? { block: {} } : { mixed: {} }; const mint = Keypair.generate(); - return program.methods.initMint({ - decimals: args.decimals, - mintAuthority: args.mintAuthority, - freezeAuthority: args.freezeAuthority, - permanentDelegate: args.permanentDelegate, - transferHookAuthority: args.mintAuthority, - mode: modeEnum, - threshold: args.threshold, - name: args.name, - symbol: args.symbol, - uri: args.uri, - }).accounts({ - mint: mint.publicKey, - }).signers([mint]).rpc().then((signature) => ({ signature, mintAddress: mint.publicKey })) + return program.methods + .initMint({ + decimals: args.decimals, + mintAuthority: args.mintAuthority, + freezeAuthority: args.freezeAuthority, + permanentDelegate: args.permanentDelegate, + transferHookAuthority: args.mintAuthority, + mode: modeEnum, + threshold: args.threshold, + name: args.name, + symbol: args.symbol, + uri: args.uri, + }) + .accounts({ + mint: mint.publicKey, + }) + .signers([mint]) + .rpc() + .then((signature) => ({ signature, mintAddress: mint.publicKey })); }, onSuccess: ({ signature, mintAddress }) => { - transactionToast(signature) - window.location.href = `/manage-token/${mintAddress.toString()}` + transactionToast(signature); + window.location.href = `/manage-token/${mintAddress.toString()}`; }, - onError: () => toast.error('Failed to initialize token'), - }) + onError: () => toast.error("Failed to initialize token"), + }); const attachToExistingToken = useMutation({ - mutationKey: ['abl-token', 'attach-to-existing-token', { cluster }], - mutationFn: (args: { - mint: PublicKey, - }) => { - return program.methods.attachToMint().accounts({ - mint: args.mint, - }).rpc() + mutationKey: ["abl-token", "attach-to-existing-token", { cluster }], + mutationFn: (args: { mint: PublicKey }) => { + return program.methods + .attachToMint() + .accounts({ + mint: args.mint, + }) + .rpc(); }, onSuccess: (signature) => { - transactionToast(signature) + transactionToast(signature); }, - onError: () => toast.error('Failed to initialize token'), - }) + onError: () => toast.error("Failed to initialize token"), + }); const changeMode = useMutation({ - mutationKey: ['abl-token', 'change-mode', { cluster }], - mutationFn: (args: { - mode: string, - threshold: BN, - mint: PublicKey, - }) => { - const modeEnum = args.mode === 'Allow' ? { allow: {} } : args.mode === 'Block' ? { block: {}} : { mixed: {}} - return program.methods.changeMode({ - mode: modeEnum, - threshold: args.threshold, - }).accounts({ - mint: args.mint, - }).rpc() + mutationKey: ["abl-token", "change-mode", { cluster }], + mutationFn: (args: { mode: string; threshold: BN; mint: PublicKey }) => { + const modeEnum = args.mode === "Allow" ? { allow: {} } : args.mode === "Block" ? { block: {} } : { mixed: {} }; + return program.methods + .changeMode({ + mode: modeEnum, + threshold: args.threshold, + }) + .accounts({ + mint: args.mint, + }) + .rpc(); }, onSuccess: (signature) => { - transactionToast(signature) + transactionToast(signature); }, - onError: () => toast.error('Failed to run program'), - }) + onError: () => toast.error("Failed to run program"), + }); const initWallet = useMutation({ - mutationKey: ['abl-token', 'change-mode', { cluster }], - mutationFn: (args: { - wallet: PublicKey, - allowed: boolean, - }) => { - return program.methods.initWallet({ - allowed: args.allowed, - }).accounts({ - wallet: args.wallet, - }).rpc() + mutationKey: ["abl-token", "change-mode", { cluster }], + mutationFn: (args: { wallet: PublicKey; allowed: boolean }) => { + return program.methods + .initWallet({ + allowed: args.allowed, + }) + .accounts({ + wallet: args.wallet, + }) + .rpc(); }, onSuccess: (signature) => { - transactionToast(signature) + transactionToast(signature); }, - onError: () => toast.error('Failed to run program'), - }) + onError: () => toast.error("Failed to run program"), + }); const processBatchWallets = useMutation({ - mutationKey: ['abl-token', 'process-batch-wallets', { cluster }], - mutationFn: async (args: { - wallets: {wallet: PublicKey, mode: "allow" | "block" | "remove"}[], - }) => { - const instructions = await Promise.all(args.wallets.map((wallet) => { - if (wallet.mode === "remove") { - const [abWalletPda] = PublicKey.findProgramAddressSync( - [ - Buffer.from('ab_wallet'), - wallet.wallet.toBuffer(), - ], - program.programId - ); - return program.methods.removeWallet().accounts({ - abWallet: abWalletPda, - }).instruction() - } - return program.methods.initWallet({ - allowed: wallet.mode === "allow", - }).accounts({ - wallet: wallet.wallet, - }).instruction() - })); - + mutationKey: ["abl-token", "process-batch-wallets", { cluster }], + mutationFn: async (args: { wallets: { wallet: PublicKey; mode: "allow" | "block" | "remove" }[] }) => { + const instructions = await Promise.all( + args.wallets.map((wallet) => { + if (wallet.mode === "remove") { + const [abWalletPda] = PublicKey.findProgramAddressSync( + [Buffer.from("ab_wallet"), wallet.wallet.toBuffer()], + program.programId, + ); + return program.methods + .removeWallet() + .accounts({ + abWallet: abWalletPda, + }) + .instruction(); + } + return program.methods + .initWallet({ + allowed: wallet.mode === "allow", + }) + .accounts({ + wallet: wallet.wallet, + }) + .instruction(); + }), + ); + const transaction = new Transaction(); transaction.add(...instructions); transaction.feePayer = provider.wallet.publicKey; transaction.recentBlockhash = (await connection.getLatestBlockhash()).blockhash; //transaction.sign(provider.wallet); - const signedTx = await provider.wallet.signTransaction(transaction); + const signedTx = await provider.wallet.signTransaction(transaction); return connection.sendRawTransaction(signedTx.serialize()); - }, onSuccess: (signature) => { - transactionToast(signature) + transactionToast(signature); }, - onError: () => toast.error('Failed to run program'), - }) - + onError: () => toast.error("Failed to run program"), + }); const removeWallet = useMutation({ - mutationKey: ['abl-token', 'change-mode', { cluster }], - mutationFn: (args: { - wallet: PublicKey, - }) => { + mutationKey: ["abl-token", "change-mode", { cluster }], + mutationFn: (args: { wallet: PublicKey }) => { const [abWalletPda] = PublicKey.findProgramAddressSync( - [ - Buffer.from('ab_wallet'), - args.wallet.toBuffer(), - ], - program.programId + [Buffer.from("ab_wallet"), args.wallet.toBuffer()], + program.programId, ); - return program.methods.removeWallet().accounts({ - abWallet: abWalletPda, - }).rpc() + return program.methods + .removeWallet() + .accounts({ + abWallet: abWalletPda, + }) + .rpc(); }, onSuccess: (signature) => { - transactionToast(signature) + transactionToast(signature); }, - onError: () => toast.error('Failed to run program'), - }) - + onError: () => toast.error("Failed to run program"), + }); const initConfig = useMutation({ - mutationKey: ['abl-token', 'init-config', { cluster }], + mutationKey: ["abl-token", "init-config", { cluster }], mutationFn: () => { - return program.methods.initConfig().rpc() + return program.methods.initConfig().rpc(); }, - }) + }); const getConfig = useQuery({ - queryKey: ['get-config', { cluster }], + queryKey: ["get-config", { cluster }], queryFn: () => { - const [configPda] = PublicKey.findProgramAddressSync( - [Buffer.from('config')], - program.programId - ); - return program.account.config.fetch(configPda) + const [configPda] = PublicKey.findProgramAddressSync([Buffer.from("config")], program.programId); + return program.account.config.fetch(configPda); }, - }) - + }); + const getAbWallets = useQuery({ - queryKey: ['get-ab-wallets', { cluster }], + queryKey: ["get-ab-wallets", { cluster }], queryFn: () => { - return program.account.abWallet.all() + return program.account.abWallet.all(); }, - }) - + }); - -/* + /* const getBalance = useQuery({ queryKey: ['get-balance', { cluster }], queryFn: () => { @@ -293,35 +284,39 @@ export function useAblTokenProgram() { })*/ const mintTo = useMutation({ - mutationKey: ['abl-token', 'mint-to', { cluster }], - mutationFn: async (args: { - mint: PublicKey, - amount: BN, - recipient: PublicKey, - }) => { - const mintInfo = await getMint( - connection, + mutationKey: ["abl-token", "mint-to", { cluster }], + mutationFn: async (args: { mint: PublicKey; amount: BN; recipient: PublicKey }) => { + const mintInfo = await getMint(connection, args.mint, "confirmed", TOKEN_2022_PROGRAM_ID); + const ata = getAssociatedTokenAddressSync(args.mint, args.recipient, true, TOKEN_2022_PROGRAM_ID); + + const ix = createAssociatedTokenAccountIdempotentInstruction( + provider.publicKey, + ata, + args.recipient, args.mint, - "confirmed", TOKEN_2022_PROGRAM_ID, ); - const ata = getAssociatedTokenAddressSync(args.mint, args.recipient, true, TOKEN_2022_PROGRAM_ID); - - const ix = createAssociatedTokenAccountIdempotentInstruction(provider.publicKey, ata, args.recipient, args.mint, TOKEN_2022_PROGRAM_ID); - const ix2 = createMintToCheckedInstruction(args.mint, ata, provider.publicKey, args.amount.toNumber(), mintInfo.decimals, undefined, TOKEN_2022_PROGRAM_ID); + const ix2 = createMintToCheckedInstruction( + args.mint, + ata, + provider.publicKey, + args.amount.toNumber(), + mintInfo.decimals, + undefined, + TOKEN_2022_PROGRAM_ID, + ); const tx = new Transaction(); tx.add(ix, ix2); tx.feePayer = provider.wallet.publicKey; tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash; - const signedTx = await provider.wallet.signTransaction(tx); - return connection.sendRawTransaction(signedTx.serialize()) + const signedTx = await provider.wallet.signTransaction(tx); + return connection.sendRawTransaction(signedTx.serialize()); }, onSuccess: (signature) => { - transactionToast(signature) + transactionToast(signature); }, - onError: () => toast.error('Failed to run program'), - }) - + onError: () => toast.error("Failed to run program"), + }); return { program, @@ -337,6 +332,5 @@ export function useAblTokenProgram() { processBatchWallets, mintTo, attachToExistingToken, - } + }; } - diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-feature.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-feature.tsx index f49c2f906..201a66a28 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-feature.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-feature.tsx @@ -1,16 +1,16 @@ -'use client' +"use client"; -import { useWallet } from '@solana/wallet-adapter-react' -import { ExplorerLink } from '../cluster/cluster-ui' -import { WalletButton } from '../solana/solana-provider' -import { useAblTokenProgram } from './abl-token-data-access' -import { AblTokenCreate, AblTokenProgram } from './abl-token-ui' -import { AppHero } from '../app-hero' -import { ellipsify } from '@/lib/utils' +import { useWallet } from "@solana/wallet-adapter-react"; +import { ellipsify } from "@/lib/utils"; +import { AppHero } from "../app-hero"; +import { ExplorerLink } from "../cluster/cluster-ui"; +import { WalletButton } from "../solana/solana-provider"; +import { useAblTokenProgram } from "./abl-token-data-access"; +import { AblTokenCreate, AblTokenProgram } from "./abl-token-ui"; export default function AblTokenFeature() { - const { publicKey } = useWallet() - const { programId } = useAblTokenProgram() + const { publicKey } = useWallet(); + const { programId } = useAblTokenProgram(); return publicKey ? (
@@ -30,5 +30,5 @@ export default function AblTokenFeature() {
- ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token-detail.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token-detail.tsx index 22e811a7d..051b98773 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token-detail.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token-detail.tsx @@ -1,13 +1,13 @@ -'use client' +"use client"; -import { useWallet } from '@solana/wallet-adapter-react' -import { WalletButton } from '../solana/solana-provider' -import { useParams } from 'next/navigation' -import React from 'react' -import { useAblTokenProgram, useGetToken } from './abl-token-data-access' -import { PublicKey } from '@solana/web3.js' -import { BN } from '@anchor-lang/core' -import { Button } from '@/components/ui/button' +import { BN } from "@anchor-lang/core"; +import { useWallet } from "@solana/wallet-adapter-react"; +import { PublicKey } from "@solana/web3.js"; +import { useParams } from "next/navigation"; +import React from "react"; +import { Button } from "@/components/ui/button"; +import { WalletButton } from "../solana/solana-provider"; +import { useAblTokenProgram, useGetToken } from "./abl-token-data-access"; interface TokenInfo { address: string; @@ -27,7 +27,7 @@ interface TokenInfo { } function TokenInfo({ tokenAddress }: { tokenAddress: string }) { - const { attachToExistingToken } = useAblTokenProgram() + const { attachToExistingToken } = useAblTokenProgram(); const tokenInfo = useGetToken(new PublicKey(tokenAddress)); return (
@@ -43,16 +43,25 @@ function TokenInfo({ tokenAddress }: { tokenAddress: string }) {
Mint Authority: {tokenInfo.data?.mintAuthority?.toString()}
Freeze Authority: {tokenInfo.data?.freezeAuthority?.toString()}
Permanent Delegate: {tokenInfo.data?.permanentDelegate?.toString()}
-
+

ABL Token

Mode: {tokenInfo.data?.mode}
Threshold: {tokenInfo.data?.threshold?.toString()}
- {tokenInfo.data?.isTransferHookEnabled ? (tokenInfo.data?.isTransferHookSet ? ( -
TxHook: Enabled and Set ✅
+ {tokenInfo.data?.isTransferHookEnabled ? ( + tokenInfo.data?.isTransferHookSet ? ( +
TxHook: Enabled and Set ✅
+ ) : ( +
+ TxHook: Enabled.{" "} + +
+ ) ) : ( -
TxHook: Enabled.
- )) : (
TxHook: Not enabled ❌
)}
@@ -61,15 +70,15 @@ function TokenInfo({ tokenAddress }: { tokenAddress: string }) {

No token information available.

)}
- ) + ); } function TokenManagement({ tokenInfo }: { tokenInfo: TokenInfo }) { - const { publicKey } = useWallet() - const { changeMode, mintTo } = useAblTokenProgram() - const [mode, setMode] = React.useState<'Allow' | 'Block' | 'Mixed'>(tokenInfo.mode as 'Allow' | 'Block' | 'Mixed') - const [threshold, setThreshold] = React.useState(tokenInfo.threshold ?? undefined) - const [destinationWallet, setDestinationWallet] = React.useState('') + const { publicKey } = useWallet(); + const { changeMode, mintTo } = useAblTokenProgram(); + const [mode, setMode] = React.useState<"Allow" | "Block" | "Mixed">(tokenInfo.mode as "Allow" | "Block" | "Mixed"); + const [threshold, setThreshold] = React.useState(tokenInfo.threshold ?? undefined); + const [destinationWallet, setDestinationWallet] = React.useState(""); const handleApplyChanges = async () => { if (!publicKey || !tokenInfo) return; @@ -81,11 +90,11 @@ function TokenManagement({ tokenInfo }: { tokenInfo: TokenInfo }) { mint: new PublicKey(tokenInfo.address), }); } catch (err) { - console.error('Failed to apply changes:', err); + console.error("Failed to apply changes:", err); } }; - const [mintAmount, setMintAmount] = React.useState('0') + const [mintAmount, setMintAmount] = React.useState("0"); const handleMint = async () => { if (!publicKey || !tokenInfo) return; @@ -96,9 +105,9 @@ function TokenManagement({ tokenInfo }: { tokenInfo: TokenInfo }) { amount: new BN(mintAmount), recipient: publicKey, }); - console.log('Minted successfully'); + console.log("Minted successfully"); } catch (err) { - console.error('Failed to mint tokens:', err); + console.error("Failed to mint tokens:", err); } }; @@ -109,56 +118,64 @@ function TokenManagement({ tokenInfo }: { tokenInfo: TokenInfo }) {
{tokenInfo.isTransferHookSet && (
- +

Mode

- {mode === 'Mixed' && ( -
- - setThreshold(e.target.value)} - min="0" - /> -
+ {mode === "Mixed" && ( +
+ + setThreshold(e.target.value)} + min="0" + /> +
)}
-
-
)}
@@ -167,12 +184,15 @@ function TokenManagement({ tokenInfo }: { tokenInfo: TokenInfo }) {

Mint New Tokens

- + setDestinationWallet(e.target.value)} + onChange={(e) => setDestinationWallet(e.target.value)} placeholder="Enter destination wallet address" />
@@ -181,25 +201,23 @@ function TokenManagement({ tokenInfo }: { tokenInfo: TokenInfo }) { type="number" className="w-full p-2 border rounded" value={mintAmount} - onChange={e => setMintAmount(e.target.value)} + onChange={(e) => setMintAmount(e.target.value)} min="0" placeholder="Amount to mint" /> - +
- ) + ); } export default function ManageTokenDetail() { - const { publicKey } = useWallet() - const params = useParams() - const tokenAddress = params?.address as string + const { publicKey } = useWallet(); + const params = useParams(); + const tokenAddress = params?.address as string; const tokenQuery = useGetToken(new PublicKey(tokenAddress)); const tokenInfo = React.useMemo(() => { @@ -218,7 +236,7 @@ export default function ManageTokenDetail() { - ) + ); } return ( @@ -230,10 +248,9 @@ export default function ManageTokenDetail() { ) : ( <> - {tokenInfo && } - + {tokenInfo && } )} - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token-input.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token-input.tsx index 1f5a1695c..dd046f99a 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token-input.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token-input.tsx @@ -1,22 +1,21 @@ -'use client' +"use client"; -import { useWallet } from '@solana/wallet-adapter-react' -import { WalletButton } from '../solana/solana-provider' - -import { redirect } from 'next/navigation' -import React from 'react' -import { Button } from '@/components/ui/button' +import { useWallet } from "@solana/wallet-adapter-react"; +import { redirect } from "next/navigation"; +import React from "react"; +import { Button } from "@/components/ui/button"; +import { WalletButton } from "../solana/solana-provider"; export default function ManageTokenInput() { - const { publicKey } = useWallet() - const [tokenAddress, setTokenAddress] = React.useState('') + const { publicKey } = useWallet(); + const [tokenAddress, setTokenAddress] = React.useState(""); const handleSubmit = (e: React.FormEvent) => { - e.preventDefault() + e.preventDefault(); if (tokenAddress) { - redirect(`/manage-token/${tokenAddress.toString()}`) + redirect(`/manage-token/${tokenAddress.toString()}`); } - } + }; if (!publicKey) { return ( @@ -25,7 +24,7 @@ export default function ManageTokenInput() { - ) + ); } return ( @@ -39,17 +38,15 @@ export default function ManageTokenInput() { type="text" className="w-full p-2 border rounded" value={tokenAddress} - onChange={e => setTokenAddress(e.target.value)} + onChange={(e) => setTokenAddress(e.target.value)} placeholder="Enter token address" required /> - + - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token.tsx index feab86b70..8ada87843 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-manage-token.tsx @@ -1,11 +1,11 @@ -'use client' +"use client"; -import { useWallet } from '@solana/wallet-adapter-react' -import { WalletButton } from '../solana/solana-provider' -import { AppHero } from '../app-hero' -import ManageTokenInput from './abl-token-manage-token-input' +import { useWallet } from "@solana/wallet-adapter-react"; +import { AppHero } from "../app-hero"; +import { WalletButton } from "../solana/solana-provider"; +import ManageTokenInput from "./abl-token-manage-token-input"; export default function AblTokenFeature() { - const { publicKey } = useWallet() + const { publicKey } = useWallet(); return publicKey ? (
@@ -21,5 +21,5 @@ export default function AblTokenFeature() {
- ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-new-token.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-new-token.tsx index ed0bb438e..9a489a1d7 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-new-token.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-new-token.tsx @@ -1,16 +1,16 @@ -'use client' +"use client"; -import { useWallet } from '@solana/wallet-adapter-react' -import { ExplorerLink } from '../cluster/cluster-ui' -import { WalletButton } from '../solana/solana-provider' -import { useAblTokenProgram } from './abl-token-data-access' -import { AblTokenCreate } from './abl-token-ui' -import { AppHero } from '../app-hero' -import { ellipsify } from '@/lib/utils' +import { useWallet } from "@solana/wallet-adapter-react"; +import { ellipsify } from "@/lib/utils"; +import { AppHero } from "../app-hero"; +import { ExplorerLink } from "../cluster/cluster-ui"; +import { WalletButton } from "../solana/solana-provider"; +import { useAblTokenProgram } from "./abl-token-data-access"; +import { AblTokenCreate } from "./abl-token-ui"; export default function AblTokenFeature() { - const { publicKey } = useWallet() - const { programId } = useAblTokenProgram() + const { publicKey } = useWallet(); + const { programId } = useAblTokenProgram(); return publicKey ? (
@@ -29,5 +29,5 @@ export default function AblTokenFeature() {
- ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-ui.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-ui.tsx index 6c0b7ff7b..8293a3892 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-ui.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/abl-token/abl-token-ui.tsx @@ -1,34 +1,33 @@ -'use client' +"use client"; -import { PublicKey } from '@solana/web3.js' -import { useAblTokenProgram } from './abl-token-data-access' -import { Button } from '@/components/ui/button' -import { BN } from '@anchor-lang/core' -import React from 'react' -import { useWallet } from '@solana/wallet-adapter-react' +import { BN } from "@anchor-lang/core"; +import { useWallet } from "@solana/wallet-adapter-react"; +import { PublicKey } from "@solana/web3.js"; +import React from "react"; +import { Button } from "@/components/ui/button"; +import { useAblTokenProgram } from "./abl-token-data-access"; export function AblTokenCreate() { - - const { publicKey } = useWallet() - const { initToken } = useAblTokenProgram() - const [mode, setMode] = React.useState<'allow' | 'block' | 'threshold'>('allow') - const [threshold, setThreshold] = React.useState('100000') + const { publicKey } = useWallet(); + const { initToken } = useAblTokenProgram(); + const [mode, setMode] = React.useState<"allow" | "block" | "threshold">("allow"); + const [threshold, setThreshold] = React.useState("100000"); const [formData, setFormData] = React.useState({ - mintAuthority: publicKey ? publicKey.toString() : '', - freezeAuthority: publicKey ? publicKey.toString() : '', - permanentDelegate: publicKey ? publicKey.toString() : '', - transferHookAuthority: publicKey ? publicKey.toString() : '', - name: '', - symbol: '', - uri: '', - decimals: '6' - }) + mintAuthority: publicKey ? publicKey.toString() : "", + freezeAuthority: publicKey ? publicKey.toString() : "", + permanentDelegate: publicKey ? publicKey.toString() : "", + transferHookAuthority: publicKey ? publicKey.toString() : "", + name: "", + symbol: "", + uri: "", + decimals: "6", + }); const handleSubmit = (e: React.FormEvent) => { - e.preventDefault() + e.preventDefault(); try { initToken.mutateAsync({ - decimals: parseInt(formData.decimals), + decimals: parseInt(formData.decimals, 10), mintAuthority: new PublicKey(formData.mintAuthority), freezeAuthority: new PublicKey(formData.freezeAuthority), permanentDelegate: new PublicKey(formData.permanentDelegate), @@ -37,12 +36,12 @@ export function AblTokenCreate() { threshold: new BN(threshold), name: formData.name, symbol: formData.symbol, - uri: formData.uri - }) + uri: formData.uri, + }); } catch (err) { - console.error('Invalid form data:', err) + console.error("Invalid form data:", err); } - } + }; return (
@@ -53,7 +52,7 @@ export function AblTokenCreate() { type="text" className="w-full p-2 border rounded" value={formData.mintAuthority} - onChange={e => setFormData({...formData, mintAuthority: e.target.value})} + onChange={(e) => setFormData({ ...formData, mintAuthority: e.target.value })} required /> @@ -64,7 +63,7 @@ export function AblTokenCreate() { type="text" className="w-full p-2 border rounded" value={formData.freezeAuthority} - onChange={e => setFormData({...formData, freezeAuthority: e.target.value})} + onChange={(e) => setFormData({ ...formData, freezeAuthority: e.target.value })} required /> @@ -75,7 +74,7 @@ export function AblTokenCreate() { type="text" className="w-full p-2 border rounded" value={formData.permanentDelegate} - onChange={e => setFormData({...formData, permanentDelegate: e.target.value})} + onChange={(e) => setFormData({ ...formData, permanentDelegate: e.target.value })} required /> @@ -86,7 +85,12 @@ export function AblTokenCreate() { type="text" className="w-full p-2 border rounded" value={formData.transferHookAuthority} - onChange={e => setFormData({...formData, transferHookAuthority: e.target.value})} + onChange={(e) => + setFormData({ + ...formData, + transferHookAuthority: e.target.value, + }) + } required /> @@ -97,7 +101,7 @@ export function AblTokenCreate() { type="text" className="w-full p-2 border rounded" value={formData.name} - onChange={e => setFormData({...formData, name: e.target.value})} + onChange={(e) => setFormData({ ...formData, name: e.target.value })} required /> @@ -108,7 +112,7 @@ export function AblTokenCreate() { type="text" className="w-full p-2 border rounded" value={formData.symbol} - onChange={e => setFormData({...formData, symbol: e.target.value})} + onChange={(e) => setFormData({ ...formData, symbol: e.target.value })} required /> @@ -119,7 +123,7 @@ export function AblTokenCreate() { type="text" className="w-full p-2 border rounded" value={formData.uri} - onChange={e => setFormData({...formData, uri: e.target.value})} + onChange={(e) => setFormData({ ...formData, uri: e.target.value })} required /> @@ -130,7 +134,7 @@ export function AblTokenCreate() { type="number" className="w-full p-2 border rounded" value={formData.decimals} - onChange={e => setFormData({...formData, decimals: e.target.value})} + onChange={(e) => setFormData({ ...formData, decimals: e.target.value })} required min="0" max="9" @@ -138,43 +142,29 @@ export function AblTokenCreate() {
- +

Mode*

- {mode === 'threshold' && ( + {mode === "threshold" && ( @@ -182,35 +172,35 @@ export function AblTokenCreate() {
- ) + ); } export function AblTokenProgram() { - const { getProgramAccount } = useAblTokenProgram() + const { getProgramAccount } = useAblTokenProgram(); if (getProgramAccount.isLoading) { - return + return ; } if (!getProgramAccount.data?.value) { return (
Program account not found. Make sure you have deployed the program and are on the correct cluster.
- ) + ); } return ( -
+
{JSON.stringify(getProgramAccount.data.value, null, 2)}
- ) + ); } interface WalletEntry { address: string; - mode: 'allow' | 'block'; + mode: "allow" | "block"; } export function AblTokenWalletTable() { @@ -224,24 +214,24 @@ export function AblTokenWalletTable() { e.preventDefault(); const file = e.dataTransfer.files[0]; - if (file && file.type === 'text/csv') { + if (file && file.type === "text/csv") { const text = await file.text(); - const rows = text.split('\n'); - + const rows = text.split("\n"); + const parsed: WalletEntry[] = rows - .filter(row => row.trim()) // Skip empty rows - .map(row => { - const [address, mode] = row.split(',').map(field => field.trim()); + .filter((row) => row.trim()) // Skip empty rows + .map((row) => { + const [address, mode] = row.split(",").map((field) => field.trim()); return { address, - mode: mode.toLowerCase() as 'allow' | 'block' + mode: mode.toLowerCase() as "allow" | "block", }; }) - .filter(entry => { + .filter((entry) => { // Basic validation try { new PublicKey(entry.address); - return ['allow', 'block'].includes(entry.mode); + return ["allow", "block"].includes(entry.mode); } catch { return false; } @@ -253,13 +243,14 @@ export function AblTokenWalletTable() { return (
-
Drop CSV file here (address,mode) -
+ {wallets.length > 0 && (
@@ -271,11 +262,11 @@ export function AblTokenWalletTable() { - {wallets.map((wallet, index) => ( - + {wallets.map((wallet) => ( + {wallet.address} - + {wallet.mode} diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-data-access.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-data-access.tsx index 2d67047b8..bec06323a 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-data-access.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-data-access.tsx @@ -1,77 +1,101 @@ -'use client' +"use client"; -import { createAssociatedTokenAccountIdempotentInstruction, createTransferCheckedInstruction, getAssociatedTokenAddressSync, getExtraAccountMetaAddress, getMint, getTransferHook, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from '@solana/spl-token' -import { useConnection, useWallet } from '@solana/wallet-adapter-react' +import { Buffer } from "node:buffer"; import { - Connection, + createAssociatedTokenAccountIdempotentInstruction, + createTransferCheckedInstruction, + getAssociatedTokenAddressSync, + getExtraAccountMetaAddress, + getMint, + getTransferHook, + TOKEN_2022_PROGRAM_ID, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; +import { useConnection, useWallet } from "@solana/wallet-adapter-react"; +import { + type Connection, LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction, TransactionMessage, - TransactionSignature, + type TransactionSignature, VersionedTransaction, -} from '@solana/web3.js' -import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query' -import { useTransactionErrorToast, useTransactionToast } from '../use-transaction-toast' -import { useAnchorProvider } from '../solana/solana-provider' -import { Buffer } from "buffer" +} from "@solana/web3.js"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { useAnchorProvider } from "../solana/solana-provider"; +import { useTransactionErrorToast, useTransactionToast } from "../use-transaction-toast"; export function useGetBalance({ address }: { address: PublicKey }) { - const { connection } = useConnection() + const { connection } = useConnection(); return useQuery({ - queryKey: ['get-balance', { endpoint: connection.rpcEndpoint, address }], + queryKey: ["get-balance", { endpoint: connection.rpcEndpoint, address }], queryFn: () => connection.getBalance(address), - }) + }); } export function useGetSignatures({ address }: { address: PublicKey }) { - const { connection } = useConnection() + const { connection } = useConnection(); return useQuery({ - queryKey: ['get-signatures', { endpoint: connection.rpcEndpoint, address }], + queryKey: ["get-signatures", { endpoint: connection.rpcEndpoint, address }], queryFn: () => connection.getSignaturesForAddress(address), - }) + }); } export function useSendTokens() { - const { connection } = useConnection() - const { publicKey } = useWallet() - const transactionToast = useTransactionToast() - const provider = useAnchorProvider() - const transactionErrorToast = useTransactionErrorToast() + const { connection } = useConnection(); + const { publicKey } = useWallet(); + const transactionToast = useTransactionToast(); + const provider = useAnchorProvider(); + const transactionErrorToast = useTransactionErrorToast(); return useMutation({ - mutationFn: async (args: { - mint: PublicKey, - destination: PublicKey, - amount: number, - }) => { - if (!publicKey) throw new Error('No public key found'); + mutationFn: async (args: { mint: PublicKey; destination: PublicKey; amount: number }) => { + if (!publicKey) throw new Error("No public key found"); const { mint, destination, amount } = args; - const mintInfo = await getMint(connection, mint, 'confirmed', TOKEN_2022_PROGRAM_ID); + const mintInfo = await getMint(connection, mint, "confirmed", TOKEN_2022_PROGRAM_ID); const ataDestination = getAssociatedTokenAddressSync(mint, destination, true, TOKEN_2022_PROGRAM_ID); const ataSource = getAssociatedTokenAddressSync(mint, publicKey, true, TOKEN_2022_PROGRAM_ID); - const ix = createAssociatedTokenAccountIdempotentInstruction(publicKey, ataDestination, destination, mint, TOKEN_2022_PROGRAM_ID); + const ix = createAssociatedTokenAccountIdempotentInstruction( + publicKey, + ataDestination, + destination, + mint, + TOKEN_2022_PROGRAM_ID, + ); const bi = BigInt(amount); const decimals = mintInfo.decimals; - const ix3 = await createTransferCheckedInstruction(ataSource, mint, ataDestination, publicKey, bi, decimals, undefined, TOKEN_2022_PROGRAM_ID); + const ix3 = await createTransferCheckedInstruction( + ataSource, + mint, + ataDestination, + publicKey, + bi, + decimals, + undefined, + TOKEN_2022_PROGRAM_ID, + ); const transferHook = getTransferHook(mintInfo); - if (!transferHook) throw new Error('bad token'); + if (!transferHook) throw new Error("bad token"); const extraMetas = getExtraAccountMetaAddress(mint, transferHook.programId); - const seeds = [Buffer.from('ab_wallet'), destination.toBuffer()]; + const seeds = [Buffer.from("ab_wallet"), destination.toBuffer()]; const abWallet = PublicKey.findProgramAddressSync(seeds, transferHook.programId)[0]; ix3.keys.push({ pubkey: abWallet, isSigner: false, isWritable: false }); - ix3.keys.push({ pubkey: transferHook.programId, isSigner: false, isWritable: false }); + ix3.keys.push({ + pubkey: transferHook.programId, + isSigner: false, + isWritable: false, + }); ix3.keys.push({ pubkey: extraMetas, isSigner: false, isWritable: false }); - - const validateStateAccount = await connection.getAccountInfo(extraMetas, 'confirmed'); - if (!validateStateAccount) throw new Error('validate-state-account not found'); + + const validateStateAccount = await connection.getAccountInfo(extraMetas, "confirmed"); + if (!validateStateAccount) throw new Error("validate-state-account not found"); const transaction = new Transaction(); transaction.add(ix, ix3); @@ -83,17 +107,19 @@ export function useSendTokens() { return connection.sendRawTransaction(signedTx.serialize()); }, onSuccess: (signature) => { - transactionToast(signature) + transactionToast(signature); + }, + onError: (error) => { + transactionErrorToast(error, connection); }, - onError: (error) => { transactionErrorToast(error, connection) }, - }) + }); } export function useGetTokenAccounts({ address }: { address: PublicKey }) { - const { connection } = useConnection() + const { connection } = useConnection(); return useQuery({ - queryKey: ['get-token-accounts', { endpoint: connection.rpcEndpoint, address }], + queryKey: ["get-token-accounts", { endpoint: connection.rpcEndpoint, address }], queryFn: async () => { const [tokenAccounts, token2022Accounts] = await Promise.all([ connection.getParsedTokenAccountsByOwner(address, { @@ -102,96 +128,96 @@ export function useGetTokenAccounts({ address }: { address: PublicKey }) { connection.getParsedTokenAccountsByOwner(address, { programId: TOKEN_2022_PROGRAM_ID, }), - ]) - return [...tokenAccounts.value, ...token2022Accounts.value] + ]); + return [...tokenAccounts.value, ...token2022Accounts.value]; }, - }) + }); } export function useTransferSol({ address }: { address: PublicKey }) { - const { connection } = useConnection() + const { connection } = useConnection(); // const transactionToast = useTransactionToast() - const wallet = useWallet() - const client = useQueryClient() + const wallet = useWallet(); + const client = useQueryClient(); return useMutation({ - mutationKey: ['transfer-sol', { endpoint: connection.rpcEndpoint, address }], + mutationKey: ["transfer-sol", { endpoint: connection.rpcEndpoint, address }], mutationFn: async (input: { destination: PublicKey; amount: number }) => { - let signature: TransactionSignature = '' + let signature: TransactionSignature = ""; try { const { transaction, latestBlockhash } = await createTransaction({ publicKey: address, destination: input.destination, amount: input.amount, connection, - }) + }); // Send transaction and await for signature - signature = await wallet.sendTransaction(transaction, connection) + signature = await wallet.sendTransaction(transaction, connection); // Send transaction and await for signature - await connection.confirmTransaction({ signature, ...latestBlockhash }, 'confirmed') + await connection.confirmTransaction({ signature, ...latestBlockhash }, "confirmed"); - console.log(signature) - return signature + console.log(signature); + return signature; } catch (error: unknown) { - console.log('error', `Transaction failed! ${error}`, signature) + console.log("error", `Transaction failed! ${error}`, signature); - return + return; } }, onSuccess: (signature) => { if (signature) { // TODO: Add back Toast // transactionToast(signature) - console.log('Transaction sent', signature) + console.log("Transaction sent", signature); } return Promise.all([ client.invalidateQueries({ - queryKey: ['get-balance', { endpoint: connection.rpcEndpoint, address }], + queryKey: ["get-balance", { endpoint: connection.rpcEndpoint, address }], }), client.invalidateQueries({ - queryKey: ['get-signatures', { endpoint: connection.rpcEndpoint, address }], + queryKey: ["get-signatures", { endpoint: connection.rpcEndpoint, address }], }), - ]) + ]); }, onError: (error) => { // TODO: Add Toast - console.error(`Transaction failed! ${error}`) + console.error(`Transaction failed! ${error}`); }, - }) + }); } export function useRequestAirdrop({ address }: { address: PublicKey }) { - const { connection } = useConnection() + const { connection } = useConnection(); // const transactionToast = useTransactionToast() - const client = useQueryClient() + const client = useQueryClient(); return useMutation({ - mutationKey: ['airdrop', { endpoint: connection.rpcEndpoint, address }], + mutationKey: ["airdrop", { endpoint: connection.rpcEndpoint, address }], mutationFn: async (amount: number = 1) => { const [latestBlockhash, signature] = await Promise.all([ connection.getLatestBlockhash(), connection.requestAirdrop(address, amount * LAMPORTS_PER_SOL), - ]) + ]); - await connection.confirmTransaction({ signature, ...latestBlockhash }, 'confirmed') - return signature + await connection.confirmTransaction({ signature, ...latestBlockhash }, "confirmed"); + return signature; }, onSuccess: (signature) => { // TODO: Add back Toast // transactionToast(signature) - console.log('Airdrop sent', signature) + console.log("Airdrop sent", signature); return Promise.all([ client.invalidateQueries({ - queryKey: ['get-balance', { endpoint: connection.rpcEndpoint, address }], + queryKey: ["get-balance", { endpoint: connection.rpcEndpoint, address }], }), client.invalidateQueries({ - queryKey: ['get-signatures', { endpoint: connection.rpcEndpoint, address }], + queryKey: ["get-signatures", { endpoint: connection.rpcEndpoint, address }], }), - ]) + ]); }, - }) + }); } async function createTransaction({ @@ -200,16 +226,16 @@ async function createTransaction({ amount, connection, }: { - publicKey: PublicKey - destination: PublicKey - amount: number - connection: Connection + publicKey: PublicKey; + destination: PublicKey; + amount: number; + connection: Connection; }): Promise<{ - transaction: VersionedTransaction - latestBlockhash: { blockhash: string; lastValidBlockHeight: number } + transaction: VersionedTransaction; + latestBlockhash: { blockhash: string; lastValidBlockHeight: number }; }> { // Get the latest blockhash to use in our transaction - const latestBlockhash = await connection.getLatestBlockhash() + const latestBlockhash = await connection.getLatestBlockhash(); // Create instructions to send, in this case a simple transfer const instructions = [ @@ -218,20 +244,20 @@ async function createTransaction({ toPubkey: destination, lamports: amount * LAMPORTS_PER_SOL, }), - ] + ]; // Create a new TransactionMessage with version and compile it to legacy const messageLegacy = new TransactionMessage({ payerKey: publicKey, recentBlockhash: latestBlockhash.blockhash, instructions, - }).compileToLegacyMessage() + }).compileToLegacyMessage(); // Create a new VersionedTransaction which supports legacy and v0 - const transaction = new VersionedTransaction(messageLegacy) + const transaction = new VersionedTransaction(messageLegacy); return { transaction, latestBlockhash, - } + }; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-detail-feature.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-detail-feature.tsx index 4aa2efc7b..4e186d8cf 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-detail-feature.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-detail-feature.tsx @@ -1,27 +1,27 @@ -'use client' +"use client"; -import { PublicKey } from '@solana/web3.js' -import { useMemo } from 'react' -import { useParams } from 'next/navigation' -import { ExplorerLink } from '../cluster/cluster-ui' -import { AccountBalance, AccountButtons, AccountTokens, AccountTransactions } from './account-ui' -import { AppHero } from '../app-hero' -import { ellipsify } from '@/lib/utils' +import { PublicKey } from "@solana/web3.js"; +import { useParams } from "next/navigation"; +import { useMemo } from "react"; +import { ellipsify } from "@/lib/utils"; +import { AppHero } from "../app-hero"; +import { ExplorerLink } from "../cluster/cluster-ui"; +import { AccountBalance, AccountButtons, AccountTokens, AccountTransactions } from "./account-ui"; export default function AccountDetailFeature() { - const params = useParams() + const params = useParams(); const address = useMemo(() => { if (!params.address) { - return + return; } try { - return new PublicKey(params.address) + return new PublicKey(params.address); } catch (e) { - console.log(`Invalid public key`, e) + console.log(`Invalid public key`, e); } - }, [params]) + }, [params]); if (!address) { - return
Error loading account
+ return
Error loading account
; } return ( @@ -43,5 +43,5 @@ export default function AccountDetailFeature() {
- ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-list-feature.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-list-feature.tsx index 4ccb10390..b7559c0c9 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-list-feature.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-list-feature.tsx @@ -1,15 +1,14 @@ -'use client' +"use client"; -import { useWallet } from '@solana/wallet-adapter-react' -import { WalletButton } from '../solana/solana-provider' - -import { redirect } from 'next/navigation' +import { useWallet } from "@solana/wallet-adapter-react"; +import { redirect } from "next/navigation"; +import { WalletButton } from "../solana/solana-provider"; export default function AccountListFeature() { - const { publicKey } = useWallet() + const { publicKey } = useWallet(); if (publicKey) { - return redirect(`/account/${publicKey.toString()}`) + return redirect(`/account/${publicKey.toString()}`); } return ( @@ -18,5 +17,5 @@ export default function AccountListFeature() {
- ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-ui.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-ui.tsx index 5b972960e..fa19f8dc6 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-ui.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/account/account-ui.tsx @@ -1,13 +1,19 @@ -'use client' +"use client"; -import { useWallet } from '@solana/wallet-adapter-react' -import { LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js' -import { RefreshCw } from 'lucide-react' -import { useQueryClient } from '@tanstack/react-query' -import { useMemo, useState } from 'react' - -import { useCluster } from '../cluster/cluster-data-access' -import { ExplorerLink } from '../cluster/cluster-ui' +import { useWallet } from "@solana/wallet-adapter-react"; +import { LAMPORTS_PER_SOL, PublicKey } from "@solana/web3.js"; +import { useQueryClient } from "@tanstack/react-query"; +import { RefreshCw } from "lucide-react"; +import { useMemo, useState } from "react"; +import { AppAlert } from "@/components/app-alert"; +import { AppModal } from "@/components/app-modal"; +import { Button } from "@/components/ui/button"; +import { Input } from "@/components/ui/input"; +import { Label } from "@/components/ui/label"; +import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; +import { ellipsify } from "@/lib/utils"; +import { useCluster } from "../cluster/cluster-data-access"; +import { ExplorerLink } from "../cluster/cluster-ui"; import { useGetBalance, useGetSignatures, @@ -15,40 +21,33 @@ import { useRequestAirdrop, useSendTokens, useTransferSol, -} from './account-data-access' -import { ellipsify } from '@/lib/utils' -import { Button } from '@/components/ui/button' -import { AppAlert } from '@/components/app-alert' -import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@/components/ui/table' -import { AppModal } from '@/components/app-modal' -import { Input } from '@/components/ui/input' -import { Label } from '@/components/ui/label' +} from "./account-data-access"; export function AccountBalance({ address }: { address: PublicKey }) { - const query = useGetBalance({ address }) + const query = useGetBalance({ address }); return ( -

query.refetch()}> - {query.data ? : '...'} SOL -

- ) + + ); } export function AccountChecker() { - const { publicKey } = useWallet() + const { publicKey } = useWallet(); if (!publicKey) { - return null + return null; } - return + return ; } export function AccountBalanceCheck({ address }: { address: PublicKey }) { - const { cluster } = useCluster() - const mutation = useRequestAirdrop({ address }) - const query = useGetBalance({ address }) + const { cluster } = useCluster(); + const mutation = useRequestAirdrop({ address }); + const query = useGetBalance({ address }); if (query.isLoading) { - return null + return null; } if (query.isError || !query.data) { return ( @@ -61,33 +60,33 @@ export function AccountBalanceCheck({ address }: { address: PublicKey }) { > You are connected to {cluster.name} but your account is not found on this cluster. - ) + ); } - return null + return null; } export function AccountButtons({ address }: { address: PublicKey }) { - const { cluster } = useCluster() + const { cluster } = useCluster(); return (
- {cluster.network?.includes('mainnet') ? null : } + {cluster.network?.includes("mainnet") ? null : }
- ) + ); } export function AccountTokens({ address }: { address: PublicKey }) { - const [showAll, setShowAll] = useState(false) - const query = useGetTokenAccounts({ address }) - const client = useQueryClient() - const sendTokens = useSendTokens() + const [showAll, setShowAll] = useState(false); + const query = useGetTokenAccounts({ address }); + const client = useQueryClient(); + const sendTokens = useSendTokens(); const items = useMemo(() => { - if (showAll) return query.data - return query.data?.slice(0, 5) - }, [query.data, showAll]) + if (showAll) return query.data; + return query.data?.slice(0, 5); + }, [query.data, showAll]); return (
@@ -101,10 +100,10 @@ export function AccountTokens({ address }: { address: PublicKey }) { + }} + > + Send + @@ -181,7 +184,7 @@ export function AccountTokens({ address }: { address: PublicKey }) { @@ -192,17 +195,17 @@ export function AccountTokens({ address }: { address: PublicKey }) {
)} - ) + ); } export function AccountTransactions({ address }: { address: PublicKey }) { - const query = useGetSignatures({ address }) - const [showAll, setShowAll] = useState(false) + const query = useGetSignatures({ address }); + const [showAll, setShowAll] = useState(false); const items = useMemo(() => { - if (showAll) return query.data - return query.data?.slice(0, 5) - }, [query.data, showAll]) + if (showAll) return query.data; + return query.data?.slice(0, 5); + }, [query.data, showAll]); return (
@@ -258,7 +261,7 @@ export function AccountTransactions({ address }: { address: PublicKey }) { @@ -269,11 +272,11 @@ export function AccountTransactions({ address }: { address: PublicKey }) {
)} - ) + ); } function BalanceSol({ balance }: { balance: number }) { - return {Math.round((balance / LAMPORTS_PER_SOL) * 100000) / 100000} + return {Math.round((balance / LAMPORTS_PER_SOL) * 100000) / 100000}; } function ModalReceive({ address }: { address: PublicKey }) { @@ -282,12 +285,12 @@ function ModalReceive({ address }: { address: PublicKey }) {

Receive assets by sending them to your public key:

{address.toString()} - ) + ); } function ModalAirdrop({ address }: { address: PublicKey }) { - const mutation = useRequestAirdrop({ address }) - const [amount, setAmount] = useState('2') + const mutation = useRequestAirdrop({ address }); + const [amount, setAmount] = useState("2"); return ( - ) + ); } function ModalSend({ address }: { address: PublicKey }) { - const wallet = useWallet() - const mutation = useTransferSol({ address }) - const [destination, setDestination] = useState('') - const [amount, setAmount] = useState('1') + const wallet = useWallet(); + const mutation = useTransferSol({ address }); + const [destination, setDestination] = useState(""); + const [amount, setAmount] = useState("1"); if (!address || !wallet.sendTransaction) { - return
Wallet not connected
+ return
Wallet not connected
; } return ( @@ -330,7 +333,7 @@ function ModalSend({ address }: { address: PublicKey }) { mutation.mutateAsync({ destination: new PublicKey(destination), amount: parseFloat(amount), - }) + }); }} > @@ -354,5 +357,5 @@ function ModalSend({ address }: { address: PublicKey }) { value={amount} /> - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-alert.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-alert.tsx index 008d7aaa6..d55b71a70 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-alert.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-alert.tsx @@ -1,6 +1,6 @@ -import { AlertCircle } from 'lucide-react' -import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert' -import { ReactNode } from 'react' +import { AlertCircle } from "lucide-react"; +import type { ReactNode } from "react"; +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert"; export function AppAlert({ action, children }: { action: ReactNode; children: ReactNode }) { return ( @@ -9,5 +9,5 @@ export function AppAlert({ action, children }: { action: ReactNode; children: Re {children} {action} - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-footer.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-footer.tsx index f871f95a9..783a2b653 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-footer.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-footer.tsx @@ -1,9 +1,7 @@ -import React from 'react' - export function AppFooter() { return (
- ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-header.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-header.tsx index 1a3fa9e9f..44008df65 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-header.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-header.tsx @@ -1,19 +1,19 @@ -'use client' -import { usePathname } from 'next/navigation' -import { useState } from 'react' -import Link from 'next/link' -import { Button } from '@/components/ui/button' -import { Menu, X } from 'lucide-react' -import { ThemeSelect } from '@/components/theme-select' -import { ClusterUiSelect } from './cluster/cluster-ui' -import { WalletButton } from '@/components/solana/solana-provider' +"use client"; +import { Menu, X } from "lucide-react"; +import Link from "next/link"; +import { usePathname } from "next/navigation"; +import { useState } from "react"; +import { WalletButton } from "@/components/solana/solana-provider"; +import { ThemeSelect } from "@/components/theme-select"; +import { Button } from "@/components/ui/button"; +import { ClusterUiSelect } from "./cluster/cluster-ui"; export function AppHeader({ links = [] }: { links: { label: string; path: string }[] }) { - const pathname = usePathname() - const [showMenu, setShowMenu] = useState(false) + const pathname = usePathname(); + const [showMenu, setShowMenu] = useState(false); function isActive(path: string) { - return path === '/' ? pathname === '/' : pathname.startsWith(path) + return path === "/" ? pathname === "/" : pathname.startsWith(path); } return ( @@ -28,7 +28,7 @@ export function AppHeader({ links = [] }: { links: { label: string; path: string {links.map(({ label, path }) => (
  • {label} @@ -56,7 +56,7 @@ export function AppHeader({ links = [] }: { links: { label: string; path: string {links.map(({ label, path }) => (
  • setShowMenu(false)} > @@ -75,5 +75,5 @@ export function AppHeader({ links = [] }: { links: { label: string; path: string )} - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-hero.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-hero.tsx index 3e0b2946a..cbcc2eafa 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-hero.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-hero.tsx @@ -1,23 +1,23 @@ -import React from 'react' +import type React from "react"; export function AppHero({ children, subtitle, title, }: { - children?: React.ReactNode - subtitle?: React.ReactNode - title?: React.ReactNode + children?: React.ReactNode; + subtitle?: React.ReactNode; + title?: React.ReactNode; }) { return (
    - {typeof title === 'string' ?

    {title}

    : title} - {typeof subtitle === 'string' ?

    {subtitle}

    : subtitle} + {typeof title === "string" ?

    {title}

    : title} + {typeof subtitle === "string" ?

    {subtitle}

    : subtitle} {children}
    - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-layout.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-layout.tsx index 194008682..f6fde56be 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-layout.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-layout.tsx @@ -1,19 +1,19 @@ -'use client' +"use client"; -import { ThemeProvider } from './theme-provider' -import { Toaster } from './ui/sonner' -import { AppHeader } from '@/components/app-header' -import React from 'react' -import { AppFooter } from '@/components/app-footer' -import { ClusterChecker } from '@/components/cluster/cluster-ui' -import { AccountChecker } from '@/components/account/account-ui' +import type React from "react"; +import { AccountChecker } from "@/components/account/account-ui"; +import { AppFooter } from "@/components/app-footer"; +import { AppHeader } from "@/components/app-header"; +import { ClusterChecker } from "@/components/cluster/cluster-ui"; +import { ThemeProvider } from "./theme-provider"; +import { Toaster } from "./ui/sonner"; export function AppLayout({ children, links, }: { - children: React.ReactNode - links: { label: string; path: string }[] + children: React.ReactNode; + links: { label: string; path: string }[]; }) { return ( @@ -29,5 +29,5 @@ export function AppLayout({ - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-modal.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-modal.tsx index a302cd725..93ff4e474 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-modal.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-modal.tsx @@ -1,6 +1,6 @@ -import { Button } from '@/components/ui/button' -import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' -import { ReactNode } from 'react' +import type { ReactNode } from "react"; +import { Button } from "@/components/ui/button"; +import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; export function AppModal({ children, @@ -9,11 +9,11 @@ export function AppModal({ submitDisabled, submitLabel, }: { - children: ReactNode - title: string - submit?: () => void - submitDisabled?: boolean - submitLabel?: string + children: ReactNode; + title: string; + submit?: () => void; + submitDisabled?: boolean; + submitLabel?: string; }) { return ( @@ -28,11 +28,11 @@ export function AppModal({ {submit ? ( ) : null} - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-providers.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-providers.tsx index a359b6541..c5a0e26da 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-providers.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/app-providers.tsx @@ -1,10 +1,10 @@ -'use client' +"use client"; -import { ThemeProvider } from '@/components/theme-provider' -import { ReactQueryProvider } from './react-query-provider' -import { ClusterProvider } from '@/components/cluster/cluster-data-access' -import { SolanaProvider } from '@/components/solana/solana-provider' -import React from 'react' +import type React from "react"; +import { ClusterProvider } from "@/components/cluster/cluster-data-access"; +import { SolanaProvider } from "@/components/solana/solana-provider"; +import { ThemeProvider } from "@/components/theme-provider"; +import { ReactQueryProvider } from "./react-query-provider"; export function AppProviders({ children }: Readonly<{ children: React.ReactNode }>) { return ( @@ -15,5 +15,5 @@ export function AppProviders({ children }: Readonly<{ children: React.ReactNode - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/cluster/cluster-data-access.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/cluster/cluster-data-access.tsx index 5a8d772b9..359fd3616 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/cluster/cluster-data-access.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/cluster/cluster-data-access.tsx @@ -1,22 +1,22 @@ -'use client' +"use client"; -import { clusterApiUrl, Connection } from '@solana/web3.js' -import { atom, useAtomValue, useSetAtom } from 'jotai' -import { atomWithStorage } from 'jotai/utils' -import { createContext, ReactNode, useContext } from 'react' +import { Connection, clusterApiUrl } from "@solana/web3.js"; +import { atom, useAtomValue, useSetAtom } from "jotai"; +import { atomWithStorage } from "jotai/utils"; +import { createContext, type ReactNode, useContext } from "react"; export interface SolanaCluster { - name: string - endpoint: string - network?: ClusterNetwork - active?: boolean + name: string; + endpoint: string; + network?: ClusterNetwork; + active?: boolean; } export enum ClusterNetwork { - Mainnet = 'mainnet-beta', - Testnet = 'testnet', - Devnet = 'devnet', - Custom = 'custom', + Mainnet = "mainnet-beta", + Testnet = "testnet", + Devnet = "devnet", + Custom = "custom", } // By default, we don't configure the mainnet-beta cluster @@ -24,94 +24,94 @@ export enum ClusterNetwork { // To use the mainnet-beta cluster, provide a custom endpoint export const defaultClusters: SolanaCluster[] = [ { - name: 'devnet', - endpoint: clusterApiUrl('devnet'), + name: "devnet", + endpoint: clusterApiUrl("devnet"), network: ClusterNetwork.Devnet, }, - { name: 'local', endpoint: 'http://localhost:8899' }, + { name: "local", endpoint: "http://localhost:8899" }, { - name: 'testnet', - endpoint: clusterApiUrl('testnet'), + name: "testnet", + endpoint: clusterApiUrl("testnet"), network: ClusterNetwork.Testnet, }, -] +]; -const clusterAtom = atomWithStorage('solana-cluster', defaultClusters[0]) -const clustersAtom = atomWithStorage('solana-clusters', defaultClusters) +const clusterAtom = atomWithStorage("solana-cluster", defaultClusters[0]); +const clustersAtom = atomWithStorage("solana-clusters", defaultClusters); const activeClustersAtom = atom((get) => { - const clusters = get(clustersAtom) - const cluster = get(clusterAtom) + const clusters = get(clustersAtom); + const cluster = get(clusterAtom); return clusters.map((item) => ({ ...item, active: item.name === cluster.name, - })) -}) + })); +}); const activeClusterAtom = atom((get) => { - const clusters = get(activeClustersAtom) + const clusters = get(activeClustersAtom); - return clusters.find((item) => item.active) || clusters[0] -}) + return clusters.find((item) => item.active) || clusters[0]; +}); export interface ClusterProviderContext { - cluster: SolanaCluster - clusters: SolanaCluster[] - addCluster: (cluster: SolanaCluster) => void - deleteCluster: (cluster: SolanaCluster) => void - setCluster: (cluster: SolanaCluster) => void + cluster: SolanaCluster; + clusters: SolanaCluster[]; + addCluster: (cluster: SolanaCluster) => void; + deleteCluster: (cluster: SolanaCluster) => void; + setCluster: (cluster: SolanaCluster) => void; - getExplorerUrl(path: string): string + getExplorerUrl(path: string): string; } -const Context = createContext({} as ClusterProviderContext) +const Context = createContext({} as ClusterProviderContext); export function ClusterProvider({ children }: { children: ReactNode }) { - const cluster = useAtomValue(activeClusterAtom) - const clusters = useAtomValue(activeClustersAtom) - const setCluster = useSetAtom(clusterAtom) - const setClusters = useSetAtom(clustersAtom) + const cluster = useAtomValue(activeClusterAtom); + const clusters = useAtomValue(activeClustersAtom); + const setCluster = useSetAtom(clusterAtom); + const setClusters = useSetAtom(clustersAtom); const value: ClusterProviderContext = { cluster, clusters: clusters.sort((a, b) => (a.name > b.name ? 1 : -1)), addCluster: (cluster: SolanaCluster) => { try { - new Connection(cluster.endpoint) - setClusters([...clusters, cluster]) + new Connection(cluster.endpoint); + setClusters([...clusters, cluster]); } catch (err) { - console.error(`${err}`) + console.error(`${err}`); } }, deleteCluster: (cluster: SolanaCluster) => { - setClusters(clusters.filter((item) => item.name !== cluster.name)) + setClusters(clusters.filter((item) => item.name !== cluster.name)); }, setCluster: (cluster: SolanaCluster) => setCluster(cluster), getExplorerUrl: (path: string) => `https://explorer.solana.com/${path}${getClusterUrlParam(cluster)}`, - } - return {children} + }; + return {children}; } export function useCluster() { - return useContext(Context) + return useContext(Context); } function getClusterUrlParam(cluster: SolanaCluster): string { - let suffix = '' + let suffix = ""; switch (cluster.network) { case ClusterNetwork.Devnet: - suffix = 'devnet' - break + suffix = "devnet"; + break; case ClusterNetwork.Mainnet: - suffix = '' - break + suffix = ""; + break; case ClusterNetwork.Testnet: - suffix = 'testnet' - break + suffix = "testnet"; + break; default: - suffix = `custom&customUrl=${encodeURIComponent(cluster.endpoint)}` - break + suffix = `custom&customUrl=${encodeURIComponent(cluster.endpoint)}`; + break; } - return suffix.length ? `?cluster=${suffix}` : '' + return suffix.length ? `?cluster=${suffix}` : ""; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/cluster/cluster-ui.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/cluster/cluster-ui.tsx index 66ac4ce05..99e1ac5b4 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/cluster/cluster-ui.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/cluster/cluster-ui.tsx @@ -1,18 +1,21 @@ -'use client' +"use client"; -import { useConnection } from '@solana/wallet-adapter-react' +import { useConnection } from "@solana/wallet-adapter-react"; -import { useQuery } from '@tanstack/react-query' -import * as React from 'react' -import { ReactNode } from 'react' - -import { useCluster } from './cluster-data-access' -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' -import { Button } from '@/components/ui/button' -import { AppAlert } from '@/components/app-alert' +import { useQuery } from "@tanstack/react-query"; +import type { ReactNode } from "react"; +import { AppAlert } from "@/components/app-alert"; +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { useCluster } from "./cluster-data-access"; export function ExplorerLink({ path, label, className }: { path: string; label: string; className?: string }) { - const { getExplorerUrl } = useCluster() + const { getExplorerUrl } = useCluster(); return (
    {label} - ) + ); } export function ClusterChecker({ children }: { children: ReactNode }) { - const { cluster } = useCluster() - const { connection } = useConnection() + const { cluster } = useCluster(); + const { connection } = useConnection(); const query = useQuery({ - queryKey: ['version', { cluster, endpoint: connection.rpcEndpoint }], + queryKey: ["version", { cluster, endpoint: connection.rpcEndpoint }], queryFn: () => connection.getVersion(), retry: 1, - }) + }); if (query.isLoading) { - return null + return null; } if (query.isError || !query.data) { return ( @@ -48,13 +51,13 @@ export function ClusterChecker({ children }: { children: ReactNode }) { > Error connecting to cluster {cluster.name}. - ) + ); } - return children + return children; } export function ClusterUiSelect() { - const { clusters, setCluster, cluster } = useCluster() + const { clusters, setCluster, cluster } = useCluster(); return ( @@ -68,5 +71,5 @@ export function ClusterUiSelect() { ))} - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/dashboard/dashboard-feature.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/dashboard/dashboard-feature.tsx index f6ddf48c2..77d01c47f 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/dashboard/dashboard-feature.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/dashboard/dashboard-feature.tsx @@ -1,12 +1,15 @@ -import { AppHero } from '@/components/app-hero' +import { AppHero } from "@/components/app-hero"; const links: { label: string; href: string }[] = [ - { label: 'Solana Docs', href: 'https://docs.solana.com/' }, - { label: 'Solana Faucet', href: 'https://faucet.solana.com/' }, - { label: 'Solana Cookbook', href: 'https://solana.com/developers/cookbook/' }, - { label: 'Solana Stack Overflow', href: 'https://solana.stackexchange.com/' }, - { label: 'Solana Developers GitHub', href: 'https://github.com/solana-developers/' }, -] + { label: "Solana Docs", href: "https://docs.solana.com/" }, + { label: "Solana Faucet", href: "https://faucet.solana.com/" }, + { label: "Solana Cookbook", href: "https://solana.com/developers/cookbook/" }, + { label: "Solana Stack Overflow", href: "https://solana.stackexchange.com/" }, + { + label: "Solana Developers GitHub", + href: "https://github.com/solana-developers/", + }, +]; export function DashboardFeature() { return ( @@ -15,8 +18,8 @@ export function DashboardFeature() {

    Here are some helpful links to get you started.

    - {links.map((link, index) => ( -
    + {links.map((link) => ( +
    - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/react-query-provider.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/react-query-provider.tsx index 2d4523ce6..6c3ca0bf6 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/react-query-provider.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/react-query-provider.tsx @@ -1,7 +1,7 @@ // Taken from https://tanstack.com/query/5/docs/framework/react/guides/advanced-ssr -'use client' +"use client"; -import { isServer, QueryClient, QueryClientProvider } from '@tanstack/react-query' +import { isServer, QueryClient, QueryClientProvider } from "@tanstack/react-query"; function makeQueryClient() { return new QueryClient({ @@ -10,22 +10,22 @@ function makeQueryClient() { staleTime: 60 * 1000, }, }, - }) + }); } -let browserQueryClient: QueryClient | undefined = undefined +let browserQueryClient: QueryClient | undefined; function getQueryClient() { if (isServer) { - return makeQueryClient() + return makeQueryClient(); } else { - if (!browserQueryClient) browserQueryClient = makeQueryClient() - return browserQueryClient + if (!browserQueryClient) browserQueryClient = makeQueryClient(); + return browserQueryClient; } } export function ReactQueryProvider({ children }: { children: React.ReactNode }) { - const queryClient = getQueryClient() + const queryClient = getQueryClient(); - return {children} + return {children}; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/solana/solana-provider.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/solana/solana-provider.tsx index 43e29b2ba..993f29778 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/solana/solana-provider.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/solana/solana-provider.tsx @@ -1,30 +1,30 @@ -'use client' +"use client"; -import { WalletError } from '@solana/wallet-adapter-base' +import type { WalletError } from "@solana/wallet-adapter-base"; import { - AnchorWallet, + type AnchorWallet, ConnectionProvider, useConnection, useWallet, WalletProvider, -} from '@solana/wallet-adapter-react' -import { WalletModalProvider } from '@solana/wallet-adapter-react-ui' -import dynamic from 'next/dynamic' -import { ReactNode, useCallback, useMemo } from 'react' -import { useCluster } from '../cluster/cluster-data-access' -import '@solana/wallet-adapter-react-ui/styles.css' -import { AnchorProvider } from '@anchor-lang/core' +} from "@solana/wallet-adapter-react"; +import { WalletModalProvider } from "@solana/wallet-adapter-react-ui"; +import dynamic from "next/dynamic"; +import { type ReactNode, useCallback, useMemo } from "react"; +import { useCluster } from "../cluster/cluster-data-access"; +import "@solana/wallet-adapter-react-ui/styles.css"; +import { AnchorProvider } from "@anchor-lang/core"; -export const WalletButton = dynamic(async () => (await import('@solana/wallet-adapter-react-ui')).WalletMultiButton, { +export const WalletButton = dynamic(async () => (await import("@solana/wallet-adapter-react-ui")).WalletMultiButton, { ssr: false, -}) +}); export function SolanaProvider({ children }: { children: ReactNode }) { - const { cluster } = useCluster() - const endpoint = useMemo(() => cluster.endpoint, [cluster]) + const { cluster } = useCluster(); + const endpoint = useMemo(() => cluster.endpoint, [cluster]); const onError = useCallback((error: WalletError) => { - console.error(error) - }, []) + console.error(error); + }, []); return ( @@ -32,12 +32,14 @@ export function SolanaProvider({ children }: { children: ReactNode }) { {children} - ) + ); } export function useAnchorProvider() { - const { connection } = useConnection() - const wallet = useWallet() + const { connection } = useConnection(); + const wallet = useWallet(); - return new AnchorProvider(connection, wallet as AnchorWallet, { commitment: 'confirmed' }) + return new AnchorProvider(connection, wallet as AnchorWallet, { + commitment: "confirmed", + }); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/theme-provider.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/theme-provider.tsx index f7328c86a..8e41496ff 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/theme-provider.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/theme-provider.tsx @@ -1,8 +1,8 @@ -'use client' +"use client"; -import * as React from 'react' -import { ThemeProvider as NextThemesProvider } from 'next-themes' +import { ThemeProvider as NextThemesProvider } from "next-themes"; +import type * as React from "react"; export function ThemeProvider({ children, ...props }: React.ComponentProps) { - return {children} + return {children}; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/theme-select.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/theme-select.tsx index 7c8331cca..7a8617004 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/theme-select.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/theme-select.tsx @@ -1,14 +1,18 @@ -'use client' +"use client"; -import * as React from 'react' -import { Moon, Sun } from 'lucide-react' -import { useTheme } from 'next-themes' +import { Moon, Sun } from "lucide-react"; +import { useTheme } from "next-themes"; -import { Button } from '@/components/ui/button' -import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from '@/components/ui/dropdown-menu' +import { Button } from "@/components/ui/button"; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; export function ThemeSelect() { - const { setTheme } = useTheme() + const { setTheme } = useTheme(); return ( @@ -20,10 +24,10 @@ export function ThemeSelect() { - setTheme('light')}>Light - setTheme('dark')}>Dark - setTheme('system')}>System + setTheme("light")}>Light + setTheme("dark")}>Dark + setTheme("system")}>System - ) + ); } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/alert.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/alert.tsx index cbf8da2b6..174412a6c 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/alert.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/alert.tsx @@ -1,51 +1,51 @@ -import * as React from 'react' -import { cva, type VariantProps } from 'class-variance-authority' +import { cva, type VariantProps } from "class-variance-authority"; +import type * as React from "react"; -import { cn } from '@/lib/utils' +import { cn } from "@/lib/utils"; const alertVariants = cva( - 'relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current', + "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current", { variants: { variant: { - default: 'bg-card text-card-foreground', + default: "bg-card text-card-foreground", destructive: - 'text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90', + "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90", warning: - 'text-yellow-500 bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-yellow-500/90 border-yellow-500 dark:bg-yellow-900/10', + "text-yellow-500 bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-yellow-500/90 border-yellow-500 dark:bg-yellow-900/10", }, }, defaultVariants: { - variant: 'default', + variant: "default", }, }, -) +); -function Alert({ className, variant, ...props }: React.ComponentProps<'div'> & VariantProps) { - return
    +function Alert({ className, variant, ...props }: React.ComponentProps<"div"> & VariantProps) { + return
    ; } -function AlertTitle({ className, ...props }: React.ComponentProps<'div'>) { +function AlertTitle({ className, ...props }: React.ComponentProps<"div">) { return (
    - ) + ); } -function AlertDescription({ className, ...props }: React.ComponentProps<'div'>) { +function AlertDescription({ className, ...props }: React.ComponentProps<"div">) { return (
    - ) + ); } -export { Alert, AlertTitle, AlertDescription } +export { Alert, AlertDescription, AlertTitle }; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/button.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/button.tsx index 43a479064..45e1107fd 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/button.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/button.tsx @@ -1,36 +1,36 @@ -import * as React from 'react' -import { Slot } from '@radix-ui/react-slot' -import { cva, type VariantProps } from 'class-variance-authority' +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; +import type * as React from "react"; -import { cn } from '@/lib/utils' +import { cn } from "@/lib/utils"; const buttonVariants = cva( "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", { variants: { variant: { - default: 'bg-primary text-primary-foreground shadow-xs hover:bg-primary/90', + default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", destructive: - 'bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60', + "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", outline: - 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50', - secondary: 'bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80', - ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50', - link: 'text-primary underline-offset-4 hover:underline', + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline", }, size: { - default: 'h-9 px-4 py-2 has-[>svg]:px-3', - sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5', - lg: 'h-10 rounded-md px-6 has-[>svg]:px-4', - icon: 'size-9', + default: "h-9 px-4 py-2 has-[>svg]:px-3", + sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + icon: "size-9", }, }, defaultVariants: { - variant: 'default', - size: 'default', + variant: "default", + size: "default", }, }, -) +); function Button({ className, @@ -38,13 +38,13 @@ function Button({ size, asChild = false, ...props -}: React.ComponentProps<'button'> & +}: React.ComponentProps<"button"> & VariantProps & { - asChild?: boolean + asChild?: boolean; }) { - const Comp = asChild ? Slot : 'button' + const Comp = asChild ? Slot : "button"; - return + return ; } -export { Button, buttonVariants } +export { Button, buttonVariants }; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/card.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/card.tsx index bf20394f7..e5c165f82 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/card.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/card.tsx @@ -1,54 +1,56 @@ -import * as React from 'react' +import type * as React from "react"; -import { cn } from '@/lib/utils' +import { cn } from "@/lib/utils"; -function Card({ className, ...props }: React.ComponentProps<'div'>) { +function Card({ className, ...props }: React.ComponentProps<"div">) { return (
    - ) + ); } -function CardHeader({ className, ...props }: React.ComponentProps<'div'>) { +function CardHeader({ className, ...props }: React.ComponentProps<"div">) { return (
    - ) + ); } -function CardTitle({ className, ...props }: React.ComponentProps<'div'>) { - return
    +function CardTitle({ className, ...props }: React.ComponentProps<"div">) { + return
    ; } -function CardDescription({ className, ...props }: React.ComponentProps<'div'>) { - return
    +function CardDescription({ className, ...props }: React.ComponentProps<"div">) { + return
    ; } -function CardAction({ className, ...props }: React.ComponentProps<'div'>) { +function CardAction({ className, ...props }: React.ComponentProps<"div">) { return (
    - ) + ); } -function CardContent({ className, ...props }: React.ComponentProps<'div'>) { - return
    +function CardContent({ className, ...props }: React.ComponentProps<"div">) { + return
    ; } -function CardFooter({ className, ...props }: React.ComponentProps<'div'>) { - return
    +function CardFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
    + ); } -export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent } +export { Card, CardAction, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/dialog.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/dialog.tsx index f35cad9d9..4a3cb9e9b 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/dialog.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/dialog.tsx @@ -1,25 +1,25 @@ -'use client' +"use client"; -import * as React from 'react' -import * as DialogPrimitive from '@radix-ui/react-dialog' -import { XIcon } from 'lucide-react' +import * as DialogPrimitive from "@radix-ui/react-dialog"; +import { XIcon } from "lucide-react"; +import type * as React from "react"; -import { cn } from '@/lib/utils' +import { cn } from "@/lib/utils"; function Dialog({ ...props }: React.ComponentProps) { - return + return ; } function DialogTrigger({ ...props }: React.ComponentProps) { - return + return ; } function DialogPortal({ ...props }: React.ComponentProps) { - return + return ; } function DialogClose({ ...props }: React.ComponentProps) { - return + return ; } function DialogOverlay({ className, ...props }: React.ComponentProps) { @@ -27,12 +27,12 @@ function DialogOverlay({ className, ...props }: React.ComponentProps - ) + ); } function DialogContent({ className, children, ...props }: React.ComponentProps) { @@ -42,7 +42,7 @@ function DialogContent({ className, children, ...props }: React.ComponentProps - ) + ); } -function DialogHeader({ className, ...props }: React.ComponentProps<'div'>) { +function DialogHeader({ className, ...props }: React.ComponentProps<"div">) { return (
    - ) + ); } -function DialogFooter({ className, ...props }: React.ComponentProps<'div'>) { +function DialogFooter({ className, ...props }: React.ComponentProps<"div">) { return (
    - ) + ); } function DialogTitle({ className, ...props }: React.ComponentProps) { return ( - ) + ); } function DialogDescription({ className, ...props }: React.ComponentProps) { return ( - ) + ); } export { @@ -108,4 +108,4 @@ export { DialogPortal, DialogTitle, DialogTrigger, -} +}; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/dropdown-menu.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/dropdown-menu.tsx index 6c34345fb..c485a2a37 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/dropdown-menu.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/dropdown-menu.tsx @@ -1,21 +1,21 @@ -'use client' +"use client"; -import * as React from 'react' -import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu' -import { CheckIcon, ChevronRightIcon, CircleIcon } from 'lucide-react' +import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; +import { CheckIcon, ChevronRightIcon, CircleIcon } from "lucide-react"; +import type * as React from "react"; -import { cn } from '@/lib/utils' +import { cn } from "@/lib/utils"; function DropdownMenu({ ...props }: React.ComponentProps) { - return + return ; } function DropdownMenuPortal({ ...props }: React.ComponentProps) { - return + return ; } function DropdownMenuTrigger({ ...props }: React.ComponentProps) { - return + return ; } function DropdownMenuContent({ @@ -29,27 +29,27 @@ function DropdownMenuContent({ data-slot="dropdown-menu-content" sideOffset={sideOffset} className={cn( - 'bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md', + "bg-popover text-popover-foreground data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 max-h-(--radix-dropdown-menu-content-available-height) min-w-[8rem] origin-(--radix-dropdown-menu-content-transform-origin) overflow-x-hidden overflow-y-auto rounded-md border p-1 shadow-md", className, )} {...props} /> - ) + ); } function DropdownMenuGroup({ ...props }: React.ComponentProps) { - return + return ; } function DropdownMenuItem({ className, inset, - variant = 'default', + variant = "default", ...props }: React.ComponentProps & { - inset?: boolean - variant?: 'default' | 'destructive' + inset?: boolean; + variant?: "default" | "destructive"; }) { return ( - ) + ); } function DropdownMenuCheckboxItem({ @@ -88,11 +88,11 @@ function DropdownMenuCheckboxItem({ {children} - ) + ); } function DropdownMenuRadioGroup({ ...props }: React.ComponentProps) { - return + return ; } function DropdownMenuRadioItem({ @@ -116,7 +116,7 @@ function DropdownMenuRadioItem({ {children} - ) + ); } function DropdownMenuLabel({ @@ -124,40 +124,40 @@ function DropdownMenuLabel({ inset, ...props }: React.ComponentProps & { - inset?: boolean + inset?: boolean; }) { return ( - ) + ); } function DropdownMenuSeparator({ className, ...props }: React.ComponentProps) { return ( - ) + ); } -function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<'span'>) { +function DropdownMenuShortcut({ className, ...props }: React.ComponentProps<"span">) { return ( - ) + ); } function DropdownMenuSub({ ...props }: React.ComponentProps) { - return + return ; } function DropdownMenuSubTrigger({ @@ -166,14 +166,14 @@ function DropdownMenuSubTrigger({ children, ...props }: React.ComponentProps & { - inset?: boolean + inset?: boolean; }) { return ( - ) + ); } function DropdownMenuSubContent({ @@ -192,28 +192,28 @@ function DropdownMenuSubContent({ - ) + ); } export { DropdownMenu, - DropdownMenuPortal, - DropdownMenuTrigger, + DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, - DropdownMenuLabel, DropdownMenuItem, - DropdownMenuCheckboxItem, + DropdownMenuLabel, + DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, - DropdownMenuSubTrigger, DropdownMenuSubContent, -} + DropdownMenuSubTrigger, + DropdownMenuTrigger, +}; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/input.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/input.tsx index 75fee7dfc..cb0e803b0 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/input.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/input.tsx @@ -1,21 +1,21 @@ -import * as React from 'react' +import type * as React from "react"; -import { cn } from '@/lib/utils' +import { cn } from "@/lib/utils"; -function Input({ className, type, ...props }: React.ComponentProps<'input'>) { +function Input({ className, type, ...props }: React.ComponentProps<"input">) { return ( - ) + ); } -export { Input } +export { Input }; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/label.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/label.tsx index a50c56949..aa7fe645a 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/label.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/label.tsx @@ -1,21 +1,21 @@ -'use client' +"use client"; -import * as React from 'react' -import * as LabelPrimitive from '@radix-ui/react-label' +import * as LabelPrimitive from "@radix-ui/react-label"; +import type * as React from "react"; -import { cn } from '@/lib/utils' +import { cn } from "@/lib/utils"; function Label({ className, ...props }: React.ComponentProps) { return ( - ) + ); } -export { Label } +export { Label }; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/sonner.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/sonner.tsx index 0626cafa8..f96a98d91 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/sonner.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/sonner.tsx @@ -1,25 +1,25 @@ -'use client' +"use client"; -import { useTheme } from 'next-themes' -import { Toaster as Sonner, ToasterProps } from 'sonner' +import { useTheme } from "next-themes"; +import { Toaster as Sonner, type ToasterProps } from "sonner"; const Toaster = ({ ...props }: ToasterProps) => { - const { theme = 'system' } = useTheme() + const { theme = "system" } = useTheme(); return ( - ) -} + ); +}; -export { Toaster } +export { Toaster }; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/table.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/table.tsx index e5351ccd0..afe6d5f82 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/table.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/ui/table.tsx @@ -1,75 +1,75 @@ -'use client' +"use client"; -import * as React from 'react' +import type * as React from "react"; -import { cn } from '@/lib/utils' +import { cn } from "@/lib/utils"; -function Table({ className, ...props }: React.ComponentProps<'table'>) { +function Table({ className, ...props }: React.ComponentProps<"table">) { return (
    - +
    - ) + ); } -function TableHeader({ className, ...props }: React.ComponentProps<'thead'>) { - return +function TableHeader({ className, ...props }: React.ComponentProps<"thead">) { + return ; } -function TableBody({ className, ...props }: React.ComponentProps<'tbody'>) { - return +function TableBody({ className, ...props }: React.ComponentProps<"tbody">) { + return ; } -function TableFooter({ className, ...props }: React.ComponentProps<'tfoot'>) { +function TableFooter({ className, ...props }: React.ComponentProps<"tfoot">) { return ( tr]:last:border-b-0', className)} + className={cn("bg-muted/50 border-t font-medium [&>tr]:last:border-b-0", className)} {...props} /> - ) + ); } -function TableRow({ className, ...props }: React.ComponentProps<'tr'>) { +function TableRow({ className, ...props }: React.ComponentProps<"tr">) { return ( - ) + ); } -function TableHead({ className, ...props }: React.ComponentProps<'th'>) { +function TableHead({ className, ...props }: React.ComponentProps<"th">) { return (
    [role=checkbox]]:translate-y-[2px]', + "text-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", className, )} {...props} /> - ) + ); } -function TableCell({ className, ...props }: React.ComponentProps<'td'>) { +function TableCell({ className, ...props }: React.ComponentProps<"td">) { return ( [role=checkbox]]:translate-y-[2px]', + "p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]", className, )} {...props} /> - ) + ); } -function TableCaption({ className, ...props }: React.ComponentProps<'caption'>) { +function TableCaption({ className, ...props }: React.ComponentProps<"caption">) { return ( -
    - ) + + ); } -export { Table, TableHeader, TableBody, TableFooter, TableHead, TableRow, TableCell, TableCaption } +export { Table, TableBody, TableCaption, TableCell, TableFooter, TableHead, TableHeader, TableRow }; diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/use-transaction-toast.tsx b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/use-transaction-toast.tsx index d354a5d17..6032f5d85 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/use-transaction-toast.tsx +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/components/use-transaction-toast.tsx @@ -1,13 +1,13 @@ -import { toast } from 'sonner' -import { ExplorerLink } from './cluster/cluster-ui' -import { Connection, SendTransactionError } from '@solana/web3.js' +import type { Connection, SendTransactionError } from "@solana/web3.js"; +import { toast } from "sonner"; +import { ExplorerLink } from "./cluster/cluster-ui"; export function useTransactionToast() { return (signature: string) => { - toast('Transaction sent', { + toast("Transaction sent", { description: , - }) - } + }); + }; } export function useTransactionErrorToast() { @@ -16,18 +16,18 @@ export function useTransactionErrorToast() { const anchorError = logs.find((l) => l.startsWith("Program log: AnchorError occurred")); if (anchorError) { if (anchorError.includes("WalletBlocked")) { - toast.error(`Destination wallet is blocked from receiving funds.`) + toast.error(`Destination wallet is blocked from receiving funds.`); } else if (anchorError.includes("WalletNotAllowed")) { - toast.error(`Destination wallet is not allowed to receive funds.`) + toast.error(`Destination wallet is not allowed to receive funds.`); } else if (anchorError.includes("AmountNotAllowed")) { - toast.error(`Destination wallet is not authorized to receive this amount.`) + toast.error(`Destination wallet is not authorized to receive this amount.`); } else { - console.log("ERROR: ", error) - toast.error(`Failed to run program: ${error}`) + console.log("ERROR: ", error); + toast.error(`Failed to run program: ${error}`); } } else { - console.log("ERROR: ", error) - toast.error(`Failed to run program: ${error}`) + console.log("ERROR: ", error); + toast.error(`Failed to run program: ${error}`); } - } + }; } diff --git a/tokens/token-2022/transfer-hook/allow-block-list-token/src/lib/utils.ts b/tokens/token-2022/transfer-hook/allow-block-list-token/src/lib/utils.ts index 1f56ee2d2..c666f4338 100644 --- a/tokens/token-2022/transfer-hook/allow-block-list-token/src/lib/utils.ts +++ b/tokens/token-2022/transfer-hook/allow-block-list-token/src/lib/utils.ts @@ -1,11 +1,11 @@ -import { type ClassValue, clsx } from 'clsx'; -import { twMerge } from 'tailwind-merge'; +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } -export function ellipsify(str = '', len = 4, delimiter = '..') { +export function ellipsify(str = "", len = 4, delimiter = "..") { const strLen = str.length; const limit = len * 2 + delimiter.length; diff --git a/tokens/token-2022/transfer-hook/counter/anchor/Anchor.toml b/tokens/token-2022/transfer-hook/counter/anchor/Anchor.toml index 3ad7e2a52..470d83f16 100644 --- a/tokens/token-2022/transfer-hook/counter/anchor/Anchor.toml +++ b/tokens/token-2022/transfer-hook/counter/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -transfer_hook = "1qahDxKHeCLZhbBU2NyMU6vQCQmEUmdeSEBrG5drffK" - -# [registry] section removed — no longer used in Anchor 1.0 +transfer_hook = "FEu8GvcwSvmeaf8hQ2SvfzSYcSNSuB32WdfYUARTcmqp" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 100000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/transfer-hook/counter/anchor/migrations/deploy.ts b/tokens/token-2022/transfer-hook/counter/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/transfer-hook/counter/anchor/migrations/deploy.ts +++ b/tokens/token-2022/transfer-hook/counter/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/transfer-hook/counter/anchor/package.json b/tokens/token-2022/transfer-hook/counter/anchor/package.json index 3c254f5f9..466b8ee71 100644 --- a/tokens/token-2022/transfer-hook/counter/anchor/package.json +++ b/tokens/token-2022/transfer-hook/counter/anchor/package.json @@ -1,24 +1,24 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.0", - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/chai-as-promised": "^7.1.8", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "chai-as-promised": "^7.1.2", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.0", + "@solana/web3.js": "^1.98.4" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/chai-as-promised": "^7.1.8", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.2", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/transfer-hook/counter/anchor/pnpm-lock.yaml b/tokens/token-2022/transfer-hook/counter/anchor/pnpm-lock.yaml index 17b058e96..fc594a80b 100644 --- a/tokens/token-2022/transfer-hook/counter/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/transfer-hook/counter/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) '@solana/spl-token': specifier: ^0.4.0 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) @@ -51,18 +51,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.29.2': @@ -797,16 +797,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) bn.js: 5.2.2 @@ -824,7 +824,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.29.2': {} diff --git a/tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/Cargo.toml b/tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/Cargo.toml index ff4cc96fd..841067236 100644 --- a/tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/Cargo.toml +++ b/tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/Cargo.toml @@ -20,12 +20,18 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" -anchor-spl = "1.0.0-rc.5" +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" spl-discriminator = "0.4.1" spl-tlv-account-resolution = "0.9.0" spl-transfer-hook-interface = "0.9.0" +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs index 61d6815b7..f1473fdef 100644 --- a/tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/src/lib.rs @@ -23,7 +23,7 @@ use spl_transfer_hook_interface::instruction::{ ExecuteInstruction, InitializeExtraAccountMetaListInstruction, }; -declare_id!("1qahDxKHeCLZhbBU2NyMU6vQCQmEUmdeSEBrG5drffK"); +declare_id!("FEu8GvcwSvmeaf8hQ2SvfzSYcSNSuB32WdfYUARTcmqp"); #[error_code] pub enum TransferError { diff --git a/tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs b/tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs new file mode 100644 index 000000000..3a9219566 --- /dev/null +++ b/tokens/token-2022/transfer-hook/counter/anchor/programs/transfer-hook/tests/test_transfer_hook_counter.rs @@ -0,0 +1,154 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, create_token_extensions_mint, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + MintExtension, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::{build_hook_accounts, get_hook_accounts_address, HookAccount}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_hook::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_hook.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_transfer_hook_counter() { + let (mut svm, program_id, payer) = setup(); + let decimals: u8 = 9; + + // PDAs + let (counter_pda, _) = Pubkey::find_program_address(&[b"counter"], &program_id); + + // Step 1: Create mint with TransferHook extension via kite + let mint = create_token_extensions_mint( + &mut svm, + &payer, + decimals, + None, + &[MintExtension::TransferHook { + program_id: program_id, + }], + ) + .unwrap(); + svm.expire_blockhash(); + + let extra_account_meta_list = + get_hook_accounts_address(&mint, &program_id); + + // Step 2: Create token accounts and mint tokens + let recipient = Keypair::new(); + let amount: u64 = 100 * 10u64.pow(decimals as u32); + + let source_ata = create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source_ata, + amount, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Initialize ExtraAccountMetaList (also creates counter PDA) + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), + transfer_hook::accounts::InitializeExtraAccountMetaList { + payer: payer.pubkey(), + extra_account_meta_list, + mint, + counter_account: counter_pda, + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Transfer with hook (this triggers the counter increment) + let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); + let extra_accounts = build_hook_accounts( + &mint, + &program_id, + &[HookAccount { + pubkey: counter_pda, + is_signer: false, + is_writable: true, + }], + ); + transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint, + &dest_ata, + &payer, + transfer_amount, + decimals, + &extra_accounts, + ).unwrap(); + svm.expire_blockhash(); + + // Step 5: Try calling transfer_hook directly (should fail — not transferring) + let direct_hook_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::TransferHook { amount: 1 }.data(), + transfer_hook::accounts::TransferHook { + source_token: source_ata, + mint, + destination_token: dest_ata, + owner: payer.pubkey(), + extra_account_meta_list, + counter_account: counter_pda, + } + .to_account_metas(None), + ); + let result = send_transaction_from_instructions(&mut svm, vec![direct_hook_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Calling transfer_hook directly should fail because token is not transferring" + ); +} diff --git a/tokens/token-2022/transfer-hook/counter/anchor/tests/transfer-hook.ts b/tokens/token-2022/transfer-hook/counter/anchor/tests/transfer-hook.ts index 1ace10b1a..feaced79d 100644 --- a/tokens/token-2022/transfer-hook/counter/anchor/tests/transfer-hook.ts +++ b/tokens/token-2022/transfer-hook/counter/anchor/tests/transfer-hook.ts @@ -1,5 +1,5 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; import { ASSOCIATED_TOKEN_PROGRAM_ID, createAssociatedTokenAccountInstruction, @@ -11,16 +11,23 @@ import { getAssociatedTokenAddressSync, getMintLen, TOKEN_2022_PROGRAM_ID, -} from '@solana/spl-token'; -import { Keypair, PublicKey, SendTransactionError, SystemProgram, sendAndConfirmTransaction, Transaction } from '@solana/web3.js'; -import { BN } from 'bn.js'; -import chai, { expect } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import type { TransferHook } from '../target/types/transfer_hook'; +} from "@solana/spl-token"; +import { + Keypair, + PublicKey, + SendTransactionError, + SystemProgram, + sendAndConfirmTransaction, + Transaction, +} from "@solana/web3.js"; +import { BN } from "bn.js"; +import chai, { expect } from "chai"; +import chaiAsPromised from "chai-as-promised"; +import type { TransferHook } from "../target/types/transfer_hook"; chai.use(chaiAsPromised); -describe('transfer-hook', () => { +describe("transfer-hook", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); @@ -55,13 +62,13 @@ describe('transfer-hook', () => { // ExtraAccountMetaList address // Store extra accounts required by the custom transfer hook instruction const [extraAccountMetaListPDA] = PublicKey.findProgramAddressSync( - [Buffer.from('extra-account-metas'), mint.publicKey.toBuffer()], + [Buffer.from("extra-account-metas"), mint.publicKey.toBuffer()], program.programId, ); - const [counterPDA] = PublicKey.findProgramAddressSync([Buffer.from('counter')], program.programId); + const [counterPDA] = PublicKey.findProgramAddressSync([Buffer.from("counter")], program.programId); - it('Create Mint Account with Transfer Hook Extension', async () => { + it("Create Mint Account with Transfer Hook Extension", async () => { const extensions = [ExtensionType.TransferHook]; const mintLen = getMintLen(extensions); const lamports = await provider.connection.getMinimumBalanceForRentExemption(mintLen); @@ -85,12 +92,12 @@ describe('transfer-hook', () => { const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer, mint], { skipPreflight: true, - commitment: 'finalized', + commitment: "finalized", }); const txDetails = await program.provider.connection.getTransaction(txSig, { maxSupportedTransactionVersion: 0, - commitment: 'confirmed', + commitment: "confirmed", }); console.log(txDetails.meta.logMessages); @@ -99,7 +106,7 @@ describe('transfer-hook', () => { // Create the two token accounts for the transfer-hook enabled mint // Fund the sender token account with 100 tokens - it('Create Token Accounts and Mint Tokens', async () => { + it("Create Token Accounts and Mint Tokens", async () => { // 100 tokens const amount = 100 * 10 ** decimals; @@ -129,7 +136,7 @@ describe('transfer-hook', () => { }); // Account to store extra accounts required by the transfer hook instruction - it('Create ExtraAccountMetaList Account', async () => { + it("Create ExtraAccountMetaList Account", async () => { const initializeExtraAccountMetaListInstruction = await program.methods .initializeExtraAccountMetaList() .accounts({ @@ -139,11 +146,14 @@ describe('transfer-hook', () => { const transaction = new Transaction().add(initializeExtraAccountMetaListInstruction); - const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer], { skipPreflight: true, commitment: 'confirmed' }); - console.log('Transaction Signature:', txSig); + const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer], { + skipPreflight: true, + commitment: "confirmed", + }); + console.log("Transaction Signature:", txSig); }); - it('Transfer Hook with Extra Account Meta', async () => { + it("Transfer Hook with Extra Account Meta", async () => { // 1 tokens const amount = 1 * 10 ** decimals; const amountBigInt = BigInt(amount); @@ -157,7 +167,7 @@ describe('transfer-hook', () => { amountBigInt, decimals, [], - 'confirmed', + "confirmed", TOKEN_2022_PROGRAM_ID, ); @@ -168,10 +178,10 @@ describe('transfer-hook', () => { const transaction = new Transaction().add(transferInstructionWithHelper); const txSig = await sendAndConfirmTransaction(connection, transaction, [wallet.payer], { skipPreflight: true }); - console.log('Transfer Signature:', txSig); + console.log("Transfer Signature:", txSig); }); - it('Try call transfer hook without transfer', async () => { + it("Try call transfer hook without transfer", async () => { const transferHookIx = await program.methods .transferHook(new BN(1)) .accounts({ diff --git a/tokens/token-2022/transfer-hook/hello-world/anchor/Anchor.toml b/tokens/token-2022/transfer-hook/hello-world/anchor/Anchor.toml index 9f5b53b64..69837e950 100644 --- a/tokens/token-2022/transfer-hook/hello-world/anchor/Anchor.toml +++ b/tokens/token-2022/transfer-hook/hello-world/anchor/Anchor.toml @@ -6,18 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -transfer_hook = "jY5DfVksJT8Le38LCaQhz5USeiGu4rUeVSS8QRAMoba" - -# [registry] section removed — no longer used in Anchor 1.0 +transfer_hook = "2CnfERh8AAgu7hY5Pz6nNSjU5UihtfH8YrHAbXBoCwKg" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" -# Transfer-hook tests use the real local validator (not bankrun). -# No external program clones needed — this project doesn't use Metaplex. -# The previous [[test.validator.clone]] of metaplex was unnecessary and -# caused 5-minute timeouts in CI trying to fetch from devnet. +[hooks] diff --git a/tokens/token-2022/transfer-hook/hello-world/anchor/migrations/deploy.ts b/tokens/token-2022/transfer-hook/hello-world/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/transfer-hook/hello-world/anchor/migrations/deploy.ts +++ b/tokens/token-2022/transfer-hook/hello-world/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/transfer-hook/hello-world/anchor/package.json b/tokens/token-2022/transfer-hook/hello-world/anchor/package.json index 3c254f5f9..466b8ee71 100644 --- a/tokens/token-2022/transfer-hook/hello-world/anchor/package.json +++ b/tokens/token-2022/transfer-hook/hello-world/anchor/package.json @@ -1,24 +1,24 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.0", - "@solana/web3.js": "^1.98.4" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/chai-as-promised": "^7.1.8", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "chai-as-promised": "^7.1.2", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.0", + "@solana/web3.js": "^1.98.4" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/chai-as-promised": "^7.1.8", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.2", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/transfer-hook/hello-world/anchor/pnpm-lock.yaml b/tokens/token-2022/transfer-hook/hello-world/anchor/pnpm-lock.yaml index 17b058e96..fc594a80b 100644 --- a/tokens/token-2022/transfer-hook/hello-world/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/transfer-hook/hello-world/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) '@solana/spl-token': specifier: ^0.4.0 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) @@ -51,18 +51,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.29.2': @@ -797,16 +797,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@6.0.6) bn.js: 5.2.2 @@ -824,7 +824,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.29.2': {} diff --git a/tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/Cargo.toml b/tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/Cargo.toml index ff4cc96fd..841067236 100644 --- a/tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/Cargo.toml +++ b/tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/Cargo.toml @@ -20,12 +20,18 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" -anchor-spl = "1.0.0-rc.5" +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" spl-discriminator = "0.4.1" spl-tlv-account-resolution = "0.9.0" spl-transfer-hook-interface = "0.9.0" +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs index c036cdf5d..9a7caebe4 100644 --- a/tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/src/lib.rs @@ -28,7 +28,7 @@ use spl_transfer_hook_interface::instruction::{ ExecuteInstruction, InitializeExtraAccountMetaListInstruction, }; -declare_id!("jY5DfVksJT8Le38LCaQhz5USeiGu4rUeVSS8QRAMoba"); +declare_id!("2CnfERh8AAgu7hY5Pz6nNSjU5UihtfH8YrHAbXBoCwKg"); #[error_code] pub enum TransferError { diff --git a/tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs new file mode 100644 index 000000000..2bab7fa31 --- /dev/null +++ b/tokens/token-2022/transfer-hook/hello-world/anchor/programs/transfer-hook/tests/test_transfer_hook.rs @@ -0,0 +1,154 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, get_token_extensions_account_address, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::{build_hook_accounts, get_hook_accounts_address}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_hook::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_hook.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_transfer_hook_hello_world() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let recipient = Keypair::new(); + let ata_program = associated_token_program_id(); + let decimals: u8 = 2; + + // ExtraAccountMetaList PDA + let extra_account_meta_list = + get_hook_accounts_address(&mint_keypair.pubkey(), &program_id); + + // Step 1: Create mint with transfer hook extension pointing to our program + // (uses the program's own Initialize instruction, not kite, since it sets up + // the mint with the program as the hook authority) + let initialize_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::Initialize { + _decimals: decimals, + } + .data(), + transfer_hook::accounts::Initialize { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![initialize_ix], &[&payer, &mint_keypair], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 2: Create token accounts and mint tokens + let amount: u64 = 100 * 10u64.pow(decimals as u32); + let source_ata = create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint_keypair.pubkey(), + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint_keypair.pubkey(), + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint_keypair.pubkey(), + &source_ata, + amount, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Create ExtraAccountMetaList account + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), + transfer_hook::accounts::InitializeExtraAccountMetaList { + payer: payer.pubkey(), + extra_account_meta_list, + mint: mint_keypair.pubkey(), + token_program: TOKEN_EXTENSIONS_PROGRAM_ID, + associated_token_program: ata_program, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Transfer with transfer hook + let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); + let extra_accounts = build_hook_accounts( + &mint_keypair.pubkey(), + &program_id, + &[], // hello-world hook has no user-defined extra accounts + ); + transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint_keypair.pubkey(), + &dest_ata, + &payer, + transfer_amount, + decimals, + &extra_accounts, + ).unwrap(); + svm.expire_blockhash(); + + // Step 5: Try calling transfer_hook directly (should fail — not transferring) + let direct_hook_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::TransferHook { _amount: 1 }.data(), + transfer_hook::accounts::TransferHook { + source_token: source_ata, + mint: mint_keypair.pubkey(), + destination_token: dest_ata, + owner: payer.pubkey(), + extra_account_meta_list, + } + .to_account_metas(None), + ); + let result = send_transaction_from_instructions(&mut svm, vec![direct_hook_ix], &[&payer], &payer.pubkey()); + assert!( + result.is_err(), + "Calling transfer_hook directly should fail because token is not transferring" + ); +} diff --git a/tokens/token-2022/transfer-hook/hello-world/anchor/tests/transfer-hook.ts b/tokens/token-2022/transfer-hook/hello-world/anchor/tests/transfer-hook.ts index 7f1dd1825..03716a2b4 100644 --- a/tokens/token-2022/transfer-hook/hello-world/anchor/tests/transfer-hook.ts +++ b/tokens/token-2022/transfer-hook/hello-world/anchor/tests/transfer-hook.ts @@ -1,5 +1,5 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; import { ASSOCIATED_TOKEN_PROGRAM_ID, createAssociatedTokenAccountInstruction, @@ -7,16 +7,16 @@ import { createTransferCheckedWithTransferHookInstruction, getAssociatedTokenAddressSync, TOKEN_2022_PROGRAM_ID, -} from '@solana/spl-token'; -import { Keypair, SendTransactionError, sendAndConfirmTransaction, Transaction } from '@solana/web3.js'; -import { BN } from 'bn.js'; -import chai, { expect } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import type { TransferHook } from '../target/types/transfer_hook'; +} from "@solana/spl-token"; +import { Keypair, SendTransactionError, sendAndConfirmTransaction, Transaction } from "@solana/web3.js"; +import { BN } from "bn.js"; +import chai, { expect } from "chai"; +import chaiAsPromised from "chai-as-promised"; +import type { TransferHook } from "../target/types/transfer_hook"; chai.use(chaiAsPromised); -describe('transfer-hook', () => { +describe("transfer-hook", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); @@ -48,18 +48,18 @@ describe('transfer-hook', () => { ASSOCIATED_TOKEN_PROGRAM_ID, ); - it('Create Mint with Transfer Hook Extension', async () => { + it("Create Mint with Transfer Hook Extension", async () => { const transactionSignature = await program.methods .initialize(decimals) .accounts({ mintAccount: mint.publicKey }) .signers([mint]) .rpc({ skipPreflight: true }); - console.log('Your transaction signature', transactionSignature); + console.log("Your transaction signature", transactionSignature); }); // Create the two token accounts for the transfer-hook enabled mint // Fund the sender token account with 100 tokens - it('Create Token Accounts and Mint Tokens', async () => { + it("Create Token Accounts and Mint Tokens", async () => { // 100 tokens const amount = 100 * 10 ** decimals; @@ -89,7 +89,7 @@ describe('transfer-hook', () => { }); // Account to store extra accounts required by the transfer hook instruction - it('Create ExtraAccountMetaList Account', async () => { + it("Create ExtraAccountMetaList Account", async () => { const initializeExtraAccountMetaListInstruction = await program.methods .initializeExtraAccountMetaList() .accounts({ @@ -99,11 +99,14 @@ describe('transfer-hook', () => { const transaction = new Transaction().add(initializeExtraAccountMetaListInstruction); - const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer], { skipPreflight: true, commitment: 'confirmed' }); - console.log('Transaction Signature:', txSig); + const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer], { + skipPreflight: true, + commitment: "confirmed", + }); + console.log("Transaction Signature:", txSig); }); - it('Transfer Hook with Extra Account Meta', async () => { + it("Transfer Hook with Extra Account Meta", async () => { // 1 tokens const amount = 1 * 10 ** decimals; const bigIntAmount = BigInt(amount); @@ -118,17 +121,17 @@ describe('transfer-hook', () => { bigIntAmount, decimals, [], - 'confirmed', + "confirmed", TOKEN_2022_PROGRAM_ID, ); const transaction = new Transaction().add(transferInstruction); const txSig = await sendAndConfirmTransaction(connection, transaction, [wallet.payer], { skipPreflight: true }); - console.log('Transfer Signature:', txSig); + console.log("Transfer Signature:", txSig); }); - it('Try call transfer hook without transfer', async () => { + it("Try call transfer hook without transfer", async () => { const transferHookIx = await program.methods .transferHook(new BN(1)) .accounts({ diff --git a/tokens/token-2022/transfer-hook/pblock-list/codama.ts b/tokens/token-2022/transfer-hook/pblock-list/codama.ts index b21a0112c..643c667a5 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/codama.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/codama.ts @@ -1,6 +1,6 @@ -import fs from 'node:fs'; -import path from 'node:path'; -import { renderJavaScriptVisitor, renderRustVisitor } from '@codama/renderers'; +import fs from "node:fs"; +import path from "node:path"; +import { renderJavaScriptVisitor, renderRustVisitor } from "@codama/renderers"; import { accountNode, booleanTypeNode, @@ -24,242 +24,248 @@ import { structFieldTypeNode, structTypeNode, variablePdaSeedNode, -} from 'codama'; +} from "codama"; -const _rustClientsDir = path.join(__dirname, '..', 'sdk', 'rust'); -const typescriptClientsDir = path.join(__dirname, '..', 'sdk', 'ts'); +const _rustClientsDir = path.join(__dirname, "..", "sdk", "rust"); +const typescriptClientsDir = path.join(__dirname, "..", "sdk", "ts"); const root = rootNode( programNode({ - name: 'block-list', - publicKey: 'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf', - version: '1.0.0', + name: "block-list", + publicKey: "BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf", + version: "1.0.0", accounts: [ accountNode({ - name: 'config', - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(0)))], + name: "config", + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(0)))], size: 41, - pda: pdaLinkNode('config'), - docs: ['The config PDA account'], + pda: pdaLinkNode("config"), + docs: ["The config PDA account"], data: structTypeNode([ structFieldTypeNode({ - name: 'discriminator', - type: numberTypeNode('u8'), - defaultValueStrategy: 'omitted', + name: "discriminator", + type: numberTypeNode("u8"), + defaultValueStrategy: "omitted", }), structFieldTypeNode({ - name: 'authority', + name: "authority", type: publicKeyTypeNode(), }), structFieldTypeNode({ - name: 'blocked_wallets_count', - type: numberTypeNode('u64'), + name: "blocked_wallets_count", + type: numberTypeNode("u64"), }), ]), }), accountNode({ - name: 'walletBlock', - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(1)))], + name: "walletBlock", + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(1)))], size: 33, - pda: pdaLinkNode('walletBlock'), - docs: ['The config PDA account'], + pda: pdaLinkNode("walletBlock"), + docs: ["The config PDA account"], data: structTypeNode([ structFieldTypeNode({ - name: 'authority', + name: "authority", type: publicKeyTypeNode(), }), ]), }), accountNode({ - name: 'extraMetas', - pda: pdaLinkNode('extraMetas'), - docs: ['The extra metas PDA account'], + name: "extraMetas", + pda: pdaLinkNode("extraMetas"), + docs: ["The extra metas PDA account"], }), ], instructions: [ instructionNode({ - name: 'init', + name: "init", arguments: [ instructionArgumentNode({ - name: 'discriminator', - type: numberTypeNode('u8'), + name: "discriminator", + type: numberTypeNode("u8"), defaultValue: numberValueNode(0xf1), - defaultValueStrategy: 'omitted', + defaultValueStrategy: "omitted", }), ], accounts: [ instructionAccountNode({ - name: 'authority', + name: "authority", isSigner: true, isWritable: true, }), instructionAccountNode({ - name: 'config', + name: "config", isSigner: false, isWritable: true, - defaultValue: pdaValueNode(pdaLinkNode('config')), + defaultValue: pdaValueNode(pdaLinkNode("config")), }), instructionAccountNode({ - name: 'systemProgram', - defaultValue: publicKeyValueNode('11111111111111111111111111111111', 'systemProgram'), + name: "systemProgram", + defaultValue: publicKeyValueNode("11111111111111111111111111111111", "systemProgram"), isSigner: false, isWritable: false, }), ], - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(0xf1)))], - docs: ['Initialize the config PDA account'], + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(0xf1)))], + docs: ["Initialize the config PDA account"], }), instructionNode({ - name: 'blockWallet', + name: "blockWallet", arguments: [ instructionArgumentNode({ - name: 'discriminator', - type: numberTypeNode('u8'), + name: "discriminator", + type: numberTypeNode("u8"), defaultValue: numberValueNode(0xf2), - defaultValueStrategy: 'omitted', + defaultValueStrategy: "omitted", }), ], accounts: [ instructionAccountNode({ - name: 'authority', + name: "authority", isSigner: true, isWritable: true, }), instructionAccountNode({ - name: 'config', + name: "config", isSigner: false, isWritable: true, - defaultValue: pdaValueNode(pdaLinkNode('config')), + defaultValue: pdaValueNode(pdaLinkNode("config")), }), instructionAccountNode({ - name: 'wallet', + name: "wallet", isSigner: false, isWritable: false, }), instructionAccountNode({ - name: 'walletBlock', + name: "walletBlock", isSigner: false, isWritable: true, }), instructionAccountNode({ - name: 'systemProgram', - defaultValue: publicKeyValueNode('11111111111111111111111111111111', 'systemProgram'), + name: "systemProgram", + defaultValue: publicKeyValueNode("11111111111111111111111111111111", "systemProgram"), isSigner: false, isWritable: false, }), ], - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(0xf2)))], - docs: ['Block a wallet'], + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(0xf2)))], + docs: ["Block a wallet"], }), instructionNode({ - name: 'unblockWallet', + name: "unblockWallet", arguments: [ instructionArgumentNode({ - name: 'discriminator', - type: numberTypeNode('u8'), + name: "discriminator", + type: numberTypeNode("u8"), defaultValue: numberValueNode(0xf3), - defaultValueStrategy: 'omitted', + defaultValueStrategy: "omitted", }), ], accounts: [ instructionAccountNode({ - name: 'authority', + name: "authority", isSigner: true, isWritable: true, }), instructionAccountNode({ - name: 'config', + name: "config", isSigner: false, isWritable: true, - defaultValue: pdaValueNode(pdaLinkNode('config')), + defaultValue: pdaValueNode(pdaLinkNode("config")), }), instructionAccountNode({ - name: 'walletBlock', + name: "walletBlock", isSigner: false, isWritable: true, }), instructionAccountNode({ - name: 'systemProgram', - defaultValue: publicKeyValueNode('11111111111111111111111111111111', 'systemProgram'), + name: "systemProgram", + defaultValue: publicKeyValueNode("11111111111111111111111111111111", "systemProgram"), isSigner: false, isWritable: false, }), ], - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(0xf3)))], - docs: ['Unblock a wallet'], + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(0xf3)))], + docs: ["Unblock a wallet"], }), instructionNode({ - name: 'setupExtraMetas', + name: "setupExtraMetas", arguments: [ instructionArgumentNode({ - name: 'discriminator', - type: numberTypeNode('u8'), + name: "discriminator", + type: numberTypeNode("u8"), defaultValue: numberValueNode(0x6a), - defaultValueStrategy: 'omitted', + defaultValueStrategy: "omitted", }), instructionArgumentNode({ - name: 'checkBothWallets', + name: "checkBothWallets", type: booleanTypeNode(), defaultValue: booleanValueNode(false), - defaultValueStrategy: 'optional', + defaultValueStrategy: "optional", }), ], accounts: [ instructionAccountNode({ - name: 'authority', + name: "authority", isSigner: true, isWritable: true, }), instructionAccountNode({ - name: 'config', + name: "config", isSigner: false, isWritable: false, - defaultValue: pdaValueNode(pdaLinkNode('config')), + defaultValue: pdaValueNode(pdaLinkNode("config")), }), instructionAccountNode({ - name: 'mint', + name: "mint", isSigner: false, isWritable: false, }), instructionAccountNode({ - name: 'extraMetas', + name: "extraMetas", isSigner: false, isWritable: true, - defaultValue: pdaValueNode(pdaLinkNode('extraMetas')), + defaultValue: pdaValueNode(pdaLinkNode("extraMetas")), }), instructionAccountNode({ - name: 'systemProgram', - defaultValue: publicKeyValueNode('11111111111111111111111111111111', 'systemProgram'), + name: "systemProgram", + defaultValue: publicKeyValueNode("11111111111111111111111111111111", "systemProgram"), isSigner: false, isWritable: false, }), ], - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(0x6a)))], - docs: ['Unblock a wallet'], + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(0x6a)))], + docs: ["Unblock a wallet"], }), ], pdas: [ pdaNode({ - name: 'config', - seeds: [constantPdaSeedNodeFromString('utf8', 'config')], - docs: ['The config PDA account'], + name: "config", + seeds: [constantPdaSeedNodeFromString("utf8", "config")], + docs: ["The config PDA account"], }), pdaNode({ - name: 'walletBlock', - seeds: [constantPdaSeedNodeFromString('utf8', 'wallet_block'), variablePdaSeedNode('wallet', publicKeyTypeNode())], - docs: ['The wallet block PDA account'], + name: "walletBlock", + seeds: [ + constantPdaSeedNodeFromString("utf8", "wallet_block"), + variablePdaSeedNode("wallet", publicKeyTypeNode()), + ], + docs: ["The wallet block PDA account"], }), pdaNode({ - name: 'extraMetas', - seeds: [constantPdaSeedNodeFromString('utf8', 'extra-account-metas'), variablePdaSeedNode('mint', publicKeyTypeNode())], - docs: ['The extra metas PDA account'], + name: "extraMetas", + seeds: [ + constantPdaSeedNodeFromString("utf8", "extra-account-metas"), + variablePdaSeedNode("mint", publicKeyTypeNode()), + ], + docs: ["The extra metas PDA account"], }), ], }), ); function preserveConfigFiles() { - const filesToPreserve = ['package.json', 'tsconfig.json', '.npmignore', 'pnpm-lock.yaml', 'Cargo.toml']; + const filesToPreserve = ["package.json", "tsconfig.json", ".npmignore", "pnpm-lock.yaml", "Cargo.toml"]; const preservedFiles = new Map(); for (const filename of filesToPreserve) { @@ -289,5 +295,10 @@ const codama = createFromRoot(root); const _configPreserver = preserveConfigFiles(); -codama.accept(renderJavaScriptVisitor('sdk/ts/src', { formatCode: true })); -codama.accept(renderRustVisitor('sdk/rust/src/client', { crateFolder: 'sdk/rust/', formatCode: true })); +codama.accept(renderJavaScriptVisitor("sdk/ts/src", { formatCode: true })); +codama.accept( + renderRustVisitor("sdk/rust/src/client", { + crateFolder: "sdk/rust/", + formatCode: true, + }), +); diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/codama.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/codama.ts index b21a0112c..643c667a5 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/codama.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/codama.ts @@ -1,6 +1,6 @@ -import fs from 'node:fs'; -import path from 'node:path'; -import { renderJavaScriptVisitor, renderRustVisitor } from '@codama/renderers'; +import fs from "node:fs"; +import path from "node:path"; +import { renderJavaScriptVisitor, renderRustVisitor } from "@codama/renderers"; import { accountNode, booleanTypeNode, @@ -24,242 +24,248 @@ import { structFieldTypeNode, structTypeNode, variablePdaSeedNode, -} from 'codama'; +} from "codama"; -const _rustClientsDir = path.join(__dirname, '..', 'sdk', 'rust'); -const typescriptClientsDir = path.join(__dirname, '..', 'sdk', 'ts'); +const _rustClientsDir = path.join(__dirname, "..", "sdk", "rust"); +const typescriptClientsDir = path.join(__dirname, "..", "sdk", "ts"); const root = rootNode( programNode({ - name: 'block-list', - publicKey: 'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf', - version: '1.0.0', + name: "block-list", + publicKey: "BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf", + version: "1.0.0", accounts: [ accountNode({ - name: 'config', - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(0)))], + name: "config", + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(0)))], size: 41, - pda: pdaLinkNode('config'), - docs: ['The config PDA account'], + pda: pdaLinkNode("config"), + docs: ["The config PDA account"], data: structTypeNode([ structFieldTypeNode({ - name: 'discriminator', - type: numberTypeNode('u8'), - defaultValueStrategy: 'omitted', + name: "discriminator", + type: numberTypeNode("u8"), + defaultValueStrategy: "omitted", }), structFieldTypeNode({ - name: 'authority', + name: "authority", type: publicKeyTypeNode(), }), structFieldTypeNode({ - name: 'blocked_wallets_count', - type: numberTypeNode('u64'), + name: "blocked_wallets_count", + type: numberTypeNode("u64"), }), ]), }), accountNode({ - name: 'walletBlock', - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(1)))], + name: "walletBlock", + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(1)))], size: 33, - pda: pdaLinkNode('walletBlock'), - docs: ['The config PDA account'], + pda: pdaLinkNode("walletBlock"), + docs: ["The config PDA account"], data: structTypeNode([ structFieldTypeNode({ - name: 'authority', + name: "authority", type: publicKeyTypeNode(), }), ]), }), accountNode({ - name: 'extraMetas', - pda: pdaLinkNode('extraMetas'), - docs: ['The extra metas PDA account'], + name: "extraMetas", + pda: pdaLinkNode("extraMetas"), + docs: ["The extra metas PDA account"], }), ], instructions: [ instructionNode({ - name: 'init', + name: "init", arguments: [ instructionArgumentNode({ - name: 'discriminator', - type: numberTypeNode('u8'), + name: "discriminator", + type: numberTypeNode("u8"), defaultValue: numberValueNode(0xf1), - defaultValueStrategy: 'omitted', + defaultValueStrategy: "omitted", }), ], accounts: [ instructionAccountNode({ - name: 'authority', + name: "authority", isSigner: true, isWritable: true, }), instructionAccountNode({ - name: 'config', + name: "config", isSigner: false, isWritable: true, - defaultValue: pdaValueNode(pdaLinkNode('config')), + defaultValue: pdaValueNode(pdaLinkNode("config")), }), instructionAccountNode({ - name: 'systemProgram', - defaultValue: publicKeyValueNode('11111111111111111111111111111111', 'systemProgram'), + name: "systemProgram", + defaultValue: publicKeyValueNode("11111111111111111111111111111111", "systemProgram"), isSigner: false, isWritable: false, }), ], - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(0xf1)))], - docs: ['Initialize the config PDA account'], + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(0xf1)))], + docs: ["Initialize the config PDA account"], }), instructionNode({ - name: 'blockWallet', + name: "blockWallet", arguments: [ instructionArgumentNode({ - name: 'discriminator', - type: numberTypeNode('u8'), + name: "discriminator", + type: numberTypeNode("u8"), defaultValue: numberValueNode(0xf2), - defaultValueStrategy: 'omitted', + defaultValueStrategy: "omitted", }), ], accounts: [ instructionAccountNode({ - name: 'authority', + name: "authority", isSigner: true, isWritable: true, }), instructionAccountNode({ - name: 'config', + name: "config", isSigner: false, isWritable: true, - defaultValue: pdaValueNode(pdaLinkNode('config')), + defaultValue: pdaValueNode(pdaLinkNode("config")), }), instructionAccountNode({ - name: 'wallet', + name: "wallet", isSigner: false, isWritable: false, }), instructionAccountNode({ - name: 'walletBlock', + name: "walletBlock", isSigner: false, isWritable: true, }), instructionAccountNode({ - name: 'systemProgram', - defaultValue: publicKeyValueNode('11111111111111111111111111111111', 'systemProgram'), + name: "systemProgram", + defaultValue: publicKeyValueNode("11111111111111111111111111111111", "systemProgram"), isSigner: false, isWritable: false, }), ], - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(0xf2)))], - docs: ['Block a wallet'], + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(0xf2)))], + docs: ["Block a wallet"], }), instructionNode({ - name: 'unblockWallet', + name: "unblockWallet", arguments: [ instructionArgumentNode({ - name: 'discriminator', - type: numberTypeNode('u8'), + name: "discriminator", + type: numberTypeNode("u8"), defaultValue: numberValueNode(0xf3), - defaultValueStrategy: 'omitted', + defaultValueStrategy: "omitted", }), ], accounts: [ instructionAccountNode({ - name: 'authority', + name: "authority", isSigner: true, isWritable: true, }), instructionAccountNode({ - name: 'config', + name: "config", isSigner: false, isWritable: true, - defaultValue: pdaValueNode(pdaLinkNode('config')), + defaultValue: pdaValueNode(pdaLinkNode("config")), }), instructionAccountNode({ - name: 'walletBlock', + name: "walletBlock", isSigner: false, isWritable: true, }), instructionAccountNode({ - name: 'systemProgram', - defaultValue: publicKeyValueNode('11111111111111111111111111111111', 'systemProgram'), + name: "systemProgram", + defaultValue: publicKeyValueNode("11111111111111111111111111111111", "systemProgram"), isSigner: false, isWritable: false, }), ], - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(0xf3)))], - docs: ['Unblock a wallet'], + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(0xf3)))], + docs: ["Unblock a wallet"], }), instructionNode({ - name: 'setupExtraMetas', + name: "setupExtraMetas", arguments: [ instructionArgumentNode({ - name: 'discriminator', - type: numberTypeNode('u8'), + name: "discriminator", + type: numberTypeNode("u8"), defaultValue: numberValueNode(0x6a), - defaultValueStrategy: 'omitted', + defaultValueStrategy: "omitted", }), instructionArgumentNode({ - name: 'checkBothWallets', + name: "checkBothWallets", type: booleanTypeNode(), defaultValue: booleanValueNode(false), - defaultValueStrategy: 'optional', + defaultValueStrategy: "optional", }), ], accounts: [ instructionAccountNode({ - name: 'authority', + name: "authority", isSigner: true, isWritable: true, }), instructionAccountNode({ - name: 'config', + name: "config", isSigner: false, isWritable: false, - defaultValue: pdaValueNode(pdaLinkNode('config')), + defaultValue: pdaValueNode(pdaLinkNode("config")), }), instructionAccountNode({ - name: 'mint', + name: "mint", isSigner: false, isWritable: false, }), instructionAccountNode({ - name: 'extraMetas', + name: "extraMetas", isSigner: false, isWritable: true, - defaultValue: pdaValueNode(pdaLinkNode('extraMetas')), + defaultValue: pdaValueNode(pdaLinkNode("extraMetas")), }), instructionAccountNode({ - name: 'systemProgram', - defaultValue: publicKeyValueNode('11111111111111111111111111111111', 'systemProgram'), + name: "systemProgram", + defaultValue: publicKeyValueNode("11111111111111111111111111111111", "systemProgram"), isSigner: false, isWritable: false, }), ], - discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode('u8'), numberValueNode(0x6a)))], - docs: ['Unblock a wallet'], + discriminators: [constantDiscriminatorNode(constantValueNode(numberTypeNode("u8"), numberValueNode(0x6a)))], + docs: ["Unblock a wallet"], }), ], pdas: [ pdaNode({ - name: 'config', - seeds: [constantPdaSeedNodeFromString('utf8', 'config')], - docs: ['The config PDA account'], + name: "config", + seeds: [constantPdaSeedNodeFromString("utf8", "config")], + docs: ["The config PDA account"], }), pdaNode({ - name: 'walletBlock', - seeds: [constantPdaSeedNodeFromString('utf8', 'wallet_block'), variablePdaSeedNode('wallet', publicKeyTypeNode())], - docs: ['The wallet block PDA account'], + name: "walletBlock", + seeds: [ + constantPdaSeedNodeFromString("utf8", "wallet_block"), + variablePdaSeedNode("wallet", publicKeyTypeNode()), + ], + docs: ["The wallet block PDA account"], }), pdaNode({ - name: 'extraMetas', - seeds: [constantPdaSeedNodeFromString('utf8', 'extra-account-metas'), variablePdaSeedNode('mint', publicKeyTypeNode())], - docs: ['The extra metas PDA account'], + name: "extraMetas", + seeds: [ + constantPdaSeedNodeFromString("utf8", "extra-account-metas"), + variablePdaSeedNode("mint", publicKeyTypeNode()), + ], + docs: ["The extra metas PDA account"], }), ], }), ); function preserveConfigFiles() { - const filesToPreserve = ['package.json', 'tsconfig.json', '.npmignore', 'pnpm-lock.yaml', 'Cargo.toml']; + const filesToPreserve = ["package.json", "tsconfig.json", ".npmignore", "pnpm-lock.yaml", "Cargo.toml"]; const preservedFiles = new Map(); for (const filename of filesToPreserve) { @@ -289,5 +295,10 @@ const codama = createFromRoot(root); const _configPreserver = preserveConfigFiles(); -codama.accept(renderJavaScriptVisitor('sdk/ts/src', { formatCode: true })); -codama.accept(renderRustVisitor('sdk/rust/src/client', { crateFolder: 'sdk/rust/', formatCode: true })); +codama.accept(renderJavaScriptVisitor("sdk/ts/src", { formatCode: true })); +codama.accept( + renderRustVisitor("sdk/rust/src/client", { + crateFolder: "sdk/rust/", + formatCode: true, + }), +); diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/config.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/config.ts index d59757590..03a52b664 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/config.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/config.ts @@ -31,8 +31,8 @@ import { getU64Encoder, type MaybeAccount, type MaybeEncodedAccount, -} from '@solana/kit'; -import { findConfigPda } from '../pdas'; +} from "@solana/kit"; +import { findConfigPda } from "../pdas"; export const CONFIG_DISCRIMINATOR = 0; @@ -54,17 +54,17 @@ export type ConfigArgs = { export function getConfigEncoder(): Encoder { return getStructEncoder([ - ['discriminator', getU8Encoder()], - ['authority', getAddressEncoder()], - ['blockedWalletsCount', getU64Encoder()], + ["discriminator", getU8Encoder()], + ["authority", getAddressEncoder()], + ["blockedWalletsCount", getU64Encoder()], ]); } export function getConfigDecoder(): Decoder { return getStructDecoder([ - ['discriminator', getU8Decoder()], - ['authority', getAddressDecoder()], - ['blockedWalletsCount', getU64Decoder()], + ["discriminator", getU8Decoder()], + ["authority", getAddressDecoder()], + ["blockedWalletsCount", getU64Decoder()], ]); } @@ -72,8 +72,12 @@ export function getConfigCodec(): Codec { return combineCodec(getConfigEncoder(), getConfigDecoder()); } -export function decodeConfig(encodedAccount: EncodedAccount): Account; -export function decodeConfig(encodedAccount: MaybeEncodedAccount): MaybeAccount; +export function decodeConfig( + encodedAccount: EncodedAccount, +): Account; +export function decodeConfig( + encodedAccount: MaybeEncodedAccount, +): MaybeAccount; export function decodeConfig( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): Account | MaybeAccount { diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/extraMetas.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/extraMetas.ts index 3292ead79..93859232f 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/extraMetas.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/extraMetas.ts @@ -25,10 +25,10 @@ import { getStructEncoder, type MaybeAccount, type MaybeEncodedAccount, -} from '@solana/kit'; -import { ExtraMetasSeeds, findExtraMetasPda } from '../pdas'; +} from "@solana/kit"; +import { type ExtraMetasSeeds, findExtraMetasPda } from "../pdas"; -export type ExtraMetas = {}; +export type ExtraMetas = Record; export type ExtraMetasArgs = ExtraMetas; @@ -44,8 +44,12 @@ export function getExtraMetasCodec(): Codec { return combineCodec(getExtraMetasEncoder(), getExtraMetasDecoder()); } -export function decodeExtraMetas(encodedAccount: EncodedAccount): Account; -export function decodeExtraMetas(encodedAccount: MaybeEncodedAccount): MaybeAccount; +export function decodeExtraMetas( + encodedAccount: EncodedAccount, +): Account; +export function decodeExtraMetas( + encodedAccount: MaybeEncodedAccount, +): MaybeAccount; export function decodeExtraMetas( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): Account | MaybeAccount { diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/index.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/index.ts index ed620eb19..6135b7a67 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/index.ts @@ -6,6 +6,6 @@ * @see https://github.com/codama-idl/codama */ -export * from './config'; -export * from './extraMetas'; -export * from './walletBlock'; +export * from "./config"; +export * from "./extraMetas"; +export * from "./walletBlock"; diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/walletBlock.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/walletBlock.ts index 886a73f79..29a8309a9 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/walletBlock.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/accounts/walletBlock.ts @@ -28,8 +28,8 @@ import { getU8Encoder, type MaybeAccount, type MaybeEncodedAccount, -} from '@solana/kit'; -import { findWalletBlockPda, WalletBlockSeeds } from '../pdas'; +} from "@solana/kit"; +import { findWalletBlockPda, type WalletBlockSeeds } from "../pdas"; export const WALLET_BLOCK_DISCRIMINATOR = 1; @@ -42,18 +42,20 @@ export type WalletBlock = { authority: Address }; export type WalletBlockArgs = WalletBlock; export function getWalletBlockEncoder(): Encoder { - return getStructEncoder([['authority', getAddressEncoder()]]); + return getStructEncoder([["authority", getAddressEncoder()]]); } export function getWalletBlockDecoder(): Decoder { - return getStructDecoder([['authority', getAddressDecoder()]]); + return getStructDecoder([["authority", getAddressDecoder()]]); } export function getWalletBlockCodec(): Codec { return combineCodec(getWalletBlockEncoder(), getWalletBlockDecoder()); } -export function decodeWalletBlock(encodedAccount: EncodedAccount): Account; +export function decodeWalletBlock( + encodedAccount: EncodedAccount, +): Account; export function decodeWalletBlock( encodedAccount: MaybeEncodedAccount, ): MaybeAccount; diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/index.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/index.ts index 1002b8203..cf9bea234 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/index.ts @@ -6,7 +6,7 @@ * @see https://github.com/codama-idl/codama */ -export * from './accounts'; -export * from './instructions'; -export * from './pdas'; -export * from './programs'; +export * from "./accounts"; +export * from "./instructions"; +export * from "./pdas"; +export * from "./programs"; diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/blockWallet.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/blockWallet.ts index b0f1d4d19..e49ba63b7 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/blockWallet.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/blockWallet.ts @@ -26,10 +26,10 @@ import { transformEncoder, type WritableAccount, type WritableSignerAccount, -} from '@solana/kit'; -import { findConfigPda } from '../pdas'; -import { BLOCK_LIST_PROGRAM_ADDRESS } from '../programs'; -import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; +} from "@solana/kit"; +import { findConfigPda } from "../pdas"; +import { BLOCK_LIST_PROGRAM_ADDRESS } from "../programs"; +import { getAccountMetaFactory, type ResolvedAccount } from "../shared"; export const BLOCK_WALLET_DISCRIMINATOR = 242; @@ -43,13 +43,15 @@ export type BlockWalletInstruction< TAccountConfig extends string | IAccountMeta = string, TAccountWallet extends string | IAccountMeta = string, TAccountWalletBlock extends string | IAccountMeta = string, - TAccountSystemProgram extends string | IAccountMeta = '11111111111111111111111111111111', + TAccountSystemProgram extends string | IAccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly IAccountMeta[] = [], > = IInstruction & IInstructionWithData & IInstructionWithAccounts< [ - TAccountAuthority extends string ? WritableSignerAccount & IAccountSignerMeta : TAccountAuthority, + TAccountAuthority extends string + ? WritableSignerAccount & IAccountSignerMeta + : TAccountAuthority, TAccountConfig extends string ? WritableAccount : TAccountConfig, TAccountWallet extends string ? ReadonlyAccount : TAccountWallet, TAccountWalletBlock extends string ? WritableAccount : TAccountWalletBlock, @@ -60,17 +62,23 @@ export type BlockWalletInstruction< export type BlockWalletInstructionData = { discriminator: number }; -export type BlockWalletInstructionDataArgs = {}; +export type BlockWalletInstructionDataArgs = Record; export function getBlockWalletInstructionDataEncoder(): Encoder { - return transformEncoder(getStructEncoder([['discriminator', getU8Encoder()]]), (value) => ({ ...value, discriminator: 242 })); + return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ + ...value, + discriminator: 242, + })); } export function getBlockWalletInstructionDataDecoder(): Decoder { - return getStructDecoder([['discriminator', getU8Decoder()]]); + return getStructDecoder([["discriminator", getU8Decoder()]]); } -export function getBlockWalletInstructionDataCodec(): Codec { +export function getBlockWalletInstructionDataCodec(): Codec< + BlockWalletInstructionDataArgs, + BlockWalletInstructionData +> { return combineCodec(getBlockWalletInstructionDataEncoder(), getBlockWalletInstructionDataDecoder()); } @@ -96,9 +104,24 @@ export async function getBlockWalletInstructionAsync< TAccountSystemProgram extends string, TProgramAddress extends Address = typeof BLOCK_LIST_PROGRAM_ADDRESS, >( - input: BlockWalletAsyncInput, + input: BlockWalletAsyncInput< + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram + >, config?: { programAddress?: TProgramAddress }, -): Promise> { +): Promise< + BlockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram + > +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -117,10 +140,10 @@ export async function getBlockWalletInstructionAsync< accounts.config.value = await findConfigPda(); } if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -131,7 +154,14 @@ export async function getBlockWalletInstructionAsync< ], programAddress, data: getBlockWalletInstructionDataEncoder().encode({}), - } as BlockWalletInstruction; + } as BlockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram + >; return instruction; } @@ -158,9 +188,22 @@ export function getBlockWalletInstruction< TAccountSystemProgram extends string, TProgramAddress extends Address = typeof BLOCK_LIST_PROGRAM_ADDRESS, >( - input: BlockWalletInput, + input: BlockWalletInput< + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram + >, config?: { programAddress?: TProgramAddress }, -): BlockWalletInstruction { +): BlockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -176,10 +219,10 @@ export function getBlockWalletInstruction< // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -190,7 +233,14 @@ export function getBlockWalletInstruction< ], programAddress, data: getBlockWalletInstructionDataEncoder().encode({}), - } as BlockWalletInstruction; + } as BlockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram + >; return instruction; } @@ -215,11 +265,11 @@ export function parseBlockWalletInstruction { if (instruction.accounts.length < 5) { // TODO: Coded error. - throw new Error('Not enough accounts'); + throw new Error("Not enough accounts"); } let accountIndex = 0; const getNextAccount = () => { - const accountMeta = instruction.accounts?.[accountIndex]!; + const accountMeta = instruction.accounts[accountIndex]; accountIndex += 1; return accountMeta; }; diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/index.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/index.ts index 864cb10b3..f4bba88c5 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/index.ts @@ -6,7 +6,7 @@ * @see https://github.com/codama-idl/codama */ -export * from './blockWallet'; -export * from './init'; -export * from './setupExtraMetas'; -export * from './unblockWallet'; +export * from "./blockWallet"; +export * from "./init"; +export * from "./setupExtraMetas"; +export * from "./unblockWallet"; diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/init.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/init.ts index f02a8fe63..860840983 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/init.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/init.ts @@ -26,10 +26,10 @@ import { transformEncoder, type WritableAccount, type WritableSignerAccount, -} from '@solana/kit'; -import { findConfigPda } from '../pdas'; -import { BLOCK_LIST_PROGRAM_ADDRESS } from '../programs'; -import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; +} from "@solana/kit"; +import { findConfigPda } from "../pdas"; +import { BLOCK_LIST_PROGRAM_ADDRESS } from "../programs"; +import { getAccountMetaFactory, type ResolvedAccount } from "../shared"; export const INIT_DISCRIMINATOR = 241; @@ -41,13 +41,15 @@ export type InitInstruction< TProgram extends string = typeof BLOCK_LIST_PROGRAM_ADDRESS, TAccountAuthority extends string | IAccountMeta = string, TAccountConfig extends string | IAccountMeta = string, - TAccountSystemProgram extends string | IAccountMeta = '11111111111111111111111111111111', + TAccountSystemProgram extends string | IAccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly IAccountMeta[] = [], > = IInstruction & IInstructionWithData & IInstructionWithAccounts< [ - TAccountAuthority extends string ? WritableSignerAccount & IAccountSignerMeta : TAccountAuthority, + TAccountAuthority extends string + ? WritableSignerAccount & IAccountSignerMeta + : TAccountAuthority, TAccountConfig extends string ? WritableAccount : TAccountConfig, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, ...TRemainingAccounts, @@ -56,14 +58,17 @@ export type InitInstruction< export type InitInstructionData = { discriminator: number }; -export type InitInstructionDataArgs = {}; +export type InitInstructionDataArgs = Record; export function getInitInstructionDataEncoder(): Encoder { - return transformEncoder(getStructEncoder([['discriminator', getU8Encoder()]]), (value) => ({ ...value, discriminator: 241 })); + return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ + ...value, + discriminator: 241, + })); } export function getInitInstructionDataDecoder(): Decoder { - return getStructDecoder([['discriminator', getU8Decoder()]]); + return getStructDecoder([["discriminator", getU8Decoder()]]); } export function getInitInstructionDataCodec(): Codec { @@ -105,12 +110,16 @@ export async function getInitInstructionAsync< accounts.config.value = await findConfigPda(); } if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { - accounts: [getAccountMeta(accounts.authority), getAccountMeta(accounts.config), getAccountMeta(accounts.systemProgram)], + accounts: [ + getAccountMeta(accounts.authority), + getAccountMeta(accounts.config), + getAccountMeta(accounts.systemProgram), + ], programAddress, data: getInitInstructionDataEncoder().encode({}), } as InitInstruction; @@ -150,12 +159,16 @@ export function getInitInstruction< // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { - accounts: [getAccountMeta(accounts.authority), getAccountMeta(accounts.config), getAccountMeta(accounts.systemProgram)], + accounts: [ + getAccountMeta(accounts.authority), + getAccountMeta(accounts.config), + getAccountMeta(accounts.systemProgram), + ], programAddress, data: getInitInstructionDataEncoder().encode({}), } as InitInstruction; @@ -181,11 +194,11 @@ export function parseInitInstruction { if (instruction.accounts.length < 3) { // TODO: Coded error. - throw new Error('Not enough accounts'); + throw new Error("Not enough accounts"); } let accountIndex = 0; const getNextAccount = () => { - const accountMeta = instruction.accounts?.[accountIndex]!; + const accountMeta = instruction.accounts[accountIndex]; accountIndex += 1; return accountMeta; }; diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/setupExtraMetas.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/setupExtraMetas.ts index 021e6729c..c9004cd3b 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/setupExtraMetas.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/setupExtraMetas.ts @@ -28,10 +28,10 @@ import { transformEncoder, type WritableAccount, type WritableSignerAccount, -} from '@solana/kit'; -import { findConfigPda, findExtraMetasPda } from '../pdas'; -import { BLOCK_LIST_PROGRAM_ADDRESS } from '../programs'; -import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; +} from "@solana/kit"; +import { findConfigPda, findExtraMetasPda } from "../pdas"; +import { BLOCK_LIST_PROGRAM_ADDRESS } from "../programs"; +import { getAccountMetaFactory, type ResolvedAccount } from "../shared"; export const SETUP_EXTRA_METAS_DISCRIMINATOR = 106; @@ -45,13 +45,15 @@ export type SetupExtraMetasInstruction< TAccountConfig extends string | IAccountMeta = string, TAccountMint extends string | IAccountMeta = string, TAccountExtraMetas extends string | IAccountMeta = string, - TAccountSystemProgram extends string | IAccountMeta = '11111111111111111111111111111111', + TAccountSystemProgram extends string | IAccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly IAccountMeta[] = [], > = IInstruction & IInstructionWithData & IInstructionWithAccounts< [ - TAccountAuthority extends string ? WritableSignerAccount & IAccountSignerMeta : TAccountAuthority, + TAccountAuthority extends string + ? WritableSignerAccount & IAccountSignerMeta + : TAccountAuthority, TAccountConfig extends string ? ReadonlyAccount : TAccountConfig, TAccountMint extends string ? ReadonlyAccount : TAccountMint, TAccountExtraMetas extends string ? WritableAccount : TAccountExtraMetas, @@ -70,8 +72,8 @@ export type SetupExtraMetasInstructionDataArgs = { checkBothWallets?: boolean }; export function getSetupExtraMetasInstructionDataEncoder(): Encoder { return transformEncoder( getStructEncoder([ - ['discriminator', getU8Encoder()], - ['checkBothWallets', getBooleanEncoder()], + ["discriminator", getU8Encoder()], + ["checkBothWallets", getBooleanEncoder()], ]), (value) => ({ ...value, @@ -83,12 +85,15 @@ export function getSetupExtraMetasInstructionDataEncoder(): Encoder { return getStructDecoder([ - ['discriminator', getU8Decoder()], - ['checkBothWallets', getBooleanDecoder()], + ["discriminator", getU8Decoder()], + ["checkBothWallets", getBooleanDecoder()], ]); } -export function getSetupExtraMetasInstructionDataCodec(): Codec { +export function getSetupExtraMetasInstructionDataCodec(): Codec< + SetupExtraMetasInstructionDataArgs, + SetupExtraMetasInstructionData +> { return combineCodec(getSetupExtraMetasInstructionDataEncoder(), getSetupExtraMetasInstructionDataDecoder()); } @@ -104,7 +109,7 @@ export type SetupExtraMetasAsyncInput< mint: Address; extraMetas?: Address; systemProgram?: Address; - checkBothWallets?: SetupExtraMetasInstructionDataArgs['checkBothWallets']; + checkBothWallets?: SetupExtraMetasInstructionDataArgs["checkBothWallets"]; }; export async function getSetupExtraMetasInstructionAsync< @@ -115,9 +120,24 @@ export async function getSetupExtraMetasInstructionAsync< TAccountSystemProgram extends string, TProgramAddress extends Address = typeof BLOCK_LIST_PROGRAM_ADDRESS, >( - input: SetupExtraMetasAsyncInput, + input: SetupExtraMetasAsyncInput< + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram + >, config?: { programAddress?: TProgramAddress }, -): Promise> { +): Promise< + SetupExtraMetasInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram + > +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -142,10 +162,10 @@ export async function getSetupExtraMetasInstructionAsync< accounts.extraMetas.value = await findExtraMetasPda(); } if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -156,7 +176,14 @@ export async function getSetupExtraMetasInstructionAsync< ], programAddress, data: getSetupExtraMetasInstructionDataEncoder().encode(args as SetupExtraMetasInstructionDataArgs), - } as SetupExtraMetasInstruction; + } as SetupExtraMetasInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram + >; return instruction; } @@ -173,7 +200,7 @@ export type SetupExtraMetasInput< mint: Address; extraMetas: Address; systemProgram?: Address; - checkBothWallets?: SetupExtraMetasInstructionDataArgs['checkBothWallets']; + checkBothWallets?: SetupExtraMetasInstructionDataArgs["checkBothWallets"]; }; export function getSetupExtraMetasInstruction< @@ -184,9 +211,22 @@ export function getSetupExtraMetasInstruction< TAccountSystemProgram extends string, TProgramAddress extends Address = typeof BLOCK_LIST_PROGRAM_ADDRESS, >( - input: SetupExtraMetasInput, + input: SetupExtraMetasInput< + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram + >, config?: { programAddress?: TProgramAddress }, -): SetupExtraMetasInstruction { +): SetupExtraMetasInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -205,10 +245,10 @@ export function getSetupExtraMetasInstruction< // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -219,7 +259,14 @@ export function getSetupExtraMetasInstruction< ], programAddress, data: getSetupExtraMetasInstructionDataEncoder().encode(args as SetupExtraMetasInstructionDataArgs), - } as SetupExtraMetasInstruction; + } as SetupExtraMetasInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram + >; return instruction; } @@ -244,11 +291,11 @@ export function parseSetupExtraMetasInstruction { if (instruction.accounts.length < 5) { // TODO: Coded error. - throw new Error('Not enough accounts'); + throw new Error("Not enough accounts"); } let accountIndex = 0; const getNextAccount = () => { - const accountMeta = instruction.accounts?.[accountIndex]!; + const accountMeta = instruction.accounts[accountIndex]; accountIndex += 1; return accountMeta; }; diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/unblockWallet.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/unblockWallet.ts index d17158efe..40b3f33f0 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/unblockWallet.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/instructions/unblockWallet.ts @@ -26,10 +26,10 @@ import { transformEncoder, type WritableAccount, type WritableSignerAccount, -} from '@solana/kit'; -import { findConfigPda } from '../pdas'; -import { BLOCK_LIST_PROGRAM_ADDRESS } from '../programs'; -import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; +} from "@solana/kit"; +import { findConfigPda } from "../pdas"; +import { BLOCK_LIST_PROGRAM_ADDRESS } from "../programs"; +import { getAccountMetaFactory, type ResolvedAccount } from "../shared"; export const UNBLOCK_WALLET_DISCRIMINATOR = 243; @@ -42,13 +42,15 @@ export type UnblockWalletInstruction< TAccountAuthority extends string | IAccountMeta = string, TAccountConfig extends string | IAccountMeta = string, TAccountWalletBlock extends string | IAccountMeta = string, - TAccountSystemProgram extends string | IAccountMeta = '11111111111111111111111111111111', + TAccountSystemProgram extends string | IAccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly IAccountMeta[] = [], > = IInstruction & IInstructionWithData & IInstructionWithAccounts< [ - TAccountAuthority extends string ? WritableSignerAccount & IAccountSignerMeta : TAccountAuthority, + TAccountAuthority extends string + ? WritableSignerAccount & IAccountSignerMeta + : TAccountAuthority, TAccountConfig extends string ? WritableAccount : TAccountConfig, TAccountWalletBlock extends string ? WritableAccount : TAccountWalletBlock, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, @@ -58,17 +60,23 @@ export type UnblockWalletInstruction< export type UnblockWalletInstructionData = { discriminator: number }; -export type UnblockWalletInstructionDataArgs = {}; +export type UnblockWalletInstructionDataArgs = Record; export function getUnblockWalletInstructionDataEncoder(): Encoder { - return transformEncoder(getStructEncoder([['discriminator', getU8Encoder()]]), (value) => ({ ...value, discriminator: 243 })); + return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ + ...value, + discriminator: 243, + })); } export function getUnblockWalletInstructionDataDecoder(): Decoder { - return getStructDecoder([['discriminator', getU8Decoder()]]); + return getStructDecoder([["discriminator", getU8Decoder()]]); } -export function getUnblockWalletInstructionDataCodec(): Codec { +export function getUnblockWalletInstructionDataCodec(): Codec< + UnblockWalletInstructionDataArgs, + UnblockWalletInstructionData +> { return combineCodec(getUnblockWalletInstructionDataEncoder(), getUnblockWalletInstructionDataDecoder()); } @@ -93,7 +101,15 @@ export async function getUnblockWalletInstructionAsync< >( input: UnblockWalletAsyncInput, config?: { programAddress?: TProgramAddress }, -): Promise> { +): Promise< + UnblockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWalletBlock, + TAccountSystemProgram + > +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -111,10 +127,10 @@ export async function getUnblockWalletInstructionAsync< accounts.config.value = await findConfigPda(); } if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -124,7 +140,13 @@ export async function getUnblockWalletInstructionAsync< ], programAddress, data: getUnblockWalletInstructionDataEncoder().encode({}), - } as UnblockWalletInstruction; + } as UnblockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWalletBlock, + TAccountSystemProgram + >; return instruction; } @@ -150,7 +172,13 @@ export function getUnblockWalletInstruction< >( input: UnblockWalletInput, config?: { programAddress?: TProgramAddress }, -): UnblockWalletInstruction { +): UnblockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWalletBlock, + TAccountSystemProgram +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -165,10 +193,10 @@ export function getUnblockWalletInstruction< // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -178,7 +206,13 @@ export function getUnblockWalletInstruction< ], programAddress, data: getUnblockWalletInstructionDataEncoder().encode({}), - } as UnblockWalletInstruction; + } as UnblockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWalletBlock, + TAccountSystemProgram + >; return instruction; } @@ -202,11 +236,11 @@ export function parseUnblockWalletInstruction { if (instruction.accounts.length < 4) { // TODO: Coded error. - throw new Error('Not enough accounts'); + throw new Error("Not enough accounts"); } let accountIndex = 0; const getNextAccount = () => { - const accountMeta = instruction.accounts?.[accountIndex]!; + const accountMeta = instruction.accounts[accountIndex]; accountIndex += 1; return accountMeta; }; diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/config.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/config.ts index 343f6f4ce..be83310f6 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/config.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/config.ts @@ -6,12 +6,16 @@ * @see https://github.com/codama-idl/codama */ -import { type Address, getProgramDerivedAddress, getUtf8Encoder, type ProgramDerivedAddress } from '@solana/kit'; +import { type Address, getProgramDerivedAddress, getUtf8Encoder, type ProgramDerivedAddress } from "@solana/kit"; -export async function findConfigPda(config: { programAddress?: Address | undefined } = {}): Promise { - const { programAddress = 'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf' as Address<'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf'> } = config; +export async function findConfigPda( + config: { programAddress?: Address | undefined } = {}, +): Promise { + const { + programAddress = "BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf" as Address<"BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf">, + } = config; return await getProgramDerivedAddress({ programAddress, - seeds: [getUtf8Encoder().encode('config')], + seeds: [getUtf8Encoder().encode("config")], }); } diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/extraMetas.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/extraMetas.ts index a66a9d189..db4a84483 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/extraMetas.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/extraMetas.ts @@ -6,7 +6,13 @@ * @see https://github.com/codama-idl/codama */ -import { type Address, getAddressEncoder, getProgramDerivedAddress, getUtf8Encoder, type ProgramDerivedAddress } from '@solana/kit'; +import { + type Address, + getAddressEncoder, + getProgramDerivedAddress, + getUtf8Encoder, + type ProgramDerivedAddress, +} from "@solana/kit"; export type ExtraMetasSeeds = { mint: Address; @@ -16,9 +22,11 @@ export async function findExtraMetasPda( seeds: ExtraMetasSeeds, config: { programAddress?: Address | undefined } = {}, ): Promise { - const { programAddress = 'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf' as Address<'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf'> } = config; + const { + programAddress = "BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf" as Address<"BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf">, + } = config; return await getProgramDerivedAddress({ programAddress, - seeds: [getUtf8Encoder().encode('extra-account-metas'), getAddressEncoder().encode(seeds.mint)], + seeds: [getUtf8Encoder().encode("extra-account-metas"), getAddressEncoder().encode(seeds.mint)], }); } diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/index.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/index.ts index ed620eb19..6135b7a67 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/index.ts @@ -6,6 +6,6 @@ * @see https://github.com/codama-idl/codama */ -export * from './config'; -export * from './extraMetas'; -export * from './walletBlock'; +export * from "./config"; +export * from "./extraMetas"; +export * from "./walletBlock"; diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/walletBlock.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/walletBlock.ts index 1a5e84096..2705fbcef 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/walletBlock.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/pdas/walletBlock.ts @@ -6,7 +6,13 @@ * @see https://github.com/codama-idl/codama */ -import { type Address, getAddressEncoder, getProgramDerivedAddress, getUtf8Encoder, type ProgramDerivedAddress } from '@solana/kit'; +import { + type Address, + getAddressEncoder, + getProgramDerivedAddress, + getUtf8Encoder, + type ProgramDerivedAddress, +} from "@solana/kit"; export type WalletBlockSeeds = { wallet: Address; @@ -16,9 +22,11 @@ export async function findWalletBlockPda( seeds: WalletBlockSeeds, config: { programAddress?: Address | undefined } = {}, ): Promise { - const { programAddress = 'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf' as Address<'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf'> } = config; + const { + programAddress = "BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf" as Address<"BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf">, + } = config; return await getProgramDerivedAddress({ programAddress, - seeds: [getUtf8Encoder().encode('wallet_block'), getAddressEncoder().encode(seeds.wallet)], + seeds: [getUtf8Encoder().encode("wallet_block"), getAddressEncoder().encode(seeds.wallet)], }); } diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/programs/blockList.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/programs/blockList.ts index 4ba42d741..d22c9ccf9 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/programs/blockList.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/programs/blockList.ts @@ -6,15 +6,16 @@ * @see https://github.com/codama-idl/codama */ -import { type Address, containsBytes, getU8Encoder, type ReadonlyUint8Array } from '@solana/kit'; -import { - type ParsedBlockWalletInstruction, - type ParsedInitInstruction, - type ParsedSetupExtraMetasInstruction, - type ParsedUnblockWalletInstruction, -} from '../instructions'; +import { type Address, containsBytes, getU8Encoder, type ReadonlyUint8Array } from "@solana/kit"; +import type { + ParsedBlockWalletInstruction, + ParsedInitInstruction, + ParsedSetupExtraMetasInstruction, + ParsedUnblockWalletInstruction, +} from "../instructions"; -export const BLOCK_LIST_PROGRAM_ADDRESS = 'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf' as Address<'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf'>; +export const BLOCK_LIST_PROGRAM_ADDRESS = + "BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf" as Address<"BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf">; export enum BlockListAccount { Config, @@ -23,14 +24,14 @@ export enum BlockListAccount { } export function identifyBlockListAccount(account: { data: ReadonlyUint8Array } | ReadonlyUint8Array): BlockListAccount { - const data = 'data' in account ? account.data : account; + const data = "data" in account ? account.data : account; if (containsBytes(data, getU8Encoder().encode(0), 0)) { return BlockListAccount.Config; } if (containsBytes(data, getU8Encoder().encode(1), 0)) { return BlockListAccount.WalletBlock; } - throw new Error('The provided account could not be identified as a blockList account.'); + throw new Error("The provided account could not be identified as a blockList account."); } export enum BlockListInstruction { @@ -40,8 +41,10 @@ export enum BlockListInstruction { SetupExtraMetas, } -export function identifyBlockListInstruction(instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array): BlockListInstruction { - const data = 'data' in instruction ? instruction.data : instruction; +export function identifyBlockListInstruction( + instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array, +): BlockListInstruction { + const data = "data" in instruction ? instruction.data : instruction; if (containsBytes(data, getU8Encoder().encode(241), 0)) { return BlockListInstruction.Init; } @@ -54,10 +57,10 @@ export function identifyBlockListInstruction(instruction: { data: ReadonlyUint8A if (containsBytes(data, getU8Encoder().encode(106), 0)) { return BlockListInstruction.SetupExtraMetas; } - throw new Error('The provided instruction could not be identified as a blockList instruction.'); + throw new Error("The provided instruction could not be identified as a blockList instruction."); } -export type ParsedBlockListInstruction = +export type ParsedBlockListInstruction = | ({ instructionType: BlockListInstruction.Init; } & ParsedInitInstruction) diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/programs/index.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/programs/index.ts index f945615bd..01ddfbdee 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/programs/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/programs/index.ts @@ -6,4 +6,4 @@ * @see https://github.com/codama-idl/codama */ -export * from './blockList'; +export * from "./blockList"; diff --git a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/shared/index.ts b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/shared/index.ts index 27141fc40..6b3bc4a6a 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/shared/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/pino/sdk/ts/src/shared/index.ts @@ -16,7 +16,7 @@ import { type ProgramDerivedAddress, type TransactionSigner, upgradeRoleToSigner, -} from '@solana/kit'; +} from "@solana/kit"; /** * Asserts that the given value is not null or undefined. @@ -24,7 +24,7 @@ import { */ export function expectSome(value: T | null | undefined): T { if (value == null) { - throw new Error('Expected a value but received null or undefined.'); + throw new Error("Expected a value but received null or undefined."); } return value; } @@ -37,9 +37,9 @@ export function expectAddress( value: Address | ProgramDerivedAddress | TransactionSigner | null | undefined, ): Address { if (!value) { - throw new Error('Expected a Address.'); + throw new Error("Expected a Address."); } - if (typeof value === 'object' && 'address' in value) { + if (typeof value === "object" && "address" in value) { return value.address; } if (Array.isArray(value)) { @@ -56,7 +56,7 @@ export function expectProgramDerivedAddress( value: Address | ProgramDerivedAddress | TransactionSigner | null | undefined, ): ProgramDerivedAddress { if (!value || !Array.isArray(value) || !isProgramDerivedAddress(value)) { - throw new Error('Expected a ProgramDerivedAddress.'); + throw new Error("Expected a ProgramDerivedAddress."); } return value; } @@ -69,7 +69,7 @@ export function expectTransactionSigner( value: Address | ProgramDerivedAddress | TransactionSigner | null | undefined, ): TransactionSigner { if (!value || !isTransactionSigner(value)) { - throw new Error('Expected a TransactionSigner.'); + throw new Error("Expected a TransactionSigner."); } return value; } @@ -80,7 +80,11 @@ export function expectTransactionSigner( */ export type ResolvedAccount< T extends string = string, - U extends Address | ProgramDerivedAddress | TransactionSigner | null = Address | ProgramDerivedAddress | TransactionSigner | null, + U extends Address | ProgramDerivedAddress | TransactionSigner | null = + | Address + | ProgramDerivedAddress + | TransactionSigner + | null, > = { isWritable: boolean; value: U; @@ -98,10 +102,10 @@ export type IInstructionWithByteDelta = { * Get account metas and signers from resolved accounts. * @internal */ -export function getAccountMetaFactory(programAddress: Address, optionalAccountStrategy: 'omitted' | 'programId') { +export function getAccountMetaFactory(programAddress: Address, optionalAccountStrategy: "omitted" | "programId") { return (account: ResolvedAccount): IAccountMeta | IAccountSignerMeta | undefined => { if (!account.value) { - if (optionalAccountStrategy === 'omitted') return; + if (optionalAccountStrategy === "omitted") return; return Object.freeze({ address: programAddress, role: AccountRole.READONLY, @@ -120,5 +124,5 @@ export function getAccountMetaFactory(programAddress: Address, optionalAccountSt export function isTransactionSigner( value: Address | ProgramDerivedAddress | TransactionSigner, ): value is TransactionSigner { - return !!value && typeof value === 'object' && 'address' in value && kitIsTransactionSigner(value); + return !!value && typeof value === "object" && "address" in value && kitIsTransactionSigner(value); } diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/config.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/config.ts index d59757590..03a52b664 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/config.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/config.ts @@ -31,8 +31,8 @@ import { getU64Encoder, type MaybeAccount, type MaybeEncodedAccount, -} from '@solana/kit'; -import { findConfigPda } from '../pdas'; +} from "@solana/kit"; +import { findConfigPda } from "../pdas"; export const CONFIG_DISCRIMINATOR = 0; @@ -54,17 +54,17 @@ export type ConfigArgs = { export function getConfigEncoder(): Encoder { return getStructEncoder([ - ['discriminator', getU8Encoder()], - ['authority', getAddressEncoder()], - ['blockedWalletsCount', getU64Encoder()], + ["discriminator", getU8Encoder()], + ["authority", getAddressEncoder()], + ["blockedWalletsCount", getU64Encoder()], ]); } export function getConfigDecoder(): Decoder { return getStructDecoder([ - ['discriminator', getU8Decoder()], - ['authority', getAddressDecoder()], - ['blockedWalletsCount', getU64Decoder()], + ["discriminator", getU8Decoder()], + ["authority", getAddressDecoder()], + ["blockedWalletsCount", getU64Decoder()], ]); } @@ -72,8 +72,12 @@ export function getConfigCodec(): Codec { return combineCodec(getConfigEncoder(), getConfigDecoder()); } -export function decodeConfig(encodedAccount: EncodedAccount): Account; -export function decodeConfig(encodedAccount: MaybeEncodedAccount): MaybeAccount; +export function decodeConfig( + encodedAccount: EncodedAccount, +): Account; +export function decodeConfig( + encodedAccount: MaybeEncodedAccount, +): MaybeAccount; export function decodeConfig( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): Account | MaybeAccount { diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/extraMetas.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/extraMetas.ts index 3292ead79..93859232f 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/extraMetas.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/extraMetas.ts @@ -25,10 +25,10 @@ import { getStructEncoder, type MaybeAccount, type MaybeEncodedAccount, -} from '@solana/kit'; -import { ExtraMetasSeeds, findExtraMetasPda } from '../pdas'; +} from "@solana/kit"; +import { type ExtraMetasSeeds, findExtraMetasPda } from "../pdas"; -export type ExtraMetas = {}; +export type ExtraMetas = Record; export type ExtraMetasArgs = ExtraMetas; @@ -44,8 +44,12 @@ export function getExtraMetasCodec(): Codec { return combineCodec(getExtraMetasEncoder(), getExtraMetasDecoder()); } -export function decodeExtraMetas(encodedAccount: EncodedAccount): Account; -export function decodeExtraMetas(encodedAccount: MaybeEncodedAccount): MaybeAccount; +export function decodeExtraMetas( + encodedAccount: EncodedAccount, +): Account; +export function decodeExtraMetas( + encodedAccount: MaybeEncodedAccount, +): MaybeAccount; export function decodeExtraMetas( encodedAccount: EncodedAccount | MaybeEncodedAccount, ): Account | MaybeAccount { diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/index.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/index.ts index ed620eb19..6135b7a67 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/index.ts @@ -6,6 +6,6 @@ * @see https://github.com/codama-idl/codama */ -export * from './config'; -export * from './extraMetas'; -export * from './walletBlock'; +export * from "./config"; +export * from "./extraMetas"; +export * from "./walletBlock"; diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/walletBlock.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/walletBlock.ts index 886a73f79..29a8309a9 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/walletBlock.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/accounts/walletBlock.ts @@ -28,8 +28,8 @@ import { getU8Encoder, type MaybeAccount, type MaybeEncodedAccount, -} from '@solana/kit'; -import { findWalletBlockPda, WalletBlockSeeds } from '../pdas'; +} from "@solana/kit"; +import { findWalletBlockPda, type WalletBlockSeeds } from "../pdas"; export const WALLET_BLOCK_DISCRIMINATOR = 1; @@ -42,18 +42,20 @@ export type WalletBlock = { authority: Address }; export type WalletBlockArgs = WalletBlock; export function getWalletBlockEncoder(): Encoder { - return getStructEncoder([['authority', getAddressEncoder()]]); + return getStructEncoder([["authority", getAddressEncoder()]]); } export function getWalletBlockDecoder(): Decoder { - return getStructDecoder([['authority', getAddressDecoder()]]); + return getStructDecoder([["authority", getAddressDecoder()]]); } export function getWalletBlockCodec(): Codec { return combineCodec(getWalletBlockEncoder(), getWalletBlockDecoder()); } -export function decodeWalletBlock(encodedAccount: EncodedAccount): Account; +export function decodeWalletBlock( + encodedAccount: EncodedAccount, +): Account; export function decodeWalletBlock( encodedAccount: MaybeEncodedAccount, ): MaybeAccount; diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/index.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/index.ts index 1002b8203..cf9bea234 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/index.ts @@ -6,7 +6,7 @@ * @see https://github.com/codama-idl/codama */ -export * from './accounts'; -export * from './instructions'; -export * from './pdas'; -export * from './programs'; +export * from "./accounts"; +export * from "./instructions"; +export * from "./pdas"; +export * from "./programs"; diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/blockWallet.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/blockWallet.ts index b0f1d4d19..e49ba63b7 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/blockWallet.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/blockWallet.ts @@ -26,10 +26,10 @@ import { transformEncoder, type WritableAccount, type WritableSignerAccount, -} from '@solana/kit'; -import { findConfigPda } from '../pdas'; -import { BLOCK_LIST_PROGRAM_ADDRESS } from '../programs'; -import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; +} from "@solana/kit"; +import { findConfigPda } from "../pdas"; +import { BLOCK_LIST_PROGRAM_ADDRESS } from "../programs"; +import { getAccountMetaFactory, type ResolvedAccount } from "../shared"; export const BLOCK_WALLET_DISCRIMINATOR = 242; @@ -43,13 +43,15 @@ export type BlockWalletInstruction< TAccountConfig extends string | IAccountMeta = string, TAccountWallet extends string | IAccountMeta = string, TAccountWalletBlock extends string | IAccountMeta = string, - TAccountSystemProgram extends string | IAccountMeta = '11111111111111111111111111111111', + TAccountSystemProgram extends string | IAccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly IAccountMeta[] = [], > = IInstruction & IInstructionWithData & IInstructionWithAccounts< [ - TAccountAuthority extends string ? WritableSignerAccount & IAccountSignerMeta : TAccountAuthority, + TAccountAuthority extends string + ? WritableSignerAccount & IAccountSignerMeta + : TAccountAuthority, TAccountConfig extends string ? WritableAccount : TAccountConfig, TAccountWallet extends string ? ReadonlyAccount : TAccountWallet, TAccountWalletBlock extends string ? WritableAccount : TAccountWalletBlock, @@ -60,17 +62,23 @@ export type BlockWalletInstruction< export type BlockWalletInstructionData = { discriminator: number }; -export type BlockWalletInstructionDataArgs = {}; +export type BlockWalletInstructionDataArgs = Record; export function getBlockWalletInstructionDataEncoder(): Encoder { - return transformEncoder(getStructEncoder([['discriminator', getU8Encoder()]]), (value) => ({ ...value, discriminator: 242 })); + return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ + ...value, + discriminator: 242, + })); } export function getBlockWalletInstructionDataDecoder(): Decoder { - return getStructDecoder([['discriminator', getU8Decoder()]]); + return getStructDecoder([["discriminator", getU8Decoder()]]); } -export function getBlockWalletInstructionDataCodec(): Codec { +export function getBlockWalletInstructionDataCodec(): Codec< + BlockWalletInstructionDataArgs, + BlockWalletInstructionData +> { return combineCodec(getBlockWalletInstructionDataEncoder(), getBlockWalletInstructionDataDecoder()); } @@ -96,9 +104,24 @@ export async function getBlockWalletInstructionAsync< TAccountSystemProgram extends string, TProgramAddress extends Address = typeof BLOCK_LIST_PROGRAM_ADDRESS, >( - input: BlockWalletAsyncInput, + input: BlockWalletAsyncInput< + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram + >, config?: { programAddress?: TProgramAddress }, -): Promise> { +): Promise< + BlockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram + > +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -117,10 +140,10 @@ export async function getBlockWalletInstructionAsync< accounts.config.value = await findConfigPda(); } if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -131,7 +154,14 @@ export async function getBlockWalletInstructionAsync< ], programAddress, data: getBlockWalletInstructionDataEncoder().encode({}), - } as BlockWalletInstruction; + } as BlockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram + >; return instruction; } @@ -158,9 +188,22 @@ export function getBlockWalletInstruction< TAccountSystemProgram extends string, TProgramAddress extends Address = typeof BLOCK_LIST_PROGRAM_ADDRESS, >( - input: BlockWalletInput, + input: BlockWalletInput< + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram + >, config?: { programAddress?: TProgramAddress }, -): BlockWalletInstruction { +): BlockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -176,10 +219,10 @@ export function getBlockWalletInstruction< // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -190,7 +233,14 @@ export function getBlockWalletInstruction< ], programAddress, data: getBlockWalletInstructionDataEncoder().encode({}), - } as BlockWalletInstruction; + } as BlockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWallet, + TAccountWalletBlock, + TAccountSystemProgram + >; return instruction; } @@ -215,11 +265,11 @@ export function parseBlockWalletInstruction { if (instruction.accounts.length < 5) { // TODO: Coded error. - throw new Error('Not enough accounts'); + throw new Error("Not enough accounts"); } let accountIndex = 0; const getNextAccount = () => { - const accountMeta = instruction.accounts?.[accountIndex]!; + const accountMeta = instruction.accounts[accountIndex]; accountIndex += 1; return accountMeta; }; diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/index.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/index.ts index 864cb10b3..f4bba88c5 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/index.ts @@ -6,7 +6,7 @@ * @see https://github.com/codama-idl/codama */ -export * from './blockWallet'; -export * from './init'; -export * from './setupExtraMetas'; -export * from './unblockWallet'; +export * from "./blockWallet"; +export * from "./init"; +export * from "./setupExtraMetas"; +export * from "./unblockWallet"; diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/init.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/init.ts index f02a8fe63..860840983 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/init.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/init.ts @@ -26,10 +26,10 @@ import { transformEncoder, type WritableAccount, type WritableSignerAccount, -} from '@solana/kit'; -import { findConfigPda } from '../pdas'; -import { BLOCK_LIST_PROGRAM_ADDRESS } from '../programs'; -import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; +} from "@solana/kit"; +import { findConfigPda } from "../pdas"; +import { BLOCK_LIST_PROGRAM_ADDRESS } from "../programs"; +import { getAccountMetaFactory, type ResolvedAccount } from "../shared"; export const INIT_DISCRIMINATOR = 241; @@ -41,13 +41,15 @@ export type InitInstruction< TProgram extends string = typeof BLOCK_LIST_PROGRAM_ADDRESS, TAccountAuthority extends string | IAccountMeta = string, TAccountConfig extends string | IAccountMeta = string, - TAccountSystemProgram extends string | IAccountMeta = '11111111111111111111111111111111', + TAccountSystemProgram extends string | IAccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly IAccountMeta[] = [], > = IInstruction & IInstructionWithData & IInstructionWithAccounts< [ - TAccountAuthority extends string ? WritableSignerAccount & IAccountSignerMeta : TAccountAuthority, + TAccountAuthority extends string + ? WritableSignerAccount & IAccountSignerMeta + : TAccountAuthority, TAccountConfig extends string ? WritableAccount : TAccountConfig, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, ...TRemainingAccounts, @@ -56,14 +58,17 @@ export type InitInstruction< export type InitInstructionData = { discriminator: number }; -export type InitInstructionDataArgs = {}; +export type InitInstructionDataArgs = Record; export function getInitInstructionDataEncoder(): Encoder { - return transformEncoder(getStructEncoder([['discriminator', getU8Encoder()]]), (value) => ({ ...value, discriminator: 241 })); + return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ + ...value, + discriminator: 241, + })); } export function getInitInstructionDataDecoder(): Decoder { - return getStructDecoder([['discriminator', getU8Decoder()]]); + return getStructDecoder([["discriminator", getU8Decoder()]]); } export function getInitInstructionDataCodec(): Codec { @@ -105,12 +110,16 @@ export async function getInitInstructionAsync< accounts.config.value = await findConfigPda(); } if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { - accounts: [getAccountMeta(accounts.authority), getAccountMeta(accounts.config), getAccountMeta(accounts.systemProgram)], + accounts: [ + getAccountMeta(accounts.authority), + getAccountMeta(accounts.config), + getAccountMeta(accounts.systemProgram), + ], programAddress, data: getInitInstructionDataEncoder().encode({}), } as InitInstruction; @@ -150,12 +159,16 @@ export function getInitInstruction< // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { - accounts: [getAccountMeta(accounts.authority), getAccountMeta(accounts.config), getAccountMeta(accounts.systemProgram)], + accounts: [ + getAccountMeta(accounts.authority), + getAccountMeta(accounts.config), + getAccountMeta(accounts.systemProgram), + ], programAddress, data: getInitInstructionDataEncoder().encode({}), } as InitInstruction; @@ -181,11 +194,11 @@ export function parseInitInstruction { if (instruction.accounts.length < 3) { // TODO: Coded error. - throw new Error('Not enough accounts'); + throw new Error("Not enough accounts"); } let accountIndex = 0; const getNextAccount = () => { - const accountMeta = instruction.accounts?.[accountIndex]!; + const accountMeta = instruction.accounts[accountIndex]; accountIndex += 1; return accountMeta; }; diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/setupExtraMetas.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/setupExtraMetas.ts index 021e6729c..c9004cd3b 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/setupExtraMetas.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/setupExtraMetas.ts @@ -28,10 +28,10 @@ import { transformEncoder, type WritableAccount, type WritableSignerAccount, -} from '@solana/kit'; -import { findConfigPda, findExtraMetasPda } from '../pdas'; -import { BLOCK_LIST_PROGRAM_ADDRESS } from '../programs'; -import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; +} from "@solana/kit"; +import { findConfigPda, findExtraMetasPda } from "../pdas"; +import { BLOCK_LIST_PROGRAM_ADDRESS } from "../programs"; +import { getAccountMetaFactory, type ResolvedAccount } from "../shared"; export const SETUP_EXTRA_METAS_DISCRIMINATOR = 106; @@ -45,13 +45,15 @@ export type SetupExtraMetasInstruction< TAccountConfig extends string | IAccountMeta = string, TAccountMint extends string | IAccountMeta = string, TAccountExtraMetas extends string | IAccountMeta = string, - TAccountSystemProgram extends string | IAccountMeta = '11111111111111111111111111111111', + TAccountSystemProgram extends string | IAccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly IAccountMeta[] = [], > = IInstruction & IInstructionWithData & IInstructionWithAccounts< [ - TAccountAuthority extends string ? WritableSignerAccount & IAccountSignerMeta : TAccountAuthority, + TAccountAuthority extends string + ? WritableSignerAccount & IAccountSignerMeta + : TAccountAuthority, TAccountConfig extends string ? ReadonlyAccount : TAccountConfig, TAccountMint extends string ? ReadonlyAccount : TAccountMint, TAccountExtraMetas extends string ? WritableAccount : TAccountExtraMetas, @@ -70,8 +72,8 @@ export type SetupExtraMetasInstructionDataArgs = { checkBothWallets?: boolean }; export function getSetupExtraMetasInstructionDataEncoder(): Encoder { return transformEncoder( getStructEncoder([ - ['discriminator', getU8Encoder()], - ['checkBothWallets', getBooleanEncoder()], + ["discriminator", getU8Encoder()], + ["checkBothWallets", getBooleanEncoder()], ]), (value) => ({ ...value, @@ -83,12 +85,15 @@ export function getSetupExtraMetasInstructionDataEncoder(): Encoder { return getStructDecoder([ - ['discriminator', getU8Decoder()], - ['checkBothWallets', getBooleanDecoder()], + ["discriminator", getU8Decoder()], + ["checkBothWallets", getBooleanDecoder()], ]); } -export function getSetupExtraMetasInstructionDataCodec(): Codec { +export function getSetupExtraMetasInstructionDataCodec(): Codec< + SetupExtraMetasInstructionDataArgs, + SetupExtraMetasInstructionData +> { return combineCodec(getSetupExtraMetasInstructionDataEncoder(), getSetupExtraMetasInstructionDataDecoder()); } @@ -104,7 +109,7 @@ export type SetupExtraMetasAsyncInput< mint: Address; extraMetas?: Address; systemProgram?: Address; - checkBothWallets?: SetupExtraMetasInstructionDataArgs['checkBothWallets']; + checkBothWallets?: SetupExtraMetasInstructionDataArgs["checkBothWallets"]; }; export async function getSetupExtraMetasInstructionAsync< @@ -115,9 +120,24 @@ export async function getSetupExtraMetasInstructionAsync< TAccountSystemProgram extends string, TProgramAddress extends Address = typeof BLOCK_LIST_PROGRAM_ADDRESS, >( - input: SetupExtraMetasAsyncInput, + input: SetupExtraMetasAsyncInput< + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram + >, config?: { programAddress?: TProgramAddress }, -): Promise> { +): Promise< + SetupExtraMetasInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram + > +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -142,10 +162,10 @@ export async function getSetupExtraMetasInstructionAsync< accounts.extraMetas.value = await findExtraMetasPda(); } if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -156,7 +176,14 @@ export async function getSetupExtraMetasInstructionAsync< ], programAddress, data: getSetupExtraMetasInstructionDataEncoder().encode(args as SetupExtraMetasInstructionDataArgs), - } as SetupExtraMetasInstruction; + } as SetupExtraMetasInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram + >; return instruction; } @@ -173,7 +200,7 @@ export type SetupExtraMetasInput< mint: Address; extraMetas: Address; systemProgram?: Address; - checkBothWallets?: SetupExtraMetasInstructionDataArgs['checkBothWallets']; + checkBothWallets?: SetupExtraMetasInstructionDataArgs["checkBothWallets"]; }; export function getSetupExtraMetasInstruction< @@ -184,9 +211,22 @@ export function getSetupExtraMetasInstruction< TAccountSystemProgram extends string, TProgramAddress extends Address = typeof BLOCK_LIST_PROGRAM_ADDRESS, >( - input: SetupExtraMetasInput, + input: SetupExtraMetasInput< + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram + >, config?: { programAddress?: TProgramAddress }, -): SetupExtraMetasInstruction { +): SetupExtraMetasInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -205,10 +245,10 @@ export function getSetupExtraMetasInstruction< // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -219,7 +259,14 @@ export function getSetupExtraMetasInstruction< ], programAddress, data: getSetupExtraMetasInstructionDataEncoder().encode(args as SetupExtraMetasInstructionDataArgs), - } as SetupExtraMetasInstruction; + } as SetupExtraMetasInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountMint, + TAccountExtraMetas, + TAccountSystemProgram + >; return instruction; } @@ -244,11 +291,11 @@ export function parseSetupExtraMetasInstruction { if (instruction.accounts.length < 5) { // TODO: Coded error. - throw new Error('Not enough accounts'); + throw new Error("Not enough accounts"); } let accountIndex = 0; const getNextAccount = () => { - const accountMeta = instruction.accounts?.[accountIndex]!; + const accountMeta = instruction.accounts[accountIndex]; accountIndex += 1; return accountMeta; }; diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/unblockWallet.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/unblockWallet.ts index d17158efe..40b3f33f0 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/unblockWallet.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/instructions/unblockWallet.ts @@ -26,10 +26,10 @@ import { transformEncoder, type WritableAccount, type WritableSignerAccount, -} from '@solana/kit'; -import { findConfigPda } from '../pdas'; -import { BLOCK_LIST_PROGRAM_ADDRESS } from '../programs'; -import { getAccountMetaFactory, type ResolvedAccount } from '../shared'; +} from "@solana/kit"; +import { findConfigPda } from "../pdas"; +import { BLOCK_LIST_PROGRAM_ADDRESS } from "../programs"; +import { getAccountMetaFactory, type ResolvedAccount } from "../shared"; export const UNBLOCK_WALLET_DISCRIMINATOR = 243; @@ -42,13 +42,15 @@ export type UnblockWalletInstruction< TAccountAuthority extends string | IAccountMeta = string, TAccountConfig extends string | IAccountMeta = string, TAccountWalletBlock extends string | IAccountMeta = string, - TAccountSystemProgram extends string | IAccountMeta = '11111111111111111111111111111111', + TAccountSystemProgram extends string | IAccountMeta = "11111111111111111111111111111111", TRemainingAccounts extends readonly IAccountMeta[] = [], > = IInstruction & IInstructionWithData & IInstructionWithAccounts< [ - TAccountAuthority extends string ? WritableSignerAccount & IAccountSignerMeta : TAccountAuthority, + TAccountAuthority extends string + ? WritableSignerAccount & IAccountSignerMeta + : TAccountAuthority, TAccountConfig extends string ? WritableAccount : TAccountConfig, TAccountWalletBlock extends string ? WritableAccount : TAccountWalletBlock, TAccountSystemProgram extends string ? ReadonlyAccount : TAccountSystemProgram, @@ -58,17 +60,23 @@ export type UnblockWalletInstruction< export type UnblockWalletInstructionData = { discriminator: number }; -export type UnblockWalletInstructionDataArgs = {}; +export type UnblockWalletInstructionDataArgs = Record; export function getUnblockWalletInstructionDataEncoder(): Encoder { - return transformEncoder(getStructEncoder([['discriminator', getU8Encoder()]]), (value) => ({ ...value, discriminator: 243 })); + return transformEncoder(getStructEncoder([["discriminator", getU8Encoder()]]), (value) => ({ + ...value, + discriminator: 243, + })); } export function getUnblockWalletInstructionDataDecoder(): Decoder { - return getStructDecoder([['discriminator', getU8Decoder()]]); + return getStructDecoder([["discriminator", getU8Decoder()]]); } -export function getUnblockWalletInstructionDataCodec(): Codec { +export function getUnblockWalletInstructionDataCodec(): Codec< + UnblockWalletInstructionDataArgs, + UnblockWalletInstructionData +> { return combineCodec(getUnblockWalletInstructionDataEncoder(), getUnblockWalletInstructionDataDecoder()); } @@ -93,7 +101,15 @@ export async function getUnblockWalletInstructionAsync< >( input: UnblockWalletAsyncInput, config?: { programAddress?: TProgramAddress }, -): Promise> { +): Promise< + UnblockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWalletBlock, + TAccountSystemProgram + > +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -111,10 +127,10 @@ export async function getUnblockWalletInstructionAsync< accounts.config.value = await findConfigPda(); } if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -124,7 +140,13 @@ export async function getUnblockWalletInstructionAsync< ], programAddress, data: getUnblockWalletInstructionDataEncoder().encode({}), - } as UnblockWalletInstruction; + } as UnblockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWalletBlock, + TAccountSystemProgram + >; return instruction; } @@ -150,7 +172,13 @@ export function getUnblockWalletInstruction< >( input: UnblockWalletInput, config?: { programAddress?: TProgramAddress }, -): UnblockWalletInstruction { +): UnblockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWalletBlock, + TAccountSystemProgram +> { // Program address. const programAddress = config?.programAddress ?? BLOCK_LIST_PROGRAM_ADDRESS; @@ -165,10 +193,10 @@ export function getUnblockWalletInstruction< // Resolve default values. if (!accounts.systemProgram.value) { - accounts.systemProgram.value = '11111111111111111111111111111111' as Address<'11111111111111111111111111111111'>; + accounts.systemProgram.value = "11111111111111111111111111111111" as Address<"11111111111111111111111111111111">; } - const getAccountMeta = getAccountMetaFactory(programAddress, 'programId'); + const getAccountMeta = getAccountMetaFactory(programAddress, "programId"); const instruction = { accounts: [ getAccountMeta(accounts.authority), @@ -178,7 +206,13 @@ export function getUnblockWalletInstruction< ], programAddress, data: getUnblockWalletInstructionDataEncoder().encode({}), - } as UnblockWalletInstruction; + } as UnblockWalletInstruction< + TProgramAddress, + TAccountAuthority, + TAccountConfig, + TAccountWalletBlock, + TAccountSystemProgram + >; return instruction; } @@ -202,11 +236,11 @@ export function parseUnblockWalletInstruction { if (instruction.accounts.length < 4) { // TODO: Coded error. - throw new Error('Not enough accounts'); + throw new Error("Not enough accounts"); } let accountIndex = 0; const getNextAccount = () => { - const accountMeta = instruction.accounts?.[accountIndex]!; + const accountMeta = instruction.accounts[accountIndex]; accountIndex += 1; return accountMeta; }; diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/config.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/config.ts index 343f6f4ce..be83310f6 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/config.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/config.ts @@ -6,12 +6,16 @@ * @see https://github.com/codama-idl/codama */ -import { type Address, getProgramDerivedAddress, getUtf8Encoder, type ProgramDerivedAddress } from '@solana/kit'; +import { type Address, getProgramDerivedAddress, getUtf8Encoder, type ProgramDerivedAddress } from "@solana/kit"; -export async function findConfigPda(config: { programAddress?: Address | undefined } = {}): Promise { - const { programAddress = 'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf' as Address<'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf'> } = config; +export async function findConfigPda( + config: { programAddress?: Address | undefined } = {}, +): Promise { + const { + programAddress = "BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf" as Address<"BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf">, + } = config; return await getProgramDerivedAddress({ programAddress, - seeds: [getUtf8Encoder().encode('config')], + seeds: [getUtf8Encoder().encode("config")], }); } diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/extraMetas.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/extraMetas.ts index a66a9d189..db4a84483 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/extraMetas.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/extraMetas.ts @@ -6,7 +6,13 @@ * @see https://github.com/codama-idl/codama */ -import { type Address, getAddressEncoder, getProgramDerivedAddress, getUtf8Encoder, type ProgramDerivedAddress } from '@solana/kit'; +import { + type Address, + getAddressEncoder, + getProgramDerivedAddress, + getUtf8Encoder, + type ProgramDerivedAddress, +} from "@solana/kit"; export type ExtraMetasSeeds = { mint: Address; @@ -16,9 +22,11 @@ export async function findExtraMetasPda( seeds: ExtraMetasSeeds, config: { programAddress?: Address | undefined } = {}, ): Promise { - const { programAddress = 'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf' as Address<'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf'> } = config; + const { + programAddress = "BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf" as Address<"BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf">, + } = config; return await getProgramDerivedAddress({ programAddress, - seeds: [getUtf8Encoder().encode('extra-account-metas'), getAddressEncoder().encode(seeds.mint)], + seeds: [getUtf8Encoder().encode("extra-account-metas"), getAddressEncoder().encode(seeds.mint)], }); } diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/index.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/index.ts index ed620eb19..6135b7a67 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/index.ts @@ -6,6 +6,6 @@ * @see https://github.com/codama-idl/codama */ -export * from './config'; -export * from './extraMetas'; -export * from './walletBlock'; +export * from "./config"; +export * from "./extraMetas"; +export * from "./walletBlock"; diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/walletBlock.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/walletBlock.ts index 1a5e84096..2705fbcef 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/walletBlock.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/pdas/walletBlock.ts @@ -6,7 +6,13 @@ * @see https://github.com/codama-idl/codama */ -import { type Address, getAddressEncoder, getProgramDerivedAddress, getUtf8Encoder, type ProgramDerivedAddress } from '@solana/kit'; +import { + type Address, + getAddressEncoder, + getProgramDerivedAddress, + getUtf8Encoder, + type ProgramDerivedAddress, +} from "@solana/kit"; export type WalletBlockSeeds = { wallet: Address; @@ -16,9 +22,11 @@ export async function findWalletBlockPda( seeds: WalletBlockSeeds, config: { programAddress?: Address | undefined } = {}, ): Promise { - const { programAddress = 'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf' as Address<'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf'> } = config; + const { + programAddress = "BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf" as Address<"BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf">, + } = config; return await getProgramDerivedAddress({ programAddress, - seeds: [getUtf8Encoder().encode('wallet_block'), getAddressEncoder().encode(seeds.wallet)], + seeds: [getUtf8Encoder().encode("wallet_block"), getAddressEncoder().encode(seeds.wallet)], }); } diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/programs/blockList.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/programs/blockList.ts index 4ba42d741..d22c9ccf9 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/programs/blockList.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/programs/blockList.ts @@ -6,15 +6,16 @@ * @see https://github.com/codama-idl/codama */ -import { type Address, containsBytes, getU8Encoder, type ReadonlyUint8Array } from '@solana/kit'; -import { - type ParsedBlockWalletInstruction, - type ParsedInitInstruction, - type ParsedSetupExtraMetasInstruction, - type ParsedUnblockWalletInstruction, -} from '../instructions'; +import { type Address, containsBytes, getU8Encoder, type ReadonlyUint8Array } from "@solana/kit"; +import type { + ParsedBlockWalletInstruction, + ParsedInitInstruction, + ParsedSetupExtraMetasInstruction, + ParsedUnblockWalletInstruction, +} from "../instructions"; -export const BLOCK_LIST_PROGRAM_ADDRESS = 'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf' as Address<'BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf'>; +export const BLOCK_LIST_PROGRAM_ADDRESS = + "BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf" as Address<"BLoCKLSG2qMQ9YxEyrrKKAQzthvW4Lu8Eyv74axF6mf">; export enum BlockListAccount { Config, @@ -23,14 +24,14 @@ export enum BlockListAccount { } export function identifyBlockListAccount(account: { data: ReadonlyUint8Array } | ReadonlyUint8Array): BlockListAccount { - const data = 'data' in account ? account.data : account; + const data = "data" in account ? account.data : account; if (containsBytes(data, getU8Encoder().encode(0), 0)) { return BlockListAccount.Config; } if (containsBytes(data, getU8Encoder().encode(1), 0)) { return BlockListAccount.WalletBlock; } - throw new Error('The provided account could not be identified as a blockList account.'); + throw new Error("The provided account could not be identified as a blockList account."); } export enum BlockListInstruction { @@ -40,8 +41,10 @@ export enum BlockListInstruction { SetupExtraMetas, } -export function identifyBlockListInstruction(instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array): BlockListInstruction { - const data = 'data' in instruction ? instruction.data : instruction; +export function identifyBlockListInstruction( + instruction: { data: ReadonlyUint8Array } | ReadonlyUint8Array, +): BlockListInstruction { + const data = "data" in instruction ? instruction.data : instruction; if (containsBytes(data, getU8Encoder().encode(241), 0)) { return BlockListInstruction.Init; } @@ -54,10 +57,10 @@ export function identifyBlockListInstruction(instruction: { data: ReadonlyUint8A if (containsBytes(data, getU8Encoder().encode(106), 0)) { return BlockListInstruction.SetupExtraMetas; } - throw new Error('The provided instruction could not be identified as a blockList instruction.'); + throw new Error("The provided instruction could not be identified as a blockList instruction."); } -export type ParsedBlockListInstruction = +export type ParsedBlockListInstruction = | ({ instructionType: BlockListInstruction.Init; } & ParsedInitInstruction) diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/programs/index.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/programs/index.ts index f945615bd..01ddfbdee 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/programs/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/programs/index.ts @@ -6,4 +6,4 @@ * @see https://github.com/codama-idl/codama */ -export * from './blockList'; +export * from "./blockList"; diff --git a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/shared/index.ts b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/shared/index.ts index 27141fc40..6b3bc4a6a 100644 --- a/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/shared/index.ts +++ b/tokens/token-2022/transfer-hook/pblock-list/sdk/ts/src/shared/index.ts @@ -16,7 +16,7 @@ import { type ProgramDerivedAddress, type TransactionSigner, upgradeRoleToSigner, -} from '@solana/kit'; +} from "@solana/kit"; /** * Asserts that the given value is not null or undefined. @@ -24,7 +24,7 @@ import { */ export function expectSome(value: T | null | undefined): T { if (value == null) { - throw new Error('Expected a value but received null or undefined.'); + throw new Error("Expected a value but received null or undefined."); } return value; } @@ -37,9 +37,9 @@ export function expectAddress( value: Address | ProgramDerivedAddress | TransactionSigner | null | undefined, ): Address { if (!value) { - throw new Error('Expected a Address.'); + throw new Error("Expected a Address."); } - if (typeof value === 'object' && 'address' in value) { + if (typeof value === "object" && "address" in value) { return value.address; } if (Array.isArray(value)) { @@ -56,7 +56,7 @@ export function expectProgramDerivedAddress( value: Address | ProgramDerivedAddress | TransactionSigner | null | undefined, ): ProgramDerivedAddress { if (!value || !Array.isArray(value) || !isProgramDerivedAddress(value)) { - throw new Error('Expected a ProgramDerivedAddress.'); + throw new Error("Expected a ProgramDerivedAddress."); } return value; } @@ -69,7 +69,7 @@ export function expectTransactionSigner( value: Address | ProgramDerivedAddress | TransactionSigner | null | undefined, ): TransactionSigner { if (!value || !isTransactionSigner(value)) { - throw new Error('Expected a TransactionSigner.'); + throw new Error("Expected a TransactionSigner."); } return value; } @@ -80,7 +80,11 @@ export function expectTransactionSigner( */ export type ResolvedAccount< T extends string = string, - U extends Address | ProgramDerivedAddress | TransactionSigner | null = Address | ProgramDerivedAddress | TransactionSigner | null, + U extends Address | ProgramDerivedAddress | TransactionSigner | null = + | Address + | ProgramDerivedAddress + | TransactionSigner + | null, > = { isWritable: boolean; value: U; @@ -98,10 +102,10 @@ export type IInstructionWithByteDelta = { * Get account metas and signers from resolved accounts. * @internal */ -export function getAccountMetaFactory(programAddress: Address, optionalAccountStrategy: 'omitted' | 'programId') { +export function getAccountMetaFactory(programAddress: Address, optionalAccountStrategy: "omitted" | "programId") { return (account: ResolvedAccount): IAccountMeta | IAccountSignerMeta | undefined => { if (!account.value) { - if (optionalAccountStrategy === 'omitted') return; + if (optionalAccountStrategy === "omitted") return; return Object.freeze({ address: programAddress, role: AccountRole.READONLY, @@ -120,5 +124,5 @@ export function getAccountMetaFactory(programAddress: Address, optionalAccountSt export function isTransactionSigner( value: Address | ProgramDerivedAddress | TransactionSigner, ): value is TransactionSigner { - return !!value && typeof value === 'object' && 'address' in value && kitIsTransactionSigner(value); + return !!value && typeof value === "object" && "address" in value && kitIsTransactionSigner(value); } diff --git a/tokens/token-2022/transfer-hook/transfer-cost/anchor/Anchor.toml b/tokens/token-2022/transfer-hook/transfer-cost/anchor/Anchor.toml index 51735fcb2..be58884b7 100644 --- a/tokens/token-2022/transfer-hook/transfer-cost/anchor/Anchor.toml +++ b/tokens/token-2022/transfer-hook/transfer-cost/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -transfer_hook = "FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g" - -# [registry] section removed — no longer used in Anchor 1.0 +transfer_hook = "HbNu4FeF8CpCHr7pMCH7fVcny1KwXSYkSmGTbw9otUdj" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/transfer-hook/transfer-cost/anchor/migrations/deploy.ts b/tokens/token-2022/transfer-hook/transfer-cost/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/transfer-hook/transfer-cost/anchor/migrations/deploy.ts +++ b/tokens/token-2022/transfer-hook/transfer-cost/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/transfer-hook/transfer-cost/anchor/package.json b/tokens/token-2022/transfer-hook/transfer-cost/anchor/package.json index 4faaff4b4..a9773a56c 100644 --- a/tokens/token-2022/transfer-hook/transfer-cost/anchor/package.json +++ b/tokens/token-2022/transfer-hook/transfer-cost/anchor/package.json @@ -1,21 +1,21 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/transfer-hook/transfer-cost/anchor/pnpm-lock.yaml b/tokens/token-2022/transfer-hook/transfer-cost/anchor/pnpm-lock.yaml index ca2563c13..d2ac84e4a 100644 --- a/tokens/token-2022/transfer-hook/transfer-cost/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/transfer-hook/transfer-cost/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.0 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -860,16 +860,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -887,7 +887,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/Cargo.toml b/tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/Cargo.toml index 3c00d558b..457b2d333 100644 --- a/tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/Cargo.toml +++ b/tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/Cargo.toml @@ -20,13 +20,19 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = "1.0.0-rc.5" -anchor-spl = "1.0.0-rc.5" +anchor-lang = "1.0.0" +anchor-spl = "1.0.0" # SPL crates v3.x-compatible — uses solana-program-error 3.x matching anchor-lang 1.0 spl-discriminator = "0.5.2" spl-tlv-account-resolution = "0.11.1" spl-transfer-hook-interface = "2.1.0" +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/lib.rs index ad80a1192..5aebeb41d 100644 --- a/tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/src/lib.rs @@ -23,7 +23,7 @@ use std::{cell::RefMut, str::FromStr}; // transfer-hook program that charges a SOL fee on token transfer // use a delegate and wrapped SOL because signers from initial transfer are not accessible -declare_id!("FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g"); +declare_id!("HbNu4FeF8CpCHr7pMCH7fVcny1KwXSYkSmGTbw9otUdj"); #[error_code] pub enum TransferError { diff --git a/tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/tests/test_transfer_hook.rs new file mode 100644 index 000000000..b8993a823 --- /dev/null +++ b/tokens/token-2022/transfer-hook/transfer-cost/anchor/programs/transfer-hook/tests/test_transfer_hook.rs @@ -0,0 +1,84 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_mint, MintExtension, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::get_hook_accounts_address, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_hook::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_hook.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_initialize_extra_account_meta_list() { + let (mut svm, program_id, payer) = setup(); + let decimals: u8 = 9; + + // Step 1: Create mint with TransferHook extension + let mint = create_token_extensions_mint( + &mut svm, + &payer, + decimals, + None, + &[MintExtension::TransferHook { + program_id: program_id, + }], + ) + .unwrap(); + svm.expire_blockhash(); + + // PDAs + let extra_account_meta_list = + get_hook_accounts_address(&mint, &program_id); + let (counter_pda, _) = Pubkey::find_program_address(&[b"counter"], &program_id); + + // Step 2: Initialize ExtraAccountMetaList (also creates counter PDA) + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), + transfer_hook::accounts::InitializeExtraAccountMetaList { + payer: payer.pubkey(), + extra_account_meta_list, + mint, + counter_account: counter_pda, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + + // Verify the ExtraAccountMetaList account was created + let account = svm.get_account(&extra_account_meta_list); + assert!( + account.is_some(), + "ExtraAccountMetaList account should exist after initialization" + ); + + // Verify the counter account was created + let counter = svm.get_account(&counter_pda); + assert!( + counter.is_some(), + "Counter account should exist after initialization" + ); +} diff --git a/tokens/token-2022/transfer-hook/transfer-cost/anchor/tests/transfer-hook.ts b/tokens/token-2022/transfer-hook/transfer-cost/anchor/tests/transfer-hook.ts index d1a806bfe..2ea7cda84 100644 --- a/tokens/token-2022/transfer-hook/transfer-cost/anchor/tests/transfer-hook.ts +++ b/tokens/token-2022/transfer-hook/transfer-cost/anchor/tests/transfer-hook.ts @@ -1,6 +1,6 @@ -import assert from 'node:assert'; -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; +import assert from "node:assert"; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; import { ASSOCIATED_TOKEN_PROGRAM_ID, createApproveInstruction, @@ -22,11 +22,11 @@ import { NATIVE_MINT, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID, -} from '@solana/spl-token'; -import { Keypair, PublicKey, SystemProgram, sendAndConfirmTransaction, Transaction } from '@solana/web3.js'; -import type { TransferHook } from '../target/types/transfer_hook'; +} from "@solana/spl-token"; +import { Keypair, PublicKey, SystemProgram, sendAndConfirmTransaction, Transaction } from "@solana/web3.js"; +import type { TransferHook } from "../target/types/transfer_hook"; -describe('transfer-hook', () => { +describe("transfer-hook", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); @@ -59,7 +59,7 @@ describe('transfer-hook', () => { ); // PDA delegate to transfer wSOL tokens from sender - const [delegatePDA] = PublicKey.findProgramAddressSync([Buffer.from('delegate')], program.programId); + const [delegatePDA] = PublicKey.findProgramAddressSync([Buffer.from("delegate")], program.programId); // Sender wSOL token account address const senderWSolTokenAccount = getAssociatedTokenAddressSync( @@ -83,7 +83,7 @@ describe('transfer-hook', () => { await getOrCreateAssociatedTokenAccount(connection, wallet.payer, NATIVE_MINT, delegatePDA, true); }); - it('Create Mint Account with Transfer Hook Extension', async () => { + it("Create Mint Account with Transfer Hook Extension", async () => { const extensions = [ExtensionType.TransferHook]; const mintLen = getMintLen(extensions); const lamports = await provider.connection.getMinimumBalanceForRentExemption(mintLen); @@ -111,7 +111,7 @@ describe('transfer-hook', () => { // Create the two token accounts for the transfer-hook enabled mint // Fund the sender token account with 100 tokens - it('Create Token Accounts and Mint Tokens', async () => { + it("Create Token Accounts and Mint Tokens", async () => { // 100 tokens const amount = 100 * 10 ** decimals; @@ -141,7 +141,7 @@ describe('transfer-hook', () => { }); // Account to store extra accounts required by the transfer hook instruction - it('Create ExtraAccountMetaList Account', async () => { + it("Create ExtraAccountMetaList Account", async () => { const initializeExtraAccountMetaListInstruction = await program.methods .initializeExtraAccountMetaList() .accounts({ @@ -152,11 +152,14 @@ describe('transfer-hook', () => { const transaction = new Transaction().add(initializeExtraAccountMetaListInstruction); - const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer], { skipPreflight: true, commitment: 'confirmed' }); - console.log('Transaction Signature:', txSig); + const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer], { + skipPreflight: true, + commitment: "confirmed", + }); + console.log("Transaction Signature:", txSig); }); - it('Transfer Hook with Extra Account Meta', async () => { + it("Transfer Hook with Extra Account Meta", async () => { // 1 tokens const amount = 1 * 10 ** decimals; const bigIntAmount = BigInt(amount); @@ -169,19 +172,26 @@ describe('transfer-hook', () => { }); // Approve delegate PDA to transfer WSol tokens from sender WSol token account - const approveInstruction = createApproveInstruction(senderWSolTokenAccount, delegatePDA, wallet.publicKey, amount, [], TOKEN_PROGRAM_ID); + const approveInstruction = createApproveInstruction( + senderWSolTokenAccount, + delegatePDA, + wallet.publicKey, + amount, + [], + TOKEN_PROGRAM_ID, + ); // Sync sender WSol token account const syncWrappedSolInstruction = createSyncNativeInstruction(senderWSolTokenAccount); - const mintInfo = await getMint(connection, mint.publicKey, 'confirmed', TOKEN_2022_PROGRAM_ID); + const mintInfo = await getMint(connection, mint.publicKey, "confirmed", TOKEN_2022_PROGRAM_ID); const transferHook = getTransferHook(mintInfo); if (transferHook != null) { console.log(`Transfer hook program found: ${JSON.stringify(transferHook, null, 2)}`); } const extraAccountsAccount = getExtraAccountMetaAddress(mint.publicKey, transferHook.programId); - const extraAccountsInfo = await connection.getAccountInfo(extraAccountsAccount, 'confirmed'); + const extraAccountsInfo = await connection.getAccountInfo(extraAccountsAccount, "confirmed"); const extraAccountMetas = getExtraAccountMetas(extraAccountsInfo); for (const extraAccountMeta of extraAccountMetas) { @@ -198,16 +208,21 @@ describe('transfer-hook', () => { bigIntAmount, decimals, [], - 'confirmed', + "confirmed", TOKEN_2022_PROGRAM_ID, ); - console.log('Pushed keys:', JSON.stringify(transferInstruction.keys, null, 2)); + console.log("Pushed keys:", JSON.stringify(transferInstruction.keys, null, 2)); - const transaction = new Transaction().add(solTransferInstruction, syncWrappedSolInstruction, approveInstruction, transferInstruction); + const transaction = new Transaction().add( + solTransferInstruction, + syncWrappedSolInstruction, + approveInstruction, + transferInstruction, + ); const txSig = await sendAndConfirmTransaction(connection, transaction, [wallet.payer], { skipPreflight: true }); - console.log('Transfer Signature:', txSig); + console.log("Transfer Signature:", txSig); const tokenAccount = await getAccount(connection, delegateWSolTokenAccount); diff --git a/tokens/token-2022/transfer-hook/transfer-switch/anchor/Anchor.toml b/tokens/token-2022/transfer-hook/transfer-switch/anchor/Anchor.toml index b0c291690..988def122 100644 --- a/tokens/token-2022/transfer-hook/transfer-switch/anchor/Anchor.toml +++ b/tokens/token-2022/transfer-hook/transfer-switch/anchor/Anchor.toml @@ -6,13 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -transfer_switch = "FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g" - -# [registry] section removed — no longer used in Anchor 1.0 +transfer_switch = "H4LiorjbDr33X1KkTkWX9Eqy345uQH5HGNsxcPoXfGCg" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-2022/transfer-hook/transfer-switch/anchor/package.json b/tokens/token-2022/transfer-hook/transfer-switch/anchor/package.json index e65993ea8..37d84112c 100644 --- a/tokens/token-2022/transfer-hook/transfer-switch/anchor/package.json +++ b/tokens/token-2022/transfer-hook/transfer-switch/anchor/package.json @@ -1,19 +1,19 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "10.0.9", - "anchor-bankrun": "^0.5.0", - "chai": "^4.3.4", - "mocha": "^10.8.2", - "prettier": "^2.6.2", - "solana-bankrun": "^0.4.0", - "ts-mocha": "^10.0.0", - "typescript": "^5" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "10.0.9", + "anchor-bankrun": "^0.5.0", + "chai": "^4.3.4", + "mocha": "^10.8.2", + "prettier": "^2.6.2", + "solana-bankrun": "^0.4.0", + "ts-mocha": "^10.0.0", + "typescript": "^5" + } } diff --git a/tokens/token-2022/transfer-hook/transfer-switch/anchor/pnpm-lock.yaml b/tokens/token-2022/transfer-hook/transfer-switch/anchor/pnpm-lock.yaml index 9a8c97edf..ab332d5ba 100644 --- a/tokens/token-2022/transfer-hook/transfer-switch/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/transfer-hook/transfer-switch/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.0 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -48,18 +48,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -893,16 +893,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.6.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -920,7 +920,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/Cargo.toml b/tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/Cargo.toml index c3dc99a39..2cf6c344e 100644 --- a/tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/Cargo.toml +++ b/tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/Cargo.toml @@ -20,12 +20,18 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } -anchor-spl = "1.0.0-rc.5" +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = "1.0.0" spl-discriminator = "0.4.1" spl-tlv-account-resolution = "0.9.0" spl-transfer-hook-interface = "0.9.0" +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/lib.rs b/tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/lib.rs index 358558a06..9a025b457 100644 --- a/tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/lib.rs +++ b/tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/src/lib.rs @@ -9,7 +9,7 @@ use spl_transfer_hook_interface::instruction::{ ExecuteInstruction, InitializeExtraAccountMetaListInstruction, }; -declare_id!("FjcHckEgXcBhFmSGai3FRpDLiT6hbpV893n8iTxVd81g"); +declare_id!("H4LiorjbDr33X1KkTkWX9Eqy345uQH5HGNsxcPoXfGCg"); #[program] pub mod transfer_switch { diff --git a/tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs b/tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs new file mode 100644 index 000000000..a861d913b --- /dev/null +++ b/tokens/token-2022/transfer-hook/transfer-switch/anchor/programs/transfer-switch/tests/test_transfer_switch.rs @@ -0,0 +1,190 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, create_token_extensions_mint, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + MintExtension, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::{build_hook_accounts, get_hook_accounts_address, HookAccount}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_switch::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_switch.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_transfer_switch() { + let (mut svm, program_id, payer) = setup(); + let sender = create_wallet(&mut svm, 10_000_000_000).unwrap(); + let recipient = Keypair::new(); + let decimals: u8 = 9; + + // Derive PDAs + let (admin_config, _) = Pubkey::find_program_address(&[b"admin-config"], &program_id); + let (sender_switch, _) = + Pubkey::find_program_address(&[sender.pubkey().as_ref()], &program_id); + + // Step 1: Create mint with TransferHook extension + let mint = create_token_extensions_mint( + &mut svm, + &payer, + decimals, + None, + &[MintExtension::TransferHook { + program_id: program_id, + }], + ) + .unwrap(); + svm.expire_blockhash(); + + let extra_account_meta_list = + get_hook_accounts_address(&mint, &program_id); + + // Step 2: Create token accounts and mint tokens + let amount: u64 = 100 * 10u64.pow(decimals as u32); + let source_ata = create_token_extensions_account( + &mut svm, + &sender.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source_ata, + amount, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Configure admin + let configure_admin_ix = Instruction::new_with_bytes( + program_id, + &transfer_switch::instruction::ConfigureAdmin {}.data(), + transfer_switch::accounts::ConfigureAdmin { + admin: payer.pubkey(), + new_admin: payer.pubkey(), + admin_config, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![configure_admin_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Initialize extra account metas list + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_switch::instruction::InitializeExtraAccountMetasList {}.data(), + transfer_switch::accounts::InitializeExtraAccountMetas { + payer: payer.pubkey(), + token_mint: mint, + extra_account_metas_list: extra_account_meta_list, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 5: Turn transfers OFF for sender + let switch_off_ix = Instruction::new_with_bytes( + program_id, + &transfer_switch::instruction::Switch { on: false }.data(), + transfer_switch::accounts::Switch { + admin: payer.pubkey(), + wallet: sender.pubkey(), + admin_config, + wallet_switch: sender_switch, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![switch_off_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 6: Try transfer — should FAIL (switch is off) + let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); + let extra_accounts = build_hook_accounts( + &mint, + &program_id, + &[HookAccount { + pubkey: sender_switch, + is_signer: false, + is_writable: false, + }], + ); + let result = transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint, + &dest_ata, + &sender, + transfer_amount, + decimals, + &extra_accounts, + ); + assert!( + result.is_err(), + "Transfer should fail when switch is off" + ); + svm.expire_blockhash(); + + // Step 7: Turn transfers ON for sender + let switch_on_ix = Instruction::new_with_bytes( + program_id, + &transfer_switch::instruction::Switch { on: true }.data(), + transfer_switch::accounts::Switch { + admin: payer.pubkey(), + wallet: sender.pubkey(), + admin_config, + wallet_switch: sender_switch, + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![switch_on_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 8: Transfer — should SUCCEED (switch is on) + transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint, + &dest_ata, + &sender, + transfer_amount, + decimals, + &extra_accounts, + ).unwrap(); +} diff --git a/tokens/token-2022/transfer-hook/transfer-switch/anchor/tests/transfer-switch.ts b/tokens/token-2022/transfer-hook/transfer-switch/anchor/tests/transfer-switch.ts index 85969836f..f762a429a 100644 --- a/tokens/token-2022/transfer-hook/transfer-switch/anchor/tests/transfer-switch.ts +++ b/tokens/token-2022/transfer-hook/transfer-switch/anchor/tests/transfer-switch.ts @@ -13,21 +13,16 @@ import { getMintLen, TOKEN_2022_PROGRAM_ID, } from "@solana/spl-token"; -import { - Keypair, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, -} from "@solana/web3.js"; +import { Keypair, PublicKey, SystemProgram, Transaction, type TransactionInstruction } from "@solana/web3.js"; import { BankrunProvider } from "anchor-bankrun"; import { assert } from "chai"; import { startAnchor } from "solana-bankrun"; +import IDL from "../target/idl/transfer_switch.json"; import type { TransferSwitch } from "../target/types/transfer_switch"; -import IDL from "../target/idl/transfer_switch.json"; const PROGRAM_ID = new PublicKey(IDL.address); +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 const expectRevert = async (promise: Promise) => { try { await promise; @@ -38,11 +33,7 @@ const expectRevert = async (promise: Promise) => { }; describe("Transfer switch", async () => { - const context = await startAnchor( - "", - [{ name: "transfer_switch", programId: PROGRAM_ID }], - [], - ); + const context = await startAnchor("", [{ name: "transfer_switch", programId: PROGRAM_ID }], []); const provider = new BankrunProvider(context); const _wallet = provider.wallet as anchor.Wallet; @@ -77,10 +68,7 @@ describe("Transfer switch", async () => { } // admin config address - const adminConfigAddress = PublicKey.findProgramAddressSync( - [Buffer.from("admin-config")], - PROGRAM_ID, - )[0]; + const adminConfigAddress = PublicKey.findProgramAddressSync([Buffer.from("admin-config")], PROGRAM_ID)[0]; // helper for getting wallet switch const walletTransferSwitchAddress = (wallet: PublicKey) => @@ -92,8 +80,7 @@ describe("Transfer switch", async () => { it("Create Mint Account with Transfer Hook Extension", async () => { const extensions = [ExtensionType.TransferHook]; const mintLen = getMintLen(extensions); - const lamports = - await provider.connection.getMinimumBalanceForRentExemption(mintLen); + const lamports = await provider.connection.getMinimumBalanceForRentExemption(mintLen); const transaction = new Transaction().add( SystemProgram.createAccount({ @@ -109,13 +96,7 @@ describe("Transfer switch", async () => { program.programId, // Transfer Hook Program ID TOKEN_2022_PROGRAM_ID, ), - createInitializeMintInstruction( - mint.publicKey, - decimals, - payer.publicKey, - null, - TOKEN_2022_PROGRAM_ID, - ), + createInitializeMintInstruction(mint.publicKey, decimals, payer.publicKey, null, TOKEN_2022_PROGRAM_ID), ); transaction.recentBlockhash = context.lastBlockhash; @@ -132,14 +113,7 @@ describe("Transfer switch", async () => { const transaction = new Transaction().add( senderTokenAccountCreateIx, // create sender token account - createMintToInstruction( - mint.publicKey, - senderTokenAccount, - payer.publicKey, - amount, - [], - TOKEN_2022_PROGRAM_ID, - ), + createMintToInstruction(mint.publicKey, senderTokenAccount, payer.publicKey, amount, [], TOKEN_2022_PROGRAM_ID), ); transaction.recentBlockhash = context.lastBlockhash; @@ -173,13 +147,9 @@ describe("Transfer switch", async () => { .signers([payer]) .rpc(); - const adminConfig = - await program.account.adminConfig.fetch(adminConfigAddress); + const adminConfig = await program.account.adminConfig.fetch(adminConfigAddress); assert(adminConfig.isInitialised === true, "admin config not initialised"); - assert( - adminConfig.admin.toBase58() === payer.publicKey.toBase58(), - "admin does not match", - ); + assert(adminConfig.admin.toBase58() === payer.publicKey.toBase58(), "admin does not match"); }); // Account to store extra accounts required by the transfer hook instruction @@ -193,14 +163,9 @@ describe("Transfer switch", async () => { .signers([payer]) .rpc(); - const walletSwitch = await program.account.transferSwitch.fetch( - walletTransferSwitchAddress(sender.publicKey), - ); + const walletSwitch = await program.account.transferSwitch.fetch(walletTransferSwitchAddress(sender.publicKey)); - assert( - walletSwitch.wallet.toBase58() === sender.publicKey.toBase58(), - "wallet key does not match", - ); + assert(walletSwitch.wallet.toBase58() === sender.publicKey.toBase58(), "wallet key does not match"); assert(!walletSwitch.on, "wallet switch not set to false"); }); @@ -209,8 +174,7 @@ describe("Transfer switch", async () => { const amount = 1 * 10 ** decimals; const bigIntAmount = BigInt(amount); - const [recipient, recipientTokenAccount, recipientTokenAccountCreateIx] = - newUser(); + const [recipient, recipientTokenAccount, recipientTokenAccountCreateIx] = newUser(); // create the recipient token account ahead of the transfer, // @@ -224,19 +188,18 @@ describe("Transfer switch", async () => { client.processTransaction(transaction); // Standard token transfer instruction - const transferInstruction = - await createTransferCheckedWithTransferHookInstruction( - connection, - senderTokenAccount, - mint.publicKey, - recipientTokenAccount, - sender.publicKey, - bigIntAmount, - decimals, - [], - "confirmed", - TOKEN_2022_PROGRAM_ID, - ); + const transferInstruction = await createTransferCheckedWithTransferHookInstruction( + connection, + senderTokenAccount, + mint.publicKey, + recipientTokenAccount, + sender.publicKey, + bigIntAmount, + decimals, + [], + "confirmed", + TOKEN_2022_PROGRAM_ID, + ); transaction = new Transaction().add( transferInstruction, // transfer instruction @@ -249,12 +212,8 @@ describe("Transfer switch", async () => { // expectRevert(client.processTransaction(transaction)); - const recipientTokenAccountData = ( - await client.getAccount(recipientTokenAccount) - ).data; - const recipientBalance = AccountLayout.decode( - recipientTokenAccountData, - ).amount; + const recipientTokenAccountData = (await client.getAccount(recipientTokenAccount)).data; + const recipientBalance = AccountLayout.decode(recipientTokenAccountData).amount; assert(recipientBalance === BigInt(0), "transfer was successful"); }); @@ -270,14 +229,9 @@ describe("Transfer switch", async () => { .signers([payer]) .rpc(); - const walletSwitch = await program.account.transferSwitch.fetch( - walletTransferSwitchAddress(sender.publicKey), - ); + const walletSwitch = await program.account.transferSwitch.fetch(walletTransferSwitchAddress(sender.publicKey)); - assert( - walletSwitch.wallet.toBase58() === sender.publicKey.toBase58(), - "wallet key does not match", - ); + assert(walletSwitch.wallet.toBase58() === sender.publicKey.toBase58(), "wallet key does not match"); assert(walletSwitch.on, "wallet switch not set to true"); }); @@ -286,41 +240,32 @@ describe("Transfer switch", async () => { const amount = 1 * 10 ** decimals; const bigIntAmount = BigInt(amount); - const [_recipient, recipientTokenAccount, recipientTokenAccountCreateIx] = - newUser(); + const [_recipient, recipientTokenAccount, recipientTokenAccountCreateIx] = newUser(); // Standard token transfer instruction - const transferInstruction = - await createTransferCheckedWithTransferHookInstruction( - connection, - senderTokenAccount, - mint.publicKey, - recipientTokenAccount, - sender.publicKey, - bigIntAmount, - decimals, - [], - "confirmed", - TOKEN_2022_PROGRAM_ID, - ); - - const transaction = new Transaction().add( - recipientTokenAccountCreateIx, - transferInstruction, + const transferInstruction = await createTransferCheckedWithTransferHookInstruction( + connection, + senderTokenAccount, + mint.publicKey, + recipientTokenAccount, + sender.publicKey, + bigIntAmount, + decimals, + [], + "confirmed", + TOKEN_2022_PROGRAM_ID, ); + const transaction = new Transaction().add(recipientTokenAccountCreateIx, transferInstruction); + transaction.recentBlockhash = context.lastBlockhash; transaction.sign(payer, sender); await client.processTransaction(transaction); - const recipientTokenAccountData = ( - await client.getAccount(recipientTokenAccount) - ).data; + const recipientTokenAccountData = (await client.getAccount(recipientTokenAccount)).data; - const recipientBalance = AccountLayout.decode( - recipientTokenAccountData, - ).amount; + const recipientBalance = AccountLayout.decode(recipientTokenAccountData).amount; assert(recipientBalance === bigIntAmount, "transfer was not successful"); }); diff --git a/tokens/token-2022/transfer-hook/whitelist/anchor/Anchor.toml b/tokens/token-2022/transfer-hook/whitelist/anchor/Anchor.toml index 356cfec90..982f03943 100644 --- a/tokens/token-2022/transfer-hook/whitelist/anchor/Anchor.toml +++ b/tokens/token-2022/transfer-hook/whitelist/anchor/Anchor.toml @@ -2,22 +2,17 @@ solana_version = "3.1.8" [features] -seeds = false +resolution = true skip-lint = false [programs.localnet] -transfer_hook = "DrWbQtYJGtsoRwzKqAbHKHKsCJJfpysudF39GBVFSxub" - -# [registry] section removed — no longer used in Anchor 1.0 +transfer_hook = "Gkhsnn4Svph2FUNKbNHXQiKHpXWv6xfUBxitSxs7EzW2" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" -# Transfer-hook tests use the real local validator (not bankrun). -# No external program clones needed — this project doesn't use Metaplex. -# The previous [[test.validator.clone]] of metaplex was unnecessary and -# caused 5-minute timeouts in CI trying to fetch from devnet. +[hooks] diff --git a/tokens/token-2022/transfer-hook/whitelist/anchor/migrations/deploy.ts b/tokens/token-2022/transfer-hook/whitelist/anchor/migrations/deploy.ts index cfcedbc47..81b3ef439 100644 --- a/tokens/token-2022/transfer-hook/whitelist/anchor/migrations/deploy.ts +++ b/tokens/token-2022/transfer-hook/whitelist/anchor/migrations/deploy.ts @@ -2,7 +2,7 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require('@anchor-lang/core'); +const anchor = require("@anchor-lang/core"); module.exports = async (provider) => { // Configure client to use the provider. diff --git a/tokens/token-2022/transfer-hook/whitelist/anchor/package.json b/tokens/token-2022/transfer-hook/whitelist/anchor/package.json index 908f2ae4d..79d498c2a 100644 --- a/tokens/token-2022/transfer-hook/whitelist/anchor/package.json +++ b/tokens/token-2022/transfer-hook/whitelist/anchor/package.json @@ -1,23 +1,23 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.0" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/chai-as-promised": "^7.1.8", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "chai-as-promised": "^7.1.2", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/chai-as-promised": "^7.1.8", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "chai-as-promised": "^7.1.2", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-2022/transfer-hook/whitelist/anchor/pnpm-lock.yaml b/tokens/token-2022/transfer-hook/whitelist/anchor/pnpm-lock.yaml index 8bd73a769..1c8575404 100644 --- a/tokens/token-2022/transfer-hook/whitelist/anchor/pnpm-lock.yaml +++ b/tokens/token-2022/transfer-hook/whitelist/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.0 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -48,18 +48,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -874,16 +874,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -901,7 +901,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/Cargo.toml b/tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/Cargo.toml index cf9678574..24e07e0b6 100644 --- a/tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/Cargo.toml +++ b/tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/Cargo.toml @@ -20,12 +20,18 @@ custom-heap = [] custom-panic = [] [dependencies] -# Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } -anchor-spl = "1.0.0-rc.5" +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = "1.0.0" spl-discriminator = "0.4.1" spl-tlv-account-resolution = "0.9.0" spl-transfer-hook-interface = "0.9.0" +[dev-dependencies] +litesvm = "0.11.0" +solana-kite = "0.3.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +borsh = "1.6.1" + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs b/tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs index 5ac0f64c3..ab155381b 100644 --- a/tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs +++ b/tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/src/lib.rs @@ -19,7 +19,7 @@ use spl_transfer_hook_interface::instruction::{ ExecuteInstruction, InitializeExtraAccountMetaListInstruction, }; -declare_id!("DrWbQtYJGtsoRwzKqAbHKHKsCJJfpysudF39GBVFSxub"); +declare_id!("Gkhsnn4Svph2FUNKbNHXQiKHpXWv6xfUBxitSxs7EzW2"); #[error_code] pub enum TransferError { diff --git a/tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs b/tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs new file mode 100644 index 000000000..35152fa76 --- /dev/null +++ b/tokens/token-2022/transfer-hook/whitelist/anchor/programs/transfer-hook/tests/test_transfer_hook.rs @@ -0,0 +1,138 @@ +use { + anchor_lang::{ + solana_program::{ + instruction::Instruction, + pubkey::Pubkey, + system_program, + }, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_kite::{ + create_wallet, send_transaction_from_instructions, + token_extensions::{ + create_token_extensions_account, create_token_extensions_mint, + mint_tokens_to_token_extensions_account, transfer_checked_token_extensions, + MintExtension, TOKEN_EXTENSIONS_PROGRAM_ID, + }, + transfer_hook::{build_hook_accounts, get_hook_accounts_address, HookAccount}, + }, + solana_keypair::Keypair, + solana_signer::Signer, +}; + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_hook::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_hook.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_whitelist_transfer_hook() { + let (mut svm, program_id, payer) = setup(); + let recipient = Keypair::new(); + let decimals: u8 = 9; + + // Derive PDAs + let (white_list_pda, _) = Pubkey::find_program_address(&[b"white_list"], &program_id); + + // Step 1: Create mint with TransferHook extension + let mint = create_token_extensions_mint( + &mut svm, + &payer, + decimals, + None, + &[MintExtension::TransferHook { + program_id: program_id, + }], + ) + .unwrap(); + svm.expire_blockhash(); + + let extra_account_meta_list = + get_hook_accounts_address(&mint, &program_id); + + // Step 2: Create token accounts and mint tokens + let amount: u64 = 100 * 10u64.pow(decimals as u32); + let source_ata = create_token_extensions_account( + &mut svm, + &payer.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + let dest_ata = create_token_extensions_account( + &mut svm, + &recipient.pubkey(), + &mint, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + mint_tokens_to_token_extensions_account( + &mut svm, + &mint, + &source_ata, + amount, + &payer, + ).unwrap(); + svm.expire_blockhash(); + + // Step 3: Initialize ExtraAccountMetaList (also creates whitelist) + let init_extra_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::InitializeExtraAccountMetaList {}.data(), + transfer_hook::accounts::InitializeExtraAccountMetaList { + payer: payer.pubkey(), + extra_account_meta_list, + mint, + system_program: system_program::id(), + white_list: white_list_pda, + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![init_extra_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 4: Add destination token account to whitelist + let add_to_whitelist_ix = Instruction::new_with_bytes( + program_id, + &transfer_hook::instruction::AddToWhitelist {}.data(), + transfer_hook::accounts::AddToWhiteList { + new_account: dest_ata, + white_list: white_list_pda, + signer: payer.pubkey(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions(&mut svm, vec![add_to_whitelist_ix], &[&payer], &payer.pubkey()).unwrap(); + svm.expire_blockhash(); + + // Step 5: Transfer — should succeed (destination is whitelisted) + let transfer_amount: u64 = 1 * 10u64.pow(decimals as u32); + let extra_accounts = build_hook_accounts( + &mint, + &program_id, + &[HookAccount { + pubkey: white_list_pda, + is_signer: false, + is_writable: true, + }], + ); + transfer_checked_token_extensions( + &mut svm, + &source_ata, + &mint, + &dest_ata, + &payer, + transfer_amount, + decimals, + &extra_accounts, + ).unwrap(); +} diff --git a/tokens/token-2022/transfer-hook/whitelist/anchor/tests/transfer-hook.ts b/tokens/token-2022/transfer-hook/whitelist/anchor/tests/transfer-hook.ts index 3dd06a21c..70d2bdcbb 100644 --- a/tokens/token-2022/transfer-hook/whitelist/anchor/tests/transfer-hook.ts +++ b/tokens/token-2022/transfer-hook/whitelist/anchor/tests/transfer-hook.ts @@ -1,5 +1,5 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; import { ASSOCIATED_TOKEN_PROGRAM_ID, createAssociatedTokenAccountInstruction, @@ -11,11 +11,11 @@ import { getAssociatedTokenAddressSync, getMintLen, TOKEN_2022_PROGRAM_ID, -} from '@solana/spl-token'; -import { Keypair, SystemProgram, sendAndConfirmTransaction, Transaction } from '@solana/web3.js'; -import type { TransferHook } from '../target/types/transfer_hook'; +} from "@solana/spl-token"; +import { Keypair, SystemProgram, sendAndConfirmTransaction, Transaction } from "@solana/web3.js"; +import type { TransferHook } from "../target/types/transfer_hook"; -describe('transfer-hook', () => { +describe("transfer-hook", () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); @@ -47,7 +47,7 @@ describe('transfer-hook', () => { ASSOCIATED_TOKEN_PROGRAM_ID, ); - it('Create Mint Account with Transfer Hook Extension', async () => { + it("Create Mint Account with Transfer Hook Extension", async () => { const extensions = [ExtensionType.TransferHook]; const mintLen = getMintLen(extensions); const lamports = await provider.connection.getMinimumBalanceForRentExemption(mintLen); @@ -75,7 +75,7 @@ describe('transfer-hook', () => { // Create the two token accounts for the transfer-hook enabled mint // Fund the sender token account with 100 tokens - it('Create Token Accounts and Mint Tokens', async () => { + it("Create Token Accounts and Mint Tokens", async () => { // 100 tokens const amount = 100 * 10 ** decimals; @@ -105,7 +105,7 @@ describe('transfer-hook', () => { }); // Account to store extra accounts required by the transfer hook instruction - it('Create ExtraAccountMetaList Account', async () => { + it("Create ExtraAccountMetaList Account", async () => { const initializeExtraAccountMetaListInstruction = await program.methods .initializeExtraAccountMetaList() .accounts({ @@ -115,12 +115,15 @@ describe('transfer-hook', () => { const transaction = new Transaction().add(initializeExtraAccountMetaListInstruction); - const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer], { skipPreflight: true, commitment: 'confirmed' }); + const txSig = await sendAndConfirmTransaction(provider.connection, transaction, [wallet.payer], { + skipPreflight: true, + commitment: "confirmed", + }); - console.log('Transaction Signature:', txSig); + console.log("Transaction Signature:", txSig); }); - it('Add account to white list', async () => { + it("Add account to white list", async () => { const addAccountToWhiteListInstruction = await program.methods .addToWhitelist() .accounts({ @@ -132,10 +135,10 @@ describe('transfer-hook', () => { const transaction = new Transaction().add(addAccountToWhiteListInstruction); const txSig = await sendAndConfirmTransaction(connection, transaction, [wallet.payer], { skipPreflight: true }); - console.log('White Listed:', txSig); + console.log("White Listed:", txSig); }); - it('Transfer Hook with Extra Account Meta', async () => { + it("Transfer Hook with Extra Account Meta", async () => { // 1 tokens const amount = 1 * 10 ** decimals; const bigIntAmount = BigInt(amount); @@ -150,13 +153,13 @@ describe('transfer-hook', () => { bigIntAmount, decimals, [], - 'confirmed', + "confirmed", TOKEN_2022_PROGRAM_ID, ); const transaction = new Transaction().add(transferInstruction); const txSig = await sendAndConfirmTransaction(connection, transaction, [wallet.payer], { skipPreflight: true }); - console.log('Transfer Checked:', txSig); + console.log("Transfer Checked:", txSig); }); }); diff --git a/tokens/token-fundraiser/anchor/Anchor.toml b/tokens/token-fundraiser/anchor/Anchor.toml index 237dbed3c..d4a75652c 100644 --- a/tokens/token-fundraiser/anchor/Anchor.toml +++ b/tokens/token-fundraiser/anchor/Anchor.toml @@ -5,17 +5,17 @@ solana_version = "3.1.8" resolution = true skip-lint = false -[programs.localnet] -fundraiser = "Eoiuq1dXvHxh6dLx3wh9gj8kSAUpga11krTrbfF5XYsC" - [programs.devnet] fundraiser = "Eoiuq1dXvHxh6dLx3wh9gj8kSAUpga11krTrbfF5XYsC" -# [registry] section removed — no longer used in Anchor 1.0 +[programs.localnet] +fundraiser = "EuqudshRf8VRskatC6U3txgivHmtCkY5d1qsK5B3VAio" [provider] -cluster = "Localnet" +cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/token-fundraiser/anchor/Cargo.lock b/tokens/token-fundraiser/anchor/Cargo.lock index 2c19ef810..662ae9869 100644 --- a/tokens/token-fundraiser/anchor/Cargo.lock +++ b/tokens/token-fundraiser/anchor/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.7", "generic-array", ] @@ -20,7 +20,7 @@ checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -38,20 +38,107 @@ dependencies = [ "zeroize", ] +[[package]] +name = "agave-feature-set" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e631ba26aeffe98dee3db0b8612fc7c67cda71bc57b0f82f28dc48231df6bc8" +dependencies = [ + "ahash", + "solana-epoch-schedule", + "solana-hash 3.1.0", + "solana-pubkey 3.0.0", + "solana-sha256-hasher", + "solana-svm-feature-set", +] + +[[package]] +name = "agave-reserved-account-keys" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d062865aedfbdc7511726d47e472687db0db4fb08e3c3ab2ac68570106c2f1b6" +dependencies = [ + "agave-feature-set", + "solana-pubkey 3.0.0", + "solana-sdk-ids", +] + +[[package]] +name = "agave-syscalls" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c89f228e93d1bc769578efd0c5a445715ae04ad96f9b6f8d16d018ad7f9221a" +dependencies = [ + "bincode", + "libsecp256k1", + "num-traits", + "solana-account", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-bn254", + "solana-clock", + "solana-cpi", + "solana-curve25519", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keccak-hasher", + "solana-loader-v3-interface", + "solana-poseidon", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-secp256k1-recover", + "solana-sha256-hasher", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-type-overrides", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction-context", + "thiserror 2.0.18", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + [[package]] name = "anchor-attribute-access-control" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3db7f5f8a6b16fa2b6e1b0222e656249c3abedf052e3943babf248929571204" +checksum = "b972f5fbd02524c92e4eb487c3c648904572702670f3d6fc81aef5f1751b1569" dependencies = [ "proc-macro2", "quote", @@ -60,9 +147,9 @@ dependencies = [ [[package]] name = "anchor-attribute-account" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a12661acaba9866a5f2d8d8d46a1eed8b484f41dc9f94f808c3b07d35726816" +checksum = "9acfcb07a92084bcfa9f6cc49a5c2e8e0e986f25f4b7caa184b7a2c9c9e561c2" dependencies = [ "anchor-syn", "proc-macro2", @@ -72,9 +159,9 @@ dependencies = [ [[package]] name = "anchor-attribute-constant" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dff08bc0187aafc559da8f63b5adeab0bcdf97128765c72dd9a4861f70627fc" +checksum = "8f46cc38f819377f07663b8eb492a701427950065e79d2d7b622a782443deb7a" dependencies = [ "anchor-syn", "quote", @@ -83,9 +170,9 @@ dependencies = [ [[package]] name = "anchor-attribute-error" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2af8ce12fb8cf782a3e127d376698a4548a518e38b4686f9c439adce4730b48" +checksum = "9c34748789107c9838329e058ca7b253e67f37b39ceae5a0a6c8d99f5d1bf1fe" dependencies = [ "anchor-syn", "quote", @@ -94,9 +181,9 @@ dependencies = [ [[package]] name = "anchor-attribute-event" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "338be5df076369b99585264aaa46c66229ead67568d61bd38c3ab0fa7a15e554" +checksum = "1a28a3e5eefa03d9c5ef02b2139198f652547d38dddafc9c5545152dfba54556" dependencies = [ "anchor-syn", "proc-macro2", @@ -106,9 +193,9 @@ dependencies = [ [[package]] name = "anchor-attribute-program" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c4ec70cef4ef7e2d87b4e9c550f727a43d691d3d7f3e4d6b2e3bd530ae098d" +checksum = "dfaa03865053cb168bfc4debe5992be87f397aa027dd81b69a2e44f2e5bae1c5" dependencies = [ "anchor-lang-idl", "anchor-syn", @@ -121,9 +208,9 @@ dependencies = [ [[package]] name = "anchor-derive-accounts" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f610cb50e10e4c404cc774f20a4eb602b904f68ea04590f8b1eb22a1e28b33e5" +checksum = "eef330db08f9ceee45c18ef96b15b869883d280c0ab5c6ff5d2e2f6481da7911" dependencies = [ "anchor-syn", "quote", @@ -132,9 +219,9 @@ dependencies = [ [[package]] name = "anchor-derive-serde" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be9ead49a9689493f8857a61dd1abf1d70eeeeb0683f8c1e09b015ab5bdd382d" +checksum = "e0e80ff4e3ddb8c85aafd37926335c28f820516311e7106e5b7482b42e798aaa" dependencies = [ "anchor-syn", "proc-macro-crate", @@ -145,9 +232,9 @@ dependencies = [ [[package]] name = "anchor-derive-space" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4d1372743444967347b60f9311d2ee54a630152fd1d6d805adebd7fcd72056" +checksum = "2672af0ef4dfd5f5b6199355867b580cd8b4048093ef5208dd2b441305c15b8b" dependencies = [ "proc-macro2", "quote", @@ -156,9 +243,9 @@ dependencies = [ [[package]] name = "anchor-lang" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "254d0cb160ea5c4c6a8c2f847bbd0f384fef733ebc36ef8426ae95f1bfda5757" +checksum = "8de9dce227fa0c08be20fef008c5b04681e1e0a15cb396e9619a9a1f800ff6cd" dependencies = [ "anchor-attribute-access-control", "anchor-attribute-account", @@ -193,7 +280,7 @@ dependencies = [ "solana-pubkey 3.0.0", "solana-sdk-ids", "solana-stake-interface", - "solana-system-interface", + "solana-system-interface 2.0.0", "solana-sysvar", "solana-sysvar-id", "thiserror 1.0.69", @@ -211,7 +298,7 @@ dependencies = [ "regex", "serde", "serde_json", - "sha2", + "sha2 0.10.9", ] [[package]] @@ -226,9 +313,9 @@ dependencies = [ [[package]] name = "anchor-spl" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3f1da81d6a7486339833833db9285f3771c1c368db418d481b5584a901cd675" +checksum = "300e2e8058e674e8d6ea7c72dfb8be4349609dd9c3760ce729fc6406199624fe" dependencies = [ "anchor-lang", "spl-associated-token-account-interface", @@ -241,9 +328,9 @@ dependencies = [ [[package]] name = "anchor-syn" -version = "1.0.0-rc.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9a855d34b1b0488f37ccc759c8bd4a696cd3a7bba8cb0734c2a965109f707da" +checksum = "c62f42cb7e348c033bd9bfba59979bcd66431c026ba23490af94045aa357a950" dependencies = [ "anyhow", "bs58", @@ -252,16 +339,266 @@ dependencies = [ "proc-macro2", "quote", "serde", - "sha2", + "sha2 0.10.9", "syn 1.0.109", "thiserror 1.0.69", ] +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi", +] + [[package]] name = "anyhow" -version = "1.0.86" +version = "1.0.102" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" + +[[package]] +name = "ark-bn254" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" +dependencies = [ + "ark-ec 0.4.2", + "ark-ff 0.4.2", + "ark-std 0.4.0", +] + +[[package]] +name = "ark-bn254" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d69eab57e8d2663efa5c63135b2af4f396d66424f88954c21104125ab6b3e6bc" +dependencies = [ + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-ec" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" +dependencies = [ + "ark-ff 0.4.2", + "ark-poly 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", + "itertools 0.10.5", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-poly 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint 0.4.6", + "num-traits", + "paste", + "rustc_version", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-poly" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" +dependencies = [ + "ark-ff 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "hashbrown 0.13.2", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-serialize-derive 0.4.2", + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand 0.8.5", +] [[package]] name = "arrayref" @@ -269,11 +606,35 @@ version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "ascii" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" + [[package]] name = "autocfg" -version = "1.3.0" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + +[[package]] +name = "base64" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" [[package]] name = "base64" @@ -287,6 +648,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64ct" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" + [[package]] name = "bincode" version = "1.3.3" @@ -298,9 +665,33 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.9.4" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" + +[[package]] +name = "blake3" +version = "1.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d2d5991425dfd0785aed03aedcf0b321d61975c9b5b3689c774a2610ae0b51e" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if", + "constant_time_eq", + "cpufeatures 0.3.0", + "digest 0.11.2", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] [[package]] name = "block-buffer" @@ -311,21 +702,31 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block-buffer" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +dependencies = [ + "hybrid-array", +] + [[package]] name = "borsh" -version = "1.5.7" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad8646f98db542e39fc66e68a20b2144f6a732636df7c2354e74645faaa433ce" +checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" dependencies = [ "borsh-derive", + "bytes", "cfg_aliases", ] [[package]] name = "borsh-derive" -version = "1.5.7" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdd1d3c0c2f5833f22386f252fe8ed005c7f59fdcddeef025c01b4c3b9fd9ac3" +checksum = "bfcfdc083699101d5a7965e49925975f2f55060f94f9a05e7187be95d530ca59" dependencies = [ "once_cell", "proc-macro-crate", @@ -345,9 +746,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.16.0" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "bv" @@ -361,9 +762,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.24.0" +version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" dependencies = [ "bytemuck_derive", ] @@ -385,6 +786,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "bytes" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" + [[package]] name = "cargo_toml" version = "0.19.2" @@ -396,27 +803,67 @@ dependencies = [ ] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "cc" +version = "1.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - +checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" +dependencies = [ + "find-msvc-tools", + "shlex", +] + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + [[package]] name = "cfg_aliases" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "cfg_eval" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45565fc9416b9896014f5732ac776f810ee53a66730c17e4020c3ec064a8f88f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "cipher" version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "crypto-common", + "crypto-common 0.1.7", "inout", ] +[[package]] +name = "cmov" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746" + +[[package]] +name = "combine" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" +dependencies = [ + "ascii", + "byteorder", + "either", + "memchr", + "unreachable", +] + [[package]] name = "const-crypto" version = "0.3.0" @@ -427,26 +874,74 @@ dependencies = [ "sha2-const-stable", ] +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "constant_time_eq" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + [[package]] name = "cpufeatures" -version = "0.2.12" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" dependencies = [ "libc", ] +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "typenum", ] +[[package]] +name = "crypto-common" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" +dependencies = [ + "hybrid-array", +] + [[package]] name = "ctr" version = "0.9.2" @@ -456,6 +951,15 @@ dependencies = [ "cipher", ] +[[package]] +name = "ctutils" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5515a3834141de9eafb9717ad39eea8247b5674e6066c404e8c4b365d2a29e" +dependencies = [ + "cmov", +] + [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -463,11 +967,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "curve25519-dalek-derive", - "digest", + "digest 0.10.7", "fiat-crypto", - "rand_core", + "rand_core 0.6.4", "rustc_version", "serde", "subtle", @@ -491,8 +995,18 @@ version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.21.3", + "darling_macro 0.21.3", +] + +[[package]] +name = "darling" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +dependencies = [ + "darling_core 0.23.0", + "darling_macro 0.23.0", ] [[package]] @@ -509,45 +1023,227 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "darling_core" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +dependencies = [ + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.117", +] + [[package]] name = "darling_macro" version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ - "darling_core", + "darling_core 0.21.3", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "darling_macro" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +dependencies = [ + "darling_core 0.23.0", "quote", "syn 2.0.117", ] +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "derivation-path" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "block-buffer", - "crypto-common", + "block-buffer 0.10.4", + "const-oid", + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "digest" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" +dependencies = [ + "block-buffer 0.12.0", + "crypto-common 0.2.1", + "ctutils", +] + +[[package]] +name = "eager" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest 0.10.7", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "ed25519" +version = "2.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +dependencies = [ + "pkcs8", + "signature", +] + +[[package]] +name = "ed25519-dalek" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +dependencies = [ + "curve25519-dalek", + "ed25519", + "rand_core 0.6.4", + "serde", + "sha2 0.10.9", "subtle", + "zeroize", +] + +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] name = "either" -version = "1.13.0" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest 0.10.7", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "enum-iterator" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" +dependencies = [ + "enum-iterator-derive", +] + +[[package]] +name = "enum-iterator-derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685adfa4d6f3d765a26bc5dbc936577de9abf756c1feeb3089b01dd395034842" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "enum-ordinalize" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "feature-probe" @@ -555,12 +1251,28 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "fiat-crypto" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "find-msvc-tools" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" + [[package]] name = "five8" version = "1.0.0" @@ -581,9 +1293,9 @@ dependencies = [ [[package]] name = "five8_core" -version = "0.1.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2551bf44bc5f776c15044b9b94153a00198be06743e262afaaa61f11ac7523a5" +checksum = "059c31d7d36c43fe39d89e55711858b4da8be7eb6dabac23c7289b1a19489406" [[package]] name = "fnv" @@ -597,6 +1309,11 @@ version = "0.1.0" dependencies = [ "anchor-lang", "anchor-spl", + "borsh", + "litesvm", + "solana-keypair", + "solana-kite", + "solana-signer", ] [[package]] @@ -607,21 +1324,83 @@ checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] name = "getrandom" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", "js-sys", "libc", - "wasi", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasip2", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", +] + [[package]] name = "hashbrown" version = "0.16.1" @@ -643,7 +1422,16 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", +] + +[[package]] +name = "hybrid-array" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +dependencies = [ + "typenum", ] [[package]] @@ -654,12 +1442,12 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "indexmap" -version = "2.13.0" +version = "2.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" +checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.16.1", ] [[package]] @@ -673,36 +1461,77 @@ dependencies = [ [[package]] name = "itertools" -version = "0.12.1" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] -name = "itoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "js-sys" -version = "0.3.81" +version = "0.3.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" +checksum = "2e04e2ef80ce82e13552136fabeef8a5ed1f985a96805761cbb9a2c34e7664d9" dependencies = [ "once_cell", "wasm-bindgen", ] +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2 0.10.9", + "signature", +] + [[package]] name = "keccak" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" dependencies = [ - "cpufeatures", + "cpufeatures 0.2.17", ] [[package]] @@ -719,31 +1548,173 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.155" +version = "0.2.184" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" + +[[package]] +name = "libsecp256k1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" +dependencies = [ + "arrayref", + "base64 0.12.3", + "digest 0.9.0", + "libsecp256k1-core", + "libsecp256k1-gen-ecmult", + "libsecp256k1-gen-genmult", + "rand 0.7.3", + "serde", + "sha2 0.9.9", +] + +[[package]] +name = "libsecp256k1-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" +dependencies = [ + "crunchy", + "digest 0.9.0", + "subtle", +] + +[[package]] +name = "libsecp256k1-gen-ecmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "libsecp256k1-gen-genmult" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" +dependencies = [ + "libsecp256k1-core", +] + +[[package]] +name = "light-poseidon" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" +dependencies = [ + "ark-bn254 0.4.0", + "ark-ff 0.4.2", + "num-bigint 0.4.6", + "thiserror 1.0.69", +] + +[[package]] +name = "light-poseidon" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47a1ccadd0bb5a32c196da536fd72c59183de24a055f6bf0513bf845fefab862" +dependencies = [ + "ark-bn254 0.5.0", + "ark-ff 0.5.0", + "num-bigint 0.4.6", + "thiserror 1.0.69", +] + +[[package]] +name = "litesvm" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +checksum = "347d8c652d592c618ac996f2ab21f8c0b0f2da3fbbca227a6887ee61bb75f2de" +dependencies = [ + "agave-feature-set", + "agave-reserved-account-keys", + "agave-syscalls", + "ansi_term", + "bincode", + "indexmap", + "itertools 0.14.0", + "log", + "serde", + "solana-account", + "solana-address 2.5.0", + "solana-address-lookup-table-interface", + "solana-bpf-loader-program", + "solana-builtins", + "solana-clock", + "solana-compute-budget", + "solana-compute-budget-instruction", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-feature-gate-interface", + "solana-fee", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instructions-sysvar", + "solana-keypair", + "solana-last-restart-slot", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-message", + "solana-native-token", + "solana-nonce", + "solana-nonce-account", + "solana-precompile-error", + "solana-program-error", + "solana-program-runtime", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sha256-hasher", + "solana-signature", + "solana-signer", + "solana-slot-hashes", + "solana-slot-history", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-log-collector", + "solana-svm-timings", + "solana-svm-transaction", + "solana-system-interface 2.0.0", + "solana-system-program", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction", + "solana-transaction-context", + "solana-transaction-error", + "thiserror 2.0.18", +] [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.28" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] name = "memchr" -version = "2.7.4" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] [[package]] name = "merlin" @@ -753,10 +1724,55 @@ checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" dependencies = [ "byteorder", "keccak", - "rand_core", + "rand_core 0.6.4", "zeroize", ] +[[package]] +name = "num" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" +dependencies = [ + "num-bigint 0.2.6", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" +dependencies = [ + "autocfg", + "num-traits", +] + [[package]] name = "num-derive" version = "0.4.2" @@ -768,6 +1784,38 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" +dependencies = [ + "autocfg", + "num-bigint 0.2.6", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -801,9 +1849,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] name = "opaque-debug" @@ -813,9 +1861,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -823,17 +1871,23 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-link", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pastey" version = "0.2.1" @@ -846,14 +1900,33 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "percentage" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" +dependencies = [ + "num", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] [[package]] name = "polyval" @@ -862,16 +1935,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", - "cpufeatures", + "cpufeatures 0.2.17", "opaque-debug", "universal-hash", ] [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro-crate" @@ -879,7 +1955,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.8+spec-1.1.0", + "toml_edit 0.25.10+spec-1.1.0", ] [[package]] @@ -900,6 +1976,17 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "qualifier_attr" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "quote" version = "1.0.45" @@ -909,6 +1996,25 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", +] + [[package]] name = "rand" version = "0.8.5" @@ -916,8 +2022,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", ] [[package]] @@ -927,7 +2053,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", ] [[package]] @@ -936,23 +2081,41 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", ] [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.10.5" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ "aho-corasick", "memchr", @@ -962,9 +2125,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ "aho-corasick", "memchr", @@ -973,30 +2136,40 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] -name = "rustc_version" +name = "rfc6979" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" dependencies = [ - "semver", + "hmac", + "subtle", ] [[package]] -name = "rustversion" -version = "1.0.17" +name = "rustc-demangle" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" [[package]] -name = "ryu" -version = "1.0.18" +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "scopeguard" @@ -1005,14 +2178,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] -name = "semver" -version = "1.0.23" +name = "sec1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "serde" -version = "1.0.228" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ @@ -1020,13 +2207,23 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-big-array" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" +dependencies = [ + "serde", +] + [[package]] name = "serde_bytes" -version = "0.11.15" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", ] [[package]] @@ -1051,35 +2248,70 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.145" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ "itoa", "memchr", - "ryu", "serde", "serde_core", + "zmij", ] [[package]] name = "serde_spanned" -version = "0.6.6" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +dependencies = [ + "serde_core", + "serde_with_macros", +] + +[[package]] +name = "serde_with_macros" +version = "3.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +dependencies = [ + "darling 0.23.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "sha2" -version = "0.10.8" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures", - "digest", + "cpufeatures 0.2.17", + "digest 0.10.7", ] [[package]] @@ -1094,15 +2326,49 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + [[package]] name = "smallvec" -version = "1.13.2" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "solana-account" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "efc0ed36decb689413b9da5d57f2be49eea5bebb3cf7897015167b0c4336e731" +dependencies = [ + "bincode", + "serde", + "serde_bytes", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-instruction-error", + "solana-pubkey 4.1.0", + "solana-sdk-ids", + "solana-sysvar", +] [[package]] name = "solana-account-info" @@ -1110,7 +2376,9 @@ version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9cf16495d9eb53e3d04e72366a33bb1c20c24e78c171d8b8f5978357b63ae95" dependencies = [ - "solana-address 2.4.0", + "bincode", + "serde_core", + "solana-address 2.5.0", "solana-program-error", "solana-program-memory", ] @@ -1121,14 +2389,14 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2ecac8e1b7f74c2baa9e774c42817e3e75b20787134b76cc4d45e8a604488f5" dependencies = [ - "solana-address 2.4.0", + "solana-address 2.5.0", ] [[package]] name = "solana-address" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f67735365edc7fb19ed74ec950597107c8ee9cbfebac57b8868b3e78fb6df16" +checksum = "5f08236dacd0e6dc8234becef58e27c8567856644ef509d7e97957d55a91dc72" dependencies = [ "borsh", "bytemuck", @@ -1148,6 +2416,24 @@ dependencies = [ "wincode", ] +[[package]] +name = "solana-address-lookup-table-interface" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e8df0b083c10ce32490410f3795016b1b5d9b4d094658c0a5e496753645b7cd" +dependencies = [ + "bincode", + "bytemuck", + "serde", + "serde_derive", + "solana-clock", + "solana-instruction", + "solana-instruction-error", + "solana-pubkey 4.1.0", + "solana-sdk-ids", + "solana-slot-hashes", +] + [[package]] name = "solana-atomic-u64" version = "3.0.1" @@ -1157,6 +2443,54 @@ dependencies = [ "parking_lot", ] +[[package]] +name = "solana-big-mod-exp" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30c80fb6d791b3925d5ec4bf23a7c169ef5090c013059ec3ed7d0b2c04efa085" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "solana-define-syscall 3.0.0", +] + +[[package]] +name = "solana-bincode" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278a1a5bad62cd9da89ac8d4b7ec444e83caa8ae96aa656dfc27684b28d49a5d" +dependencies = [ + "bincode", + "serde_core", + "solana-instruction-error", +] + +[[package]] +name = "solana-blake3-hasher" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7116e1d942a2432ca3f514625104757ab8a56233787e95144c93950029e31176" +dependencies = [ + "blake3", + "solana-define-syscall 4.0.1", + "solana-hash 4.2.0", +] + +[[package]] +name = "solana-bn254" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62ff13a8867fcc7b0f1114764e1bf6191b4551dcaf93729ddc676cd4ec6abc9f" +dependencies = [ + "ark-bn254 0.5.0", + "ark-ec 0.5.0", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "bytemuck", + "solana-define-syscall 5.0.0", + "thiserror 2.0.18", +] + [[package]] name = "solana-borsh" version = "3.0.2" @@ -1166,6 +2500,73 @@ dependencies = [ "borsh", ] +[[package]] +name = "solana-bpf-loader-program" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe15f3c804c37fbff5971d34d81d5d2853ae2d03f11947f44f1d10c5b84c9df0" +dependencies = [ + "agave-syscalls", + "bincode", + "qualifier_attr", + "solana-account", + "solana-bincode", + "solana-clock", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-entrypoint", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-transaction-context", +] + +[[package]] +name = "solana-builtins" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d196c19ba1caf61782eba5de053061f298f36d9f2aec57073e2cf27403a926d3" +dependencies = [ + "agave-feature-set", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-hash 3.1.0", + "solana-loader-v4-program", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-program", + "solana-vote-program", + "solana-zk-elgamal-proof-program", + "solana-zk-token-proof-program", +] + +[[package]] +name = "solana-builtins-default-costs" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0da4d19885c5ee02d942a9e13354a39ef3ff591ee31d55353070c204ae7b8fed" +dependencies = [ + "agave-feature-set", + "ahash", + "log", + "solana-bpf-loader-program", + "solana-compute-budget-program", + "solana-loader-v4-program", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-program", + "solana-vote-program", +] + [[package]] name = "solana-clock" version = "3.0.1" @@ -1179,6 +2580,57 @@ dependencies = [ "solana-sysvar-id", ] +[[package]] +name = "solana-compute-budget" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98426b2f7788c089f4ab840347bff55901e65ceb5d76b850194f0802a733cd4e" +dependencies = [ + "solana-fee-structure", + "solana-program-runtime", +] + +[[package]] +name = "solana-compute-budget-instruction" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eb3ea80152fc745fa95d9cd2fc019c3591cdc7598cb4d85a6acdea7a40938f0" +dependencies = [ + "agave-feature-set", + "log", + "solana-borsh", + "solana-builtins-default-costs", + "solana-compute-budget", + "solana-compute-budget-interface", + "solana-instruction", + "solana-packet", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-transaction", + "solana-transaction-error", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-compute-budget-interface" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8292c436b269ad23cecc8b24f7da3ab07ca111661e25e00ce0e1d22771951ab9" +dependencies = [ + "borsh", + "solana-instruction", + "solana-sdk-ids", +] + +[[package]] +name = "solana-compute-budget-program" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688491544a91b94fcb17cffb5cc4dca4be93bc96460fa27325a404c24b584130" +dependencies = [ + "solana-program-runtime", +] + [[package]] name = "solana-cpi" version = "3.1.0" @@ -1244,7 +2696,7 @@ checksum = "f5e7b0ba210593ba8ddd39d6d234d81795d1671cebf3026baa10d5dc23ac42f0" dependencies = [ "serde", "serde_derive", - "solana-hash", + "solana-hash 4.2.0", "solana-sdk-ids", "solana-sdk-macro", "solana-sysvar-id", @@ -1263,15 +2715,65 @@ dependencies = [ "solana-sysvar-id", ] +[[package]] +name = "solana-epoch-stake" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "027e6d0b9e7daac5b2ac7c3f9ca1b727861121d9ef05084cf435ff736051e7c2" +dependencies = [ + "solana-define-syscall 5.0.0", + "solana-pubkey 4.1.0", +] + +[[package]] +name = "solana-example-mocks" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978855d164845c1b0235d4b4d101cadc55373fffaf0b5b6cfa2194d25b2ed658" +dependencies = [ + "serde", + "serde_derive", + "solana-address-lookup-table-interface", + "solana-clock", + "solana-hash 3.1.0", + "solana-instruction", + "solana-keccak-hasher", + "solana-message", + "solana-nonce", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-interface 2.0.0", + "thiserror 2.0.18", +] + [[package]] name = "solana-feature-gate-interface" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75ca9b5cbb6f500f7fd73db5bd95640f71a83f04d6121a0e59a43b202dca2731" dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-account", + "solana-account-info", + "solana-instruction", "solana-program-error", "solana-pubkey 4.1.0", + "solana-rent 4.1.0", "solana-sdk-ids", + "solana-system-interface 3.1.0", +] + +[[package]] +name = "solana-fee" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "487e4ba57d889e2ecf94a0cac3a3f385fe26d17425aaef3514b79975af2b5d7f" +dependencies = [ + "agave-feature-set", + "solana-fee-structure", + "solana-svm-transaction", ] [[package]] @@ -1285,17 +2787,36 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "solana-fee-structure" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2abdb1223eea8ec64136f39cb1ffcf257e00f915c957c35c0dd9e3f4e700b0" + +[[package]] +name = "solana-hash" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "337c246447142f660f778cf6cb582beba8e28deb05b3b24bfb9ffd7c562e5f41" +dependencies = [ + "solana-hash 4.2.0", +] + [[package]] name = "solana-hash" version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8064ea1d591ec791be95245058ca40f4f5345d390c200069d0f79bbf55bfae55" dependencies = [ + "borsh", "bytemuck", "bytemuck_derive", "five8", "serde", "serde_derive", + "solana-atomic-u64", + "solana-sanitize", + "wincode", ] [[package]] @@ -1305,6 +2826,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a97881335fc698deb46c6571945969aae6d93a14e2fff792a368b4fac872f116" dependencies = [ "bincode", + "borsh", "serde", "serde_derive", "solana-define-syscall 5.0.0", @@ -1319,6 +2841,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d3d048edaaeef5a3dc8c01853e585539a74417e4c2d43a9e2c161270045b838" dependencies = [ "num-traits", + "serde", + "serde_derive", "solana-program-error", ] @@ -1354,33 +2878,138 @@ dependencies = [ ] [[package]] -name = "solana-last-restart-slot" -version = "3.0.0" +name = "solana-keccak-hasher" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcda154ec827f5fc1e4da0af3417951b7e9b8157540f81f936c4a8b1156134d0" +checksum = "ed1c0d16d6fdeba12291a1f068cdf0d479d9bff1141bf44afd7aa9d485f65ef8" dependencies = [ - "serde", - "serde_derive", - "solana-sdk-ids", - "solana-sdk-macro", - "solana-sysvar-id", + "sha3", + "solana-define-syscall 4.0.1", + "solana-hash 4.2.0", ] [[package]] -name = "solana-loader-v3-interface" -version = "6.1.0" +name = "solana-keypair" +version = "3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee44c9b1328c5c712c68966fb8de07b47f3e7bac006e74ddd1bb053d3e46e5d" +checksum = "263d614c12aa267a3278703175fd6440552ca61bc960b5a02a4482720c53438b" dependencies = [ - "serde", - "serde_bytes", - "serde_derive", - "solana-instruction", - "solana-pubkey 3.0.0", - "solana-sdk-ids", - "solana-system-interface", -] - + "ed25519-dalek", + "five8", + "five8_core", + "rand 0.9.2", + "solana-address 2.5.0", + "solana-seed-phrase", + "solana-signature", + "solana-signer", +] + +[[package]] +name = "solana-kite" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92c6774af93647a15b51e266bc76f558fba11fbfbe30131b50664e665a8fea55" +dependencies = [ + "litesvm", + "solana-account", + "solana-instruction", + "solana-keypair", + "solana-message", + "solana-program", + "solana-pubkey 3.0.0", + "solana-signer", + "solana-transaction", + "spl-associated-token-account", + "spl-token", +] + +[[package]] +name = "solana-last-restart-slot" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcda154ec827f5fc1e4da0af3417951b7e9b8157540f81f936c4a8b1156134d0" +dependencies = [ + "serde", + "serde_derive", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-sysvar-id", +] + +[[package]] +name = "solana-loader-v3-interface" +version = "6.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dee44c9b1328c5c712c68966fb8de07b47f3e7bac006e74ddd1bb053d3e46e5d" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-loader-v4-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4c948b33ff81fa89699911b207059e493defdba9647eaf18f23abdf3674e0fb" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-system-interface 2.0.0", +] + +[[package]] +name = "solana-loader-v4-program" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b79ecebf56ff8acf46d5c0d77a11e1cb9a0f8eeb6dd1a69d739f3bf8ea8570e" +dependencies = [ + "log", + "solana-account", + "solana-bincode", + "solana-bpf-loader-program", + "solana-instruction", + "solana-loader-v3-interface", + "solana-loader-v4-interface", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-type-overrides", + "solana-transaction-context", +] + +[[package]] +name = "solana-message" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0448b1fd891c5f46491e5dc7d9986385ba3c852c340db2911dd29faa01d2b08d" +dependencies = [ + "bincode", + "blake3", + "lazy_static", + "serde", + "serde_derive", + "solana-address 2.5.0", + "solana-hash 4.2.0", + "solana-instruction", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-transaction-error", +] + [[package]] name = "solana-msg" version = "3.1.0" @@ -1390,15 +3019,126 @@ dependencies = [ "solana-define-syscall 5.0.0", ] +[[package]] +name = "solana-native-token" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae8dd4c280dca9d046139eb5b7a5ac9ad10403fbd64964c7d7571214950d758f" + +[[package]] +name = "solana-nonce" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc469152a63284ef959b80c59cda015262a021da55d3b8fe42171d89c4b64f8" +dependencies = [ + "serde", + "serde_derive", + "solana-fee-calculator", + "solana-hash 4.2.0", + "solana-pubkey 4.1.0", + "solana-sha256-hasher", +] + +[[package]] +name = "solana-nonce-account" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "805fd25b29e5a1a0e6c3dd6320c9da80f275fbe4ff6e392617c303a2085c435e" +dependencies = [ + "solana-account", + "solana-hash 3.1.0", + "solana-nonce", + "solana-sdk-ids", +] + [[package]] name = "solana-nullable" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90429a75d69fdcb31952c3dea79f5f3c8157cfe88221e066103c9c237876073" +checksum = "da028344c595c7416769ff648d206de7962571291a4cea24c38a60b6f40d53bb" dependencies = [ "bytemuck", ] +[[package]] +name = "solana-packet" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edf2f25743c95229ac0fdc32f8f5893ef738dbf332c669e9861d33ddb0f469d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "solana-poseidon" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d213ef5dc664927b43725e9aae1f0848e06d556e7a5f2857f37af9dbf9856c" +dependencies = [ + "ark-bn254 0.4.0", + "ark-bn254 0.5.0", + "light-poseidon 0.2.0", + "light-poseidon 0.4.0", + "solana-define-syscall 3.0.0", + "thiserror 2.0.18", +] + +[[package]] +name = "solana-precompile-error" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cafcd950de74c6c39d55dc8ca108bbb007799842ab370ef26cf45a34453c31e1" +dependencies = [ + "num-traits", +] + +[[package]] +name = "solana-program" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91b12305dd81045d705f427acd0435a2e46444b65367d7179d7bdcfc3bc5f5eb" +dependencies = [ + "memoffset", + "solana-account-info", + "solana-big-mod-exp", + "solana-blake3-hasher", + "solana-borsh", + "solana-clock", + "solana-cpi", + "solana-define-syscall 3.0.0", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-epoch-stake", + "solana-example-mocks", + "solana-fee-calculator", + "solana-hash 3.1.0", + "solana-instruction", + "solana-instruction-error", + "solana-instructions-sysvar", + "solana-keccak-hasher", + "solana-last-restart-slot", + "solana-msg", + "solana-native-token", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-secp256k1-recover", + "solana-serde-varint", + "solana-serialize-utils", + "solana-sha256-hasher", + "solana-short-vec", + "solana-slot-hashes", + "solana-slot-history", + "solana-stable-layout", + "solana-sysvar", + "solana-sysvar-id", +] + [[package]] name = "solana-program-entrypoint" version = "3.1.1" @@ -1418,6 +3158,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f04fa578707b3612b095f0c8e19b66a1233f7c42ca8082fcb3b745afcc0add6" dependencies = [ "borsh", + "serde", + "serde_derive", ] [[package]] @@ -1444,6 +3186,51 @@ dependencies = [ "solana-program-error", ] +[[package]] +name = "solana-program-runtime" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527e07453b083fa814e35bb56b8aaddb34d20eeeadeb0d13c115780365355c88" +dependencies = [ + "base64 0.22.1", + "bincode", + "itertools 0.12.1", + "log", + "percentage", + "rand 0.8.5", + "serde", + "solana-account", + "solana-account-info", + "solana-clock", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-structure", + "solana-hash 3.1.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-loader-v3-interface", + "solana-program-entrypoint", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids", + "solana-slot-hashes", + "solana-stable-layout", + "solana-stake-interface", + "solana-svm-callback", + "solana-svm-feature-set", + "solana-svm-log-collector", + "solana-svm-measure", + "solana-svm-timings", + "solana-svm-transaction", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", + "solana-sysvar", + "solana-sysvar-id", + "solana-transaction-context", + "thiserror 2.0.18", +] + [[package]] name = "solana-pubkey" version = "3.0.0" @@ -1459,7 +3246,7 @@ version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b06bd918d60111ee1f97de817113e2040ca0cedb740099ee8d646233f6b906c" dependencies = [ - "solana-address 2.4.0", + "solana-address 2.5.0", ] [[package]] @@ -1475,19 +3262,45 @@ dependencies = [ "solana-sysvar-id", ] +[[package]] +name = "solana-rent" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1771d726d4854f1818c750e14aff40b19d84720d0b1b6d53e50e8f16cb6bd62" +dependencies = [ + "solana-sdk-macro", +] + [[package]] name = "solana-sanitize" version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcf09694a0fc14e5ffb18f9b7b7c0f15ecb6eac5b5610bf76a1853459d19daf9" +[[package]] +name = "solana-sbpf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15b079e08471a9dbfe1e48b2c7439c85aa2a055cbd54eddd8bd257b0a7dbb29" +dependencies = [ + "byteorder", + "combine", + "hash32", + "libc", + "log", + "rand 0.8.5", + "rustc-demangle", + "thiserror 2.0.18", + "winapi", +] + [[package]] name = "solana-sdk-ids" version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "def234c1956ff616d46c9dd953f251fa7096ddbaa6d52b165218de97882b7280" dependencies = [ - "solana-address 2.4.0", + "solana-address 2.5.0", ] [[package]] @@ -1502,6 +3315,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "solana-secp256k1-recover" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c5f18893d62e6c73117dcba48f8f5e3266d90e5ec3d0a0a90f9785adac36c1" +dependencies = [ + "k256", + "solana-define-syscall 5.0.0", + "thiserror 2.0.18", +] + [[package]] name = "solana-seed-derivable" version = "3.0.0" @@ -1519,7 +3343,16 @@ checksum = "dc905b200a95f2ea9146e43f2a7181e3aeb55de6bc12afb36462d00a3c7310de" dependencies = [ "hmac", "pbkdf2", - "sha2", + "sha2 0.10.9", +] + +[[package]] +name = "solana-serde-varint" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "950e5b83e839dc0f92c66afc124bb8f40e89bc90f0579e8ec5499296d27f54e3" +dependencies = [ + "serde", ] [[package]] @@ -1539,9 +3372,18 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db7dc3011ea4c0334aaaa7e7128cb390ecf546b28d412e9bf2064680f57f588f" dependencies = [ - "sha2", + "sha2 0.10.9", "solana-define-syscall 4.0.1", - "solana-hash", + "solana-hash 4.2.0", +] + +[[package]] +name = "solana-short-vec" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3bd991c2cc415291c86bb0b6b4d53e93d13bb40344e4c5a2884e0e4f5fa93f" +dependencies = [ + "serde_core", ] [[package]] @@ -1550,8 +3392,13 @@ version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "132a93134f1262aa832f1849b83bec6c9945669b866da18661a427943b9e801e" dependencies = [ + "ed25519-dalek", "five8", + "serde", + "serde-big-array", + "serde_derive", "solana-sanitize", + "wincode", ] [[package]] @@ -1573,7 +3420,7 @@ checksum = "2585f70191623887329dfb5078da3a00e15e3980ea67f42c2e10b07028419f43" dependencies = [ "serde", "serde_derive", - "solana-hash", + "solana-hash 4.2.0", "solana-sdk-ids", "solana-sysvar-id", ] @@ -1615,86 +3462,313 @@ dependencies = [ "solana-instruction", "solana-program-error", "solana-pubkey 3.0.0", - "solana-system-interface", + "solana-system-interface 2.0.0", + "solana-sysvar", + "solana-sysvar-id", +] + +[[package]] +name = "solana-svm-callback" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c895f1add5c9ceff634f485554ddbcbceb88cba71b2f753c4caaba461690d2c6" +dependencies = [ + "solana-account", + "solana-clock", + "solana-precompile-error", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-svm-feature-set" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5addc8fc7beb262aed2df0c34322a04a1b07b82d35fac0a34cd01f5263f7e971" + +[[package]] +name = "solana-svm-log-collector" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e985304ae8370c2b14c5c31c3e4dfdd18bc38ba806ee341655119430116c1f0" +dependencies = [ + "log", +] + +[[package]] +name = "solana-svm-measure" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bc239ef12213c45a4077799a154f340b290938973ad11dc4aaedee8fe39319" + +[[package]] +name = "solana-svm-timings" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df7bc8099ec662531e751607c096a2b336502b592ddd2cf584ec8312fd499fa8" +dependencies = [ + "eager", + "enum-iterator", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-svm-transaction" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29a9d25c729620fc70664e17d787a7804e52903da6fc94810e5dac7ca3217064" +dependencies = [ + "solana-hash 3.1.0", + "solana-message", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-signature", + "solana-transaction", +] + +[[package]] +name = "solana-svm-type-overrides" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5093201eaac4a41edcaab9fc0060712d5bce2d2a0ca6134d18e9bcac2b3739bc" +dependencies = [ + "rand 0.8.5", +] + +[[package]] +name = "solana-system-interface" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey 3.0.0", +] + +[[package]] +name = "solana-system-interface" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a95a6f2e23ed861d6444ad4a6d6896c418d7d101b960787e65a8e33157cee81b" +dependencies = [ + "num-traits", + "serde", + "serde_derive", + "solana-address 2.5.0", + "solana-instruction", + "solana-msg", + "solana-program-error", +] + +[[package]] +name = "solana-system-program" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab198a979e1bfa90e5a481fd3cec77326660e182668a248020cbd427c0ea1b5f" +dependencies = [ + "bincode", + "log", + "serde", + "solana-account", + "solana-bincode", + "solana-fee-calculator", + "solana-instruction", + "solana-nonce", + "solana-nonce-account", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-svm-type-overrides", + "solana-system-interface 2.0.0", "solana-sysvar", + "solana-transaction-context", +] + +[[package]] +name = "solana-sysvar" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +dependencies = [ + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "lazy_static", + "serde", + "serde_derive", + "solana-account-info", + "solana-clock", + "solana-define-syscall 4.0.1", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-fee-calculator", + "solana-hash 4.2.0", + "solana-instruction", + "solana-last-restart-slot", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-pubkey 4.1.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-slot-hashes", + "solana-slot-history", "solana-sysvar-id", ] [[package]] -name = "solana-system-interface" -version = "2.0.0" +name = "solana-sysvar-id" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" +dependencies = [ + "solana-address 2.5.0", + "solana-sdk-ids", +] + +[[package]] +name = "solana-transaction" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96697cff5075a028265324255efed226099f6d761ca67342b230d09f72cc48d2" +dependencies = [ + "bincode", + "serde", + "serde_derive", + "solana-address 2.5.0", + "solana-hash 4.2.0", + "solana-instruction", + "solana-instruction-error", + "solana-message", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-signature", + "solana-signer", + "solana-transaction-error", +] + +[[package]] +name = "solana-transaction-context" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15c4936df4b86a943ea6d552ca2c64fcc0d1a06dee2193cbf463eaedc372736d" +dependencies = [ + "bincode", + "serde", + "solana-account", + "solana-instruction", + "solana-instructions-sysvar", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sbpf", + "solana-sdk-ids", +] + +[[package]] +name = "solana-transaction-error" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8396904805b0b385b9de115a652fe80fd01e5b98ce0513f4fcd8184ada9bb792" +dependencies = [ + "serde", + "serde_derive", + "solana-instruction-error", + "solana-sanitize", +] + +[[package]] +name = "solana-vote-interface" +version = "4.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1790547bfc3061f1ee68ea9d8dc6c973c02a163697b24263a8e9f2e6d4afa2" +checksum = "db6e123e16bfdd7a81d71b4c4699e0b29580b619f4cd2ef5b6aae1eb85e8979f" dependencies = [ + "bincode", + "cfg_eval", + "num-derive", "num-traits", "serde", "serde_derive", + "serde_with", + "solana-clock", + "solana-hash 3.1.0", "solana-instruction", - "solana-msg", - "solana-program-error", + "solana-instruction-error", "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-serde-varint", + "solana-serialize-utils", + "solana-short-vec", + "solana-system-interface 2.0.0", ] [[package]] -name = "solana-sysvar" -version = "3.1.1" +name = "solana-vote-program" +version = "3.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6690d3dd88f15c21edff68eb391ef8800df7a1f5cec84ee3e8d1abf05affdf74" +checksum = "55e2eab8557ff61ae2f58ebdb63aabf3579e04eb3dd07e8b4c4102704a137bae" dependencies = [ - "base64 0.22.1", + "agave-feature-set", "bincode", - "lazy_static", + "log", + "num-derive", + "num-traits", "serde", - "serde_derive", - "solana-account-info", + "solana-account", + "solana-bincode", "solana-clock", - "solana-define-syscall 4.0.1", - "solana-epoch-rewards", "solana-epoch-schedule", - "solana-fee-calculator", - "solana-hash", + "solana-hash 3.1.0", "solana-instruction", - "solana-last-restart-slot", - "solana-program-entrypoint", - "solana-program-error", - "solana-program-memory", - "solana-pubkey 4.1.0", - "solana-rent", + "solana-keypair", + "solana-packet", + "solana-program-runtime", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", "solana-sdk-ids", - "solana-sdk-macro", + "solana-signer", "solana-slot-hashes", - "solana-slot-history", - "solana-sysvar-id", -] - -[[package]] -name = "solana-sysvar-id" -version = "3.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17358d1e9a13e5b9c2264d301102126cf11a47fd394cdf3dec174fe7bc96e1de" -dependencies = [ - "solana-address 2.4.0", - "solana-sdk-ids", + "solana-transaction", + "solana-transaction-context", + "solana-vote-interface", + "thiserror 2.0.18", ] [[package]] -name = "solana-transaction-error" -version = "3.1.0" +name = "solana-zero-copy" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8396904805b0b385b9de115a652fe80fd01e5b98ce0513f4fcd8184ada9bb792" +checksum = "94f52dd8f733a13f6a18e55de83cf97c4c3f5fdf27ea3830bcff0b35313efcc2" dependencies = [ - "solana-instruction-error", - "solana-sanitize", + "borsh", + "bytemuck", + "bytemuck_derive", ] [[package]] -name = "solana-zero-copy" -version = "1.0.0" +name = "solana-zk-elgamal-proof-program" +version = "3.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f52dd8f733a13f6a18e55de83cf97c4c3f5fdf27ea3830bcff0b35313efcc2" +checksum = "98ebd77845de672972a32c357d7a68f2cc16c1037cc0ebf550ebba167827c10c" dependencies = [ + "agave-feature-set", "bytemuck", - "bytemuck_derive", + "num-derive", + "num-traits", + "solana-instruction", + "solana-program-runtime", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-zk-sdk", ] [[package]] @@ -1709,13 +3783,13 @@ dependencies = [ "bytemuck", "bytemuck_derive", "curve25519-dalek", - "getrandom", - "itertools", + "getrandom 0.2.17", + "itertools 0.12.1", "js-sys", "merlin", "num-derive", "num-traits", - "rand", + "rand 0.8.5", "serde", "serde_derive", "serde_json", @@ -1734,12 +3808,100 @@ dependencies = [ "zeroize", ] +[[package]] +name = "solana-zk-token-proof-program" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c13a05831857b4e3320d98cdd77a3f7b645566508d8f66a07c9168ac1e8bc68" +dependencies = [ + "agave-feature-set", + "bytemuck", + "num-derive", + "num-traits", + "solana-instruction", + "solana-program-runtime", + "solana-sdk-ids", + "solana-svm-log-collector", + "solana-zk-token-sdk", +] + +[[package]] +name = "solana-zk-token-sdk" +version = "3.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd8dab3f2df045b7bec3cb3e1cff0889ec46d776191c3a2af19a77ddd3c4c6fc" +dependencies = [ + "aes-gcm-siv", + "base64 0.22.1", + "bincode", + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "itertools 0.12.1", + "merlin", + "num-derive", + "num-traits", + "rand 0.8.5", + "serde", + "serde_json", + "sha3", + "solana-curve25519", + "solana-derivation-path", + "solana-instruction", + "solana-pubkey 3.0.0", + "solana-sdk-ids", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", + "subtle", + "thiserror 2.0.18", + "zeroize", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "spl-associated-token-account" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0242277e290c023de8826f504abcf9206b3cd4e18d9ace4ec59a698b2828e88b" +dependencies = [ + "borsh", + "num-derive", + "num-traits", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-system-interface 2.0.0", + "solana-sysvar", + "spl-associated-token-account-interface", + "spl-token-2022-interface", + "spl-token-interface", + "thiserror 2.0.18", +] + [[package]] name = "spl-associated-token-account-interface" version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6433917b60441d68d99a17e121d9db0ea15a9a69c0e5afa34649cf5ba12612f" dependencies = [ + "borsh", "solana-instruction", "solana-pubkey 3.0.0", ] @@ -1769,22 +3931,22 @@ dependencies = [ [[package]] name = "spl-discriminator-syn" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" +checksum = "5d1dbc82ab91422345b6df40a79e2b78c7bce1ebb366da323572dd60b7076b67" dependencies = [ "proc-macro2", "quote", - "sha2", + "sha2 0.10.9", "syn 2.0.117", "thiserror 1.0.69", ] [[package]] name = "spl-pod" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f3df240f67bea453d4bc5749761e45436d14b9457ed667e0300555d5c271f3" +checksum = "2f9c6e142cdf1e7e77f480053ec9f0ce989890768ddf91f619b50f39d1b456f5" dependencies = [ "borsh", "bytemuck", @@ -1795,10 +3957,39 @@ dependencies = [ "solana-program-error", "solana-program-option", "solana-pubkey 3.0.0", + "solana-zero-copy", "solana-zk-sdk", "thiserror 2.0.18", ] +[[package]] +name = "spl-token" +version = "9.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "878b0183d51fcd8a53e1604f4c13321894cf53227e6773c529b0d03d499a8dfd" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive", + "num-traits", + "num_enum", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey 3.0.0", + "solana-rent 3.1.0", + "solana-sdk-ids", + "solana-sysvar", + "spl-token-interface", + "thiserror 2.0.18", +] + [[package]] name = "spl-token-2022-interface" version = "2.1.0" @@ -1868,7 +4059,7 @@ dependencies = [ "num-derive", "num-traits", "num_enum", - "solana-address 2.4.0", + "solana-address 2.5.0", "solana-instruction", "solana-nullable", "solana-program-error", @@ -2009,9 +4200,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.6.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c55115c6fbe2d2bef26eb09ad74bde02d8255476fc0c7b515ef09fbb35742d82" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ "tinyvec_macros", ] @@ -2024,85 +4215,92 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "toml" -version = "0.8.14" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f49eb2ab21d2f26bd6db7bf383edc527a7ebaee412d17af4d40fdccd442f335" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", - "toml_datetime 0.6.6", - "toml_edit 0.22.14", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", ] [[package]] name = "toml_datetime" -version = "0.6.6" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_datetime" -version = "1.1.0+spec-1.1.0" +version = "1.1.1+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97251a7c317e03ad83774a8752a7e81fb6067740609f75ea2b585b569a59198f" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" dependencies = [ "serde_core", ] [[package]] name = "toml_edit" -version = "0.22.14" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f21c7aaf97f1bd9ca9d4f9e73b0a6c74bd5afef56f2bc931943a6e1c37e04e38" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", "serde", "serde_spanned", - "toml_datetime 0.6.6", - "winnow 0.6.13", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", ] [[package]] name = "toml_edit" -version = "0.25.8+spec-1.1.0" +version = "0.25.10+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16bff38f1d86c47f9ff0647e6838d7bb362522bdf44006c7068c2b1e606f1f3c" +checksum = "a82418ca169e235e6c399a84e395ab6debeb3bc90edc959bf0f48647c6a32d1b" dependencies = [ "indexmap", - "toml_datetime 1.1.0+spec-1.1.0", + "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 1.0.0", + "winnow 1.0.1", ] [[package]] name = "toml_parser" -version = "1.1.0+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2334f11ee363607eb04df9b8fc8a13ca1715a72ba8662a26ac285c98aabb4011" +checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.0", + "winnow 1.0.1", ] +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + [[package]] name = "typenum" -version = "1.17.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "unicode-segmentation" -version = "1.11.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" +checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" [[package]] name = "universal-hash" @@ -2110,10 +4308,19 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ - "crypto-common", + "crypto-common 0.1.7", "subtle", ] +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +dependencies = [ + "void", +] + [[package]] name = "uriparse" version = "0.6.4" @@ -2126,48 +4333,55 @@ dependencies = [ [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] -name = "wasm-bindgen" -version = "0.2.104" +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", + "wit-bindgen", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.104" +name = "wasm-bindgen" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" +checksum = "0551fc1bb415591e3372d0bc4780db7e587d84e2a7e79da121051c5c4b89d0b0" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.117", + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.104" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" +checksum = "7fbdf9a35adf44786aecd5ff89b4563a90325f9da0923236f6104e603c7e86be" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2175,31 +4389,53 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.104" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" +checksum = "dca9693ef2bab6d4e6707234500350d8dad079eb508dca05530c85dc3a529ff2" dependencies = [ + "bumpalo", "proc-macro2", "quote", "syn 2.0.117", - "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.104" +version = "0.2.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" +checksum = "39129a682a6d2d841b6c429d0c51e5cb0ed1a03829d8b3d1e69a011e62cb3d3b" dependencies = [ "unicode-ident", ] +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + [[package]] name = "wincode" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc91ddd8c932a38bbec58ed536d9e93ce9cd01b6af9b6de3c501132cf98ddec6" +checksum = "657690780ce23e6f66576a782ffd88eb353512381817029cc1d7a99154bb6d1f" dependencies = [ "pastey", "proc-macro2", @@ -2214,92 +4450,60 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fca057fc9a13dd19cdb64ef558635d43c42667c0afa1ae7915ea1fa66993fd1a" dependencies = [ - "darling", + "darling 0.21.3", "proc-macro2", "quote", "syn 2.0.117", ] [[package]] -name = "windows-targets" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" -dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.5" +name = "windows-link" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] -name = "windows_x86_64_gnu" -version = "0.52.5" +name = "winnow" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.5" +name = "winnow" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +dependencies = [ + "memchr", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.52.5" +name = "wit-bindgen" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" +checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" [[package]] -name = "winnow" -version = "0.6.13" +name = "zerocopy" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" dependencies = [ - "memchr", + "zerocopy-derive", ] [[package]] -name = "winnow" -version = "1.0.0" +name = "zerocopy-derive" +version = "0.8.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a90e88e4667264a994d34e6d1ab2d26d398dcdca8b7f52bec8668957517fc7d8" +checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ - "memchr", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -2313,11 +4517,17 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.4.2" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", "syn 2.0.117", ] + +[[package]] +name = "zmij" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" diff --git a/tokens/token-fundraiser/anchor/package.json b/tokens/token-fundraiser/anchor/package.json index ec93e2a0e..78c8eba57 100644 --- a/tokens/token-fundraiser/anchor/package.json +++ b/tokens/token-fundraiser/anchor/package.json @@ -1,23 +1,23 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.4.6" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "anchor-bankrun": "^0.4.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.4.6" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "anchor-bankrun": "^0.4.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-fundraiser/anchor/pnpm-lock.yaml b/tokens/token-fundraiser/anchor/pnpm-lock.yaml index 541bb9af2..4ff72e6de 100644 --- a/tokens/token-fundraiser/anchor/pnpm-lock.yaml +++ b/tokens/token-fundraiser/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.4.6 version: 0.4.6(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -48,18 +48,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.28.4': @@ -854,16 +854,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -881,7 +881,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.28.4': {} diff --git a/tokens/token-fundraiser/anchor/programs/fundraiser/Cargo.toml b/tokens/token-fundraiser/anchor/programs/fundraiser/Cargo.toml index 092f60dcf..de7b3bf04 100644 --- a/tokens/token-fundraiser/anchor/programs/fundraiser/Cargo.toml +++ b/tokens/token-fundraiser/anchor/programs/fundraiser/Cargo.toml @@ -20,8 +20,15 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = "1.0.0-rc.5" # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = "1.0.0" + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-fundraiser/anchor/programs/fundraiser/src/lib.rs b/tokens/token-fundraiser/anchor/programs/fundraiser/src/lib.rs index 12d34638f..8f171527a 100644 --- a/tokens/token-fundraiser/anchor/programs/fundraiser/src/lib.rs +++ b/tokens/token-fundraiser/anchor/programs/fundraiser/src/lib.rs @@ -1,6 +1,6 @@ use anchor_lang::prelude::*; -declare_id!("Eoiuq1dXvHxh6dLx3wh9gj8kSAUpga11krTrbfF5XYsC"); +declare_id!("EuqudshRf8VRskatC6U3txgivHmtCkY5d1qsK5B3VAio"); mod constants; mod error; diff --git a/tokens/token-fundraiser/anchor/programs/fundraiser/tests/test_fundraiser.rs b/tokens/token-fundraiser/anchor/programs/fundraiser/tests/test_fundraiser.rs new file mode 100644 index 000000000..c17869dee --- /dev/null +++ b/tokens/token-fundraiser/anchor/programs/fundraiser/tests/test_fundraiser.rs @@ -0,0 +1,424 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = fundraiser::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/fundraiser.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + (svm, program_id, payer) +} + +struct FundraiserSetup { + svm: LiteSVM, + program_id: Pubkey, + payer: Keypair, + maker: Keypair, + mint: Pubkey, + fundraiser_pda: Pubkey, + vault: Pubkey, +} + +fn full_setup() -> FundraiserSetup { + let (mut svm, program_id, payer) = setup(); + + let maker = create_wallet(&mut svm, 10_000_000_000).unwrap(); + + // Create mint (6 decimals) — payer is mint authority + let mint = create_token_mint(&mut svm, &payer, 6, None).unwrap(); + + // Derive the fundraiser PDA + let (fundraiser_pda, _bump) = Pubkey::find_program_address( + &[b"fundraiser", maker.pubkey().as_ref()], + &program_id, + ); + + // Vault is the ATA of the fundraiser PDA for the mint + let vault = derive_ata(&fundraiser_pda, &mint); + + FundraiserSetup { + svm, + program_id, + payer, + maker, + mint, + fundraiser_pda, + vault, + } +} + +#[test] +fn test_initialize_fundraiser() { + let mut fs = full_setup(); + + let amount_to_raise: u64 = 30_000_000; + let duration: u16 = 0; + + let init_ix = Instruction::new_with_bytes( + fs.program_id, + &fundraiser::instruction::Initialize { + amount: amount_to_raise, + duration, + } + .data(), + fundraiser::accounts::Initialize { + maker: fs.maker.pubkey(), + mint_to_raise: fs.mint, + fundraiser: fs.fundraiser_pda, + vault: fs.vault, + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut fs.svm, + vec![init_ix], + &[&fs.maker], + &fs.maker.pubkey(), + ) + .unwrap(); + + // Verify fundraiser account exists + let fundraiser_data = fs + .svm + .get_account(&fs.fundraiser_pda) + .expect("Fundraiser account should exist"); + assert!(!fundraiser_data.data.is_empty()); + + // Verify vault exists with zero balance + assert_eq!(get_token_account_balance(&fs.svm, &fs.vault).unwrap(), 0); +} + +#[test] +fn test_contribute_and_refund() { + let mut fs = full_setup(); + + let amount_to_raise: u64 = 30_000_000; + let duration: u16 = 0; + + // Initialize fundraiser + let init_ix = Instruction::new_with_bytes( + fs.program_id, + &fundraiser::instruction::Initialize { + amount: amount_to_raise, + duration, + } + .data(), + fundraiser::accounts::Initialize { + maker: fs.maker.pubkey(), + mint_to_raise: fs.mint, + fundraiser: fs.fundraiser_pda, + vault: fs.vault, + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut fs.svm, + vec![init_ix], + &[&fs.maker], + &fs.maker.pubkey(), + ) + .unwrap(); + + // Setup contributor using Kite + let contributor = create_wallet(&mut fs.svm, 10_000_000_000).unwrap(); + + let contributor_ata = + create_associated_token_account(&mut fs.svm, &contributor.pubkey(), &fs.mint, &fs.payer) + .unwrap(); + + let mint_amount: u64 = 10_000_000; + mint_tokens_to_token_account(&mut fs.svm, &fs.mint, &contributor_ata, mint_amount, &fs.payer) + .unwrap(); + + // Derive contributor account PDA + let (contributor_account_pda, _bump) = Pubkey::find_program_address( + &[ + b"contributor", + fs.fundraiser_pda.as_ref(), + contributor.pubkey().as_ref(), + ], + &fs.program_id, + ); + + // Contribute 1_000_000 + let contribute_amount: u64 = 1_000_000; + let contribute_ix = Instruction::new_with_bytes( + fs.program_id, + &fundraiser::instruction::Contribute { + amount: contribute_amount, + } + .data(), + fundraiser::accounts::Contribute { + contributor: contributor.pubkey(), + mint_to_raise: fs.mint, + fundraiser: fs.fundraiser_pda, + contributor_account: contributor_account_pda, + contributor_ata, + vault: fs.vault, + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut fs.svm, + vec![contribute_ix], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + // Verify vault balance + assert_eq!( + get_token_account_balance(&fs.svm, &fs.vault).unwrap(), + contribute_amount + ); + + // Expire blockhash to avoid AlreadyProcessed error (same accounts, same amount = same tx hash) + fs.svm.expire_blockhash(); + + // Contribute again + let contribute_ix2 = Instruction::new_with_bytes( + fs.program_id, + &fundraiser::instruction::Contribute { + amount: contribute_amount, + } + .data(), + fundraiser::accounts::Contribute { + contributor: contributor.pubkey(), + mint_to_raise: fs.mint, + fundraiser: fs.fundraiser_pda, + contributor_account: contributor_account_pda, + contributor_ata, + vault: fs.vault, + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut fs.svm, + vec![contribute_ix2], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + // Verify vault balance is now 2_000_000 + assert_eq!( + get_token_account_balance(&fs.svm, &fs.vault).unwrap(), + contribute_amount * 2 + ); + + fs.svm.expire_blockhash(); + + // Refund + let refund_ix = Instruction::new_with_bytes( + fs.program_id, + &fundraiser::instruction::Refund {}.data(), + fundraiser::accounts::Refund { + contributor: contributor.pubkey(), + maker: fs.maker.pubkey(), + mint_to_raise: fs.mint, + fundraiser: fs.fundraiser_pda, + contributor_account: contributor_account_pda, + contributor_ata, + vault: fs.vault, + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut fs.svm, + vec![refund_ix], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + // Verify vault is empty after refund + assert_eq!(get_token_account_balance(&fs.svm, &fs.vault).unwrap(), 0); + + // Verify contributor got tokens back + assert_eq!( + get_token_account_balance(&fs.svm, &contributor_ata).unwrap(), + mint_amount + ); + + // Contributor account PDA should be closed + assert!( + fs.svm.get_account(&contributor_account_pda).is_none(), + "Contributor account should be closed after refund" + ); +} + +#[test] +fn test_check_contributions_success() { + let mut fs = full_setup(); + + let amount_to_raise: u64 = 1_000; + let duration: u16 = 0; + + // Initialize fundraiser + let init_ix = Instruction::new_with_bytes( + fs.program_id, + &fundraiser::instruction::Initialize { + amount: amount_to_raise, + duration, + } + .data(), + fundraiser::accounts::Initialize { + maker: fs.maker.pubkey(), + mint_to_raise: fs.mint, + fundraiser: fs.fundraiser_pda, + vault: fs.vault, + system_program: system_program::id(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut fs.svm, + vec![init_ix], + &[&fs.maker], + &fs.maker.pubkey(), + ) + .unwrap(); + + // Need 10 contributors each contributing 100 (10% of 1000) to reach goal + for _ in 0..10 { + let contributor = create_wallet(&mut fs.svm, 10_000_000_000).unwrap(); + + let contributor_ata = create_associated_token_account( + &mut fs.svm, + &contributor.pubkey(), + &fs.mint, + &fs.payer, + ) + .unwrap(); + + mint_tokens_to_token_account(&mut fs.svm, &fs.mint, &contributor_ata, 10_000, &fs.payer) + .unwrap(); + + let (contributor_pda, _) = Pubkey::find_program_address( + &[ + b"contributor", + fs.fundraiser_pda.as_ref(), + contributor.pubkey().as_ref(), + ], + &fs.program_id, + ); + + let contribute_ix = Instruction::new_with_bytes( + fs.program_id, + &fundraiser::instruction::Contribute { amount: 100 }.data(), + fundraiser::accounts::Contribute { + contributor: contributor.pubkey(), + mint_to_raise: fs.mint, + fundraiser: fs.fundraiser_pda, + contributor_account: contributor_pda, + contributor_ata, + vault: fs.vault, + token_program: token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut fs.svm, + vec![contribute_ix], + &[&contributor], + &contributor.pubkey(), + ) + .unwrap(); + + // Check if we've hit the goal + let current = get_token_account_balance(&fs.svm, &fs.vault).unwrap(); + if current >= amount_to_raise { + break; + } + } + + // Verify vault has enough + assert!(get_token_account_balance(&fs.svm, &fs.vault).unwrap() >= amount_to_raise); + + // Check contributions (maker claims the funds) + let maker_ata = derive_ata(&fs.maker.pubkey(), &fs.mint); + + let check_ix = Instruction::new_with_bytes( + fs.program_id, + &fundraiser::instruction::CheckContributions {}.data(), + fundraiser::accounts::CheckContributions { + maker: fs.maker.pubkey(), + mint_to_raise: fs.mint, + fundraiser: fs.fundraiser_pda, + vault: fs.vault, + maker_ata, + token_program: token_program_id(), + system_program: system_program::id(), + associated_token_program: ata_program_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut fs.svm, + vec![check_ix], + &[&fs.maker], + &fs.maker.pubkey(), + ) + .unwrap(); + + // Verify maker received the funds + assert!( + get_token_account_balance(&fs.svm, &maker_ata).unwrap() >= amount_to_raise + ); + + // Fundraiser account should be closed + assert!( + fs.svm.get_account(&fs.fundraiser_pda).is_none(), + "Fundraiser account should be closed after check_contributions" + ); +} diff --git a/tokens/token-fundraiser/anchor/tests/bankrun.test.ts b/tokens/token-fundraiser/anchor/tests/bankrun.test.ts index 86baeb62d..ce11539aa 100644 --- a/tokens/token-fundraiser/anchor/tests/bankrun.test.ts +++ b/tokens/token-fundraiser/anchor/tests/bankrun.test.ts @@ -2,27 +2,23 @@ import { describe, it } from "node:test"; import * as anchor from "@anchor-lang/core"; import { ASSOCIATED_TOKEN_PROGRAM_ID, - TOKEN_PROGRAM_ID, createMint, getAssociatedTokenAddressSync, getOrCreateAssociatedTokenAccount, mintTo, + TOKEN_PROGRAM_ID, } from "@solana/spl-token"; import { PublicKey } from "@solana/web3.js"; import { BankrunProvider } from "anchor-bankrun"; import BN from "bn.js"; import { startAnchor } from "solana-bankrun"; +import IDL from "../target/idl/fundraiser.json"; import type { Fundraiser } from "../target/types/fundraiser"; -import IDL from "../target/idl/fundraiser.json"; const PROGRAM_ID = new PublicKey(IDL.address); describe("fundraiser bankrun", async () => { - const context = await startAnchor( - "", - [{ name: "fundraiser", programId: PROGRAM_ID }], - [] - ); + const context = await startAnchor("", [{ name: "fundraiser", programId: PROGRAM_ID }], []); const provider = new BankrunProvider(context); anchor.setProvider(provider); const wallet = provider.wallet as anchor.Wallet; @@ -38,16 +34,12 @@ describe("fundraiser bankrun", async () => { const fundraiser = anchor.web3.PublicKey.findProgramAddressSync( [Buffer.from("fundraiser"), maker.publicKey.toBuffer()], - program.programId + program.programId, )[0]; const contributor = anchor.web3.PublicKey.findProgramAddressSync( - [ - Buffer.from("contributor"), - fundraiser.toBuffer(), - provider.publicKey.toBuffer(), - ], - program.programId + [Buffer.from("contributor"), fundraiser.toBuffer(), provider.publicKey.toBuffer()], + program.programId, )[0]; const confirm = async (signature: string): Promise => { @@ -65,32 +57,15 @@ describe("fundraiser bankrun", async () => { .then(confirm); console.log("\nAirdropped 1 SOL to maker", airdrop); - mint = await createMint( - provider.connection, - wallet.payer, - provider.publicKey, - provider.publicKey, - 6 - ); + mint = await createMint(provider.connection, wallet.payer, provider.publicKey, provider.publicKey, 6); console.log("Mint created", mint.toBase58()); contributorATA = ( - await getOrCreateAssociatedTokenAccount( - provider.connection, - wallet.payer, - mint, - wallet.publicKey - ) + await getOrCreateAssociatedTokenAccount(provider.connection, wallet.payer, mint, wallet.publicKey) ).address; - makerATA = ( - await getOrCreateAssociatedTokenAccount( - provider.connection, - wallet.payer, - mint, - maker.publicKey - ) - ).address; + makerATA = (await getOrCreateAssociatedTokenAccount(provider.connection, wallet.payer, mint, maker.publicKey)) + .address; const mintTx = await mintTo( provider.connection, @@ -98,7 +73,7 @@ describe("fundraiser bankrun", async () => { mint, contributorATA, provider.publicKey, - 1_000_000_0 + 1_000_000_0, ); console.log("Minted 10 tokens to contributor", mintTx); }); @@ -143,14 +118,9 @@ describe("fundraiser bankrun", async () => { console.log("\nContributed to fundraiser", tx); console.log("Your transaction signature", tx); - console.log( - "Vault balance", - (await provider.connection.getTokenAccountBalance(vault)).value.amount - ); + console.log("Vault balance", (await provider.connection.getTokenAccountBalance(vault)).value.amount); - const contributorAccount = await program.account.contributor.fetch( - contributor - ); + const contributorAccount = await program.account.contributor.fetch(contributor); console.log("Contributor balance", contributorAccount.amount.toString()); }); it("Contribute to Fundraiser", async () => { @@ -171,14 +141,9 @@ describe("fundraiser bankrun", async () => { console.log("\nContributed to fundraiser", tx); console.log("Your transaction signature", tx); - console.log( - "Vault balance", - (await provider.connection.getTokenAccountBalance(vault)).value.amount - ); + console.log("Vault balance", (await provider.connection.getTokenAccountBalance(vault)).value.amount); - const contributorAccount = await program.account.contributor.fetch( - contributor - ); + const contributorAccount = await program.account.contributor.fetch(contributor); console.log("Contributor balance", contributorAccount.amount.toString()); }); @@ -201,10 +166,7 @@ describe("fundraiser bankrun", async () => { console.log("\nContributed to fundraiser", tx); console.log("Your transaction signature", tx); - console.log( - "Vault balance", - (await provider.connection.getTokenAccountBalance(vault)).value.amount - ); + console.log("Vault balance", (await provider.connection.getTokenAccountBalance(vault)).value.amount); } catch (error) { console.log("\nError contributing to fundraiser"); console.log(error.msg); @@ -231,10 +193,7 @@ describe("fundraiser bankrun", async () => { console.log("\nChecked contributions"); console.log("Your transaction signature", tx); - console.log( - "Vault balance", - (await provider.connection.getTokenAccountBalance(vault)).value.amount - ); + console.log("Vault balance", (await provider.connection.getTokenAccountBalance(vault)).value.amount); } catch (error) { console.log("\nError checking contributions"); console.log(error.msg); @@ -244,9 +203,7 @@ describe("fundraiser bankrun", async () => { it("Refund Contributions", async () => { const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); - const contributorAccount = await program.account.contributor.fetch( - contributor - ); + const contributorAccount = await program.account.contributor.fetch(contributor); console.log("\nContributor balance", contributorAccount.amount.toString()); const tx = await program.methods @@ -267,9 +224,6 @@ describe("fundraiser bankrun", async () => { console.log("\nRefunded contributions", tx); console.log("Your transaction signature", tx); - console.log( - "Vault balance", - (await provider.connection.getTokenAccountBalance(vault)).value.amount - ); + console.log("Vault balance", (await provider.connection.getTokenAccountBalance(vault)).value.amount); }); }); diff --git a/tokens/token-fundraiser/anchor/tests/fundraiser.ts b/tokens/token-fundraiser/anchor/tests/fundraiser.ts index 5f86d630f..8077df4f1 100644 --- a/tokens/token-fundraiser/anchor/tests/fundraiser.ts +++ b/tokens/token-fundraiser/anchor/tests/fundraiser.ts @@ -2,264 +2,225 @@ import type { Program } from "@anchor-lang/core"; import * as anchor from "@anchor-lang/core"; import type NodeWallet from "@anchor-lang/core/dist/cjs/nodewallet"; import { - ASSOCIATED_TOKEN_PROGRAM_ID, - TOKEN_PROGRAM_ID, - createMint, - getAssociatedTokenAddressSync, - getOrCreateAssociatedTokenAccount, - mintTo, + ASSOCIATED_TOKEN_PROGRAM_ID, + createMint, + getAssociatedTokenAddressSync, + getOrCreateAssociatedTokenAccount, + mintTo, + TOKEN_PROGRAM_ID, } from "@solana/spl-token"; import BN from "bn.js"; import type { Fundraiser } from "../target/types/fundraiser"; describe("fundraiser", () => { - // Configure the client to use the local cluster. - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - - const program = anchor.workspace.Fundraiser as Program; - - const maker = anchor.web3.Keypair.generate(); - - let mint: anchor.web3.PublicKey; - - let contributorATA: anchor.web3.PublicKey; - - let makerATA: anchor.web3.PublicKey; - - const wallet = provider.wallet as NodeWallet; - - const fundraiser = anchor.web3.PublicKey.findProgramAddressSync( - [Buffer.from("fundraiser"), maker.publicKey.toBuffer()], - program.programId, - )[0]; - - const contributor = anchor.web3.PublicKey.findProgramAddressSync( - [ - Buffer.from("contributor"), - fundraiser.toBuffer(), - provider.publicKey.toBuffer(), - ], - program.programId, - )[0]; - - const confirm = async (signature: string): Promise => { - const block = await provider.connection.getLatestBlockhash(); - await provider.connection.confirmTransaction({ - signature, - ...block, - }); - return signature; - }; - - it("Test Preparation", async () => { - const airdrop = await provider.connection - .requestAirdrop(maker.publicKey, 1 * anchor.web3.LAMPORTS_PER_SOL) - .then(confirm); - console.log("\nAirdropped 1 SOL to maker", airdrop); - - mint = await createMint( - provider.connection, - wallet.payer, - provider.publicKey, - provider.publicKey, - 6, - ); - console.log("Mint created", mint.toBase58()); - - contributorATA = ( - await getOrCreateAssociatedTokenAccount( - provider.connection, - wallet.payer, - mint, - wallet.publicKey, - ) - ).address; - - makerATA = ( - await getOrCreateAssociatedTokenAccount( - provider.connection, - wallet.payer, - mint, - maker.publicKey, - ) - ).address; - - const mintTx = await mintTo( - provider.connection, - wallet.payer, - mint, - contributorATA, - provider.publicKey, - 1_000_000_0, - ); - console.log("Minted 10 tokens to contributor", mintTx); - }); - - it("Initialize Fundaraiser", async () => { - const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); - - const tx = await program.methods - .initialize(new BN(30000000), 0) - .accountsPartial({ - maker: maker.publicKey, - fundraiser, - mintToRaise: mint, - vault, - systemProgram: anchor.web3.SystemProgram.programId, - tokenProgram: TOKEN_PROGRAM_ID, - associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, - }) - .signers([maker]) - .rpc() - .then(confirm); - - console.log("\nInitialized fundraiser Account"); - console.log("Your transaction signature", tx); - }); - - it("Contribute to Fundraiser", async () => { - const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); - - const tx = await program.methods - .contribute(new BN(1000000)) - .accountsPartial({ - contributor: provider.publicKey, - fundraiser, - contributorAccount: contributor, - contributorAta: contributorATA, - vault, - tokenProgram: TOKEN_PROGRAM_ID, - }) - .rpc() - .then(confirm); - - console.log("\nContributed to fundraiser", tx); - console.log("Your transaction signature", tx); - console.log( - "Vault balance", - (await provider.connection.getTokenAccountBalance(vault)).value.amount, - ); - - const contributorAccount = - await program.account.contributor.fetch(contributor); - console.log("Contributor balance", contributorAccount.amount.toString()); - }); - it("Contribute to Fundraiser", async () => { - const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); - - const tx = await program.methods - .contribute(new BN(1000000)) - .accountsPartial({ - contributor: provider.publicKey, - fundraiser, - contributorAccount: contributor, - contributorAta: contributorATA, - vault, - tokenProgram: TOKEN_PROGRAM_ID, - }) - .rpc() - .then(confirm); - - console.log("\nContributed to fundraiser", tx); - console.log("Your transaction signature", tx); - console.log( - "Vault balance", - (await provider.connection.getTokenAccountBalance(vault)).value.amount, - ); - - const contributorAccount = - await program.account.contributor.fetch(contributor); - console.log("Contributor balance", contributorAccount.amount.toString()); - }); - - it("Contribute to Fundraiser - Robustness Test", async () => { - try { - const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); - - const tx = await program.methods - .contribute(new BN(2000000)) - .accountsPartial({ - contributor: provider.publicKey, - fundraiser, - contributorAccount: contributor, - contributorAta: contributorATA, - vault, - tokenProgram: TOKEN_PROGRAM_ID, - }) - .rpc() - .then(confirm); - - console.log("\nContributed to fundraiser", tx); - console.log("Your transaction signature", tx); - console.log( - "Vault balance", - (await provider.connection.getTokenAccountBalance(vault)).value.amount, - ); - } catch (error) { - console.log("\nError contributing to fundraiser"); - console.log(error.msg); - } - }); - - it("Check contributions - Robustness Test", async () => { - try { - const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); - - const tx = await program.methods - .checkContributions() - .accountsPartial({ - maker: maker.publicKey, - mintToRaise: mint, - fundraiser, - makerAta: makerATA, - vault, - tokenProgram: TOKEN_PROGRAM_ID, - }) - .signers([maker]) - .rpc() - .then(confirm); - - console.log("\nChecked contributions"); - console.log("Your transaction signature", tx); - console.log( - "Vault balance", - (await provider.connection.getTokenAccountBalance(vault)).value.amount, - ); - } catch (error) { - console.log("\nError checking contributions"); - console.log(error.msg); - } - }); - - it("Refund Contributions", async () => { - const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); - - const contributorAccount = - await program.account.contributor.fetch(contributor); - console.log("\nContributor balance", contributorAccount.amount.toString()); - - const tx = await program.methods - .refund() - .accountsPartial({ - contributor: provider.publicKey, - maker: maker.publicKey, - mintToRaise: mint, - fundraiser, - contributorAccount: contributor, - contributorAta: contributorATA, - vault, - tokenProgram: TOKEN_PROGRAM_ID, - systemProgram: anchor.web3.SystemProgram.programId, - }) - .rpc() - .then(confirm); - - console.log("\nRefunded contributions", tx); - console.log("Your transaction signature", tx); - console.log( - "Vault balance", - (await provider.connection.getTokenAccountBalance(vault)).value.amount, - ); - }); + // Configure the client to use the local cluster. + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + + const program = anchor.workspace.Fundraiser as Program; + + const maker = anchor.web3.Keypair.generate(); + + let mint: anchor.web3.PublicKey; + + let contributorATA: anchor.web3.PublicKey; + + let makerATA: anchor.web3.PublicKey; + + const wallet = provider.wallet as NodeWallet; + + const fundraiser = anchor.web3.PublicKey.findProgramAddressSync( + [Buffer.from("fundraiser"), maker.publicKey.toBuffer()], + program.programId, + )[0]; + + const contributor = anchor.web3.PublicKey.findProgramAddressSync( + [Buffer.from("contributor"), fundraiser.toBuffer(), provider.publicKey.toBuffer()], + program.programId, + )[0]; + + const confirm = async (signature: string): Promise => { + const block = await provider.connection.getLatestBlockhash(); + await provider.connection.confirmTransaction({ + signature, + ...block, + }); + return signature; + }; + + it("Test Preparation", async () => { + const airdrop = await provider.connection + .requestAirdrop(maker.publicKey, 1 * anchor.web3.LAMPORTS_PER_SOL) + .then(confirm); + console.log("\nAirdropped 1 SOL to maker", airdrop); + + mint = await createMint(provider.connection, wallet.payer, provider.publicKey, provider.publicKey, 6); + console.log("Mint created", mint.toBase58()); + + contributorATA = ( + await getOrCreateAssociatedTokenAccount(provider.connection, wallet.payer, mint, wallet.publicKey) + ).address; + + makerATA = (await getOrCreateAssociatedTokenAccount(provider.connection, wallet.payer, mint, maker.publicKey)) + .address; + + const mintTx = await mintTo( + provider.connection, + wallet.payer, + mint, + contributorATA, + provider.publicKey, + 1_000_000_0, + ); + console.log("Minted 10 tokens to contributor", mintTx); + }); + + it("Initialize Fundaraiser", async () => { + const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); + + const tx = await program.methods + .initialize(new BN(30000000), 0) + .accountsPartial({ + maker: maker.publicKey, + fundraiser, + mintToRaise: mint, + vault, + systemProgram: anchor.web3.SystemProgram.programId, + tokenProgram: TOKEN_PROGRAM_ID, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .signers([maker]) + .rpc() + .then(confirm); + + console.log("\nInitialized fundraiser Account"); + console.log("Your transaction signature", tx); + }); + + it("Contribute to Fundraiser", async () => { + const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); + + const tx = await program.methods + .contribute(new BN(1000000)) + .accountsPartial({ + contributor: provider.publicKey, + fundraiser, + contributorAccount: contributor, + contributorAta: contributorATA, + vault, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .rpc() + .then(confirm); + + console.log("\nContributed to fundraiser", tx); + console.log("Your transaction signature", tx); + console.log("Vault balance", (await provider.connection.getTokenAccountBalance(vault)).value.amount); + + const contributorAccount = await program.account.contributor.fetch(contributor); + console.log("Contributor balance", contributorAccount.amount.toString()); + }); + it("Contribute to Fundraiser", async () => { + const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); + + const tx = await program.methods + .contribute(new BN(1000000)) + .accountsPartial({ + contributor: provider.publicKey, + fundraiser, + contributorAccount: contributor, + contributorAta: contributorATA, + vault, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .rpc() + .then(confirm); + + console.log("\nContributed to fundraiser", tx); + console.log("Your transaction signature", tx); + console.log("Vault balance", (await provider.connection.getTokenAccountBalance(vault)).value.amount); + + const contributorAccount = await program.account.contributor.fetch(contributor); + console.log("Contributor balance", contributorAccount.amount.toString()); + }); + + it("Contribute to Fundraiser - Robustness Test", async () => { + try { + const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); + + const tx = await program.methods + .contribute(new BN(2000000)) + .accountsPartial({ + contributor: provider.publicKey, + fundraiser, + contributorAccount: contributor, + contributorAta: contributorATA, + vault, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .rpc() + .then(confirm); + + console.log("\nContributed to fundraiser", tx); + console.log("Your transaction signature", tx); + console.log("Vault balance", (await provider.connection.getTokenAccountBalance(vault)).value.amount); + } catch (error) { + console.log("\nError contributing to fundraiser"); + console.log(error.msg); + } + }); + + it("Check contributions - Robustness Test", async () => { + try { + const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); + + const tx = await program.methods + .checkContributions() + .accountsPartial({ + maker: maker.publicKey, + mintToRaise: mint, + fundraiser, + makerAta: makerATA, + vault, + tokenProgram: TOKEN_PROGRAM_ID, + }) + .signers([maker]) + .rpc() + .then(confirm); + + console.log("\nChecked contributions"); + console.log("Your transaction signature", tx); + console.log("Vault balance", (await provider.connection.getTokenAccountBalance(vault)).value.amount); + } catch (error) { + console.log("\nError checking contributions"); + console.log(error.msg); + } + }); + + it("Refund Contributions", async () => { + const vault = getAssociatedTokenAddressSync(mint, fundraiser, true); + + const contributorAccount = await program.account.contributor.fetch(contributor); + console.log("\nContributor balance", contributorAccount.amount.toString()); + + const tx = await program.methods + .refund() + .accountsPartial({ + contributor: provider.publicKey, + maker: maker.publicKey, + mintToRaise: mint, + fundraiser, + contributorAccount: contributor, + contributorAta: contributorATA, + vault, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: anchor.web3.SystemProgram.programId, + }) + .rpc() + .then(confirm); + + console.log("\nRefunded contributions", tx); + console.log("Your transaction signature", tx); + console.log("Vault balance", (await provider.connection.getTokenAccountBalance(vault)).value.amount); + }); }); diff --git a/tokens/token-swap/anchor/Anchor.toml b/tokens/token-swap/anchor/Anchor.toml index e119b88d6..f59559c68 100644 --- a/tokens/token-swap/anchor/Anchor.toml +++ b/tokens/token-swap/anchor/Anchor.toml @@ -15,7 +15,8 @@ cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" +# LiteSVM Rust tests — replaced TS tests +test = "cargo test" [test] startup_wait = 5000 diff --git a/tokens/token-swap/anchor/package.json b/tokens/token-swap/anchor/package.json index 088bde1fe..6e7afcc30 100644 --- a/tokens/token-swap/anchor/package.json +++ b/tokens/token-swap/anchor/package.json @@ -1,21 +1,21 @@ { - "type": "module", - "scripts": { - "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", - "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" - }, - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.3.8" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "prettier": "^2.6.2", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3" - } + "type": "module", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check" + }, + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.3.8" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3" + } } diff --git a/tokens/token-swap/anchor/pnpm-lock.yaml b/tokens/token-swap/anchor/pnpm-lock.yaml index a753a5aeb..2f3913ca5 100644 --- a/tokens/token-swap/anchor/pnpm-lock.yaml +++ b/tokens/token-swap/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.3.8 version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -42,18 +42,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -854,16 +854,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.8)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.2 @@ -881,7 +881,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/token-swap/anchor/programs/token-swap/Cargo.toml b/tokens/token-swap/anchor/programs/token-swap/Cargo.toml index 5df2b828c..caa9e13f6 100644 --- a/tokens/token-swap/anchor/programs/token-swap/Cargo.toml +++ b/tokens/token-swap/anchor/programs/token-swap/Cargo.toml @@ -20,9 +20,16 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = { version = "1.0.0-rc.5", features = ["metadata"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = { version = "1.0.0", features = ["metadata"] } fixed = "1.27.0" +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" + [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/token-swap/anchor/programs/token-swap/src/lib.rs b/tokens/token-swap/anchor/programs/token-swap/src/lib.rs index d14e89724..333b7eba2 100644 --- a/tokens/token-swap/anchor/programs/token-swap/src/lib.rs +++ b/tokens/token-swap/anchor/programs/token-swap/src/lib.rs @@ -6,7 +6,7 @@ mod instructions; mod state; // Set the correct key here -declare_id!("AsGVFxWqEn8icRBFQApxJe68x3r9zvfSbmiEzYFATGYn"); +declare_id!("9FX4TuhmPbKEavcP431ALEzrvsrEaUNogPYcMZL37CeS"); #[program] pub mod swap_example { diff --git a/tokens/token-swap/anchor/programs/token-swap/tests/test_swap.rs b/tokens/token-swap/anchor/programs/token-swap/tests/test_swap.rs new file mode 100644 index 000000000..a8bcb6eba --- /dev/null +++ b/tokens/token-swap/anchor/programs/token-swap/tests/test_swap.rs @@ -0,0 +1,437 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{ + create_associated_token_account, create_token_mint, create_wallet, + get_token_account_balance, mint_tokens_to_token_account, send_transaction_from_instructions, + }, + solana_signer::Signer, +}; + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn ata_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[wallet.as_ref(), token_program_id().as_ref(), mint.as_ref()], + &ata_program_id(), + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = swap_example::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/swap_example.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let payer = create_wallet(&mut svm, 100_000_000_000).unwrap(); + (svm, program_id, payer) +} + +/// Ensure mint_a < mint_b by pubkey ordering (the program may require this). +fn ordered_mints(svm: &mut LiteSVM, authority: &Keypair, decimals: u8) -> (Pubkey, Pubkey) { + loop { + let a = create_token_mint(svm, authority, decimals, None).unwrap(); + let b = create_token_mint(svm, authority, decimals, None).unwrap(); + if a.as_ref() < b.as_ref() { + return (a, b); + } + } +} + +struct TestSetup { + svm: LiteSVM, + program_id: Pubkey, + payer: Keypair, + admin: Keypair, + amm_key: Pubkey, + mint_a: Pubkey, + mint_b: Pubkey, + pool_key: Pubkey, + pool_authority: Pubkey, + mint_liquidity: Pubkey, + pool_account_a: Pubkey, + pool_account_b: Pubkey, + holder_account_a: Pubkey, + holder_account_b: Pubkey, + liquidity_account: Pubkey, +} + +fn full_setup() -> TestSetup { + let (mut svm, program_id, payer) = setup(); + let admin = create_wallet(&mut svm, 100_000_000_000).unwrap(); + + let decimals: u8 = 6; + let minted_amount: u64 = 100 * 10u64.pow(decimals as u32); + + let (mint_a, mint_b) = ordered_mints(&mut svm, &admin, decimals); + let amm_id = Keypair::new().pubkey(); + let fee: u16 = 500; + + // Derive PDAs + let (amm_key, _) = Pubkey::find_program_address(&[amm_id.as_ref()], &program_id); + let (pool_key, _) = Pubkey::find_program_address( + &[amm_key.as_ref(), mint_a.as_ref(), mint_b.as_ref()], + &program_id, + ); + let (pool_authority, _) = Pubkey::find_program_address( + &[ + amm_key.as_ref(), + mint_a.as_ref(), + mint_b.as_ref(), + b"authority", + ], + &program_id, + ); + let (mint_liquidity, _) = Pubkey::find_program_address( + &[ + amm_key.as_ref(), + mint_a.as_ref(), + mint_b.as_ref(), + b"liquidity", + ], + &program_id, + ); + + let pool_account_a = derive_ata(&pool_authority, &mint_a); + let pool_account_b = derive_ata(&pool_authority, &mint_b); + let liquidity_account = derive_ata(&admin.pubkey(), &mint_liquidity); + + // Create ATAs for admin and mint tokens + let holder_account_a = + create_associated_token_account(&mut svm, &admin.pubkey(), &mint_a, &payer).unwrap(); + let holder_account_b = + create_associated_token_account(&mut svm, &admin.pubkey(), &mint_b, &payer).unwrap(); + + mint_tokens_to_token_account(&mut svm, &mint_a, &holder_account_a, minted_amount, &admin).unwrap(); + mint_tokens_to_token_account(&mut svm, &mint_b, &holder_account_b, minted_amount, &admin).unwrap(); + + // Create AMM + let create_amm_ix = Instruction::new_with_bytes( + program_id, + &swap_example::instruction::CreateAmm { id: amm_id, fee }.data(), + swap_example::accounts::CreateAmm { + amm: amm_key, + admin: admin.pubkey(), + payer: payer.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_amm_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Create Pool + let create_pool_ix = Instruction::new_with_bytes( + program_id, + &swap_example::instruction::CreatePool {}.data(), + swap_example::accounts::CreatePool { + amm: amm_key, + pool: pool_key, + pool_authority, + mint_liquidity, + mint_a, + mint_b, + pool_account_a, + pool_account_b, + payer: payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_pool_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + TestSetup { + svm, + program_id, + payer, + admin, + amm_key, + mint_a, + mint_b, + pool_key, + pool_authority, + mint_liquidity, + pool_account_a, + pool_account_b, + holder_account_a, + holder_account_b, + liquidity_account, + } +} + +#[test] +fn test_create_amm() { + let (mut svm, program_id, payer) = setup(); + let amm_id = Keypair::new().pubkey(); + let fee: u16 = 500; + let admin = Keypair::new(); + + let (amm_key, _) = Pubkey::find_program_address(&[amm_id.as_ref()], &program_id); + + let create_amm_ix = Instruction::new_with_bytes( + program_id, + &swap_example::instruction::CreateAmm { id: amm_id, fee }.data(), + swap_example::accounts::CreateAmm { + amm: amm_key, + admin: admin.pubkey(), + payer: payer.pubkey(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut svm, + vec![create_amm_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify AMM account exists + let amm_account = svm.get_account(&amm_key).expect("AMM account should exist"); + assert!(!amm_account.data.is_empty()); +} + +#[test] +fn test_deposit_liquidity() { + let mut ts = full_setup(); + let deposit_amount_a: u64 = 4_000_000; + let deposit_amount_b: u64 = 1_000_000; + + let deposit_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::DepositLiquidity { + amount_a: deposit_amount_a, + amount_b: deposit_amount_b, + } + .data(), + swap_example::accounts::DepositLiquidity { + pool: ts.pool_key, + pool_authority: ts.pool_authority, + depositor: ts.admin.pubkey(), + mint_liquidity: ts.mint_liquidity, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_account_a: ts.pool_account_a, + pool_account_b: ts.pool_account_b, + depositor_account_liquidity: ts.liquidity_account, + depositor_account_a: ts.holder_account_a, + depositor_account_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + + send_transaction_from_instructions( + &mut ts.svm, + vec![deposit_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + // Verify liquidity tokens were minted + let liq_amount = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + assert!(liq_amount > 0, "Should have received liquidity tokens"); +} + +#[test] +fn test_swap_a_to_b() { + let mut ts = full_setup(); + + // Deposit liquidity first + let deposit_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::DepositLiquidity { + amount_a: 4_000_000, + amount_b: 1_000_000, + } + .data(), + swap_example::accounts::DepositLiquidity { + pool: ts.pool_key, + pool_authority: ts.pool_authority, + depositor: ts.admin.pubkey(), + mint_liquidity: ts.mint_liquidity, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_account_a: ts.pool_account_a, + pool_account_b: ts.pool_account_b, + depositor_account_liquidity: ts.liquidity_account, + depositor_account_a: ts.holder_account_a, + depositor_account_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![deposit_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + // Get balances before swap + let before_b = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + + // Swap 1M of token A for token B + let swap_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::SwapExactTokensForTokens { + swap_a: true, + input_amount: 1_000_000, + min_output_amount: 100, + } + .data(), + swap_example::accounts::SwapExactTokensForTokens { + amm: ts.amm_key, + pool: ts.pool_key, + pool_authority: ts.pool_authority, + trader: ts.admin.pubkey(), + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_account_a: ts.pool_account_a, + pool_account_b: ts.pool_account_b, + trader_account_a: ts.holder_account_a, + trader_account_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![swap_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + // After swap, token B balance should have increased + let after_b = get_token_account_balance(&ts.svm, &ts.holder_account_b).unwrap(); + assert!( + after_b > before_b, + "Token B balance should increase after swap A->B" + ); +} + +#[test] +fn test_withdraw_liquidity() { + let mut ts = full_setup(); + + // Deposit liquidity + let deposit_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::DepositLiquidity { + amount_a: 4_000_000, + amount_b: 4_000_000, + } + .data(), + swap_example::accounts::DepositLiquidity { + pool: ts.pool_key, + pool_authority: ts.pool_authority, + depositor: ts.admin.pubkey(), + mint_liquidity: ts.mint_liquidity, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_account_a: ts.pool_account_a, + pool_account_b: ts.pool_account_b, + depositor_account_liquidity: ts.liquidity_account, + depositor_account_a: ts.holder_account_a, + depositor_account_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![deposit_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + // Get liquidity token balance + let liq_amount = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + assert!(liq_amount > 0); + + // Withdraw all liquidity + let withdraw_ix = Instruction::new_with_bytes( + ts.program_id, + &swap_example::instruction::WithdrawLiquidity { + amount: liq_amount, + } + .data(), + swap_example::accounts::WithdrawLiquidity { + amm: ts.amm_key, + pool: ts.pool_key, + pool_authority: ts.pool_authority, + depositor: ts.admin.pubkey(), + mint_liquidity: ts.mint_liquidity, + mint_a: ts.mint_a, + mint_b: ts.mint_b, + pool_account_a: ts.pool_account_a, + pool_account_b: ts.pool_account_b, + depositor_account_liquidity: ts.liquidity_account, + depositor_account_a: ts.holder_account_a, + depositor_account_b: ts.holder_account_b, + payer: ts.payer.pubkey(), + token_program: token_program_id(), + associated_token_program: ata_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut ts.svm, + vec![withdraw_ix], + &[&ts.payer, &ts.admin], + &ts.payer.pubkey(), + ) + .unwrap(); + + // Liquidity balance should be 0 + let liq_amount = get_token_account_balance(&ts.svm, &ts.liquidity_account).unwrap(); + assert_eq!(liq_amount, 0, "Liquidity should be fully withdrawn"); +} diff --git a/tokens/token-swap/anchor/tests/create-amm.ts b/tokens/token-swap/anchor/tests/create-amm.ts index 7eee680c4..081ac8b84 100644 --- a/tokens/token-swap/anchor/tests/create-amm.ts +++ b/tokens/token-swap/anchor/tests/create-amm.ts @@ -1,10 +1,10 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { expect } from 'chai'; -import type { SwapExample } from '../target/types/swap_example'; -import { createValues, expectRevert, type TestValues } from './utils'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { expect } from "chai"; +import type { SwapExample } from "../target/types/swap_example"; +import { createValues, expectRevert, type TestValues } from "./utils"; -describe('Create AMM', () => { +describe("Create AMM", () => { const provider = anchor.AnchorProvider.env(); const _connection = provider.connection; anchor.setProvider(provider); @@ -17,8 +17,11 @@ describe('Create AMM', () => { values = createValues(); }); - it('Creation', async () => { - await program.methods.createAmm(values.id, values.fee).accounts({ amm: values.ammKey, admin: values.admin.publicKey }).rpc(); + it("Creation", async () => { + await program.methods + .createAmm(values.id, values.fee) + .accounts({ amm: values.ammKey, admin: values.admin.publicKey }) + .rpc(); const ammAccount = await program.account.amm.fetch(values.ammKey); expect(ammAccount.id.toString()).to.equal(values.id.toString()); @@ -26,9 +29,14 @@ describe('Create AMM', () => { expect(ammAccount.fee.toString()).to.equal(values.fee.toString()); }); - it('Invalid fee', async () => { + it("Invalid fee", async () => { values.fee = 10000; - await expectRevert(program.methods.createAmm(values.id, values.fee).accounts({ amm: values.ammKey, admin: values.admin.publicKey }).rpc()); + await expectRevert( + program.methods + .createAmm(values.id, values.fee) + .accounts({ amm: values.ammKey, admin: values.admin.publicKey }) + .rpc(), + ); }); }); diff --git a/tokens/token-swap/anchor/tests/create-pool.ts b/tokens/token-swap/anchor/tests/create-pool.ts index cdab62af2..a8ff19609 100644 --- a/tokens/token-swap/anchor/tests/create-pool.ts +++ b/tokens/token-swap/anchor/tests/create-pool.ts @@ -1,10 +1,10 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { PublicKey } from '@solana/web3.js'; -import type { SwapExample } from '../target/types/swap_example'; -import { createValues, expectRevert, mintingTokens, type TestValues } from './utils'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { PublicKey } from "@solana/web3.js"; +import type { SwapExample } from "../target/types/swap_example"; +import { createValues, expectRevert, mintingTokens, type TestValues } from "./utils"; -describe('Create pool', () => { +describe("Create pool", () => { const provider = anchor.AnchorProvider.env(); const connection = provider.connection; anchor.setProvider(provider); @@ -16,7 +16,10 @@ describe('Create pool', () => { beforeEach(async () => { values = createValues(); - await program.methods.createAmm(values.id, values.fee).accounts({ amm: values.ammKey, admin: values.admin.publicKey }).rpc(); + await program.methods + .createAmm(values.id, values.fee) + .accounts({ amm: values.ammKey, admin: values.admin.publicKey }) + .rpc(); await mintingTokens({ connection, @@ -26,7 +29,7 @@ describe('Create pool', () => { }); }); - it('Creation', async () => { + it("Creation", async () => { await program.methods .createPool() .accounts({ @@ -42,7 +45,7 @@ describe('Create pool', () => { .rpc({ skipPreflight: true }); }); - it('Invalid mints', async () => { + it("Invalid mints", async () => { values = createValues({ mintBKeypair: values.mintAKeypair, poolKey: PublicKey.findProgramAddressSync( @@ -50,7 +53,12 @@ describe('Create pool', () => { program.programId, )[0], poolAuthority: PublicKey.findProgramAddressSync( - [values.id.toBuffer(), values.mintAKeypair.publicKey.toBuffer(), values.mintBKeypair.publicKey.toBuffer(), Buffer.from('authority')], + [ + values.id.toBuffer(), + values.mintAKeypair.publicKey.toBuffer(), + values.mintBKeypair.publicKey.toBuffer(), + Buffer.from("authority"), + ], program.programId, )[0], }); diff --git a/tokens/token-swap/anchor/tests/deposit-liquidity.ts b/tokens/token-swap/anchor/tests/deposit-liquidity.ts index 10b6d2fee..edf313ece 100644 --- a/tokens/token-swap/anchor/tests/deposit-liquidity.ts +++ b/tokens/token-swap/anchor/tests/deposit-liquidity.ts @@ -1,10 +1,10 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { expect } from 'chai'; -import type { SwapExample } from '../target/types/swap_example'; -import { createValues, mintingTokens, type TestValues } from './utils'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { expect } from "chai"; +import type { SwapExample } from "../target/types/swap_example"; +import { createValues, mintingTokens, type TestValues } from "./utils"; -describe('Deposit liquidity', () => { +describe("Deposit liquidity", () => { const provider = anchor.AnchorProvider.env(); const connection = provider.connection; anchor.setProvider(provider); @@ -16,7 +16,10 @@ describe('Deposit liquidity', () => { beforeEach(async () => { values = createValues(); - await program.methods.createAmm(values.id, values.fee).accounts({ amm: values.ammKey, admin: values.admin.publicKey }).rpc(); + await program.methods + .createAmm(values.id, values.fee) + .accounts({ amm: values.ammKey, admin: values.admin.publicKey }) + .rpc(); await mintingTokens({ connection, @@ -40,7 +43,7 @@ describe('Deposit liquidity', () => { .rpc(); }); - it('Deposit equal amounts', async () => { + it("Deposit equal amounts", async () => { await program.methods .depositLiquidity(values.depositAmountA, values.depositAmountA) .accounts({ @@ -60,7 +63,9 @@ describe('Deposit liquidity', () => { .rpc({ skipPreflight: true }); const depositTokenAccountLiquditiy = await connection.getTokenAccountBalance(values.liquidityAccount); - expect(depositTokenAccountLiquditiy.value.amount).to.equal(values.depositAmountA.sub(values.minimumLiquidity).toString()); + expect(depositTokenAccountLiquditiy.value.amount).to.equal( + values.depositAmountA.sub(values.minimumLiquidity).toString(), + ); const depositTokenAccountA = await connection.getTokenAccountBalance(values.holderAccountA); expect(depositTokenAccountA.value.amount).to.equal(values.defaultSupply.sub(values.depositAmountA).toString()); const depositTokenAccountB = await connection.getTokenAccountBalance(values.holderAccountB); diff --git a/tokens/token-swap/anchor/tests/swap.ts b/tokens/token-swap/anchor/tests/swap.ts index 71afb6c91..cf415ab67 100644 --- a/tokens/token-swap/anchor/tests/swap.ts +++ b/tokens/token-swap/anchor/tests/swap.ts @@ -1,11 +1,11 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { BN } from 'bn.js'; -import { expect } from 'chai'; -import type { SwapExample } from '../target/types/swap_example'; -import { createValues, mintingTokens, type TestValues } from './utils'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { BN } from "bn.js"; +import { expect } from "chai"; +import type { SwapExample } from "../target/types/swap_example"; +import { createValues, mintingTokens, type TestValues } from "./utils"; -describe('Swap', () => { +describe("Swap", () => { const provider = anchor.AnchorProvider.env(); const connection = provider.connection; anchor.setProvider(provider); @@ -17,7 +17,10 @@ describe('Swap', () => { beforeEach(async () => { values = createValues(); - await program.methods.createAmm(values.id, values.fee).accounts({ amm: values.ammKey, admin: values.admin.publicKey }).rpc(); + await program.methods + .createAmm(values.id, values.fee) + .accounts({ amm: values.ammKey, admin: values.admin.publicKey }) + .rpc(); await mintingTokens({ connection, @@ -59,7 +62,7 @@ describe('Swap', () => { .rpc({ skipPreflight: true }); }); - it('Swap from A to B', async () => { + it("Swap from A to B", async () => { const input = new BN(10 ** 6); await program.methods .swapExactTokensForTokens(true, input, new BN(100)) @@ -80,8 +83,14 @@ describe('Swap', () => { const traderTokenAccountA = await connection.getTokenAccountBalance(values.holderAccountA); const traderTokenAccountB = await connection.getTokenAccountBalance(values.holderAccountB); - expect(traderTokenAccountA.value.amount).to.equal(values.defaultSupply.sub(values.depositAmountA).sub(input).toString()); - expect(Number(traderTokenAccountB.value.amount)).to.be.greaterThan(values.defaultSupply.sub(values.depositAmountB).toNumber()); - expect(Number(traderTokenAccountB.value.amount)).to.be.lessThan(values.defaultSupply.sub(values.depositAmountB).add(input).toNumber()); + expect(traderTokenAccountA.value.amount).to.equal( + values.defaultSupply.sub(values.depositAmountA).sub(input).toString(), + ); + expect(Number(traderTokenAccountB.value.amount)).to.be.greaterThan( + values.defaultSupply.sub(values.depositAmountB).toNumber(), + ); + expect(Number(traderTokenAccountB.value.amount)).to.be.lessThan( + values.defaultSupply.sub(values.depositAmountB).add(input).toNumber(), + ); }); }); diff --git a/tokens/token-swap/anchor/tests/utils.ts b/tokens/token-swap/anchor/tests/utils.ts index 44b0b1079..979338266 100644 --- a/tokens/token-swap/anchor/tests/utils.ts +++ b/tokens/token-swap/anchor/tests/utils.ts @@ -1,7 +1,12 @@ -import * as anchor from '@anchor-lang/core'; -import { createMint, getAssociatedTokenAddressSync, getOrCreateAssociatedTokenAccount, mintTo } from '@solana/spl-token'; -import { type Connection, Keypair, PublicKey, type Signer } from '@solana/web3.js'; -import { BN } from 'bn.js'; +import * as anchor from "@anchor-lang/core"; +import { + createMint, + getAssociatedTokenAddressSync, + getOrCreateAssociatedTokenAccount, + mintTo, +} from "@solana/spl-token"; +import { type Connection, Keypair, PublicKey, type Signer } from "@solana/web3.js"; +import { BN } from "bn.js"; export async function sleep(seconds: number) { new Promise((resolve) => setTimeout(resolve, seconds * 1000)); @@ -11,10 +16,11 @@ export const generateSeededKeypair = (seed: string) => { return Keypair.fromSeed(anchor.utils.bytes.utf8.encode(anchor.utils.sha256.hash(seed)).slice(0, 32)); }; +// biome-ignore lint/suspicious/noExplicitAny: TODO: we should fix this, but we also will move these test to LiteSVM for Anchor 1.0 export const expectRevert = async (promise: Promise) => { try { await promise; - throw new Error('Expected a revert'); + throw new Error("Expected a revert"); } catch { return; } @@ -98,11 +104,11 @@ export function createValues(defaults?: TestValuesDefaults): TestValues { } const poolAuthority = PublicKey.findProgramAddressSync( - [ammKey.toBuffer(), mintAKeypair.publicKey.toBuffer(), mintBKeypair.publicKey.toBuffer(), Buffer.from('authority')], + [ammKey.toBuffer(), mintAKeypair.publicKey.toBuffer(), mintBKeypair.publicKey.toBuffer(), Buffer.from("authority")], anchor.workspace.SwapExample.programId, )[0]; const mintLiquidity = PublicKey.findProgramAddressSync( - [ammKey.toBuffer(), mintAKeypair.publicKey.toBuffer(), mintBKeypair.publicKey.toBuffer(), Buffer.from('liquidity')], + [ammKey.toBuffer(), mintAKeypair.publicKey.toBuffer(), mintBKeypair.publicKey.toBuffer(), Buffer.from("liquidity")], anchor.workspace.SwapExample.programId, )[0]; const poolKey = PublicKey.findProgramAddressSync( diff --git a/tokens/token-swap/anchor/tests/withdraw-liquidity.ts b/tokens/token-swap/anchor/tests/withdraw-liquidity.ts index e2f5ac7f0..33df6ee92 100644 --- a/tokens/token-swap/anchor/tests/withdraw-liquidity.ts +++ b/tokens/token-swap/anchor/tests/withdraw-liquidity.ts @@ -1,10 +1,10 @@ -import type { Program } from '@anchor-lang/core'; -import * as anchor from '@anchor-lang/core'; -import { expect } from 'chai'; -import type { SwapExample } from '../target/types/swap_example'; -import { createValues, mintingTokens, type TestValues } from './utils'; +import type { Program } from "@anchor-lang/core"; +import * as anchor from "@anchor-lang/core"; +import { expect } from "chai"; +import type { SwapExample } from "../target/types/swap_example"; +import { createValues, mintingTokens, type TestValues } from "./utils"; -describe('Withdraw liquidity', () => { +describe("Withdraw liquidity", () => { const provider = anchor.AnchorProvider.env(); const connection = provider.connection; anchor.setProvider(provider); @@ -16,7 +16,10 @@ describe('Withdraw liquidity', () => { beforeEach(async () => { values = createValues(); - await program.methods.createAmm(values.id, values.fee).accounts({ amm: values.ammKey, admin: values.admin.publicKey }).rpc(); + await program.methods + .createAmm(values.id, values.fee) + .accounts({ amm: values.ammKey, admin: values.admin.publicKey }) + .rpc(); await mintingTokens({ connection, @@ -58,7 +61,7 @@ describe('Withdraw liquidity', () => { .rpc({ skipPreflight: true }); }); - it('Withdraw everything', async () => { + it("Withdraw everything", async () => { await program.methods .withdrawLiquidity(values.depositAmountA.sub(values.minimumLiquidity)) .accounts({ @@ -81,10 +84,14 @@ describe('Withdraw liquidity', () => { const liquidityTokenAccount = await connection.getTokenAccountBalance(values.liquidityAccount); const depositTokenAccountA = await connection.getTokenAccountBalance(values.holderAccountA); const depositTokenAccountB = await connection.getTokenAccountBalance(values.holderAccountB); - expect(liquidityTokenAccount.value.amount).to.equal('0'); + expect(liquidityTokenAccount.value.amount).to.equal("0"); expect(Number(depositTokenAccountA.value.amount)).to.be.lessThan(values.defaultSupply.toNumber()); - expect(Number(depositTokenAccountA.value.amount)).to.be.greaterThan(values.defaultSupply.sub(values.depositAmountA).toNumber()); + expect(Number(depositTokenAccountA.value.amount)).to.be.greaterThan( + values.defaultSupply.sub(values.depositAmountA).toNumber(), + ); expect(Number(depositTokenAccountB.value.amount)).to.be.lessThan(values.defaultSupply.toNumber()); - expect(Number(depositTokenAccountB.value.amount)).to.be.greaterThan(values.defaultSupply.sub(values.depositAmountA).toNumber()); + expect(Number(depositTokenAccountB.value.amount)).to.be.greaterThan( + values.defaultSupply.sub(values.depositAmountA).toNumber(), + ); }); }); diff --git a/tokens/transfer-tokens/anchor/Anchor.toml b/tokens/transfer-tokens/anchor/Anchor.toml index 59dd54e57..b8a80f397 100644 --- a/tokens/transfer-tokens/anchor/Anchor.toml +++ b/tokens/transfer-tokens/anchor/Anchor.toml @@ -6,16 +6,13 @@ resolution = true skip-lint = false [programs.localnet] -transfer_tokens = "nHi9DdNjuupjQ3c8AJU9sChB5gLbZvTLsJQouY4hU67" - -# [registry] section removed — no longer used in Anchor 1.0 +transfer_tokens = "FiqULQWZ9mbWaPDiGsms2vLa6H25FCnrtS3sGJHBaCWB" [provider] cluster = "localnet" wallet = "~/.config/solana/id.json" [scripts] -# Only run bankrun tests — the validator tests (test.ts) need Metaplex Token -# Metadata cloned from mainnet which is too slow/unreliable in CI. -# bankrun.test.ts uses a local fixture (tests/fixtures/token_metadata.so). -test = "pnpm ts-mocha -p ./tsconfig.json -t 1000000 tests/bankrun.test.ts" +test = "cargo test" + +[hooks] diff --git a/tokens/transfer-tokens/anchor/package.json b/tokens/transfer-tokens/anchor/package.json index 5fce1099c..5bb46b448 100644 --- a/tokens/transfer-tokens/anchor/package.json +++ b/tokens/transfer-tokens/anchor/package.json @@ -1,23 +1,23 @@ { - "type": "module", - "dependencies": { - "@anchor-lang/core": "1.0.0-rc.5", - "@solana/spl-token": "^0.3.8", - "bn.js": "^5.2.1" - }, - "scripts": { - "postinstall": "zx prepare.mjs" - }, - "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", - "anchor-bankrun": "^0.4.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", - "ts-mocha": "^10.0.0", - "typescript": "^5.3.3", - "zx": "^8.1.4" - } + "type": "module", + "dependencies": { + "@anchor-lang/core": "1.0.0", + "@solana/spl-token": "^0.3.8", + "bn.js": "^5.2.1" + }, + "scripts": { + "postinstall": "zx prepare.mjs" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "anchor-bankrun": "^0.4.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^5.3.3", + "zx": "^8.1.4" + } } diff --git a/tokens/transfer-tokens/anchor/pnpm-lock.yaml b/tokens/transfer-tokens/anchor/pnpm-lock.yaml index 85e0185a7..20687d0bd 100644 --- a/tokens/transfer-tokens/anchor/pnpm-lock.yaml +++ b/tokens/transfer-tokens/anchor/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@anchor-lang/core': - specifier: 1.0.0-rc.5 - version: 1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) + specifier: 1.0.0 + version: 1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) '@solana/spl-token': specifier: ^0.3.8 version: 0.3.11(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) @@ -51,18 +51,18 @@ importers: packages: - '@anchor-lang/borsh@1.0.0-rc.5': - resolution: {integrity: sha512-17a+xOmvrn7zSIqlbsjqgz4f64vQEvAmZ7qyQuETCHSskC23LTtjRI0DqAl/r/vC6kosPJGWyOr9ddVIqUVtww==} + '@anchor-lang/borsh@1.0.0': + resolution: {integrity: sha512-kiUd4S/iGKZ4aZvHtX07vNiNnHa/mI/IHmw+0y0sWlvGpPsAWsLXXMrohII5vNCdgZrw+5vVXH9kt836yP9YmQ==} engines: {node: '>=10'} peerDependencies: '@solana/web3.js': ^1.69.0 - '@anchor-lang/core@1.0.0-rc.5': - resolution: {integrity: sha512-4iPy4RiEFn6obzYY7zx8IaGAXz2fvJ0uCTF6agAcUBjGNZeypfEb4ZZh6TfLnJy78Lh06JeB7XGqKsaBCMEmQA==} + '@anchor-lang/core@1.0.0': + resolution: {integrity: sha512-YHJQCJNQwF1M1M5VNNOj1DuR7B9v7f/6I9NkFYty7HAbpb3+1HpuDD7nOqI+X3CafXzteWGWZE2kn+Ts7PBKNQ==} engines: {node: '>=17'} - '@anchor-lang/errors@1.0.0-rc.5': - resolution: {integrity: sha512-kLx7oLGVCRhtWeS9PQWGkzZTDpNrGkiJQBrx1rAhEiFemL4YumhUuEbXaaEVuLBt7qZcT1eBPN4LQxYGj3QWyw==} + '@anchor-lang/errors@1.0.0': + resolution: {integrity: sha512-j3ymePewd9Bi6OcXATViRS0IPdPBT8qW4LVM3/hNePH/rZdgi8qDkToiDGuR1fFccfn7t+BrNGudHvcs6JWCFQ==} engines: {node: '>=10'} '@babel/runtime@7.24.5': @@ -923,16 +923,16 @@ packages: snapshots: - '@anchor-lang/borsh@1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@anchor-lang/borsh@1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.1 buffer-layout: 1.2.2 - '@anchor-lang/core@1.0.0-rc.5(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@anchor-lang/core@1.0.0(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)': dependencies: - '@anchor-lang/borsh': 1.0.0-rc.5(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@anchor-lang/errors': 1.0.0-rc.5 + '@anchor-lang/borsh': 1.0.0(@solana/web3.js@1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@anchor-lang/errors': 1.0.0 '@noble/hashes': 1.8.0 '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10) bn.js: 5.2.1 @@ -950,7 +950,7 @@ snapshots: - typescript - utf-8-validate - '@anchor-lang/errors@1.0.0-rc.5': {} + '@anchor-lang/errors@1.0.0': {} '@babel/runtime@7.24.5': dependencies: diff --git a/tokens/transfer-tokens/anchor/prepare.mjs b/tokens/transfer-tokens/anchor/prepare.mjs index 7c5ec464b..fb6b26225 100644 --- a/tokens/transfer-tokens/anchor/prepare.mjs +++ b/tokens/transfer-tokens/anchor/prepare.mjs @@ -1,17 +1,17 @@ #!/usr/bin/env zx -import { mkdir, rm } from 'node:fs/promises'; -import { join } from 'node:path'; -import { $ } from 'zx'; +import { mkdir, rm } from "node:fs/promises"; +import { join } from "node:path"; +import { $ } from "zx"; const programs = [ { - id: 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s', - name: 'token_metadata.so', + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "token_metadata.so", }, ]; -const outputDir = 'tests/fixtures'; +const outputDir = "tests/fixtures"; const overwrite = true; try { diff --git a/tokens/transfer-tokens/anchor/programs/transfer-tokens/Cargo.toml b/tokens/transfer-tokens/anchor/programs/transfer-tokens/Cargo.toml index 3cc201520..85629e982 100644 --- a/tokens/transfer-tokens/anchor/programs/transfer-tokens/Cargo.toml +++ b/tokens/transfer-tokens/anchor/programs/transfer-tokens/Cargo.toml @@ -20,8 +20,15 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = { version = "1.0.0-rc.5", features = ["init-if-needed"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release -anchor-spl = { version = "1.0.0-rc.5", features = ["metadata"] } # Anchor 1.0.0-rc.5 — pin to RC until stable release +anchor-lang = { version = "1.0.0", features = ["init-if-needed"] } +anchor-spl = { version = "1.0.0", features = ["metadata"] } + +[dev-dependencies] +litesvm = "0.11.0" +solana-signer = "3.0.0" +solana-keypair = "3.0.1" +solana-kite = "0.3.0" +borsh = "1.6.1" [lints.rust] unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/lib.rs b/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/lib.rs index 1c6cdfce7..c1c220219 100644 --- a/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/lib.rs +++ b/tokens/transfer-tokens/anchor/programs/transfer-tokens/src/lib.rs @@ -4,7 +4,7 @@ pub mod instructions; use instructions::*; -declare_id!("nHi9DdNjuupjQ3c8AJU9sChB5gLbZvTLsJQouY4hU67"); +declare_id!("FiqULQWZ9mbWaPDiGsms2vLa6H25FCnrtS3sGJHBaCWB"); #[program] pub mod transfer_tokens { diff --git a/tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs b/tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs new file mode 100644 index 000000000..5a58fa9af --- /dev/null +++ b/tokens/transfer-tokens/anchor/programs/transfer-tokens/tests/test_transfer_tokens.rs @@ -0,0 +1,181 @@ +use { + anchor_lang::{ + solana_program::{instruction::Instruction, pubkey::Pubkey, system_program}, + InstructionData, ToAccountMetas, + }, + litesvm::LiteSVM, + solana_keypair::Keypair, + solana_kite::{create_wallet, get_token_account_balance, send_transaction_from_instructions}, + solana_signer::Signer, +}; + +fn metadata_program_id() -> Pubkey { + "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" + .parse() + .unwrap() +} + +fn token_program_id() -> Pubkey { + "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + .parse() + .unwrap() +} + +fn associated_token_program_id() -> Pubkey { + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + .parse() + .unwrap() +} + +fn rent_sysvar_id() -> Pubkey { + "SysvarRent111111111111111111111111111111111" + .parse() + .unwrap() +} + +fn derive_metadata_pda(mint: &Pubkey) -> Pubkey { + let metadata_pid = metadata_program_id(); + let (pda, _bump) = Pubkey::find_program_address( + &[b"metadata", metadata_pid.as_ref(), mint.as_ref()], + &metadata_pid, + ); + pda +} + +fn derive_ata(wallet: &Pubkey, mint: &Pubkey) -> Pubkey { + let (ata, _bump) = Pubkey::find_program_address( + &[ + wallet.as_ref(), + token_program_id().as_ref(), + mint.as_ref(), + ], + &associated_token_program_id(), + ); + ata +} + +fn setup() -> (LiteSVM, Pubkey, Keypair) { + let program_id = transfer_tokens::id(); + let mut svm = LiteSVM::new(); + + let program_bytes = include_bytes!("../../../target/deploy/transfer_tokens.so"); + svm.add_program(program_id, program_bytes).unwrap(); + + let metadata_bytes = include_bytes!("../../../tests/fixtures/mpl_token_metadata.so"); + svm.add_program(metadata_program_id(), metadata_bytes) + .unwrap(); + + let payer = create_wallet(&mut svm, 10_000_000_000).unwrap(); + (svm, program_id, payer) +} + +#[test] +fn test_create_mint_and_transfer() { + let (mut svm, program_id, payer) = setup(); + let mint_keypair = Keypair::new(); + let metadata_account = derive_metadata_pda(&mint_keypair.pubkey()); + + // 1. Create token (with metadata) + let create_ix = Instruction::new_with_bytes( + program_id, + &transfer_tokens::instruction::CreateToken { + token_title: "Solana Gold".to_string(), + token_symbol: "GOLDSOL".to_string(), + token_uri: "https://example.com/token.json".to_string(), + } + .data(), + transfer_tokens::accounts::CreateToken { + payer: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + metadata_account, + token_program: token_program_id(), + token_metadata_program: metadata_program_id(), + system_program: system_program::id(), + rent: rent_sysvar_id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![create_ix], + &[&payer, &mint_keypair], + &payer.pubkey(), + ) + .unwrap(); + + // Verify mint created + let mint_account = svm + .get_account(&mint_keypair.pubkey()) + .expect("Mint should exist"); + assert!(!mint_account.data.is_empty()); + + // 2. Mint tokens (100 tokens to payer's ATA) + svm.expire_blockhash(); + let sender_ata = derive_ata(&payer.pubkey(), &mint_keypair.pubkey()); + + let mint_ix = Instruction::new_with_bytes( + program_id, + &transfer_tokens::instruction::MintToken { amount: 100 }.data(), + transfer_tokens::accounts::MintToken { + mint_authority: payer.pubkey(), + recipient: payer.pubkey(), + mint_account: mint_keypair.pubkey(), + associated_token_account: sender_ata, + token_program: token_program_id(), + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![mint_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify tokens minted — 100 * 10^9 = 100_000_000_000 (9 decimals) + assert_eq!( + get_token_account_balance(&svm, &sender_ata).unwrap(), + 100_000_000_000 + ); + + // 3. Transfer tokens (50 tokens to recipient) + svm.expire_blockhash(); + let recipient = Keypair::new(); + let recipient_ata = derive_ata(&recipient.pubkey(), &mint_keypair.pubkey()); + + let transfer_ix = Instruction::new_with_bytes( + program_id, + &transfer_tokens::instruction::TransferTokens { amount: 50 }.data(), + transfer_tokens::accounts::TransferTokens { + sender: payer.pubkey(), + recipient: recipient.pubkey(), + mint_account: mint_keypair.pubkey(), + sender_token_account: sender_ata, + recipient_token_account: recipient_ata, + token_program: token_program_id(), + associated_token_program: associated_token_program_id(), + system_program: system_program::id(), + } + .to_account_metas(None), + ); + send_transaction_from_instructions( + &mut svm, + vec![transfer_ix], + &[&payer], + &payer.pubkey(), + ) + .unwrap(); + + // Verify: sender 50 tokens, recipient 50 tokens (at 9 decimals) + assert_eq!( + get_token_account_balance(&svm, &sender_ata).unwrap(), + 50_000_000_000 + ); + assert_eq!( + get_token_account_balance(&svm, &recipient_ata).unwrap(), + 50_000_000_000 + ); +} diff --git a/tokens/transfer-tokens/anchor/tests/bankrun.test.ts b/tokens/transfer-tokens/anchor/tests/bankrun.test.ts index 175cda746..a0bc25050 100644 --- a/tokens/transfer-tokens/anchor/tests/bankrun.test.ts +++ b/tokens/transfer-tokens/anchor/tests/bankrun.test.ts @@ -8,9 +8,7 @@ import IDL from "../target/idl/transfer_tokens.json"; import type { TransferTokens } from "../target/types/transfer_tokens"; const PROGRAM_ID = new PublicKey(IDL.address); -const METADATA_PROGRAM_ID = new PublicKey( - "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", -); +const METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); describe("Transfer Tokens Bankrun", async () => { const context = await startAnchor( @@ -39,16 +37,10 @@ describe("Transfer Tokens Bankrun", async () => { const recipient = new Keypair(); // Derive the associated token address account for the mint and payer. - const senderTokenAddress = getAssociatedTokenAddressSync( - mintKeypair.publicKey, - payer.publicKey, - ); + const senderTokenAddress = getAssociatedTokenAddressSync(mintKeypair.publicKey, payer.publicKey); // Derive the associated token address account for the mint and recipient. - const recepientTokenAddress = getAssociatedTokenAddressSync( - mintKeypair.publicKey, - recipient.publicKey, - ); + const recepientTokenAddress = getAssociatedTokenAddressSync(mintKeypair.publicKey, recipient.publicKey); it("Create an SPL Token!", async () => { const transactionSignature = await program.methods diff --git a/tokens/transfer-tokens/anchor/tests/fixtures/mpl_token_metadata.so b/tokens/transfer-tokens/anchor/tests/fixtures/mpl_token_metadata.so new file mode 100644 index 0000000000000000000000000000000000000000..fdebe231b08c4fdb131cb6fd04099f6b8787e747 GIT binary patch literal 793991 zcmd>n34m2cm3F-cH$Y5mmb^eZiFC84O&hWi>~SGGqA_H70izKfO@!bQnoa_j8x^t` zf|?;wBZE$a~6iUKRQ4M)i5nRqUQ0Sd9wRlQiAPbE4~zCr1U z&lX7~Z3h_7FiHnUr;Z-Y1>z=-T*oof_(#XE(w&`I=1#+#h` z8;RfbQ;F|d5i^~BHk>GM+^ppqH%qy);5~Jm zmcLE%74paNk71M@C8|A=4!znGw2xe(Gr9%k(>*BJCMZ)%0niPaUTv>&Que=vSYgcK;n5fAMLM2H6Sauk&2#hn=23?Y}o`|Gi%O zZzTN}{ge61^xH%7=liS3D;^{CCT$|Oc#O11(zcuB7>l`eN#ibon>Bxr9EP4 zHp(yU66*Ud^t%eP&Gu!V>isi!MDa1u5@KrMYjGxHKE;&=^Y?!3* z`4StRs?t$COVX>V-CeKyF~dVxGh%>HP(n))tKJXcAK zdOjZDiB) zJxo0z;w^QzL#yDVW}&p2fs)T-JVDQTw`)9#BZ8iT)*`mae*% zlb!e10(#$0xCcw$N}><#IvDzXALWh;eM=65KFDvvAnAM6QIg-vfWDHrf3A>!2@AZC zAIln6$X_A-G=H`9)BHH;r};+K&_ezc>8JVUNI%VACH*wtB>gl$LHa3`=YE=>DE%~l z4fl{jezMqu{Cw^~h5Qtr0u=J6aStoxpX)$cA^$w?frb2;j?|j;bDwl^0FnQ$KI!N9{7Zv$)H9yzIp04YzA>!l zg+BdP?+(-3eERkv9r!R$h}?Pp`MtsO$erQSUmc{Q9J)}%y;9`$(%^aIrulLcf^?KS zjmzP$lsi829F{S1ll}7_XW9XnBc4?_R~jYb2KxOnO0SX}5z=uX=e|O4Bl8@V-t04;?+e-k{5J7(Xs7V|^$fp_{9OD3l<&?w$H-vz z8P9LYJjcib{xR;Gz3Mzx{I1X*;W_d>_c_4#XZCx{o>!&0Tvf#2Lc2SG@W&luKMOfx zhywgHBE_xLIGlIvCW5_PUBua4wNql$KlX1aomEjg=j+$`(D+qa?rw=!k}9L6tM{dN z9^FH9EfTtx5FL0Pm&Cp|G)q2j*KbeDee(>mza=TxaId5%Ckkxx8%N0Ym#I<>$@wy1 zY!`KN$@!8$IbZ6t`D1c^6PHNN7lDG`uLtc?RsPJ6!}C2PkL@H(jMMFn;=dMk{PzC* ziBi9fYesKe)_KB-LPuQI`GVFH>G%x%NNU&gc?KykKfTiW^&lh+>qSWenZYp zl!kUkT*%)_m=UjWZ{~Qd+Vk7gp5Lza{0`DNx~UxZu%#^Id)Y1)@>^XCr+>gbm*Wq*(>eZ-!}wFkf7m^b z@~FXXq=>K&f% zaL?!XlMW+AA^$1&4;+8my@2D-IE*ZX{Ab;ZIDXi@nB%IO#qmyeKF5#nNLR>z&Rxjx z=iNmdKk6>#_zUh5j=$(G<@if(Hpjc%OE~_ro5S(Hx|eeNn0pz=UvZal{8b)d3;BO@ zmoxk|H<#nx?h20ook!?G{y*GR41e8S&G9$LR|Wn5>8|1Un{FP*-*WRg-s4`u@weTz z9Dm2XlH>2XS8@D3cOA#ycdzF72W|n!kGq8&?{y`Pf9Mu*{3F-S@qf9+96#Z%=lI9& zH5~uME#dg5ZYjt6+zlN6jK{G;{^#zs4FAHtj^kgt*K_XnoVeWGV>$qlbqu{09%iq(<)d9)_KW+;2U6 z48y%4)}xhf7`<_oss*NhsQAdpB_Ge;jeqR!0^9&7$!S%U-R%-hQI1zj0}-` z%)=)!{ACZro<;6U9zL1jFL+q|zt4O4RDS-5hhgs`SM~6ChCl1!CWb%l;bw+E>EQ_s zLsLXQCNlgl9)^94+{ZjTnc;u-FzjXI9`f*1hCl4#X$*hR!>2L4)x)r-k?ZmBa~a;^ zVc6Hmb$Pgz;j)KeZzK1951+yCdp$gz;rDp>Ooso-!?4GZd$)(rX82tmhJB9QJ3M?Y z!}od^_BwL^=;8Aie!GWZza#fn4?mybyFCnh9=W?b{0|J@>0#LS$ldPY7c#uo!?5=e zkM7cbFJ}0S{`oA16Az!yaO~j=7+&e&3mLxI!x$eTwpN1wVum~XbBq@eTRVAvDZ{V# z&oO>PY%S&aOBlYvKgW0yv9*=wFJ<_8{~Y5>#MWA#U&e6BKYuyH3p{)|!`FEj<4?q+ zg_OU7;aB+QS28@$!&fm}^f1P!h({|ak0%k2W&&fpig>gW7?>g+4F$&d74c{(Flvr? zG!+=*S;V8Qz^`N&QWhBFTg0Qaz~C(6(Oh7RcM*^F0z(oJdjkS5WEff{FeDeTHz6>_ zLz`c2r{C=iL(Ank#>a@g6@k$*5qmQNW4yF^D9SHk7`;@UWBiQRTM`&8AF($j@G^#{ z(qDmJ%kX3mV|7r5IvzK|_UA%Bs(gW-$aog81{ z-oo*vY@rJI*=`-fFLAJ7h5Q`1p5vFYg)8J==HABeW$x`9zueu!@#SnG3;DTj1H)Ii zdpW++-N*4&Y+(zuPV`QOi_BAj)`{+Ccph8m0<9BmWcU^CpE$nOZQ}Tq?mZm8%00mG zb?&_!zuLWz;{`lI6!Ht*W`;|y%<&>u;kcbgm_mNB>t^_Rw}s=^xCc32!Xs26ztr_I ze1qG{@iO-Tj$i9O$nopkhd6${`!L6Ea3A6LMjjyx`Q>gK!yWFQIbPvD%5f);u!a0h z?&A#K?EZ!0Tiho&Ude4+$ggrc7>?a1IbQ8P#c|?3&GD`7GaSFseU{@lxraHxeAxlJC1 z9!74XhoO&=yWhjm%gDXc!|(ticb|u$r;*#>Vf4Ys-Q!{CZRFnO;de8<-ow!2$gT4* z^f_{G@i6o{a(8$b`W?C3JPbXL+!_x<->H2)484!stsZ_q!>c{Knc-C)Mt_LhEgnX{ zh}=yc?qYa_htW?Wx7@?%FOhqLhtY2$_c{;vFucse=tq%T>S6S!$i2qH=vR?j>|yk; z$Sv|P`dQ=_dKmpJa7}IzShI&hmo7_Vf4qyUE^W&%g9~r;g2zVrH9c^ zBRAK>=&!WC>|ylV$i2+Nu+5R1<6-pU$j$aJ`g7zi@i6*zyZa) z{vNp(c^LgZaxd`kPJ)-@WL;>b#)aI>gGevrj(3l6{A~9*jvL(PIUeaA<#?3)0>`7> z7daloGZyUA?P9p#zRdB7?q501@r)(V3`sr3?up3 zdfX_2OS-OC%n8SF*M2S+SN2Ky5*Ooj;5&bXdPZymtNx0c&-fYXy}#&N#n zl93Y67|wC~l%W!z$dMoa>(PmQIILq%dy>{)y994sk$UVr6rSJv+tiORJm3=);Q2Wt zat`a1d4g?y)BFzGua8Fyy#^^~q>F}P9yUBCXz!Gm$Pwv+0St>0H~lYHYM+Q$g!K)Dr9NL#s|rS!GlFLc26AdJ6T zV!tkZukh7?!I?tRA#pu4faJQ@4pg4p=0cFA*`XE;Fk(7r#( z>_44HS+L(QJHQY5FAZSe-%k7@CNu}DQv~l}^M^r_0?vyuf7%}P_&Xl_l_bCIqoDp_ z&oG~x{?2^vKeaxe51*EMM%(j^1Mr#c&yYJ#ObujTmy=$2z02rFJ$yet1iq_6`!xuB z-#rAr1&2xBzaIkM}9&@QY z{cmu*Na~9x5-~`hATZ05e%9jUY%W%NUdRKRjBmq82}@mcv| zo(fU0dXVq!$HI^LD`_G5UrImfX(JfVucJ6(F2r9m{1Bnxv2wr&>4!Y(N9OAE1y2&TRf6ur2=DToDExo9>N%4P@V&I>d!T&@Z z{3vJo@-hL3aV@B#U}CX;Ve zkT0#jLHFH9>3;WU-LD>@`_*G~zdF)=>Y=(%Ei1Z({AhO;(GNb(&hP>LZQU_!&yRBY zpP8?aU&w&=75k)z<$(`;eUjz!yFU4lema+zbI2iH>OO?`mwn`j=Z5b~gwON`>9e$+ zM>FZmHT{uH`esdkn9|Yiy9qXYpzG6=ZtZLBSSnE_3Wc2b-i4gJYg3^4AS_=YH&o7B z&$Jk2+a(jvx|(ih4J?Ff9!DKN;knwH$5lRlz#-%UC0mR{sOxP3BV4Md1gI& z7RPdq)#$VJY`{bk;iMlFLOz!eY;>BO@q8|&gOATsMaCD>mumV>N(bL-2)5_Q|5-{m ze8>+wfb>WENq;OzxB9n>d36Ok;6FXU-=Ka1@Vyp#L;1$hb34an^_o4dH;&AwayFjT zt8ZaH_1&QLfu3xA_3&)y2hYO8#Iv&>Jo63{PZPC;wNog^mk$CD$6^fe3OZeY`Y+R#NYbj8%40;3+w&lH~Z#WOm^Jz zS^vw{i~fZESIqzQAc=?jg&&WYo?3fLuW}HbVs8iXS8k&EJwNAyYw}MfN?aU*UM+qA zp*xtsh)}Ti4{)v!bR^B3?D?oSkM4dSbs!D!FGyrOkKUGJ)z zp|s-0#nl3SIrk8pOA2`2dHqc>elJ>l{Y{CUFMQ~Hq!53NyP5ao+FcxDeWJADdd7GC zlK6G@p4LNfB9VX2PRXzD)gb@P*LN<*v+G}fW9LIkf6}&t^To}0Li$;e810L72k7^^ zpM`Vqns1BLU%g85H7K6y6#}oMdd{YwOK5O7p5n`mPi@aI-x>70I#x zL4S3jz@UryP&%v12l6%1vn8Z|h%Z-pSi9o+bUe?AzF)5Lc}T|xPag(x3e}q>HhpMN zda5ell~m7jDGTsHq?ey5`KwoJIg%5Cy+4QiEZ<8ceF^c&@|_{Dr(>eP$lpXi?cC_) z+TVLf51=4bZI=dQqR^13@1b@{xAoJNR3FPx@c=K&agpY`Mq=b^qMy(g#Frc2I{(4* zK5{HkCJGPbB=&S^`!o#YWSvwXDufQRL?Sn`K*Y@#HuXC~*vl@EkS!QPL2Nb5b6et9`x zEajosEXNB423;&i(|_e3@A0Tf$x}0K!Y7<9%Mgl**-l@FoT=+v!b_(`>+)8@R z?L&CDA550#4Qdyvvjl!F%AcS+>Jar-2iz*fnRLnsV` zH%s_>IdXXa7W+TdwF1Lle*d_fOV;mUyBgZlJ;>LQ=6l~?4<5Alvh19DA$N=;5?yi& zMj;x131C>yy_?@zUCxg^y|C}a_xBxVVfwIMJpAWrI_P^3WkyWo`1NVP9i)K9XK|P` zM7AEIALBSe_}5Czi%$o27zTqn|V8~<2t zp*)*Vnx1R_Oxk2WD7jYlhpJ_Hj(G>xsLW#_m;B~bub>a;m%x8{AP=k~ z&DZn?g7wZ2A7$b9xcb9)ae&X(9sPT&6NPSj|J2r(Yy46)8U^gjA`C?Tc|ma zQ~r#wd=ppa^~v6w9Soi+As$i76wkSWH=a0+e-ws5isG-&r5Nq-hCtqNv+BKnZ(0!A zzHIs)wfJ3eGovHFbFbL3E`i~1!`=~TuC-44!;hVnu{Xt#4^Ow?D-MzNNZVD~)7F)< z?HFtSwDsI%kD+>bMfl%h1(K4{Tm#``Pwhb(tZ%8NmS$9Zz(77!`XFi}a zX%zp>_F>UI)p&M^e=2r+`o~u z=sf;*&gP(pD2Mjln`wt{kfE{jN_K7q_F?>9(kpdE?B1SvR6kk*_edbrTbJr@{Avp7 ztw%>PHuawd)2`ih+SSg9hw{Muz^`izLLQ%kJX86dsP7cKJI`yth|f4(-` zKePQYXh&+2BWg#KgZvHz@$u!-ueaE)FNfqF{X6{vX363$s&n-k0;ipPv=fXY1mj9>ec9KilwH zd!qdGRq4Fd<`H4}9xg9_Jl0##B*|(W?^laIALj3+{NXy!PJ&_Q?xAwFZf%F1->sIn{%DF$aC`(tlwiD4s@EIZu&shfDyuakiVpU$Uyawn{coc)C0>k*m^LJKmgzW{)g00 z4%1uc0EyA%@28j|<*G8><$1oO2w$xwL5#;*1^dzHTLUy{EP+1@5}F-!)zb&Rx6 z#J4U``!;iSzE9=F^z%}ByoTb=Mme{HbyHdbcb8JU6X`9Ak6`*o>t*5qg!`xe#_7}P zZ;HPjy^w6{81b{_5i+iy;x$yRvqk;X(ZC}2QGkxxd^)cT^5G;xZ9e6P_(Rrt6jK*v ze)m({*_iT$b~5?Y;;COB#Fr-+xor%*6HyiSub|o&hv-u#O-GNc@Y<9K8u0< zITStT5k1qXDClAP{|wOc>BFRFg3@z4#m|I%-X78;X2h?5#~soR@d{~|@j?IQexvOV zdEuw+gZOi%ozmb*o6K+GPQl~vi&Q_z-xt|QNGK$FAFOYG>cl9SEX%ZinX|M1%l=(O zVQNR{1L)cs@;6DIW4uLAYB)<^8()$CJK?xAQ=ez$qW2-i%KxdO#V5f&81UM8T-ygr z)~Y_Mewv(yIInAL@q>XZ%<@ z0RD#{-OexAc@gu^3&)IQeA|f(V8*=W(a(SW^GKvAcZj@A*V}US#V<^1N5@hUJ?Az7h<`6p|&9FXaE&AYVQH zQL=E1j0++EAN;@vJ^*YKFM(mbzLyve>#<2Ldc;J1IgjphmZqaaTrJr2kD%= zwfjJF_*sz8`*k{w6jXk;{{?)DXnu(KB3jXR-iJVb1j}#jFqrzT z*80%Hto#zHkJx`k>bpeiL;G8O;1BI~*!-y+jZfQ`Xm|-BqhNA@e-9D0zC#2B7@j?2}=?7o#2=Pt-Oa1ovBQ4PR_E7&kX`A_1aGtbG=QwQV&6Gb}f1FO|%E13m z|C#1gJ)7w?I?k<~#P7qEdb=5pxAt-z;+ae3LOk0DFZ`dm)WLyo(q!77+%%i(Z(o0r z#H(j<9G8VY+~bY_`&pnE`_;e7>{r9{0KW6dw%Ix+^5cCy+s_E;nx*_KrgL}^zfD4N zD+~Rw$6QYRP+Ld0dy_(bfXC)V;A^4sHG=r^^3IM6Wg?0Ke01!Om_Nni02yTS55dnH zzDMn|{s8w&v!niejqMlPcL^$rm*@}I9f0TZhv7faz(&FEU+eil>$k?I?StBWf$^QZ zMaLx_??ZXoy!IH9=h5K%@}tD}`#<~l;rpj_(Bx?FJ^d*0ea6ne58u0v65pea65sRx zPI|ueDDnNf?;f50{m^IrKJ87W$m_YSgPA=F?IO?9&t!AMcKLCl&-%yVlsoPS%k3gP zIFkClv*XCh-TJvBD_4Bv$jTib@MnID-**hg0ctLP{te^6bE|26hf{8JP~YLS-`S6* z^&L*R50d?|_A@&D`jg&I0DeA43r9YmuABIE9GT9$sWe{Ur>(~{lv2H1LmMgKIL7`h zty>^eX&gle$K%phF@DPWlKGWMKi?NA9zz2>1*6Z_nd22Qj@o&1@bO~uBk*1+#?kcs zPI=$X)_IWcPhUv!nOp|rS9cSBTNg8W22&pNquvMVl~+G9*6*s=_pY+?w0UVL$A^F~ zD@QwjzD)MR&HqSN%R0S%M_?-XSrdq^Vbng&6yy6o2!$cyCwAP?#Bj%*cuMWHh9ei> zEpm_FLJU!e?-B(`R_J%B7U_4X?)$0Cm-3Hu+>8^ zdFlFkV5k1O&bi!J{cp@?EKrrMbrBIl0op0Qj#|N5Rv#TK3IDzkts@lsFsPRjfZjA74rJ+j@BR z-T_aq?!zH}G1w2Y{pg~-ub}cw^!)@o|ATTrqxA~wemJ!*Z`A`B;5^U9c?pG5^~^&p{VN5^vqXvW$D=+)i;AsF8UuVw<1Y_rc;` zU2n_aGkY7}`!=sJec!g2qlzim_d!bKFLS-^jmtSMmA|5JC&wLSsi#QyOhB}W+E2ee zdOxG{a<%tmI~&(<`J`o);uZYujcXMa{Oyf*NWS$OC0@Nj;!W!~#ylPrCyl)V>-d~( z+NSw7a~z&8fLuep+YGov=&X0&*^P9*ARM<=A^!@=kM{Y)$Q-RbJc|>;{eAdXSg$RfuUq|qv&UM9Q;oH8;8S)GMZM_8ek0W2i-iI?eAbsQ?Y5n+q(c9!L z!f)ih$nxx%C~$}F6BdV(gF?aVguS0p@cJa{3$~wR>jswJ-Y2qsT-aT-E9iLNpVI#2 z{Wl#S!*E0BC zxLfqg-kW&gg|fc`xk4lZy*IHxl6@24v3{F~_^98(>JffDziR9M{k?zZ^}pskCkcXr zy&qZcJUrxu^FbRk=cTb;k*+66|Fru=lNRZ>-apfOJ(KfPPsVb!efrBr=$n`;mhaf_ zfIsceYFFZ|+E4G5@^MA$?UMS?u9XR}Qv%z*MqC!VVS1iy+R6G^7$E|U)jrw&P4@h& zotKQXjN7>AhS8lXFV{KEbE$ZS54f&v1H3AN-ZjPOYW&w+?-;#PD}iaGPFV zzN{a8kNgt&JA{V()}M1eJOAIGUWWA>p1Wu~j@(wMX9{Yg`czL!YIi{oIEKBvEcm`w zc>mo#Iu~R1!rpU1{+IQW|3{SH>{*EC-Jc8WNrs+|fF3mYK=gd`FzMOd4?S=FME~?; z>+jHUr;r!@7>NJRQGJ*%l8F5LHk8A|0sY<&F?q=Jhvq@juZx&~9zq@;5Ae}_$3B05 z?eh`JAFmTT1wJg`XX{!q7+E`P@3FM6AH4tgR~p~oeoi2~ray(@!cRT@xQ{YH?|J@4 z@z=OB=xu$+Q>@#;f9ay}G**Af{M~x*7v4$hC4<5D z)kzI*|JZX&w`o=ZpVRS;%qry{H1c7le9?!yA|(_5hXB>oRr*(Df4-ZA4#M5iRd?L0)7&mH;46OT{>wLKhx8# zel^M;>iwe|xxDzR>H9|;YvjBKd{&qZUXKIcknchAD{a1F^qF6pGz$ObHzrC~77ysg zyb1W)pbxi5J*F474{!VF@W0_3gm~5vJ@CWlE1pxD2~TD{!pleX)%UZ0^;jHyqi>*j z-MMx2*v=Qw_cfTIT75qB`)*l%zJm2x+PnYv-TLY?^uPivr0Ji1Un|t7ooMG^eIt2< z)}Zvg!9wmdMq~3T%maYBeTrbW`K*2C8FCYS-oyG-tIxY@^i1@5FQ@zV()S|=qtEr< zr;~Y8$S2SH1APYH(7!FL&pWvOqwyZyUb-i|y+)s9o?j|IDttmn6ikloC(83f>!*xg zgVE0)5*^l`kRSfU(bUVo(LB%QyZ!5>y@#pqo2h<8{1w{1<7QS5cl=AJhdF(ZtcB$k z>Ld6vIi~t3`39?x$VdOk4%h0<(bUhu=;KvKSs(8qJ+SsS`(%1y>vE-v=w;lsOZveK z(X)QP|8f-U=i4*-3Hhh*3(q2m##OaTsXuV|_H*l?^mM5D1F4=u;nMempU3os?U&Wp zk9?f&I6H*h?5wey6B+Md^)#&iXzFF^2h{3+e|Gb4{}^WC8L2)x$rBh~ZCubt7v@=vD70*I}a-!6i zT#}CeFc8m#ot~P}dvIdk>pmL#j`ifh+v%*nAKG8o!TyNu*Vb8AV12IfkHuf;Zyn+9 zWsl(>GktnbPuQ>f^N%+jWqtooI$Ke@PA2OHHXpY6ua`@I>t5pSx+C#lzX>{qr~WbQ zZ=(3$tyr68gB5%f*%D9M`Pl9;54C$6U?z zf^P()CmBZzJQO1S>NusZpIt-8n#}qa?)@q0xr1Wv^<3WMS=uV+ll*%+$M9oU7$F;Q z$hV4;s`p8H>%Bq{*3FQCxPg(F_-E=L%N#k7M`(8=UoS?$8fY%Ca=OALcZ$j5wN^4~uzP(Y--Np~DV>~vGGyT49wCH@+6>Iuug zndmZof&K|yy*2ghrF_}-b;vcxc5FZAw|$3n{a@Qj&tDl`Sv=s|*85)o`>_;U5Fcts zY@a{w6@1p;;>v8PceLi$dv|RA+Ri;%I~Q^XIKMBqNDPzzzN?l8egym8tIemZ{!o6V zUvJC2AFz$&1^FEKE%wvpUcdg=2U2?pISjO~&;t3?+_QTb)9dZ342y0s_vdBz6E0=D zDtgxcx^3V61TQZgPm&Xxn4ZY}1IMAfc0!L)^C$UD~Wei1ovu}n+pe25T~93%83mq`9j9UnWV z2)@n}1;5ELK0)%gPSW{@(ih$<*-Q5yn;bCzm`;?$Bc;9usm8a;xcYp94?Sc255MzD`iJ(0Zga6n3KGi>a z&&lw{r6$US_xfaA&d&Fs99XdDzzcmcKhxU5@L7LCIegFA{L=!@u1N1d90lNkKRAqj zLoVij*!b@8PT}nSoI3E$r6lxkv>@tv9*ujZ&vuUA&efuSAV2cG^%U}R^c*$tfYU_Z zle6zR3{>wd${*G{{t)#dKkB_TQ!m=1zk2PyzgUJfSBykY?R)Q4O>Za=5(?mh{<+qx z@mFBP^EADfI|ZQs-s1Qs2K~LO&=1rAJP5YmZ1d69Ns3q3M_O?yjOIgJL_<=rcAcm5 z*y1s0S?BJO&F@*$!KZWe~mUupKzxW7v4!MI9ycf13IEQEFBnHaA zImnOp_%q$ZgqYOspuLxvwCVg*zi*$k?U(tgzDJm}?Gtzcs3E#r_A(sK5B3s1;C(fX zccw>xp~5B~-%n{SiD3QD@>{)jkF~vzU%iX7JDksLqMy|V6()J3|I|A_yo~0*{<{im zCBLnIh3}RA8u)}9>i^JA*hiIzy|>&fu$^a)_57^wZ@R7)cZ=M@`^D%uUJai%{^Iq? zCaMo|!uPCA4)$KFy`N%ovhm8_SKI+=#hx@#Z2cbi=74{FZubO)eA8>Do^Qin$cbK> zeah-(JW}U#IxgG2#^3|}2=^)7g9c$OpZ%`_mUp;>RvIU*aCB9?ut? zC9v7kl_VSb$NFESfTxJ9U)lY-=pScOz;nb_-tw&^{NT{=+xnZ`Pk`sp087VuNCO4n zL%cxP;dPQ61*9WBL(@U$d6WkGv!CMe)D8&NuJKu-N1o3M?R%A==WC=yamCi*WPLVbYe4;Lh2RPG0yQLUtAs!0t92s% zpkVLep?#1tm14-u%CDqElz-uvQS?{FeWtrv=r%n_8vFk);cn2sg^N2|CxU!g&ZHD3 z=L-m>t?SvkMUn0qN3eAyTL%p7<3`}u{s=wY9oS{;H=rKK?K6ZQdMA`K+BN;XcbP0( z%JPcMPPN#2mgrg1vWuVl?;YFvv7SFNdXtu3$!F`iWLM#z*nUE?db!k7miD=B?RX|E z?ofTz^>VXMem!0Nc>i50$v+|E0T*~+&_iutX7JBWz*M_x1k9~J)2{qnK zO8Sz<)^A=vy1*I3dRZ^5KfriU2;Yl`sSWdkPP6Br_g2ysyGO&$`}a^8%64!G#jt1g z9(02$Rl^OGNFlyY;-p#P_&&2c665_d6v4g$^dWLp=6?z4FYv|_L=NN6lJfAUkk7tT zXEEqpMGw4vnk@OvZ#MrTJgLLt0(0k$7g??$|Jc} z_1M0nuKrk6rhU%*A(Y!sv{k7+5aP8`uiY2aq5WbW8Ar66?PuA23dLb!AIDoi)O$L- zAG3(jy6QV5Mty4-j|hNFI^(td%Oyky%VCZ3zfj8g_l3=mDogt%BgH>5IaV z1EXHBXwS`WL;CJM{EPe}_hZ&e^DAszuyNh)3x465pqB8KIr8(c?W8BDANa?S9vOYf zwL))V-?i8MPOE1np?f}+ga6&fA5g#E<`v%l>3tvZ6sh0zdch2VVRsJx?QeerMA6?c zPK5qcGG`a_Y2Wp+c8|5)?H;0sE){$>-k3krLwZ5%9bBOK7n~>giu!$Ly9da|OY{TC zWdV#31)gUF{+*>8pM`uY=d<@Ns;d~}_gGP{(bGdnnU1yc+}a7_JL&`9ef&JNFXNjv zzZ`SnaWeGx7HEHgA4aI0`D+cD-|RJ>LlZ0=eD(433_qp!X;)3h_vNs|)r4Jt3t1AVh~ zox6aPg6Xf>QPZ!6sq!52O^hDq4~Fxn60LuDK2*NrDF6Q89su*7;w!}Ow0jx~Iq7)j zpT$M_PB!cyB-A?k1xx_9577;PqVYB#ThPRh*&hch*U{ZC29l`r?Y%U;D04a>+EVAeqr5v3|ea>a}zG<5ju_!cRhnHcj1U3aBF|GxQ4eBy-fRw{7Hh zPFhs|%}%#-H4gfTdb0h;>$`sM2lGd?AMo#|o2l^}fs7CV44#KTU(Sm&vOYi&+#*UIki*Wj>lYne~`q={|HXo8*t& zSk7SMWW#NeKb|PD`Cahq-%J6ih%didp7)TvAYY7E=r70@w)=vsBwxdY5+`R#Z1OTc zJ8~iiOK;Ty!{ldvX@m09dY7ED0l#PmJMYknkJM1Gbz1X3hG{z>3LE!q9;;;0xWA3{C|)G_G2WqO8*h@94gCDN(;yY1uf!4S3FvJdEeW6t zOzc(&xe^Gwptx})OTjFl9+wiks@2bMKv+>`?bIAP? zdT#RY_GbkpQZRhuCn^kN6zqFM52+q47$fP{{;g-8%n7!x+(Yt&UV1q+Oa55Tf!RFI z{88&qMsLRi$)B|BVY%4+-{$?`<1xCo-uh=DH_{=ao$o2+WIXZxRqda@KTYM{d4bf^ zsd{JnVD>O_@?ATl%k(#-<5NV3A8$(;K2?tK7HO{r?T@fuptn=yY4dm3KlUTf6g<}7 zI?spJQv0a>Rn=dKE2=ko{s?k8o%&VWC3+TDq#qbR){n+(`$g_OqIddTF!KlP{IVan z$*yoeA0z$2);X#t2%YBlVmu7zZ`JAYykVBaF($bb7U+DiaLgoz&3`q&wTJRSe=MIp zUrG2$wb;&uadx3RxAAx-;ioK~js|^h>kN1f)wlF<1oxRQX@2;> zp}jq0ITfOS@t@~Qvj9;&)Gi3wbt$tWONc3$gfD4)J?+ba|Hz%nu9FHm_8)Aoqm z*QNbbU$XOO+Xo2uUx3&8XZAV95y;oZjqw5A2_#Su1G$=?vq0My_LJq=%;dTT;}^&% z;5o}v(-$n{WS5nf>05R`2zvbx(e3wrJEXkz?{Jt8Nrm7L_Tp1GNFn1>?&bj^QDCjaTkuk8@x?Vx<^ ztEUNnIu4+HDEmS4m%@6dQ99^p{u%l2+^gZ&K+F5;Ir7=~hWh3!UF}p~1r)2cG8}>NJ|A6LStoctw z{;i5{1nD30tA587sV~Go68&JkeDA0~KCC?Gd0rp=Cxc8Oq=)M(N&Tp28~sGNA*}!6 zNN44j>YtRO?;^2WQhm$Vdvq!ae%&c+?{6Qxy}#{A%yai}yBBj}FynP%Z{zZJL?0SI z$#GoP@3}R~Jq>YL?h{QK<$me7{9Dbxo8ykM_|2WRzqmr_E=wGa2lxB}3+_> zlb1cW&~cv-41DyD&(R>p`AJR%z3-^yy zKSH`YeSaW>Lm}iJGil@B_)D&pakTmp&Yt>>QxqPn@mh&N$0Yh`^HuOYj_DBuvEGMV z$i0*c#O+!>-~)1t^*l?sKK&n*UQ+vmbvE!7IkXz--PZ51T(a^vJfP#3zrlMNV!zVz zGBJ)H+$VC?eQERG3PWVVYvXJdKk)u#X^3~8gQjD!f_YT?+SdZ2iLIaVmZL6(Mpj_2n;YXycpzex2JoP3Wv#B&8@v2~YHMeJ^S%a??&ihRc< z@#lWDeeHZtm+Xt%`Jaw%Y46e&Dc?R1r%H*gE!s}=3JfRb9WU`zu}7VkO23VG)r0h^ zB6#dQuDDzEbjyB`^E~yxE+xh&*uCuSQw5LB2dzJ6`Ay{}eyZ(bCXN59d}}=|pA*>L zA8Y%Rz}?dB$()Z0J$k+5&)PmlxE^^Y>z#g={cfoT!d@ ztw)O;2>aJw%5Uq`$VV;#<&%C4`4uZE9f_VpOIEKFxs`FG7k+$rzG!(JdBr`_uD1S({b=+U$fJc+y;Ppd^%Qb5 zd0a^6HOALMrDu)OGhbohE7tPvcj$&$OEIBO#BVy}w1}4!<1*|KYdeIHhl+(5LfR8+SrJp=U?ZZm>*{$FIl* zvF~=Idgt4r>2uygQn z_pQRWoIx%~SGxj_p!Pgd__2p&W<(74_M85jh#(3pw%c zjn884PfWk*kI@ymUvv6E^4zHWy`SbACH0Gnxl_d+_4aak^PkMWtmju6o`3x=@JKo6 zH~5YC?Ub~glE(RrH)%Xa@tgb?3asZSl9r1!-wPzYYn#Arr%Rl@|8NFXMjUfY+6 z*Gjq{zs3C^x?au?N|gr`|7MB1mG3QDpS_QFiS(BwbI)kxE@C{%`dzZ#)2sE-AjEc{ zqA&>q>!7r*Ecui!tfNe#EYP#>6#A}*9>}Z*?WXd`KV9>G1NpZqei|ZQM$f$;aGRuu z`2P+01NwM9Q|U1K9p>Maq30W*rw-oFQ$9L3#(cFm?iRnGBJzlvmA)MH6YxJ;;Ck~x z)1x0yhe+oS>!e*O(k}k{K3&pY_Fh2TE%rZ|vt0C}@#7M=d`RN9Zi(ked!xV5Ki97B zIfVUwcSi0;*Y6I5>p1AOednXEBRK7^)Zi4d{nG4%&A$g)Pu)-Q!g}iR%sRruWRK#m z{mf5%7Q7wU4;hEdAC7qkisp6a@MBjPdaSH#&`U>HQHb<=U=3*dDu&gXSSbVcEk296V(fohuKxz2La#fGJIc2w4fNy`u$QWfO3!0eA>?I$33DaVY|<#eAW+;|6$4xy2Kw9djR{~*B@2A zwC}zx6MaQFw2b*PDA(5yT_x>T7Q2_IUu)k1FuydUZx86JC|@MsRRp8ILf&@%4s`dh zpDy}wr2AZPS>$W&7Sgdp<@x)4=nv8lOwa9prFQM-w%-?yYtTQ-XZFDKz|Md8^pG@P-u>^a4B{^Gw$7AcHVg2|Lp7m3!H*TKA#ei=Ymm|Sa2+P5P ziRjb;(r;*WqIXxfh_4;1U#^-M)&`I&*j;BE9Q5iJ%&>jd;h72b;Cm=(7CO>u^qni1Loi8%~VICDnKG z{s;J734YB^jpFRCV{{Y$NcSTIw)K=kPTt20P{Vy@>1c^qj?DK#%Ne+4o>9 zUm^bqEe|eepF#Bj=U5jL9C58-yNbh{wu{;?-w%4F-SixEGUu7?51}0A_tOvl9rwTW z&S$!c!=<6XKPdP6^jl@zHGTE(cdvz1Nbgoi3_Y7bdRnBn3pl+j>1JO;eVk1CSk!ev z+n4Vc)x-q~xqVzdv`=VX^TRNYBof)*fa_-G^RxZY?vn>U2&rAH9e-Nsx!J!^Zf4hJ z@1y>d;RpP_jO0i2HsKdUQt9M-+OAX2Suho6zEr4YH zg>r_sD#LZU4?U5yIrG~?xy^+hULeoG|HlcDt?w0S9}y%ct7YFizFX;9t90u*0s4-i z(7R6Q3fhJ7t3JX$h5NNQ9|;Xdy}d!buyd%lRCyh@V|&YTnU{4fW;khEDscC!1fH`{ z;4N1ReC>RO+YhmhWbJ5jOIA=G?9B1Ve_so*?LGW`=AAW5AOxL5$CGHyEFFn#GmoFA?3}E+54Kk{hvp<>>iS5&qkI{ao9+fd%AAh#OX)-Jc^B* zus5V;2koBN$mw@cw=(d1`cyAJ=s^BOoS!P9P;VZ9{kD4c z~(@y*WGQODebr7zl8Pe$@HUj1Vhgu ziEy6%DXb?v-Seb&K0?<4>go9o6q&<->;^Y1H$ z=^v%T_&~K2_-`i6`DY4t+Hu?8|LC+6=0{=nwAyWTA z^f1e}(HGWFE-mS;?0edHJrKRGr2HwpC@pjiNN?cpJQmQ~AAR;7LNZ6kznNT(8)$u= z?e}e(?;R3DKE3oa^)Du=f1!4=EcoNml##+fbM@c7qc9mt{)URY4DJ5jJHXn`Z<9+g#A*+;S2bA+8*jRdB1d=*lX{XjuhDYrNbFMT)))D zb-Ztg5XxaQ$ra<<6TvwF$l*!4udL`=IKP#rdvUm(t{Y8@eiTaO%?uZFvd@bC4+$iV zOPNma-@8v_hx|#SjE_j)5xgI2`}im?`D8rw>waZPhkm2oK<|zKFX%mo)*=zp<39WT z;%~?TmH9ET-Zx=%+WM-|XZK>*eqG#bbjfH=^eui@se9rG$nIG9bOyKh~^xZ+T|AWbYQ!t)k-h`v=z*7$JR4)~(vgdl1(4-VI z+W53_oS~riV%T}laNppvuae!R{ClY#aGtD*N~G&i2bh18hmGIf&!YCV0QyWW#wYsy zizpp*-yZN|<6JQ><7C+H)>D2vcif@(ocMLQ2~r#8@!&6<$Dc!d*!q5m?{3OxbeUhB z<;UnPO%nWtp~rB)C=8W(Q(@?F>`%o_#0Z6WGQ2o?-!u}#ZTn019C`pvYK_F-P4mmS zhSCf!?h14#0VEK)<2j+$pH(|HS?VoDa&Iy4L-euw#kP)6$UiCXbBh`?&dca;qW!`6 zw0*evY{7f#Vn~zLNheB!`t}X*yquof`Mp!8OTO#$Ub9mt?_)hl%l}0BO;G-FE`R8K ze)zM{7pxB)Eq^t%pYTt^^|EcWUJiXgzcszLeq#3xcgpl6U2l(qZSg{VNKS zexhCMJ|C=CjmzA3a1z~-Z0}JSebCP@D*1?u9hCQx9QcRq{m)9Q-q$u{$_-1Q8YJ{SqRH z;*;6_6mm_hCxzT(>f=ank$bDk1W>>@-V45{(D1H+FXHzkdT#F*g>+f|cVzO9<@^(Y zwvS(9`PXFf!xOOgW$WR;DU%~;rs4@?|7ojACog-rNN(`uRT)+hIpck3(1-4XHI~(K;vg~j$`nNU!Ag? z;M?2$92WvuY!F!vv;}=81f5z z_2d+>oRmJh52nn`!Q(LG8_Mb6&q+R;#BL<(#ZILB%lJ^szsSkXBb$8FbBrR_kbl?@ zvv1%ZU7#NSzaqcW`iWnMohJ0#dk&!-(C+o*@C5Odw#RaA$M`|?>b`!%2GDhz;75P| zKFalOko^7l$D#bbMfo8w^bFGj$m>8b4w*h=^(QTLN8!WZl>+CA2Liy?pb zY4zm)*--w6p?9B9IY6&XA0UTWedY_I7lYR?k&nsM&SjW9k3_%90e{K0(?lO;i=50Z z(Yi0Ex3}F#_5tCv@`Cb0KVlo$Fo)B9Y1)WruP;g z_i;VwcgJ;y^GNAu{~N}${~~|L%YVMwc`T+-u>0oB51l+T&wdH)&aw17au;yExMKsy z@H2WhrE-8>m`?3mbglf{0hyrvYYo&(*35>q_cB z{i*{V0wY&-2i@ zypQ>!@%gVPPxojG+_FdDF4<2?+I9=vEqu^@-V7%v%6>zC_tn@s3-r;#9rPnzpT}wp z(N*~+*W2E*?J2-<*AqfVTd%;~-xGMwW`VbSL*Q#SGJLrEZK0fZQTx#Qn2aYJchH^~ zZ*Wu@@@u1y5QOErsa%-O2zGB|t0FZ2qIIoguyt{} zPZ0W#Cy|qVj%2;yHGJ)jLT@Oin)j7R4&i&J$Gxdu|B^lnyl`nFC;NjT-?vk`=}}nU zUcwLgPo{nzIk_(<)i2d^uV1R?UcXe&y?%+F4_3eYdyTeVFu;6pKJ@1-VuFI*9}T*D z-$(7$D{?Fjm;OQX4e4)7a9$ohEh zlltQxX|J$9%?$9S_^uUv=rk1K%DB3C!O!%%<*$@-zI;>N@=41y))U~FS{KhtwEjJu zuRz~pLI~S|<UO|&mP|tS@-n#reyFbk4ogzt>kr5G9fv-XX)pMV zXa`t$t2Sv^}lgX~Wm;3x4#iE$)=L&tvWN0txYk{La{)o}}OS*S2a%Xdf(4L{c(m6zyZ0KI0@A016>La{g4u|ME8J-xcw@TSqr>{t!Rgi3%sP|Gk*>5%rwF^*qTk zER~;>@t@{xG9HtGp%8cNVY)(mS$Z4Rp*@AKVs0G!wWYF*$CGo-Bzx-r)GwhwH;x8Y zdS8>^=TmI&2m1R}ln=~fkw48t_O(SG>QBU7VlU!uEq{*cN7qv6C+CQM#5S+e??1IqQaus(g6NfdS7XoLbD2(? zS7Tj?)S2x)IB1>N!p{r2MB~eH(1b$nAK88uhRe7^_g{1S#Om+FWwpa~_(Z#*-Iqb% z(s7gdrTqx)_p&Y?mlrBLO`l8q`u&gFn5;hf-$e8S|Cjf|&)dKmLOG*;TQ@+y8724= zQg1Q$8C_>u$MvS|rSdMX5qk7}0NU?TSoKu-iTKn)-}e6qQDWb9^zs_$y#n=Lwq^X6 zX+MJ8W{bR4zN!B*w{AZHpRfEn+dHPWkXtT%KG-XK_A@TS-Xh?f8|!b6_U|SC$mxDw z*2^H@w+Q*0KY)6FOW*k z`D^E|8z{f|4@ryYC+K;c@*7|E?BLQsKf-zS?&JFUNgI)Gh0qh`dn}U=>vi?!>0iv` zJ3#s3%1my*5Z@z|kNkX2_wPrPRW8&%_55=1`Pna_y=DBy_hK+K8J<&5{52zpTpP!s z-^l%=qWH-Ous=?H1cB+II)VQqM3>32vvD2IAHsf?rHj`$+652F|A`EV(U*?DXGlF% z2h*$eGQIyq<|&2YQ#qgSM~7i|zDwi(Gii6)*zOPm6zZ*Wewx!?B=)Q#cD>Xk^U6}U z*r9l{*uByg8NX~?i*I4HJRgIdPL>Fq%I_3TK)ckJ-5+TDN|hHp1q8M8 z-g7uT@$=r(6}EZmB!=mJlNvq9+S_#tLwmcC?NH>dP2z85fx>nZ8D0=XeX?rx6h9ysl1(hm!{CeBbQKOlC# zQT*mm&)1+GbiFb3pROc36WTlWL)Ffb-Q;@E4=zK#z|L{MQ9Eb$0QqKzb}pEgvwTZT zKKIKDDPKqV_iS%FD!=16X|Z)teNTQ_KkvnF5j^G}*t$)45A$(vM8BQOa!mD(o84`v z_lrltZxZrP_COu^xe7_bbNb6GZPC)gLM!r?B>$ z@=%4P|HS2|n2vgO9&#f;g7b&%3HgU||K#KFBZQDJU)D~ted}a$dB6YkU>=3`dxXYN z>&L0wbYCxMPj3H`;0gVd;Te76`n^7l^!hXe`N~q>&wmyvKBW)u>pY8+K-UM^Z?<{R zlj1j5ljyByL3x>4_VvXfyt_(u9ElpeVU>f4cE zT!OqY9wFd-#c>&VzoU=5uR92PXzOpad>!e!-d#**YENDu^oZK>?{4}VxivNX;Czhv zC!sxf4ENsmYY$RC>5Ir0_+4yY)^e3}FPqvaZFk6ZC-V2mbG&B&yJh~Dt=k~qrzxNH z(|Y}e{iFK?Pw1z7=vj6AquXlp^D%dFLjRL< z1x2#^&$})*m`*7n|Ld?WpyLem_K`0@|7AW} z%)N%~d`*5GZ^Cm=OX$ToE0^}0S4;hxAM0aHL|Yc0t$&C3uB(gh>Kc4=>*AZmdK2Qi zsxH1cHTc%l#V7Ns5Z_Dc;+rM-VvhJ8qz&{l%df3x)I0C>qPlp`6}*8Q_t(Lj=zc;y zyl2W7x3liUcb^-JtsNh6mFj|{|>63_AC44W46+DafYt1Wca{6;h=A^=6`V}Kjalx zQa%iC8}qSC^x!s;V@Tg-DhEEE_kCPJzAt z?O^!O=elNc{UM#A54G!y(jL;U!N;S0_#lB%2>FoxD%tO#_dHlGu=8XtiN7hFKU;68 zPdDlO^kJ??<_R``;(0b9qWfv3A2jaMcrVAXuEWy%0tyS=^d6+-TfIx-^*i;s*lXJ7 zRCqe;5xqyQu-K2JQS1Tj2k3LL2XR@(4>~8x`OSZ(_u?6*?@)0Z^2he4#A4ueUi_*z zukIz$+IyFwe6c@J?|dW9k)nM@`~d#TTGoT?x#*-#_`zq3rV}3j-S{@`KY^XxMg1Y9 zd!*vO|9cqsMUKVX>v-IcdqloryY^T9o}hd>{^r z3|&cGd~-AS_756gM_qiEWbo}9G`=Nu@x6fY!EPbYI{i}|tDQQvnHrixxbKK|r+pgE zXWxxZ+V(IVbRIzUc5i*U)V@K_);^l*LE4Tpq`s^k)$s$Tz^-i6bx_C~l%ST+1_OFNMxVm`syjfY~iE}I)GW(2;eeCJU zTrcd%G4v~9@0{9I?{A|0J89o8v3H4{>n(MEh1)IOqU|?B_EG)$`)kOdr_i4HevSDB zrHY)ZZ*Q5Y`1M?Uo7ls+ThGW3+xjk@ma<)G`%UCM8p_z`rzL-co!tX~{@9DH2tWT3Be{|bL%x9D4i#m46-phuzq z@(*-2E#&8PDi_+zZ)E(Ub2IrdZ;UHaPl$IqIF z{9}_#+^q7a{y^gN-(iWI*!fWYxX&$V+|_TpnZGtP(+&@0+U*2wx5ZR7pNQLq?r9T!D9d<5>)ti= zE=51X;sgad-v>FPX5c-W+K;|>ulRO~K6!s@o8p&#llpPu2bdq1tQP+*S-(N*@8RnB z{xirc+srEeSqbH$?v7lw|v_VSD!H&tV-3<-SI8 zr0=haos!`-{XVjt>%1G-X`I*nOpG(TGWKBHLs2b!Pe~a{v^1Xpznr|_^@dPPf%p;Z3RS$rV?UBkqlnc(6vHXK`t-$}-kEs0G z*^GzImk55d%jI|4?_iW%e#Jft*t$mL0fX-oriTGr_0RMgO!*HCQtlp>nLGUJx zB6pOB#@IXw<@?^>CGAMxt5v!VD4tac@0Wg4W_Ea8r5Ez8D4eJFY^WcA@7;7hvg7}- z_bqU86;R4% zg@_U(tJ9CkOcXT;VnB38MGcA=6*MYHRM4oX+0|X+$}ZpepZ}?Qt8d@VOu~xa_pMES z+^M>!PMtb+UiG+DmwZ-V6!z}br<}L0cm^-IMbmQrgyH4*O3t6KG{;x6&(+e5Pe8w* zR{MZI zF>d7s^eOse>3&OZwe)O#E-D_P{yf&pVw#%?7~*D zi!#5d@ET7DX3%xB5aG9Xnm8EOP9N^36kNB!xpinCZX^Y_P~k|g4_6hqgzrO)Gd#Y) z4yElF=>6DN;O}XF5`X`hCO$!*HHxI!O6p-qs<&)?_$)`uk43vSi?aJf_{Kdi^$FTcHW;b$b?nD%=cOv!uD_womX zKb5(ZXS*k)Fy%g=k+`>)`TJ{9?pfnAJc>`8w=81uc=TMR3%Q#9;n%CPJZ%_1`3i%#T+dI+sfcfCXN?)mZtHxX9jxFR< z?IumjIT%dW>rD4-VtV*Srss`oy4-%4;)yyrFBo;(cSgO8Z`^lrK0jd}(Ej328ttWv z+tx{bKKPl&s|kHuHGT_Y`nE6~)3=%Fm_8TZ6|J2Q>-%!YRZ4$YeNfX;$6`x=+tTxy zuHDac*FsGX)*1hlhFQMcdzj)4hgm-AEf^oT4jQ$?YRSHk?nXYib3&4H8a7ycyLJvp zXmQ$P`S0Rq=q-Nv;B%Sd9rVkuehmKKZ2W(M=an2wK1C;)e9STVIN$hUBnkFZy_3#eb;ohIj}3O|$Y#t~&Ut}h}I3vFBw9iXop@N6|aquMWD*LbEB&ttWz z-SF#Get7)Rc3e%o=-*$%?wGym%e6P{b8+>pmHM2$&j%!IXYFKIMacm1AG7!0#xQ zyBo>R_*@=mXPiDdJLAsfadyU?%hNb+nyfy$@4Q^xJ&{qLfDxp5-miS87>n;($=c{k_H3RC-((Qe+XkULM)(SmJ?KYUlarVD#9 zKU_YG=_%(E&isbV!;qeeX6yXP7R;lX{-EEk{3_&*{7mA9bBJdN{mtOW1JtXX;CV$R zo>wcLux9;NF?uc|J*fYLWr#CGVC0t%F4AXs?Oc8O`lEDv<=&84-|JY;;9Aj*dS_>r zKa=&x^pf9hJb-e~X`r`E_>1I){IcSsAsN3xe)?1WeVq7H*?*zq&*pOrMw`Z^Xg}&7 zSStOsu3hz~Px@a(NyhKn=@*?ISGO_UVR~%siMmXW>+J8SXBG8&nEgCae3G6Aap#iz zdW?~oyGPB>N9gU&CHM0;Xg*reXn${(w6g~v(znv?>Yub-<&JNVZ`I#fJI5{U;)e}P z*B;^fu8o==tW%Cl!z^Du|1iZI4zql8enHdGNfs|0Yw^OIv|s$4+9z2rw)$Ot)(=)+ z$?6M-P5y_B&z;os$nN)udTAfZO>xOqt;gpV=BZ`fiuUFJGA1AV#O&q&EPq0yH;Jo^ zPZPvd`QTSgbYCu{<^%4(_w{;}_zzi6qMfR;JYCbgaG;Z{l#@I z-rFO3s&ZJ!QKJ3!tb(18cBjWN-+f5>d$ppK??6^ju1D7B(=WeN%7dP72|WDQ-cm&N ztHpk{ao)a7^X0sK%I^ZoG0H&_#cyan+R-@QW`4J_LhG0L7R4j;_m za(3*;av*J3x43?Iq1qw89ONR+5Ah?~e`x1J|Az4$?N{QrpdF3z9?mI9<3ag#;A^~2 zLV1Yo@VbS@=fzEY9xy(C>`CGC{1l%DTJm{u3qF5J`MlKZ{EEr(dBpsl%{zc!H)rzu zY~}Z0<$A^I^vmzZ-WL3S8~9&I@x9V(?b}E_UDw~l|8C>|n~nb>qF7&QYS*vSu58x) zL?1S38gkvJ596eNfs2D#zpUfN<*66+pUrwfIh6ShN57VneS4PPU}@ToMa5rf+UHX` zzFA*}pSQS7#x}GgCn>+f3iT{1KKeK^WWSL4A%52s*32(;J;3*M>T}d{AJdcc_xa#R ztkw`J7t(+#}?-GAKDIBx>Ghy3l5FaA*Nq+f0`=C{lr`S$Sv^LsO; zUX=gBp4f*#J1hG==_e6P$q(QCJqo=aWIC);zTnqf`CGKSljmvLFXaW>ly9=XfqG_f zgu{b+UoCVeae1>}!zTs#z~rm4L-Dx#e`I}A)3D2kpt8=bnbyKC{PCy0zniA|6Rw}$ zWCsGX1HTh^=r`s?W&T|G4EfpGaQ^Ug%}?yW1b%U?>C-Oz#WvG-=NAJ@H~YmQ>3_f9 zonPE0=U0XGQPa~6`b^7B+MmffsPY^A_SnDbyr-7y%k?(RBcNWu{fo-w>s4^%oOP9p zlZ0mY{jBxtq~e&}?ysfV zPA4~V{)?q4FLEwjsz2Lzxj#Ss1pD(VUVj#H$7z4cJdV-n>>kGniQVP=bz*n9-%IX@qA0=ei``I@J6{w?V3-%WZ?QM&9r#EOc) z&WpJAbhT*DG00zM@M3I6F^^JWTK4J1`u8;Sw_7Ln=0_I;-sVH24%%bzX>Wy}t%&^f zskwkRyB>AWt^+=&@bd}p(LY__-8d@h*bvk6SGi{tb`QU-{@;drF5-LmjZXO!^*oAu z=zRP#zH;+MKHRTTaB~57Su?($r{ER~oa391??HhBy&&1`tMloA-}LQ}liweG3G-N# z^JF}5juPURhkQCd$vt;5pMD^G^1sK1Jh=V}t4V)-7jPb5K#%jw&i{gc_XwQK4=8>a z_vy3G=J_3*FHdNPlP8qF3-x$@9`@GBLsmcB2L5{THZ6mGpU)do{ek@gt{qwO@Cm?s z^1lK7Tw*_G^lYKEOsIn9u(8&dU52VJY1k{ zH$;2t=4B?i&X*6?Yy2bQ2IYStSJJr5mt)AE?ElyIkiW$Ppqu^z`h;ITSg3e>IY_q~ z@vD;y@YThk7p3^6`sLXj2lpC*lkd5dj&OgiwqakwW{VFF{4wT@Il&G&+EYM%y8!&S zU-Br)-|qn8ku3mfR|Yw(k#lVRqWtvRqk331_$dMJ>ohs{+cP)S9_53z$B)PMl_~nf zE?uwvpAQDK0@?S_(jULQFX4Y*u3&zj`T>18LNGi_?l#BIjnf8gKGHuY6nxn4Km`lj z{l=e}!Std7!8MfsA^A{YKKSIzLs+wMg@7X-gM9q-DxbbvtX+#0L0J8@woA@8RlLdg zl=V0|OEu2NhBiKx?@9W|f2JER4QoKi-L?*L`mq?KNHVqw^>zi;fY(#f(1s^V+Ktxh>?l&YG+%Fs=@3kFtN|@HaF#taG12)U$=@ zVajbZkL`))$tP)#oqfy)YiXC)nH@0u@pkDq5!r_L3;hf^UYL^O?Q-wuh{U7l_w(fm z{dDouTS}l__O%N>{9?VQnuwm=&lJHqnPdj(dKR`6%OGJRfEJ zi|3<^fAM@2`IiqqrTlKzD~@lH`@lGk7I{^=C0=2Fr1TH>3FGJVLE=cZv!dC_I%w6> z!XMbl(3@XALG5w1?<#(C5Z$Zr^e~_=NKHiORQpSEq97j}MgD@-FW>jf)%3*Q?QyksRn z;d7au$Nrh^(APAdeyMVY^J-RQ zm0wQ$DF55c@;}w`ZXM63_b};Sl>5~Em~S{0-?Op0p36+=y*Wn`m*g>Uhb8A41dTz zWi2oBotECzgl~t9FOJmmoh-k82g{8FTF!6RHiJJ*;9>8uqt2bj0RA-I>$;Tky<{<; zYdM|@*RwxlJxuF~inMF;oxG)K*MOhvP_%2n-?%g#I~1;)<}of^s{&D!V_8-~RVP$2Zsk=kI!zkFH-A6+cdVBbu%D2L9KlL+Kji zd(d{jRN8uf{GV2+lP?|CS1MaIuz)%<3MI~UaaX4hS8cisGE&z+i{*iRxFkov36-oMWL z@#|Ty^T*XbOS64p?KMoBe;%w;?@PlhUq0_J(m&i!e|=s-)6t2HpQ2-Ie~z6uAp574 zUf(XAFD3H9rJDcurqB7SI`Xzm6-Dk&pLfh&1gwLb*+(YNr0H^W1<>!MX3J`U1UEhrZ5KpXGkB> z#oc#{r1|ZdX#e_GQ}Ea??dyZX`z3)ZFBoc)PoHmNSF=ALH!qcQMBRSz#7`Wj0CImL z+xKq5qd&&wPoHidZ&o~is)s*ZM}8&s@Z2rL!vk4(y*TXMUw}Ss)_zUO!+VO{yZE7^ zNgbEpXmRdKFrWp({X6vuew?ZBCotYx!^y``hnV zm1B>dZ^(YPW_jZ{DYm}`@AL`h?TU)1J>KI=(8cwaq#qt)|5hJif4lpMtM^-algY<} zOxu0MgLa-#X_)1cc!u&5O&HI7llGWu9nY^sUELaQHlMFHTl0PXY=GVM{Pt`cul(kF z=(i0@Z(r^moIe`bsOia+|G8H_(d)OepGGH-=SP`%a4NCL!AjdFvJ3dWlZo#l(p4c{ z@*V7?`Si6+e2`wTUopP+N#pxMCcams@J*jIzMC`gosq&fEfb&I3!(YY3U~pmX~w&*^Unq56UmdEZ=M=pa=3j zyq3@Mccn}`$F`uu`03GcL1y_QGRr&v5Bl$Vjp*Te#`AqskFj~pO|&EK{=Diq(;f6D zVa?>YYpMEqIbVYBdlqYY;_;fz`^9)!F05I-hPPC|Rq@I>7R0~H=e^yd<;orO8)5A( z;_0$>)bC`v$J#N>`l5NHXCglqpZ7LOc|bgp-UqGrZyDeF^Rk%H@a6Md#ATkHyi>+I z{&;0&3LfV;xO1v~yzdma^4ea;U!MP@{84_<@9*^bJvsM`{$J*S$d}@{`5o8)8_mzS z{@=iK-2bDRp1A*KP%b^bji%z?R(yM7iVxSM%BA^MPQh#cnEmkihLybX+NErd?YndP z@%?)-^!{1vPw;WC@B48gMkkH&1R@U?Px$>kZgJ*9Devd6GXMC`lAjOO2~{E|o?Ki3 zIq~ZMkME&=-oxkbzX=3x(9Xpxrwu$26nC&phwUi%wU8S+Nrqx6$R7y_-3(V zfcuryTd??PF!tl!3W)JAes2G{oZF#xuk|^dj3>r8y^_?=&x0HEMCq;(KfcpPfBJsp z7TKTHY|oD%J#}l>X)NC~uD5fN+;}<}*K^)AD&}b4_L<6O*ZzEV9IDSI{-)@3@2k^21*F zBp%uI`0{<3cy>R&ygC!#MJfPEJUIFIGR(xc`|;&lGV$$xeEIrJe7hcBuDCsshonCz zjxU#Gmg`o2H|cvue0hxA@7rvTCLdouBeQ&GX8k*hFAJG?CLdouEweoBYAZg#zAe7+ zAMvH!m!SS3jP2^*KE6CdEWY0_6UCROq~Ke{moF5!$;6j0^!okDk1uCYKXxO&JUqpR ziQ>ycQt++f%L9~ej4xeWHYdk(5)=P!H59;_rGU6I4Jwro9*v0ln;-7#LHniK0I)`!iCetkjXDB z$N&$|{q+%iULMkg!J>Uq@!>p+4_8`z*fqKM(2onZWzx-cAirNU9`@Ry@o+5}=k0(V zHqCF?e56;dRUEldLKV3uO8fE2iz7e9xR7B;&>SCfJl`B2a$N88XLD-)afS3V{L;M5 z;LB#wO4;X{d!fxgZqf8)%AezvPvVJApp$t+v-hKu$2T_S3E`s_#3_&e&5#D;(4VfxV|>QdFt{0qUu)d z$Eafs{cg?b?HbZ_$>znwVfIh7%kxT)D*kfE2E*^p1sY{KUYB8gVZ1IwdL|lA#q&yD zKVf|^DlSy~{`e1k_vbOrlo6vZzZ0zwo|=MRqvL7TBcn&Qm|b8ujt;6J&uye(oL)jN73p@w%-W_g|x64fLyAdE;o%2l={9_6Ie~x4e*F zDLx0wjhmmY`EpK#^3UCOh4p0o%EeXME}yTcCtj~vL^#xYu-ZdTO!$5lo*~&+;pAg0 z`BiiBF}ZcSiR2?0Zwn*k=hK04b(UXu>uX1fUykRMn$~p&{tA4}cC}ygeYw(p@%%@> z&0BruJHB0g<)rPZD?j3uPwduQkcEAs6WV8o=VO_8P9>iBoH3hs^7O1#yROf~_kt8Y z&T~zMPb)L=ab3Hqe1?60wVdDDEdS3@dYa0ceTV#xNYK(;F554JRq`jxFT6Cf{)zp< zZS$o5n)!u2+dULTLzi`B#*)~Nqsoq7ZOn=|(VbZP-PhhF&wxEt=n z_g1GgKKP_A`z*tQ}7{9{oU*+%q0Ef0wd5zFqjENSxpQ6UC#yOTjZ9Wj#J#>?n8f zXmh-Ggz_tiM;X_I)qa)#*6UD&OV**N$6>}gl8S#H$zFo5Vx-zE;0u8<~8Z`AV;R60csM?b(%hb#5k} zUd0owG&$Ub`1h1dd}ooaIQ}*LokaZm{7ihbOY(iP#^q6w{@<7HR`GO4Ccft?ed+Qp zK7d}GeOuCB3BOOuEa&Uv+{|*F+2tR|#H7jm@I1>-;Rl42&KAp2g zq)MX}H@E#GZblD9^LBqeWoL1-?`NK#@<$WJ%Y_ttt9W@D{MSmGXEFQN6eoLr6>;+J z#K$w$-hNN*ZPdZIeQ*ZlyC9cN&G$gB z-=zCCIIc_dn)>O+6@Yv0_x(7TcqS7k_on>HREhhWnF~+iKK}l3GWV6l`-xm!%8UiX1vP<&c(}5JT5kS zG0C{t_ur5IJS#44%anhAUP8wKW;dV@--kbpzw2<{dp|kzuD+hS`2Fo7clqFK_PZyS z?)@Tp@8VrIf3hp_{hT)xyyGsZvKr|KC$<2 zQaRX_xcO(9crH>r(aK&O@9he{A7&Q-j=9JGpaznzKi6>Mi5H#5GU48E^s z;yWXSFFUSxehvEb%UhHFOZY!W@ift4_5|e~$}HENT`nVzz9!Sp&(19G?1sNz|BB4= zoh{0G|>Oc;$%9@_rougY$hq{*O2w4BO>6epJ~UV86ZkJ1tHZxFchTE_8dy>apjy}1GXZsWItd~`WQn&9SR*Q`6c%*D>w*;p2Y`__vbl%07K* zdy4UovjbtBdL0f^FTvmCnQ;XJ#U~!`SbdX@cj$LO*U#j>-Xu;rNd06IPycP#hkbs! zIOL*l3m?7s#I2*ePV)1?yEMLNo=@FRJ8&>w$9am%FX9mS7c45aKL!9FZ@T|fe-&?;e2{^Kkiq=ic~neB*rPFBoqfN4)O*r>N_R&kO$GTM2!;6W`qHl~4TZ zuE#fD%fxe$Hh6d9n=fSI+x__F=1hFMAK#2*;@kE3=9{-9{g?26;`rvPndQ2b-%awJ z5#P+$eS7J7jLFA01DWM_J-#_V6VK%1o3k^^PaNOeah~u!UeEhSd;`IGGUA(e?P#>W z6U8@6Q}C_gn@Hd$6W>H$zc=sq{#(a4w1>Mh-}1T?A0~=#E=a+*nr}H*`Np^=@tb?8 z-#p*^W+B(S-vA~h*>6C*=g)&^98^(rlDH?@LA5OE^0<$%CQ>nmG-CHj@kS3rTIWu zn8HA;kb9QG6>=wNzZG&X(DP&qxh|djxtIeBsZ#t+LN!hUitu;!!x z@Jr5N9oKwcKE`Fe80QGC^6)|~uKr~*FXr0e=I;x+PNVw;Mt7IdeX5>6RLGs7^cQk3 z(UTAT`bMq3Uk@krVw}S`cCON!1^++_9uk@l{;4H=P)YFTgN~MPTN~iGF)FM6`@Q<} z+R8>h;@Wku2Zwg;t#mf8TR8Y}4?Z6>#~lvt_;r4J9%|}G2X~|ghx+lQbv`(}W&4jv z!AlW=Kcpr6$sWIe9}@2FWzOQ;(^B}M3U2>-7W{@3ewn%ucz!6I1^>9mKhU$Uz(an2 z`Dxql>)i+M^u^gVr&mrteEi!*PMh_J`U88g=FL)({p21c_Qwb_aNiU9L+t!f z{c>m)_kmU0Z9mv_K5NtXwDS!6awI4|x82TbcjvoDCmQ}iKJ&p-)zZj!1hRSpdo#r6 z0-g&GzX^bFbg|X5P@i(%v%<;wz?SAY8YFgI0EPs{ZnQiG6 zmhQAP?|msc5N{pI)`_mkmu<@ywh z*g*(^{jQg1KEVIcpYy3Fb}v%j6x7-X58IOu-mm%5yl#b$y5{n^&j6o2y?hoI>NDIQ zRvUJpU(;#(5iKbCz6kSxw#q#G{e&l0RC1FKAEpLP3udSbN9ix`B0Rg8rLVI46g5UC=0&jZZ z<2_N}$}6{Wy}h!5dT#Xk`uLcX2i}M7_V<%faQt>-#i6;~YlOl^`qdv*6Z>=fy@}mT z?BKOpF07b-7H5;b3iUHQkaj)myd&TTy;t4|{imNUwDCIypa1Fgjx_&anSf{i6hF^R z_1mRVANYE)!9OJhkNDf?zr(v1;MRdV5{pR?vLf}}v!0*q$-`WM13i!byOe`a$`9wX zcB9;NO#AgX_`d+Y!uL2YSmn;e0YbNf`;)+xSN77*RgK>>l5*0F$DKUOxiu~2WtQ*< zbbh2kUW$symlt@te8BUA6T956_B!eJUQ3%@F0RsaRGe%1W}k~IEWg|G4NrXUJ?E!F zyQd*KKnRqd>?dS7cP?{<<>Pj?;Df}EYA;Kb_p1J2UJ!94?1prQz61W(8UG5oW7V$8 z_pHjdzW9E$V*w^~43VF72a=|Kgt6VXc);{C=Kua$T;qBC70u(h^Wkv6;)~|-{Q2pk zt_|}t^LP%u+{eBh<$U>2Js3tV0 za&ela`z<}4^?G^+`x4*Re36o?;}}=pyQIEoEqWG4Zt zr+84`+?T+fupNDEt1T|?Ha+6HlYDQ;bO*oxmHp>TcWq(2>lVlNaNRZ^yw&Na@qLrh zQL_8vAuq^q^NC^QCiQdj9j@XHD|JhguCQ{WrODs0a=oS5-ZYL?+=VFWhQhe_Fwr087xu0nE1N0Y&`|)%BLhRjk zq#@_fzsdNC3&zo}?6*Dyuky}b_W11YWZ7dGkjl@e%h|I??5>~h?C}ppFWf%t zQuPYzanpGDa?Ow8@iOmciH>sP<%{h-Mz6_u*{{#hv7iMVUspQhk~H~+HqH<`N_uQw zC@Na~65D0!y?pOt_RH*3#q3wn>{l$uv~RxLs613rtHkqD#6H4bnjE2jW=lT$ajEoA zvhT2;b};_Vx|iwrJ8QtpDVT+epAguhCrsaGWo=y|_ws(+2fG74p8gqszG@TDH_2;QB_8;_ZK?UIpX<7O+V6cu@r0EX zMh^pgmv;1Ee2~U>LIXXwk)EnPR35fsykD`jv=V+>_@VVcK4!@)wCiN(uV;@`u1t>P z{2zq}+)wm7D(mMW(PSwn)dm$O5>MiJ{=-- zFIup%3102I#k1hk?QekmQg4!Y^RrsNUk~`?C<&mg}OJH!4E zf2Zv&7pb4%7k+a8mge`-Jc(cBz6duTSh8_oU+y!yt`k-lDtu_?J;ia(jCPnT=6mQfqRiEW02kA52KfWD+-wA7sYeTzlI2;~Texd)qbxzWM zeYrV|^DXWwa|9fM&F~GIZbGPmUKHMR2gO&HFy&bHsq}}as^9FXm-P-2)1C8%&{=kj<+<0z` zZb0qT)$(_#LOWi_J@j7~PnD`XU)s&LCiCUjv!7%C|6WTw|9_39<(vX#Ov&cY-F&{B z6G{0VraZd)m!n>j|8A4}&NeMyZnrps*$w`o-Ol;=%r_9XJWcWX@%mc9Aoomb{u7=5 z&j-gVJudFYJ{|o0I8o&xLvEI%pFO!ze~=+JSEl3v`r+miom@j676Z!kuG>*r1Vy;AcjUp_okO!m7p!GBoui<&=nfh6P?^=wf68av6- z9UGZO|G( zId^|tIbIhtzI9F0ad22SzQyZeCzFr!0)0Q(^YA`I^5x#u?iO?oDV=hENlfo&w_^Vx z+nM;+Uu%Dbm(6W~XN{JJeSZHvQ>|7R-%7V59swUdk%`yt;T;^%GEs3A=`nw+@my+N z6J^bi*9cyM?p;Yw~Q-eKJ4*I>F-*%w!3eS{cRqF;{cf-SNRI7 z90$bv3~JPysB1Rg*U87I$Hp%cp4WMIlU~5yCHr5$rtf{aJ0(7n_)h8e{V?P=>RO@s zh-2M)*DwC9F&=*^#zS5_e1^pFfS)P#qTe1&!3VPb5LQ{Ak9Ui}Nj$Fgm5Xg`e}!_9 zH9t1f)-jfT-JiFSisk3)Io7@M!4aAtR;b69NYKRqDXG{8@r|%1L?yfYc zq5Uw~uK)dhpKJX4rtmKxELXXRiZQO zTE=0!Q0@jPhw;FGl*4`lL`uN-6zp3zlj_&MT^Q>61#n-w2m05jZ{EGr?7zwmlLP9h zj}PNu*;l3Sf$vtuN4a?B_Fl+YBG=fsB`wUoyV5_lqsPP}6>Wo3*|H%}0If zP~TUYCE;fHFr z!a;Jx50YPvk8 zx5r-{XL$1cagle}dufW|yAbp-e5F81KRUY+kAvwy!x`jDyv{s>e3AJK zjdQ{oT3q-*y$dTgUsW}JWZeIKkrZ+EEn3+e|H4nE^>xg}!#4jK)>kPX(VlBRfq0L0 zB#DDARl;QasBo8vp0-QQ+wD1KbQh*9RJg<+eNoecBfKZTox7LJ4{X%_PWZCH(vB~q zmR2;<&LO7V`IRw$x1{iFPT|>)rg)%&#Tn) zQjO!a@`;Rx!rIF@t~jxvaAECCOFzxhFSfK868SB%`>Wmgvw64g6qVZVee%qTS71-j zo^kPWKHuO+k$;o=&0lDJr7G_mcm6x9o}v7XjyXtc39Bbt`l*(td`0p7+PtUsf1|#= z>-7Jf`u5wq6MakUH5Dt|4ZYhUaaTdL3GwJE+PfBd2LBF!nh!X?=Esq6G5O$Mw0z0* zFtl-^e3z*59uC{M@;t^5QOkSdNr#))7@MWyAGmwreZ5);fA?H_FEW82^z4_*#9q`_ z(4JM7@>yHVr`@k7^R=4p%Tw>8IY!s9f?jC2@hj)Gwc9e3}C*O6#t~J9`J^+7}2cOv8e^Ppy z%Ta#ZdIieQ)cFI}mz3|)^5H1k5nipy3_938;CXr`o)d_tWqI-iGae zGQZQfSon~9r|~i?XLighm!6k=O+&dewOljb$Oq6_@aPQJ(Y_{p>uyn=d`J2DuaN#7 zU95hmuk8$**QA}1c|@JJk@-E+G+nXTH9l_|7gecvvumG}AJ3X3zy z=OlhM{>JgM@%NY%f1Bd_e^Y$^y3~A`FZ9RJ8fTQW8ye2-Ja~Jf-8dsv?u!3zoM*<& zr7!ohWq!xs_u}TSpCWMOmEDxf3iaR3Px<99l=9%$tzY%$mz(V=Mo7)}^!eH#AD{X& z+wTs%@86Wz$wdE-(sHs7o$^|=_@hF9y|eEsfFF3zxea*fhvj=?wcEfCf0z%BHvCRs zH!^;V>)T*y7awfbw9MC8zUggoo8=E#zTt`eikrtGzGOc?@kDOiT48zThr+70cZQOw z`!r>EC-b44UoBOs$DxZi>*SN{n^Jy-L$nLKvu?c9`g@!7cRu(i<#yEQkZBZMpRHP2 zn5lBRjA_hk^~;~&|JWZIi**e{A|ZYSk^G_; zwDHL>L)v|V>WSYk?-z)C@EXle_%lb#`EbJu*WaXPDwjLavsqFO?LJ54ZpiE;=jFo6 zsHHj2ChL8cw)w^i$01RX^K||`8`baYl+3`_J6GQsQeU)Sa}&L)f6G|TeQ%)sg8N=Q zJym@!Ik+VLJq>Up%*Xd2YF7rE>FAU!;C)_7FNZKrzliYAO9%Jt6kI3l!fL~7^VR

    F0xg$bY5ePhOAaaNH&G4#{` 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�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�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

    F0xg$bY5ePhOAaaNH&G4#{` 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�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�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 { - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - const payer = provider.wallet as anchor.Wallet; - const program = anchor.workspace - .TransferTokens as anchor.Program; + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + const payer = provider.wallet as anchor.Wallet; + const program = anchor.workspace.TransferTokens as anchor.Program; - const metadata = { - name: "Solana Gold", - symbol: "GOLDSOL", - uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", - }; + const metadata = { + name: "Solana Gold", + symbol: "GOLDSOL", + uri: "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", + }; - // Generate new keypair to use as address for mint account. - const mintKeypair = new Keypair(); + // Generate new keypair to use as address for mint account. + const mintKeypair = new Keypair(); - // Generate new keypair to use as address for recipient wallet. - const recipient = new Keypair(); + // Generate new keypair to use as address for recipient wallet. + const recipient = new Keypair(); - // Derive the associated token address account for the mint and payer. - const senderTokenAddress = getAssociatedTokenAddressSync( - mintKeypair.publicKey, - payer.publicKey, - ); + // Derive the associated token address account for the mint and payer. + const senderTokenAddress = getAssociatedTokenAddressSync(mintKeypair.publicKey, payer.publicKey); - // Derive the associated token address account for the mint and recipient. - const recepientTokenAddress = getAssociatedTokenAddressSync( - mintKeypair.publicKey, - recipient.publicKey, - ); + // Derive the associated token address account for the mint and recipient. + const recepientTokenAddress = getAssociatedTokenAddressSync(mintKeypair.publicKey, recipient.publicKey); - it("Create an SPL Token!", async () => { - const transactionSignature = await program.methods - .createToken(metadata.name, metadata.symbol, metadata.uri) - .accounts({ - payer: payer.publicKey, - mintAccount: mintKeypair.publicKey, - }) - .signers([mintKeypair]) - .rpc(); + it("Create an SPL Token!", async () => { + const transactionSignature = await program.methods + .createToken(metadata.name, metadata.symbol, metadata.uri) + .accounts({ + payer: payer.publicKey, + mintAccount: mintKeypair.publicKey, + }) + .signers([mintKeypair]) + .rpc(); - console.log("Success!"); - console.log(` Mint Address: ${mintKeypair.publicKey}`); - console.log(` Transaction Signature: ${transactionSignature}`); - }); + console.log("Success!"); + console.log(` Mint Address: ${mintKeypair.publicKey}`); + console.log(` Transaction Signature: ${transactionSignature}`); + }); - it("Mint tokens!", async () => { - // Amount of tokens to mint. - const amount = new BN(100); + it("Mint tokens!", async () => { + // Amount of tokens to mint. + const amount = new BN(100); - // Mint the tokens to the associated token account. - const transactionSignature = await program.methods - .mintToken(amount) - .accounts({ - mintAuthority: payer.publicKey, - recipient: payer.publicKey, - mintAccount: mintKeypair.publicKey, - associatedTokenAccount: senderTokenAddress, - }) - .rpc(); + // Mint the tokens to the associated token account. + const transactionSignature = await program.methods + .mintToken(amount) + .accounts({ + mintAuthority: payer.publicKey, + recipient: payer.publicKey, + mintAccount: mintKeypair.publicKey, + associatedTokenAccount: senderTokenAddress, + }) + .rpc(); - console.log("Success!"); - console.log(` Associated Token Account Address: ${senderTokenAddress}`); - console.log(` Transaction Signature: ${transactionSignature}`); - }); + console.log("Success!"); + console.log(` Associated Token Account Address: ${senderTokenAddress}`); + console.log(` Transaction Signature: ${transactionSignature}`); + }); - it("Transfer tokens!", async () => { - // Amount of tokens to transfer. - const amount = new BN(50); + it("Transfer tokens!", async () => { + // Amount of tokens to transfer. + const amount = new BN(50); - const transactionSignature = await program.methods - .transferTokens(amount) - .accounts({ - sender: payer.publicKey, - recipient: recipient.publicKey, - mintAccount: mintKeypair.publicKey, - senderTokenAccount: senderTokenAddress, - recipientTokenAccount: recepientTokenAddress, - }) - .rpc(); + const transactionSignature = await program.methods + .transferTokens(amount) + .accounts({ + sender: payer.publicKey, + recipient: recipient.publicKey, + mintAccount: mintKeypair.publicKey, + senderTokenAccount: senderTokenAddress, + recipientTokenAccount: recepientTokenAddress, + }) + .rpc(); - console.log("Success!"); - console.log(` Transaction Signature: ${transactionSignature}`); - }); + console.log("Success!"); + console.log(` Transaction Signature: ${transactionSignature}`); + }); }); diff --git a/tokens/transfer-tokens/native/tests/instructions.ts b/tokens/transfer-tokens/native/tests/instructions.ts index c9fa9b36d..6a3d92b20 100644 --- a/tokens/transfer-tokens/native/tests/instructions.ts +++ b/tokens/transfer-tokens/native/tests/instructions.ts @@ -1,4 +1,4 @@ -import * as borsh from 'borsh'; +import * as borsh from "borsh"; export enum MyInstruction { Create = 0, @@ -9,27 +9,27 @@ export enum MyInstruction { export const CreateTokenArgsSchema = { struct: { - instruction: 'u8', - token_title: 'string', - token_symbol: 'string', - token_uri: 'string', - decimals: 'u8', + instruction: "u8", + token_title: "string", + token_symbol: "string", + token_uri: "string", + decimals: "u8", }, }; -export const MintNftArgsSchema = { struct: { instruction: 'u8' } }; +export const MintNftArgsSchema = { struct: { instruction: "u8" } }; export const MintSplArgsSchema = { struct: { - instruction: 'u8', - quantity: 'u64', + instruction: "u8", + quantity: "u64", }, }; export const TransferTokensArgsSchema = { struct: { - instruction: 'u8', - quantity: 'u64', + instruction: "u8", + quantity: "u64", }, }; diff --git a/tokens/transfer-tokens/native/tests/test.ts b/tokens/transfer-tokens/native/tests/test.ts index 10a225c23..cfa947842 100644 --- a/tokens/transfer-tokens/native/tests/test.ts +++ b/tokens/transfer-tokens/native/tests/test.ts @@ -1,6 +1,6 @@ -import { Buffer } from 'node:buffer'; -import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mpl-token-metadata'; -import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from '@solana/spl-token'; +import { Buffer } from "node:buffer"; +import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from "@metaplex-foundation/mpl-token-metadata"; +import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddress, TOKEN_PROGRAM_ID } from "@solana/spl-token"; import { Connection, Keypair, @@ -10,36 +10,44 @@ import { sendAndConfirmTransaction, Transaction, TransactionInstruction, -} from '@solana/web3.js'; -import { BN } from 'bn.js'; -import { borshSerialize, CreateTokenArgsSchema, MintNftArgsSchema, MintSplArgsSchema, TransferTokensArgsSchema, MyInstruction } from './instructions'; +} from "@solana/web3.js"; +import { BN } from "bn.js"; +import { + borshSerialize, + CreateTokenArgsSchema, + MintNftArgsSchema, + MintSplArgsSchema, + MyInstruction, + TransferTokensArgsSchema, +} from "./instructions"; function createKeypairFromFile(path: string): Keypair { - return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require('node:fs').readFileSync(path, 'utf-8')))); + return Keypair.fromSecretKey(Uint8Array.from(JSON.parse(require("node:fs").readFileSync(path, "utf-8")))); } -describe('Transferring Tokens', async () => { +describe("Transferring Tokens", async () => { // const connection = new Connection(`http://localhost:8899`, 'confirmed'); - const connection = new Connection('https://api.devnet.solana.com/', 'confirmed'); - const payer = createKeypairFromFile(`${require('node:os').homedir()}/.config/solana/id.json`); - const program = createKeypairFromFile('./program/target/deploy/program-keypair.json'); + const connection = new Connection("https://api.devnet.solana.com/", "confirmed"); + const payer = createKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); + const program = createKeypairFromFile("./program/target/deploy/program-keypair.json"); const tokenMintKeypair: Keypair = Keypair.generate(); const nftMintKeypair: Keypair = Keypair.generate(); const recipientWallet = Keypair.generate(); - it('Create an SPL Token!', async () => { + it("Create an SPL Token!", async () => { const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), tokenMintKeypair.publicKey.toBuffer()], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), tokenMintKeypair.publicKey.toBuffer()], TOKEN_METADATA_PROGRAM_ID, )[0]; const instructionData = borshSerialize(CreateTokenArgsSchema, { instruction: MyInstruction.Create, - token_title: 'Solana Gold', - token_symbol: 'GOLDSOL', - token_uri: 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json', + token_title: "Solana Gold", + token_symbol: "GOLDSOL", + token_uri: + "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/spl-token.json", decimals: 9, }); @@ -68,22 +76,23 @@ describe('Transferring Tokens', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, tokenMintKeypair]); - console.log('Success!'); + console.log("Success!"); console.log(` Mint Address: ${tokenMintKeypair.publicKey}`); console.log(` Tx Signature: ${sx}`); }); - it('Create an NFT!', async () => { + it("Create an NFT!", async () => { const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), nftMintKeypair.publicKey.toBuffer()], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), nftMintKeypair.publicKey.toBuffer()], TOKEN_METADATA_PROGRAM_ID, )[0]; const instructionData = borshSerialize(CreateTokenArgsSchema, { instruction: MyInstruction.Create, - token_title: 'Homer NFT', - token_symbol: 'HOMR', - token_uri: 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json', + token_title: "Homer NFT", + token_symbol: "HOMR", + token_uri: + "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json", decimals: 0, }); @@ -108,12 +117,12 @@ describe('Transferring Tokens', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, nftMintKeypair]); - console.log('Success!'); + console.log("Success!"); console.log(` Mint Address: ${nftMintKeypair.publicKey}`); console.log(` Tx Signature: ${sx}`); }); - it('Mint some tokens to your wallet!', async () => { + it("Mint some tokens to your wallet!", async () => { const associatedTokenAccountAddress = await getAssociatedTokenAddress(tokenMintKeypair.publicKey, payer.publicKey); const instructionData = borshSerialize(MintSplArgsSchema, { @@ -149,19 +158,24 @@ describe('Transferring Tokens', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - console.log('Success!'); + console.log("Success!"); console.log(` ATA Address: ${associatedTokenAccountAddress}`); console.log(` Tx Signature: ${sx}`); }); - it('Mint the NFT to your wallet!', async () => { + it("Mint the NFT to your wallet!", async () => { const metadataAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), nftMintKeypair.publicKey.toBuffer()], + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), nftMintKeypair.publicKey.toBuffer()], TOKEN_METADATA_PROGRAM_ID, )[0]; const editionAddress = PublicKey.findProgramAddressSync( - [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), nftMintKeypair.publicKey.toBuffer(), Buffer.from('edition')], + [ + Buffer.from("metadata"), + TOKEN_METADATA_PROGRAM_ID.toBuffer(), + nftMintKeypair.publicKey.toBuffer(), + Buffer.from("edition"), + ], TOKEN_METADATA_PROGRAM_ID, )[0]; @@ -203,22 +217,25 @@ describe('Transferring Tokens', async () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]); - console.log('Success!'); + console.log("Success!"); console.log(` ATA Address: ${associatedTokenAccountAddress}`); console.log(` Tx Signature: ${sx}`); }); - it('Prep a new test wallet for transfers', async () => { + it("Prep a new test wallet for transfers", async () => { await connection.confirmTransaction( await connection.requestAirdrop(recipientWallet.publicKey, await connection.getMinimumBalanceForRentExemption(0)), ); console.log(`Recipient Pubkey: ${recipientWallet.publicKey}`); }); - it('Transfer tokens to another wallet!', async () => { + it("Transfer tokens to another wallet!", async () => { const fromAssociatedTokenAddress = await getAssociatedTokenAddress(tokenMintKeypair.publicKey, payer.publicKey); console.log(`Owner Token Address: ${fromAssociatedTokenAddress}`); - const toAssociatedTokenAddress = await getAssociatedTokenAddress(tokenMintKeypair.publicKey, recipientWallet.publicKey); + const toAssociatedTokenAddress = await getAssociatedTokenAddress( + tokenMintKeypair.publicKey, + recipientWallet.publicKey, + ); console.log(`Recipient Token Address: ${toAssociatedTokenAddress}`); const transferToInstructionData = borshSerialize(TransferTokensArgsSchema, { @@ -254,13 +271,18 @@ describe('Transferring Tokens', async () => { data: transferToInstructionData, }); - await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, recipientWallet], { skipPreflight: true }); + await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, recipientWallet], { + skipPreflight: true, + }); }); - it('Transfer NFT to another wallet!', async () => { + it("Transfer NFT to another wallet!", async () => { const fromAssociatedTokenAddress = await getAssociatedTokenAddress(nftMintKeypair.publicKey, payer.publicKey); console.log(`Owner Token Address: ${fromAssociatedTokenAddress}`); - const toAssociatedTokenAddress = await getAssociatedTokenAddress(nftMintKeypair.publicKey, recipientWallet.publicKey); + const toAssociatedTokenAddress = await getAssociatedTokenAddress( + nftMintKeypair.publicKey, + recipientWallet.publicKey, + ); console.log(`Recipient Token Address: ${toAssociatedTokenAddress}`); const transferToInstructionData = borshSerialize(TransferTokensArgsSchema, { @@ -292,6 +314,8 @@ describe('Transferring Tokens', async () => { data: transferToInstructionData, }); - await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, recipientWallet], { skipPreflight: true }); + await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer, recipientWallet], { + skipPreflight: true, + }); }); }); diff --git a/tools/shank-and-solita/native/.solitarc.js b/tools/shank-and-solita/native/.solitarc.js index e42bad663..a02dc623f 100644 --- a/tools/shank-and-solita/native/.solitarc.js +++ b/tools/shank-and-solita/native/.solitarc.js @@ -1,12 +1,12 @@ -const path = require('node:path'); -const programDir = path.join(__dirname, 'program'); -const idlDir = path.join(programDir, 'idl'); -const sdkDir = path.join(__dirname, 'tests', 'generated'); -const binaryInstallDir = path.join(__dirname, '.crates'); +const path = require("node:path"); +const programDir = path.join(__dirname, "program"); +const idlDir = path.join(programDir, "idl"); +const sdkDir = path.join(__dirname, "tests", "generated"); +const binaryInstallDir = path.join(__dirname, ".crates"); module.exports = { - idlGenerator: 'shank', - programName: 'car_rental_service', + idlGenerator: "shank", + programName: "car_rental_service", idlDir, sdkDir, binaryInstallDir, diff --git a/tools/shank-and-solita/native/tests/generated/accounts/Car.ts b/tools/shank-and-solita/native/tests/generated/accounts/Car.ts index 5d67a76f2..9b046922d 100644 --- a/tools/shank-and-solita/native/tests/generated/accounts/Car.ts +++ b/tools/shank-and-solita/native/tests/generated/accounts/Car.ts @@ -5,9 +5,9 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from '@metaplex-foundation/beet'; -import * as beetSolana from '@metaplex-foundation/beet-solana'; -import * as web3 from '@solana/web3.js'; +import * as beet from "@metaplex-foundation/beet"; +import * as beetSolana from "@metaplex-foundation/beet-solana"; +import * as web3 from "@solana/web3.js"; /** * Arguments used to create {@link Car} @@ -72,7 +72,7 @@ export class Car implements CarArgs { * * @param programId - the program that owns the accounts we are filtering */ - static gpaBuilder(programId: web3.PublicKey = new web3.PublicKey('8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ')) { + static gpaBuilder(programId: web3.PublicKey = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ")) { return beetSolana.GpaBuilder.fromStruct(programId, carBeet); } @@ -112,7 +112,11 @@ export class Car implements CarArgs { * depends on them * @param connection used to retrieve the rent exemption information */ - static async getMinimumBalanceForRentExemption(args: CarArgs, connection: web3.Connection, commitment?: web3.Commitment): Promise { + static async getMinimumBalanceForRentExemption( + args: CarArgs, + connection: web3.Connection, + commitment?: web3.Commitment, + ): Promise { return connection.getMinimumBalanceForRentExemption(Car.byteSize(args), commitment); } @@ -135,10 +139,10 @@ export class Car implements CarArgs { */ export const carBeet = new beet.FixableBeetStruct( [ - ['year', beet.u16], - ['make', beet.utf8String], - ['model', beet.utf8String], + ["year", beet.u16], + ["make", beet.utf8String], + ["model", beet.utf8String], ], Car.fromArgs, - 'Car', + "Car", ); diff --git a/tools/shank-and-solita/native/tests/generated/accounts/RentalOrder.ts b/tools/shank-and-solita/native/tests/generated/accounts/RentalOrder.ts index ea2923a74..458861608 100644 --- a/tools/shank-and-solita/native/tests/generated/accounts/RentalOrder.ts +++ b/tools/shank-and-solita/native/tests/generated/accounts/RentalOrder.ts @@ -5,10 +5,10 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from '@metaplex-foundation/beet'; -import * as beetSolana from '@metaplex-foundation/beet-solana'; -import * as web3 from '@solana/web3.js'; -import { RentalOrderStatus, rentalOrderStatusBeet } from '../types/RentalOrderStatus'; +import * as beet from "@metaplex-foundation/beet"; +import * as beetSolana from "@metaplex-foundation/beet-solana"; +import * as web3 from "@solana/web3.js"; +import { RentalOrderStatus, rentalOrderStatusBeet } from "../types/RentalOrderStatus"; /** * Arguments used to create {@link RentalOrder} @@ -79,7 +79,7 @@ export class RentalOrder implements RentalOrderArgs { * * @param programId - the program that owns the accounts we are filtering */ - static gpaBuilder(programId: web3.PublicKey = new web3.PublicKey('8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ')) { + static gpaBuilder(programId: web3.PublicKey = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ")) { return beetSolana.GpaBuilder.fromStruct(programId, rentalOrderBeet); } @@ -119,7 +119,11 @@ export class RentalOrder implements RentalOrderArgs { * depends on them * @param connection used to retrieve the rent exemption information */ - static async getMinimumBalanceForRentExemption(args: RentalOrderArgs, connection: web3.Connection, commitment?: web3.Commitment): Promise { + static async getMinimumBalanceForRentExemption( + args: RentalOrderArgs, + connection: web3.Connection, + commitment?: web3.Commitment, + ): Promise { return connection.getMinimumBalanceForRentExemption(RentalOrder.byteSize(args), commitment); } @@ -135,7 +139,7 @@ export class RentalOrder implements RentalOrderArgs { returnDate: this.returnDate, price: (() => { const x = <{ toNumber: () => number }>this.price; - if (typeof x.toNumber === 'function') { + if (typeof x.toNumber === "function") { try { return x.toNumber(); } catch (_) { @@ -155,13 +159,13 @@ export class RentalOrder implements RentalOrderArgs { */ export const rentalOrderBeet = new beet.FixableBeetStruct( [ - ['car', beetSolana.publicKey], - ['name', beet.utf8String], - ['pickUpDate', beet.utf8String], - ['returnDate', beet.utf8String], - ['price', beet.u64], - ['status', rentalOrderStatusBeet], + ["car", beetSolana.publicKey], + ["name", beet.utf8String], + ["pickUpDate", beet.utf8String], + ["returnDate", beet.utf8String], + ["price", beet.u64], + ["status", rentalOrderStatusBeet], ], RentalOrder.fromArgs, - 'RentalOrder', + "RentalOrder", ); diff --git a/tools/shank-and-solita/native/tests/generated/accounts/index.ts b/tools/shank-and-solita/native/tests/generated/accounts/index.ts index 7c593175c..6b514469d 100644 --- a/tools/shank-and-solita/native/tests/generated/accounts/index.ts +++ b/tools/shank-and-solita/native/tests/generated/accounts/index.ts @@ -1,7 +1,7 @@ -export * from './Car'; -export * from './RentalOrder'; +export * from "./Car"; +export * from "./RentalOrder"; -import { Car } from './Car'; -import { RentalOrder } from './RentalOrder'; +import { Car } from "./Car"; +import { RentalOrder } from "./RentalOrder"; export const accountProviders = { Car, RentalOrder }; diff --git a/tools/shank-and-solita/native/tests/generated/index.ts b/tools/shank-and-solita/native/tests/generated/index.ts index 046f79c19..deb4a0914 100644 --- a/tools/shank-and-solita/native/tests/generated/index.ts +++ b/tools/shank-and-solita/native/tests/generated/index.ts @@ -1,8 +1,8 @@ -import { PublicKey } from '@solana/web3.js'; +import { PublicKey } from "@solana/web3.js"; -export * from './accounts'; -export * from './instructions'; -export * from './types'; +export * from "./accounts"; +export * from "./instructions"; +export * from "./types"; /** * Program address @@ -10,7 +10,7 @@ export * from './types'; * @category constants * @category generated */ -export const PROGRAM_ADDRESS = '8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ'; +export const PROGRAM_ADDRESS = "8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"; /** * Program public key diff --git a/tools/shank-and-solita/native/tests/generated/instructions/AddCar.ts b/tools/shank-and-solita/native/tests/generated/instructions/AddCar.ts index d5cd995da..38a644edb 100644 --- a/tools/shank-and-solita/native/tests/generated/instructions/AddCar.ts +++ b/tools/shank-and-solita/native/tests/generated/instructions/AddCar.ts @@ -5,9 +5,9 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from '@metaplex-foundation/beet'; -import * as web3 from '@solana/web3.js'; -import { type AddCarArgs, addCarArgsBeet } from '../types/AddCarArgs'; +import * as beet from "@metaplex-foundation/beet"; +import * as web3 from "@solana/web3.js"; +import { type AddCarArgs, addCarArgsBeet } from "../types/AddCarArgs"; /** * @category Instructions @@ -28,10 +28,10 @@ export const AddCarStruct = new beet.FixableBeetArgsStruct< } >( [ - ['instructionDiscriminator', beet.u8], - ['addCarArgs', addCarArgsBeet], + ["instructionDiscriminator", beet.u8], + ["addCarArgs", addCarArgsBeet], ], - 'AddCarInstructionArgs', + "AddCarInstructionArgs", ); /** * Accounts required by the _AddCar_ instruction @@ -63,7 +63,7 @@ export const addCarInstructionDiscriminator = 0; export function createAddCarInstruction( accounts: AddCarInstructionAccounts, args: AddCarInstructionArgs, - programId = new web3.PublicKey('8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ'), + programId = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"), ) { const [data] = AddCarStruct.serialize({ instructionDiscriminator: addCarInstructionDiscriminator, diff --git a/tools/shank-and-solita/native/tests/generated/instructions/BookRental.ts b/tools/shank-and-solita/native/tests/generated/instructions/BookRental.ts index 1e6bb23de..4b2ec9e2a 100644 --- a/tools/shank-and-solita/native/tests/generated/instructions/BookRental.ts +++ b/tools/shank-and-solita/native/tests/generated/instructions/BookRental.ts @@ -5,9 +5,9 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from '@metaplex-foundation/beet'; -import * as web3 from '@solana/web3.js'; -import { type BookRentalArgs, bookRentalArgsBeet } from '../types/BookRentalArgs'; +import * as beet from "@metaplex-foundation/beet"; +import * as web3 from "@solana/web3.js"; +import { type BookRentalArgs, bookRentalArgsBeet } from "../types/BookRentalArgs"; /** * @category Instructions @@ -28,10 +28,10 @@ export const BookRentalStruct = new beet.FixableBeetArgsStruct< } >( [ - ['instructionDiscriminator', beet.u8], - ['bookRentalArgs', bookRentalArgsBeet], + ["instructionDiscriminator", beet.u8], + ["bookRentalArgs", bookRentalArgsBeet], ], - 'BookRentalInstructionArgs', + "BookRentalInstructionArgs", ); /** * Accounts required by the _BookRental_ instruction @@ -65,7 +65,7 @@ export const bookRentalInstructionDiscriminator = 1; export function createBookRentalInstruction( accounts: BookRentalInstructionAccounts, args: BookRentalInstructionArgs, - programId = new web3.PublicKey('8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ'), + programId = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"), ) { const [data] = BookRentalStruct.serialize({ instructionDiscriminator: bookRentalInstructionDiscriminator, diff --git a/tools/shank-and-solita/native/tests/generated/instructions/PickUpCar.ts b/tools/shank-and-solita/native/tests/generated/instructions/PickUpCar.ts index f0fced5fa..329a6fce7 100644 --- a/tools/shank-and-solita/native/tests/generated/instructions/PickUpCar.ts +++ b/tools/shank-and-solita/native/tests/generated/instructions/PickUpCar.ts @@ -5,8 +5,8 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from '@metaplex-foundation/beet'; -import * as web3 from '@solana/web3.js'; +import * as beet from "@metaplex-foundation/beet"; +import * as web3 from "@solana/web3.js"; /** * @category Instructions @@ -15,7 +15,7 @@ import * as web3 from '@solana/web3.js'; */ export const PickUpCarStruct = new beet.BeetArgsStruct<{ instructionDiscriminator: number; -}>([['instructionDiscriminator', beet.u8]], 'PickUpCarInstructionArgs'); +}>([["instructionDiscriminator", beet.u8]], "PickUpCarInstructionArgs"); /** * Accounts required by the _PickUpCar_ instruction * @@ -44,7 +44,7 @@ export const pickUpCarInstructionDiscriminator = 2; */ export function createPickUpCarInstruction( accounts: PickUpCarInstructionAccounts, - programId = new web3.PublicKey('8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ'), + programId = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"), ) { const [data] = PickUpCarStruct.serialize({ instructionDiscriminator: pickUpCarInstructionDiscriminator, diff --git a/tools/shank-and-solita/native/tests/generated/instructions/ReturnCar.ts b/tools/shank-and-solita/native/tests/generated/instructions/ReturnCar.ts index db3d7f303..1a7dc0e00 100644 --- a/tools/shank-and-solita/native/tests/generated/instructions/ReturnCar.ts +++ b/tools/shank-and-solita/native/tests/generated/instructions/ReturnCar.ts @@ -5,8 +5,8 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from '@metaplex-foundation/beet'; -import * as web3 from '@solana/web3.js'; +import * as beet from "@metaplex-foundation/beet"; +import * as web3 from "@solana/web3.js"; /** * @category Instructions @@ -15,7 +15,7 @@ import * as web3 from '@solana/web3.js'; */ export const ReturnCarStruct = new beet.BeetArgsStruct<{ instructionDiscriminator: number; -}>([['instructionDiscriminator', beet.u8]], 'ReturnCarInstructionArgs'); +}>([["instructionDiscriminator", beet.u8]], "ReturnCarInstructionArgs"); /** * Accounts required by the _ReturnCar_ instruction * @@ -44,7 +44,7 @@ export const returnCarInstructionDiscriminator = 3; */ export function createReturnCarInstruction( accounts: ReturnCarInstructionAccounts, - programId = new web3.PublicKey('8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ'), + programId = new web3.PublicKey("8avNGHVXDwsELJaWMSoUZ44CirQd4zyU9Ez4ZmP4jNjZ"), ) { const [data] = ReturnCarStruct.serialize({ instructionDiscriminator: returnCarInstructionDiscriminator, diff --git a/tools/shank-and-solita/native/tests/generated/instructions/index.ts b/tools/shank-and-solita/native/tests/generated/instructions/index.ts index 86e06563b..f15225432 100644 --- a/tools/shank-and-solita/native/tests/generated/instructions/index.ts +++ b/tools/shank-and-solita/native/tests/generated/instructions/index.ts @@ -1,4 +1,4 @@ -export * from './AddCar'; -export * from './BookRental'; -export * from './PickUpCar'; -export * from './ReturnCar'; +export * from "./AddCar"; +export * from "./BookRental"; +export * from "./PickUpCar"; +export * from "./ReturnCar"; diff --git a/tools/shank-and-solita/native/tests/generated/types/AddCarArgs.ts b/tools/shank-and-solita/native/tests/generated/types/AddCarArgs.ts index ba0f0fae2..72be60649 100644 --- a/tools/shank-and-solita/native/tests/generated/types/AddCarArgs.ts +++ b/tools/shank-and-solita/native/tests/generated/types/AddCarArgs.ts @@ -5,7 +5,7 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from '@metaplex-foundation/beet'; +import * as beet from "@metaplex-foundation/beet"; export type AddCarArgs = { year: number; make: string; @@ -18,9 +18,9 @@ export type AddCarArgs = { */ export const addCarArgsBeet = new beet.FixableBeetArgsStruct( [ - ['year', beet.u16], - ['make', beet.utf8String], - ['model', beet.utf8String], + ["year", beet.u16], + ["make", beet.utf8String], + ["model", beet.utf8String], ], - 'AddCarArgs', + "AddCarArgs", ); diff --git a/tools/shank-and-solita/native/tests/generated/types/BookRentalArgs.ts b/tools/shank-and-solita/native/tests/generated/types/BookRentalArgs.ts index b1088ead6..f236b7efa 100644 --- a/tools/shank-and-solita/native/tests/generated/types/BookRentalArgs.ts +++ b/tools/shank-and-solita/native/tests/generated/types/BookRentalArgs.ts @@ -5,7 +5,7 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from '@metaplex-foundation/beet'; +import * as beet from "@metaplex-foundation/beet"; export type BookRentalArgs = { name: string; pickUpDate: string; @@ -19,10 +19,10 @@ export type BookRentalArgs = { */ export const bookRentalArgsBeet = new beet.FixableBeetArgsStruct( [ - ['name', beet.utf8String], - ['pickUpDate', beet.utf8String], - ['returnDate', beet.utf8String], - ['price', beet.u64], + ["name", beet.utf8String], + ["pickUpDate", beet.utf8String], + ["returnDate", beet.utf8String], + ["price", beet.u64], ], - 'BookRentalArgs', + "BookRentalArgs", ); diff --git a/tools/shank-and-solita/native/tests/generated/types/RentalOrderStatus.ts b/tools/shank-and-solita/native/tests/generated/types/RentalOrderStatus.ts index 52a96ab23..66d5f5a15 100644 --- a/tools/shank-and-solita/native/tests/generated/types/RentalOrderStatus.ts +++ b/tools/shank-and-solita/native/tests/generated/types/RentalOrderStatus.ts @@ -5,7 +5,7 @@ * See: https://github.com/metaplex-foundation/solita */ -import * as beet from '@metaplex-foundation/beet'; +import * as beet from "@metaplex-foundation/beet"; /** * @category enums * @category generated @@ -20,4 +20,7 @@ export enum RentalOrderStatus { * @category userTypes * @category generated */ -export const rentalOrderStatusBeet = beet.fixedScalarEnum(RentalOrderStatus) as beet.FixedSizeBeet; +export const rentalOrderStatusBeet = beet.fixedScalarEnum(RentalOrderStatus) as beet.FixedSizeBeet< + RentalOrderStatus, + RentalOrderStatus +>; diff --git a/tools/shank-and-solita/native/tests/generated/types/index.ts b/tools/shank-and-solita/native/tests/generated/types/index.ts index 2e86601ee..dc2300b8e 100644 --- a/tools/shank-and-solita/native/tests/generated/types/index.ts +++ b/tools/shank-and-solita/native/tests/generated/types/index.ts @@ -1,3 +1,3 @@ -export * from './AddCarArgs'; -export * from './BookRentalArgs'; -export * from './RentalOrderStatus'; +export * from "./AddCarArgs"; +export * from "./BookRentalArgs"; +export * from "./RentalOrderStatus"; diff --git a/tools/shank-and-solita/native/tests/test.ts b/tools/shank-and-solita/native/tests/test.ts index 3fa66a96f..b1ab61acf 100644 --- a/tools/shank-and-solita/native/tests/test.ts +++ b/tools/shank-and-solita/native/tests/test.ts @@ -1,5 +1,5 @@ -import { Connection, Keypair, PublicKey, SystemProgram, sendAndConfirmTransaction, Transaction } from '@solana/web3.js'; -import { describe, it } from 'mocha'; +import { Connection, Keypair, PublicKey, SystemProgram, sendAndConfirmTransaction, Transaction } from "@solana/web3.js"; +import { describe, it } from "mocha"; import { type AddCarArgs, Car, @@ -9,42 +9,42 @@ import { createReturnCarInstruction, RentalOrder, RentalOrderStatus, -} from './generated'; +} from "./generated"; function loadKeypairFromFile(path: string): Keypair { - return Keypair.fromSecretKey(Buffer.from(JSON.parse(require('node:fs').readFileSync(path, 'utf-8')))); + return Keypair.fromSecretKey(Buffer.from(JSON.parse(require("node:fs").readFileSync(path, "utf-8")))); } const carBmw: AddCarArgs = { year: 2020, - make: 'BMW', - model: 'iX1', + make: "BMW", + model: "iX1", }; const carMercedes: AddCarArgs = { year: 2019, - make: 'Mercedes-Benz', - model: 'EQS', + make: "Mercedes-Benz", + model: "EQS", }; const rentalInfo = { - name: 'Fred Flinstone', - pickUpDate: '01/28/2023 8:00 AM', - returnDate: '01/28/2023 10:00 PM', + name: "Fred Flinstone", + pickUpDate: "01/28/2023 8:00 AM", + returnDate: "01/28/2023 10:00 PM", price: 300, }; -describe('Car Rental Service', () => { - const connection = new Connection('https://api.devnet.solana.com', 'confirmed'); - const payer = loadKeypairFromFile(`${require('node:os').homedir()}/.config/solana/id.json`); - const program = loadKeypairFromFile('./program/target/deploy/car_rental_service-keypair.json'); +describe("Car Rental Service", () => { + const connection = new Connection("https://api.devnet.solana.com", "confirmed"); + const payer = loadKeypairFromFile(`${require("node:os").homedir()}/.config/solana/id.json`); + const program = loadKeypairFromFile("./program/target/deploy/car_rental_service-keypair.json"); let bmwPublicKey: PublicKey; let _mercedesPublicKey: PublicKey; async function createCar(car: AddCarArgs): Promise { const carAccountPublicKey = PublicKey.findProgramAddressSync( - [Buffer.from('car'), Buffer.from(car.make), Buffer.from(car.model)], + [Buffer.from("car"), Buffer.from(car.make), Buffer.from(car.model)], program.publicKey, )[0]; const ix = createAddCarInstruction( @@ -58,31 +58,31 @@ describe('Car Rental Service', () => { const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer], { skipPreflight: true }); await connection.confirmTransaction(sx); const carData = await Car.fromAccountAddress(connection, carAccountPublicKey); - console.log('New car created:'); + console.log("New car created:"); console.log(` Year : ${carData.year}`); console.log(` Make : ${carData.make}`); console.log(` Model : ${carData.model}`); return carAccountPublicKey; } - it('Create a car that can be rented', async () => { + it("Create a car that can be rented", async () => { bmwPublicKey = await createCar(carBmw); }); - it('Create another car that can be rented', async () => { + it("Create another car that can be rented", async () => { _mercedesPublicKey = await createCar(carMercedes); }); const evaluateStatus = (status: RentalOrderStatus): string => { - if (status === RentalOrderStatus.Created) return 'Created'; - if (status === RentalOrderStatus.PickedUp) return 'Picked Up'; - return 'Returned'; + if (status === RentalOrderStatus.Created) return "Created"; + if (status === RentalOrderStatus.PickedUp) return "Picked Up"; + return "Returned"; }; async function printRentalDetails(rentalPublicKey: PublicKey, carPublicKey: PublicKey) { const rentalData = await RentalOrder.fromAccountAddress(connection, rentalPublicKey); const carData = await Car.fromAccountAddress(connection, carPublicKey); - console.log('Rental booked:'); - console.log(' Vehicle details:'); + console.log("Rental booked:"); + console.log(" Vehicle details:"); console.log(` Year : ${carData.year}`); console.log(` Make : ${carData.make}`); console.log(` Model : ${carData.model}`); @@ -93,9 +93,9 @@ describe('Car Rental Service', () => { console.log(` Status : ${evaluateStatus(rentalData.status)}`); } - it('Book a new rental', async () => { + it("Book a new rental", async () => { const rentalAccountPublicKey = PublicKey.findProgramAddressSync( - [Buffer.from('rental_order'), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()], + [Buffer.from("rental_order"), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()], program.publicKey, )[0]; const ix = createBookRentalInstruction( @@ -114,9 +114,9 @@ describe('Car Rental Service', () => { await printRentalDetails(rentalAccountPublicKey, bmwPublicKey); }); - it('Pick up your rental car', async () => { + it("Pick up your rental car", async () => { const rentalAccountPublicKey = PublicKey.findProgramAddressSync( - [Buffer.from('rental_order'), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()], + [Buffer.from("rental_order"), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()], program.publicKey, )[0]; const ix = createPickUpCarInstruction({ @@ -129,9 +129,9 @@ describe('Car Rental Service', () => { await printRentalDetails(rentalAccountPublicKey, bmwPublicKey); }); - it('Return your rental car', async () => { + it("Return your rental car", async () => { const rentalAccountPublicKey = PublicKey.findProgramAddressSync( - [Buffer.from('rental_order'), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()], + [Buffer.from("rental_order"), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()], program.publicKey, )[0]; const ix = createReturnCarInstruction({ diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index a46b42c19..000000000 --- a/yarn.lock +++ /dev/null @@ -1,153 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@biomejs/biome@1.7.3": - version "1.7.3" - resolved "https://registry.npmjs.org/@biomejs/biome/-/biome-1.7.3.tgz" - integrity sha512-ogFQI+fpXftr+tiahA6bIXwZ7CSikygASdqMtH07J2cUzrpjyTMVc9Y97v23c7/tL1xCZhM+W9k4hYIBm7Q6cQ== - optionalDependencies: - "@biomejs/cli-darwin-arm64" "1.7.3" - "@biomejs/cli-darwin-x64" "1.7.3" - "@biomejs/cli-linux-arm64" "1.7.3" - "@biomejs/cli-linux-arm64-musl" "1.7.3" - "@biomejs/cli-linux-x64" "1.7.3" - "@biomejs/cli-linux-x64-musl" "1.7.3" - "@biomejs/cli-win32-arm64" "1.7.3" - "@biomejs/cli-win32-x64" "1.7.3" - -"@biomejs/cli-darwin-arm64@1.7.3": - version "1.7.3" - resolved "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.7.3.tgz" - integrity sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ== - -"@cspotcode/source-map-support@^0.8.0": - version "0.8.1" - resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" - integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== - dependencies: - "@jridgewell/trace-mapping" "0.3.9" - -"@jridgewell/resolve-uri@^3.0.3": - version "3.1.1" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" - integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/trace-mapping@0.3.9": - version "0.3.9" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" - integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== - dependencies: - "@jridgewell/resolve-uri" "^3.0.3" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@tsconfig/node10@^1.0.7": - version "1.0.9" - resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz" - integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== - -"@tsconfig/node12@^1.0.7": - version "1.0.11" - resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" - integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== - -"@tsconfig/node14@^1.0.0": - version "1.0.3" - resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" - integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== - -"@tsconfig/node16@^1.0.2": - version "1.0.4" - resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" - integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== - -"@types/node@*", "@types/node@^20.9.0": - version "20.9.0" - resolved "https://registry.npmjs.org/@types/node/-/node-20.9.0.tgz" - integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== - dependencies: - undici-types "~5.26.4" - -acorn-walk@^8.1.1: - version "8.3.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.0.tgz" - integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== - -acorn@^8.4.1: - version "8.11.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== - -arg@^4.1.0: - version "4.1.3" - resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" - integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== - -create-require@^1.1.0: - version "1.1.1" - resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" - integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== - -diff@^4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" - integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== - -husky@^9.0.11: - version "9.0.11" - resolved "https://registry.npmjs.org/husky/-/husky-9.0.11.tgz" - integrity sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw== - -make-error@^1.1.1: - version "1.3.6" - resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" - integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -ts-node@^10.9.1: - version "10.9.1" - resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz" - integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== - dependencies: - "@cspotcode/source-map-support" "^0.8.0" - "@tsconfig/node10" "^1.0.7" - "@tsconfig/node12" "^1.0.7" - "@tsconfig/node14" "^1.0.0" - "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" - v8-compile-cache-lib "^3.0.1" - yn "3.1.1" - -typescript@^5.2.2, typescript@>=2.7: - version "5.2.2" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz" - integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== - -undici-types@~5.26.4: - version "5.26.5" - resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" - integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== - -v8-compile-cache-lib@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" - integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== - -yn@3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" - integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==