From 3a3cabb39490196309a9bd838116703f973c5447 Mon Sep 17 00:00:00 2001 From: chizor iwuh Date: Tue, 29 Oct 2024 10:15:39 +0100 Subject: [PATCH 1/7] transfer-tokens/steel --- Cargo.lock | 210 +- Cargo.toml | 1 + tokens/transfer-tokens/steel/cicd.sh | 8 + tokens/transfer-tokens/steel/package.json | 29 + tokens/transfer-tokens/steel/pnpm-lock.yaml | 1860 +++++++++++++++++ tokens/transfer-tokens/steel/prepare.mjs | 34 + .../transfer-tokens/steel/program/Cargo.toml | 17 + .../steel/program/src/borsh_instruction.rs | 26 + .../steel/program/src/instructions/create.rs | 107 + .../program/src/instructions/mint_nft.rs | 95 + .../program/src/instructions/mint_spl.rs | 65 + .../steel/program/src/instructions/mod.rs | 20 + .../program/src/instructions/transfer.rs | 69 + .../transfer-tokens/steel/program/src/lib.rs | 30 + .../steel/tests/instructions.ts | 88 + tokens/transfer-tokens/steel/tests/test.ts | 363 ++++ tokens/transfer-tokens/steel/tsconfig.json | 10 + 17 files changed, 2990 insertions(+), 42 deletions(-) create mode 100644 tokens/transfer-tokens/steel/cicd.sh create mode 100644 tokens/transfer-tokens/steel/package.json create mode 100644 tokens/transfer-tokens/steel/pnpm-lock.yaml create mode 100644 tokens/transfer-tokens/steel/prepare.mjs create mode 100644 tokens/transfer-tokens/steel/program/Cargo.toml create mode 100644 tokens/transfer-tokens/steel/program/src/borsh_instruction.rs create mode 100644 tokens/transfer-tokens/steel/program/src/instructions/create.rs create mode 100644 tokens/transfer-tokens/steel/program/src/instructions/mint_nft.rs create mode 100644 tokens/transfer-tokens/steel/program/src/instructions/mint_spl.rs create mode 100644 tokens/transfer-tokens/steel/program/src/instructions/mod.rs create mode 100644 tokens/transfer-tokens/steel/program/src/instructions/transfer.rs create mode 100644 tokens/transfer-tokens/steel/program/src/lib.rs create mode 100644 tokens/transfer-tokens/steel/tests/instructions.ts create mode 100644 tokens/transfer-tokens/steel/tests/test.ts create mode 100644 tokens/transfer-tokens/steel/tsconfig.json diff --git a/Cargo.lock b/Cargo.lock index f54b45b7b..105117983 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,7 +15,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -219,7 +219,7 @@ dependencies = [ "borsh 0.10.3", "bytemuck", "getrandom 0.2.15", - "solana-program", + "solana-program 1.18.17", "thiserror", ] @@ -451,6 +451,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "bincode" version = "1.3.3" @@ -738,7 +744,7 @@ dependencies = [ name = "checking-accounts-program" version = "0.1.0" dependencies = [ - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -765,7 +771,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -807,7 +813,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "shank", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -815,7 +821,7 @@ name = "counter-solana-native" version = "0.1.0" dependencies = [ "borsh 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -838,7 +844,7 @@ dependencies = [ name = "create-account-program" version = "0.1.0" dependencies = [ - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1154,7 +1160,7 @@ dependencies = [ name = "hello-solana-program" version = "0.1.0" dependencies = [ - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1407,6 +1413,19 @@ dependencies = [ "zeroize", ] +[[package]] +name = "mpl-token-metadata" +version = "4.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf0f61b553e424a6234af1268456972ee66c2222e1da89079242251fa7479e5" +dependencies = [ + "borsh 0.10.3", + "num-derive 0.3.3", + "num-traits", + "solana-program 1.18.17", + "thiserror", +] + [[package]] name = "num-bigint" version = "0.4.6" @@ -1571,7 +1590,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1674,7 +1693,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1683,7 +1702,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1692,7 +1711,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1830,7 +1849,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1884,7 +1903,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -2202,13 +2221,59 @@ dependencies = [ "sha3 0.10.8", "solana-frozen-abi", "solana-frozen-abi-macro", - "solana-sdk-macro", + "solana-sdk-macro 1.18.17", "thiserror", "tiny-bip39", "wasm-bindgen", "zeroize", ] +[[package]] +name = "solana-program" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2625a23c3813b620141ee447819b08d1b9a5f1c69a309754834e3f35798a21fb" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "base64 0.22.1", + "bincode", + "bitflags", + "blake3", + "borsh 0.10.3", + "borsh 1.5.1", + "bs58 0.5.1", + "bv", + "bytemuck", + "bytemuck_derive", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.2.15", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memoffset", + "num-bigint", + "num-derive 0.4.2", + "num-traits", + "parking_lot", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "sha2 0.10.8", + "sha3 0.10.8", + "solana-sdk-macro 2.0.14", + "thiserror", + "wasm-bindgen", +] + [[package]] name = "solana-sdk" version = "1.18.17" @@ -2257,8 +2322,8 @@ dependencies = [ "solana-frozen-abi", "solana-frozen-abi-macro", "solana-logger", - "solana-program", - "solana-sdk-macro", + "solana-program 1.18.17", + "solana-sdk-macro 1.18.17", "thiserror", "uriparse", "wasm-bindgen", @@ -2277,6 +2342,19 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "solana-sdk-macro" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93a5a1eabc890415d326707afe62cd7a2009236e8d899c1519566fc8f7e3977b" +dependencies = [ + "bs58 0.5.1", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.72", +] + [[package]] name = "solana-security-txt" version = "1.1.1" @@ -2305,7 +2383,7 @@ dependencies = [ "serde", "serde_json", "sha3 0.9.1", - "solana-program", + "solana-program 1.18.17", "solana-sdk", "subtle", "thiserror", @@ -2322,7 +2400,7 @@ dependencies = [ "borsh 0.10.3", "num-derive 0.4.2", "num-traits", - "solana-program", + "solana-program 1.18.17", "spl-token", "spl-token-2022 1.0.0", "thiserror", @@ -2335,7 +2413,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator-derive", ] @@ -2369,7 +2447,7 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0dc6f70db6bacea7ff25870b016a65ba1d1b6013536f08e4fd79a8f9005325" dependencies = [ - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -2378,7 +2456,7 @@ version = "4.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a49f49f95f2d02111ded31696ab38a081fab623d4c76bd4cb074286db4560836" dependencies = [ - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -2389,7 +2467,7 @@ checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" dependencies = [ "borsh 0.10.3", "bytemuck", - "solana-program", + "solana-program 1.18.17", "solana-zk-token-sdk", "spl-program-error 0.3.0", ] @@ -2402,7 +2480,7 @@ checksum = "af92f74cd3b0fdfda59fef4b571a92123e4df0f67cc43f73163975d31118ef82" dependencies = [ "num-derive 0.3.3", "num-traits", - "solana-program", + "solana-program 1.18.17", "spl-program-error-derive 0.2.0", "thiserror", ] @@ -2415,7 +2493,7 @@ checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" dependencies = [ "num-derive 0.4.2", "num-traits", - "solana-program", + "solana-program 1.18.17", "spl-program-error-derive 0.3.2", "thiserror", ] @@ -2450,7 +2528,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82149a5a06b5f158d03904066375eaf0c8a2422557cc3d5a25d277260d9a3b16" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-program-error 0.2.0", "spl-type-length-value 0.2.0", @@ -2463,7 +2541,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "615d381f48ddd2bb3c57c7f7fb207591a2a05054639b18a62e785117dd7a8683" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-pod", "spl-program-error 0.3.0", @@ -2481,7 +2559,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "num_enum 0.7.3", - "solana-program", + "solana-program 1.18.17", "thiserror", ] @@ -2496,7 +2574,7 @@ dependencies = [ "num-derive 0.3.3", "num-traits", "num_enum 0.6.1", - "solana-program", + "solana-program 1.18.17", "solana-zk-token-sdk", "spl-memo 3.0.1", "spl-token", @@ -2515,7 +2593,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "num_enum 0.7.3", - "solana-program", + "solana-program 1.18.17", "solana-security-txt", "solana-zk-token-sdk", "spl-memo 4.0.4", @@ -2535,7 +2613,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-pod", "spl-program-error 0.3.0", @@ -2548,7 +2626,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" dependencies = [ "borsh 0.10.3", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-pod", "spl-program-error 0.3.0", @@ -2566,7 +2644,7 @@ dependencies = [ "num-derive 0.3.3", "num-traits", "num_enum 0.6.1", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-tlv-account-resolution 0.2.0", "spl-type-length-value 0.2.0", @@ -2581,7 +2659,7 @@ checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" dependencies = [ "arrayref", "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-pod", "spl-program-error 0.3.0", @@ -2596,7 +2674,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1d085f426b33b8365fb98383d1b8b3925e21bdfe579c851ceaa7f511dbec191" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-program-error 0.2.0", ] @@ -2608,12 +2686,46 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-pod", "spl-program-error 0.3.0", ] +[[package]] +name = "steel" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d88c610ca9fd5e4e51bdb6e9964114133a42f006713fe38aff37266fac91e1be" +dependencies = [ + "bytemuck", + "num_enum 0.7.3", + "solana-program 1.18.17", + "thiserror", +] + +[[package]] +name = "steel" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ca3cc310b7b71ce7944af64fb4fdaa5d0c2848ac79616d75e401913b6f781" +dependencies = [ + "bytemuck", + "num_enum 0.7.3", + "solana-program 1.18.17", + "spl-associated-token-account", + "spl-token", + "thiserror", +] + +[[package]] +name = "steel-hello-solana" +version = "0.1.0" +dependencies = [ + "solana-program 2.0.14", + "steel 1.3.0", +] + [[package]] name = "strsim" version = "0.11.1" @@ -2729,7 +2841,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -2740,7 +2852,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -2751,7 +2863,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -2762,7 +2874,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -2773,7 +2885,7 @@ version = "0.1.0" dependencies = [ "borsh 0.10.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -2856,7 +2968,21 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", +] + +[[package]] +name = "transfer-tokens-steel-program" +version = "0.1.0" +dependencies = [ + "borsh 1.5.1", + "bytemuck", + "mpl-token-metadata", + "num_enum 0.7.3", + "solana-program 1.18.17", + "spl-associated-token-account", + "spl-token", + "steel 2.1.1", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index c13e8b8c0..2735ee525 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,7 @@ members = [ "basics/repository-layout/anchor/programs/*", "basics/transfer-sol/native/program", "basics/transfer-sol/anchor/programs/*", + "tokens/transfer-tokens/steel/program", "tokens/token-2022/mint-close-authority/native/program", "tokens/token-2022/non-transferable/native/program", "tokens/token-2022/default-account-state/native/program", diff --git a/tokens/transfer-tokens/steel/cicd.sh b/tokens/transfer-tokens/steel/cicd.sh new file mode 100644 index 000000000..8a16e0387 --- /dev/null +++ b/tokens/transfer-tokens/steel/cicd.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +# This script is for quick building & deploying of the program. +# It also serves as a reference for the commands used for building & deploying Solana programs. +# Run this bad boy with "bash cicd.sh" or "./cicd.sh" + +cargo build-sbf --manifest-path=./program/Cargo.toml +solana program deploy ./program/target/deploy/program.so diff --git a/tokens/transfer-tokens/steel/package.json b/tokens/transfer-tokens/steel/package.json new file mode 100644 index 000000000..2a2e900c0 --- /dev/null +++ b/tokens/transfer-tokens/steel/package.json @@ -0,0 +1,29 @@ +{ + "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", + "postinstall": "zx prepare.mjs" + }, + "dependencies": { + "@metaplex-foundation/mpl-token-metadata": "^2.5.2", + "@solana/spl-token": "^0.3.7", + "@solana/web3.js": "^1.73.0", + "borsh": "^0.7.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", + "borsh": "0.7.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^4.3.5", + "zx": "^8.1.4" + } +} diff --git a/tokens/transfer-tokens/steel/pnpm-lock.yaml b/tokens/transfer-tokens/steel/pnpm-lock.yaml new file mode 100644 index 000000000..915f34b60 --- /dev/null +++ b/tokens/transfer-tokens/steel/pnpm-lock.yaml @@ -0,0 +1,1860 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@metaplex-foundation/mpl-token-metadata': + specifier: ^2.5.2 + version: 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10) + '@solana/spl-token': + specifier: ^0.3.7 + version: 0.3.11(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10) + '@solana/web3.js': + specifier: ^1.73.0 + version: 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + borsh: + specifier: ^0.7.0 + version: 0.7.0 + buffer: + specifier: ^6.0.3 + version: 6.0.3 + fs: + specifier: ^0.0.1-security + version: 0.0.1-security + devDependencies: + '@types/bn.js': + specifier: ^5.1.0 + version: 5.1.6 + '@types/chai': + specifier: ^4.3.1 + version: 4.3.20 + '@types/mocha': + specifier: ^9.1.1 + version: 9.1.1 + chai: + specifier: ^4.3.4 + version: 4.5.0 + mocha: + specifier: ^9.0.3 + version: 9.2.2 + solana-bankrun: + specifier: ^0.3.0 + version: 0.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + ts-mocha: + specifier: ^10.0.0 + version: 10.0.0(mocha@9.2.2) + typescript: + specifier: ^4.3.5 + version: 4.9.5 + zx: + specifier: ^8.1.4 + version: 8.1.9 + +packages: + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@metaplex-foundation/beet-solana@0.4.1': + resolution: {integrity: sha512-/6o32FNUtwK8tjhotrvU/vorP7umBuRFvBZrC6XCk51aKidBHe5LPVPA5AjGPbV3oftMfRuXPNd9yAGeEqeCDQ==} + + '@metaplex-foundation/beet@0.7.2': + resolution: {integrity: sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg==} + + '@metaplex-foundation/cusper@0.0.2': + resolution: {integrity: sha512-S9RulC2fFCFOQraz61bij+5YCHhSO9llJegK8c8Y6731fSi6snUSQJdCUqYS8AIgR0TKbQvdvgSyIIdbDFZbBA==} + + '@metaplex-foundation/mpl-token-metadata@2.13.0': + resolution: {integrity: sha512-Fl/8I0L9rv4bKTV/RAl5YIbJe9SnQPInKvLz+xR1fEc4/VQkuCn3RPgypfUMEKWmCznzaw4sApDxy6CFS4qmJw==} + + '@noble/curves@1.6.0': + resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + + '@solana/buffer-layout-utils@0.2.0': + resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} + engines: {node: '>= 10'} + + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/codecs-core@2.0.0-rc.1': + resolution: {integrity: sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-data-structures@2.0.0-rc.1': + resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-numbers@2.0.0-rc.1': + resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} + peerDependencies: + typescript: '>=5' + + '@solana/codecs-strings@2.0.0-rc.1': + resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5' + + '@solana/codecs@2.0.0-rc.1': + resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} + peerDependencies: + typescript: '>=5' + + '@solana/errors@2.0.0-rc.1': + resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} + hasBin: true + peerDependencies: + typescript: '>=5' + + '@solana/options@2.0.0-rc.1': + resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} + peerDependencies: + typescript: '>=5' + + '@solana/spl-token-metadata@0.1.6': + resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.95.3 + + '@solana/spl-token@0.3.11': + resolution: {integrity: sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.88.0 + + '@solana/web3.js@1.95.4': + resolution: {integrity: sha512-sdewnNEA42ZSMxqkzdwEWi6fDgzwtJHaQa5ndUGEJYtoOnM6X5cvPmjoTUp7/k7bRrVAxfBgDnvQQHD6yhlLYw==} + + '@swc/helpers@0.5.13': + resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + + '@types/bn.js@5.1.6': + resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} + + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/fs-extra@11.0.4': + resolution: {integrity: sha512-yTbItCNreRooED33qjunPthRcSjERP1r4MqCZc7wv0u2sUkzTFp45tgUfS5+r7FrZPdmCCNflLhVSP/o+SemsQ==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/jsonfile@6.1.4': + resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} + + '@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@22.8.0': + resolution: {integrity: sha512-84rafSBHC/z1i1E3p0cJwKA+CfYDNSXX9WSZBRopjIzLET8oNt6ht2tei4C7izwDeEiLLfdeSVBv1egOH916hg==} + + '@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'} + + ansicolors@0.3.2: + resolution: {integrity: sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==} + + 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'} + + assert@2.1.0: + resolution: {integrity: sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} + + base-x@4.0.0: + resolution: {integrity: sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bigint-buffer@1.1.5: + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} + + bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + 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@5.0.0: + resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + 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@12.1.0: + resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} + engines: {node: '>=18'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + debug@4.3.3: + resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + 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.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + 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==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + 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.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + 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==} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + 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 + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fs@0.0.1-security: + resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + 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==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Glob versions prior to v9 are no longer supported + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + 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'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + 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==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + 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-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-nan@1.3.2: + resolution: {integrity: sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==} + engines: {node: '>= 0.4'} + + 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-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + 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.2: + resolution: {integrity: sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==} + 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} + + 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.2: + resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + object-is@1.1.6: + resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} + engines: {node: '>= 0.4'} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + 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'} + + 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'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + 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.4: + resolution: {integrity: sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + solana-bankrun-darwin-arm64@0.3.1: + resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + solana-bankrun-darwin-universal@0.3.1: + resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} + engines: {node: '>= 10'} + os: [darwin] + + solana-bankrun-darwin-x64@0.3.1: + resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + solana-bankrun-linux-x64-gnu@0.3.1: + resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + solana-bankrun-linux-x64-musl@0.3.1: + resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + solana-bankrun@0.3.1: + resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} + engines: {node: '>= 10'} + + 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@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'} + + 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.8.0: + resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + 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-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + 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.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + 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'} + + zx@8.1.9: + resolution: {integrity: sha512-UHuLHphHmsBYKkAchkSrEN4nzDyagafqC9HUxtc1J7eopaScW6H9dsLJ1lmkAntnLtDTGoM8fa+jrJrXiIfKFA==} + engines: {node: '>= 12.17.0'} + hasBin: true + +snapshots: + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@metaplex-foundation/beet-solana@0.4.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.7.2 + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bs58: 5.0.0 + debug: 4.3.7 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + + '@metaplex-foundation/beet@0.7.2': + dependencies: + ansicolors: 0.3.2 + assert: 2.1.0 + bn.js: 5.2.1 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + '@metaplex-foundation/cusper@0.0.2': {} + + '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10)': + dependencies: + '@metaplex-foundation/beet': 0.7.2 + '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@metaplex-foundation/cusper': 0.0.2 + '@solana/spl-token': 0.3.11(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + debug: 4.3.7 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - supports-color + - typescript + - utf-8-validate + + '@noble/curves@1.6.0': + dependencies: + '@noble/hashes': 1.5.0 + + '@noble/hashes@1.5.0': {} + + '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bigint-buffer: 1.1.5 + bignumber.js: 9.1.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/codecs-core@2.0.0-rc.1(typescript@4.9.5)': + dependencies: + '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) + typescript: 4.9.5 + + '@solana/codecs-data-structures@2.0.0-rc.1(typescript@4.9.5)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) + '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) + typescript: 4.9.5 + + '@solana/codecs-numbers@2.0.0-rc.1(typescript@4.9.5)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) + '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) + typescript: 4.9.5 + + '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) + '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 4.9.5 + + '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@2.0.0-rc.1(typescript@4.9.5)': + dependencies: + chalk: 5.3.0 + commander: 12.1.0 + typescript: 4.9.5 + + '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)': + dependencies: + '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token@0.3.11(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.26.0 + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.5.0 + bigint-buffer: 1.1.5 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 9.0.4 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@swc/helpers@0.5.13': + dependencies: + tslib: 2.8.0 + + '@types/bn.js@5.1.6': + dependencies: + '@types/node': 22.8.0 + + '@types/chai@4.3.20': {} + + '@types/connect@3.4.38': + dependencies: + '@types/node': 12.20.55 + + '@types/fs-extra@11.0.4': + dependencies: + '@types/jsonfile': 6.1.4 + '@types/node': 22.8.0 + optional: true + + '@types/json5@0.0.29': + optional: true + + '@types/jsonfile@6.1.4': + dependencies: + '@types/node': 22.8.0 + optional: true + + '@types/mocha@9.1.1': {} + + '@types/node@12.20.55': {} + + '@types/node@22.8.0': + dependencies: + undici-types: 6.19.8 + + '@types/uuid@8.3.4': {} + + '@types/ws@7.4.7': + dependencies: + '@types/node': 12.20.55 + + '@types/ws@8.5.12': + dependencies: + '@types/node': 22.8.0 + + '@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 + + ansicolors@0.3.2: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + arrify@1.0.1: {} + + assert@2.1.0: + dependencies: + call-bind: 1.0.7 + is-nan: 1.3.2 + object-is: 1.1.6 + object.assign: 4.1.5 + util: 0.12.5 + + assertion-error@1.1.0: {} + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + balanced-match@1.0.2: {} + + base-x@3.0.10: + dependencies: + safe-buffer: 5.2.1 + + base-x@4.0.0: {} + + base64-js@1.5.1: {} + + bigint-buffer@1.1.5: + dependencies: + bindings: 1.5.0 + + bignumber.js@9.1.2: {} + + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bn.js@5.2.1: {} + + 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.3: + dependencies: + fill-range: 7.1.1 + + browser-stdout@1.3.1: {} + + bs58@4.0.1: + dependencies: + base-x: 3.0.10 + + bs58@5.0.0: + dependencies: + base-x: 4.0.0 + + buffer-from@1.1.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.2 + optional: true + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + camelcase@6.3.0: {} + + chai@4.5.0: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + 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@12.1.0: {} + + commander@2.20.3: {} + + concat-map@0.0.1: {} + + debug@4.3.3(supports-color@8.1.1): + dependencies: + ms: 2.1.2 + optionalDependencies: + supports-color: 8.1.1 + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + decamelize@4.0.0: {} + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + delay@5.0.0: {} + + diff@3.5.0: {} + + diff@5.0.0: {} + + emoji-regex@8.0.0: {} + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: + dependencies: + es6-promise: 4.2.8 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eventemitter3@5.0.1: {} + + eyes@0.1.8: {} + + fast-stable-stringify@1.0.0: {} + + fastestsmallesttextencoderdecoder@1.0.22: {} + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.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: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + fs.realpath@1.0.0: {} + + fs@0.0.1-security: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 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 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + growl@1.10.5: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + 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-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-callable@1.2.7: {} + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-nan@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + 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.2(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: {} + + 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.2: + optional: true + + normalize-path@3.0.0: {} + + object-is@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + 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 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + pathval@1.1.1: {} + + picomatch@2.3.1: {} + + possible-typed-array-names@1.0.0: {} + + 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.4: + dependencies: + '@swc/helpers': 0.5.13 + '@types/uuid': 8.3.4 + '@types/ws': 8.5.12 + buffer: 6.0.3 + eventemitter3: 5.0.1 + uuid: 8.3.2 + ws: 8.18.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 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + solana-bankrun-darwin-arm64@0.3.1: + optional: true + + solana-bankrun-darwin-universal@0.3.1: + optional: true + + solana-bankrun-darwin-x64@0.3.1: + optional: true + + solana-bankrun-linux-x64-gnu@0.3.1: + optional: true + + solana-bankrun-linux-x64-musl@0.3.1: + optional: true + + solana-bankrun@0.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bs58: 4.0.1 + optionalDependencies: + solana-bankrun-darwin-arm64: 0.3.1 + solana-bankrun-darwin-universal: 0.3.1 + solana-bankrun-darwin-x64: 0.3.1 + solana-bankrun-linux-x64-gnu: 0.3.1 + solana-bankrun-linux-x64-musl: 0.3.1 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + 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@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 + + 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.8.0: {} + + type-detect@4.1.0: {} + + typescript@4.9.5: {} + + undici-types@6.19.8: {} + + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.2 + optional: true + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + + 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-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@2.0.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.18.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.2.0 + 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: {} + + zx@8.1.9: + optionalDependencies: + '@types/fs-extra': 11.0.4 + '@types/node': 22.8.0 diff --git a/tokens/transfer-tokens/steel/prepare.mjs b/tokens/transfer-tokens/steel/prepare.mjs new file mode 100644 index 000000000..7c5ec464b --- /dev/null +++ b/tokens/transfer-tokens/steel/prepare.mjs @@ -0,0 +1,34 @@ +#!/usr/bin/env zx + +import { mkdir, rm } from 'node:fs/promises'; +import { join } from 'node:path'; +import { $ } from 'zx'; + +const programs = [ + { + id: 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s', + name: 'token_metadata.so', + }, +]; + +const outputDir = 'tests/fixtures'; +const overwrite = true; + +try { + for (const program of programs) { + const { id, name } = program; + const outputFile = join(outputDir, name); + await $`solana config set -um`; + + try { + await mkdir(outputDir, { recursive: true }); + if (overwrite) await rm(outputFile, { force: true }); + await $`solana program dump ${id} ${outputFile}`; + console.log(`Program ${id} dumped to ${outputFile}`); + } catch (error) { + console.error(`Error dumping ${id}: ${error.message}`); + } + } +} catch (error) { + console.error(`Error preparing programs: ${error.message}`); +} diff --git a/tokens/transfer-tokens/steel/program/Cargo.toml b/tokens/transfer-tokens/steel/program/Cargo.toml new file mode 100644 index 000000000..e6e69c536 --- /dev/null +++ b/tokens/transfer-tokens/steel/program/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "transfer-tokens-steel-program" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] + +[dependencies] +solana-program = "=1.18.17" +steel = {version = "2.0", features = ["spl"]} +bytemuck = "1.4" +num_enum = "0.7" +borsh = "1.5.1" +spl-token = { version = "4.0.0", features = [ "no-entrypoint" ] } +spl-associated-token-account = { version = "2.0.3", features = [ "no-entrypoint" ] } +mpl-token-metadata = { version = "4.1.2" } diff --git a/tokens/transfer-tokens/steel/program/src/borsh_instruction.rs b/tokens/transfer-tokens/steel/program/src/borsh_instruction.rs new file mode 100644 index 000000000..c77b66d1f --- /dev/null +++ b/tokens/transfer-tokens/steel/program/src/borsh_instruction.rs @@ -0,0 +1,26 @@ +/// Helper for creating steel instruction with borsh. +/// Not required, but helpful with typing and CPI +/// +#[macro_export] +macro_rules! borsh_instruction { + ($discriminator_name:ident, $struct_name:ident) => { + impl $crate::Discriminator for $struct_name { + fn discriminator() -> u8 { + $discriminator_name::$struct_name as u8 + } + } + + #[allow(dead_code)] + // adds discriminator to the instruction data, helpful with cpis etc. + impl $struct_name { + pub fn to_bytes(&self) -> Result, solana_program::program_error::ProgramError> { + let instruction_vec = borsh::to_vec(self)?; + Ok([ + [$discriminator_name::$struct_name as u8].to_vec(), + instruction_vec, + ] + .concat()) + } + } + }; +} diff --git a/tokens/transfer-tokens/steel/program/src/instructions/create.rs b/tokens/transfer-tokens/steel/program/src/instructions/create.rs new file mode 100644 index 000000000..6acde372d --- /dev/null +++ b/tokens/transfer-tokens/steel/program/src/instructions/create.rs @@ -0,0 +1,107 @@ +use crate::{borsh_instruction, SteelInstruction}; +use borsh::{BorshDeserialize, BorshSerialize}; +use mpl_token_metadata::{instructions as mpl_instruction, types::DataV2}; +use solana_program::{msg, program::invoke, program_pack::Pack, rent::Rent, system_instruction}; +use spl_token::state::Mint; +use steel::*; + +borsh_instruction!(SteelInstruction, Create); + +#[derive(BorshSerialize, BorshDeserialize, Debug)] +pub struct Create { + token_title: String, + token_symbol: String, + token_uri: String, + decimals: u8, +} + +impl Create { + pub fn process(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult { + let args = Self::try_from_slice(data)?; + + let [mint_account, mint_authority, metadata_account, payer, rent, system_program, token_program, _token_metadata_program] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + // First create the account for the Mint + // + msg!("Creating mint account..."); + msg!("Mint: {}", mint_account.key); + invoke( + &system_instruction::create_account( + payer.key, + mint_account.key, + (Rent::get()?).minimum_balance(Mint::LEN), + Mint::LEN as u64, + token_program.key, + ), + &[ + mint_account.clone(), + payer.clone(), + system_program.clone(), + token_program.clone(), + ], + )?; + + // Now initialize that account as a Mint (standard Mint) + // + msg!("Initializing mint account..."); + msg!("Mint: {}", mint_account.key); + + initialize_mint( + mint_account, + mint_authority, + Some(mint_authority), + token_program, + rent, + args.decimals, + )?; + + // Now create the account for that Mint's metadata + // + msg!("Creating metadata account..."); + msg!("Metadata account address: {}", metadata_account.key); + + let ix = &mpl_instruction::CreateMetadataAccountV3 { + metadata: *metadata_account.key, + mint: *mint_account.key, + mint_authority: *mint_authority.key, + payer: *payer.key, + rent: None, + system_program: *system_program.key, + update_authority: (*payer.key, true), + } + .instruction(mpl_instruction::CreateMetadataAccountV3InstructionArgs { + data: DataV2 { + name: args.token_title, + symbol: args.token_symbol, + uri: args.token_uri, + creators: None, + seller_fee_basis_points: 0, + collection: None, + uses: None, + }, + collection_details: None, + is_mutable: false, + }); + + invoke( + ix, + &[ + metadata_account.clone(), + mint_account.clone(), + mint_authority.clone(), + payer.clone(), + payer.clone(), + system_program.clone(), + rent.clone(), + ], + )?; + + msg!("Token mint created successfully."); + + Ok(()) + } +} diff --git a/tokens/transfer-tokens/steel/program/src/instructions/mint_nft.rs b/tokens/transfer-tokens/steel/program/src/instructions/mint_nft.rs new file mode 100644 index 000000000..5dc98e060 --- /dev/null +++ b/tokens/transfer-tokens/steel/program/src/instructions/mint_nft.rs @@ -0,0 +1,95 @@ +use crate::SteelInstruction; +use mpl_token_metadata::instructions as mpl_instruction; +use solana_program::{msg, program::invoke}; +use spl_token::instruction::{self as token_instruction}; +use steel::*; + +instruction!(SteelInstruction, MintNft); + +#[repr(C, packed)] +#[derive(Clone, Copy, Debug, Pod, Zeroable)] +pub struct MintNft {} + +impl MintNft { + pub fn process(accounts: &[AccountInfo<'_>]) -> ProgramResult { + let [mint_account, metadata_account, edition_account, mint_authority, associated_token_account, payer, rent, system_program, token_program, associated_token_program, _token_metadata_program] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + // First create the token account for the user + // + if associated_token_account.lamports() == 0 { + msg!("Creating associated token account..."); + create_associated_token_account( + payer, + payer, + associated_token_account, + mint_account, + system_program, + token_program, + associated_token_program, + )?; + } else { + msg!("Associated token account exists."); + } + msg!("Associated Token Address: {}", associated_token_account.key); + + // Mint the NFT to the user's wallet + // + msg!("Minting NFT to associated token account..."); + invoke( + &token_instruction::mint_to( + token_program.key, + mint_account.key, + associated_token_account.key, + mint_authority.key, + &[mint_authority.key], + 1, + )?, + &[ + mint_account.clone(), + mint_authority.clone(), + associated_token_account.clone(), + token_program.clone(), + ], + )?; + + // We can make this a Limited Edition NFT through Metaplex, + // which will disable minting by setting the Mint & Freeze Authorities to the + // Edition Account. + // + let ix = &mpl_instruction::CreateMasterEditionV3 { + edition: *edition_account.key, + metadata: *metadata_account.key, + mint: *mint_account.key, + mint_authority: *mint_authority.key, + payer: *payer.key, + rent: None, + system_program: *system_program.key, + token_program: *token_program.key, + update_authority: *mint_authority.key, + } + .instruction(mpl_instruction::CreateMasterEditionV3InstructionArgs { max_supply: None }); + + invoke( + ix, + &[ + edition_account.clone(), + mint_account.clone(), + payer.clone(), + mint_authority.clone(), + mint_authority.clone(), + metadata_account.clone(), + token_program.clone(), + system_program.clone(), + rent.clone(), + ], + )?; + + msg!("NFT minted successfully."); + + Ok(()) + } +} diff --git a/tokens/transfer-tokens/steel/program/src/instructions/mint_spl.rs b/tokens/transfer-tokens/steel/program/src/instructions/mint_spl.rs new file mode 100644 index 000000000..324ba04fa --- /dev/null +++ b/tokens/transfer-tokens/steel/program/src/instructions/mint_spl.rs @@ -0,0 +1,65 @@ +use crate::SteelInstruction; +use solana_program::{msg, program::invoke}; +use spl_token::instruction::{self as token_instruction}; +use steel::*; + +instruction!(SteelInstruction, MintSpl); + +#[repr(C, packed)] +#[derive(Clone, Copy, Debug, Pod, Zeroable)] +pub struct MintSpl { + quantity: u64, +} + +impl MintSpl { + pub fn process(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult { + let args = MintSpl::try_from_bytes(data)?; + + let [mint_account, mint_authority, associated_token_account, payer, system_program, token_program, associated_token_program] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + // First create the token account for the user + // + if associated_token_account.lamports() == 0 { + msg!("Creating associated token account..."); + create_associated_token_account( + payer, + payer, + associated_token_account, + mint_account, + system_program, + token_program, + associated_token_program, + )?; + } else { + msg!("Associated token account exists."); + } + msg!("Associated Token Address: {}", associated_token_account.key); + + let quantity = args.quantity; + msg!("Minting {} tokens to associated token account...", quantity); + invoke( + &token_instruction::mint_to( + token_program.key, + mint_account.key, + associated_token_account.key, + mint_authority.key, + &[mint_authority.key], + args.quantity, + )?, + &[ + mint_account.clone(), + mint_authority.clone(), + associated_token_account.clone(), + token_program.clone(), + ], + )?; + + msg!("Tokens minted to wallet successfully."); + + Ok(()) + } +} diff --git a/tokens/transfer-tokens/steel/program/src/instructions/mod.rs b/tokens/transfer-tokens/steel/program/src/instructions/mod.rs new file mode 100644 index 000000000..8d5838692 --- /dev/null +++ b/tokens/transfer-tokens/steel/program/src/instructions/mod.rs @@ -0,0 +1,20 @@ +pub mod create; +pub mod mint_nft; +pub mod mint_spl; +pub mod transfer; + +pub use create::*; +pub use mint_nft::*; +pub use mint_spl::*; +pub use transfer::*; + +use steel::*; + +#[repr(u8)] +#[derive(Clone, Copy, Debug, Eq, PartialEq, TryFromPrimitive)] +pub enum SteelInstruction { + Create = 0, + MintNft = 1, + MintSpl = 2, + TransferTokens = 3, +} diff --git a/tokens/transfer-tokens/steel/program/src/instructions/transfer.rs b/tokens/transfer-tokens/steel/program/src/instructions/transfer.rs new file mode 100644 index 000000000..ba9afdfa7 --- /dev/null +++ b/tokens/transfer-tokens/steel/program/src/instructions/transfer.rs @@ -0,0 +1,69 @@ +use crate::SteelInstruction; +use solana_program::msg; +use steel::*; + +instruction!(SteelInstruction, TransferTokens); + +#[repr(C, packed)] +#[derive(Clone, Copy, Debug, Pod, Zeroable)] +pub struct TransferTokens { + quantity: u64, +} + +impl TransferTokens { + pub fn process(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult { + let args = TransferTokens::try_from_bytes(data)?; + + let [mint_account, from_associated_token_account, to_associated_token_account, owner, recipient, payer, system_program, token_program, associated_token_program] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + // First create the token account for the user + // + if to_associated_token_account.lamports() == 0 { + msg!("Creating associated token account..."); + create_associated_token_account( + payer, + recipient, + to_associated_token_account, + mint_account, + system_program, + token_program, + associated_token_program, + )?; + } else { + msg!("Associated token account exists."); + } + msg!( + "Associated Token Address: {}", + to_associated_token_account.key + ); + + msg!( + "Recipient Associated Token Address: {}", + to_associated_token_account.key + ); + + let quantity = args.quantity; + msg!("Transferring {} tokens...", quantity); + msg!("Mint: {}", mint_account.key); + msg!("Owner Token Address: {}", from_associated_token_account.key); + msg!( + "Recipient Token Address: {}", + to_associated_token_account.key + ); + transfer( + owner, + from_associated_token_account, + to_associated_token_account, + token_program, + args.quantity, + )?; + + msg!("Token mint created successfully."); + + Ok(()) + } +} diff --git a/tokens/transfer-tokens/steel/program/src/lib.rs b/tokens/transfer-tokens/steel/program/src/lib.rs new file mode 100644 index 000000000..db5379cf5 --- /dev/null +++ b/tokens/transfer-tokens/steel/program/src/lib.rs @@ -0,0 +1,30 @@ +mod borsh_instruction; +mod instructions; + +use instructions::*; +use steel::*; + +declare_id!("z7msBPQHDJjTvdQRoEcKyENgXDhSRYeHieN1ZMTqo35"); + +entrypoint!(process_instruction); + +pub fn process_instruction( + program_id: &Pubkey, + accounts: &[AccountInfo], + data: &[u8], +) -> ProgramResult { + // Use crate::ID for program_id instead: + // e.g parse_instruction(&crate::ID, program_id, data) + // using program_id for testing purposes + // + let (ix, data) = parse_instruction(program_id, program_id, data)?; + + match ix { + SteelInstruction::Create => Create::process(accounts, data)?, + SteelInstruction::MintNft => MintNft::process( accounts)?, + SteelInstruction::MintSpl => MintSpl::process(accounts, data)?, + SteelInstruction::TransferTokens => TransferTokens::process(accounts, data)?, + } + + Ok(()) +} diff --git a/tokens/transfer-tokens/steel/tests/instructions.ts b/tokens/transfer-tokens/steel/tests/instructions.ts new file mode 100644 index 000000000..67769eed1 --- /dev/null +++ b/tokens/transfer-tokens/steel/tests/instructions.ts @@ -0,0 +1,88 @@ +import * as borsh from 'borsh'; + +class Assignable { + constructor(properties) { + for (const [key, value] of Object.entries(properties)) { + this[key] = value; + } + } +} + +export enum MyInstruction { + Create = 0, + MintNft = 1, + MintSpl = 2, + TransferTokens = 3, +} + +export class CreateTokenArgs extends Assignable { + toBuffer() { + return Buffer.from(borsh.serialize(CreateTokenArgsSchema, this)); + } +} +const CreateTokenArgsSchema = new Map([ + [ + CreateTokenArgs, + { + kind: 'struct', + fields: [ + ['instruction', 'u8'], + ['token_title', 'string'], + ['token_symbol', 'string'], + ['token_uri', 'string'], + ['decimals', 'u8'], + ], + }, + ], +]); + +export class MintNftArgs extends Assignable { + toBuffer() { + return Buffer.from(borsh.serialize(MintNftArgsSchema, this)); + } +} +const MintNftArgsSchema = new Map([ + [ + MintNftArgs, + { + kind: 'struct', + fields: [['instruction', 'u8']], + }, + ], +]); + +export class MintSplArgs extends Assignable { + toBuffer() { + return Buffer.from(borsh.serialize(MintSplArgsSchema, this)); + } +} +const MintSplArgsSchema = new Map([ + [ + MintSplArgs, + { + kind: 'struct', + fields: [ + ['instruction', 'u8'], + ['quantity', 'u64'], + ], + }, + ], +]); + +export class TransferTokensArgs extends Assignable { + toBuffer() { + return Buffer.from(borsh.serialize(TransferTokensArgsSchema, this)); + } +} +const TransferTokensArgsSchema = new Map([ + [ + TransferTokensArgs, + { + kind: 'struct', + fields: [ + ['instruction', 'u8'], + ['quantity', 'u64'], + ], + }, + ], +]); diff --git a/tokens/transfer-tokens/steel/tests/test.ts b/tokens/transfer-tokens/steel/tests/test.ts new file mode 100644 index 000000000..8dfde4c39 --- /dev/null +++ b/tokens/transfer-tokens/steel/tests/test.ts @@ -0,0 +1,363 @@ +import { Buffer } from 'node:buffer'; +import { describe, test } from 'node:test'; +import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mpl-token-metadata'; +import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync } from '@solana/spl-token'; +import { Keypair, LAMPORTS_PER_SOL, PublicKey, SYSVAR_RENT_PUBKEY, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js'; +import { BN } from 'bn.js'; +import * as borsh from 'borsh'; +import { start } from 'solana-bankrun'; +import { CreateTokenArgs, MintNftArgs, MintSplArgs, MyInstruction, TransferTokensArgs } from './instructions'; + +// class Assignable { +// constructor(properties) { +// for (const [key, value] of Object.entries(properties)) { +// this[key] = value; +// } +// } +// } + +// class CreateTokenArgs extends Assignable { +// toBuffer() { +// return Buffer.from(borsh.serialize(CreateTokenArgsSchema, this)); +// } +// } +// const CreateTokenArgsSchema = new Map([ +// [ +// CreateTokenArgs, +// { +// kind: "struct", +// fields: [ +// ["token_title", "string"], +// ["token_symbol", "string"], +// ["token_uri", "string"], +// ["token_decimals", "u8"], +// ], +// }, +// ], +// ]); + +describe('Create Tokens!', async () => { + const PROGRAM_ID = PublicKey.unique(); + const context = await start( + [ + { name: 'transfer_tokens_steel_program', programId: PROGRAM_ID }, + { name: 'token_metadata', programId: TOKEN_METADATA_PROGRAM_ID }, + ], + [], + ); + const client = context.banksClient; + const payer = context.payer; + + const tokenMintKeypair: Keypair = Keypair.generate(); + const nftMintKeypair: Keypair = Keypair.generate(); + + const recipientWallet = Keypair.generate(); + + test('Create an SPL Token!', async () => { + const metadataAddress = PublicKey.findProgramAddressSync( + [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), tokenMintKeypair.publicKey.toBuffer()], + TOKEN_METADATA_PROGRAM_ID, + )[0]; + + // SPL Token default = 9 decimals + // + const instructionData = new CreateTokenArgs({ + 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, + }); + + const ix = new TransactionInstruction({ + keys: [ + { + pubkey: tokenMintKeypair.publicKey, + isSigner: true, + isWritable: true, + }, // Mint account + { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account + { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer + { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program + { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program + { + pubkey: TOKEN_METADATA_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, // Token metadata program + ], + programId: PROGRAM_ID, + data: instructionData.toBuffer(), + }); + + const tx = new Transaction(); + const [blockhash, _] = await client.getLatestBlockhash(); + tx.recentBlockhash = blockhash; + tx.add(ix).sign(payer, tokenMintKeypair); + + await client.processTransaction(tx); + + console.log('Success!'); + console.log(` Mint Address: ${tokenMintKeypair.publicKey}`); + // console.log(` Tx Signature: ${sx}`); + }); + + test('Create an NFT!', async () => { + const metadataAddress = PublicKey.findProgramAddressSync( + [Buffer.from('metadata'), TOKEN_METADATA_PROGRAM_ID.toBuffer(), nftMintKeypair.publicKey.toBuffer()], + TOKEN_METADATA_PROGRAM_ID, + )[0]; + + // NFT default = 0 decimals + // + const instructionData = new CreateTokenArgs({ + 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: 0, + }); + + const ix = new TransactionInstruction({ + keys: [ + { pubkey: nftMintKeypair.publicKey, isSigner: true, isWritable: true }, // Mint account + { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account + { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer + { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program + { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program + { + pubkey: TOKEN_METADATA_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, // Token metadata program + ], + programId: PROGRAM_ID, + data: instructionData.toBuffer(), + }); + + const tx = new Transaction(); + const [blockhash, _] = await client.getLatestBlockhash(); + tx.recentBlockhash = blockhash; + tx.add(ix).sign(payer, nftMintKeypair); + + await client.processTransaction(tx); + + console.log('Success!'); + console.log(` Mint Address: ${nftMintKeypair.publicKey}`); + // console.log(` Tx Signature: ${sx}`); + }); + + test('Mint some tokens to your wallet!', async () => { + const associatedTokenAccountAddress = getAssociatedTokenAddressSync(tokenMintKeypair.publicKey, payer.publicKey); + + const instructionData = new MintSplArgs({ + instruction: MyInstruction.MintSpl, + quantity: new BN(150), + }); + + const ix = new TransactionInstruction({ + keys: [ + { + pubkey: tokenMintKeypair.publicKey, + isSigner: false, + isWritable: true, + }, // Mint account + { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account + { + pubkey: associatedTokenAccountAddress, + isSigner: false, + isWritable: true, + }, // ATA + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer + { pubkey: SystemProgram.programId, isSigner: false, isWritable: true }, // System program + { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program + { + pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, // Token metadata program + ], + programId: PROGRAM_ID, + data: instructionData.toBuffer(), + }); + + const tx = new Transaction(); + const [blockhash, _] = await client.getLatestBlockhash(); + tx.recentBlockhash = blockhash; + tx.add(ix).sign(payer); + + await client.processTransaction(tx); + + console.log('Success!'); + console.log(` ATA Address: ${associatedTokenAccountAddress}`); + // console.log(` Tx Signature: ${sx}`); + }); + + test('Mint the NFT to your wallet!', async () => { + const metadataAddress = PublicKey.findProgramAddressSync( + [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')], + TOKEN_METADATA_PROGRAM_ID, + )[0]; + + const associatedTokenAccountAddress = getAssociatedTokenAddressSync(nftMintKeypair.publicKey, payer.publicKey); + + const instructionData = new MintNftArgs({ + instruction: MyInstruction.MintNft, + }); + + const ix = new TransactionInstruction({ + keys: [ + { pubkey: nftMintKeypair.publicKey, isSigner: false, isWritable: true }, // Mint account + { pubkey: metadataAddress, isSigner: false, isWritable: true }, // Metadata account + { pubkey: editionAddress, isSigner: false, isWritable: true }, // Edition account + { pubkey: payer.publicKey, isSigner: false, isWritable: true }, // Mint authority account + { + pubkey: associatedTokenAccountAddress, + isSigner: false, + isWritable: true, + }, // ATA + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer + { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, // Rent account + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program + { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program + { + pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, // Associated token program + { + pubkey: TOKEN_METADATA_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, // Token metadata program + ], + programId: PROGRAM_ID, + data: instructionData.toBuffer(), + }); + + const tx = new Transaction(); + const [blockhash, _] = await client.getLatestBlockhash(); + tx.recentBlockhash = blockhash; + tx.add(ix).sign(payer); + + await client.processTransaction(tx); + + console.log('Success!'); + console.log(` ATA Address: ${associatedTokenAccountAddress}`); + console.log(` Tx Signature: ${tx}`); + }); + + test('Prep a new test wallet for transfers', async () => { + const ix = SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: recipientWallet.publicKey, + lamports: 1 * LAMPORTS_PER_SOL, + }); + + const tx = new Transaction(); + const [blockhash, _] = await client.getLatestBlockhash(); + tx.recentBlockhash = blockhash; + tx.add(ix).sign(payer); + + await client.processTransaction(tx); + + console.log(`Recipient Pubkey: ${recipientWallet.publicKey}`); + }); + + test('Transfer tokens to another wallet!', async () => { + const fromAssociatedTokenAddress = getAssociatedTokenAddressSync(tokenMintKeypair.publicKey, payer.publicKey); + console.log(`Owner Token Address: ${fromAssociatedTokenAddress}`); + const toAssociatedTokenAddress = getAssociatedTokenAddressSync(tokenMintKeypair.publicKey, recipientWallet.publicKey); + console.log(`Recipient Token Address: ${toAssociatedTokenAddress}`); + + const transferToInstructionData = new TransferTokensArgs({ + instruction: MyInstruction.TransferTokens, + quantity: new BN(15), + }); + + const ix = new TransactionInstruction({ + keys: [ + { + pubkey: tokenMintKeypair.publicKey, + isSigner: false, + isWritable: true, + }, // Mint account + { + pubkey: fromAssociatedTokenAddress, + isSigner: false, + isWritable: true, + }, // Owner Token account + { pubkey: toAssociatedTokenAddress, isSigner: false, isWritable: true }, // Recipient Token account + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Owner + { pubkey: recipientWallet.publicKey, isSigner: true, isWritable: true }, // Recipient + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program + { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program + { + pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, // Associated token program + ], + programId: PROGRAM_ID, + data: transferToInstructionData.toBuffer(), + }); + + const tx = new Transaction(); + const [blockhash, _] = await client.getLatestBlockhash(); + tx.recentBlockhash = blockhash; + tx.add(ix).sign(payer, recipientWallet); + + await client.processTransaction(tx); + }); + + test('Transfer NFT to another wallet!', async () => { + const fromAssociatedTokenAddress = getAssociatedTokenAddressSync(nftMintKeypair.publicKey, payer.publicKey); + console.log(`Owner Token Address: ${fromAssociatedTokenAddress}`); + const toAssociatedTokenAddress = getAssociatedTokenAddressSync(nftMintKeypair.publicKey, recipientWallet.publicKey); + console.log(`Recipient Token Address: ${toAssociatedTokenAddress}`); + + const transferToInstructionData = new TransferTokensArgs({ + instruction: MyInstruction.TransferTokens, + quantity: new BN(1), + }); + + const ix = new TransactionInstruction({ + keys: [ + { pubkey: nftMintKeypair.publicKey, isSigner: false, isWritable: true }, // Mint account + { + pubkey: fromAssociatedTokenAddress, + isSigner: false, + isWritable: true, + }, // Owner Token account + { pubkey: toAssociatedTokenAddress, isSigner: false, isWritable: true }, // Recipient Token account + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Owner + { pubkey: recipientWallet.publicKey, isSigner: true, isWritable: true }, // Recipient + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // Payer + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // System program + { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // Token program + { + pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, + isSigner: false, + isWritable: false, + }, // Associated token program + ], + programId: PROGRAM_ID, + data: transferToInstructionData.toBuffer(), + }); + + const tx = new Transaction(); + const [blockhash, _] = await client.getLatestBlockhash(); + tx.recentBlockhash = blockhash; + tx.add(ix).sign(payer, recipientWallet); + + await client.processTransaction(tx); + }); +}); diff --git a/tokens/transfer-tokens/steel/tsconfig.json b/tokens/transfer-tokens/steel/tsconfig.json new file mode 100644 index 000000000..cd5d2e3d0 --- /dev/null +++ b/tokens/transfer-tokens/steel/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "commonjs", + "target": "es6", + "esModuleInterop": true + } +} From 29befe25c215adead8ea3372e0ba1e62aa399068 Mon Sep 17 00:00:00 2001 From: chizor iwuh Date: Fri, 1 Nov 2024 11:33:52 +0100 Subject: [PATCH 2/7] transfer-tokens/steel - update deps --- Cargo.lock | 233 ++++++++-- tokens/transfer-tokens/steel/package.json | 17 +- tokens/transfer-tokens/steel/pnpm-lock.yaml | 403 ++++++++---------- .../transfer-tokens/steel/program/Cargo.toml | 2 +- tokens/transfer-tokens/steel/tests/test.ts | 35 +- tokens/transfer-tokens/steel/tsconfig.json | 2 +- 6 files changed, 399 insertions(+), 293 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 105117983..57a2555d8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2406,6 +2406,22 @@ dependencies = [ "thiserror", ] +[[package]] +name = "spl-associated-token-account" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "143109d789171379e6143ef23191786dfaac54289ad6e7917cfb26b36c432b10" +dependencies = [ + "assert_matches", + "borsh 1.5.1", + "num-derive 0.4.2", + "num-traits", + "solana-program 1.18.17", + "spl-token", + "spl-token-2022 3.0.4", + "thiserror", +] + [[package]] name = "spl-discriminator" version = "0.1.0" @@ -2414,7 +2430,18 @@ checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" dependencies = [ "bytemuck", "solana-program 1.18.17", - "spl-discriminator-derive", + "spl-discriminator-derive 0.1.2", +] + +[[package]] +name = "spl-discriminator" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "210101376962bb22bb13be6daea34656ea1cbc248fce2164b146e39203b55e03" +dependencies = [ + "bytemuck", + "solana-program 1.18.17", + "spl-discriminator-derive 0.2.0", ] [[package]] @@ -2424,7 +2451,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", - "spl-discriminator-syn", + "spl-discriminator-syn 0.1.2", + "syn 2.0.72", +] + +[[package]] +name = "spl-discriminator-derive" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" +dependencies = [ + "quote", + "spl-discriminator-syn 0.2.0", "syn 2.0.72", ] @@ -2441,6 +2479,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "spl-discriminator-syn" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.72", + "thiserror", +] + [[package]] name = "spl-memo" version = "3.0.1" @@ -2472,6 +2523,19 @@ dependencies = [ "spl-program-error 0.3.0", ] +[[package]] +name = "spl-pod" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c52d84c55efeef8edcc226743dc089d7e3888b8e3474569aa3eff152b37b9996" +dependencies = [ + "borsh 1.5.1", + "bytemuck", + "solana-program 1.18.17", + "solana-zk-token-sdk", + "spl-program-error 0.4.4", +] + [[package]] name = "spl-program-error" version = "0.2.0" @@ -2498,6 +2562,19 @@ dependencies = [ "thiserror", ] +[[package]] +name = "spl-program-error" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e45a49acb925db68aa501b926096b2164adbdcade7a0c24152af9f0742d0a602" +dependencies = [ + "num-derive 0.4.2", + "num-traits", + "solana-program 1.18.17", + "spl-program-error-derive 0.4.1", + "thiserror", +] + [[package]] name = "spl-program-error-derive" version = "0.2.0" @@ -2521,6 +2598,18 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "spl-program-error-derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" +dependencies = [ + "proc-macro2", + "quote", + "sha2 0.10.8", + "syn 2.0.72", +] + [[package]] name = "spl-tlv-account-resolution" version = "0.2.0" @@ -2529,7 +2618,7 @@ checksum = "82149a5a06b5f158d03904066375eaf0c8a2422557cc3d5a25d277260d9a3b16" dependencies = [ "bytemuck", "solana-program 1.18.17", - "spl-discriminator", + "spl-discriminator 0.1.0", "spl-program-error 0.2.0", "spl-type-length-value 0.2.0", ] @@ -2542,12 +2631,26 @@ checksum = "615d381f48ddd2bb3c57c7f7fb207591a2a05054639b18a62e785117dd7a8683" dependencies = [ "bytemuck", "solana-program 1.18.17", - "spl-discriminator", - "spl-pod", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", "spl-program-error 0.3.0", "spl-type-length-value 0.3.0", ] +[[package]] +name = "spl-tlv-account-resolution" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fab8edfd37be5fa17c9e42c1bff86abbbaf0494b031b37957f2728ad2ff842ba" +dependencies = [ + "bytemuck", + "solana-program 1.18.17", + "spl-discriminator 0.2.5", + "spl-pod 0.2.5", + "spl-program-error 0.4.4", + "spl-type-length-value 0.4.6", +] + [[package]] name = "spl-token" version = "4.0.3" @@ -2597,15 +2700,39 @@ dependencies = [ "solana-security-txt", "solana-zk-token-sdk", "spl-memo 4.0.4", - "spl-pod", + "spl-pod 0.1.0", "spl-token", - "spl-token-group-interface", - "spl-token-metadata-interface", + "spl-token-group-interface 0.1.0", + "spl-token-metadata-interface 0.2.0", "spl-transfer-hook-interface 0.4.1", "spl-type-length-value 0.3.0", "thiserror", ] +[[package]] +name = "spl-token-2022" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b01d1b2851964e257187c0bca43a0de38d0af59192479ca01ac3e2b58b1bd95a" +dependencies = [ + "arrayref", + "bytemuck", + "num-derive 0.4.2", + "num-traits", + "num_enum 0.7.3", + "solana-program 1.18.17", + "solana-security-txt", + "solana-zk-token-sdk", + "spl-memo 4.0.4", + "spl-pod 0.2.5", + "spl-token", + "spl-token-group-interface 0.2.5", + "spl-token-metadata-interface 0.3.5", + "spl-transfer-hook-interface 0.6.5", + "spl-type-length-value 0.4.6", + "thiserror", +] + [[package]] name = "spl-token-group-interface" version = "0.1.0" @@ -2614,11 +2741,24 @@ checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" dependencies = [ "bytemuck", "solana-program 1.18.17", - "spl-discriminator", - "spl-pod", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", "spl-program-error 0.3.0", ] +[[package]] +name = "spl-token-group-interface" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "014817d6324b1e20c4bbc883e8ee30a5faa13e59d91d1b2b95df98b920150c17" +dependencies = [ + "bytemuck", + "solana-program 1.18.17", + "spl-discriminator 0.2.5", + "spl-pod 0.2.5", + "spl-program-error 0.4.4", +] + [[package]] name = "spl-token-metadata-interface" version = "0.2.0" @@ -2627,12 +2767,26 @@ checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" dependencies = [ "borsh 0.10.3", "solana-program 1.18.17", - "spl-discriminator", - "spl-pod", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", "spl-program-error 0.3.0", "spl-type-length-value 0.3.0", ] +[[package]] +name = "spl-token-metadata-interface" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3da00495b602ebcf5d8ba8b3ecff1ee454ce4c125c9077747be49c2d62335ba" +dependencies = [ + "borsh 1.5.1", + "solana-program 1.18.17", + "spl-discriminator 0.2.5", + "spl-pod 0.2.5", + "spl-program-error 0.4.4", + "spl-type-length-value 0.4.6", +] + [[package]] name = "spl-transfer-hook-interface" version = "0.1.0" @@ -2645,7 +2799,7 @@ dependencies = [ "num-traits", "num_enum 0.6.1", "solana-program 1.18.17", - "spl-discriminator", + "spl-discriminator 0.1.0", "spl-tlv-account-resolution 0.2.0", "spl-type-length-value 0.2.0", "thiserror", @@ -2660,13 +2814,29 @@ dependencies = [ "arrayref", "bytemuck", "solana-program 1.18.17", - "spl-discriminator", - "spl-pod", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", "spl-program-error 0.3.0", "spl-tlv-account-resolution 0.5.1", "spl-type-length-value 0.3.0", ] +[[package]] +name = "spl-transfer-hook-interface" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9b5c08a89838e5a2931f79b17f611857f281a14a2100968a3ccef352cb7414b" +dependencies = [ + "arrayref", + "bytemuck", + "solana-program 1.18.17", + "spl-discriminator 0.2.5", + "spl-pod 0.2.5", + "spl-program-error 0.4.4", + "spl-tlv-account-resolution 0.6.5", + "spl-type-length-value 0.4.6", +] + [[package]] name = "spl-type-length-value" version = "0.2.0" @@ -2675,7 +2845,7 @@ checksum = "f1d085f426b33b8365fb98383d1b8b3925e21bdfe579c851ceaa7f511dbec191" dependencies = [ "bytemuck", "solana-program 1.18.17", - "spl-discriminator", + "spl-discriminator 0.1.0", "spl-program-error 0.2.0", ] @@ -2687,11 +2857,24 @@ checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" dependencies = [ "bytemuck", "solana-program 1.18.17", - "spl-discriminator", - "spl-pod", + "spl-discriminator 0.1.0", + "spl-pod 0.1.0", "spl-program-error 0.3.0", ] +[[package]] +name = "spl-type-length-value" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c872f93d0600e743116501eba2d53460e73a12c9a496875a42a7d70e034fe06d" +dependencies = [ + "bytemuck", + "solana-program 1.18.17", + "spl-discriminator 0.2.5", + "spl-pod 0.2.5", + "spl-program-error 0.4.4", +] + [[package]] name = "steel" version = "1.3.0" @@ -2713,7 +2896,7 @@ dependencies = [ "bytemuck", "num_enum 0.7.3", "solana-program 1.18.17", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-token", "thiserror", ] @@ -2842,7 +3025,7 @@ dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", "solana-program 1.18.17", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-token-2022 0.7.0", ] @@ -2853,7 +3036,7 @@ dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", "solana-program 1.18.17", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-token-2022 0.7.0", ] @@ -2864,7 +3047,7 @@ dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", "solana-program 1.18.17", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-token-2022 0.7.0", ] @@ -2875,7 +3058,7 @@ dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", "solana-program 1.18.17", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-token-2022 0.7.0", ] @@ -2886,7 +3069,7 @@ dependencies = [ "borsh 0.10.3", "borsh-derive 0.9.3", "solana-program 1.18.17", - "spl-associated-token-account", + "spl-associated-token-account 2.3.0", "spl-token-2022 0.7.0", ] @@ -2980,7 +3163,7 @@ dependencies = [ "mpl-token-metadata", "num_enum 0.7.3", "solana-program 1.18.17", - "spl-associated-token-account", + "spl-associated-token-account 3.0.4", "spl-token", "steel 2.1.1", ] diff --git a/tokens/transfer-tokens/steel/package.json b/tokens/transfer-tokens/steel/package.json index 2a2e900c0..6aada6a83 100644 --- a/tokens/transfer-tokens/steel/package.json +++ b/tokens/transfer-tokens/steel/package.json @@ -8,22 +8,21 @@ }, "dependencies": { "@metaplex-foundation/mpl-token-metadata": "^2.5.2", - "@solana/spl-token": "^0.3.7", - "@solana/web3.js": "^1.73.0", - "borsh": "^0.7.0", - "buffer": "^6.0.3", - "fs": "^0.0.1-security" + "@solana/spl-token": "^0.4.9", + "@solana/web3.js": "^1.95.4", + "buffer": "^6.0.3" }, "devDependencies": { "@types/bn.js": "^5.1.0", "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", + "@types/mocha": "^10.0.9", + "@types/node": "^22.8.6", "borsh": "0.7.0", "chai": "^4.3.4", - "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", + "mocha": "^10.8.2", + "solana-bankrun": "^0.4.0", "ts-mocha": "^10.0.0", - "typescript": "^4.3.5", + "typescript": "^5.6.3", "zx": "^8.1.4" } } diff --git a/tokens/transfer-tokens/steel/pnpm-lock.yaml b/tokens/transfer-tokens/steel/pnpm-lock.yaml index 915f34b60..6f866acb3 100644 --- a/tokens/transfer-tokens/steel/pnpm-lock.yaml +++ b/tokens/transfer-tokens/steel/pnpm-lock.yaml @@ -10,22 +10,16 @@ importers: dependencies: '@metaplex-foundation/mpl-token-metadata': specifier: ^2.5.2 - version: 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10) + version: 2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) '@solana/spl-token': - specifier: ^0.3.7 - version: 0.3.11(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10) + specifier: ^0.4.9 + version: 0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) '@solana/web3.js': - specifier: ^1.73.0 + specifier: ^1.95.4 version: 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) - borsh: - specifier: ^0.7.0 - version: 0.7.0 buffer: specifier: ^6.0.3 version: 6.0.3 - fs: - specifier: ^0.0.1-security - version: 0.0.1-security devDependencies: '@types/bn.js': specifier: ^5.1.0 @@ -34,23 +28,29 @@ importers: specifier: ^4.3.1 version: 4.3.20 '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 + specifier: ^10.0.9 + version: 10.0.9 + '@types/node': + specifier: ^22.8.6 + version: 22.8.6 + borsh: + specifier: 0.7.0 + version: 0.7.0 chai: specifier: ^4.3.4 version: 4.5.0 mocha: - specifier: ^9.0.3 - version: 9.2.2 + specifier: ^10.8.2 + version: 10.8.2 solana-bankrun: - specifier: ^0.3.0 - version: 0.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + specifier: ^0.4.0 + version: 0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) ts-mocha: specifier: ^10.0.0 - version: 10.0.0(mocha@9.2.2) + version: 10.0.0(mocha@10.8.2) typescript: - specifier: ^4.3.5 - version: 4.9.5 + specifier: ^5.6.3 + version: 5.6.3 zx: specifier: ^8.1.4 version: 8.1.9 @@ -126,6 +126,12 @@ packages: peerDependencies: typescript: '>=5' + '@solana/spl-token-group@0.0.7': + resolution: {integrity: sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.95.3 + '@solana/spl-token-metadata@0.1.6': resolution: {integrity: sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA==} engines: {node: '>=16'} @@ -138,6 +144,12 @@ packages: peerDependencies: '@solana/web3.js': ^1.88.0 + '@solana/spl-token@0.4.9': + resolution: {integrity: sha512-g3wbj4F4gq82YQlwqhPB0gHFXfgsC6UmyGMxtSLf/BozT/oKd59465DbnlUK8L8EcimKMavxsVAMoLcEdeCicg==} + engines: {node: '>=16'} + peerDependencies: + '@solana/web3.js': ^1.95.3 + '@solana/web3.js@1.95.4': resolution: {integrity: sha512-sdewnNEA42ZSMxqkzdwEWi6fDgzwtJHaQa5ndUGEJYtoOnM6X5cvPmjoTUp7/k7bRrVAxfBgDnvQQHD6yhlLYw==} @@ -162,14 +174,14 @@ packages: '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} + '@types/mocha@10.0.9': + resolution: {integrity: sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==} '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.8.0': - resolution: {integrity: sha512-84rafSBHC/z1i1E3p0cJwKA+CfYDNSXX9WSZBRopjIzLET8oNt6ht2tei4C7izwDeEiLLfdeSVBv1egOH916hg==} + '@types/node@22.8.6': + resolution: {integrity: sha512-tosuJYKrIqjQIlVCM4PEGxOmyg3FCPa/fViuJChnGeEIhjA46oy8FMVoF9su1/v8PNs2a8Q0iFNyOx0uOF91nw==} '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -180,9 +192,6 @@ packages: '@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 @@ -191,8 +200,8 @@ packages: resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} engines: {node: '>= 8.0.0'} - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} ansi-regex@5.0.1: @@ -259,8 +268,8 @@ packages: borsh@0.7.0: resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} braces@3.0.3: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} @@ -329,18 +338,6 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -374,8 +371,8 @@ packages: resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} engines: {node: '>=0.3.1'} - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} emoji-regex@8.0.0: @@ -437,9 +434,6 @@ packages: fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -463,17 +457,14 @@ packages: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} deprecated: Glob versions prior to v9 are no longer supported gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - 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'} @@ -562,9 +553,6 @@ packages: 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: @@ -604,11 +592,8 @@ packages: 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==} + minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} minimist@1.2.8: @@ -618,22 +603,14 @@ packages: 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'} + mocha@10.8.2: + resolution: {integrity: sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==} + engines: {node: '>= 14.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} @@ -678,10 +655,6 @@ packages: 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==} @@ -713,44 +686,44 @@ packages: safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - serialize-javascript@6.0.0: - resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + serialize-javascript@6.0.2: + resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} - solana-bankrun-darwin-arm64@0.3.1: - resolution: {integrity: sha512-9LWtH/3/WR9fs8Ve/srdo41mpSqVHmRqDoo69Dv1Cupi+o1zMU6HiEPUHEvH2Tn/6TDbPEDf18MYNfReLUqE6A==} + solana-bankrun-darwin-arm64@0.4.0: + resolution: {integrity: sha512-6dz78Teoz7ez/3lpRLDjktYLJb79FcmJk2me4/YaB8WiO6W43OdExU4h+d2FyuAryO2DgBPXaBoBNY/8J1HJmw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - solana-bankrun-darwin-universal@0.3.1: - resolution: {integrity: sha512-muGHpVYWT7xCd8ZxEjs/bmsbMp8XBqroYGbE4lQPMDUuLvsJEIrjGqs3MbxEFr71sa58VpyvgywWd5ifI7sGIg==} + solana-bankrun-darwin-universal@0.4.0: + resolution: {integrity: sha512-zSSw/Jx3KNU42pPMmrEWABd0nOwGJfsj7nm9chVZ3ae7WQg3Uty0hHAkn5NSDCj3OOiN0py9Dr1l9vmRJpOOxg==} engines: {node: '>= 10'} os: [darwin] - solana-bankrun-darwin-x64@0.3.1: - resolution: {integrity: sha512-oCaxfHyt7RC3ZMldrh5AbKfy4EH3YRMl8h6fSlMZpxvjQx7nK7PxlRwMeflMnVdkKKp7U8WIDak1lilIPd3/lg==} + solana-bankrun-darwin-x64@0.4.0: + resolution: {integrity: sha512-LWjs5fsgHFtyr7YdJR6r0Ho5zrtzI6CY4wvwPXr8H2m3b4pZe6RLIZjQtabCav4cguc14G0K8yQB2PTMuGub8w==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - solana-bankrun-linux-x64-gnu@0.3.1: - resolution: {integrity: sha512-PfRFhr7igGFNt2Ecfdzh3li9eFPB3Xhmk0Eib17EFIB62YgNUg3ItRnQQFaf0spazFjjJLnglY1TRKTuYlgSVA==} + solana-bankrun-linux-x64-gnu@0.4.0: + resolution: {integrity: sha512-SrlVrb82UIxt21Zr/XZFHVV/h9zd2/nP25PMpLJVLD7Pgl2yhkhfi82xj3OjxoQqWe+zkBJ+uszA0EEKr67yNw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - solana-bankrun-linux-x64-musl@0.3.1: - resolution: {integrity: sha512-6r8i0NuXg3CGURql8ISMIUqhE7Hx/O7MlIworK4oN08jYrP0CXdLeB/hywNn7Z8d1NXrox/NpYUgvRm2yIzAsQ==} + solana-bankrun-linux-x64-musl@0.4.0: + resolution: {integrity: sha512-Nv328ZanmURdYfcLL+jwB1oMzX4ZzK57NwIcuJjGlf0XSNLq96EoaO5buEiUTo4Ls7MqqMyLbClHcrPE7/aKyA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - solana-bankrun@0.3.1: - resolution: {integrity: sha512-inRwON7fBU5lPC36HdEqPeDg15FXJYcf77+o0iz9amvkUMJepcwnRwEfTNyMVpVYdgjTOBW5vg+596/3fi1kGA==} + solana-bankrun@0.4.0: + resolution: {integrity: sha512-NMmXUipPBkt8NgnyNO3SCnPERP6xT/AMNMBooljGA3+rG6NN8lmXJsKeLqQTiFsDeWD74U++QM/DgcueSWvrIg==} engines: {node: '>= 10'} source-map-support@0.5.21: @@ -823,9 +796,9 @@ packages: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} engines: {node: '>=4'} - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} hasBin: true undici-types@6.19.8: @@ -852,13 +825,8 @@ packages: resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} engines: {node: '>= 0.4'} - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -895,8 +863,8 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} engines: {node: '>=10'} yargs-unparser@2.0.0: @@ -931,7 +899,7 @@ snapshots: '@metaplex-foundation/beet': 0.7.2 '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) bs58: 5.0.0 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -943,21 +911,21 @@ snapshots: ansicolors: 0.3.2 assert: 2.1.0 bn.js: 5.2.1 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - supports-color '@metaplex-foundation/cusper@0.0.2': {} - '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10)': + '@metaplex-foundation/mpl-token-metadata@2.13.0(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': dependencies: '@metaplex-foundation/beet': 0.7.2 '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@metaplex-foundation/cusper': 0.0.2 - '@solana/spl-token': 0.3.11(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10) + '@solana/spl-token': 0.3.11(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) bn.js: 5.2.1 - debug: 4.3.7 + debug: 4.3.7(supports-color@8.1.1) transitivePeerDependencies: - bufferutil - encoding @@ -987,73 +955,96 @@ snapshots: dependencies: buffer: 6.0.3 - '@solana/codecs-core@2.0.0-rc.1(typescript@4.9.5)': + '@solana/codecs-core@2.0.0-rc.1(typescript@5.6.3)': dependencies: - '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) - typescript: 4.9.5 + '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) + typescript: 5.6.3 - '@solana/codecs-data-structures@2.0.0-rc.1(typescript@4.9.5)': + '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.6.3)': dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) - '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) - typescript: 4.9.5 + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) + typescript: 5.6.3 - '@solana/codecs-numbers@2.0.0-rc.1(typescript@4.9.5)': + '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.6.3)': dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) - '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) - typescript: 4.9.5 + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) + typescript: 5.6.3 - '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)': + '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) - '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) fastestsmallesttextencoderdecoder: 1.0.22 - typescript: 4.9.5 + typescript: 5.6.3 - '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)': + '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@4.9.5) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) - '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) - typescript: 4.9.5 + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.6.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/options': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + typescript: 5.6.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/errors@2.0.0-rc.1(typescript@4.9.5)': + '@solana/errors@2.0.0-rc.1(typescript@5.6.3)': dependencies: chalk: 5.3.0 commander: 12.1.0 - typescript: 4.9.5 + typescript: 5.6.3 - '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)': + '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': dependencies: - '@solana/codecs-core': 2.0.0-rc.1(typescript@4.9.5) - '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@4.9.5) - '@solana/codecs-numbers': 2.0.0-rc.1(typescript@4.9.5) - '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) - '@solana/errors': 2.0.0-rc.1(typescript@4.9.5) - typescript: 4.9.5 + '@solana/codecs-core': 2.0.0-rc.1(typescript@5.6.3) + '@solana/codecs-data-structures': 2.0.0-rc.1(typescript@5.6.3) + '@solana/codecs-numbers': 2.0.0-rc.1(typescript@5.6.3) + '@solana/codecs-strings': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/errors': 2.0.0-rc.1(typescript@5.6.3) + typescript: 5.6.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)': + '@solana/spl-token-group@0.0.7(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': dependencies: - '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript - '@solana/spl-token@0.3.11(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5)(utf-8-validate@5.0.10)': + '@solana/spl-token-metadata@0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)': + dependencies: + '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + + '@solana/spl-token@0.3.11(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + dependencies: + '@solana/buffer-layout': 4.0.1 + '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + buffer: 6.0.3 + transitivePeerDependencies: + - bufferutil + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + + '@solana/spl-token@0.4.9(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 '@solana/buffer-layout-utils': 0.2.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@4.9.5) + '@solana/spl-token-group': 0.0.7(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) + '@solana/spl-token-metadata': 0.1.6(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3) '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) buffer: 6.0.3 transitivePeerDependencies: @@ -1091,18 +1082,18 @@ snapshots: '@types/bn.js@5.1.6': dependencies: - '@types/node': 22.8.0 + '@types/node': 22.8.6 '@types/chai@4.3.20': {} '@types/connect@3.4.38': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.8.6 '@types/fs-extra@11.0.4': dependencies: '@types/jsonfile': 6.1.4 - '@types/node': 22.8.0 + '@types/node': 22.8.6 optional: true '@types/json5@0.0.29': @@ -1110,14 +1101,14 @@ snapshots: '@types/jsonfile@6.1.4': dependencies: - '@types/node': 22.8.0 + '@types/node': 22.8.6 optional: true - '@types/mocha@9.1.1': {} + '@types/mocha@10.0.9': {} '@types/node@12.20.55': {} - '@types/node@22.8.0': + '@types/node@22.8.6': dependencies: undici-types: 6.19.8 @@ -1125,13 +1116,11 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.8.6 '@types/ws@8.5.12': dependencies: - '@types/node': 22.8.0 - - '@ungap/promise-all-settled@1.1.2': {} + '@types/node': 22.8.6 JSONStream@1.3.5: dependencies: @@ -1142,7 +1131,7 @@ snapshots: dependencies: humanize-ms: 1.2.1 - ansi-colors@4.1.1: {} + ansi-colors@4.1.3: {} ansi-regex@5.0.1: {} @@ -1205,10 +1194,9 @@ snapshots: bs58: 4.0.1 text-encoding-utf-8: 1.0.2 - brace-expansion@1.1.11: + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 - concat-map: 0.0.1 braces@3.0.3: dependencies: @@ -1295,18 +1283,12 @@ snapshots: commander@2.20.3: {} - concat-map@0.0.1: {} - - debug@4.3.3(supports-color@8.1.1): + debug@4.3.7(supports-color@8.1.1): dependencies: - ms: 2.1.2 + ms: 2.1.3 optionalDependencies: supports-color: 8.1.1 - debug@4.3.7: - dependencies: - ms: 2.1.3 - decamelize@4.0.0: {} deep-eql@4.1.4: @@ -1329,7 +1311,7 @@ snapshots: diff@3.5.0: {} - diff@5.0.0: {} + diff@5.2.0: {} emoji-regex@8.0.0: {} @@ -1376,8 +1358,6 @@ snapshots: fs.realpath@1.0.0: {} - fs@0.0.1-security: {} - fsevents@2.3.3: optional: true @@ -1399,21 +1379,18 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@7.2.0: + glob@8.1.0: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.2 + minimatch: 5.1.6 once: 1.4.0 - path-is-absolute: 1.0.1 gopd@1.0.1: dependencies: get-intrinsic: 1.2.4 - growl@1.10.5: {} - has-flag@4.0.0: {} has-property-descriptors@1.0.2: @@ -1485,8 +1462,6 @@ snapshots: 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) @@ -1537,13 +1512,9 @@ snapshots: make-error@1.3.6: {} - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@4.2.1: + minimatch@5.1.6: dependencies: - brace-expansion: 1.1.11 + brace-expansion: 2.0.1 minimist@1.2.8: {} @@ -1551,39 +1522,31 @@ snapshots: dependencies: minimist: 1.2.8 - mocha@9.2.2: + mocha@10.8.2: dependencies: - '@ungap/promise-all-settled': 1.1.2 - ansi-colors: 4.1.1 + ansi-colors: 4.1.3 browser-stdout: 1.3.1 chokidar: 3.5.3 - debug: 4.3.3(supports-color@8.1.1) - diff: 5.0.0 + debug: 4.3.7(supports-color@8.1.1) + diff: 5.2.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 + glob: 8.1.0 he: 1.2.0 js-yaml: 4.1.0 log-symbols: 4.1.0 - minimatch: 4.2.1 + minimatch: 5.1.6 ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 + serialize-javascript: 6.0.2 strip-json-comments: 3.1.1 supports-color: 8.1.1 - which: 2.0.2 - workerpool: 6.2.0 + workerpool: 6.5.1 yargs: 16.2.0 - yargs-parser: 20.2.4 + yargs-parser: 20.2.9 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 @@ -1621,8 +1584,6 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} - pathval@1.1.1: {} picomatch@2.3.1: {} @@ -1656,7 +1617,7 @@ snapshots: safe-buffer@5.2.1: {} - serialize-javascript@6.0.0: + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -1669,31 +1630,31 @@ snapshots: gopd: 1.0.1 has-property-descriptors: 1.0.2 - solana-bankrun-darwin-arm64@0.3.1: + solana-bankrun-darwin-arm64@0.4.0: optional: true - solana-bankrun-darwin-universal@0.3.1: + solana-bankrun-darwin-universal@0.4.0: optional: true - solana-bankrun-darwin-x64@0.3.1: + solana-bankrun-darwin-x64@0.4.0: optional: true - solana-bankrun-linux-x64-gnu@0.3.1: + solana-bankrun-linux-x64-gnu@0.4.0: optional: true - solana-bankrun-linux-x64-musl@0.3.1: + solana-bankrun-linux-x64-musl@0.4.0: optional: true - solana-bankrun@0.3.1(bufferutil@4.0.8)(utf-8-validate@5.0.10): + solana-bankrun@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) bs58: 4.0.1 optionalDependencies: - solana-bankrun-darwin-arm64: 0.3.1 - solana-bankrun-darwin-universal: 0.3.1 - solana-bankrun-darwin-x64: 0.3.1 - solana-bankrun-linux-x64-gnu: 0.3.1 - solana-bankrun-linux-x64-musl: 0.3.1 + solana-bankrun-darwin-arm64: 0.4.0 + solana-bankrun-darwin-universal: 0.4.0 + solana-bankrun-darwin-x64: 0.4.0 + solana-bankrun-linux-x64-gnu: 0.4.0 + solana-bankrun-linux-x64-musl: 0.4.0 transitivePeerDependencies: - bufferutil - encoding @@ -1741,9 +1702,9 @@ snapshots: tr46@0.0.3: {} - ts-mocha@10.0.0(mocha@9.2.2): + ts-mocha@10.0.0(mocha@10.8.2): dependencies: - mocha: 9.2.2 + mocha: 10.8.2 ts-node: 7.0.1 optionalDependencies: tsconfig-paths: 3.15.0 @@ -1771,7 +1732,7 @@ snapshots: type-detect@4.1.0: {} - typescript@4.9.5: {} + typescript@5.6.3: {} undici-types@6.19.8: {} @@ -1805,11 +1766,7 @@ snapshots: gopd: 1.0.1 has-tostringtag: 1.0.2 - which@2.0.2: - dependencies: - isexe: 2.0.0 - - workerpool@6.2.0: {} + workerpool@6.5.1: {} wrap-ansi@7.0.0: dependencies: @@ -1831,7 +1788,7 @@ snapshots: y18n@5.0.8: {} - yargs-parser@20.2.4: {} + yargs-parser@20.2.9: {} yargs-unparser@2.0.0: dependencies: @@ -1848,7 +1805,7 @@ snapshots: require-directory: 2.1.1 string-width: 4.2.3 y18n: 5.0.8 - yargs-parser: 20.2.4 + yargs-parser: 20.2.9 yn@2.0.0: {} @@ -1857,4 +1814,4 @@ snapshots: zx@8.1.9: optionalDependencies: '@types/fs-extra': 11.0.4 - '@types/node': 22.8.0 + '@types/node': 22.8.6 diff --git a/tokens/transfer-tokens/steel/program/Cargo.toml b/tokens/transfer-tokens/steel/program/Cargo.toml index e6e69c536..ed7a43892 100644 --- a/tokens/transfer-tokens/steel/program/Cargo.toml +++ b/tokens/transfer-tokens/steel/program/Cargo.toml @@ -13,5 +13,5 @@ bytemuck = "1.4" num_enum = "0.7" borsh = "1.5.1" spl-token = { version = "4.0.0", features = [ "no-entrypoint" ] } -spl-associated-token-account = { version = "2.0.3", features = [ "no-entrypoint" ] } +spl-associated-token-account = { version = "3.0.4", features = [ "no-entrypoint" ] } mpl-token-metadata = { version = "4.1.2" } diff --git a/tokens/transfer-tokens/steel/tests/test.ts b/tokens/transfer-tokens/steel/tests/test.ts index 8dfde4c39..b574ea9d5 100644 --- a/tokens/transfer-tokens/steel/tests/test.ts +++ b/tokens/transfer-tokens/steel/tests/test.ts @@ -4,39 +4,10 @@ import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mp import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync } from '@solana/spl-token'; import { Keypair, LAMPORTS_PER_SOL, PublicKey, SYSVAR_RENT_PUBKEY, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js'; import { BN } from 'bn.js'; -import * as borsh from 'borsh'; import { start } from 'solana-bankrun'; import { CreateTokenArgs, MintNftArgs, MintSplArgs, MyInstruction, TransferTokensArgs } from './instructions'; -// class Assignable { -// constructor(properties) { -// for (const [key, value] of Object.entries(properties)) { -// this[key] = value; -// } -// } -// } - -// class CreateTokenArgs extends Assignable { -// toBuffer() { -// return Buffer.from(borsh.serialize(CreateTokenArgsSchema, this)); -// } -// } -// const CreateTokenArgsSchema = new Map([ -// [ -// CreateTokenArgs, -// { -// kind: "struct", -// fields: [ -// ["token_title", "string"], -// ["token_symbol", "string"], -// ["token_uri", "string"], -// ["token_decimals", "u8"], -// ], -// }, -// ], -// ]); - -describe('Create Tokens!', async () => { +describe('Transfer Tokens!', async () => { const PROGRAM_ID = PublicKey.unique(); const context = await start( [ @@ -100,7 +71,6 @@ describe('Create Tokens!', async () => { console.log('Success!'); console.log(` Mint Address: ${tokenMintKeypair.publicKey}`); - // console.log(` Tx Signature: ${sx}`); }); test('Create an NFT!', async () => { @@ -146,7 +116,6 @@ describe('Create Tokens!', async () => { console.log('Success!'); console.log(` Mint Address: ${nftMintKeypair.publicKey}`); - // console.log(` Tx Signature: ${sx}`); }); test('Mint some tokens to your wallet!', async () => { @@ -192,7 +161,6 @@ describe('Create Tokens!', async () => { console.log('Success!'); console.log(` ATA Address: ${associatedTokenAccountAddress}`); - // console.log(` Tx Signature: ${sx}`); }); test('Mint the NFT to your wallet!', async () => { @@ -251,7 +219,6 @@ describe('Create Tokens!', async () => { console.log('Success!'); console.log(` ATA Address: ${associatedTokenAccountAddress}`); - console.log(` Tx Signature: ${tx}`); }); test('Prep a new test wallet for transfers', async () => { diff --git a/tokens/transfer-tokens/steel/tsconfig.json b/tokens/transfer-tokens/steel/tsconfig.json index cd5d2e3d0..8c20b2236 100644 --- a/tokens/transfer-tokens/steel/tsconfig.json +++ b/tokens/transfer-tokens/steel/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "types": ["mocha", "chai"], + "types": ["mocha", "chai", "node"], "typeRoots": ["./node_modules/@types"], "lib": ["es2015"], "module": "commonjs", From 833236869f70b5e504743c17e77d7a9986b4def5 Mon Sep 17 00:00:00 2001 From: chizor iwuh Date: Sun, 3 Nov 2024 00:11:12 +0100 Subject: [PATCH 3/7] transfer-tokens/steel - use workspaces, avoid conflicts --- Cargo.lock | 439 +++--------------- Cargo.toml | 1 - tokens/transfer-tokens/steel/Cargo.toml | 3 + .../transfer-tokens/steel/program/Cargo.toml | 4 +- .../steel/program/src/borsh_instruction.rs | 4 +- .../transfer-tokens/steel/program/src/lib.rs | 8 +- tokens/transfer-tokens/steel/tests/test.ts | 2 +- 7 files changed, 75 insertions(+), 386 deletions(-) create mode 100644 tokens/transfer-tokens/steel/Cargo.toml diff --git a/Cargo.lock b/Cargo.lock index 57a2555d8..f54b45b7b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,7 +15,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -219,7 +219,7 @@ dependencies = [ "borsh 0.10.3", "bytemuck", "getrandom 0.2.15", - "solana-program 1.18.17", + "solana-program", "thiserror", ] @@ -451,12 +451,6 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - [[package]] name = "bincode" version = "1.3.3" @@ -744,7 +738,7 @@ dependencies = [ name = "checking-accounts-program" version = "0.1.0" dependencies = [ - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -771,7 +765,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -813,7 +807,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "shank", - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -821,7 +815,7 @@ name = "counter-solana-native" version = "0.1.0" dependencies = [ "borsh 0.9.3", - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -844,7 +838,7 @@ dependencies = [ name = "create-account-program" version = "0.1.0" dependencies = [ - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -1160,7 +1154,7 @@ dependencies = [ name = "hello-solana-program" version = "0.1.0" dependencies = [ - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -1413,19 +1407,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "mpl-token-metadata" -version = "4.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf0f61b553e424a6234af1268456972ee66c2222e1da89079242251fa7479e5" -dependencies = [ - "borsh 0.10.3", - "num-derive 0.3.3", - "num-traits", - "solana-program 1.18.17", - "thiserror", -] - [[package]] name = "num-bigint" version = "0.4.6" @@ -1590,7 +1571,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -1693,7 +1674,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -1702,7 +1683,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -1711,7 +1692,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -1849,7 +1830,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -1903,7 +1884,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -2221,59 +2202,13 @@ dependencies = [ "sha3 0.10.8", "solana-frozen-abi", "solana-frozen-abi-macro", - "solana-sdk-macro 1.18.17", + "solana-sdk-macro", "thiserror", "tiny-bip39", "wasm-bindgen", "zeroize", ] -[[package]] -name = "solana-program" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2625a23c3813b620141ee447819b08d1b9a5f1c69a309754834e3f35798a21fb" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff", - "ark-serialize", - "base64 0.22.1", - "bincode", - "bitflags", - "blake3", - "borsh 0.10.3", - "borsh 1.5.1", - "bs58 0.5.1", - "bv", - "bytemuck", - "bytemuck_derive", - "console_error_panic_hook", - "console_log", - "curve25519-dalek", - "getrandom 0.2.15", - "js-sys", - "lazy_static", - "libsecp256k1", - "log", - "memoffset", - "num-bigint", - "num-derive 0.4.2", - "num-traits", - "parking_lot", - "rand 0.8.5", - "rustc_version", - "rustversion", - "serde", - "serde_bytes", - "serde_derive", - "sha2 0.10.8", - "sha3 0.10.8", - "solana-sdk-macro 2.0.14", - "thiserror", - "wasm-bindgen", -] - [[package]] name = "solana-sdk" version = "1.18.17" @@ -2322,8 +2257,8 @@ dependencies = [ "solana-frozen-abi", "solana-frozen-abi-macro", "solana-logger", - "solana-program 1.18.17", - "solana-sdk-macro 1.18.17", + "solana-program", + "solana-sdk-macro", "thiserror", "uriparse", "wasm-bindgen", @@ -2342,19 +2277,6 @@ dependencies = [ "syn 2.0.72", ] -[[package]] -name = "solana-sdk-macro" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93a5a1eabc890415d326707afe62cd7a2009236e8d899c1519566fc8f7e3977b" -dependencies = [ - "bs58 0.5.1", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.72", -] - [[package]] name = "solana-security-txt" version = "1.1.1" @@ -2383,7 +2305,7 @@ dependencies = [ "serde", "serde_json", "sha3 0.9.1", - "solana-program 1.18.17", + "solana-program", "solana-sdk", "subtle", "thiserror", @@ -2400,28 +2322,12 @@ dependencies = [ "borsh 0.10.3", "num-derive 0.4.2", "num-traits", - "solana-program 1.18.17", + "solana-program", "spl-token", "spl-token-2022 1.0.0", "thiserror", ] -[[package]] -name = "spl-associated-token-account" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143109d789171379e6143ef23191786dfaac54289ad6e7917cfb26b36c432b10" -dependencies = [ - "assert_matches", - "borsh 1.5.1", - "num-derive 0.4.2", - "num-traits", - "solana-program 1.18.17", - "spl-token", - "spl-token-2022 3.0.4", - "thiserror", -] - [[package]] name = "spl-discriminator" version = "0.1.0" @@ -2429,19 +2335,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" dependencies = [ "bytemuck", - "solana-program 1.18.17", - "spl-discriminator-derive 0.1.2", -] - -[[package]] -name = "spl-discriminator" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210101376962bb22bb13be6daea34656ea1cbc248fce2164b146e39203b55e03" -dependencies = [ - "bytemuck", - "solana-program 1.18.17", - "spl-discriminator-derive 0.2.0", + "solana-program", + "spl-discriminator-derive", ] [[package]] @@ -2451,18 +2346,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07fd7858fc4ff8fb0e34090e41d7eb06a823e1057945c26d480bfc21d2338a93" dependencies = [ "quote", - "spl-discriminator-syn 0.1.2", - "syn 2.0.72", -] - -[[package]] -name = "spl-discriminator-derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" -dependencies = [ - "quote", - "spl-discriminator-syn 0.2.0", + "spl-discriminator-syn", "syn 2.0.72", ] @@ -2479,26 +2363,13 @@ dependencies = [ "thiserror", ] -[[package]] -name = "spl-discriminator-syn" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" -dependencies = [ - "proc-macro2", - "quote", - "sha2 0.10.8", - "syn 2.0.72", - "thiserror", -] - [[package]] name = "spl-memo" version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0dc6f70db6bacea7ff25870b016a65ba1d1b6013536f08e4fd79a8f9005325" dependencies = [ - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -2507,7 +2378,7 @@ version = "4.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a49f49f95f2d02111ded31696ab38a081fab623d4c76bd4cb074286db4560836" dependencies = [ - "solana-program 1.18.17", + "solana-program", ] [[package]] @@ -2518,24 +2389,11 @@ checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" dependencies = [ "borsh 0.10.3", "bytemuck", - "solana-program 1.18.17", + "solana-program", "solana-zk-token-sdk", "spl-program-error 0.3.0", ] -[[package]] -name = "spl-pod" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c52d84c55efeef8edcc226743dc089d7e3888b8e3474569aa3eff152b37b9996" -dependencies = [ - "borsh 1.5.1", - "bytemuck", - "solana-program 1.18.17", - "solana-zk-token-sdk", - "spl-program-error 0.4.4", -] - [[package]] name = "spl-program-error" version = "0.2.0" @@ -2544,7 +2402,7 @@ checksum = "af92f74cd3b0fdfda59fef4b571a92123e4df0f67cc43f73163975d31118ef82" dependencies = [ "num-derive 0.3.3", "num-traits", - "solana-program 1.18.17", + "solana-program", "spl-program-error-derive 0.2.0", "thiserror", ] @@ -2557,24 +2415,11 @@ checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" dependencies = [ "num-derive 0.4.2", "num-traits", - "solana-program 1.18.17", + "solana-program", "spl-program-error-derive 0.3.2", "thiserror", ] -[[package]] -name = "spl-program-error" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45a49acb925db68aa501b926096b2164adbdcade7a0c24152af9f0742d0a602" -dependencies = [ - "num-derive 0.4.2", - "num-traits", - "solana-program 1.18.17", - "spl-program-error-derive 0.4.1", - "thiserror", -] - [[package]] name = "spl-program-error-derive" version = "0.2.0" @@ -2598,18 +2443,6 @@ dependencies = [ "syn 2.0.72", ] -[[package]] -name = "spl-program-error-derive" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" -dependencies = [ - "proc-macro2", - "quote", - "sha2 0.10.8", - "syn 2.0.72", -] - [[package]] name = "spl-tlv-account-resolution" version = "0.2.0" @@ -2617,8 +2450,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82149a5a06b5f158d03904066375eaf0c8a2422557cc3d5a25d277260d9a3b16" dependencies = [ "bytemuck", - "solana-program 1.18.17", - "spl-discriminator 0.1.0", + "solana-program", + "spl-discriminator", "spl-program-error 0.2.0", "spl-type-length-value 0.2.0", ] @@ -2630,27 +2463,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "615d381f48ddd2bb3c57c7f7fb207591a2a05054639b18a62e785117dd7a8683" dependencies = [ "bytemuck", - "solana-program 1.18.17", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", + "solana-program", + "spl-discriminator", + "spl-pod", "spl-program-error 0.3.0", "spl-type-length-value 0.3.0", ] -[[package]] -name = "spl-tlv-account-resolution" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fab8edfd37be5fa17c9e42c1bff86abbbaf0494b031b37957f2728ad2ff842ba" -dependencies = [ - "bytemuck", - "solana-program 1.18.17", - "spl-discriminator 0.2.5", - "spl-pod 0.2.5", - "spl-program-error 0.4.4", - "spl-type-length-value 0.4.6", -] - [[package]] name = "spl-token" version = "4.0.3" @@ -2662,7 +2481,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "num_enum 0.7.3", - "solana-program 1.18.17", + "solana-program", "thiserror", ] @@ -2677,7 +2496,7 @@ dependencies = [ "num-derive 0.3.3", "num-traits", "num_enum 0.6.1", - "solana-program 1.18.17", + "solana-program", "solana-zk-token-sdk", "spl-memo 3.0.1", "spl-token", @@ -2696,43 +2515,19 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "num_enum 0.7.3", - "solana-program 1.18.17", + "solana-program", "solana-security-txt", "solana-zk-token-sdk", "spl-memo 4.0.4", - "spl-pod 0.1.0", + "spl-pod", "spl-token", - "spl-token-group-interface 0.1.0", - "spl-token-metadata-interface 0.2.0", + "spl-token-group-interface", + "spl-token-metadata-interface", "spl-transfer-hook-interface 0.4.1", "spl-type-length-value 0.3.0", "thiserror", ] -[[package]] -name = "spl-token-2022" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b01d1b2851964e257187c0bca43a0de38d0af59192479ca01ac3e2b58b1bd95a" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive 0.4.2", - "num-traits", - "num_enum 0.7.3", - "solana-program 1.18.17", - "solana-security-txt", - "solana-zk-token-sdk", - "spl-memo 4.0.4", - "spl-pod 0.2.5", - "spl-token", - "spl-token-group-interface 0.2.5", - "spl-token-metadata-interface 0.3.5", - "spl-transfer-hook-interface 0.6.5", - "spl-type-length-value 0.4.6", - "thiserror", -] - [[package]] name = "spl-token-group-interface" version = "0.1.0" @@ -2740,25 +2535,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" dependencies = [ "bytemuck", - "solana-program 1.18.17", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", + "solana-program", + "spl-discriminator", + "spl-pod", "spl-program-error 0.3.0", ] -[[package]] -name = "spl-token-group-interface" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "014817d6324b1e20c4bbc883e8ee30a5faa13e59d91d1b2b95df98b920150c17" -dependencies = [ - "bytemuck", - "solana-program 1.18.17", - "spl-discriminator 0.2.5", - "spl-pod 0.2.5", - "spl-program-error 0.4.4", -] - [[package]] name = "spl-token-metadata-interface" version = "0.2.0" @@ -2766,27 +2548,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" dependencies = [ "borsh 0.10.3", - "solana-program 1.18.17", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", + "solana-program", + "spl-discriminator", + "spl-pod", "spl-program-error 0.3.0", "spl-type-length-value 0.3.0", ] -[[package]] -name = "spl-token-metadata-interface" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3da00495b602ebcf5d8ba8b3ecff1ee454ce4c125c9077747be49c2d62335ba" -dependencies = [ - "borsh 1.5.1", - "solana-program 1.18.17", - "spl-discriminator 0.2.5", - "spl-pod 0.2.5", - "spl-program-error 0.4.4", - "spl-type-length-value 0.4.6", -] - [[package]] name = "spl-transfer-hook-interface" version = "0.1.0" @@ -2798,8 +2566,8 @@ dependencies = [ "num-derive 0.3.3", "num-traits", "num_enum 0.6.1", - "solana-program 1.18.17", - "spl-discriminator 0.1.0", + "solana-program", + "spl-discriminator", "spl-tlv-account-resolution 0.2.0", "spl-type-length-value 0.2.0", "thiserror", @@ -2813,30 +2581,14 @@ checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" dependencies = [ "arrayref", "bytemuck", - "solana-program 1.18.17", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", + "solana-program", + "spl-discriminator", + "spl-pod", "spl-program-error 0.3.0", "spl-tlv-account-resolution 0.5.1", "spl-type-length-value 0.3.0", ] -[[package]] -name = "spl-transfer-hook-interface" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b5c08a89838e5a2931f79b17f611857f281a14a2100968a3ccef352cb7414b" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program 1.18.17", - "spl-discriminator 0.2.5", - "spl-pod 0.2.5", - "spl-program-error 0.4.4", - "spl-tlv-account-resolution 0.6.5", - "spl-type-length-value 0.4.6", -] - [[package]] name = "spl-type-length-value" version = "0.2.0" @@ -2844,8 +2596,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1d085f426b33b8365fb98383d1b8b3925e21bdfe579c851ceaa7f511dbec191" dependencies = [ "bytemuck", - "solana-program 1.18.17", - "spl-discriminator 0.1.0", + "solana-program", + "spl-discriminator", "spl-program-error 0.2.0", ] @@ -2856,59 +2608,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" dependencies = [ "bytemuck", - "solana-program 1.18.17", - "spl-discriminator 0.1.0", - "spl-pod 0.1.0", + "solana-program", + "spl-discriminator", + "spl-pod", "spl-program-error 0.3.0", ] -[[package]] -name = "spl-type-length-value" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c872f93d0600e743116501eba2d53460e73a12c9a496875a42a7d70e034fe06d" -dependencies = [ - "bytemuck", - "solana-program 1.18.17", - "spl-discriminator 0.2.5", - "spl-pod 0.2.5", - "spl-program-error 0.4.4", -] - -[[package]] -name = "steel" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d88c610ca9fd5e4e51bdb6e9964114133a42f006713fe38aff37266fac91e1be" -dependencies = [ - "bytemuck", - "num_enum 0.7.3", - "solana-program 1.18.17", - "thiserror", -] - -[[package]] -name = "steel" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ca3cc310b7b71ce7944af64fb4fdaa5d0c2848ac79616d75e401913b6f781" -dependencies = [ - "bytemuck", - "num_enum 0.7.3", - "solana-program 1.18.17", - "spl-associated-token-account 2.3.0", - "spl-token", - "thiserror", -] - -[[package]] -name = "steel-hello-solana" -version = "0.1.0" -dependencies = [ - "solana-program 2.0.14", - "steel 1.3.0", -] - [[package]] name = "strsim" version = "0.11.1" @@ -3024,8 +2729,8 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", - "spl-associated-token-account 2.3.0", + "solana-program", + "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -3035,8 +2740,8 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", - "spl-associated-token-account 2.3.0", + "solana-program", + "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -3046,8 +2751,8 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", - "spl-associated-token-account 2.3.0", + "solana-program", + "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -3057,8 +2762,8 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", - "spl-associated-token-account 2.3.0", + "solana-program", + "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -3068,8 +2773,8 @@ version = "0.1.0" dependencies = [ "borsh 0.10.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", - "spl-associated-token-account 2.3.0", + "solana-program", + "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -3151,21 +2856,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program 1.18.17", -] - -[[package]] -name = "transfer-tokens-steel-program" -version = "0.1.0" -dependencies = [ - "borsh 1.5.1", - "bytemuck", - "mpl-token-metadata", - "num_enum 0.7.3", - "solana-program 1.18.17", - "spl-associated-token-account 3.0.4", - "spl-token", - "steel 2.1.1", + "solana-program", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 2735ee525..c13e8b8c0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,7 +30,6 @@ members = [ "basics/repository-layout/anchor/programs/*", "basics/transfer-sol/native/program", "basics/transfer-sol/anchor/programs/*", - "tokens/transfer-tokens/steel/program", "tokens/token-2022/mint-close-authority/native/program", "tokens/token-2022/non-transferable/native/program", "tokens/token-2022/default-account-state/native/program", diff --git a/tokens/transfer-tokens/steel/Cargo.toml b/tokens/transfer-tokens/steel/Cargo.toml new file mode 100644 index 000000000..39fc8ab65 --- /dev/null +++ b/tokens/transfer-tokens/steel/Cargo.toml @@ -0,0 +1,3 @@ +[workspace] +members = ["program"] +resolver = "2" diff --git a/tokens/transfer-tokens/steel/program/Cargo.toml b/tokens/transfer-tokens/steel/program/Cargo.toml index ed7a43892..fd2a9e92c 100644 --- a/tokens/transfer-tokens/steel/program/Cargo.toml +++ b/tokens/transfer-tokens/steel/program/Cargo.toml @@ -7,8 +7,8 @@ edition = "2021" crate-type = ["cdylib", "lib"] [dependencies] -solana-program = "=1.18.17" -steel = {version = "2.0", features = ["spl"]} +solana-program = "1.18.17" +steel = {version = "2.1", features = ["spl"]} bytemuck = "1.4" num_enum = "0.7" borsh = "1.5.1" diff --git a/tokens/transfer-tokens/steel/program/src/borsh_instruction.rs b/tokens/transfer-tokens/steel/program/src/borsh_instruction.rs index c77b66d1f..c6b4a8b3f 100644 --- a/tokens/transfer-tokens/steel/program/src/borsh_instruction.rs +++ b/tokens/transfer-tokens/steel/program/src/borsh_instruction.rs @@ -1,4 +1,4 @@ -/// Helper for creating steel instruction with borsh. +/// Helper for creating steel instruction with borsh. /// Not required, but helpful with typing and CPI /// #[macro_export] @@ -9,7 +9,7 @@ macro_rules! borsh_instruction { $discriminator_name::$struct_name as u8 } } - + #[allow(dead_code)] // adds discriminator to the instruction data, helpful with cpis etc. impl $struct_name { diff --git a/tokens/transfer-tokens/steel/program/src/lib.rs b/tokens/transfer-tokens/steel/program/src/lib.rs index db5379cf5..004f529c2 100644 --- a/tokens/transfer-tokens/steel/program/src/lib.rs +++ b/tokens/transfer-tokens/steel/program/src/lib.rs @@ -13,15 +13,11 @@ pub fn process_instruction( accounts: &[AccountInfo], data: &[u8], ) -> ProgramResult { - // Use crate::ID for program_id instead: - // e.g parse_instruction(&crate::ID, program_id, data) - // using program_id for testing purposes - // - let (ix, data) = parse_instruction(program_id, program_id, data)?; + let (ix, data) = parse_instruction(&crate::ID, program_id, data)?; match ix { SteelInstruction::Create => Create::process(accounts, data)?, - SteelInstruction::MintNft => MintNft::process( accounts)?, + SteelInstruction::MintNft => MintNft::process(accounts)?, SteelInstruction::MintSpl => MintSpl::process(accounts, data)?, SteelInstruction::TransferTokens => TransferTokens::process(accounts, data)?, } diff --git a/tokens/transfer-tokens/steel/tests/test.ts b/tokens/transfer-tokens/steel/tests/test.ts index b574ea9d5..b655e6f9f 100644 --- a/tokens/transfer-tokens/steel/tests/test.ts +++ b/tokens/transfer-tokens/steel/tests/test.ts @@ -8,7 +8,7 @@ import { start } from 'solana-bankrun'; import { CreateTokenArgs, MintNftArgs, MintSplArgs, MyInstruction, TransferTokensArgs } from './instructions'; describe('Transfer Tokens!', async () => { - const PROGRAM_ID = PublicKey.unique(); + const PROGRAM_ID = new PublicKey('z7msBPQHDJjTvdQRoEcKyENgXDhSRYeHieN1ZMTqo35'); const context = await start( [ { name: 'transfer_tokens_steel_program', programId: PROGRAM_ID }, From 67540bc1e76880d856dde8ff43ff1a2c8d71723f Mon Sep 17 00:00:00 2001 From: chizor iwuh Date: Fri, 8 Nov 2024 13:35:32 +0100 Subject: [PATCH 4/7] transfer-tokens/steel - add api --- tokens/transfer-tokens/steel/Cargo.toml | 12 +++++++++++- tokens/transfer-tokens/steel/api/Cargo.toml | 17 +++++++++++++++++ .../src/instruction}/create.rs | 0 .../src/instruction}/mint_nft.rs | 0 .../src/instruction}/mint_spl.rs | 0 .../instructions => api/src/instruction}/mod.rs | 0 .../src/instruction}/transfer.rs | 0 tokens/transfer-tokens/steel/api/src/lib.rs | 12 ++++++++++++ .../borsh_instruction.rs => api/src/macros.rs} | 1 - tokens/transfer-tokens/steel/program/Cargo.toml | 8 +------- tokens/transfer-tokens/steel/program/src/lib.rs | 9 ++------- 11 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 tokens/transfer-tokens/steel/api/Cargo.toml rename tokens/transfer-tokens/steel/{program/src/instructions => api/src/instruction}/create.rs (100%) rename tokens/transfer-tokens/steel/{program/src/instructions => api/src/instruction}/mint_nft.rs (100%) rename tokens/transfer-tokens/steel/{program/src/instructions => api/src/instruction}/mint_spl.rs (100%) rename tokens/transfer-tokens/steel/{program/src/instructions => api/src/instruction}/mod.rs (100%) rename tokens/transfer-tokens/steel/{program/src/instructions => api/src/instruction}/transfer.rs (100%) create mode 100644 tokens/transfer-tokens/steel/api/src/lib.rs rename tokens/transfer-tokens/steel/{program/src/borsh_instruction.rs => api/src/macros.rs} (96%) diff --git a/tokens/transfer-tokens/steel/Cargo.toml b/tokens/transfer-tokens/steel/Cargo.toml index 39fc8ab65..cb35d65bf 100644 --- a/tokens/transfer-tokens/steel/Cargo.toml +++ b/tokens/transfer-tokens/steel/Cargo.toml @@ -1,3 +1,13 @@ [workspace] -members = ["program"] +members = ["api","program"] resolver = "2" + +[workspace.dependencies] +solana-program = "1.18.17" +steel = {version = "2.1", features = ["spl"]} +bytemuck = "1.4" +num_enum = "0.7" +borsh = "1.5.1" +spl-token = { version = "4.0.0", features = [ "no-entrypoint" ] } +spl-associated-token-account = { version = "3.0.4", features = [ "no-entrypoint" ] } +mpl-token-metadata = { version = "4.1.2" } diff --git a/tokens/transfer-tokens/steel/api/Cargo.toml b/tokens/transfer-tokens/steel/api/Cargo.toml new file mode 100644 index 000000000..520ffbc48 --- /dev/null +++ b/tokens/transfer-tokens/steel/api/Cargo.toml @@ -0,0 +1,17 @@ +[package] +name = "transfer-tokens-steel-api" +version = "0.1.0" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] + +[dependencies] +solana-program.workspace = true +steel.workspace = true +bytemuck.workspace = true +num_enum.workspace = true +borsh.workspace = true +spl-token.workspace = true +spl-associated-token-account.workspace = true +mpl-token-metadata.workspace = true diff --git a/tokens/transfer-tokens/steel/program/src/instructions/create.rs b/tokens/transfer-tokens/steel/api/src/instruction/create.rs similarity index 100% rename from tokens/transfer-tokens/steel/program/src/instructions/create.rs rename to tokens/transfer-tokens/steel/api/src/instruction/create.rs diff --git a/tokens/transfer-tokens/steel/program/src/instructions/mint_nft.rs b/tokens/transfer-tokens/steel/api/src/instruction/mint_nft.rs similarity index 100% rename from tokens/transfer-tokens/steel/program/src/instructions/mint_nft.rs rename to tokens/transfer-tokens/steel/api/src/instruction/mint_nft.rs diff --git a/tokens/transfer-tokens/steel/program/src/instructions/mint_spl.rs b/tokens/transfer-tokens/steel/api/src/instruction/mint_spl.rs similarity index 100% rename from tokens/transfer-tokens/steel/program/src/instructions/mint_spl.rs rename to tokens/transfer-tokens/steel/api/src/instruction/mint_spl.rs diff --git a/tokens/transfer-tokens/steel/program/src/instructions/mod.rs b/tokens/transfer-tokens/steel/api/src/instruction/mod.rs similarity index 100% rename from tokens/transfer-tokens/steel/program/src/instructions/mod.rs rename to tokens/transfer-tokens/steel/api/src/instruction/mod.rs diff --git a/tokens/transfer-tokens/steel/program/src/instructions/transfer.rs b/tokens/transfer-tokens/steel/api/src/instruction/transfer.rs similarity index 100% rename from tokens/transfer-tokens/steel/program/src/instructions/transfer.rs rename to tokens/transfer-tokens/steel/api/src/instruction/transfer.rs diff --git a/tokens/transfer-tokens/steel/api/src/lib.rs b/tokens/transfer-tokens/steel/api/src/lib.rs new file mode 100644 index 000000000..270803eee --- /dev/null +++ b/tokens/transfer-tokens/steel/api/src/lib.rs @@ -0,0 +1,12 @@ +pub mod instruction; +pub mod macros; + +use instruction::*; +use steel::*; + +pub mod prelude { + pub use crate::instruction::*; +} + +// TODO Set program id +declare_id!("z7msBPQHDJjTvdQRoEcKyENgXDhSRYeHieN1ZMTqo35"); diff --git a/tokens/transfer-tokens/steel/program/src/borsh_instruction.rs b/tokens/transfer-tokens/steel/api/src/macros.rs similarity index 96% rename from tokens/transfer-tokens/steel/program/src/borsh_instruction.rs rename to tokens/transfer-tokens/steel/api/src/macros.rs index c6b4a8b3f..10f78c963 100644 --- a/tokens/transfer-tokens/steel/program/src/borsh_instruction.rs +++ b/tokens/transfer-tokens/steel/api/src/macros.rs @@ -10,7 +10,6 @@ macro_rules! borsh_instruction { } } - #[allow(dead_code)] // adds discriminator to the instruction data, helpful with cpis etc. impl $struct_name { pub fn to_bytes(&self) -> Result, solana_program::program_error::ProgramError> { diff --git a/tokens/transfer-tokens/steel/program/Cargo.toml b/tokens/transfer-tokens/steel/program/Cargo.toml index fd2a9e92c..5569b7630 100644 --- a/tokens/transfer-tokens/steel/program/Cargo.toml +++ b/tokens/transfer-tokens/steel/program/Cargo.toml @@ -7,11 +7,5 @@ edition = "2021" crate-type = ["cdylib", "lib"] [dependencies] -solana-program = "1.18.17" steel = {version = "2.1", features = ["spl"]} -bytemuck = "1.4" -num_enum = "0.7" -borsh = "1.5.1" -spl-token = { version = "4.0.0", features = [ "no-entrypoint" ] } -spl-associated-token-account = { version = "3.0.4", features = [ "no-entrypoint" ] } -mpl-token-metadata = { version = "4.1.2" } +transfer-tokens-steel-api = {path = "../api"} \ No newline at end of file diff --git a/tokens/transfer-tokens/steel/program/src/lib.rs b/tokens/transfer-tokens/steel/program/src/lib.rs index 004f529c2..6fc424466 100644 --- a/tokens/transfer-tokens/steel/program/src/lib.rs +++ b/tokens/transfer-tokens/steel/program/src/lib.rs @@ -1,10 +1,5 @@ -mod borsh_instruction; -mod instructions; - -use instructions::*; use steel::*; - -declare_id!("z7msBPQHDJjTvdQRoEcKyENgXDhSRYeHieN1ZMTqo35"); +use transfer_tokens_steel_api::prelude::*; entrypoint!(process_instruction); @@ -13,7 +8,7 @@ pub fn process_instruction( accounts: &[AccountInfo], data: &[u8], ) -> ProgramResult { - let (ix, data) = parse_instruction(&crate::ID, program_id, data)?; + let (ix, data) = parse_instruction(&transfer_tokens_steel_api::ID, program_id, data)?; match ix { SteelInstruction::Create => Create::process(accounts, data)?, From b8ee474f63e286336e379a201bf24d7541a8d038 Mon Sep 17 00:00:00 2001 From: chizor iwuh Date: Sat, 16 Nov 2024 23:22:56 +0100 Subject: [PATCH 5/7] transfer-tokens/steel - assertion --- tokens/transfer-tokens/steel/tests/test.ts | 82 +++++++++++++++++++--- 1 file changed, 74 insertions(+), 8 deletions(-) diff --git a/tokens/transfer-tokens/steel/tests/test.ts b/tokens/transfer-tokens/steel/tests/test.ts index b655e6f9f..dacab04c8 100644 --- a/tokens/transfer-tokens/steel/tests/test.ts +++ b/tokens/transfer-tokens/steel/tests/test.ts @@ -1,9 +1,10 @@ import { Buffer } from 'node:buffer'; import { describe, test } from 'node:test'; -import { PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mpl-token-metadata'; -import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync } from '@solana/spl-token'; +import { Metadata, PROGRAM_ID as TOKEN_METADATA_PROGRAM_ID } from '@metaplex-foundation/mpl-token-metadata'; +import { ASSOCIATED_TOKEN_PROGRAM_ID, AccountLayout, MintLayout, TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync } from '@solana/spl-token'; import { Keypair, LAMPORTS_PER_SOL, PublicKey, SYSVAR_RENT_PUBKEY, SystemProgram, Transaction, TransactionInstruction } from '@solana/web3.js'; import { BN } from 'bn.js'; +import { assert } from 'chai'; import { start } from 'solana-bankrun'; import { CreateTokenArgs, MintNftArgs, MintSplArgs, MyInstruction, TransferTokensArgs } from './instructions'; @@ -32,12 +33,14 @@ describe('Transfer Tokens!', async () => { // SPL Token default = 9 decimals // - const instructionData = new CreateTokenArgs({ + const tokenDetails = { 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, - }); + decimals: 9, + }; + + const instructionData = new CreateTokenArgs(tokenDetails); const ix = new TransactionInstruction({ keys: [ @@ -71,6 +74,24 @@ describe('Transfer Tokens!', async () => { console.log('Success!'); console.log(` Mint Address: ${tokenMintKeypair.publicKey}`); + + const metadataInfo = await client.getAccount(metadataAddress); + assert(metadataInfo !== null, 'metadata account not created'); + + const [metadata] = Metadata.fromAccountInfo({ + ...metadataInfo, + data: Buffer.from(metadataInfo.data), + }); + + assert(metadata.data.name.slice(0, tokenDetails.token_title.length) === tokenDetails.token_title, 'name does not match'); + assert(metadata.data.symbol.slice(0, tokenDetails.token_symbol.length) === tokenDetails.token_symbol, 'symbol does not match'); + assert(metadata.data.uri.slice(0, tokenDetails.token_uri.length) === tokenDetails.token_uri, 'uri does not match'); + assert(metadata.mint.toBase58() === tokenMintKeypair.publicKey.toBase58(), 'mint does not match'); + + const mintInfo = await client.getAccount(tokenMintKeypair.publicKey); + const mint = MintLayout.decode(mintInfo.data); + assert(mint.mintAuthority.toBase58() === payer.publicKey.toBase58(), 'mint authority does not match'); + assert(mint.decimals === tokenDetails.decimals, 'mint decimals does not match'); }); test('Create an NFT!', async () => { @@ -81,12 +102,14 @@ describe('Transfer Tokens!', async () => { // NFT default = 0 decimals // - const instructionData = new CreateTokenArgs({ + const nftDetails = { 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: 0, - }); + decimals: 0, + }; + + const instructionData = new CreateTokenArgs(nftDetails); const ix = new TransactionInstruction({ keys: [ @@ -116,6 +139,24 @@ describe('Transfer Tokens!', async () => { console.log('Success!'); console.log(` Mint Address: ${nftMintKeypair.publicKey}`); + + const metadataInfo = await client.getAccount(metadataAddress); + assert(metadataInfo !== null, 'metadata account not created'); + + const [metadata] = Metadata.fromAccountInfo({ + ...metadataInfo, + data: Buffer.from(metadataInfo.data), + }); + + assert(metadata.data.name.slice(0, nftDetails.token_title.length) === nftDetails.token_title, 'name does not match'); + assert(metadata.data.symbol.slice(0, nftDetails.token_symbol.length) === nftDetails.token_symbol, 'symbol does not match'); + assert(metadata.data.uri.slice(0, nftDetails.token_uri.length) === nftDetails.token_uri, 'uri does not match'); + assert(metadata.mint.toBase58() === nftMintKeypair.publicKey.toBase58(), 'mint does not match'); + + const mintInfo = await client.getAccount(nftMintKeypair.publicKey); + const mint = MintLayout.decode(mintInfo.data); + assert(mint.mintAuthority.toBase58() === payer.publicKey.toBase58(), 'mint authority does not match'); + assert(mint.decimals === 0, 'mint decimals does not match'); }); test('Mint some tokens to your wallet!', async () => { @@ -161,6 +202,12 @@ describe('Transfer Tokens!', async () => { console.log('Success!'); console.log(` ATA Address: ${associatedTokenAccountAddress}`); + + const tokenAccountInfo = await client.getAccount(associatedTokenAccountAddress); + assert(tokenAccountInfo !== null, 'token account not created'); + + const tokenAccount = AccountLayout.decode(tokenAccountInfo.data); + assert(tokenAccount.amount === BigInt(150), 'amount is not equal to 150'); }); test('Mint the NFT to your wallet!', async () => { @@ -219,6 +266,13 @@ describe('Transfer Tokens!', async () => { console.log('Success!'); console.log(` ATA Address: ${associatedTokenAccountAddress}`); + + const tokenAccountInfo = await client.getAccount(associatedTokenAccountAddress); + assert(tokenAccountInfo !== null, 'token account not created'); + + const tokenAccount = AccountLayout.decode(tokenAccountInfo.data); + assert(tokenAccount.amount === BigInt(1), 'amount is not equal to 1'); + assert(tokenAccount.mint.toBase58() === nftMintKeypair.publicKey.toBase58(), 'mint key does not match'); }); test('Prep a new test wallet for transfers', async () => { @@ -283,6 +337,12 @@ describe('Transfer Tokens!', async () => { tx.add(ix).sign(payer, recipientWallet); await client.processTransaction(tx); + + const tokenAccountInfo = await client.getAccount(toAssociatedTokenAddress); + assert(tokenAccountInfo !== null, 'token account not created'); + + const tokenAccount = AccountLayout.decode(tokenAccountInfo.data); + assert(tokenAccount.amount === BigInt(15), 'amount is not equal to 15'); }); test('Transfer NFT to another wallet!', async () => { @@ -326,5 +386,11 @@ describe('Transfer Tokens!', async () => { tx.add(ix).sign(payer, recipientWallet); await client.processTransaction(tx); + + const tokenAccountInfo = await client.getAccount(toAssociatedTokenAddress); + assert(tokenAccountInfo !== null, 'token account not created'); + + const tokenAccount = AccountLayout.decode(tokenAccountInfo.data); + assert(tokenAccount.amount === BigInt(1), 'amount is not equal to 1'); }); }); From 7bdfac64fb39ce216410fab7f4b1d63aba571967 Mon Sep 17 00:00:00 2001 From: chizor iwuh Date: Wed, 20 Nov 2024 21:27:08 +0100 Subject: [PATCH 6/7] transfer-tokens/steel - bytemuck --- tokens/transfer-tokens/steel/Cargo.toml | 1 - tokens/transfer-tokens/steel/api/Cargo.toml | 1 - .../steel/api/src/instruction/create.rs | 98 ++++++++++--------- .../steel/api/src/instruction/mint_nft.rs | 39 +++----- tokens/transfer-tokens/steel/api/src/lib.rs | 2 - .../transfer-tokens/steel/api/src/macros.rs | 25 ----- .../steel/tests/instructions.ts | 6 +- tokens/transfer-tokens/steel/tests/test.ts | 16 ++- 8 files changed, 82 insertions(+), 106 deletions(-) delete mode 100644 tokens/transfer-tokens/steel/api/src/macros.rs diff --git a/tokens/transfer-tokens/steel/Cargo.toml b/tokens/transfer-tokens/steel/Cargo.toml index cb35d65bf..3e837639c 100644 --- a/tokens/transfer-tokens/steel/Cargo.toml +++ b/tokens/transfer-tokens/steel/Cargo.toml @@ -7,7 +7,6 @@ solana-program = "1.18.17" steel = {version = "2.1", features = ["spl"]} bytemuck = "1.4" num_enum = "0.7" -borsh = "1.5.1" spl-token = { version = "4.0.0", features = [ "no-entrypoint" ] } spl-associated-token-account = { version = "3.0.4", features = [ "no-entrypoint" ] } mpl-token-metadata = { version = "4.1.2" } diff --git a/tokens/transfer-tokens/steel/api/Cargo.toml b/tokens/transfer-tokens/steel/api/Cargo.toml index 520ffbc48..a0921db23 100644 --- a/tokens/transfer-tokens/steel/api/Cargo.toml +++ b/tokens/transfer-tokens/steel/api/Cargo.toml @@ -11,7 +11,6 @@ solana-program.workspace = true steel.workspace = true bytemuck.workspace = true num_enum.workspace = true -borsh.workspace = true spl-token.workspace = true spl-associated-token-account.workspace = true mpl-token-metadata.workspace = true diff --git a/tokens/transfer-tokens/steel/api/src/instruction/create.rs b/tokens/transfer-tokens/steel/api/src/instruction/create.rs index 6acde372d..05d704499 100644 --- a/tokens/transfer-tokens/steel/api/src/instruction/create.rs +++ b/tokens/transfer-tokens/steel/api/src/instruction/create.rs @@ -1,25 +1,26 @@ -use crate::{borsh_instruction, SteelInstruction}; -use borsh::{BorshDeserialize, BorshSerialize}; -use mpl_token_metadata::{instructions as mpl_instruction, types::DataV2}; +use crate::SteelInstruction; +use mpl_token_metadata::instructions as mpl_instruction; use solana_program::{msg, program::invoke, program_pack::Pack, rent::Rent, system_instruction}; use spl_token::state::Mint; +use std::ffi::CStr; use steel::*; -borsh_instruction!(SteelInstruction, Create); - -#[derive(BorshSerialize, BorshDeserialize, Debug)] +instruction!(SteelInstruction, Create); +// CreateToken instruction +#[repr(C)] +#[derive(Clone, Copy, Debug, Pod, Zeroable)] pub struct Create { - token_title: String, - token_symbol: String, - token_uri: String, - decimals: u8, + pub token_name: [u8; 32], + pub token_symbol: [u8; 10], + pub token_uri: [u8; 256], + pub decimals: u8, } impl Create { pub fn process(accounts: &[AccountInfo<'_>], data: &[u8]) -> ProgramResult { - let args = Self::try_from_slice(data)?; + let args = Self::try_from_bytes(data)?; - let [mint_account, mint_authority, metadata_account, payer, rent, system_program, token_program, _token_metadata_program] = + let [mint_account, mint_authority, metadata_account, payer, rent, system_program, token_program, token_metadata_program] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); @@ -64,41 +65,46 @@ impl Create { msg!("Creating metadata account..."); msg!("Metadata account address: {}", metadata_account.key); - let ix = &mpl_instruction::CreateMetadataAccountV3 { - metadata: *metadata_account.key, - mint: *mint_account.key, - mint_authority: *mint_authority.key, - payer: *payer.key, - rent: None, - system_program: *system_program.key, - update_authority: (*payer.key, true), - } - .instruction(mpl_instruction::CreateMetadataAccountV3InstructionArgs { - data: DataV2 { - name: args.token_title, - symbol: args.token_symbol, - uri: args.token_uri, - creators: None, - seller_fee_basis_points: 0, - collection: None, - uses: None, - }, - collection_details: None, - is_mutable: false, - }); + let name = CStr::from_bytes_until_nul(&args.token_name) + .unwrap() + .to_str() + .unwrap() + .to_string(); + let symbol = CStr::from_bytes_until_nul(&args.token_symbol) + .unwrap() + .to_str() + .unwrap() + .to_string(); + let uri = CStr::from_bytes_until_nul(&args.token_uri) + .unwrap() + .to_str() + .unwrap() + .to_string(); - invoke( - ix, - &[ - metadata_account.clone(), - mint_account.clone(), - mint_authority.clone(), - payer.clone(), - payer.clone(), - system_program.clone(), - rent.clone(), - ], - )?; + mpl_instruction::CreateMetadataAccountV3Cpi { + __program: token_metadata_program, + metadata: metadata_account, + mint: mint_account, + mint_authority, + payer, + update_authority: (mint_authority, true), + system_program, + rent: Some(rent), + __args: mpl_token_metadata::instructions::CreateMetadataAccountV3InstructionArgs { + data: mpl_token_metadata::types::DataV2 { + name, + symbol, + uri, + seller_fee_basis_points: 0, + creators: None, + collection: None, + uses: None, + }, + is_mutable: true, + collection_details: None, + }, + } + .invoke()?; msg!("Token mint created successfully."); diff --git a/tokens/transfer-tokens/steel/api/src/instruction/mint_nft.rs b/tokens/transfer-tokens/steel/api/src/instruction/mint_nft.rs index 5dc98e060..3b186539e 100644 --- a/tokens/transfer-tokens/steel/api/src/instruction/mint_nft.rs +++ b/tokens/transfer-tokens/steel/api/src/instruction/mint_nft.rs @@ -12,7 +12,7 @@ pub struct MintNft {} impl MintNft { pub fn process(accounts: &[AccountInfo<'_>]) -> ProgramResult { - let [mint_account, metadata_account, edition_account, mint_authority, associated_token_account, payer, rent, system_program, token_program, associated_token_program, _token_metadata_program] = + let [mint_account, metadata_account, edition_account, mint_authority, associated_token_account, payer, _rent, system_program, token_program, associated_token_program, token_metadata_program] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); @@ -60,33 +60,20 @@ impl MintNft { // which will disable minting by setting the Mint & Freeze Authorities to the // Edition Account. // - let ix = &mpl_instruction::CreateMasterEditionV3 { - edition: *edition_account.key, - metadata: *metadata_account.key, - mint: *mint_account.key, - mint_authority: *mint_authority.key, - payer: *payer.key, + mpl_instruction::CreateMasterEditionV3Cpi { + __program: token_metadata_program, + __args: mpl_instruction::CreateMasterEditionV3InstructionArgs { max_supply: None }, + edition: edition_account, + metadata: metadata_account, + mint: mint_account, + mint_authority, + payer, rent: None, - system_program: *system_program.key, - token_program: *token_program.key, - update_authority: *mint_authority.key, + system_program, + token_program, + update_authority: mint_authority, } - .instruction(mpl_instruction::CreateMasterEditionV3InstructionArgs { max_supply: None }); - - invoke( - ix, - &[ - edition_account.clone(), - mint_account.clone(), - payer.clone(), - mint_authority.clone(), - mint_authority.clone(), - metadata_account.clone(), - token_program.clone(), - system_program.clone(), - rent.clone(), - ], - )?; + .invoke()?; msg!("NFT minted successfully."); diff --git a/tokens/transfer-tokens/steel/api/src/lib.rs b/tokens/transfer-tokens/steel/api/src/lib.rs index 270803eee..9c97b4453 100644 --- a/tokens/transfer-tokens/steel/api/src/lib.rs +++ b/tokens/transfer-tokens/steel/api/src/lib.rs @@ -1,5 +1,4 @@ pub mod instruction; -pub mod macros; use instruction::*; use steel::*; @@ -8,5 +7,4 @@ pub mod prelude { pub use crate::instruction::*; } -// TODO Set program id declare_id!("z7msBPQHDJjTvdQRoEcKyENgXDhSRYeHieN1ZMTqo35"); diff --git a/tokens/transfer-tokens/steel/api/src/macros.rs b/tokens/transfer-tokens/steel/api/src/macros.rs deleted file mode 100644 index 10f78c963..000000000 --- a/tokens/transfer-tokens/steel/api/src/macros.rs +++ /dev/null @@ -1,25 +0,0 @@ -/// Helper for creating steel instruction with borsh. -/// Not required, but helpful with typing and CPI -/// -#[macro_export] -macro_rules! borsh_instruction { - ($discriminator_name:ident, $struct_name:ident) => { - impl $crate::Discriminator for $struct_name { - fn discriminator() -> u8 { - $discriminator_name::$struct_name as u8 - } - } - - // adds discriminator to the instruction data, helpful with cpis etc. - impl $struct_name { - pub fn to_bytes(&self) -> Result, solana_program::program_error::ProgramError> { - let instruction_vec = borsh::to_vec(self)?; - Ok([ - [$discriminator_name::$struct_name as u8].to_vec(), - instruction_vec, - ] - .concat()) - } - } - }; -} diff --git a/tokens/transfer-tokens/steel/tests/instructions.ts b/tokens/transfer-tokens/steel/tests/instructions.ts index 67769eed1..1522b290a 100644 --- a/tokens/transfer-tokens/steel/tests/instructions.ts +++ b/tokens/transfer-tokens/steel/tests/instructions.ts @@ -27,9 +27,9 @@ const CreateTokenArgsSchema = new Map([ kind: 'struct', fields: [ ['instruction', 'u8'], - ['token_title', 'string'], - ['token_symbol', 'string'], - ['token_uri', 'string'], + ['token_title', [32]], + ['token_symbol', [10]], + ['token_uri', [256]], ['decimals', 'u8'], ], }, diff --git a/tokens/transfer-tokens/steel/tests/test.ts b/tokens/transfer-tokens/steel/tests/test.ts index dacab04c8..42900894d 100644 --- a/tokens/transfer-tokens/steel/tests/test.ts +++ b/tokens/transfer-tokens/steel/tests/test.ts @@ -40,7 +40,13 @@ describe('Transfer Tokens!', async () => { decimals: 9, }; - const instructionData = new CreateTokenArgs(tokenDetails); + const instructionData = new CreateTokenArgs({ + ...tokenDetails, + discriminator: 0, + token_title: Buffer.from(tokenDetails.token_title.padEnd(32, '\0')), + token_symbol: Buffer.from(tokenDetails.token_symbol.padEnd(10, '\0')), + token_uri: Buffer.from(tokenDetails.token_uri.padEnd(256, '\0')), + }); const ix = new TransactionInstruction({ keys: [ @@ -109,7 +115,13 @@ describe('Transfer Tokens!', async () => { decimals: 0, }; - const instructionData = new CreateTokenArgs(nftDetails); + const instructionData = new CreateTokenArgs({ + ...nftDetails, + discriminator: 0, + token_title: Buffer.from(nftDetails.token_title.padEnd(32, '\0')), + token_symbol: Buffer.from(nftDetails.token_symbol.padEnd(10, '\0')), + token_uri: Buffer.from(nftDetails.token_uri.padEnd(256, '\0')), + }); const ix = new TransactionInstruction({ keys: [ From 81955421fbe10c893988b29aacafae6ac5972af6 Mon Sep 17 00:00:00 2001 From: chizor iwuh Date: Sat, 23 Nov 2024 14:02:10 +0100 Subject: [PATCH 7/7] transfer-tokens/steel - str --- tokens/transfer-tokens/steel/Cargo.toml | 1 + tokens/transfer-tokens/steel/api/Cargo.toml | 1 + tokens/transfer-tokens/steel/api/src/error.rs | 10 +++++ .../steel/api/src/instruction/create.rs | 45 ++++++++++--------- tokens/transfer-tokens/steel/api/src/lib.rs | 2 + 5 files changed, 37 insertions(+), 22 deletions(-) create mode 100644 tokens/transfer-tokens/steel/api/src/error.rs diff --git a/tokens/transfer-tokens/steel/Cargo.toml b/tokens/transfer-tokens/steel/Cargo.toml index 3e837639c..a76b99167 100644 --- a/tokens/transfer-tokens/steel/Cargo.toml +++ b/tokens/transfer-tokens/steel/Cargo.toml @@ -10,3 +10,4 @@ num_enum = "0.7" spl-token = { version = "4.0.0", features = [ "no-entrypoint" ] } spl-associated-token-account = { version = "3.0.4", features = [ "no-entrypoint" ] } mpl-token-metadata = { version = "4.1.2" } +thiserror = "2.0.3" diff --git a/tokens/transfer-tokens/steel/api/Cargo.toml b/tokens/transfer-tokens/steel/api/Cargo.toml index a0921db23..7d6f7919b 100644 --- a/tokens/transfer-tokens/steel/api/Cargo.toml +++ b/tokens/transfer-tokens/steel/api/Cargo.toml @@ -14,3 +14,4 @@ num_enum.workspace = true spl-token.workspace = true spl-associated-token-account.workspace = true mpl-token-metadata.workspace = true +thiserror.workspace = true diff --git a/tokens/transfer-tokens/steel/api/src/error.rs b/tokens/transfer-tokens/steel/api/src/error.rs new file mode 100644 index 000000000..a3c09c76c --- /dev/null +++ b/tokens/transfer-tokens/steel/api/src/error.rs @@ -0,0 +1,10 @@ +use steel::*; + +#[derive(Debug, Error, Clone, Copy, PartialEq, Eq, IntoPrimitive)] +#[repr(u32)] +pub enum SteelError { + #[error("Failed to parse string from bytes")] + ParseError = 0, +} + +error!(SteelError); diff --git a/tokens/transfer-tokens/steel/api/src/instruction/create.rs b/tokens/transfer-tokens/steel/api/src/instruction/create.rs index 05d704499..28021d9e1 100644 --- a/tokens/transfer-tokens/steel/api/src/instruction/create.rs +++ b/tokens/transfer-tokens/steel/api/src/instruction/create.rs @@ -1,5 +1,5 @@ -use crate::SteelInstruction; -use mpl_token_metadata::instructions as mpl_instruction; +use crate::{error::*, SteelInstruction}; +use mpl_token_metadata::{instructions as mpl_instruction, types::DataV2}; use solana_program::{msg, program::invoke, program_pack::Pack, rent::Rent, system_instruction}; use spl_token::state::Mint; use std::ffi::CStr; @@ -10,9 +10,9 @@ instruction!(SteelInstruction, Create); #[repr(C)] #[derive(Clone, Copy, Debug, Pod, Zeroable)] pub struct Create { - pub token_name: [u8; 32], - pub token_symbol: [u8; 10], - pub token_uri: [u8; 256], + pub token_name: [u8; 32], // Metaplex metadata name: 32 bytes max + pub token_symbol: [u8; 10], // Metaplex metadata symbol: 10 bytes max + pub token_uri: [u8; 256], // Metaplex metadata uri: 200 bytes max pub decimals: u8, } @@ -65,21 +65,9 @@ impl Create { msg!("Creating metadata account..."); msg!("Metadata account address: {}", metadata_account.key); - let name = CStr::from_bytes_until_nul(&args.token_name) - .unwrap() - .to_str() - .unwrap() - .to_string(); - let symbol = CStr::from_bytes_until_nul(&args.token_symbol) - .unwrap() - .to_str() - .unwrap() - .to_string(); - let uri = CStr::from_bytes_until_nul(&args.token_uri) - .unwrap() - .to_str() - .unwrap() - .to_string(); + let name = Self::str_from_bytes(&mut args.token_name.to_vec())?.to_string(); + let symbol = Self::str_from_bytes(&mut args.token_symbol.to_vec())?.to_string(); + let uri = Self::str_from_bytes(&mut args.token_uri.to_vec())?.to_string(); mpl_instruction::CreateMetadataAccountV3Cpi { __program: token_metadata_program, @@ -90,8 +78,8 @@ impl Create { update_authority: (mint_authority, true), system_program, rent: Some(rent), - __args: mpl_token_metadata::instructions::CreateMetadataAccountV3InstructionArgs { - data: mpl_token_metadata::types::DataV2 { + __args: mpl_instruction::CreateMetadataAccountV3InstructionArgs { + data: DataV2 { name, symbol, uri, @@ -110,4 +98,17 @@ impl Create { Ok(()) } + + fn str_from_bytes(bytes: &mut Vec) -> Result<&str, ProgramError> { + // add an extra null byte, in the case every position is occupied with a non-null byte + bytes.push(0); + + // remove excess null bytes + if let Ok(cstr) = CStr::from_bytes_until_nul(bytes) { + if let Ok(str) = cstr.to_str() { + return Ok(str); + } + } + Err(SteelError::ParseError.into()) + } } diff --git a/tokens/transfer-tokens/steel/api/src/lib.rs b/tokens/transfer-tokens/steel/api/src/lib.rs index 9c97b4453..638032cb0 100644 --- a/tokens/transfer-tokens/steel/api/src/lib.rs +++ b/tokens/transfer-tokens/steel/api/src/lib.rs @@ -1,9 +1,11 @@ +pub mod error; pub mod instruction; use instruction::*; use steel::*; pub mod prelude { + pub use crate::error::*; pub use crate::instruction::*; }