From 16e9cc0f37990e0ea5c5c5b7b3ca98bba05fa8f9 Mon Sep 17 00:00:00 2001 From: MarkFeder <5670736+MarkFeder@users.noreply.github.com> Date: Sun, 28 Jun 2026 22:29:17 +0200 Subject: [PATCH 1/8] add pinocchio nft-operations example --- Cargo.lock | 12 + Cargo.toml | 1 + README.md | 2 +- tokens/nft-operations/pinocchio/cicd.sh | 8 + tokens/nft-operations/pinocchio/package.json | 24 + .../nft-operations/pinocchio/pnpm-lock.yaml | 1357 +++++++++++++++++ tokens/nft-operations/pinocchio/prepare.mjs | 35 + .../pinocchio/program/Cargo.toml | 22 + .../src/instructions/create_collection.rs | 136 ++ .../program/src/instructions/mint_nft.rs | 134 ++ .../pinocchio/program/src/instructions/mod.rs | 224 +++ .../src/instructions/verify_collection.rs | 94 ++ .../pinocchio/program/src/lib.rs | 14 + .../pinocchio/program/src/processor.rs | 40 + tokens/nft-operations/pinocchio/tests/test.ts | 183 +++ tokens/nft-operations/pinocchio/tsconfig.json | 10 + 16 files changed, 2295 insertions(+), 1 deletion(-) create mode 100644 tokens/nft-operations/pinocchio/cicd.sh create mode 100644 tokens/nft-operations/pinocchio/package.json create mode 100644 tokens/nft-operations/pinocchio/pnpm-lock.yaml create mode 100644 tokens/nft-operations/pinocchio/prepare.mjs create mode 100644 tokens/nft-operations/pinocchio/program/Cargo.toml create mode 100644 tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs create mode 100644 tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs create mode 100644 tokens/nft-operations/pinocchio/program/src/instructions/mod.rs create mode 100644 tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs create mode 100644 tokens/nft-operations/pinocchio/program/src/lib.rs create mode 100644 tokens/nft-operations/pinocchio/program/src/processor.rs create mode 100644 tokens/nft-operations/pinocchio/tests/test.ts create mode 100644 tokens/nft-operations/pinocchio/tsconfig.json diff --git a/Cargo.lock b/Cargo.lock index f2e02c09a..fb4eaa3c5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2256,6 +2256,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "nft-operations-pinocchio-program" +version = "0.1.0" +dependencies = [ + "pinocchio 0.10.2", + "pinocchio-associated-token-account", + "pinocchio-log", + "pinocchio-pubkey", + "pinocchio-system", + "pinocchio-token", +] + [[package]] name = "num" version = "0.2.1" diff --git a/Cargo.toml b/Cargo.toml index 3eba5e90c..4757dfe61 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -55,6 +55,7 @@ members = [ "tokens/create-token/pinocchio/program", "tokens/escrow/native/program", "tokens/escrow/pinocchio/program", + "tokens/nft-operations/pinocchio/program", "tokens/pda-mint-authority/native/program", "tokens/transfer-tokens/native/program", "tokens/transfer-tokens/pinocchio/program", diff --git a/README.md b/README.md index 4fa3a78bf..aa8f44be4 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ How to store state that changes size in Solana. Create an NFT collection, mint NFTs, and verify NFTs as part of a collection using Metaplex Token Metadata. Reminder: you don't need your own program just to mint an NFT, see the note at the top of this README. -[anchor](./tokens/nft-operations/anchor) +[anchor](./tokens/nft-operations/anchor) [pinocchio](./tokens/nft-operations/pinocchio) ### Transferring Tokens diff --git a/tokens/nft-operations/pinocchio/cicd.sh b/tokens/nft-operations/pinocchio/cicd.sh new file mode 100644 index 000000000..b2407c75f --- /dev/null +++ b/tokens/nft-operations/pinocchio/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 --sbf-out-dir=./program/target/so +solana program deploy ./program/target/so/program.so diff --git a/tokens/nft-operations/pinocchio/package.json b/tokens/nft-operations/pinocchio/package.json new file mode 100644 index 000000000..a00a1de30 --- /dev/null +++ b/tokens/nft-operations/pinocchio/package.json @@ -0,0 +1,24 @@ +{ + "type": "module", + "scripts": { + "postinstall": "node prepare.mjs", + "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/program.so" + }, + "dependencies": { + "@solana/web3.js": "^1.98.4", + "borsh": "^2.0.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.1", + "@types/mocha": "^9.1.1", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "solana-bankrun": "^0.3.0", + "ts-mocha": "^10.0.0", + "typescript": "^4.3.5" + } +} diff --git a/tokens/nft-operations/pinocchio/pnpm-lock.yaml b/tokens/nft-operations/pinocchio/pnpm-lock.yaml new file mode 100644 index 000000000..4b2f4d88c --- /dev/null +++ b/tokens/nft-operations/pinocchio/pnpm-lock.yaml @@ -0,0 +1,1357 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@solana/web3.js': + specifier: ^1.98.4 + version: 1.98.4(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@6.0.6) + borsh: + specifier: ^2.0.0 + version: 2.0.0 + devDependencies: + '@types/bn.js': + specifier: ^5.1.0 + version: 5.2.0 + '@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.1.0)(typescript@4.9.5)(utf-8-validate@6.0.6) + ts-mocha: + specifier: ^10.0.0 + version: 10.1.0(mocha@9.2.2) + typescript: + specifier: ^4.3.5 + version: 4.9.5 + +packages: + + '@babel/runtime@7.29.7': + resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} + engines: {node: '>=6.9.0'} + + '@noble/curves@1.9.7': + resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.8.0': + resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} + engines: {node: ^14.21.3 || >=16} + + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/codecs-core@2.3.0': + resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@2.3.0': + resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/errors@2.3.0': + resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/web3.js@1.98.4': + resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + + '@swc/helpers@0.5.21': + resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + + '@types/bn.js@5.2.0': + resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/mocha@9.1.1': + resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@25.9.1': + resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} + + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + + '@ungap/promise-all-settled@1.1.2': + resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} + + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + + ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bn.js@5.2.3: + resolution: {integrity: sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==} + + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + + borsh@2.0.0: + resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} + + brace-expansion@1.1.14: + resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} + + 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==} + + 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.1.0: + resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} + engines: {node: '>=6.14.2'} + + 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.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + + commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + debug@4.3.3: + resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + + delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + + diff@3.5.1: + resolution: {integrity: sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw==} + engines: {node: '>=0.3.1'} + + diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + + escalade@3.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.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + + 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==} + + 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 + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob@7.2.0: + resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + + growl@1.10.5: + resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} + engines: {node: '>=4.x'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + 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-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + + jayson@4.3.0: + resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} + 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 + + 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.5: + resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} + + 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.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + 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.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} + engines: {node: '>=8.6'} + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + rpc-websockets@9.3.9: + resolution: {integrity: sha512-2iQDaTB4g5fDB2ihrTFSJSibCEuxaRi1q7qTW7ZO9/M5/TC+ToHA4D9/ffNLEbAoHNNrcdeP05oATNk44SKZXA==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + + 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'} + + stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + + stream-json@1.9.1: + resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + + 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==} + + 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.1.0: + resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} + 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 || ^11.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.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + 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@7.24.6: + resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + + utf-8-validate@6.0.6: + resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} + engines: {node: '>=6.14.2'} + + uuid@14.0.0: + resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). + hasBin: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + workerpool@6.2.0: + resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.11: + resolution: {integrity: sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==} + 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.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yn@2.0.0: + resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} + engines: {node: '>=4'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@babel/runtime@7.29.7': {} + + '@noble/curves@1.9.7': + dependencies: + '@noble/hashes': 1.8.0 + + '@noble/hashes@1.8.0': {} + + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/codecs-core@2.3.0(typescript@4.9.5)': + dependencies: + '@solana/errors': 2.3.0(typescript@4.9.5) + typescript: 4.9.5 + + '@solana/codecs-numbers@2.3.0(typescript@4.9.5)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@4.9.5) + '@solana/errors': 2.3.0(typescript@4.9.5) + typescript: 4.9.5 + + '@solana/errors@2.3.0(typescript@4.9.5)': + dependencies: + chalk: 5.6.2 + commander: 14.0.3 + typescript: 4.9.5 + + '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@6.0.6)': + dependencies: + '@babel/runtime': 7.29.7 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@solana/buffer-layout': 4.0.1 + '@solana/codecs-numbers': 2.3.0(typescript@4.9.5) + agentkeepalive: 4.6.0 + bn.js: 5.2.3 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + node-fetch: 2.7.0 + rpc-websockets: 9.3.9 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + + '@swc/helpers@0.5.21': + dependencies: + tslib: 2.8.1 + + '@types/bn.js@5.2.0': + dependencies: + '@types/node': 25.9.1 + + '@types/chai@4.3.20': {} + + '@types/connect@3.4.38': + dependencies: + '@types/node': 12.20.55 + + '@types/json5@0.0.29': + optional: true + + '@types/mocha@9.1.1': {} + + '@types/node@12.20.55': {} + + '@types/node@25.9.1': + dependencies: + undici-types: 7.24.6 + + '@types/uuid@10.0.0': {} + + '@types/ws@7.4.7': + dependencies: + '@types/node': 12.20.55 + + '@types/ws@8.18.1': + dependencies: + '@types/node': 25.9.1 + + '@ungap/promise-all-settled@1.1.2': {} + + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + + ansi-colors@4.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.2 + + argparse@2.0.1: {} + + arrify@1.0.1: {} + + assertion-error@1.1.0: {} + + balanced-match@1.0.2: {} + + base-x@3.0.11: + dependencies: + safe-buffer: 5.2.1 + + base64-js@1.5.1: {} + + binary-extensions@2.3.0: {} + + bn.js@5.2.3: {} + + borsh@0.7.0: + dependencies: + bn.js: 5.2.3 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + + borsh@2.0.0: {} + + brace-expansion@1.1.14: + 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.11 + + buffer-from@1.1.2: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.1.0: + dependencies: + node-gyp-build: 4.8.4 + optional: true + + 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.6.2: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.5.3: + dependencies: + anymatch: 3.1.3 + braces: 3.0.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@14.0.3: {} + + 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 + + decamelize@4.0.0: {} + + deep-eql@4.1.4: + dependencies: + type-detect: 4.1.0 + + delay@5.0.0: {} + + diff@3.5.1: {} + + diff@5.0.0: {} + + emoji-regex@8.0.0: {} + + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: + dependencies: + es6-promise: 4.2.8 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + eventemitter3@5.0.4: {} + + eyes@0.1.8: {} + + fast-stable-stringify@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: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.5 + once: 1.4.0 + path-is-absolute: 1.0.1 + + growl@1.10.5: {} + + has-flag@4.0.0: {} + + he@1.2.0: {} + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + ieee754@1.2.1: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-unicode-supported@0.1.0: {} + + isexe@2.0.0: {} + + isomorphic-ws@4.0.1(ws@7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6)): + dependencies: + ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) + + jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + 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.11(bufferutil@4.1.0)(utf-8-validate@6.0.6)) + json-stringify-safe: 5.0.1 + stream-json: 1.9.1 + uuid: 8.3.2 + ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) + 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 + + 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.5: + dependencies: + brace-expansion: 1.1.14 + + minimatch@4.2.1: + dependencies: + brace-expansion: 1.1.14 + + 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.4: + optional: true + + normalize-path@3.0.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + pathval@1.1.1: {} + + picomatch@2.3.2: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.2 + + require-directory@2.1.1: {} + + rpc-websockets@9.3.9: + dependencies: + '@swc/helpers': 0.5.21 + '@types/uuid': 10.0.0 + '@types/ws': 8.18.1 + buffer: 6.0.3 + eventemitter3: 5.0.4 + uuid: 14.0.0 + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + + safe-buffer@5.2.1: {} + + serialize-javascript@6.0.0: + dependencies: + randombytes: 2.1.0 + + 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.1.0)(typescript@4.9.5)(utf-8-validate@6.0.6): + dependencies: + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@6.0.6) + 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 + - typescript + - 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: {} + + stream-chain@2.2.5: {} + + stream-json@1.9.1: + dependencies: + stream-chain: 2.2.5 + + 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: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + tr46@0.0.3: {} + + ts-mocha@10.1.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.1 + 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.1: {} + + type-detect@4.1.0: {} + + typescript@4.9.5: {} + + undici-types@7.24.6: {} + + utf-8-validate@6.0.6: + dependencies: + node-gyp-build: 4.8.4 + optional: true + + uuid@14.0.0: {} + + uuid@8.3.2: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + workerpool@6.2.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + + ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): + optionalDependencies: + bufferutil: 4.1.0 + utf-8-validate: 6.0.6 + + 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: {} diff --git a/tokens/nft-operations/pinocchio/prepare.mjs b/tokens/nft-operations/pinocchio/prepare.mjs new file mode 100644 index 000000000..3ffe52750 --- /dev/null +++ b/tokens/nft-operations/pinocchio/prepare.mjs @@ -0,0 +1,35 @@ +// Dumps the Metaplex Token Metadata program from mainnet into the bankrun +// fixtures directory so the test can load it into the local test validator. +// Runs automatically via the `postinstall` script. +// +// Uses only the Node.js standard library (no extra dependencies). Errors are +// logged but not fatal — a missing fixture will surface as a clear test failure +// when bankrun can't find `token_metadata.so`. + +import { execSync } from "node:child_process"; +import { mkdirSync, rmSync } from "node:fs"; +import { join } from "node:path"; + +const programs = [ + { + id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", + name: "token_metadata.so", + }, +]; + +const outputDir = "tests/fixtures"; + +try { + mkdirSync(outputDir, { recursive: true }); + // Point the Solana CLI at mainnet, where the canonical program lives. + execSync("solana config set -um", { stdio: "inherit" }); + + for (const { id, name } of programs) { + const outputFile = join(outputDir, name); + rmSync(outputFile, { force: true }); + execSync(`solana program dump ${id} ${outputFile}`, { stdio: "inherit" }); + console.log(`Dumped ${id} -> ${outputFile}`); + } +} catch (error) { + console.error(`Failed to prepare program fixtures: ${error.message}`); +} diff --git a/tokens/nft-operations/pinocchio/program/Cargo.toml b/tokens/nft-operations/pinocchio/program/Cargo.toml new file mode 100644 index 000000000..609966077 --- /dev/null +++ b/tokens/nft-operations/pinocchio/program/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "nft-operations-pinocchio-program" +version = "0.1.0" +edition = "2021" + +[dependencies] +pinocchio.workspace = true +pinocchio-log.workspace = true +pinocchio-pubkey.workspace = true +pinocchio-system.workspace = true +pinocchio-token.workspace = true +pinocchio-associated-token-account.workspace = true + +[lib] +crate-type = ["cdylib", "lib"] + +[features] +custom-heap = [] +custom-panic = [] + +[lints.rust] +unexpected_cfgs = { level = "warn", check-cfg = ['cfg(target_os, values("solana"))'] } diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs b/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs new file mode 100644 index 000000000..b31511536 --- /dev/null +++ b/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs @@ -0,0 +1,136 @@ +use pinocchio::{ + cpi::{Seed, Signer}, + error::ProgramError, + sysvars::{rent::Rent, Sysvar}, + AccountView, Address, ProgramResult, +}; +use pinocchio_associated_token_account::instructions::CreateIdempotent; +use pinocchio_log::log; +use pinocchio_pubkey::derive_address; +use pinocchio_system::instructions::CreateAccount; +use pinocchio_token::instructions::{InitializeMint2, MintTo}; + +use crate::instructions::{ + build_metadata_data, create_master_edition_cpi, create_metadata_cpi, read_bump, AUTHORITY_SEED, + MINT_SIZE, TOKEN_DECIMALS, +}; + +/// Creates a collection NFT: a 0-decimal mint whose authority is the program's +/// `[b"authority"]` PDA, with Metaplex metadata (marked as a sized collection) +/// and a master edition. The single token is minted to the user's ATA. +/// +/// Accounts: +/// 0. `[signer, writable]` user (payer) +/// 1. `[signer, writable]` mint account (a fresh keypair) +/// 2. `[]` mint authority PDA (`[b"authority"]`, also update authority) +/// 3. `[writable]` metadata account (Metaplex PDA) +/// 4. `[writable]` master edition account (Metaplex PDA) +/// 5. `[writable]` user's associated token account (the destination) +/// 6. `[]` system program +/// 7. `[]` token program +/// 8. `[]` associated token program +/// 9. `[]` token metadata program +/// +/// Instruction data: `[authority_bump: u8]`. +pub fn create_collection( + program_id: &Address, + accounts: &[AccountView], + args: &[u8], +) -> ProgramResult { + let [user, mint, mint_authority, metadata, master_edition, destination, system_program, token_program, _associated_token_program, _token_metadata_program] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + if !user.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } + + // Confirm the supplied account is the canonical mint-authority PDA. + let bump = read_bump(args)?; + let pda = derive_address(&[AUTHORITY_SEED], Some(bump), program_id.as_array()); + if mint_authority.address().as_array() != &pda { + return Err(ProgramError::InvalidSeeds); + } + + // Create and initialize the mint, with the PDA as mint/freeze authority. + let lamports = Rent::get()?.try_minimum_balance(MINT_SIZE)?; + log!("Creating mint account"); + CreateAccount { + from: user, + to: mint, + lamports, + space: MINT_SIZE as u64, + owner: &pinocchio_token::ID, + } + .invoke()?; + + log!("Initializing mint account"); + InitializeMint2 { + mint, + decimals: TOKEN_DECIMALS, + mint_authority: mint_authority.address(), + freeze_authority: Some(mint_authority.address()), + } + .invoke()?; + + // Signer seeds for the mint-authority PDA, reused by the CPIs below. + let bump_bytes = [bump]; + let seeds = [Seed::from(AUTHORITY_SEED), Seed::from(&bump_bytes)]; + let signers = [Signer::from(&seeds)]; + + log!("Creating destination token account"); + CreateIdempotent { + funding_account: user, + account: destination, + wallet: user, + mint, + system_program, + token_program, + } + .invoke()?; + + log!("Minting collection NFT"); + MintTo { + mint, + account: destination, + mint_authority, + amount: 1, + } + .invoke_signed(&signers)?; + + log!("Creating metadata account"); + let metadata_data = build_metadata_data( + "DummyCollection", + "DC", + "", + mint_authority.address().as_array(), + None, + true, + ); + create_metadata_cpi( + metadata, + mint, + mint_authority, + user, + system_program, + &metadata_data, + &signers, + )?; + + log!("Creating master edition account"); + create_master_edition_cpi( + master_edition, + mint, + mint_authority, + user, + metadata, + token_program, + system_program, + &signers, + )?; + + log!("Collection NFT created successfully"); + Ok(()) +} diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs b/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs new file mode 100644 index 000000000..da44f7662 --- /dev/null +++ b/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs @@ -0,0 +1,134 @@ +use pinocchio::{ + cpi::{Seed, Signer}, + error::ProgramError, + sysvars::{rent::Rent, Sysvar}, + AccountView, Address, ProgramResult, +}; +use pinocchio_associated_token_account::instructions::CreateIdempotent; +use pinocchio_log::log; +use pinocchio_pubkey::derive_address; +use pinocchio_system::instructions::CreateAccount; +use pinocchio_token::instructions::{InitializeMint2, MintTo}; + +use crate::instructions::{ + build_metadata_data, create_master_edition_cpi, create_metadata_cpi, read_bump, AUTHORITY_SEED, + MINT_SIZE, TOKEN_DECIMALS, +}; + +/// Mints an NFT that belongs to a collection: a 0-decimal mint (authority = the +/// `[b"authority"]` PDA) with Metaplex metadata referencing the collection mint +/// (unverified until `verify_collection`) and a master edition. The single token +/// is minted to the owner's ATA. +/// +/// Accounts: +/// 0. `[signer, writable]` owner (payer) +/// 1. `[signer, writable]` mint account (a fresh keypair) +/// 2. `[]` mint authority PDA (`[b"authority"]`, also update authority) +/// 3. `[writable]` metadata account (Metaplex PDA) +/// 4. `[writable]` master edition account (Metaplex PDA) +/// 5. `[writable]` owner's associated token account (the destination) +/// 6. `[]` collection mint +/// 7. `[]` system program +/// 8. `[]` token program +/// 9. `[]` associated token program +/// 10. `[]` token metadata program +/// +/// Instruction data: `[authority_bump: u8]`. +pub fn mint_nft(program_id: &Address, accounts: &[AccountView], args: &[u8]) -> ProgramResult { + let [owner, mint, mint_authority, metadata, master_edition, destination, collection_mint, system_program, token_program, _associated_token_program, _token_metadata_program] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + if !owner.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } + + // Confirm the supplied account is the canonical mint-authority PDA. + let bump = read_bump(args)?; + let pda = derive_address(&[AUTHORITY_SEED], Some(bump), program_id.as_array()); + if mint_authority.address().as_array() != &pda { + return Err(ProgramError::InvalidSeeds); + } + + // Create and initialize the mint, with the PDA as mint/freeze authority. + let lamports = Rent::get()?.try_minimum_balance(MINT_SIZE)?; + log!("Creating mint account"); + CreateAccount { + from: owner, + to: mint, + lamports, + space: MINT_SIZE as u64, + owner: &pinocchio_token::ID, + } + .invoke()?; + + log!("Initializing mint account"); + InitializeMint2 { + mint, + decimals: TOKEN_DECIMALS, + mint_authority: mint_authority.address(), + freeze_authority: Some(mint_authority.address()), + } + .invoke()?; + + // Signer seeds for the mint-authority PDA, reused by the CPIs below. + let bump_bytes = [bump]; + let seeds = [Seed::from(AUTHORITY_SEED), Seed::from(&bump_bytes)]; + let signers = [Signer::from(&seeds)]; + + log!("Creating destination token account"); + CreateIdempotent { + funding_account: owner, + account: destination, + wallet: owner, + mint, + system_program, + token_program, + } + .invoke()?; + + log!("Minting NFT"); + MintTo { + mint, + account: destination, + mint_authority, + amount: 1, + } + .invoke_signed(&signers)?; + + log!("Creating metadata account"); + let metadata_data = build_metadata_data( + "Mint Test", + "YAY", + "", + mint_authority.address().as_array(), + Some(collection_mint.address().as_array()), + false, + ); + create_metadata_cpi( + metadata, + mint, + mint_authority, + owner, + system_program, + &metadata_data, + &signers, + )?; + + log!("Creating master edition account"); + create_master_edition_cpi( + master_edition, + mint, + mint_authority, + owner, + metadata, + token_program, + system_program, + &signers, + )?; + + log!("NFT minted successfully"); + Ok(()) +} diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/mod.rs b/tokens/nft-operations/pinocchio/program/src/instructions/mod.rs new file mode 100644 index 000000000..e6c317198 --- /dev/null +++ b/tokens/nft-operations/pinocchio/program/src/instructions/mod.rs @@ -0,0 +1,224 @@ +use alloc::vec::Vec; + +use pinocchio::{ + cpi::{invoke_signed, Signer}, + error::ProgramError, + instruction::{InstructionAccount, InstructionView}, + AccountView, ProgramResult, +}; + +mod create_collection; +mod mint_nft; +mod verify_collection; + +pub use create_collection::*; +pub use mint_nft::*; +pub use verify_collection::*; + +/// Size (in bytes) of an SPL Token mint account. +pub const MINT_SIZE: usize = 82; + +/// Decimals for the minted token. NFTs use 0 decimals (the mint has a supply of +/// exactly one indivisible token). +pub const TOKEN_DECIMALS: u8 = 0; + +/// Seed prefix for the program's mint-authority PDA (`[b"authority"]`). The PDA +/// is never initialized — it exists only to sign the Metaplex CPIs. +pub const AUTHORITY_SEED: &[u8] = b"authority"; + +/// The Metaplex Token Metadata program ID +/// (`metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s`). +pub const TOKEN_METADATA_PROGRAM_ID: pinocchio::Address = + pinocchio::Address::from_str_const("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); + +/// Discriminator of the Metaplex `CreateMetadataAccountV3` instruction. +const CREATE_METADATA_ACCOUNT_V3: u8 = 33; +/// Discriminator of the Metaplex `CreateMasterEditionV3` instruction. +const CREATE_MASTER_EDITION_V3: u8 = 17; +/// Discriminator of the Metaplex `Verify` instruction. +const VERIFY: u8 = 52; +/// `VerificationArgs::CollectionV1` variant index, the argument to `Verify`. +const VERIFY_COLLECTION_V1: u8 = 1; + +/// Reads the `authority_bump` carried by every instruction's data. +pub(crate) fn read_bump(args: &[u8]) -> Result { + args.first() + .copied() + .ok_or(ProgramError::InvalidInstructionData) +} + +/// Serializes the data for a Metaplex `CreateMetadataAccountV3` instruction. +/// +/// Layout: `[33] DataV2 is_mutable:bool collection_details:Option`, where +/// `DataV2` is `name:string symbol:string uri:string seller_fee:u16 +/// creators:Option collection:Option uses:Option`. +/// +/// The single creator is the mint-authority PDA, marked `verified` (it signs the +/// CPI). `collection` links a member NFT to its collection; `collection_details` +/// marks the metadata itself as a (sized) collection. The two are mutually +/// exclusive in this example, matching the Anchor sources. +pub(crate) fn build_metadata_data( + name: &str, + symbol: &str, + uri: &str, + creator: &[u8; 32], + collection: Option<&[u8; 32]>, + is_collection: bool, +) -> Vec { + let mut data = Vec::new(); + data.push(CREATE_METADATA_ACCOUNT_V3); + + // DataV2 + push_borsh_string(&mut data, name.as_bytes()); + push_borsh_string(&mut data, symbol.as_bytes()); + push_borsh_string(&mut data, uri.as_bytes()); + data.extend_from_slice(&0u16.to_le_bytes()); // seller_fee_basis_points + + // creators: Some(vec![Creator { address, verified: true, share: 100 }]) + data.push(1); // Option: Some + data.extend_from_slice(&1u32.to_le_bytes()); // vec length + data.extend_from_slice(creator); // address + data.push(1); // verified: true + data.push(100); // share + + // collection: Option + match collection { + Some(key) => { + data.push(1); // Option: Some + data.push(0); // verified: false (set true by verify_collection) + data.extend_from_slice(key); + } + None => data.push(0), // Option: None + } + + data.push(0); // uses: None + + data.push(1); // is_mutable: true + + // collection_details: Option + if is_collection { + data.push(1); // Option: Some + data.push(0); // CollectionDetails::V1 + data.extend_from_slice(&0u64.to_le_bytes()); // size + } else { + data.push(0); // Option: None + } + + data +} + +/// Serializes the data for a Metaplex `CreateMasterEditionV3` instruction. +/// +/// Layout: `[17] max_supply:Option`. A `max_supply` of `Some(0)` allows no +/// printed editions (a one-of-one), matching the Anchor sources. +pub(crate) fn build_master_edition_data() -> Vec { + let mut data = Vec::new(); + data.push(CREATE_MASTER_EDITION_V3); + data.push(1); // max_supply: Some + data.extend_from_slice(&0u64.to_le_bytes()); // max_supply value + data +} + +/// Serializes the data for a Metaplex `Verify` instruction with +/// `VerificationArgs::CollectionV1`. Layout: `[52, 1]`. +pub(crate) fn build_verify_collection_data() -> [u8; 2] { + [VERIFY, VERIFY_COLLECTION_V1] +} + +/// Invokes Metaplex `CreateMetadataAccountV3`, signed by the mint-authority PDA. +/// +/// Accounts (Metaplex order): metadata (w), mint, mint_authority (signer), +/// payer (w, signer), update_authority, system_program. The optional rent +/// account is omitted. +#[allow(clippy::too_many_arguments)] +pub(crate) fn create_metadata_cpi( + metadata: &AccountView, + mint: &AccountView, + mint_authority: &AccountView, + payer: &AccountView, + system_program: &AccountView, + data: &[u8], + signers: &[Signer], +) -> ProgramResult { + let accounts = [ + InstructionAccount::writable(metadata.address()), + InstructionAccount::readonly(mint.address()), + InstructionAccount::readonly_signer(mint_authority.address()), + InstructionAccount::writable_signer(payer.address()), + // Update authority — the same PDA; recorded only, not required to sign. + InstructionAccount::readonly(mint_authority.address()), + InstructionAccount::readonly(system_program.address()), + ]; + let instruction = InstructionView { + program_id: &TOKEN_METADATA_PROGRAM_ID, + accounts: &accounts, + data, + }; + invoke_signed( + &instruction, + &[ + metadata, + mint, + mint_authority, + payer, + mint_authority, + system_program, + ], + signers, + ) +} + +/// Invokes Metaplex `CreateMasterEditionV3`, signed by the mint-authority PDA. +/// +/// Accounts (Metaplex order): edition (w), mint (w), update_authority (signer), +/// mint_authority (signer), payer (w, signer), metadata (w), token_program, +/// system_program. The optional rent account is omitted. +#[allow(clippy::too_many_arguments)] +pub(crate) fn create_master_edition_cpi( + edition: &AccountView, + mint: &AccountView, + mint_authority: &AccountView, + payer: &AccountView, + metadata: &AccountView, + token_program: &AccountView, + system_program: &AccountView, + signers: &[Signer], +) -> ProgramResult { + let data = build_master_edition_data(); + let accounts = [ + InstructionAccount::writable(edition.address()), + InstructionAccount::writable(mint.address()), + // Update authority and mint authority are the same PDA here. + InstructionAccount::readonly_signer(mint_authority.address()), + InstructionAccount::readonly_signer(mint_authority.address()), + InstructionAccount::writable_signer(payer.address()), + InstructionAccount::writable(metadata.address()), + InstructionAccount::readonly(token_program.address()), + InstructionAccount::readonly(system_program.address()), + ]; + let instruction = InstructionView { + program_id: &TOKEN_METADATA_PROGRAM_ID, + accounts: &accounts, + data: &data, + }; + invoke_signed( + &instruction, + &[ + edition, + mint, + mint_authority, + mint_authority, + payer, + metadata, + token_program, + system_program, + ], + signers, + ) +} + +/// Appends a Borsh `string` (4-byte little-endian length prefix + UTF-8 bytes). +fn push_borsh_string(buffer: &mut Vec, value: &[u8]) { + buffer.extend_from_slice(&(value.len() as u32).to_le_bytes()); + buffer.extend_from_slice(value); +} diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs b/tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs new file mode 100644 index 000000000..4e061b04f --- /dev/null +++ b/tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs @@ -0,0 +1,94 @@ +use pinocchio::{ + cpi::{invoke_signed, Seed, Signer}, + error::ProgramError, + instruction::{InstructionAccount, InstructionView}, + AccountView, Address, ProgramResult, +}; +use pinocchio_log::log; +use pinocchio_pubkey::derive_address; + +use crate::instructions::{ + build_verify_collection_data, read_bump, AUTHORITY_SEED, TOKEN_METADATA_PROGRAM_ID, +}; + +/// Verifies an NFT as a member of its collection via the Metaplex `Verify` +/// instruction (`VerificationArgs::CollectionV1`), signed by the collection's +/// update authority — the program's `[b"authority"]` PDA. +/// +/// Accounts: +/// 0. `[signer, writable]` payer (transaction fee payer) +/// 1. `[]` mint authority PDA (`[b"authority"]`, the collection update authority) +/// 2. `[writable]` metadata account of the NFT being verified +/// 3. `[]` collection mint +/// 4. `[writable]` collection metadata account +/// 5. `[]` collection master edition account +/// 6. `[]` system program +/// 7. `[]` instructions sysvar +/// 8. `[]` token metadata program +/// +/// Instruction data: `[authority_bump: u8]`. +pub fn verify_collection( + program_id: &Address, + accounts: &[AccountView], + args: &[u8], +) -> ProgramResult { + let [payer, mint_authority, metadata, collection_mint, collection_metadata, collection_master_edition, system_program, sysvar_instructions, token_metadata_program] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + if !payer.is_signer() { + return Err(ProgramError::MissingRequiredSignature); + } + + // Confirm the supplied account is the canonical mint-authority PDA. + let bump = read_bump(args)?; + let pda = derive_address(&[AUTHORITY_SEED], Some(bump), program_id.as_array()); + if mint_authority.address().as_array() != &pda { + return Err(ProgramError::InvalidSeeds); + } + + // Sign for the mint-authority PDA (the collection's update authority). + let bump_bytes = [bump]; + let seeds = [Seed::from(AUTHORITY_SEED), Seed::from(&bump_bytes)]; + let signers = [Signer::from(&seeds)]; + + // Metaplex `Verify` account order. `delegate_record` is unused, so its slot + // is filled with the Token Metadata program id (as the generated CPI does). + let data = build_verify_collection_data(); + let verify_accounts = [ + InstructionAccount::readonly_signer(mint_authority.address()), + InstructionAccount::readonly(token_metadata_program.address()), + InstructionAccount::writable(metadata.address()), + InstructionAccount::readonly(collection_mint.address()), + InstructionAccount::writable(collection_metadata.address()), + InstructionAccount::readonly(collection_master_edition.address()), + InstructionAccount::readonly(system_program.address()), + InstructionAccount::readonly(sysvar_instructions.address()), + ]; + let instruction = InstructionView { + program_id: &TOKEN_METADATA_PROGRAM_ID, + accounts: &verify_accounts, + data: &data, + }; + + log!("Verifying collection"); + invoke_signed( + &instruction, + &[ + mint_authority, + token_metadata_program, + metadata, + collection_mint, + collection_metadata, + collection_master_edition, + system_program, + sysvar_instructions, + ], + &signers, + )?; + + log!("Collection verified successfully"); + Ok(()) +} diff --git a/tokens/nft-operations/pinocchio/program/src/lib.rs b/tokens/nft-operations/pinocchio/program/src/lib.rs new file mode 100644 index 000000000..2e923127d --- /dev/null +++ b/tokens/nft-operations/pinocchio/program/src/lib.rs @@ -0,0 +1,14 @@ +#![no_std] + +// The `entrypoint!` macro installs the default (bump) global allocator, so the +// `alloc` crate is available — we use it to build the variable-length Metaplex +// instruction data at runtime. +extern crate alloc; + +pub mod instructions; +pub mod processor; + +use pinocchio::{entrypoint, nostd_panic_handler}; + +entrypoint!(processor::process_instruction); +nostd_panic_handler!(); diff --git a/tokens/nft-operations/pinocchio/program/src/processor.rs b/tokens/nft-operations/pinocchio/program/src/processor.rs new file mode 100644 index 000000000..633872962 --- /dev/null +++ b/tokens/nft-operations/pinocchio/program/src/processor.rs @@ -0,0 +1,40 @@ +use pinocchio::{error::ProgramError, AccountView, Address, ProgramResult}; +use pinocchio_log::log; + +use crate::instructions::{create_collection, mint_nft, verify_collection}; + +/// Dispatches an instruction based on its leading discriminator byte. +/// +/// Instruction data layout: `[discriminator: u8, authority_bump: u8]` +/// - `0` -> CreateCollection (mints a collection NFT) +/// - `1` -> MintNft (mints an NFT that belongs to the collection) +/// - `2` -> VerifyCollection (verifies the NFT as part of the collection) +/// +/// Every instruction carries the bump of the `[b"authority"]` mint-authority +/// PDA so the program can sign the Metaplex CPIs with it (the Anchor example +/// derives this bump on-chain instead). +pub fn process_instruction( + program_id: &Address, + accounts: &[AccountView], + instruction_data: &[u8], +) -> ProgramResult { + let (discriminator, args) = instruction_data + .split_first() + .ok_or(ProgramError::InvalidInstructionData)?; + + match *discriminator { + 0 => { + log!("Instruction: CreateCollection"); + create_collection(program_id, accounts, args) + } + 1 => { + log!("Instruction: MintNft"); + mint_nft(program_id, accounts, args) + } + 2 => { + log!("Instruction: VerifyCollection"); + verify_collection(program_id, accounts, args) + } + _ => Err(ProgramError::InvalidInstructionData), + } +} diff --git a/tokens/nft-operations/pinocchio/tests/test.ts b/tokens/nft-operations/pinocchio/tests/test.ts new file mode 100644 index 000000000..9abac4d25 --- /dev/null +++ b/tokens/nft-operations/pinocchio/tests/test.ts @@ -0,0 +1,183 @@ +import { Buffer } from "node:buffer"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; +import { assert } from "chai"; +import { start } from "solana-bankrun"; + +// The legacy SPL Token and Associated Token Account programs are bundled with +// bankrun. The Metaplex Token Metadata program is not, so it is dumped from +// mainnet into tests/fixtures by prepare.mjs and loaded by name below. +const TOKEN_PROGRAM_ID = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); +const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); +const TOKEN_METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); +const INSTRUCTIONS_SYSVAR_ID = new PublicKey("Sysvar1nstructions1111111111111111111111111"); + +// Instruction discriminators (the Borsh enum variant index). +const CREATE_COLLECTION = 0; +const MINT_NFT = 1; +const VERIFY_COLLECTION = 2; + +function getAuthorityPda(programId: PublicKey): [PublicKey, number] { + return PublicKey.findProgramAddressSync([Buffer.from("authority")], programId); +} + +function getMetadataAddress(mint: PublicKey): PublicKey { + return PublicKey.findProgramAddressSync( + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()], + TOKEN_METADATA_PROGRAM_ID, + )[0]; +} + +function getMasterEditionAddress(mint: PublicKey): PublicKey { + return PublicKey.findProgramAddressSync( + [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer(), Buffer.from("edition")], + TOKEN_METADATA_PROGRAM_ID, + )[0]; +} + +function getAssociatedTokenAddress(mint: PublicKey, owner: PublicKey): PublicKey { + return PublicKey.findProgramAddressSync( + [owner.toBuffer(), TOKEN_PROGRAM_ID.toBuffer(), mint.toBuffer()], + ASSOCIATED_TOKEN_PROGRAM_ID, + )[0]; +} + +// Read the `amount` field (u64 at offset 64) of an SPL token account. +function readTokenAmount(data: Uint8Array): bigint { + return Buffer.from(data).readBigUInt64LE(64); +} + +describe("NFT Operations (Pinocchio)", async () => { + const PROGRAM_ID = PublicKey.unique(); + const context = await start( + [ + { name: "nft_operations_pinocchio_program", programId: PROGRAM_ID }, + { name: "token_metadata", programId: TOKEN_METADATA_PROGRAM_ID }, + ], + [], + ); + const client = context.banksClient; + const payer = context.payer; + + const [mintAuthorityPda, mintAuthorityBump] = getAuthorityPda(PROGRAM_ID); + + const collectionMint = Keypair.generate(); + const nftMint = Keypair.generate(); + + async function sendInstruction(ix: TransactionInstruction, signers: Keypair[]) { + const tx = new Transaction(); + tx.feePayer = payer.publicKey; + tx.recentBlockhash = context.lastBlockhash; + tx.add(ix); + tx.sign(...signers); + await client.processTransaction(tx); + } + + it("Creates a collection NFT", async () => { + const metadata = getMetadataAddress(collectionMint.publicKey); + const masterEdition = getMasterEditionAddress(collectionMint.publicKey); + const destination = getAssociatedTokenAddress(collectionMint.publicKey, payer.publicKey); + + const ix = new TransactionInstruction({ + programId: PROGRAM_ID, + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // user + { pubkey: collectionMint.publicKey, isSigner: true, isWritable: true }, // mint + { pubkey: mintAuthorityPda, isSigner: false, isWritable: false }, // mint authority PDA + { pubkey: metadata, isSigner: false, isWritable: true }, // metadata + { pubkey: masterEdition, isSigner: false, isWritable: true }, // master edition + { pubkey: destination, isSigner: false, isWritable: true }, // destination ATA + { 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 + ], + data: Buffer.from([CREATE_COLLECTION, mintAuthorityBump]), + }); + + await sendInstruction(ix, [payer, collectionMint]); + + const mintAccount = await client.getAccount(collectionMint.publicKey); + if (mintAccount === null) throw new Error("Collection mint not found"); + assert.deepEqual(mintAccount.owner.toBytes(), TOKEN_PROGRAM_ID.toBytes()); + + const destinationAccount = await client.getAccount(destination); + if (destinationAccount === null) throw new Error("Collection token account not found"); + assert.equal(readTokenAmount(destinationAccount.data), 1n); + + const metadataAccount = await client.getAccount(metadata); + if (metadataAccount === null) throw new Error("Collection metadata not found"); + assert.deepEqual(metadataAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + assert.isTrue(Buffer.from(metadataAccount.data).toString("utf-8").includes("DummyCollection")); + }); + + it("Mints an NFT into the collection", async () => { + const metadata = getMetadataAddress(nftMint.publicKey); + const masterEdition = getMasterEditionAddress(nftMint.publicKey); + const destination = getAssociatedTokenAddress(nftMint.publicKey, payer.publicKey); + + const ix = new TransactionInstruction({ + programId: PROGRAM_ID, + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // owner + { pubkey: nftMint.publicKey, isSigner: true, isWritable: true }, // mint + { pubkey: mintAuthorityPda, isSigner: false, isWritable: false }, // mint authority PDA + { pubkey: metadata, isSigner: false, isWritable: true }, // metadata + { pubkey: masterEdition, isSigner: false, isWritable: true }, // master edition + { pubkey: destination, isSigner: false, isWritable: true }, // destination ATA + { pubkey: collectionMint.publicKey, isSigner: false, isWritable: false }, // collection mint + { 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 + ], + data: Buffer.from([MINT_NFT, mintAuthorityBump]), + }); + + await sendInstruction(ix, [payer, nftMint]); + + const destinationAccount = await client.getAccount(destination); + if (destinationAccount === null) throw new Error("NFT token account not found"); + assert.equal(readTokenAmount(destinationAccount.data), 1n); + + const metadataAccount = await client.getAccount(metadata); + if (metadataAccount === null) throw new Error("NFT metadata not found"); + assert.deepEqual(metadataAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + assert.isTrue(Buffer.from(metadataAccount.data).toString("utf-8").includes("Mint Test")); + + const editionAccount = await client.getAccount(masterEdition); + if (editionAccount === null) throw new Error("NFT master edition not found"); + assert.deepEqual(editionAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + }); + + it("Verifies the NFT as part of the collection", async () => { + const metadata = getMetadataAddress(nftMint.publicKey); + const collectionMetadata = getMetadataAddress(collectionMint.publicKey); + const collectionMasterEdition = getMasterEditionAddress(collectionMint.publicKey); + + const ix = new TransactionInstruction({ + programId: PROGRAM_ID, + keys: [ + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // payer + { pubkey: mintAuthorityPda, isSigner: false, isWritable: false }, // mint authority PDA + { pubkey: metadata, isSigner: false, isWritable: true }, // NFT metadata + { pubkey: collectionMint.publicKey, isSigner: false, isWritable: false }, // collection mint + { pubkey: collectionMetadata, isSigner: false, isWritable: true }, // collection metadata + { pubkey: collectionMasterEdition, isSigner: false, isWritable: false }, // collection master edition + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // system program + { pubkey: INSTRUCTIONS_SYSVAR_ID, isSigner: false, isWritable: false }, // instructions sysvar + { pubkey: TOKEN_METADATA_PROGRAM_ID, isSigner: false, isWritable: false }, // token metadata program + ], + data: Buffer.from([VERIFY_COLLECTION, mintAuthorityBump]), + }); + + // Metaplex `Verify` performs strict checks: the signer must be the + // collection's update authority (our PDA), the collection metadata and + // master edition must be valid, and the NFT must reference the collection. + // A successful transaction therefore proves the whole flow is correct. + await sendInstruction(ix, [payer]); + + const metadataAccount = await client.getAccount(metadata); + if (metadataAccount === null) throw new Error("NFT metadata not found"); + assert.deepEqual(metadataAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + }); +}); diff --git a/tokens/nft-operations/pinocchio/tsconfig.json b/tokens/nft-operations/pinocchio/tsconfig.json new file mode 100644 index 000000000..8c20b2236 --- /dev/null +++ b/tokens/nft-operations/pinocchio/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "types": ["mocha", "chai", "node"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "commonjs", + "target": "es6", + "esModuleInterop": true + } +} From f9ce29ac115ee507b81d0590facfa7797e9ffbec Mon Sep 17 00:00:00 2001 From: MarkFeder <5670736+MarkFeder@users.noreply.github.com> Date: Wed, 15 Jul 2026 23:44:22 +0200 Subject: [PATCH 2/8] nft-operations pinocchio: make bankrun test actually run Move the async bankrun setup out of the `describe` callback and into a `before` hook so Mocha collects the `it` blocks (an async `describe` body registers tests after the suite is already collected, so nothing ran). With the tests now executing, replace `Rent::try_minimum_balance` (both the collection and NFT mints) with the integer rent formula: its floating-point exemption-threshold path emits an opcode the bankrun VM rejects ("unsupported BPF instruction"). Matches the create-token example. --- .../src/instructions/create_collection.rs | 9 ++++-- .../program/src/instructions/mint_nft.rs | 9 ++++-- tokens/nft-operations/pinocchio/tests/test.ts | 29 ++++++++++++------- 3 files changed, 33 insertions(+), 14 deletions(-) diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs b/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs index b31511536..7f1ccb8ca 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs @@ -1,7 +1,7 @@ use pinocchio::{ cpi::{Seed, Signer}, error::ProgramError, - sysvars::{rent::Rent, Sysvar}, + sysvars::rent::{ACCOUNT_STORAGE_OVERHEAD, DEFAULT_LAMPORTS_PER_BYTE}, AccountView, Address, ProgramResult, }; use pinocchio_associated_token_account::instructions::CreateIdempotent; @@ -55,7 +55,12 @@ pub fn create_collection( } // Create and initialize the mint, with the PDA as mint/freeze authority. - let lamports = Rent::get()?.try_minimum_balance(MINT_SIZE)?; + // Rent is computed with integer math using the network's default parameters + // (`DEFAULT_LAMPORTS_PER_BYTE` already folds in the 2-year exemption + // threshold). We avoid `Rent::try_minimum_balance`, whose floating-point + // exemption-threshold path emits an instruction the bankrun test VM rejects + // ("unsupported BPF instruction"). + let lamports = (ACCOUNT_STORAGE_OVERHEAD + MINT_SIZE as u64) * DEFAULT_LAMPORTS_PER_BYTE; log!("Creating mint account"); CreateAccount { from: user, diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs b/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs index da44f7662..dcdf61bd0 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs @@ -1,7 +1,7 @@ use pinocchio::{ cpi::{Seed, Signer}, error::ProgramError, - sysvars::{rent::Rent, Sysvar}, + sysvars::rent::{ACCOUNT_STORAGE_OVERHEAD, DEFAULT_LAMPORTS_PER_BYTE}, AccountView, Address, ProgramResult, }; use pinocchio_associated_token_account::instructions::CreateIdempotent; @@ -53,7 +53,12 @@ pub fn mint_nft(program_id: &Address, accounts: &[AccountView], args: &[u8]) -> } // Create and initialize the mint, with the PDA as mint/freeze authority. - let lamports = Rent::get()?.try_minimum_balance(MINT_SIZE)?; + // Rent is computed with integer math using the network's default parameters + // (`DEFAULT_LAMPORTS_PER_BYTE` already folds in the 2-year exemption + // threshold). We avoid `Rent::try_minimum_balance`, whose floating-point + // exemption-threshold path emits an instruction the bankrun test VM rejects + // ("unsupported BPF instruction"). + let lamports = (ACCOUNT_STORAGE_OVERHEAD + MINT_SIZE as u64) * DEFAULT_LAMPORTS_PER_BYTE; log!("Creating mint account"); CreateAccount { from: owner, diff --git a/tokens/nft-operations/pinocchio/tests/test.ts b/tokens/nft-operations/pinocchio/tests/test.ts index 9abac4d25..8038ac5c4 100644 --- a/tokens/nft-operations/pinocchio/tests/test.ts +++ b/tokens/nft-operations/pinocchio/tests/test.ts @@ -46,23 +46,32 @@ function readTokenAmount(data: Uint8Array): bigint { return Buffer.from(data).readBigUInt64LE(64); } -describe("NFT Operations (Pinocchio)", async () => { +describe("NFT Operations (Pinocchio)", () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start( - [ - { name: "nft_operations_pinocchio_program", programId: PROGRAM_ID }, - { name: "token_metadata", programId: TOKEN_METADATA_PROGRAM_ID }, - ], - [], - ); - const client = context.banksClient; - const payer = context.payer; + let context: Awaited>; + let client: (typeof context)["banksClient"]; + let payer: (typeof context)["payer"]; const [mintAuthorityPda, mintAuthorityBump] = getAuthorityPda(PROGRAM_ID); const collectionMint = Keypair.generate(); const nftMint = Keypair.generate(); + // A `describe` callback runs synchronously, so the async bankrun setup must + // live in a `before` hook — otherwise the `it` blocks register after Mocha + // has already collected the suite and nothing runs. + before(async () => { + context = await start( + [ + { name: "nft_operations_pinocchio_program", programId: PROGRAM_ID }, + { name: "token_metadata", programId: TOKEN_METADATA_PROGRAM_ID }, + ], + [], + ); + client = context.banksClient; + payer = context.payer; + }); + async function sendInstruction(ix: TransactionInstruction, signers: Keypair[]) { const tx = new Transaction(); tx.feePayer = payer.publicKey; From d528ebf3f9f4863e0f28ca94e11621286fb0eb35 Mon Sep 17 00:00:00 2001 From: MarkFeder <5670736+MarkFeder@users.noreply.github.com> Date: Wed, 22 Jul 2026 01:11:01 +0200 Subject: [PATCH 3/8] nft-operations pinocchio: migrate test to kit + litesvm Apply the kit + litesvm template from the mint-close-authority example: build and sign transactions with @solana/kit and run them on litesvm, dropping @solana/web3.js and solana-bankrun entirely. The authority PDA and the metadata/master-edition/ATA addresses are derived with getProgramDerivedAddress; the Metaplex Token Metadata program is still dumped from mainnet by prepare.mjs and loaded into LiteSVM via addProgramFromFile. - deps: drop @solana/web3.js + solana-bankrun (and the now-unused borsh), add litesvm; pin @solana/kit to ^6.10.0 (litesvm's kit major) so there is a single kit in the tree - tsconfig: bump typescript to ^5 and lib to es2022+dom (kit's types), add @types/node; the suite is type-clean under tsc --noEmit --- tokens/nft-operations/pinocchio/package.json | 9 +- .../nft-operations/pinocchio/pnpm-lock.yaml | 1379 +++++++++++------ tokens/nft-operations/pinocchio/tests/test.ts | 309 ++-- tokens/nft-operations/pinocchio/tsconfig.json | 4 +- 4 files changed, 1119 insertions(+), 582 deletions(-) diff --git a/tokens/nft-operations/pinocchio/package.json b/tokens/nft-operations/pinocchio/package.json index a00a1de30..bb5ffc095 100644 --- a/tokens/nft-operations/pinocchio/package.json +++ b/tokens/nft-operations/pinocchio/package.json @@ -8,17 +8,16 @@ "deploy": "solana program deploy ./program/target/so/program.so" }, "dependencies": { - "@solana/web3.js": "^1.98.4", - "borsh": "^2.0.0" + "@solana/kit": "^6.10.0", + "litesvm": "^1.3.0" }, "devDependencies": { - "@types/bn.js": "^5.1.0", "@types/chai": "^4.3.1", "@types/mocha": "^9.1.1", + "@types/node": "^20.0.0", "chai": "^4.3.4", "mocha": "^9.0.3", - "solana-bankrun": "^0.3.0", "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" + "typescript": "^5.6.0" } } diff --git a/tokens/nft-operations/pinocchio/pnpm-lock.yaml b/tokens/nft-operations/pinocchio/pnpm-lock.yaml index 4b2f4d88c..f200ffaf5 100644 --- a/tokens/nft-operations/pinocchio/pnpm-lock.yaml +++ b/tokens/nft-operations/pinocchio/pnpm-lock.yaml @@ -8,118 +8,445 @@ importers: .: dependencies: - '@solana/web3.js': - specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@6.0.6) - borsh: - specifier: ^2.0.0 - version: 2.0.0 + '@solana/kit': + specifier: ^6.10.0 + version: 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + litesvm: + specifier: ^1.3.0 + version: 1.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) devDependencies: - '@types/bn.js': - specifier: ^5.1.0 - version: 5.2.0 '@types/chai': specifier: ^4.3.1 version: 4.3.20 '@types/mocha': specifier: ^9.1.1 version: 9.1.1 + '@types/node': + specifier: ^20.0.0 + version: 20.19.43 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.1.0)(typescript@4.9.5)(utf-8-validate@6.0.6) ts-mocha: specifier: ^10.0.0 version: 10.1.0(mocha@9.2.2) typescript: - specifier: ^4.3.5 - version: 4.9.5 + specifier: ^5.6.0 + version: 5.9.3 packages: - '@babel/runtime@7.29.7': - resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==} - engines: {node: '>=6.9.0'} + '@solana-program/system@0.12.2': + resolution: {integrity: sha512-MaBeOxlvTruQhA7UYkOb3hVTEHPPagOtd+PvTm6a8rGgvEAP0kD4BbC37NceOaR4ABNqdaCmD5OMVRKgrE6KAg==} + peerDependencies: + '@solana/kit': ^6.4.0 - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} + '@solana-program/token@0.14.0': + resolution: {integrity: sha512-zpLMr6JZndlsQCQvrm0gezfwdr1lmzOGqN6v2WIYXjtDmbF+xg6zh/MAp2UFHRpv3uDmylEdjtQo05pa2OeaYg==} + engines: {node: '>=24.0.0'} + peerDependencies: + '@solana/kit': ^6.5.0 - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} + '@solana/accounts@6.10.0': + resolution: {integrity: sha512-+FxfDOrnifoPlBkF+fr8eeQdgM6xtIgAg9xKMu3WnIz60oZd4Xnry6+ff6t+ePPoZZp397FSg9ZJet68VCWm5Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true - '@solana/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} + '@solana/addresses@6.10.0': + resolution: {integrity: sha512-vEoCGBTxG0HCERAn84KXkrJjl+pDaNzOpZ0qbgcPS98fYxP5yzbKB8SNOY2bzrbkRUmmw5Q3hqTRERemUN2Gcw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true - '@solana/codecs-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} + '@solana/assertions@6.10.0': + resolution: {integrity: sha512-lKSAdVo+P/6Lp4vs6shstXmFOpvxrABwn4o1462tb7sKkNapk6o9pPFVPGw4DUgPS3WqWRs1j2tmpuVjhQRntg==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.3.3' + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} + '@solana/codecs-core@6.10.0': + resolution: {integrity: sha512-nfAl9OMGo4HanIMxGsQoVB7BxMoqBCYEUxl8oEAZZ09pDxnaXQZkTRXEwPPccag37XfW1ciPd1vWPKwB2b0HHQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.3.3' + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-data-structures@6.10.0': + resolution: {integrity: sha512-CNasJW3bq5u+632Zt5aJ8rOjAjv2HyenpV8o9kAIqdmV4CBpjCCoBnKn8LkuR/sbeREZxJYfhKTXO/9ruAkw7A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-numbers@6.10.0': + resolution: {integrity: sha512-CcM+wX4zOiA9zkh8A7t1787A0Ehgmu5+6Z2tKoHew6cNw/dkaUTPa8JnNHbvfsLC8dfHC1BhAEJl86sKmRsfkQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/codecs-strings@6.10.0': + resolution: {integrity: sha512-zlaqkg7K6F6IN4V/Ec8TWkTn054gxv7ZLagvGkuEyAdPQ6BzzsehOm2TqCuyXgJJTCGPLY1bEk6yH9NxANe0kA==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.4.0' + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} + '@solana/codecs@6.10.0': + resolution: {integrity: sha512-lLVuxod4ChWp9i7OvpgIykYG8Q9OGPVXKnHM9VlzDDLylsx7Y1FoQL00sHa7PqFkJVmkBufaA6dcGbQ7FU+lAQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/errors@6.10.0': + resolution: {integrity: sha512-KBLAxCtAXr357JNhCyIDQXWbuSj5vN6w+28FSfcYY6OOSiphmXLAV3V58jgV0C6iNbIzFJFi6yatFyDTdeJsNg==} engines: {node: '>=20.18.0'} hasBin: true peerDependencies: - typescript: '>=5.3.3' + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fast-stable-stringify@6.10.0': + resolution: {integrity: sha512-iCNed27wk6PKSS3QUtHovRfMWF/jbVWogs2vB4tukKUCsqG4rDfDInIwZ6ur/nY6XTrgi2gMMdZq9GAUlWsbfw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fixed-points@6.10.0': + resolution: {integrity: sha512-ZkKL0alXH3L7/wMiVG8YUuG8qBKunlM810+YBD7nUPRhifiGsX1zwADViHLYNqLr/jUk0mTYFUcKznTpB/K+Gg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/functional@6.10.0': + resolution: {integrity: sha512-P8cevu4mAqHTXC37h1TVoOh8zhWB2tlOI/R9vWjYPpcLwcyWf8p2qq4LEGHl5kY+1C+4PNX39HsmCocXOPCDkQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instruction-plans@6.10.0': + resolution: {integrity: sha512-YG7mo4zykzdc6ZTV0BuN6pveK9qeBySzlYYerq578A4eQu3xcypMAYRGAvhMZtWTanjjmD6CKtM0M7kVp0TNxg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instructions@6.10.0': + resolution: {integrity: sha512-0TToYF+8LXQ3ofPMx+yF6yaM9l4YJvcAPMy0qV5JsrBUFlWXBSANRuudKBQLHMvb+a3OiUTq5X7omuorKMBB3A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/keys@6.10.0': + resolution: {integrity: sha512-26IRfdm/hTUCmM7MeEeX0ULSbCM6OzkZTkfkrPircqmRM7xyNqP4hq7u0P7wjb9dl7NfgyG6K7cdvUxrj2e3mA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/kit@6.10.0': + resolution: {integrity: sha512-/WnnQp3uARh2JCFSfAakejTAqwmXVuMVTcRn5r2yDwY2yzZ4R6mt/Cl59VPimVLNSoTyN/KsEwhv9omr3ERazQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/nominal-types@6.10.0': + resolution: {integrity: sha512-9ykyBBvnkInH7fCacjJi7zu2PJyd+OCt+VTjIISv070fHzKIMFqZqJJ/dJ0SRH2aHwfB3n86iVsmtBtuxi4KKA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/offchain-messages@6.10.0': + resolution: {integrity: sha512-RiEgAueeMkFMC1suOXBIcmCZgtXRxy24yk0DldPB37bB4zwOF1SAaRjNRPjIkGK8RhCYrEpPosnzLyavw9ueRg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/options@6.10.0': + resolution: {integrity: sha512-RO9UT3UYD8/Cu2uM6ZXbKvLeMnVD42+g9JRds7Pfs4AhiOyg4R4TJrQUAppTgavPTO3PBRlWtWOC05ZH/yAIbg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-core@6.10.0': + resolution: {integrity: sha512-JE70YTQOfFACVFGvoJon4Scc/eHUWjMu8Ovo35CcV2kHTAHYMCd4UkBd2gmlhK0vRMMomsQi1ZLPlAlTq0OoUQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-interfaces@6.10.0': + resolution: {integrity: sha512-vr0/l9wcM4orwGr8cjkFWaJ9A4HvzuAv00jMFNMg0Spd0GZqnwnpW+D/fXa1lIJnTRaF3EeEjLh4VjKU037T0Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/program-client-core@6.10.0': + resolution: {integrity: sha512-4PPbTLdC1ylHIuvhOFDP8RnSkXPCFjNFWGslzc+UFKnoR4ajzBcByX94jmaruDMk5ncxgj7tr9pzJTvfGHIaMA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/programs@6.10.0': + resolution: {integrity: sha512-qn/HeLP5KGUJXVub3fyGe69/rWaLX4jzwm6V/1pNxJDbdF+MBdgn18hP6F+VmhfdNmwK0lue3J/1HQ1UTMuQeQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/promises@6.10.0': + resolution: {integrity: sha512-oJSIn+VBBMWDo8oqw7RV3tI6Jih+Ieup6FcQLYLDUriaeo7+8l1Zdezl8zh7SIfeU4lOfAbRg6mR0huaS/Lltg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-api@6.10.0': + resolution: {integrity: sha512-RjPIVsAb/85P1ptoO3WpC0x7QG6gG/e4q/3lo6gbSznUZOcoM+8sSBnCX7BwP1ZkCDS6NK/ClXLnhhhYZx+OGg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-parsed-types@6.10.0': + resolution: {integrity: sha512-5275mvSV1mxhwvrMVa+K7BU/nAetpHfcb+8Ql9rtA8RRf6DyiimFQFZUukE4Ez6XJihEpCHNy98yhkgai9wytQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true - '@solana/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + '@solana/rpc-spec-types@6.10.0': + resolution: {integrity: sha512-NDZrKyZrJk4HaMFhTE/lAiMB824cWAodKqDHyKi0UteHU9pyRmil3BN1jt7e+j08mwMWwfklSgyrTaq52g6DIQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true - '@swc/helpers@0.5.21': - resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + '@solana/rpc-spec@6.10.0': + resolution: {integrity: sha512-yQdbWw5mZEWrwsunHR9NHkuhMXIB9sPOObwm18D53v5tAJnxTB0IcHvO647XqFDLTK/yQ4AdDtlYD1vsY07AMQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true - '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + '@solana/rpc-subscriptions-api@6.10.0': + resolution: {integrity: sha512-CRPQoTtT1cOwOQUsqS7jgo7wYdAj7jB5ab/UmMPWVpecf2FNMhWhgvxP2s82M7VkDGTGl13qaQ0WySmi7Egrlg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-channel-websocket@6.10.0': + resolution: {integrity: sha512-KkqP1186HELPlJftA88SNAT2znR8knCVzsUipXVzY4zfW8sN3LOa0ePMzh9VZ/V+J+raTt55laR87ovAO0n+zw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions-spec@6.10.0': + resolution: {integrity: sha512-nWMwGaG4ulzeX2sskY5TywXF3cwEd8FDmUpLe2JBWxE8XDAOGOKcsYPYFcBgb8ee9KqfPT2PTNdcz9jOhJf34w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-subscriptions@6.10.0': + resolution: {integrity: sha512-6mfuHp/K7unFKCOTCCBC9ziEGnxe2tyJ74EbR51QUnBeCUdYD7Hhdpxic1WRSJ3UeNW/mG4OzFM6z8Wi64Eh9Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transformers@6.10.0': + resolution: {integrity: sha512-2nFUrVTiE720pJOY4XKx3HuYmishw0of/4oScu76YGm6O8wsmvFvPNAkrEinmieWXQkfpBfRvLZmpl8PaAy+ug==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-transport-http@6.10.0': + resolution: {integrity: sha512-JrdNuYi0nBbD3X8JUtgX1dQJwIwz/WJvmigDdELysXfGB2bTJpfjqGDLhCLOz2sRl66FASIEqgG/LVa2C9VXcA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-types@6.10.0': + resolution: {integrity: sha512-zaSecTfCPvz/vcoAmKD6XoRstGHTr1EKJBD8T9UcpEFFB6CtF6DxerDB+wrzkamuT6msmnR2DWXMrYOGDAsgIg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc@6.10.0': + resolution: {integrity: sha512-EwxsqoD+NXV+m+iobnWNtATD93gTgaNsOiQOzYB1/2e+8S6fl6obdNPB55yfXgtl4jt6GV6/ae4xuPhLv76vvg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/signers@6.10.0': + resolution: {integrity: sha512-+vtCc+mT1FpGxrA5oL2aaMxSHiMJ2hH5PcDIfjo2XJkHz2klZiCZyT5F9+zpltc9vdi1QTElQq59Sfplmtd33A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/subscribable@6.10.0': + resolution: {integrity: sha512-VsR6XMwkiDBkZJUcoGkEOhf397pOV75gKCL9Bx8bpi2T3Bbs0CxUpMn4yaUgAnRba3eXmjbXMNCXjttfa6sKbw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/sysvars@6.10.0': + resolution: {integrity: sha512-cG13p1+onxz+20iWjwWQr1Z1jQwPm0fnjoW75fqZq7p4rVCie3L2sXvaJsYPjWKrUvpOzOIEHnqZGkG05rCpjg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-confirmation@6.10.0': + resolution: {integrity: sha512-ULvtg65qfenh4T/GYcIlKSUv5EqDcng9UN0dxbHU4kuZdR2e0B8HN2xDC4WhcFQVeFJSbTZmaYFkeTY/Y4gfGQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transaction-messages@6.10.0': + resolution: {integrity: sha512-s7v8G3BTxGlKYIj3eWCG0g1296v+1LBt16mVnlRH5FuyaJ5AdhlhtRho5HUDpdwE8EXun+y1c48V6uhcZ8wdbQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/transactions@6.10.0': + resolution: {integrity: sha512-VADSqP9OTYmhrox4pcgDd4+RjVmednXSE0+8Y7SPK4PN1pK5Az2RJ0nSsy0xcTnaOr8mF/crwFktqPrRQwSbQA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true '@types/chai@4.3.20': resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} '@types/mocha@9.1.1': resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} - '@types/node@12.20.55': - resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - - '@types/node@25.9.1': - resolution: {integrity: sha512-xfrlY7UD5rMJk3ZVJP8BNzS28J36YJg+xp+LPXV1TdWxr8uMH5A860QNxYDGQe/ylDSgjxE52Q9VnO7p75tJxg==} - - '@types/uuid@10.0.0': - resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} - - '@types/ws@7.4.7': - resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - - '@types/ws@8.18.1': - resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@types/node@20.19.43': + resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} '@ungap/promise-all-settled@1.1.2': resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - ansi-colors@4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} @@ -149,25 +476,10 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base-x@3.0.11: - resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - bn.js@5.2.3: - resolution: {integrity: sha512-EAcmnPkxpntVL+DS7bO1zhcZNvCkxqtkd0ZY53h06GNQ3DEkkGZ/gKgmDv6DdZQGj9BgfSPKtJJ7Dp1GPP8f7w==} - - borsh@0.7.0: - resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} - - borsh@2.0.0: - resolution: {integrity: sha512-kc9+BgR3zz9+cjbwM8ODoUB4fs3X3I5A/HtX7LZKxCLaMrEeDFoBpnhZY//DTS1VZBSs6S5v46RZRbZjRFspEg==} - brace-expansion@1.1.14: resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} @@ -178,15 +490,9 @@ packages: browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - bs58@4.0.1: - resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - bufferutil@4.1.0: resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} engines: {node: '>=6.14.2'} @@ -224,12 +530,9 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - commander@14.0.3: - resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} - engines: {node: '>=20'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + commander@15.0.0: + resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} + engines: {node: '>=22.12.0'} concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -251,10 +554,6 @@ packages: resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} engines: {node: '>=6'} - delay@5.0.0: - resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} - engines: {node: '>=10'} - diff@3.5.1: resolution: {integrity: sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw==} engines: {node: '>=0.3.1'} @@ -266,12 +565,6 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - es6-promise@4.2.8: - resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} - - es6-promisify@5.0.0: - resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -280,16 +573,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - eventemitter3@5.0.4: - resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} - - 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==} - fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -337,12 +620,6 @@ packages: 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. @@ -381,26 +658,57 @@ packages: 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.3.0: - resolution: {integrity: sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ==} - 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 + + litesvm-darwin-arm64@1.3.0: + resolution: {integrity: sha512-fj6cV/ofjMXdl5CwjyyLTQnZObfVH5HYDScQ6O44iRqxASmgEyEh4sC8a7M0YZ1rcli9nu2cWl5ARGura89I7Q==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + litesvm-darwin-x64@1.3.0: + resolution: {integrity: sha512-ZYEddnc+tAn8sVYpzvww0oHFiekbCSv+0OZiA6eUDtcSx9uzeRDmPPQ9eI6vgyews2LefBDSENmUb70GHY6Cqg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + litesvm-linux-arm64-gnu@1.3.0: + resolution: {integrity: sha512-kmmKeef96pJI4AJGCvjzMCW6QHuzFrMF1i6dE6OcrtWHaz0Ag+TFaKOU35H1bjH/fDBwoJUV9UbaIbdWht81tA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + litesvm-linux-arm64-musl@1.3.0: + resolution: {integrity: sha512-FO9p6rx+/3h7R3CU7lkOebL+jy8UEDngSrENHu7pj9EOr78QVyE3Fm0O+WMnwXpMoCSgW0XLhu1cI9NHAbzCTA==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + + litesvm-linux-x64-gnu@1.3.0: + resolution: {integrity: sha512-yXC8ZAdIei9JQ2xw5/BocOTu/7EqZuFPyhgENQ1mYDhjNpoyUbIuGCWnqtria14mDda0aV9yVev8plGUrUpjUw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + + litesvm-linux-x64-musl@1.3.0: + resolution: {integrity: sha512-oedromp1gTjShXmKmxZ1FYtnfM824vRcrPSPvGM0CrqJqKK61m1+tFwNRAVsDlpmWKvO/zsz90ctbgAUo/3TXg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true + litesvm@1.3.0: + resolution: {integrity: sha512-tMu9sBIqSbF1gQluXEUtGmXPfZlMc10tOoBVeDokgK77nl/CcuC506sEoFKM5Rq58Dkb070lBMVBLc43TbMUzQ==} + engines: {node: '>= 20'} locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} @@ -446,15 +754,6 @@ packages: 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.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true @@ -500,48 +799,12 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} - rpc-websockets@9.3.9: - resolution: {integrity: sha512-2iQDaTB4g5fDB2ihrTFSJSibCEuxaRi1q7qTW7ZO9/M5/TC+ToHA4D9/ffNLEbAoHNNrcdeP05oATNk44SKZXA==} - safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} serialize-javascript@6.0.0: resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} - 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==} @@ -549,12 +812,6 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - stream-chain@2.2.5: - resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} - - stream-json@1.9.1: - resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -571,10 +828,6 @@ packages: 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'} @@ -583,16 +836,10 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - text-encoding-utf-8@1.0.2: - resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} - 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.1.0: resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} engines: {node: '>= 6.X.X'} @@ -608,40 +855,25 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - 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'} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} hasBin: true - undici-types@7.24.6: - resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici-types@6.21.0: + resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + + undici-types@8.8.0: + resolution: {integrity: sha512-nNSnIK0VcEoNWrYwxCz9DFT1W7ASyBRWX7Hju/p9RAfVDcHoH07hkMg/na9U/2S04fhkPc4pDUK5NblZoaCvwg==} utf-8-validate@6.0.6: resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} engines: {node: '>=6.14.2'} - uuid@14.0.0: - resolution: {integrity: sha512-Qo+uWgilfSmAhXCMav1uYFynlQO7fMFiMVZsQqZRMIXp0O7rR7qjkj+cPvBHLgBqi960QCoo/PH2/6ZtVqKvrg==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). - hasBin: true - - webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -657,18 +889,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@7.5.11: - resolution: {integrity: sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==} - 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.21.0: resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} engines: {node: '>=10.0.0'} @@ -707,98 +927,498 @@ packages: snapshots: - '@babel/runtime@7.29.7': {} + '@solana-program/system@0.12.2(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/kit': 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana-program/token@0.14.0(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana-program/system': 0.12.2(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/kit': 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana/accounts@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/assertions': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/assertions@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 - '@noble/curves@1.9.7': + '@solana/codecs-core@6.10.0(typescript@5.9.3)': dependencies: - '@noble/hashes': 1.8.0 + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 - '@noble/hashes@1.8.0': {} + '@solana/codecs-data-structures@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 - '@solana/buffer-layout@4.0.1': + '@solana/codecs-numbers@6.10.0(typescript@5.9.3)': dependencies: - buffer: 6.0.3 + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 - '@solana/codecs-core@2.3.0(typescript@4.9.5)': + '@solana/codecs-strings@6.10.0(typescript@5.9.3)': dependencies: - '@solana/errors': 2.3.0(typescript@4.9.5) - typescript: 4.9.5 + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 - '@solana/codecs-numbers@2.3.0(typescript@4.9.5)': + '@solana/codecs@6.10.0(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 2.3.0(typescript@4.9.5) - '@solana/errors': 2.3.0(typescript@4.9.5) - typescript: 4.9.5 + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(typescript@5.9.3) + '@solana/fixed-points': 6.10.0(typescript@5.9.3) + '@solana/options': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@solana/errors@2.3.0(typescript@4.9.5)': + '@solana/errors@6.10.0(typescript@5.9.3)': dependencies: chalk: 5.6.2 - commander: 14.0.3 - typescript: 4.9.5 - - '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@6.0.6)': - dependencies: - '@babel/runtime': 7.29.7 - '@noble/curves': 1.9.7 - '@noble/hashes': 1.8.0 - '@solana/buffer-layout': 4.0.1 - '@solana/codecs-numbers': 2.3.0(typescript@4.9.5) - agentkeepalive: 4.6.0 - bn.js: 5.2.3 - borsh: 0.7.0 - bs58: 4.0.1 - buffer: 6.0.3 - fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - node-fetch: 2.7.0 - rpc-websockets: 9.3.9 - superstruct: 2.0.2 + commander: 15.0.0 + optionalDependencies: + typescript: 5.9.3 + + '@solana/fast-stable-stringify@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/fixed-points@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/functional@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/instruction-plans@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(typescript@5.9.3) + '@solana/transactions': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/instructions@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/keys@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/assertions': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/accounts': 6.10.0(typescript@5.9.3) + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/codecs': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/instruction-plans': 6.10.0(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(typescript@5.9.3) + '@solana/offchain-messages': 6.10.0(typescript@5.9.3) + '@solana/plugin-core': 6.10.0(typescript@5.9.3) + '@solana/plugin-interfaces': 6.10.0(typescript@5.9.3) + '@solana/program-client-core': 6.10.0(typescript@5.9.3) + '@solana/programs': 6.10.0(typescript@5.9.3) + '@solana/rpc': 6.10.0(typescript@5.9.3) + '@solana/rpc-api': 6.10.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/signers': 6.10.0(typescript@5.9.3) + '@solana/subscribable': 6.10.0(typescript@5.9.3) + '@solana/sysvars': 6.10.0(typescript@5.9.3) + '@solana/transaction-confirmation': 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/transaction-messages': 6.10.0(typescript@5.9.3) + '@solana/transactions': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - bufferutil - - encoding - - typescript + - fastestsmallesttextencoderdecoder - utf-8-validate - '@swc/helpers@0.5.21': + '@solana/nominal-types@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/offchain-messages@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/plugin-core@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/plugin-interfaces@6.10.0(typescript@5.9.3)': dependencies: - tslib: 2.8.1 + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/instruction-plans': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/signers': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/program-client-core@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 6.10.0(typescript@5.9.3) + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/instruction-plans': 6.10.0(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/plugin-interfaces': 6.10.0(typescript@5.9.3) + '@solana/rpc-api': 6.10.0(typescript@5.9.3) + '@solana/signers': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@types/bn.js@5.2.0': + '@solana/programs@6.10.0(typescript@5.9.3)': dependencies: - '@types/node': 25.9.1 + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@types/chai@4.3.20': {} + '@solana/promises@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-api@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(typescript@5.9.3) + '@solana/transactions': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-parsed-types@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-spec-types@6.10.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-spec@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/subscribable': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 - '@types/connect@3.4.38': + '@solana/rpc-subscriptions-api@6.10.0(typescript@5.9.3)': dependencies: - '@types/node': 12.20.55 + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(typescript@5.9.3) + '@solana/transactions': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@types/json5@0.0.29': - optional: true + '@solana/rpc-subscriptions-channel-websocket@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) + '@solana/subscribable': 6.10.0(typescript@5.9.3) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate - '@types/mocha@9.1.1': {} + '@solana/rpc-subscriptions-spec@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/subscribable': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + + '@solana/rpc-subscriptions@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-subscriptions-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/subscribable': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate - '@types/node@12.20.55': {} + '@solana/rpc-transformers@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@types/node@25.9.1': + '@solana/rpc-transport-http@6.10.0(typescript@5.9.3)': dependencies: - undici-types: 7.24.6 + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + undici-types: 8.8.0 + optionalDependencies: + typescript: 5.9.3 - '@types/uuid@10.0.0': {} + '@solana/rpc-types@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/fixed-points': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/rpc-api': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec': 6.10.0(typescript@5.9.3) + '@solana/rpc-spec-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-transformers': 6.10.0(typescript@5.9.3) + '@solana/rpc-transport-http': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/offchain-messages': 6.10.0(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(typescript@5.9.3) + '@solana/transactions': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@types/ws@7.4.7': + '@solana/subscribable@6.10.0(typescript@5.9.3)': dependencies: - '@types/node': 12.20.55 + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 - '@types/ws@8.18.1': + '@solana/sysvars@6.10.0(typescript@5.9.3)': dependencies: - '@types/node': 25.9.1 + '@solana/accounts': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(typescript@5.9.3) + '@solana/promises': 6.10.0(typescript@5.9.3) + '@solana/rpc': 6.10.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(typescript@5.9.3) + '@solana/transactions': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate - '@ungap/promise-all-settled@1.1.2': {} + '@solana/transaction-messages@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@6.10.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.10.0(typescript@5.9.3) + '@solana/codecs-core': 6.10.0(typescript@5.9.3) + '@solana/codecs-data-structures': 6.10.0(typescript@5.9.3) + '@solana/codecs-numbers': 6.10.0(typescript@5.9.3) + '@solana/codecs-strings': 6.10.0(typescript@5.9.3) + '@solana/errors': 6.10.0(typescript@5.9.3) + '@solana/functional': 6.10.0(typescript@5.9.3) + '@solana/instructions': 6.10.0(typescript@5.9.3) + '@solana/keys': 6.10.0(typescript@5.9.3) + '@solana/nominal-types': 6.10.0(typescript@5.9.3) + '@solana/rpc-types': 6.10.0(typescript@5.9.3) + '@solana/transaction-messages': 6.10.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@types/chai@4.3.20': {} + + '@types/json5@0.0.29': + optional: true + + '@types/mocha@9.1.1': {} - agentkeepalive@4.6.0: + '@types/node@20.19.43': dependencies: - humanize-ms: 1.2.1 + undici-types: 6.21.0 + + '@ungap/promise-all-settled@1.1.2': {} ansi-colors@4.1.1: {} @@ -821,24 +1441,8 @@ snapshots: balanced-match@1.0.2: {} - base-x@3.0.11: - dependencies: - safe-buffer: 5.2.1 - - base64-js@1.5.1: {} - binary-extensions@2.3.0: {} - bn.js@5.2.3: {} - - borsh@0.7.0: - dependencies: - bn.js: 5.2.3 - bs58: 4.0.1 - text-encoding-utf-8: 1.0.2 - - borsh@2.0.0: {} - brace-expansion@1.1.14: dependencies: balanced-match: 1.0.2 @@ -850,17 +1454,8 @@ snapshots: browser-stdout@1.3.1: {} - bs58@4.0.1: - dependencies: - base-x: 3.0.11 - buffer-from@1.1.2: {} - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - bufferutil@4.1.0: dependencies: node-gyp-build: 4.8.4 @@ -913,9 +1508,7 @@ snapshots: color-name@1.1.4: {} - commander@14.0.3: {} - - commander@2.20.3: {} + commander@15.0.0: {} concat-map@0.0.1: {} @@ -931,30 +1524,16 @@ snapshots: dependencies: type-detect: 4.1.0 - delay@5.0.0: {} - diff@3.5.1: {} diff@5.0.0: {} emoji-regex@8.0.0: {} - es6-promise@4.2.8: {} - - es6-promisify@5.0.0: - dependencies: - es6-promise: 4.2.8 - escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eventemitter3@5.0.4: {} - - eyes@0.1.8: {} - - fast-stable-stringify@1.0.0: {} - fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 @@ -994,12 +1573,6 @@ snapshots: 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 @@ -1027,39 +1600,51 @@ snapshots: isexe@2.0.0: {} - isomorphic-ws@4.0.1(ws@7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6)): - dependencies: - ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) - - jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): - dependencies: - '@types/connect': 3.4.38 - '@types/node': 12.20.55 - '@types/ws': 7.4.7 - 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.11(bufferutil@4.1.0)(utf-8-validate@6.0.6)) - json-stringify-safe: 5.0.1 - stream-json: 1.9.1 - uuid: 8.3.2 - ws: 7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6) - 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 + litesvm-darwin-arm64@1.3.0: + optional: true + + litesvm-darwin-x64@1.3.0: + optional: true + + litesvm-linux-arm64-gnu@1.3.0: + optional: true + + litesvm-linux-arm64-musl@1.3.0: + optional: true + + litesvm-linux-x64-gnu@1.3.0: + optional: true + + litesvm-linux-x64-musl@1.3.0: + optional: true + + litesvm@1.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6): + dependencies: + '@solana-program/system': 0.12.2(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana-program/token': 0.14.0(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/kit': 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + optionalDependencies: + litesvm-darwin-arm64: 1.3.0 + litesvm-darwin-x64: 1.3.0 + litesvm-linux-arm64-gnu: 1.3.0 + litesvm-linux-arm64-musl: 1.3.0 + litesvm-linux-x64-gnu: 1.3.0 + litesvm-linux-x64-musl: 1.3.0 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -1122,10 +1707,6 @@ snapshots: nanoid@3.3.1: {} - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - node-gyp-build@4.8.4: optional: true @@ -1161,56 +1742,12 @@ snapshots: require-directory@2.1.1: {} - rpc-websockets@9.3.9: - dependencies: - '@swc/helpers': 0.5.21 - '@types/uuid': 10.0.0 - '@types/ws': 8.18.1 - buffer: 6.0.3 - eventemitter3: 5.0.4 - uuid: 14.0.0 - ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 6.0.6 - safe-buffer@5.2.1: {} serialize-javascript@6.0.0: dependencies: randombytes: 2.1.0 - 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.1.0)(typescript@4.9.5)(utf-8-validate@6.0.6): - dependencies: - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@4.9.5)(utf-8-validate@6.0.6) - 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 - - typescript - - utf-8-validate - source-map-support@0.5.21: dependencies: buffer-from: 1.1.2 @@ -1218,12 +1755,6 @@ snapshots: source-map@0.6.1: {} - stream-chain@2.2.5: {} - - stream-json@1.9.1: - dependencies: - stream-chain: 2.2.5 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -1239,8 +1770,6 @@ snapshots: strip-json-comments@3.1.1: {} - superstruct@2.0.2: {} - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -1249,14 +1778,10 @@ snapshots: dependencies: has-flag: 4.0.0 - text-encoding-utf-8@1.0.2: {} - to-regex-range@5.0.1: dependencies: is-number: 7.0.0 - tr46@0.0.3: {} - ts-mocha@10.1.0(mocha@9.2.2): dependencies: mocha: 9.2.2 @@ -1283,30 +1808,19 @@ snapshots: strip-bom: 3.0.0 optional: true - tslib@2.8.1: {} - type-detect@4.1.0: {} - typescript@4.9.5: {} + typescript@5.9.3: {} - undici-types@7.24.6: {} + undici-types@6.21.0: {} + + undici-types@8.8.0: {} utf-8-validate@6.0.6: dependencies: node-gyp-build: 4.8.4 optional: true - uuid@14.0.0: {} - - uuid@8.3.2: {} - - webidl-conversions@3.0.1: {} - - whatwg-url@5.0.0: - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -1321,11 +1835,6 @@ snapshots: wrappy@1.0.2: {} - ws@7.5.11(bufferutil@4.1.0)(utf-8-validate@6.0.6): - optionalDependencies: - bufferutil: 4.1.0 - utf-8-validate: 6.0.6 - ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: bufferutil: 4.1.0 diff --git a/tokens/nft-operations/pinocchio/tests/test.ts b/tokens/nft-operations/pinocchio/tests/test.ts index 8038ac5c4..05c963b03 100644 --- a/tokens/nft-operations/pinocchio/tests/test.ts +++ b/tokens/nft-operations/pinocchio/tests/test.ts @@ -1,192 +1,221 @@ import { Buffer } from "node:buffer"; -import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; +import * as path from "node:path"; +import { + AccountRole, + address, + appendTransactionMessageInstruction, + createTransactionMessage, + generateKeyPairSigner, + getAddressEncoder, + getProgramDerivedAddress, + lamports, + pipe, + setTransactionMessageFeePayerSigner, + signTransactionMessageWithSigners, +} from "@solana/kit"; import { assert } from "chai"; -import { start } from "solana-bankrun"; +import { FailedTransactionMetadata, LiteSVM } from "litesvm"; // The legacy SPL Token and Associated Token Account programs are bundled with -// bankrun. The Metaplex Token Metadata program is not, so it is dumped from -// mainnet into tests/fixtures by prepare.mjs and loaded by name below. -const TOKEN_PROGRAM_ID = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); -const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); -const TOKEN_METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); -const INSTRUCTIONS_SYSVAR_ID = new PublicKey("Sysvar1nstructions1111111111111111111111111"); +// LiteSVM's standard runtime. The Metaplex Token Metadata program is not, so it +// is dumped from mainnet into tests/fixtures by prepare.mjs and loaded below. +const TOKEN_PROGRAM_ID = address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); +const ASSOCIATED_TOKEN_PROGRAM_ID = address("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); +const TOKEN_METADATA_PROGRAM_ID = address("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); +const SYSTEM_PROGRAM_ID = address("11111111111111111111111111111111"); +const INSTRUCTIONS_SYSVAR_ID = address("Sysvar1nstructions1111111111111111111111111"); // Instruction discriminators (the Borsh enum variant index). const CREATE_COLLECTION = 0; const MINT_NFT = 1; const VERIFY_COLLECTION = 2; -function getAuthorityPda(programId: PublicKey): [PublicKey, number] { - return PublicKey.findProgramAddressSync([Buffer.from("authority")], programId); -} +// The SPL token account `amount` is a u64 LE at offset 64. +const TOKEN_ACCOUNT_AMOUNT_OFFSET = 64; -function getMetadataAddress(mint: PublicKey): PublicKey { - return PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer()], - TOKEN_METADATA_PROGRAM_ID, - )[0]; -} +// The compiled program artifacts live in ./fixtures: the pinocchio program is +// built there by `build-and-test`, and token_metadata.so is dumped from mainnet +// by prepare.mjs. The npm scripts always run from the package root. +const FIXTURES = path.join(process.cwd(), "tests", "fixtures"); +const PROGRAM_SO = path.join(FIXTURES, "nft_operations_pinocchio_program.so"); +const TOKEN_METADATA_SO = path.join(FIXTURES, "token_metadata.so"); + +const addressEncoder = getAddressEncoder(); -function getMasterEditionAddress(mint: PublicKey): PublicKey { - return PublicKey.findProgramAddressSync( - [Buffer.from("metadata"), TOKEN_METADATA_PROGRAM_ID.toBuffer(), mint.toBuffer(), Buffer.from("edition")], - TOKEN_METADATA_PROGRAM_ID, - )[0]; +async function getMetadataAddress(mint: ReturnType) { + const [metadata] = await getProgramDerivedAddress({ + programAddress: TOKEN_METADATA_PROGRAM_ID, + seeds: ["metadata", addressEncoder.encode(TOKEN_METADATA_PROGRAM_ID), addressEncoder.encode(mint)], + }); + return metadata; } -function getAssociatedTokenAddress(mint: PublicKey, owner: PublicKey): PublicKey { - return PublicKey.findProgramAddressSync( - [owner.toBuffer(), TOKEN_PROGRAM_ID.toBuffer(), mint.toBuffer()], - ASSOCIATED_TOKEN_PROGRAM_ID, - )[0]; +async function getMasterEditionAddress(mint: ReturnType) { + const [edition] = await getProgramDerivedAddress({ + programAddress: TOKEN_METADATA_PROGRAM_ID, + seeds: ["metadata", addressEncoder.encode(TOKEN_METADATA_PROGRAM_ID), addressEncoder.encode(mint), "edition"], + }); + return edition; } -// Read the `amount` field (u64 at offset 64) of an SPL token account. -function readTokenAmount(data: Uint8Array): bigint { - return Buffer.from(data).readBigUInt64LE(64); +async function getAssociatedTokenAddress(mint: ReturnType, owner: ReturnType) { + const [ata] = await getProgramDerivedAddress({ + programAddress: ASSOCIATED_TOKEN_PROGRAM_ID, + seeds: [addressEncoder.encode(owner), addressEncoder.encode(TOKEN_PROGRAM_ID), addressEncoder.encode(mint)], + }); + return ata; } describe("NFT Operations (Pinocchio)", () => { - const PROGRAM_ID = PublicKey.unique(); - let context: Awaited>; - let client: (typeof context)["banksClient"]; - let payer: (typeof context)["payer"]; - - const [mintAuthorityPda, mintAuthorityBump] = getAuthorityPda(PROGRAM_ID); + let svm: LiteSVM; + let programId: ReturnType; + let payer: Awaited>; + let collectionMint: Awaited>; + let nftMint: Awaited>; + let mintAuthorityPda: ReturnType; + let mintAuthorityBump: number; - const collectionMint = Keypair.generate(); - const nftMint = Keypair.generate(); - - // A `describe` callback runs synchronously, so the async bankrun setup must - // live in a `before` hook — otherwise the `it` blocks register after Mocha - // has already collected the suite and nothing runs. before(async () => { - context = await start( - [ - { name: "nft_operations_pinocchio_program", programId: PROGRAM_ID }, - { name: "token_metadata", programId: TOKEN_METADATA_PROGRAM_ID }, - ], - [], - ); - client = context.banksClient; - payer = context.payer; + svm = new LiteSVM(); + // The program never asserts its own id, so any address works; a generated + // one keeps the test self-contained. + programId = (await generateKeyPairSigner()).address; + svm.addProgramFromFile(programId, PROGRAM_SO); + svm.addProgramFromFile(TOKEN_METADATA_PROGRAM_ID, TOKEN_METADATA_SO); + + payer = await generateKeyPairSigner(); + svm.airdrop(payer.address, lamports(10_000_000_000n)); + // The collection and NFT mints are created across the suite's tests, so they + // are generated once here. + collectionMint = await generateKeyPairSigner(); + nftMint = await generateKeyPairSigner(); + + // The update/mint authority is a PDA of the program; its canonical bump is + // passed into every instruction and used by the program to sign CPIs. + const [pda, bump] = await getProgramDerivedAddress({ + programAddress: programId, + seeds: ["authority"], + }); + mintAuthorityPda = pda; + mintAuthorityBump = bump; }); - async function sendInstruction(ix: TransactionInstruction, signers: Keypair[]) { - const tx = new Transaction(); - tx.feePayer = payer.publicKey; - tx.recentBlockhash = context.lastBlockhash; - tx.add(ix); - tx.sign(...signers); - await client.processTransaction(tx); + async function send[0]>( + ix: TInstruction, + ) { + const transactionMessage = pipe( + createTransactionMessage({ version: 0 }), + (m) => setTransactionMessageFeePayerSigner(payer, m), + (m) => svm.setTransactionMessageLifetimeUsingLatestBlockhash(m), + (m) => appendTransactionMessageInstruction(ix, m), + ); + const signedTx = await signTransactionMessageWithSigners(transactionMessage); + const result = svm.sendTransaction(signedTx); + if (result instanceof FailedTransactionMetadata) { + throw new Error(`Transaction failed: ${result.err()}`); + } } it("Creates a collection NFT", async () => { - const metadata = getMetadataAddress(collectionMint.publicKey); - const masterEdition = getMasterEditionAddress(collectionMint.publicKey); - const destination = getAssociatedTokenAddress(collectionMint.publicKey, payer.publicKey); - - const ix = new TransactionInstruction({ - programId: PROGRAM_ID, - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // user - { pubkey: collectionMint.publicKey, isSigner: true, isWritable: true }, // mint - { pubkey: mintAuthorityPda, isSigner: false, isWritable: false }, // mint authority PDA - { pubkey: metadata, isSigner: false, isWritable: true }, // metadata - { pubkey: masterEdition, isSigner: false, isWritable: true }, // master edition - { pubkey: destination, isSigner: false, isWritable: true }, // destination ATA - { 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 + const metadata = await getMetadataAddress(collectionMint.address); + const masterEdition = await getMasterEditionAddress(collectionMint.address); + const destination = await getAssociatedTokenAddress(collectionMint.address, payer.address); + + await send({ + programAddress: programId, + accounts: [ + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // user + { address: collectionMint.address, role: AccountRole.WRITABLE_SIGNER, signer: collectionMint }, // mint + { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA + { address: metadata, role: AccountRole.WRITABLE }, // metadata + { address: masterEdition, role: AccountRole.WRITABLE }, // master edition + { address: destination, role: AccountRole.WRITABLE }, // destination ATA + { address: SYSTEM_PROGRAM_ID, role: AccountRole.READONLY }, // system program + { address: TOKEN_PROGRAM_ID, role: AccountRole.READONLY }, // token program + { address: ASSOCIATED_TOKEN_PROGRAM_ID, role: AccountRole.READONLY }, // associated token program + { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program ], - data: Buffer.from([CREATE_COLLECTION, mintAuthorityBump]), + data: new Uint8Array([CREATE_COLLECTION, mintAuthorityBump]), }); - await sendInstruction(ix, [payer, collectionMint]); + const mintAccount = svm.getAccount(collectionMint.address); + if (!mintAccount?.exists) throw new Error("Collection mint not found"); + assert.equal(mintAccount.programAddress, TOKEN_PROGRAM_ID); - const mintAccount = await client.getAccount(collectionMint.publicKey); - if (mintAccount === null) throw new Error("Collection mint not found"); - assert.deepEqual(mintAccount.owner.toBytes(), TOKEN_PROGRAM_ID.toBytes()); + const destinationAccount = svm.getAccount(destination); + if (!destinationAccount?.exists) throw new Error("Collection token account not found"); + assert.equal(Buffer.from(destinationAccount.data).readBigUInt64LE(TOKEN_ACCOUNT_AMOUNT_OFFSET), 1n); - const destinationAccount = await client.getAccount(destination); - if (destinationAccount === null) throw new Error("Collection token account not found"); - assert.equal(readTokenAmount(destinationAccount.data), 1n); - - const metadataAccount = await client.getAccount(metadata); - if (metadataAccount === null) throw new Error("Collection metadata not found"); - assert.deepEqual(metadataAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + const metadataAccount = svm.getAccount(metadata); + if (!metadataAccount?.exists) throw new Error("Collection metadata not found"); + assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); assert.isTrue(Buffer.from(metadataAccount.data).toString("utf-8").includes("DummyCollection")); }); it("Mints an NFT into the collection", async () => { - const metadata = getMetadataAddress(nftMint.publicKey); - const masterEdition = getMasterEditionAddress(nftMint.publicKey); - const destination = getAssociatedTokenAddress(nftMint.publicKey, payer.publicKey); - - const ix = new TransactionInstruction({ - programId: PROGRAM_ID, - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // owner - { pubkey: nftMint.publicKey, isSigner: true, isWritable: true }, // mint - { pubkey: mintAuthorityPda, isSigner: false, isWritable: false }, // mint authority PDA - { pubkey: metadata, isSigner: false, isWritable: true }, // metadata - { pubkey: masterEdition, isSigner: false, isWritable: true }, // master edition - { pubkey: destination, isSigner: false, isWritable: true }, // destination ATA - { pubkey: collectionMint.publicKey, isSigner: false, isWritable: false }, // collection mint - { 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 + const metadata = await getMetadataAddress(nftMint.address); + const masterEdition = await getMasterEditionAddress(nftMint.address); + const destination = await getAssociatedTokenAddress(nftMint.address, payer.address); + + await send({ + programAddress: programId, + accounts: [ + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // owner + { address: nftMint.address, role: AccountRole.WRITABLE_SIGNER, signer: nftMint }, // mint + { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA + { address: metadata, role: AccountRole.WRITABLE }, // metadata + { address: masterEdition, role: AccountRole.WRITABLE }, // master edition + { address: destination, role: AccountRole.WRITABLE }, // destination ATA + { address: collectionMint.address, role: AccountRole.READONLY }, // collection mint + { address: SYSTEM_PROGRAM_ID, role: AccountRole.READONLY }, // system program + { address: TOKEN_PROGRAM_ID, role: AccountRole.READONLY }, // token program + { address: ASSOCIATED_TOKEN_PROGRAM_ID, role: AccountRole.READONLY }, // associated token program + { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program ], - data: Buffer.from([MINT_NFT, mintAuthorityBump]), + data: new Uint8Array([MINT_NFT, mintAuthorityBump]), }); - await sendInstruction(ix, [payer, nftMint]); - - const destinationAccount = await client.getAccount(destination); - if (destinationAccount === null) throw new Error("NFT token account not found"); - assert.equal(readTokenAmount(destinationAccount.data), 1n); + const destinationAccount = svm.getAccount(destination); + if (!destinationAccount?.exists) throw new Error("NFT token account not found"); + assert.equal(Buffer.from(destinationAccount.data).readBigUInt64LE(TOKEN_ACCOUNT_AMOUNT_OFFSET), 1n); - const metadataAccount = await client.getAccount(metadata); - if (metadataAccount === null) throw new Error("NFT metadata not found"); - assert.deepEqual(metadataAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + const metadataAccount = svm.getAccount(metadata); + if (!metadataAccount?.exists) throw new Error("NFT metadata not found"); + assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); assert.isTrue(Buffer.from(metadataAccount.data).toString("utf-8").includes("Mint Test")); - const editionAccount = await client.getAccount(masterEdition); - if (editionAccount === null) throw new Error("NFT master edition not found"); - assert.deepEqual(editionAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + const editionAccount = svm.getAccount(masterEdition); + if (!editionAccount?.exists) throw new Error("NFT master edition not found"); + assert.equal(editionAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); }); it("Verifies the NFT as part of the collection", async () => { - const metadata = getMetadataAddress(nftMint.publicKey); - const collectionMetadata = getMetadataAddress(collectionMint.publicKey); - const collectionMasterEdition = getMasterEditionAddress(collectionMint.publicKey); - - const ix = new TransactionInstruction({ - programId: PROGRAM_ID, - keys: [ - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // payer - { pubkey: mintAuthorityPda, isSigner: false, isWritable: false }, // mint authority PDA - { pubkey: metadata, isSigner: false, isWritable: true }, // NFT metadata - { pubkey: collectionMint.publicKey, isSigner: false, isWritable: false }, // collection mint - { pubkey: collectionMetadata, isSigner: false, isWritable: true }, // collection metadata - { pubkey: collectionMasterEdition, isSigner: false, isWritable: false }, // collection master edition - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // system program - { pubkey: INSTRUCTIONS_SYSVAR_ID, isSigner: false, isWritable: false }, // instructions sysvar - { pubkey: TOKEN_METADATA_PROGRAM_ID, isSigner: false, isWritable: false }, // token metadata program - ], - data: Buffer.from([VERIFY_COLLECTION, mintAuthorityBump]), - }); + const metadata = await getMetadataAddress(nftMint.address); + const collectionMetadata = await getMetadataAddress(collectionMint.address); + const collectionMasterEdition = await getMasterEditionAddress(collectionMint.address); // Metaplex `Verify` performs strict checks: the signer must be the // collection's update authority (our PDA), the collection metadata and // master edition must be valid, and the NFT must reference the collection. // A successful transaction therefore proves the whole flow is correct. - await sendInstruction(ix, [payer]); + await send({ + programAddress: programId, + accounts: [ + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer + { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA + { address: metadata, role: AccountRole.WRITABLE }, // NFT metadata + { address: collectionMint.address, role: AccountRole.READONLY }, // collection mint + { address: collectionMetadata, role: AccountRole.WRITABLE }, // collection metadata + { address: collectionMasterEdition, role: AccountRole.READONLY }, // collection master edition + { address: SYSTEM_PROGRAM_ID, role: AccountRole.READONLY }, // system program + { address: INSTRUCTIONS_SYSVAR_ID, role: AccountRole.READONLY }, // instructions sysvar + { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program + ], + data: new Uint8Array([VERIFY_COLLECTION, mintAuthorityBump]), + }); - const metadataAccount = await client.getAccount(metadata); - if (metadataAccount === null) throw new Error("NFT metadata not found"); - assert.deepEqual(metadataAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + const metadataAccount = svm.getAccount(metadata); + if (!metadataAccount?.exists) throw new Error("NFT metadata not found"); + assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); }); }); diff --git a/tokens/nft-operations/pinocchio/tsconfig.json b/tokens/nft-operations/pinocchio/tsconfig.json index 8c20b2236..032d00180 100644 --- a/tokens/nft-operations/pinocchio/tsconfig.json +++ b/tokens/nft-operations/pinocchio/tsconfig.json @@ -2,9 +2,9 @@ "compilerOptions": { "types": ["mocha", "chai", "node"], "typeRoots": ["./node_modules/@types"], - "lib": ["es2015"], + "lib": ["es2022", "dom"], "module": "commonjs", - "target": "es6", + "target": "es2022", "esModuleInterop": true } } From dee10d697e42477da01e23245e1363f7b98836c7 Mon Sep 17 00:00:00 2001 From: MarkFeder <5670736+MarkFeder@users.noreply.github.com> Date: Thu, 23 Jul 2026 21:27:47 +0200 Subject: [PATCH 4/8] nft-operations pinocchio: use official packages + real Rent Applies dev-jodee's #624 review refinements on top of the kit + litesvm test: - program: compute rent with Rent::get()?.try_minimum_balance(MINT_SIZE)? in both the create-collection and mint-nft instructions, instead of the integer-math workaround (only needed to dodge the f64 opcode the old bankrun VM rejected; litesvm runs the real syscall). - test: source the token, associated-token and system program ids and the instructions sysvar from the official @solana-program/token, @solana-program/system and @solana/sysvars packages, and read the minted amount with getTokenDecoder().decode(...).amount instead of a raw byte offset. Token Metadata has no official @solana-program client, so its id stays hand-rolled. - tsconfig: moduleResolution bundler for the packages' subpath exports. Verified locally: cargo build-sbf + ts-mocha -> 3 passing, tsc --noEmit and biome clean, frozen-lockfile OK. --- tokens/nft-operations/pinocchio/package.json | 3 ++ .../nft-operations/pinocchio/pnpm-lock.yaml | 9 ++++ .../src/instructions/create_collection.rs | 11 ++--- .../program/src/instructions/mint_nft.rs | 11 ++--- tokens/nft-operations/pinocchio/tests/test.ts | 43 +++++++++---------- tokens/nft-operations/pinocchio/tsconfig.json | 3 +- 6 files changed, 43 insertions(+), 37 deletions(-) diff --git a/tokens/nft-operations/pinocchio/package.json b/tokens/nft-operations/pinocchio/package.json index bb5ffc095..1b7fff751 100644 --- a/tokens/nft-operations/pinocchio/package.json +++ b/tokens/nft-operations/pinocchio/package.json @@ -8,7 +8,10 @@ "deploy": "solana program deploy ./program/target/so/program.so" }, "dependencies": { + "@solana-program/system": "^0.12.2", + "@solana-program/token": "^0.14.0", "@solana/kit": "^6.10.0", + "@solana/sysvars": "^6.10.0", "litesvm": "^1.3.0" }, "devDependencies": { diff --git a/tokens/nft-operations/pinocchio/pnpm-lock.yaml b/tokens/nft-operations/pinocchio/pnpm-lock.yaml index f200ffaf5..e04dc59d1 100644 --- a/tokens/nft-operations/pinocchio/pnpm-lock.yaml +++ b/tokens/nft-operations/pinocchio/pnpm-lock.yaml @@ -8,9 +8,18 @@ importers: .: dependencies: + '@solana-program/system': + specifier: ^0.12.2 + version: 0.12.2(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana-program/token': + specifier: ^0.14.0 + version: 0.14.0(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) '@solana/kit': specifier: ^6.10.0 version: 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/sysvars': + specifier: ^6.10.0 + version: 6.10.0(typescript@5.9.3) litesvm: specifier: ^1.3.0 version: 1.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs b/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs index 7f1ccb8ca..8dbea8c7c 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs @@ -1,7 +1,7 @@ use pinocchio::{ cpi::{Seed, Signer}, error::ProgramError, - sysvars::rent::{ACCOUNT_STORAGE_OVERHEAD, DEFAULT_LAMPORTS_PER_BYTE}, + sysvars::{rent::Rent, Sysvar}, AccountView, Address, ProgramResult, }; use pinocchio_associated_token_account::instructions::CreateIdempotent; @@ -55,12 +55,9 @@ pub fn create_collection( } // Create and initialize the mint, with the PDA as mint/freeze authority. - // Rent is computed with integer math using the network's default parameters - // (`DEFAULT_LAMPORTS_PER_BYTE` already folds in the 2-year exemption - // threshold). We avoid `Rent::try_minimum_balance`, whose floating-point - // exemption-threshold path emits an instruction the bankrun test VM rejects - // ("unsupported BPF instruction"). - let lamports = (ACCOUNT_STORAGE_OVERHEAD + MINT_SIZE as u64) * DEFAULT_LAMPORTS_PER_BYTE; + // Rent-exempt minimum is read from the Rent sysvar. + let rent = Rent::get()?; + let lamports = rent.try_minimum_balance(MINT_SIZE)?; log!("Creating mint account"); CreateAccount { from: user, diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs b/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs index dcdf61bd0..cdfd64881 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs @@ -1,7 +1,7 @@ use pinocchio::{ cpi::{Seed, Signer}, error::ProgramError, - sysvars::rent::{ACCOUNT_STORAGE_OVERHEAD, DEFAULT_LAMPORTS_PER_BYTE}, + sysvars::{rent::Rent, Sysvar}, AccountView, Address, ProgramResult, }; use pinocchio_associated_token_account::instructions::CreateIdempotent; @@ -53,12 +53,9 @@ pub fn mint_nft(program_id: &Address, accounts: &[AccountView], args: &[u8]) -> } // Create and initialize the mint, with the PDA as mint/freeze authority. - // Rent is computed with integer math using the network's default parameters - // (`DEFAULT_LAMPORTS_PER_BYTE` already folds in the 2-year exemption - // threshold). We avoid `Rent::try_minimum_balance`, whose floating-point - // exemption-threshold path emits an instruction the bankrun test VM rejects - // ("unsupported BPF instruction"). - let lamports = (ACCOUNT_STORAGE_OVERHEAD + MINT_SIZE as u64) * DEFAULT_LAMPORTS_PER_BYTE; + // Rent-exempt minimum is read from the Rent sysvar. + let rent = Rent::get()?; + let lamports = rent.try_minimum_balance(MINT_SIZE)?; log!("Creating mint account"); CreateAccount { from: owner, diff --git a/tokens/nft-operations/pinocchio/tests/test.ts b/tokens/nft-operations/pinocchio/tests/test.ts index 05c963b03..0cc78be7a 100644 --- a/tokens/nft-operations/pinocchio/tests/test.ts +++ b/tokens/nft-operations/pinocchio/tests/test.ts @@ -13,26 +13,25 @@ import { setTransactionMessageFeePayerSigner, signTransactionMessageWithSigners, } from "@solana/kit"; +import { SYSVAR_INSTRUCTIONS_ADDRESS } from "@solana/sysvars"; +import { SYSTEM_PROGRAM_ADDRESS } from "@solana-program/system"; +import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS, getTokenDecoder, TOKEN_PROGRAM_ADDRESS } from "@solana-program/token"; import { assert } from "chai"; import { FailedTransactionMetadata, LiteSVM } from "litesvm"; // The legacy SPL Token and Associated Token Account programs are bundled with -// LiteSVM's standard runtime. The Metaplex Token Metadata program is not, so it -// is dumped from mainnet into tests/fixtures by prepare.mjs and loaded below. -const TOKEN_PROGRAM_ID = address("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); -const ASSOCIATED_TOKEN_PROGRAM_ID = address("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"); +// LiteSVM's standard runtime, and their ids (and the instructions sysvar) come +// from the official @solana-program/token and @solana/sysvars packages. The +// Metaplex Token Metadata program is not bundled and has no official +// @solana-program client, so its id stays hand-rolled and it is dumped from +// mainnet into tests/fixtures by prepare.mjs. const TOKEN_METADATA_PROGRAM_ID = address("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); -const SYSTEM_PROGRAM_ID = address("11111111111111111111111111111111"); -const INSTRUCTIONS_SYSVAR_ID = address("Sysvar1nstructions1111111111111111111111111"); // Instruction discriminators (the Borsh enum variant index). const CREATE_COLLECTION = 0; const MINT_NFT = 1; const VERIFY_COLLECTION = 2; -// The SPL token account `amount` is a u64 LE at offset 64. -const TOKEN_ACCOUNT_AMOUNT_OFFSET = 64; - // The compiled program artifacts live in ./fixtures: the pinocchio program is // built there by `build-and-test`, and token_metadata.so is dumped from mainnet // by prepare.mjs. The npm scripts always run from the package root. @@ -60,8 +59,8 @@ async function getMasterEditionAddress(mint: ReturnType) { async function getAssociatedTokenAddress(mint: ReturnType, owner: ReturnType) { const [ata] = await getProgramDerivedAddress({ - programAddress: ASSOCIATED_TOKEN_PROGRAM_ID, - seeds: [addressEncoder.encode(owner), addressEncoder.encode(TOKEN_PROGRAM_ID), addressEncoder.encode(mint)], + programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, + seeds: [addressEncoder.encode(owner), addressEncoder.encode(TOKEN_PROGRAM_ADDRESS), addressEncoder.encode(mint)], }); return ata; } @@ -130,9 +129,9 @@ describe("NFT Operations (Pinocchio)", () => { { address: metadata, role: AccountRole.WRITABLE }, // metadata { address: masterEdition, role: AccountRole.WRITABLE }, // master edition { address: destination, role: AccountRole.WRITABLE }, // destination ATA - { address: SYSTEM_PROGRAM_ID, role: AccountRole.READONLY }, // system program - { address: TOKEN_PROGRAM_ID, role: AccountRole.READONLY }, // token program - { address: ASSOCIATED_TOKEN_PROGRAM_ID, role: AccountRole.READONLY }, // associated token program + { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program + { address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // token program + { address: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // associated token program { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program ], data: new Uint8Array([CREATE_COLLECTION, mintAuthorityBump]), @@ -140,11 +139,11 @@ describe("NFT Operations (Pinocchio)", () => { const mintAccount = svm.getAccount(collectionMint.address); if (!mintAccount?.exists) throw new Error("Collection mint not found"); - assert.equal(mintAccount.programAddress, TOKEN_PROGRAM_ID); + assert.equal(mintAccount.programAddress, TOKEN_PROGRAM_ADDRESS); const destinationAccount = svm.getAccount(destination); if (!destinationAccount?.exists) throw new Error("Collection token account not found"); - assert.equal(Buffer.from(destinationAccount.data).readBigUInt64LE(TOKEN_ACCOUNT_AMOUNT_OFFSET), 1n); + assert.equal(getTokenDecoder().decode(destinationAccount.data).amount, 1n); const metadataAccount = svm.getAccount(metadata); if (!metadataAccount?.exists) throw new Error("Collection metadata not found"); @@ -167,9 +166,9 @@ describe("NFT Operations (Pinocchio)", () => { { address: masterEdition, role: AccountRole.WRITABLE }, // master edition { address: destination, role: AccountRole.WRITABLE }, // destination ATA { address: collectionMint.address, role: AccountRole.READONLY }, // collection mint - { address: SYSTEM_PROGRAM_ID, role: AccountRole.READONLY }, // system program - { address: TOKEN_PROGRAM_ID, role: AccountRole.READONLY }, // token program - { address: ASSOCIATED_TOKEN_PROGRAM_ID, role: AccountRole.READONLY }, // associated token program + { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program + { address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // token program + { address: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // associated token program { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program ], data: new Uint8Array([MINT_NFT, mintAuthorityBump]), @@ -177,7 +176,7 @@ describe("NFT Operations (Pinocchio)", () => { const destinationAccount = svm.getAccount(destination); if (!destinationAccount?.exists) throw new Error("NFT token account not found"); - assert.equal(Buffer.from(destinationAccount.data).readBigUInt64LE(TOKEN_ACCOUNT_AMOUNT_OFFSET), 1n); + assert.equal(getTokenDecoder().decode(destinationAccount.data).amount, 1n); const metadataAccount = svm.getAccount(metadata); if (!metadataAccount?.exists) throw new Error("NFT metadata not found"); @@ -207,8 +206,8 @@ describe("NFT Operations (Pinocchio)", () => { { address: collectionMint.address, role: AccountRole.READONLY }, // collection mint { address: collectionMetadata, role: AccountRole.WRITABLE }, // collection metadata { address: collectionMasterEdition, role: AccountRole.READONLY }, // collection master edition - { address: SYSTEM_PROGRAM_ID, role: AccountRole.READONLY }, // system program - { address: INSTRUCTIONS_SYSVAR_ID, role: AccountRole.READONLY }, // instructions sysvar + { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program + { address: SYSVAR_INSTRUCTIONS_ADDRESS, role: AccountRole.READONLY }, // instructions sysvar { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program ], data: new Uint8Array([VERIFY_COLLECTION, mintAuthorityBump]), diff --git a/tokens/nft-operations/pinocchio/tsconfig.json b/tokens/nft-operations/pinocchio/tsconfig.json index 032d00180..237de9f97 100644 --- a/tokens/nft-operations/pinocchio/tsconfig.json +++ b/tokens/nft-operations/pinocchio/tsconfig.json @@ -3,7 +3,8 @@ "types": ["mocha", "chai", "node"], "typeRoots": ["./node_modules/@types"], "lib": ["es2022", "dom"], - "module": "commonjs", + "module": "preserve", + "moduleResolution": "bundler", "target": "es2022", "esModuleInterop": true } From c00813029564b75d8d5cf685b68f712dd3d70d2b Mon Sep 17 00:00:00 2001 From: MarkFeder Date: Wed, 5 Aug 2026 10:25:07 +0200 Subject: [PATCH 5/8] nft-operations pinocchio: migrate to pinocchio 0.11 Rebased onto main, which bumped pinocchio 0.10 -> 0.11 and dropped the pinocchio-pubkey crate. Adapt to the 0.11 API: - Derive the mint-authority PDA on-chain with Address::find_program_address (via solana-address's curve25519 feature, matching the merged block-list example) instead of pinocchio_pubkey::derive_address; reject a non-canonical bump in each instruction. - process_instruction / instruction handlers take &mut [AccountView]; pass copied AccountViews into the Metaplex CPIs. - pinocchio-token MintTo gained multisig_signers (&[]). --- Cargo.lock | 4 +- .../pinocchio/program/Cargo.toml | 4 +- .../src/instructions/create_collection.rs | 65 ++++--------------- .../program/src/instructions/mint_nft.rs | 40 +++--------- .../pinocchio/program/src/instructions/mod.rs | 40 ++---------- .../src/instructions/verify_collection.rs | 39 +++++------ .../pinocchio/program/src/processor.rs | 6 +- 7 files changed, 51 insertions(+), 147 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fb4eaa3c5..2cfe5bcec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2260,12 +2260,12 @@ dependencies = [ name = "nft-operations-pinocchio-program" version = "0.1.0" dependencies = [ - "pinocchio 0.10.2", + "pinocchio", "pinocchio-associated-token-account", "pinocchio-log", - "pinocchio-pubkey", "pinocchio-system", "pinocchio-token", + "solana-address 2.6.1", ] [[package]] diff --git a/tokens/nft-operations/pinocchio/program/Cargo.toml b/tokens/nft-operations/pinocchio/program/Cargo.toml index 609966077..720aba25b 100644 --- a/tokens/nft-operations/pinocchio/program/Cargo.toml +++ b/tokens/nft-operations/pinocchio/program/Cargo.toml @@ -6,10 +6,12 @@ edition = "2021" [dependencies] pinocchio.workspace = true pinocchio-log.workspace = true -pinocchio-pubkey.workspace = true pinocchio-system.workspace = true pinocchio-token.workspace = true pinocchio-associated-token-account.workspace = true +# `curve25519` enables on-chain `Address::find_program_address` (pinocchio 0.11 +# re-exports `Address` from `solana-address`); matches the merged block-list example. +solana-address = { version = "2", features = ["curve25519"] } [lib] crate-type = ["cdylib", "lib"] diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs b/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs index 8dbea8c7c..e2f6e5a18 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs @@ -6,13 +6,12 @@ use pinocchio::{ }; use pinocchio_associated_token_account::instructions::CreateIdempotent; use pinocchio_log::log; -use pinocchio_pubkey::derive_address; use pinocchio_system::instructions::CreateAccount; use pinocchio_token::instructions::{InitializeMint2, MintTo}; use crate::instructions::{ - build_metadata_data, create_master_edition_cpi, create_metadata_cpi, read_bump, AUTHORITY_SEED, - MINT_SIZE, TOKEN_DECIMALS, + build_metadata_data, create_master_edition_cpi, create_metadata_cpi, read_bump, AUTHORITY_SEED, MINT_SIZE, + TOKEN_DECIMALS, }; /// Creates a collection NFT: a 0-decimal mint whose authority is the program's @@ -32,11 +31,7 @@ use crate::instructions::{ /// 9. `[]` token metadata program /// /// Instruction data: `[authority_bump: u8]`. -pub fn create_collection( - program_id: &Address, - accounts: &[AccountView], - args: &[u8], -) -> ProgramResult { +pub fn create_collection(program_id: &Address, accounts: &mut [AccountView], args: &[u8]) -> ProgramResult { let [user, mint, mint_authority, metadata, master_edition, destination, system_program, token_program, _associated_token_program, _token_metadata_program] = accounts else { @@ -49,8 +44,9 @@ pub fn create_collection( // Confirm the supplied account is the canonical mint-authority PDA. let bump = read_bump(args)?; - let pda = derive_address(&[AUTHORITY_SEED], Some(bump), program_id.as_array()); - if mint_authority.address().as_array() != &pda { + // Derive the canonical PDA on-chain and reject a non-canonical bump. + let (pda, canonical_bump) = Address::find_program_address(&[AUTHORITY_SEED], program_id); + if mint_authority.address() != &pda || bump != canonical_bump { return Err(ProgramError::InvalidSeeds); } @@ -59,14 +55,7 @@ pub fn create_collection( let rent = Rent::get()?; let lamports = rent.try_minimum_balance(MINT_SIZE)?; log!("Creating mint account"); - CreateAccount { - from: user, - to: mint, - lamports, - space: MINT_SIZE as u64, - owner: &pinocchio_token::ID, - } - .invoke()?; + CreateAccount { from: user, to: mint, lamports, space: MINT_SIZE as u64, owner: &pinocchio_token::ID }.invoke()?; log!("Initializing mint account"); InitializeMint2 { @@ -83,43 +72,17 @@ pub fn create_collection( let signers = [Signer::from(&seeds)]; log!("Creating destination token account"); - CreateIdempotent { - funding_account: user, - account: destination, - wallet: user, - mint, - system_program, - token_program, - } - .invoke()?; + CreateIdempotent { funding_account: user, account: destination, wallet: user, mint, system_program, token_program } + .invoke()?; log!("Minting collection NFT"); - MintTo { - mint, - account: destination, - mint_authority, - amount: 1, - } - .invoke_signed(&signers)?; + MintTo { mint, account: destination, mint_authority, amount: 1, multisig_signers: &[] as &[&AccountView] } + .invoke_signed(&signers)?; log!("Creating metadata account"); - let metadata_data = build_metadata_data( - "DummyCollection", - "DC", - "", - mint_authority.address().as_array(), - None, - true, - ); - create_metadata_cpi( - metadata, - mint, - mint_authority, - user, - system_program, - &metadata_data, - &signers, - )?; + let metadata_data = + build_metadata_data("DummyCollection", "DC", "", mint_authority.address().as_array(), None, true); + create_metadata_cpi(metadata, mint, mint_authority, user, system_program, &metadata_data, &signers)?; log!("Creating master edition account"); create_master_edition_cpi( diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs b/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs index cdfd64881..95d9bce02 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs @@ -6,13 +6,12 @@ use pinocchio::{ }; use pinocchio_associated_token_account::instructions::CreateIdempotent; use pinocchio_log::log; -use pinocchio_pubkey::derive_address; use pinocchio_system::instructions::CreateAccount; use pinocchio_token::instructions::{InitializeMint2, MintTo}; use crate::instructions::{ - build_metadata_data, create_master_edition_cpi, create_metadata_cpi, read_bump, AUTHORITY_SEED, - MINT_SIZE, TOKEN_DECIMALS, + build_metadata_data, create_master_edition_cpi, create_metadata_cpi, read_bump, AUTHORITY_SEED, MINT_SIZE, + TOKEN_DECIMALS, }; /// Mints an NFT that belongs to a collection: a 0-decimal mint (authority = the @@ -34,7 +33,7 @@ use crate::instructions::{ /// 10. `[]` token metadata program /// /// Instruction data: `[authority_bump: u8]`. -pub fn mint_nft(program_id: &Address, accounts: &[AccountView], args: &[u8]) -> ProgramResult { +pub fn mint_nft(program_id: &Address, accounts: &mut [AccountView], args: &[u8]) -> ProgramResult { let [owner, mint, mint_authority, metadata, master_edition, destination, collection_mint, system_program, token_program, _associated_token_program, _token_metadata_program] = accounts else { @@ -47,8 +46,9 @@ pub fn mint_nft(program_id: &Address, accounts: &[AccountView], args: &[u8]) -> // Confirm the supplied account is the canonical mint-authority PDA. let bump = read_bump(args)?; - let pda = derive_address(&[AUTHORITY_SEED], Some(bump), program_id.as_array()); - if mint_authority.address().as_array() != &pda { + // Derive the canonical PDA on-chain and reject a non-canonical bump. + let (pda, canonical_bump) = Address::find_program_address(&[AUTHORITY_SEED], program_id); + if mint_authority.address() != &pda || bump != canonical_bump { return Err(ProgramError::InvalidSeeds); } @@ -57,14 +57,7 @@ pub fn mint_nft(program_id: &Address, accounts: &[AccountView], args: &[u8]) -> let rent = Rent::get()?; let lamports = rent.try_minimum_balance(MINT_SIZE)?; log!("Creating mint account"); - CreateAccount { - from: owner, - to: mint, - lamports, - space: MINT_SIZE as u64, - owner: &pinocchio_token::ID, - } - .invoke()?; + CreateAccount { from: owner, to: mint, lamports, space: MINT_SIZE as u64, owner: &pinocchio_token::ID }.invoke()?; log!("Initializing mint account"); InitializeMint2 { @@ -92,13 +85,8 @@ pub fn mint_nft(program_id: &Address, accounts: &[AccountView], args: &[u8]) -> .invoke()?; log!("Minting NFT"); - MintTo { - mint, - account: destination, - mint_authority, - amount: 1, - } - .invoke_signed(&signers)?; + MintTo { mint, account: destination, mint_authority, amount: 1, multisig_signers: &[] as &[&AccountView] } + .invoke_signed(&signers)?; log!("Creating metadata account"); let metadata_data = build_metadata_data( @@ -109,15 +97,7 @@ pub fn mint_nft(program_id: &Address, accounts: &[AccountView], args: &[u8]) -> Some(collection_mint.address().as_array()), false, ); - create_metadata_cpi( - metadata, - mint, - mint_authority, - owner, - system_program, - &metadata_data, - &signers, - )?; + create_metadata_cpi(metadata, mint, mint_authority, owner, system_program, &metadata_data, &signers)?; log!("Creating master edition account"); create_master_edition_cpi( diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/mod.rs b/tokens/nft-operations/pinocchio/program/src/instructions/mod.rs index e6c317198..93f9a5ab5 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/mod.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/mod.rs @@ -42,9 +42,7 @@ const VERIFY_COLLECTION_V1: u8 = 1; /// Reads the `authority_bump` carried by every instruction's data. pub(crate) fn read_bump(args: &[u8]) -> Result { - args.first() - .copied() - .ok_or(ProgramError::InvalidInstructionData) + args.first().copied().ok_or(ProgramError::InvalidInstructionData) } /// Serializes the data for a Metaplex `CreateMetadataAccountV3` instruction. @@ -149,23 +147,8 @@ pub(crate) fn create_metadata_cpi( InstructionAccount::readonly(mint_authority.address()), InstructionAccount::readonly(system_program.address()), ]; - let instruction = InstructionView { - program_id: &TOKEN_METADATA_PROGRAM_ID, - accounts: &accounts, - data, - }; - invoke_signed( - &instruction, - &[ - metadata, - mint, - mint_authority, - payer, - mint_authority, - system_program, - ], - signers, - ) + let instruction = InstructionView { program_id: &TOKEN_METADATA_PROGRAM_ID, accounts: &accounts, data }; + invoke_signed(&instruction, &[*metadata, *mint, *mint_authority, *payer, *mint_authority, *system_program], signers) } /// Invokes Metaplex `CreateMasterEditionV3`, signed by the mint-authority PDA. @@ -196,23 +179,10 @@ pub(crate) fn create_master_edition_cpi( InstructionAccount::readonly(token_program.address()), InstructionAccount::readonly(system_program.address()), ]; - let instruction = InstructionView { - program_id: &TOKEN_METADATA_PROGRAM_ID, - accounts: &accounts, - data: &data, - }; + let instruction = InstructionView { program_id: &TOKEN_METADATA_PROGRAM_ID, accounts: &accounts, data: &data }; invoke_signed( &instruction, - &[ - edition, - mint, - mint_authority, - mint_authority, - payer, - metadata, - token_program, - system_program, - ], + &[*edition, *mint, *mint_authority, *mint_authority, *payer, *metadata, *token_program, *system_program], signers, ) } diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs b/tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs index 4e061b04f..1f691460d 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs @@ -5,11 +5,8 @@ use pinocchio::{ AccountView, Address, ProgramResult, }; use pinocchio_log::log; -use pinocchio_pubkey::derive_address; -use crate::instructions::{ - build_verify_collection_data, read_bump, AUTHORITY_SEED, TOKEN_METADATA_PROGRAM_ID, -}; +use crate::instructions::{build_verify_collection_data, read_bump, AUTHORITY_SEED, TOKEN_METADATA_PROGRAM_ID}; /// Verifies an NFT as a member of its collection via the Metaplex `Verify` /// instruction (`VerificationArgs::CollectionV1`), signed by the collection's @@ -27,11 +24,7 @@ use crate::instructions::{ /// 8. `[]` token metadata program /// /// Instruction data: `[authority_bump: u8]`. -pub fn verify_collection( - program_id: &Address, - accounts: &[AccountView], - args: &[u8], -) -> ProgramResult { +pub fn verify_collection(program_id: &Address, accounts: &mut [AccountView], args: &[u8]) -> ProgramResult { let [payer, mint_authority, metadata, collection_mint, collection_metadata, collection_master_edition, system_program, sysvar_instructions, token_metadata_program] = accounts else { @@ -44,8 +37,9 @@ pub fn verify_collection( // Confirm the supplied account is the canonical mint-authority PDA. let bump = read_bump(args)?; - let pda = derive_address(&[AUTHORITY_SEED], Some(bump), program_id.as_array()); - if mint_authority.address().as_array() != &pda { + // Derive the canonical PDA on-chain and reject a non-canonical bump. + let (pda, canonical_bump) = Address::find_program_address(&[AUTHORITY_SEED], program_id); + if mint_authority.address() != &pda || bump != canonical_bump { return Err(ProgramError::InvalidSeeds); } @@ -67,24 +61,21 @@ pub fn verify_collection( InstructionAccount::readonly(system_program.address()), InstructionAccount::readonly(sysvar_instructions.address()), ]; - let instruction = InstructionView { - program_id: &TOKEN_METADATA_PROGRAM_ID, - accounts: &verify_accounts, - data: &data, - }; + let instruction = + InstructionView { program_id: &TOKEN_METADATA_PROGRAM_ID, accounts: &verify_accounts, data: &data }; log!("Verifying collection"); invoke_signed( &instruction, &[ - mint_authority, - token_metadata_program, - metadata, - collection_mint, - collection_metadata, - collection_master_edition, - system_program, - sysvar_instructions, + *mint_authority, + *token_metadata_program, + *metadata, + *collection_mint, + *collection_metadata, + *collection_master_edition, + *system_program, + *sysvar_instructions, ], &signers, )?; diff --git a/tokens/nft-operations/pinocchio/program/src/processor.rs b/tokens/nft-operations/pinocchio/program/src/processor.rs index 633872962..81ab5e2f3 100644 --- a/tokens/nft-operations/pinocchio/program/src/processor.rs +++ b/tokens/nft-operations/pinocchio/program/src/processor.rs @@ -15,12 +15,10 @@ use crate::instructions::{create_collection, mint_nft, verify_collection}; /// derives this bump on-chain instead). pub fn process_instruction( program_id: &Address, - accounts: &[AccountView], + accounts: &mut [AccountView], instruction_data: &[u8], ) -> ProgramResult { - let (discriminator, args) = instruction_data - .split_first() - .ok_or(ProgramError::InvalidInstructionData)?; + let (discriminator, args) = instruction_data.split_first().ok_or(ProgramError::InvalidInstructionData)?; match *discriminator { 0 => { From dab46a1807649764ae073f7e2d0e4bef63d14c6f Mon Sep 17 00:00:00 2001 From: MarkFeder Date: Wed, 5 Aug 2026 10:32:37 +0200 Subject: [PATCH 6/8] nft-operations pinocchio: prettier formatting for test.ts and tsconfig.json --- tokens/nft-operations/pinocchio/tests/test.ts | 370 +++++++++--------- tokens/nft-operations/pinocchio/tsconfig.json | 18 +- 2 files changed, 196 insertions(+), 192 deletions(-) diff --git a/tokens/nft-operations/pinocchio/tests/test.ts b/tokens/nft-operations/pinocchio/tests/test.ts index 0cc78be7a..08d9922c5 100644 --- a/tokens/nft-operations/pinocchio/tests/test.ts +++ b/tokens/nft-operations/pinocchio/tests/test.ts @@ -1,23 +1,23 @@ -import { Buffer } from "node:buffer"; -import * as path from "node:path"; +import { Buffer } from 'node:buffer'; +import * as path from 'node:path'; import { - AccountRole, - address, - appendTransactionMessageInstruction, - createTransactionMessage, - generateKeyPairSigner, - getAddressEncoder, - getProgramDerivedAddress, - lamports, - pipe, - setTransactionMessageFeePayerSigner, - signTransactionMessageWithSigners, -} from "@solana/kit"; -import { SYSVAR_INSTRUCTIONS_ADDRESS } from "@solana/sysvars"; -import { SYSTEM_PROGRAM_ADDRESS } from "@solana-program/system"; -import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS, getTokenDecoder, TOKEN_PROGRAM_ADDRESS } from "@solana-program/token"; -import { assert } from "chai"; -import { FailedTransactionMetadata, LiteSVM } from "litesvm"; + AccountRole, + address, + appendTransactionMessageInstruction, + createTransactionMessage, + generateKeyPairSigner, + getAddressEncoder, + getProgramDerivedAddress, + lamports, + pipe, + setTransactionMessageFeePayerSigner, + signTransactionMessageWithSigners, +} from '@solana/kit'; +import { SYSVAR_INSTRUCTIONS_ADDRESS } from '@solana/sysvars'; +import { SYSTEM_PROGRAM_ADDRESS } from '@solana-program/system'; +import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS, getTokenDecoder, TOKEN_PROGRAM_ADDRESS } from '@solana-program/token'; +import { assert } from 'chai'; +import { FailedTransactionMetadata, LiteSVM } from 'litesvm'; // The legacy SPL Token and Associated Token Account programs are bundled with // LiteSVM's standard runtime, and their ids (and the instructions sysvar) come @@ -25,7 +25,7 @@ import { FailedTransactionMetadata, LiteSVM } from "litesvm"; // Metaplex Token Metadata program is not bundled and has no official // @solana-program client, so its id stays hand-rolled and it is dumped from // mainnet into tests/fixtures by prepare.mjs. -const TOKEN_METADATA_PROGRAM_ID = address("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); +const TOKEN_METADATA_PROGRAM_ID = address('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s'); // Instruction discriminators (the Borsh enum variant index). const CREATE_COLLECTION = 0; @@ -35,186 +35,190 @@ const VERIFY_COLLECTION = 2; // The compiled program artifacts live in ./fixtures: the pinocchio program is // built there by `build-and-test`, and token_metadata.so is dumped from mainnet // by prepare.mjs. The npm scripts always run from the package root. -const FIXTURES = path.join(process.cwd(), "tests", "fixtures"); -const PROGRAM_SO = path.join(FIXTURES, "nft_operations_pinocchio_program.so"); -const TOKEN_METADATA_SO = path.join(FIXTURES, "token_metadata.so"); +const FIXTURES = path.join(process.cwd(), 'tests', 'fixtures'); +const PROGRAM_SO = path.join(FIXTURES, 'nft_operations_pinocchio_program.so'); +const TOKEN_METADATA_SO = path.join(FIXTURES, 'token_metadata.so'); const addressEncoder = getAddressEncoder(); async function getMetadataAddress(mint: ReturnType) { - const [metadata] = await getProgramDerivedAddress({ - programAddress: TOKEN_METADATA_PROGRAM_ID, - seeds: ["metadata", addressEncoder.encode(TOKEN_METADATA_PROGRAM_ID), addressEncoder.encode(mint)], - }); - return metadata; + const [metadata] = await getProgramDerivedAddress({ + programAddress: TOKEN_METADATA_PROGRAM_ID, + seeds: ['metadata', addressEncoder.encode(TOKEN_METADATA_PROGRAM_ID), addressEncoder.encode(mint)], + }); + return metadata; } async function getMasterEditionAddress(mint: ReturnType) { - const [edition] = await getProgramDerivedAddress({ - programAddress: TOKEN_METADATA_PROGRAM_ID, - seeds: ["metadata", addressEncoder.encode(TOKEN_METADATA_PROGRAM_ID), addressEncoder.encode(mint), "edition"], - }); - return edition; + const [edition] = await getProgramDerivedAddress({ + programAddress: TOKEN_METADATA_PROGRAM_ID, + seeds: ['metadata', addressEncoder.encode(TOKEN_METADATA_PROGRAM_ID), addressEncoder.encode(mint), 'edition'], + }); + return edition; } async function getAssociatedTokenAddress(mint: ReturnType, owner: ReturnType) { - const [ata] = await getProgramDerivedAddress({ - programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, - seeds: [addressEncoder.encode(owner), addressEncoder.encode(TOKEN_PROGRAM_ADDRESS), addressEncoder.encode(mint)], - }); - return ata; + const [ata] = await getProgramDerivedAddress({ + programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, + seeds: [ + addressEncoder.encode(owner), + addressEncoder.encode(TOKEN_PROGRAM_ADDRESS), + addressEncoder.encode(mint), + ], + }); + return ata; } -describe("NFT Operations (Pinocchio)", () => { - let svm: LiteSVM; - let programId: ReturnType; - let payer: Awaited>; - let collectionMint: Awaited>; - let nftMint: Awaited>; - let mintAuthorityPda: ReturnType; - let mintAuthorityBump: number; - - before(async () => { - svm = new LiteSVM(); - // The program never asserts its own id, so any address works; a generated - // one keeps the test self-contained. - programId = (await generateKeyPairSigner()).address; - svm.addProgramFromFile(programId, PROGRAM_SO); - svm.addProgramFromFile(TOKEN_METADATA_PROGRAM_ID, TOKEN_METADATA_SO); - - payer = await generateKeyPairSigner(); - svm.airdrop(payer.address, lamports(10_000_000_000n)); - // The collection and NFT mints are created across the suite's tests, so they - // are generated once here. - collectionMint = await generateKeyPairSigner(); - nftMint = await generateKeyPairSigner(); - - // The update/mint authority is a PDA of the program; its canonical bump is - // passed into every instruction and used by the program to sign CPIs. - const [pda, bump] = await getProgramDerivedAddress({ - programAddress: programId, - seeds: ["authority"], +describe('NFT Operations (Pinocchio)', () => { + let svm: LiteSVM; + let programId: ReturnType; + let payer: Awaited>; + let collectionMint: Awaited>; + let nftMint: Awaited>; + let mintAuthorityPda: ReturnType; + let mintAuthorityBump: number; + + before(async () => { + svm = new LiteSVM(); + // The program never asserts its own id, so any address works; a generated + // one keeps the test self-contained. + programId = (await generateKeyPairSigner()).address; + svm.addProgramFromFile(programId, PROGRAM_SO); + svm.addProgramFromFile(TOKEN_METADATA_PROGRAM_ID, TOKEN_METADATA_SO); + + payer = await generateKeyPairSigner(); + svm.airdrop(payer.address, lamports(10_000_000_000n)); + // The collection and NFT mints are created across the suite's tests, so they + // are generated once here. + collectionMint = await generateKeyPairSigner(); + nftMint = await generateKeyPairSigner(); + + // The update/mint authority is a PDA of the program; its canonical bump is + // passed into every instruction and used by the program to sign CPIs. + const [pda, bump] = await getProgramDerivedAddress({ + programAddress: programId, + seeds: ['authority'], + }); + mintAuthorityPda = pda; + mintAuthorityBump = bump; }); - mintAuthorityPda = pda; - mintAuthorityBump = bump; - }); - - async function send[0]>( - ix: TInstruction, - ) { - const transactionMessage = pipe( - createTransactionMessage({ version: 0 }), - (m) => setTransactionMessageFeePayerSigner(payer, m), - (m) => svm.setTransactionMessageLifetimeUsingLatestBlockhash(m), - (m) => appendTransactionMessageInstruction(ix, m), - ); - const signedTx = await signTransactionMessageWithSigners(transactionMessage); - const result = svm.sendTransaction(signedTx); - if (result instanceof FailedTransactionMetadata) { - throw new Error(`Transaction failed: ${result.err()}`); + + async function send[0]>( + ix: TInstruction, + ) { + const transactionMessage = pipe( + createTransactionMessage({ version: 0 }), + m => setTransactionMessageFeePayerSigner(payer, m), + m => svm.setTransactionMessageLifetimeUsingLatestBlockhash(m), + m => appendTransactionMessageInstruction(ix, m), + ); + const signedTx = await signTransactionMessageWithSigners(transactionMessage); + const result = svm.sendTransaction(signedTx); + if (result instanceof FailedTransactionMetadata) { + throw new Error(`Transaction failed: ${result.err()}`); + } } - } - - it("Creates a collection NFT", async () => { - const metadata = await getMetadataAddress(collectionMint.address); - const masterEdition = await getMasterEditionAddress(collectionMint.address); - const destination = await getAssociatedTokenAddress(collectionMint.address, payer.address); - - await send({ - programAddress: programId, - accounts: [ - { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // user - { address: collectionMint.address, role: AccountRole.WRITABLE_SIGNER, signer: collectionMint }, // mint - { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA - { address: metadata, role: AccountRole.WRITABLE }, // metadata - { address: masterEdition, role: AccountRole.WRITABLE }, // master edition - { address: destination, role: AccountRole.WRITABLE }, // destination ATA - { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program - { address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // token program - { address: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // associated token program - { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program - ], - data: new Uint8Array([CREATE_COLLECTION, mintAuthorityBump]), - }); - const mintAccount = svm.getAccount(collectionMint.address); - if (!mintAccount?.exists) throw new Error("Collection mint not found"); - assert.equal(mintAccount.programAddress, TOKEN_PROGRAM_ADDRESS); - - const destinationAccount = svm.getAccount(destination); - if (!destinationAccount?.exists) throw new Error("Collection token account not found"); - assert.equal(getTokenDecoder().decode(destinationAccount.data).amount, 1n); - - const metadataAccount = svm.getAccount(metadata); - if (!metadataAccount?.exists) throw new Error("Collection metadata not found"); - assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); - assert.isTrue(Buffer.from(metadataAccount.data).toString("utf-8").includes("DummyCollection")); - }); - - it("Mints an NFT into the collection", async () => { - const metadata = await getMetadataAddress(nftMint.address); - const masterEdition = await getMasterEditionAddress(nftMint.address); - const destination = await getAssociatedTokenAddress(nftMint.address, payer.address); - - await send({ - programAddress: programId, - accounts: [ - { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // owner - { address: nftMint.address, role: AccountRole.WRITABLE_SIGNER, signer: nftMint }, // mint - { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA - { address: metadata, role: AccountRole.WRITABLE }, // metadata - { address: masterEdition, role: AccountRole.WRITABLE }, // master edition - { address: destination, role: AccountRole.WRITABLE }, // destination ATA - { address: collectionMint.address, role: AccountRole.READONLY }, // collection mint - { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program - { address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // token program - { address: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // associated token program - { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program - ], - data: new Uint8Array([MINT_NFT, mintAuthorityBump]), + it('Creates a collection NFT', async () => { + const metadata = await getMetadataAddress(collectionMint.address); + const masterEdition = await getMasterEditionAddress(collectionMint.address); + const destination = await getAssociatedTokenAddress(collectionMint.address, payer.address); + + await send({ + programAddress: programId, + accounts: [ + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // user + { address: collectionMint.address, role: AccountRole.WRITABLE_SIGNER, signer: collectionMint }, // mint + { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA + { address: metadata, role: AccountRole.WRITABLE }, // metadata + { address: masterEdition, role: AccountRole.WRITABLE }, // master edition + { address: destination, role: AccountRole.WRITABLE }, // destination ATA + { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program + { address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // token program + { address: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // associated token program + { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program + ], + data: new Uint8Array([CREATE_COLLECTION, mintAuthorityBump]), + }); + + const mintAccount = svm.getAccount(collectionMint.address); + if (!mintAccount?.exists) throw new Error('Collection mint not found'); + assert.equal(mintAccount.programAddress, TOKEN_PROGRAM_ADDRESS); + + const destinationAccount = svm.getAccount(destination); + if (!destinationAccount?.exists) throw new Error('Collection token account not found'); + assert.equal(getTokenDecoder().decode(destinationAccount.data).amount, 1n); + + const metadataAccount = svm.getAccount(metadata); + if (!metadataAccount?.exists) throw new Error('Collection metadata not found'); + assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); + assert.isTrue(Buffer.from(metadataAccount.data).toString('utf-8').includes('DummyCollection')); }); - const destinationAccount = svm.getAccount(destination); - if (!destinationAccount?.exists) throw new Error("NFT token account not found"); - assert.equal(getTokenDecoder().decode(destinationAccount.data).amount, 1n); - - const metadataAccount = svm.getAccount(metadata); - if (!metadataAccount?.exists) throw new Error("NFT metadata not found"); - assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); - assert.isTrue(Buffer.from(metadataAccount.data).toString("utf-8").includes("Mint Test")); - - const editionAccount = svm.getAccount(masterEdition); - if (!editionAccount?.exists) throw new Error("NFT master edition not found"); - assert.equal(editionAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); - }); - - it("Verifies the NFT as part of the collection", async () => { - const metadata = await getMetadataAddress(nftMint.address); - const collectionMetadata = await getMetadataAddress(collectionMint.address); - const collectionMasterEdition = await getMasterEditionAddress(collectionMint.address); - - // Metaplex `Verify` performs strict checks: the signer must be the - // collection's update authority (our PDA), the collection metadata and - // master edition must be valid, and the NFT must reference the collection. - // A successful transaction therefore proves the whole flow is correct. - await send({ - programAddress: programId, - accounts: [ - { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer - { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA - { address: metadata, role: AccountRole.WRITABLE }, // NFT metadata - { address: collectionMint.address, role: AccountRole.READONLY }, // collection mint - { address: collectionMetadata, role: AccountRole.WRITABLE }, // collection metadata - { address: collectionMasterEdition, role: AccountRole.READONLY }, // collection master edition - { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program - { address: SYSVAR_INSTRUCTIONS_ADDRESS, role: AccountRole.READONLY }, // instructions sysvar - { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program - ], - data: new Uint8Array([VERIFY_COLLECTION, mintAuthorityBump]), + it('Mints an NFT into the collection', async () => { + const metadata = await getMetadataAddress(nftMint.address); + const masterEdition = await getMasterEditionAddress(nftMint.address); + const destination = await getAssociatedTokenAddress(nftMint.address, payer.address); + + await send({ + programAddress: programId, + accounts: [ + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // owner + { address: nftMint.address, role: AccountRole.WRITABLE_SIGNER, signer: nftMint }, // mint + { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA + { address: metadata, role: AccountRole.WRITABLE }, // metadata + { address: masterEdition, role: AccountRole.WRITABLE }, // master edition + { address: destination, role: AccountRole.WRITABLE }, // destination ATA + { address: collectionMint.address, role: AccountRole.READONLY }, // collection mint + { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program + { address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // token program + { address: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // associated token program + { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program + ], + data: new Uint8Array([MINT_NFT, mintAuthorityBump]), + }); + + const destinationAccount = svm.getAccount(destination); + if (!destinationAccount?.exists) throw new Error('NFT token account not found'); + assert.equal(getTokenDecoder().decode(destinationAccount.data).amount, 1n); + + const metadataAccount = svm.getAccount(metadata); + if (!metadataAccount?.exists) throw new Error('NFT metadata not found'); + assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); + assert.isTrue(Buffer.from(metadataAccount.data).toString('utf-8').includes('Mint Test')); + + const editionAccount = svm.getAccount(masterEdition); + if (!editionAccount?.exists) throw new Error('NFT master edition not found'); + assert.equal(editionAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); }); - const metadataAccount = svm.getAccount(metadata); - if (!metadataAccount?.exists) throw new Error("NFT metadata not found"); - assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); - }); + it('Verifies the NFT as part of the collection', async () => { + const metadata = await getMetadataAddress(nftMint.address); + const collectionMetadata = await getMetadataAddress(collectionMint.address); + const collectionMasterEdition = await getMasterEditionAddress(collectionMint.address); + + // Metaplex `Verify` performs strict checks: the signer must be the + // collection's update authority (our PDA), the collection metadata and + // master edition must be valid, and the NFT must reference the collection. + // A successful transaction therefore proves the whole flow is correct. + await send({ + programAddress: programId, + accounts: [ + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer + { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA + { address: metadata, role: AccountRole.WRITABLE }, // NFT metadata + { address: collectionMint.address, role: AccountRole.READONLY }, // collection mint + { address: collectionMetadata, role: AccountRole.WRITABLE }, // collection metadata + { address: collectionMasterEdition, role: AccountRole.READONLY }, // collection master edition + { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program + { address: SYSVAR_INSTRUCTIONS_ADDRESS, role: AccountRole.READONLY }, // instructions sysvar + { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program + ], + data: new Uint8Array([VERIFY_COLLECTION, mintAuthorityBump]), + }); + + const metadataAccount = svm.getAccount(metadata); + if (!metadataAccount?.exists) throw new Error('NFT metadata not found'); + assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); + }); }); diff --git a/tokens/nft-operations/pinocchio/tsconfig.json b/tokens/nft-operations/pinocchio/tsconfig.json index 237de9f97..35163d39d 100644 --- a/tokens/nft-operations/pinocchio/tsconfig.json +++ b/tokens/nft-operations/pinocchio/tsconfig.json @@ -1,11 +1,11 @@ { - "compilerOptions": { - "types": ["mocha", "chai", "node"], - "typeRoots": ["./node_modules/@types"], - "lib": ["es2022", "dom"], - "module": "preserve", - "moduleResolution": "bundler", - "target": "es2022", - "esModuleInterop": true - } + "compilerOptions": { + "types": ["mocha", "chai", "node"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2022", "dom"], + "module": "preserve", + "moduleResolution": "bundler", + "target": "es2022", + "esModuleInterop": true + } } From 48ea667d530b212f2c1f9f3e6f505f0689343101 Mon Sep 17 00:00:00 2001 From: MarkFeder Date: Wed, 5 Aug 2026 11:01:48 +0200 Subject: [PATCH 7/8] nft-operations pinocchio: prettier formatting (prepare.mjs, test.ts, tsconfig) with repo prettier 3.9.6 --- tokens/nft-operations/pinocchio/prepare.mjs | 36 ++++++++++----------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tokens/nft-operations/pinocchio/prepare.mjs b/tokens/nft-operations/pinocchio/prepare.mjs index 3ffe52750..4a4388dd2 100644 --- a/tokens/nft-operations/pinocchio/prepare.mjs +++ b/tokens/nft-operations/pinocchio/prepare.mjs @@ -6,30 +6,30 @@ // logged but not fatal — a missing fixture will surface as a clear test failure // when bankrun can't find `token_metadata.so`. -import { execSync } from "node:child_process"; -import { mkdirSync, rmSync } from "node:fs"; -import { join } from "node:path"; +import { execSync } from 'node:child_process'; +import { mkdirSync, rmSync } from 'node:fs'; +import { join } from 'node:path'; const programs = [ - { - id: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s", - name: "token_metadata.so", - }, + { + id: 'metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s', + name: 'token_metadata.so', + }, ]; -const outputDir = "tests/fixtures"; +const outputDir = 'tests/fixtures'; try { - mkdirSync(outputDir, { recursive: true }); - // Point the Solana CLI at mainnet, where the canonical program lives. - execSync("solana config set -um", { stdio: "inherit" }); + mkdirSync(outputDir, { recursive: true }); + // Point the Solana CLI at mainnet, where the canonical program lives. + execSync('solana config set -um', { stdio: 'inherit' }); - for (const { id, name } of programs) { - const outputFile = join(outputDir, name); - rmSync(outputFile, { force: true }); - execSync(`solana program dump ${id} ${outputFile}`, { stdio: "inherit" }); - console.log(`Dumped ${id} -> ${outputFile}`); - } + for (const { id, name } of programs) { + const outputFile = join(outputDir, name); + rmSync(outputFile, { force: true }); + execSync(`solana program dump ${id} ${outputFile}`, { stdio: 'inherit' }); + console.log(`Dumped ${id} -> ${outputFile}`); + } } catch (error) { - console.error(`Failed to prepare program fixtures: ${error.message}`); + console.error(`Failed to prepare program fixtures: ${error.message}`); } From 7464a47f3cd8b01e17d4c48a7b835ddf20d076a1 Mon Sep 17 00:00:00 2001 From: MarkFeder Date: Thu, 6 Aug 2026 20:14:09 +0200 Subject: [PATCH 8/8] tokens/nft-operations pinocchio: address review feedback - derive the mint-authority PDA bump on-chain in every instruction (as the Anchor example does) instead of accepting it from instruction data; this removes the client-supplied bump entirely, so a non-canonical bump can no longer be passed. Drops the now-unused read_bump helper and the bump byte from the instruction data. - test: derive the ATA with findAssociatedTokenPda instead of hand-rolling the seeds; stop sending the bump byte. - test stack: switch to mocha + tsx and @solana/kit ^7 per AGENTS.md / #656 --- tokens/nft-operations/pinocchio/package.json | 18 +- .../nft-operations/pinocchio/pnpm-lock.yaml | 1952 +++++++++++++---- .../src/instructions/create_collection.rs | 17 +- .../program/src/instructions/mint_nft.rs | 17 +- .../pinocchio/program/src/instructions/mod.rs | 6 - .../src/instructions/verify_collection.rs | 16 +- .../pinocchio/program/src/processor.rs | 17 +- tokens/nft-operations/pinocchio/tests/test.ts | 30 +- tokens/nft-operations/pinocchio/tsconfig.json | 12 +- 9 files changed, 1534 insertions(+), 551 deletions(-) diff --git a/tokens/nft-operations/pinocchio/package.json b/tokens/nft-operations/pinocchio/package.json index 1b7fff751..a47ee4066 100644 --- a/tokens/nft-operations/pinocchio/package.json +++ b/tokens/nft-operations/pinocchio/package.json @@ -2,7 +2,7 @@ "type": "module", "scripts": { "postinstall": "node prepare.mjs", - "test": "pnpm ts-mocha -p ./tsconfig.json -t 1000000 ./tests/test.ts", + "test": "mocha --import=tsx -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/program.so" @@ -10,17 +10,17 @@ "dependencies": { "@solana-program/system": "^0.12.2", "@solana-program/token": "^0.14.0", - "@solana/kit": "^6.10.0", + "@solana/kit": "^7.0.0", "@solana/sysvars": "^6.10.0", "litesvm": "^1.3.0" }, "devDependencies": { - "@types/chai": "^4.3.1", - "@types/mocha": "^9.1.1", - "@types/node": "^20.0.0", - "chai": "^4.3.4", - "mocha": "^9.0.3", - "ts-mocha": "^10.0.0", - "typescript": "^5.6.0" + "@types/chai": "^5.2.3", + "@types/mocha": "^10.0.10", + "@types/node": "^26.1.0", + "chai": "^6.2.2", + "mocha": "^11.7.5", + "typescript": "^5.9.3", + "tsx": "^4.19.2" } } diff --git a/tokens/nft-operations/pinocchio/pnpm-lock.yaml b/tokens/nft-operations/pinocchio/pnpm-lock.yaml index e04dc59d1..5803942ee 100644 --- a/tokens/nft-operations/pinocchio/pnpm-lock.yaml +++ b/tokens/nft-operations/pinocchio/pnpm-lock.yaml @@ -10,13 +10,13 @@ importers: dependencies: '@solana-program/system': specifier: ^0.12.2 - version: 0.12.2(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + version: 0.12.2(@solana/kit@7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) '@solana-program/token': specifier: ^0.14.0 - version: 0.14.0(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + version: 0.14.0(@solana/kit@7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) '@solana/kit': - specifier: ^6.10.0 - version: 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + specifier: ^7.0.0 + version: 7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) '@solana/sysvars': specifier: ^6.10.0 version: 6.10.0(typescript@5.9.3) @@ -25,29 +25,193 @@ importers: version: 1.3.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) devDependencies: '@types/chai': - specifier: ^4.3.1 - version: 4.3.20 + specifier: ^5.2.3 + version: 5.2.3 '@types/mocha': - specifier: ^9.1.1 - version: 9.1.1 + specifier: ^10.0.10 + version: 10.0.10 '@types/node': - specifier: ^20.0.0 - version: 20.19.43 + specifier: ^26.1.0 + version: 26.1.2 chai: - specifier: ^4.3.4 - version: 4.5.0 + specifier: ^6.2.2 + version: 6.2.2 mocha: - specifier: ^9.0.3 - version: 9.2.2 - ts-mocha: - specifier: ^10.0.0 - version: 10.1.0(mocha@9.2.2) + specifier: ^11.7.5 + version: 11.8.0 + tsx: + specifier: ^4.19.2 + version: 4.23.9 typescript: - specifier: ^5.6.0 + specifier: ^5.9.3 version: 5.9.3 packages: + '@esbuild/aix-ppc64@0.28.1': + resolution: {integrity: sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.28.1': + resolution: {integrity: sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.28.1': + resolution: {integrity: sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.28.1': + resolution: {integrity: sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.28.1': + resolution: {integrity: sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.28.1': + resolution: {integrity: sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.28.1': + resolution: {integrity: sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.28.1': + resolution: {integrity: sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.28.1': + resolution: {integrity: sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.28.1': + resolution: {integrity: sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.28.1': + resolution: {integrity: sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.28.1': + resolution: {integrity: sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.28.1': + resolution: {integrity: sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.28.1': + resolution: {integrity: sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.28.1': + resolution: {integrity: sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.28.1': + resolution: {integrity: sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.28.1': + resolution: {integrity: sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.28.1': + resolution: {integrity: sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.28.1': + resolution: {integrity: sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.28.1': + resolution: {integrity: sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.28.1': + resolution: {integrity: sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.28.1': + resolution: {integrity: sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.28.1': + resolution: {integrity: sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.28.1': + resolution: {integrity: sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.28.1': + resolution: {integrity: sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.28.1': + resolution: {integrity: sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@solana-program/system@0.12.2': resolution: {integrity: sha512-MaBeOxlvTruQhA7UYkOb3hVTEHPPagOtd+PvTm6a8rGgvEAP0kD4BbC37NceOaR4ABNqdaCmD5OMVRKgrE6KAg==} peerDependencies: @@ -68,6 +232,15 @@ packages: typescript: optional: true + '@solana/accounts@7.0.0': + resolution: {integrity: sha512-RfbinkhuWxcObxZIdjeWEn/mzLqRp/h2hAk/ZQCUxPdDBW8h4XxEybK9GBItGOAcrUz5HuusXTD+cXXnlIxWcg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/addresses@6.10.0': resolution: {integrity: sha512-vEoCGBTxG0HCERAn84KXkrJjl+pDaNzOpZ0qbgcPS98fYxP5yzbKB8SNOY2bzrbkRUmmw5Q3hqTRERemUN2Gcw==} engines: {node: '>=20.18.0'} @@ -77,6 +250,15 @@ packages: typescript: optional: true + '@solana/addresses@7.0.0': + resolution: {integrity: sha512-E7sJtV5d3bXrmw3I30rcKY+xoqM++6KIVJCi+q8ZaSMyP04UMfEENPHIJ+TkyS1RUgjzPT91ka/oWrtTh6EfkQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/assertions@6.10.0': resolution: {integrity: sha512-lKSAdVo+P/6Lp4vs6shstXmFOpvxrABwn4o1462tb7sKkNapk6o9pPFVPGw4DUgPS3WqWRs1j2tmpuVjhQRntg==} engines: {node: '>=20.18.0'} @@ -86,6 +268,15 @@ packages: typescript: optional: true + '@solana/assertions@7.0.0': + resolution: {integrity: sha512-CShOQLPezI0tbrih+L88fzt8FMHDyJoWkmulk4wfRp3HhpQL2yNlH/SWLH033qysnvkmE7TxBFUtcnbnf7jz1g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/codecs-core@6.10.0': resolution: {integrity: sha512-nfAl9OMGo4HanIMxGsQoVB7BxMoqBCYEUxl8oEAZZ09pDxnaXQZkTRXEwPPccag37XfW1ciPd1vWPKwB2b0HHQ==} engines: {node: '>=20.18.0'} @@ -95,6 +286,15 @@ packages: typescript: optional: true + '@solana/codecs-core@7.0.0': + resolution: {integrity: sha512-6HtEisZEtFb6okARUgYqmKdDbn2aHRrSCDgB1/GEwr0s6fK5XNYpafaSjorbs2MEyZV3tCUFTj2j6fk/4nNcLg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/codecs-data-structures@6.10.0': resolution: {integrity: sha512-CNasJW3bq5u+632Zt5aJ8rOjAjv2HyenpV8o9kAIqdmV4CBpjCCoBnKn8LkuR/sbeREZxJYfhKTXO/9ruAkw7A==} engines: {node: '>=20.18.0'} @@ -104,6 +304,15 @@ packages: typescript: optional: true + '@solana/codecs-data-structures@7.0.0': + resolution: {integrity: sha512-P0Ys1mB4lYlz3MMTCaJSysE3OYrq8WvsveU1ta8U/yG1qChXFGCOxPVh06swjaRxwPrEakb9VUESS5vNtp1rRA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/codecs-numbers@6.10.0': resolution: {integrity: sha512-CcM+wX4zOiA9zkh8A7t1787A0Ehgmu5+6Z2tKoHew6cNw/dkaUTPa8JnNHbvfsLC8dfHC1BhAEJl86sKmRsfkQ==} engines: {node: '>=20.18.0'} @@ -113,6 +322,15 @@ packages: typescript: optional: true + '@solana/codecs-numbers@7.0.0': + resolution: {integrity: sha512-XL0jnmnXr3ceoX4tusT+XkBVR2iGKEJecTIXbIV7ILi9xObg3fNXafNbTmbIOvKc0ByTyjo8EWZ9jQKSRWgsgA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/codecs-strings@6.10.0': resolution: {integrity: sha512-zlaqkg7K6F6IN4V/Ec8TWkTn054gxv7ZLagvGkuEyAdPQ6BzzsehOm2TqCuyXgJJTCGPLY1bEk6yH9NxANe0kA==} engines: {node: '>=20.18.0'} @@ -125,6 +343,18 @@ packages: typescript: optional: true + '@solana/codecs-strings@7.0.0': + resolution: {integrity: sha512-zXE1PE9HkVk6phZ6aqHTXvLZ0qIl5bJNIvG9eMB7LuFO1XBVQywJUtjKS8fE3/xmRCWSMilFSrEXGA+SpOyLrQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.4.0' + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true + '@solana/codecs@6.10.0': resolution: {integrity: sha512-lLVuxod4ChWp9i7OvpgIykYG8Q9OGPVXKnHM9VlzDDLylsx7Y1FoQL00sHa7PqFkJVmkBufaA6dcGbQ7FU+lAQ==} engines: {node: '>=20.18.0'} @@ -134,6 +364,15 @@ packages: typescript: optional: true + '@solana/codecs@7.0.0': + resolution: {integrity: sha512-xT1IbwKkPZ544u/eqhb9SZ0fNYJidWgIUzKNQMbvLCwduayAkQp+czlGdvLQ6CVlqtCewtH3gW8biGU7YuBdEw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/errors@6.10.0': resolution: {integrity: sha512-KBLAxCtAXr357JNhCyIDQXWbuSj5vN6w+28FSfcYY6OOSiphmXLAV3V58jgV0C6iNbIzFJFi6yatFyDTdeJsNg==} engines: {node: '>=20.18.0'} @@ -144,6 +383,16 @@ packages: typescript: optional: true + '@solana/errors@7.0.0': + resolution: {integrity: sha512-94r+LLSzZ0XVp+LOogwxWGXeo138uvwqtqRW9Tjl1DIXrFgh8euXnJSXZyydu1UXJs7ItOSm0QreJviSGw3TGQ==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + '@solana/fast-stable-stringify@6.10.0': resolution: {integrity: sha512-iCNed27wk6PKSS3QUtHovRfMWF/jbVWogs2vB4tukKUCsqG4rDfDInIwZ6ur/nY6XTrgi2gMMdZq9GAUlWsbfw==} engines: {node: '>=20.18.0'} @@ -153,8 +402,314 @@ packages: typescript: optional: true - '@solana/fixed-points@6.10.0': - resolution: {integrity: sha512-ZkKL0alXH3L7/wMiVG8YUuG8qBKunlM810+YBD7nUPRhifiGsX1zwADViHLYNqLr/jUk0mTYFUcKznTpB/K+Gg==} + '@solana/fast-stable-stringify@7.0.0': + resolution: {integrity: sha512-i/b5ZJMqMJXa6etjypANa2/ErPZfNG9/EVIYl7HpWooyCRgZ8hZJmJ2Cgrp0r4EMXCLeWn4aEG2HOBTzOJ4F7Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fixed-points@6.10.0': + resolution: {integrity: sha512-ZkKL0alXH3L7/wMiVG8YUuG8qBKunlM810+YBD7nUPRhifiGsX1zwADViHLYNqLr/jUk0mTYFUcKznTpB/K+Gg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/fixed-points@7.0.0': + resolution: {integrity: sha512-Y3gcyHTponi5kXpWVEJIhuZ7yT84N+8He4dbjXWqwMBJnzKM+4tqFCbzy6y+6+Jxt44RT1lDmbpxmZopFRXU8Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/functional@6.10.0': + resolution: {integrity: sha512-P8cevu4mAqHTXC37h1TVoOh8zhWB2tlOI/R9vWjYPpcLwcyWf8p2qq4LEGHl5kY+1C+4PNX39HsmCocXOPCDkQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/functional@7.0.0': + resolution: {integrity: sha512-ix9fzYhc2hCLiYf+hGI00mzzayANKDExEBxbwrtMj/BdQkwgUIvIlOssqHeSqDChL3UZhq9lR24Nz4JwYX8Jbw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instruction-plans@6.10.0': + resolution: {integrity: sha512-YG7mo4zykzdc6ZTV0BuN6pveK9qeBySzlYYerq578A4eQu3xcypMAYRGAvhMZtWTanjjmD6CKtM0M7kVp0TNxg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instruction-plans@7.0.0': + resolution: {integrity: sha512-uzXHztc8hLoT5TNWFsBX2DIETyp/Lr2l36O330s3YCgpRmfI4IRbBrjjq7TxDYFm/QY8+DD4CRG8p7wZSqG8dQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instructions@6.10.0': + resolution: {integrity: sha512-0TToYF+8LXQ3ofPMx+yF6yaM9l4YJvcAPMy0qV5JsrBUFlWXBSANRuudKBQLHMvb+a3OiUTq5X7omuorKMBB3A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/instructions@7.0.0': + resolution: {integrity: sha512-ZN0gKAtCOKDuIaStcvLZDf5H20fkk7jr4dZE0Rk7z0kslf6mrRam9Y23N6AzeHp/b5ZeVKyfaTf4M35mOktLNg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/keys@6.10.0': + resolution: {integrity: sha512-26IRfdm/hTUCmM7MeEeX0ULSbCM6OzkZTkfkrPircqmRM7xyNqP4hq7u0P7wjb9dl7NfgyG6K7cdvUxrj2e3mA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/keys@7.0.0': + resolution: {integrity: sha512-JsdYR/YN3AGHZN2aZoeE5cymHYkNoBLnqgXoRncW/VyD7fMcR350aHU1hCMYd0b5BtITLsGmvvtvrgVkzK83Eg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/kit@6.10.0': + resolution: {integrity: sha512-/WnnQp3uARh2JCFSfAakejTAqwmXVuMVTcRn5r2yDwY2yzZ4R6mt/Cl59VPimVLNSoTyN/KsEwhv9omr3ERazQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/kit@7.0.0': + resolution: {integrity: sha512-ZCeai4LRJQooUmJXvpgMEGFTrCdJnV1ODbDJ8oqFZ+Y4t/9x1baQsFFpruqsdRyeGv2Rr+X6jV7cldVD+hyzRA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/nominal-types@6.10.0': + resolution: {integrity: sha512-9ykyBBvnkInH7fCacjJi7zu2PJyd+OCt+VTjIISv070fHzKIMFqZqJJ/dJ0SRH2aHwfB3n86iVsmtBtuxi4KKA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/nominal-types@7.0.0': + resolution: {integrity: sha512-ff21hmKKMckDkGWah9tRXsEyFCtSnkugH+EMLGJOn7tiXdtFljOXW5Q12IXyeil87EE8aWb1MS6p8v5+hi71Vg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/offchain-messages@6.10.0': + resolution: {integrity: sha512-RiEgAueeMkFMC1suOXBIcmCZgtXRxy24yk0DldPB37bB4zwOF1SAaRjNRPjIkGK8RhCYrEpPosnzLyavw9ueRg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/offchain-messages@7.0.0': + resolution: {integrity: sha512-fGrzxmqVStweGHRlXVAPKACdDboFCwXq5m8C+aD9Nupax6Q9rnvjICzYRLypwqB9X90XIZazh0ys+0KGLMpIJQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/options@6.10.0': + resolution: {integrity: sha512-RO9UT3UYD8/Cu2uM6ZXbKvLeMnVD42+g9JRds7Pfs4AhiOyg4R4TJrQUAppTgavPTO3PBRlWtWOC05ZH/yAIbg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/options@7.0.0': + resolution: {integrity: sha512-6DhvMqRcL3mG0R5JejYIW5PDTDr7HcLX2R9iCs6OPN1HdsyXmE2rX2EldnuA0rYz1buOodeWYsu4N1lpDcEpaQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-core@6.10.0': + resolution: {integrity: sha512-JE70YTQOfFACVFGvoJon4Scc/eHUWjMu8Ovo35CcV2kHTAHYMCd4UkBd2gmlhK0vRMMomsQi1ZLPlAlTq0OoUQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-core@7.0.0': + resolution: {integrity: sha512-EwTUfOGoQQ3aXooRlQFVbk+sJW7NqJl1K+bmSLiJUjaBTSqtbr3GtMu7aoybJqzZQKjOGSG4Hn0BzK24SvWy3A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-interfaces@6.10.0': + resolution: {integrity: sha512-vr0/l9wcM4orwGr8cjkFWaJ9A4HvzuAv00jMFNMg0Spd0GZqnwnpW+D/fXa1lIJnTRaF3EeEjLh4VjKU037T0Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/plugin-interfaces@7.0.0': + resolution: {integrity: sha512-fz/HknZLGnVIjhjXrMzW3Qm1x80oeEMSOk4RzMwjcyAEyfzhHtGNW74NsU5W+uFpYz6UBbV5mB1jpuAdJdnj9A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/program-client-core@6.10.0': + resolution: {integrity: sha512-4PPbTLdC1ylHIuvhOFDP8RnSkXPCFjNFWGslzc+UFKnoR4ajzBcByX94jmaruDMk5ncxgj7tr9pzJTvfGHIaMA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/program-client-core@7.0.0': + resolution: {integrity: sha512-+N8HImlR3MTbbvhOShsLelQXGZKbi6KhPhyy+4ZkDLbnRs4QikTamIChXZmoCyxB51S8/9cNRAKyQhbeF5Y8Qg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/programs@6.10.0': + resolution: {integrity: sha512-qn/HeLP5KGUJXVub3fyGe69/rWaLX4jzwm6V/1pNxJDbdF+MBdgn18hP6F+VmhfdNmwK0lue3J/1HQ1UTMuQeQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/programs@7.0.0': + resolution: {integrity: sha512-a1HNgzr9YiiZ8vK4VaKHEXjnZmKX7W5ab2ghuseIalEw/+PJLFcTRTOw8n3efRu677b/bG2Icmb3MBBEXmvbPg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/promises@6.10.0': + resolution: {integrity: sha512-oJSIn+VBBMWDo8oqw7RV3tI6Jih+Ieup6FcQLYLDUriaeo7+8l1Zdezl8zh7SIfeU4lOfAbRg6mR0huaS/Lltg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/promises@7.0.0': + resolution: {integrity: sha512-rjoHnaR4zeEIHqIzfgotxRrLKqY4Goj0G5duZOnjHm8ZC+7eDkH5/mXj1bDJ4ROM70dVM+y1Xkrjg7IL6k6StA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-api@6.10.0': + resolution: {integrity: sha512-RjPIVsAb/85P1ptoO3WpC0x7QG6gG/e4q/3lo6gbSznUZOcoM+8sSBnCX7BwP1ZkCDS6NK/ClXLnhhhYZx+OGg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-api@7.0.0': + resolution: {integrity: sha512-MTtBO883st83CjWpo8B4g8EKzXaeoBX5N7+sv4vcvsn2q1NpY4SG3XejdX1FrKeTe9Xjbv0/FzFtykstbKe1UA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-parsed-types@6.10.0': + resolution: {integrity: sha512-5275mvSV1mxhwvrMVa+K7BU/nAetpHfcb+8Ql9rtA8RRf6DyiimFQFZUukE4Ez6XJihEpCHNy98yhkgai9wytQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-parsed-types@7.0.0': + resolution: {integrity: sha512-80VjPbB/TZ/Hy5qdRF7onPfMPHk5cwBVbtNUGbilrmFuqRzSvzSOY1ynNXXODPZBytNmPq7u7oJfSCsQ5MA9Ig==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec-types@6.10.0': + resolution: {integrity: sha512-NDZrKyZrJk4HaMFhTE/lAiMB824cWAodKqDHyKi0UteHU9pyRmil3BN1jt7e+j08mwMWwfklSgyrTaq52g6DIQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@solana/rpc-spec-types@7.0.0': + resolution: {integrity: sha512-V4Hp2//fW8eYq1zcGgHPu7FXKHyIWERBQd4+NRaKn2m8rPiVAm3pVRwPzSvVE0+8Nyf5qzdcfcMf7NQdhl6j7Q==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -162,8 +717,8 @@ packages: typescript: optional: true - '@solana/functional@6.10.0': - resolution: {integrity: sha512-P8cevu4mAqHTXC37h1TVoOh8zhWB2tlOI/R9vWjYPpcLwcyWf8p2qq4LEGHl5kY+1C+4PNX39HsmCocXOPCDkQ==} + '@solana/rpc-spec@6.10.0': + resolution: {integrity: sha512-yQdbWw5mZEWrwsunHR9NHkuhMXIB9sPOObwm18D53v5tAJnxTB0IcHvO647XqFDLTK/yQ4AdDtlYD1vsY07AMQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -171,8 +726,8 @@ packages: typescript: optional: true - '@solana/instruction-plans@6.10.0': - resolution: {integrity: sha512-YG7mo4zykzdc6ZTV0BuN6pveK9qeBySzlYYerq578A4eQu3xcypMAYRGAvhMZtWTanjjmD6CKtM0M7kVp0TNxg==} + '@solana/rpc-spec@7.0.0': + resolution: {integrity: sha512-GRGlXpLgap9yVh3qmCl4huuKAoLMp/p82/9Q9ONj6lmFH+RqJE4Q+16V+HxHI5ZakmwZYoVZU4GEKjumse9SCg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -180,8 +735,8 @@ packages: typescript: optional: true - '@solana/instructions@6.10.0': - resolution: {integrity: sha512-0TToYF+8LXQ3ofPMx+yF6yaM9l4YJvcAPMy0qV5JsrBUFlWXBSANRuudKBQLHMvb+a3OiUTq5X7omuorKMBB3A==} + '@solana/rpc-subscriptions-api@6.10.0': + resolution: {integrity: sha512-CRPQoTtT1cOwOQUsqS7jgo7wYdAj7jB5ab/UmMPWVpecf2FNMhWhgvxP2s82M7VkDGTGl13qaQ0WySmi7Egrlg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -189,8 +744,8 @@ packages: typescript: optional: true - '@solana/keys@6.10.0': - resolution: {integrity: sha512-26IRfdm/hTUCmM7MeEeX0ULSbCM6OzkZTkfkrPircqmRM7xyNqP4hq7u0P7wjb9dl7NfgyG6K7cdvUxrj2e3mA==} + '@solana/rpc-subscriptions-api@7.0.0': + resolution: {integrity: sha512-o2PZDeNC/kg3VO3ry4R0JySJ1xMHLchZwmzVwamxGidlLe9uvzm6CHlCqv/JCq4/zHLo7qbLqnmOckZ6vlDqaw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -198,8 +753,8 @@ packages: typescript: optional: true - '@solana/kit@6.10.0': - resolution: {integrity: sha512-/WnnQp3uARh2JCFSfAakejTAqwmXVuMVTcRn5r2yDwY2yzZ4R6mt/Cl59VPimVLNSoTyN/KsEwhv9omr3ERazQ==} + '@solana/rpc-subscriptions-channel-websocket@6.10.0': + resolution: {integrity: sha512-KkqP1186HELPlJftA88SNAT2znR8knCVzsUipXVzY4zfW8sN3LOa0ePMzh9VZ/V+J+raTt55laR87ovAO0n+zw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -207,8 +762,8 @@ packages: typescript: optional: true - '@solana/nominal-types@6.10.0': - resolution: {integrity: sha512-9ykyBBvnkInH7fCacjJi7zu2PJyd+OCt+VTjIISv070fHzKIMFqZqJJ/dJ0SRH2aHwfB3n86iVsmtBtuxi4KKA==} + '@solana/rpc-subscriptions-channel-websocket@7.0.0': + resolution: {integrity: sha512-79ecXBCT2pG+vXNBZim80vUz+B04L1mEduXobBIXM55VvxsHYT+4H4V+/ZHoFJUK6Lhbt+6zhpconx8Wa3H+JA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -216,8 +771,8 @@ packages: typescript: optional: true - '@solana/offchain-messages@6.10.0': - resolution: {integrity: sha512-RiEgAueeMkFMC1suOXBIcmCZgtXRxy24yk0DldPB37bB4zwOF1SAaRjNRPjIkGK8RhCYrEpPosnzLyavw9ueRg==} + '@solana/rpc-subscriptions-spec@6.10.0': + resolution: {integrity: sha512-nWMwGaG4ulzeX2sskY5TywXF3cwEd8FDmUpLe2JBWxE8XDAOGOKcsYPYFcBgb8ee9KqfPT2PTNdcz9jOhJf34w==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -225,8 +780,8 @@ packages: typescript: optional: true - '@solana/options@6.10.0': - resolution: {integrity: sha512-RO9UT3UYD8/Cu2uM6ZXbKvLeMnVD42+g9JRds7Pfs4AhiOyg4R4TJrQUAppTgavPTO3PBRlWtWOC05ZH/yAIbg==} + '@solana/rpc-subscriptions-spec@7.0.0': + resolution: {integrity: sha512-Oips5ciWqPGO5Cx7hcEQ/czbcrUjPf+4cTam0UMrK3BnvHPcEAWkPYlIgabQiqa60/pjOOz7B936oMXA5XwL+g==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -234,8 +789,8 @@ packages: typescript: optional: true - '@solana/plugin-core@6.10.0': - resolution: {integrity: sha512-JE70YTQOfFACVFGvoJon4Scc/eHUWjMu8Ovo35CcV2kHTAHYMCd4UkBd2gmlhK0vRMMomsQi1ZLPlAlTq0OoUQ==} + '@solana/rpc-subscriptions@6.10.0': + resolution: {integrity: sha512-6mfuHp/K7unFKCOTCCBC9ziEGnxe2tyJ74EbR51QUnBeCUdYD7Hhdpxic1WRSJ3UeNW/mG4OzFM6z8Wi64Eh9Q==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -243,8 +798,8 @@ packages: typescript: optional: true - '@solana/plugin-interfaces@6.10.0': - resolution: {integrity: sha512-vr0/l9wcM4orwGr8cjkFWaJ9A4HvzuAv00jMFNMg0Spd0GZqnwnpW+D/fXa1lIJnTRaF3EeEjLh4VjKU037T0Q==} + '@solana/rpc-subscriptions@7.0.0': + resolution: {integrity: sha512-jLNjUCGBbCIfABqqHopNJIeAkhd4GzhbodgCH4x2X+S0ycBaERX393+k+fG8JPJpGujkmeQFBCeIKO3lK+PoYg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -252,8 +807,8 @@ packages: typescript: optional: true - '@solana/program-client-core@6.10.0': - resolution: {integrity: sha512-4PPbTLdC1ylHIuvhOFDP8RnSkXPCFjNFWGslzc+UFKnoR4ajzBcByX94jmaruDMk5ncxgj7tr9pzJTvfGHIaMA==} + '@solana/rpc-transformers@6.10.0': + resolution: {integrity: sha512-2nFUrVTiE720pJOY4XKx3HuYmishw0of/4oScu76YGm6O8wsmvFvPNAkrEinmieWXQkfpBfRvLZmpl8PaAy+ug==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -261,8 +816,8 @@ packages: typescript: optional: true - '@solana/programs@6.10.0': - resolution: {integrity: sha512-qn/HeLP5KGUJXVub3fyGe69/rWaLX4jzwm6V/1pNxJDbdF+MBdgn18hP6F+VmhfdNmwK0lue3J/1HQ1UTMuQeQ==} + '@solana/rpc-transformers@7.0.0': + resolution: {integrity: sha512-NHkTKC2J4oaMMzyOtIEDOLCGtzg1Y8vlPoBmUeA82o+DNjBSiZLR2Ariy7n7chmwKchCZ8aGirBxjLCSRc6b/g==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -270,8 +825,8 @@ packages: typescript: optional: true - '@solana/promises@6.10.0': - resolution: {integrity: sha512-oJSIn+VBBMWDo8oqw7RV3tI6Jih+Ieup6FcQLYLDUriaeo7+8l1Zdezl8zh7SIfeU4lOfAbRg6mR0huaS/Lltg==} + '@solana/rpc-transport-http@6.10.0': + resolution: {integrity: sha512-JrdNuYi0nBbD3X8JUtgX1dQJwIwz/WJvmigDdELysXfGB2bTJpfjqGDLhCLOz2sRl66FASIEqgG/LVa2C9VXcA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -279,8 +834,8 @@ packages: typescript: optional: true - '@solana/rpc-api@6.10.0': - resolution: {integrity: sha512-RjPIVsAb/85P1ptoO3WpC0x7QG6gG/e4q/3lo6gbSznUZOcoM+8sSBnCX7BwP1ZkCDS6NK/ClXLnhhhYZx+OGg==} + '@solana/rpc-transport-http@7.0.0': + resolution: {integrity: sha512-W0G15BN0xljXzRRo/ZwepJNiOjKhRImF5SxhjZauh2yVBoUjfd6NSCmYcdWu0tj9lypKKrB1ReS4oPmb4yCHbA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -288,8 +843,8 @@ packages: typescript: optional: true - '@solana/rpc-parsed-types@6.10.0': - resolution: {integrity: sha512-5275mvSV1mxhwvrMVa+K7BU/nAetpHfcb+8Ql9rtA8RRf6DyiimFQFZUukE4Ez6XJihEpCHNy98yhkgai9wytQ==} + '@solana/rpc-types@6.10.0': + resolution: {integrity: sha512-zaSecTfCPvz/vcoAmKD6XoRstGHTr1EKJBD8T9UcpEFFB6CtF6DxerDB+wrzkamuT6msmnR2DWXMrYOGDAsgIg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -297,8 +852,8 @@ packages: typescript: optional: true - '@solana/rpc-spec-types@6.10.0': - resolution: {integrity: sha512-NDZrKyZrJk4HaMFhTE/lAiMB824cWAodKqDHyKi0UteHU9pyRmil3BN1jt7e+j08mwMWwfklSgyrTaq52g6DIQ==} + '@solana/rpc-types@7.0.0': + resolution: {integrity: sha512-Lf2csFSWHwN/8EL03uWfS7n1J19vWLK4DBGkQ5jebRhoJ3dD+xPcJtS+epI2281t5aghJvoV7D+RIM0NextZJg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -306,8 +861,8 @@ packages: typescript: optional: true - '@solana/rpc-spec@6.10.0': - resolution: {integrity: sha512-yQdbWw5mZEWrwsunHR9NHkuhMXIB9sPOObwm18D53v5tAJnxTB0IcHvO647XqFDLTK/yQ4AdDtlYD1vsY07AMQ==} + '@solana/rpc@6.10.0': + resolution: {integrity: sha512-EwxsqoD+NXV+m+iobnWNtATD93gTgaNsOiQOzYB1/2e+8S6fl6obdNPB55yfXgtl4jt6GV6/ae4xuPhLv76vvg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -315,8 +870,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-api@6.10.0': - resolution: {integrity: sha512-CRPQoTtT1cOwOQUsqS7jgo7wYdAj7jB5ab/UmMPWVpecf2FNMhWhgvxP2s82M7VkDGTGl13qaQ0WySmi7Egrlg==} + '@solana/rpc@7.0.0': + resolution: {integrity: sha512-hCf4XEhspsNb8TnQ+E961+rBuJcTyrmwNr4LDfVHEeO/VTqaN+yVwAI1wpxcnzwc+T4OoXcyujNiQWhVZPOhiA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -324,8 +879,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-channel-websocket@6.10.0': - resolution: {integrity: sha512-KkqP1186HELPlJftA88SNAT2znR8knCVzsUipXVzY4zfW8sN3LOa0ePMzh9VZ/V+J+raTt55laR87ovAO0n+zw==} + '@solana/signers@6.10.0': + resolution: {integrity: sha512-+vtCc+mT1FpGxrA5oL2aaMxSHiMJ2hH5PcDIfjo2XJkHz2klZiCZyT5F9+zpltc9vdi1QTElQq59Sfplmtd33A==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -333,8 +888,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-spec@6.10.0': - resolution: {integrity: sha512-nWMwGaG4ulzeX2sskY5TywXF3cwEd8FDmUpLe2JBWxE8XDAOGOKcsYPYFcBgb8ee9KqfPT2PTNdcz9jOhJf34w==} + '@solana/signers@7.0.0': + resolution: {integrity: sha512-4E3xYQ0b9OZCTLghqfeHh66lfipy3jV1REdFJLk9WqPBaXVa/wSgGGIqZVa744ATSd9AeEfL/I5n/LrMNQOhoA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -342,8 +897,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions@6.10.0': - resolution: {integrity: sha512-6mfuHp/K7unFKCOTCCBC9ziEGnxe2tyJ74EbR51QUnBeCUdYD7Hhdpxic1WRSJ3UeNW/mG4OzFM6z8Wi64Eh9Q==} + '@solana/subscribable@6.10.0': + resolution: {integrity: sha512-VsR6XMwkiDBkZJUcoGkEOhf397pOV75gKCL9Bx8bpi2T3Bbs0CxUpMn4yaUgAnRba3eXmjbXMNCXjttfa6sKbw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -351,8 +906,8 @@ packages: typescript: optional: true - '@solana/rpc-transformers@6.10.0': - resolution: {integrity: sha512-2nFUrVTiE720pJOY4XKx3HuYmishw0of/4oScu76YGm6O8wsmvFvPNAkrEinmieWXQkfpBfRvLZmpl8PaAy+ug==} + '@solana/subscribable@7.0.0': + resolution: {integrity: sha512-dJQA5AxDv/7YxuNe7GXIkaOUNhXczFaL3/SNOvXe7k77bC4dx4HPkySfcVDfEWBOePe3+8iyVbT8DZ3aOcp8Ng==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -360,8 +915,8 @@ packages: typescript: optional: true - '@solana/rpc-transport-http@6.10.0': - resolution: {integrity: sha512-JrdNuYi0nBbD3X8JUtgX1dQJwIwz/WJvmigDdELysXfGB2bTJpfjqGDLhCLOz2sRl66FASIEqgG/LVa2C9VXcA==} + '@solana/sysvars@6.10.0': + resolution: {integrity: sha512-cG13p1+onxz+20iWjwWQr1Z1jQwPm0fnjoW75fqZq7p4rVCie3L2sXvaJsYPjWKrUvpOzOIEHnqZGkG05rCpjg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -369,8 +924,8 @@ packages: typescript: optional: true - '@solana/rpc-types@6.10.0': - resolution: {integrity: sha512-zaSecTfCPvz/vcoAmKD6XoRstGHTr1EKJBD8T9UcpEFFB6CtF6DxerDB+wrzkamuT6msmnR2DWXMrYOGDAsgIg==} + '@solana/sysvars@7.0.0': + resolution: {integrity: sha512-GKND6hCcBcrak3/VAtx6aEoAi9wQjJQzU2Fcu6JYmnTjGe5MHf21FqbjGl0aQ0C2HlJQQJmA07wgsuOiYDTDog==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -378,8 +933,8 @@ packages: typescript: optional: true - '@solana/rpc@6.10.0': - resolution: {integrity: sha512-EwxsqoD+NXV+m+iobnWNtATD93gTgaNsOiQOzYB1/2e+8S6fl6obdNPB55yfXgtl4jt6GV6/ae4xuPhLv76vvg==} + '@solana/transaction-confirmation@6.10.0': + resolution: {integrity: sha512-ULvtg65qfenh4T/GYcIlKSUv5EqDcng9UN0dxbHU4kuZdR2e0B8HN2xDC4WhcFQVeFJSbTZmaYFkeTY/Y4gfGQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -387,8 +942,8 @@ packages: typescript: optional: true - '@solana/signers@6.10.0': - resolution: {integrity: sha512-+vtCc+mT1FpGxrA5oL2aaMxSHiMJ2hH5PcDIfjo2XJkHz2klZiCZyT5F9+zpltc9vdi1QTElQq59Sfplmtd33A==} + '@solana/transaction-confirmation@7.0.0': + resolution: {integrity: sha512-SaU2CY9ZDJGK47DtQ7xwKFmbgzDGqIN/Ug89ZSUzDPD9QdMRXhtxgH8KZgb0gSgpyel85sSt0QH9wkWzhp69ow==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -396,8 +951,8 @@ packages: typescript: optional: true - '@solana/subscribable@6.10.0': - resolution: {integrity: sha512-VsR6XMwkiDBkZJUcoGkEOhf397pOV75gKCL9Bx8bpi2T3Bbs0CxUpMn4yaUgAnRba3eXmjbXMNCXjttfa6sKbw==} + '@solana/transaction-introspection@7.0.0': + resolution: {integrity: sha512-aO+5ewxGaziXYcXJZ6F3doq/KI1L3WU2z5eCjs4DBO0kRQBHp4bH6ZKygVX2JIxOZrd1rB9SxP/CCCX2wRm8Xw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -405,8 +960,8 @@ packages: typescript: optional: true - '@solana/sysvars@6.10.0': - resolution: {integrity: sha512-cG13p1+onxz+20iWjwWQr1Z1jQwPm0fnjoW75fqZq7p4rVCie3L2sXvaJsYPjWKrUvpOzOIEHnqZGkG05rCpjg==} + '@solana/transaction-messages@6.10.0': + resolution: {integrity: sha512-s7v8G3BTxGlKYIj3eWCG0g1296v+1LBt16mVnlRH5FuyaJ5AdhlhtRho5HUDpdwE8EXun+y1c48V6uhcZ8wdbQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -414,8 +969,8 @@ packages: typescript: optional: true - '@solana/transaction-confirmation@6.10.0': - resolution: {integrity: sha512-ULvtg65qfenh4T/GYcIlKSUv5EqDcng9UN0dxbHU4kuZdR2e0B8HN2xDC4WhcFQVeFJSbTZmaYFkeTY/Y4gfGQ==} + '@solana/transaction-messages@7.0.0': + resolution: {integrity: sha512-qCBYR3QQvykcI36vnqwI5090hGXS3mmCe72b/f/n9kBsBaA2oowdBXZupB1wwKe8+6x8o8VkhKQaK9oTKKbWTg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -423,8 +978,8 @@ packages: typescript: optional: true - '@solana/transaction-messages@6.10.0': - resolution: {integrity: sha512-s7v8G3BTxGlKYIj3eWCG0g1296v+1LBt16mVnlRH5FuyaJ5AdhlhtRho5HUDpdwE8EXun+y1c48V6uhcZ8wdbQ==} + '@solana/transactions@6.10.0': + resolution: {integrity: sha512-VADSqP9OTYmhrox4pcgDd4+RjVmednXSE0+8Y7SPK4PN1pK5Az2RJ0nSsy0xcTnaOr8mF/crwFktqPrRQwSbQA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -432,8 +987,8 @@ packages: typescript: optional: true - '@solana/transactions@6.10.0': - resolution: {integrity: sha512-VADSqP9OTYmhrox4pcgDd4+RjVmednXSE0+8Y7SPK4PN1pK5Az2RJ0nSsy0xcTnaOr8mF/crwFktqPrRQwSbQA==} + '@solana/transactions@7.0.0': + resolution: {integrity: sha512-y5nayd2Ozld/4Bxefz50e/E6qxyZteuZCZ7suh7z96KY6QUJlZDR+eCG1v/lA7Azt3GSOevJuYFX/ept/mqZkw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.4.0' @@ -441,67 +996,50 @@ packages: typescript: optional: true - '@types/chai@4.3.20': - resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/mocha@9.1.1': - resolution: {integrity: sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==} + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} - '@types/node@20.19.43': - resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==} + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@ungap/promise-all-settled@1.1.2': - resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} + '@types/mocha@10.0.10': + resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} - ansi-colors@4.1.1: - resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} - engines: {node: '>=6'} + '@types/node@26.1.2': + resolution: {integrity: sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.2.2: + resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + ansi-styles@6.2.3: + resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} + engines: {node: '>=12'} argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} - - assertion-error@1.1.0: - resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - brace-expansion@1.1.14: - resolution: {integrity: sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - bufferutil@4.1.0: resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} engines: {node: '>=6.14.2'} @@ -510,9 +1048,9 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - chai@4.5.0: - resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} - engines: {node: '>=4'} + chai@6.2.2: + resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} + engines: {node: '>=18'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -522,15 +1060,13 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - check-error@1.0.3: - resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} - 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==} + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -543,11 +1079,12 @@ packages: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} + engines: {node: '>= 8'} - debug@4.3.3: - resolution: {integrity: sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==} + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -559,21 +1096,24 @@ packages: 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'} - - diff@3.5.1: - resolution: {integrity: sha512-Z3u54A8qGyqFOSr2pk0ijYs8mOE9Qz8kTvtKeBI+upoG9j04Sq+oI7W8zAJiQybDcESET8/uIdHzs0p3k4fZlw==} + diff@7.0.0: + resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} engines: {node: '>=0.3.1'} - diff@5.0.0: - resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} - engines: {node: '>=0.3.1'} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + esbuild@0.28.1: + resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==} + engines: {node: '>=18'} + hasBin: true + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -582,10 +1122,6 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} - 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'} @@ -594,8 +1130,9 @@ packages: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -606,20 +1143,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob@7.2.0: - resolution: {integrity: sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==} + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me - - growl@1.10.5: - resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} - engines: {node: '>=4.x'} + hasBin: true has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -629,32 +1156,13 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - 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-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} @@ -667,14 +1175,13 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + js-yaml@4.1.0: resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} hasBin: true - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - litesvm-darwin-arm64@1.3.0: resolution: {integrity: sha512-fj6cV/ofjMXdl5CwjyyLTQnZObfVH5HYDScQ6O44iRqxASmgEyEh4sC8a7M0YZ1rcli9nu2cWl5ARGura89I7Q==} engines: {node: '>= 20'} @@ -692,28 +1199,24 @@ packages: engines: {node: '>= 20'} cpu: [arm64] os: [linux] - libc: [glibc] litesvm-linux-arm64-musl@1.3.0: resolution: {integrity: sha512-FO9p6rx+/3h7R3CU7lkOebL+jy8UEDngSrENHu7pj9EOr78QVyE3Fm0O+WMnwXpMoCSgW0XLhu1cI9NHAbzCTA==} engines: {node: '>= 20'} cpu: [arm64] os: [linux] - libc: [musl] litesvm-linux-x64-gnu@1.3.0: resolution: {integrity: sha512-yXC8ZAdIei9JQ2xw5/BocOTu/7EqZuFPyhgENQ1mYDhjNpoyUbIuGCWnqtria14mDda0aV9yVev8plGUrUpjUw==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - libc: [glibc] litesvm-linux-x64-musl@1.3.0: resolution: {integrity: sha512-oedromp1gTjShXmKmxZ1FYtnfM824vRcrPSPvGM0CrqJqKK61m1+tFwNRAVsDlpmWKvO/zsz90ctbgAUo/3TXg==} engines: {node: '>= 20'} cpu: [x64] os: [linux] - libc: [musl] litesvm@1.3.0: resolution: {integrity: sha512-tMu9sBIqSbF1gQluXEUtGmXPfZlMc10tOoBVeDokgK77nl/CcuC506sEoFKM5Rq58Dkb070lBMVBLc43TbMUzQ==} @@ -727,53 +1230,29 @@ packages: 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.5: - resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} + engines: {node: '>=16 || 14 >=14.17'} - mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true + minipass@7.1.3: + resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} + engines: {node: '>=16 || 14 >=14.17'} - mocha@9.2.2: - resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} - engines: {node: '>= 12.0.0'} + mocha@11.8.0: + resolution: {integrity: sha512-VyCeUdGN3A9lmCTTgG4yuvY9ixxaDk+xt2R/7/+1AP6EqNG+G9OKkzBwhVtVYoNX8YsxNSgAl8mOv3IAeOpFbw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.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-gyp-build@4.8.4: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -782,27 +1261,30 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + 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'} + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} - pathval@1.1.1: - resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} - picomatch@2.3.2: - resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} - engines: {node: '>=8.6'} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} randombytes@2.1.0: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} @@ -811,27 +1293,36 @@ 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==} - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + 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-ansi@7.2.0: + resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} + engines: {node: '>=12'} strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -845,36 +1336,18 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - ts-mocha@10.1.0: - resolution: {integrity: sha512-T0C0Xm3/WqCuF2tpa0GNGESTBoKZaiqdUP8guNv4ZY316AFXlyidnrzQ1LUrCT0Wb1i3J0zFTgOh/55Un44WdA==} - engines: {node: '>= 6.X.X'} + tsx@4.23.9: + resolution: {integrity: sha512-6q8uTORRGauQVjqMQnKUucLFoeXZAfw6zKvG35GLbdKWbLdeOtZ3H4mhyA5mxuUd2o2cRTskhj59nLLQseUvUw==} + engines: {node: '>=18.0.0'} 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 || ^11.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==} - - type-detect@4.1.0: - resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} - engines: {node: '>=4'} typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} hasBin: true - undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@8.3.0: + resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} undici-types@8.8.0: resolution: {integrity: sha512-nNSnIK0VcEoNWrYwxCz9DFT1W7ASyBRWX7Hju/p9RAfVDcHoH07hkMg/na9U/2S04fhkPc4pDUK5NblZoaCvwg==} @@ -888,15 +1361,16 @@ packages: engines: {node: '>= 8'} hasBin: true - workerpool@6.2.0: - resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} + workerpool@9.3.4: + resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} 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==} + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} ws@8.21.0: resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} @@ -914,21 +1388,17 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yargs-parser@20.2.4: - resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} - engines: {node: '>=10'} + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} 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'} + yargs@17.7.3: + resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} + engines: {node: '>=12'} yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} @@ -936,15 +1406,114 @@ packages: snapshots: + '@esbuild/aix-ppc64@0.28.1': + optional: true + + '@esbuild/android-arm64@0.28.1': + optional: true + + '@esbuild/android-arm@0.28.1': + optional: true + + '@esbuild/android-x64@0.28.1': + optional: true + + '@esbuild/darwin-arm64@0.28.1': + optional: true + + '@esbuild/darwin-x64@0.28.1': + optional: true + + '@esbuild/freebsd-arm64@0.28.1': + optional: true + + '@esbuild/freebsd-x64@0.28.1': + optional: true + + '@esbuild/linux-arm64@0.28.1': + optional: true + + '@esbuild/linux-arm@0.28.1': + optional: true + + '@esbuild/linux-ia32@0.28.1': + optional: true + + '@esbuild/linux-loong64@0.28.1': + optional: true + + '@esbuild/linux-mips64el@0.28.1': + optional: true + + '@esbuild/linux-ppc64@0.28.1': + optional: true + + '@esbuild/linux-riscv64@0.28.1': + optional: true + + '@esbuild/linux-s390x@0.28.1': + optional: true + + '@esbuild/linux-x64@0.28.1': + optional: true + + '@esbuild/netbsd-arm64@0.28.1': + optional: true + + '@esbuild/netbsd-x64@0.28.1': + optional: true + + '@esbuild/openbsd-arm64@0.28.1': + optional: true + + '@esbuild/openbsd-x64@0.28.1': + optional: true + + '@esbuild/openharmony-arm64@0.28.1': + optional: true + + '@esbuild/sunos-x64@0.28.1': + optional: true + + '@esbuild/win32-arm64@0.28.1': + optional: true + + '@esbuild/win32-ia32@0.28.1': + optional: true + + '@esbuild/win32-x64@0.28.1': + optional: true + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.2.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@pkgjs/parseargs@0.11.0': + optional: true + '@solana-program/system@0.12.2(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': dependencies: '@solana/kit': 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana-program/system@0.12.2(@solana/kit@7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/kit': 7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana-program/token@0.14.0(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': dependencies: '@solana-program/system': 0.12.2(@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) '@solana/kit': 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana-program/token@0.14.0(@solana/kit@7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana-program/system': 0.12.2(@solana/kit@7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)) + '@solana/kit': 7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/accounts@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -958,6 +1527,19 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/accounts@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-strings': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec': 7.0.0(typescript@5.9.3) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/addresses@6.10.0(typescript@5.9.3)': dependencies: '@solana/assertions': 6.10.0(typescript@5.9.3) @@ -970,18 +1552,42 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/addresses@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/assertions': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-strings': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/nominal-types': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/assertions@6.10.0(typescript@5.9.3)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 + '@solana/assertions@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/codecs-core@6.10.0(typescript@5.9.3)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 + '@solana/codecs-core@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/codecs-data-structures@6.10.0(typescript@5.9.3)': dependencies: '@solana/codecs-core': 6.10.0(typescript@5.9.3) @@ -990,6 +1596,14 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@solana/codecs-data-structures@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-numbers': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/codecs-numbers@6.10.0(typescript@5.9.3)': dependencies: '@solana/codecs-core': 6.10.0(typescript@5.9.3) @@ -997,6 +1611,13 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@solana/codecs-numbers@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/codecs-strings@6.10.0(typescript@5.9.3)': dependencies: '@solana/codecs-core': 6.10.0(typescript@5.9.3) @@ -1005,6 +1626,14 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@solana/codecs-strings@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-numbers': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/codecs@6.10.0(typescript@5.9.3)': dependencies: '@solana/codecs-core': 6.10.0(typescript@5.9.3) @@ -1018,6 +1647,19 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/codecs@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-data-structures': 7.0.0(typescript@5.9.3) + '@solana/codecs-numbers': 7.0.0(typescript@5.9.3) + '@solana/codecs-strings': 7.0.0(typescript@5.9.3) + '@solana/fixed-points': 7.0.0(typescript@5.9.3) + '@solana/options': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/errors@6.10.0(typescript@5.9.3)': dependencies: chalk: 5.6.2 @@ -1025,10 +1667,21 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@solana/errors@7.0.0(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 15.0.0 + optionalDependencies: + typescript: 5.9.3 + '@solana/fast-stable-stringify@6.10.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 + '@solana/fast-stable-stringify@7.0.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + '@solana/fixed-points@6.10.0(typescript@5.9.3)': dependencies: '@solana/codecs-core': 6.10.0(typescript@5.9.3) @@ -1036,10 +1689,21 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@solana/fixed-points@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/functional@6.10.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 + '@solana/functional@7.0.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + '@solana/instruction-plans@6.10.0(typescript@5.9.3)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) @@ -1053,6 +1717,19 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/instruction-plans@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/instructions': 7.0.0(typescript@5.9.3) + '@solana/keys': 7.0.0(typescript@5.9.3) + '@solana/promises': 7.0.0(typescript@5.9.3) + '@solana/transaction-messages': 7.0.0(typescript@5.9.3) + '@solana/transactions': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/instructions@6.10.0(typescript@5.9.3)': dependencies: '@solana/codecs-core': 6.10.0(typescript@5.9.3) @@ -1060,6 +1737,13 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@solana/instructions@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/keys@6.10.0(typescript@5.9.3)': dependencies: '@solana/assertions': 6.10.0(typescript@5.9.3) @@ -1073,6 +1757,19 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/keys@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/assertions': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-strings': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/nominal-types': 7.0.0(typescript@5.9.3) + '@solana/promises': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: '@solana/accounts': 6.10.0(typescript@5.9.3) @@ -1107,10 +1804,49 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate + '@solana/kit@7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/accounts': 7.0.0(typescript@5.9.3) + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/codecs': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/functional': 7.0.0(typescript@5.9.3) + '@solana/instruction-plans': 7.0.0(typescript@5.9.3) + '@solana/instructions': 7.0.0(typescript@5.9.3) + '@solana/keys': 7.0.0(typescript@5.9.3) + '@solana/offchain-messages': 7.0.0(typescript@5.9.3) + '@solana/plugin-core': 7.0.0(typescript@5.9.3) + '@solana/plugin-interfaces': 7.0.0(typescript@5.9.3) + '@solana/program-client-core': 7.0.0(typescript@5.9.3) + '@solana/programs': 7.0.0(typescript@5.9.3) + '@solana/rpc': 7.0.0(typescript@5.9.3) + '@solana/rpc-api': 7.0.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec-types': 7.0.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + '@solana/signers': 7.0.0(typescript@5.9.3) + '@solana/subscribable': 7.0.0(typescript@5.9.3) + '@solana/sysvars': 7.0.0(typescript@5.9.3) + '@solana/transaction-confirmation': 7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/transaction-introspection': 7.0.0(typescript@5.9.3) + '@solana/transaction-messages': 7.0.0(typescript@5.9.3) + '@solana/transactions': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + '@solana/nominal-types@6.10.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 + '@solana/nominal-types@7.0.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + '@solana/offchain-messages@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -1126,6 +1862,21 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/offchain-messages@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-data-structures': 7.0.0(typescript@5.9.3) + '@solana/codecs-numbers': 7.0.0(typescript@5.9.3) + '@solana/codecs-strings': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/keys': 7.0.0(typescript@5.9.3) + '@solana/nominal-types': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/options@6.10.0(typescript@5.9.3)': dependencies: '@solana/codecs-core': 6.10.0(typescript@5.9.3) @@ -1138,10 +1889,26 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/options@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-data-structures': 7.0.0(typescript@5.9.3) + '@solana/codecs-numbers': 7.0.0(typescript@5.9.3) + '@solana/codecs-strings': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/plugin-core@6.10.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 + '@solana/plugin-core@7.0.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + '@solana/plugin-interfaces@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -1156,6 +1923,20 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/plugin-interfaces@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/instruction-plans': 7.0.0(typescript@5.9.3) + '@solana/keys': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec': 7.0.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 7.0.0(typescript@5.9.3) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + '@solana/signers': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/program-client-core@6.10.0(typescript@5.9.3)': dependencies: '@solana/accounts': 6.10.0(typescript@5.9.3) @@ -1172,6 +1953,22 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/program-client-core@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 7.0.0(typescript@5.9.3) + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/instruction-plans': 7.0.0(typescript@5.9.3) + '@solana/instructions': 7.0.0(typescript@5.9.3) + '@solana/plugin-interfaces': 7.0.0(typescript@5.9.3) + '@solana/rpc-api': 7.0.0(typescript@5.9.3) + '@solana/signers': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/programs@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -1181,10 +1978,23 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/programs@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/promises@6.10.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 + '@solana/promises@7.0.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + '@solana/rpc-api@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -1203,14 +2013,42 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc-api@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-strings': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/keys': 7.0.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec': 7.0.0(typescript@5.9.3) + '@solana/rpc-transformers': 7.0.0(typescript@5.9.3) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + '@solana/transaction-messages': 7.0.0(typescript@5.9.3) + '@solana/transactions': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/rpc-parsed-types@6.10.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 + '@solana/rpc-parsed-types@7.0.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + '@solana/rpc-spec-types@6.10.0(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 + '@solana/rpc-spec-types@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/rpc-spec@6.10.0(typescript@5.9.3)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) @@ -1219,6 +2057,14 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@solana/rpc-spec@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec-types': 7.0.0(typescript@5.9.3) + '@solana/subscribable': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/rpc-subscriptions-api@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -1233,6 +2079,20 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc-subscriptions-api@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/keys': 7.0.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 7.0.0(typescript@5.9.3) + '@solana/rpc-transformers': 7.0.0(typescript@5.9.3) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + '@solana/transaction-messages': 7.0.0(typescript@5.9.3) + '@solana/transactions': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/rpc-subscriptions-channel-websocket@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) @@ -1246,6 +2106,19 @@ snapshots: - bufferutil - utf-8-validate + '@solana/rpc-subscriptions-channel-websocket@7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/functional': 7.0.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 7.0.0(typescript@5.9.3) + '@solana/subscribable': 7.0.0(typescript@5.9.3) + ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@solana/rpc-subscriptions-spec@6.10.0(typescript@5.9.3)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) @@ -1255,6 +2128,15 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@solana/rpc-subscriptions-spec@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/promises': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec-types': 7.0.0(typescript@5.9.3) + '@solana/subscribable': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/rpc-subscriptions@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) @@ -1275,6 +2157,26 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate + '@solana/rpc-subscriptions@7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 7.0.0(typescript@5.9.3) + '@solana/functional': 7.0.0(typescript@5.9.3) + '@solana/promises': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec-types': 7.0.0(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 7.0.0(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-subscriptions-spec': 7.0.0(typescript@5.9.3) + '@solana/rpc-transformers': 7.0.0(typescript@5.9.3) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + '@solana/subscribable': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + '@solana/rpc-transformers@6.10.0(typescript@5.9.3)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) @@ -1287,6 +2189,18 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc-transformers@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/functional': 7.0.0(typescript@5.9.3) + '@solana/nominal-types': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec-types': 7.0.0(typescript@5.9.3) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/rpc-transport-http@6.10.0(typescript@5.9.3)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) @@ -1296,6 +2210,15 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@solana/rpc-transport-http@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec-types': 7.0.0(typescript@5.9.3) + undici-types: 8.8.0 + optionalDependencies: + typescript: 5.9.3 + '@solana/rpc-types@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -1310,6 +2233,20 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc-types@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-numbers': 7.0.0(typescript@5.9.3) + '@solana/codecs-strings': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/fixed-points': 7.0.0(typescript@5.9.3) + '@solana/nominal-types': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/rpc@6.10.0(typescript@5.9.3)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) @@ -1326,6 +2263,22 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 7.0.0(typescript@5.9.3) + '@solana/functional': 7.0.0(typescript@5.9.3) + '@solana/rpc-api': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec': 7.0.0(typescript@5.9.3) + '@solana/rpc-spec-types': 7.0.0(typescript@5.9.3) + '@solana/rpc-transformers': 7.0.0(typescript@5.9.3) + '@solana/rpc-transport-http': 7.0.0(typescript@5.9.3) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/signers@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -1342,6 +2295,22 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/signers@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/instructions': 7.0.0(typescript@5.9.3) + '@solana/keys': 7.0.0(typescript@5.9.3) + '@solana/nominal-types': 7.0.0(typescript@5.9.3) + '@solana/offchain-messages': 7.0.0(typescript@5.9.3) + '@solana/transaction-messages': 7.0.0(typescript@5.9.3) + '@solana/transactions': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/subscribable@6.10.0(typescript@5.9.3)': dependencies: '@solana/errors': 6.10.0(typescript@5.9.3) @@ -1349,6 +2318,13 @@ snapshots: optionalDependencies: typescript: 5.9.3 + '@solana/subscribable@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/promises': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/sysvars@6.10.0(typescript@5.9.3)': dependencies: '@solana/accounts': 6.10.0(typescript@5.9.3) @@ -1362,6 +2338,19 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/sysvars@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-data-structures': 7.0.0(typescript@5.9.3) + '@solana/codecs-numbers': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/transaction-confirmation@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -1381,6 +2370,40 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate + '@solana/transaction-confirmation@7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/codecs-strings': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/keys': 7.0.0(typescript@5.9.3) + '@solana/promises': 7.0.0(typescript@5.9.3) + '@solana/rpc': 7.0.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 7.0.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + '@solana/transaction-messages': 7.0.0(typescript@5.9.3) + '@solana/transactions': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/transaction-introspection@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-strings': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/instructions': 7.0.0(typescript@5.9.3) + '@solana/rpc-api': 7.0.0(typescript@5.9.3) + '@solana/transaction-messages': 7.0.0(typescript@5.9.3) + '@solana/transactions': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/transaction-messages@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -1397,6 +2420,22 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/transaction-messages@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-data-structures': 7.0.0(typescript@5.9.3) + '@solana/codecs-numbers': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/functional': 7.0.0(typescript@5.9.3) + '@solana/instructions': 7.0.0(typescript@5.9.3) + '@solana/nominal-types': 7.0.0(typescript@5.9.3) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/transactions@6.10.0(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -1416,55 +2455,60 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@types/chai@4.3.20': {} - - '@types/json5@0.0.29': - optional: true - - '@types/mocha@9.1.1': {} + '@solana/transactions@7.0.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 7.0.0(typescript@5.9.3) + '@solana/codecs-core': 7.0.0(typescript@5.9.3) + '@solana/codecs-data-structures': 7.0.0(typescript@5.9.3) + '@solana/codecs-numbers': 7.0.0(typescript@5.9.3) + '@solana/codecs-strings': 7.0.0(typescript@5.9.3) + '@solana/errors': 7.0.0(typescript@5.9.3) + '@solana/functional': 7.0.0(typescript@5.9.3) + '@solana/instructions': 7.0.0(typescript@5.9.3) + '@solana/keys': 7.0.0(typescript@5.9.3) + '@solana/nominal-types': 7.0.0(typescript@5.9.3) + '@solana/rpc-types': 7.0.0(typescript@5.9.3) + '@solana/transaction-messages': 7.0.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder - '@types/node@20.19.43': + '@types/chai@5.2.3': dependencies: - undici-types: 6.21.0 + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 - '@ungap/promise-all-settled@1.1.2': {} + '@types/deep-eql@4.0.2': {} - ansi-colors@4.1.1: {} + '@types/mocha@10.0.10': {} + + '@types/node@26.1.2': + dependencies: + undici-types: 8.3.0 ansi-regex@5.0.1: {} + ansi-regex@6.2.2: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.2 + ansi-styles@6.2.3: {} argparse@2.0.1: {} - arrify@1.0.1: {} - - assertion-error@1.1.0: {} + assertion-error@2.0.1: {} balanced-match@1.0.2: {} - binary-extensions@2.3.0: {} - - brace-expansion@1.1.14: + brace-expansion@2.1.4: 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: {} - buffer-from@1.1.2: {} - bufferutil@4.1.0: dependencies: node-gyp-build: 4.8.4 @@ -1472,15 +2516,7 @@ snapshots: 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 + chai@6.2.2: {} chalk@4.1.2: dependencies: @@ -1489,23 +2525,11 @@ snapshots: chalk@5.6.2: {} - check-error@1.0.3: + chokidar@4.0.3: dependencies: - get-func-name: 2.0.2 + readdirp: 4.1.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: + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 @@ -1519,34 +2543,61 @@ snapshots: commander@15.0.0: {} - concat-map@0.0.1: {} + cross-spawn@7.0.6: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 - debug@4.3.3(supports-color@8.1.1): + debug@4.4.3(supports-color@8.1.1): dependencies: - ms: 2.1.2 + ms: 2.1.3 optionalDependencies: supports-color: 8.1.1 decamelize@4.0.0: {} - deep-eql@4.1.4: - dependencies: - type-detect: 4.1.0 - - diff@3.5.1: {} + diff@7.0.0: {} - diff@5.0.0: {} + eastasianwidth@0.2.0: {} emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + + esbuild@0.28.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.28.1 + '@esbuild/android-arm': 0.28.1 + '@esbuild/android-arm64': 0.28.1 + '@esbuild/android-x64': 0.28.1 + '@esbuild/darwin-arm64': 0.28.1 + '@esbuild/darwin-x64': 0.28.1 + '@esbuild/freebsd-arm64': 0.28.1 + '@esbuild/freebsd-x64': 0.28.1 + '@esbuild/linux-arm': 0.28.1 + '@esbuild/linux-arm64': 0.28.1 + '@esbuild/linux-ia32': 0.28.1 + '@esbuild/linux-loong64': 0.28.1 + '@esbuild/linux-mips64el': 0.28.1 + '@esbuild/linux-ppc64': 0.28.1 + '@esbuild/linux-riscv64': 0.28.1 + '@esbuild/linux-s390x': 0.28.1 + '@esbuild/linux-x64': 0.28.1 + '@esbuild/netbsd-arm64': 0.28.1 + '@esbuild/netbsd-x64': 0.28.1 + '@esbuild/openbsd-arm64': 0.28.1 + '@esbuild/openbsd-x64': 0.28.1 + '@esbuild/openharmony-arm64': 0.28.1 + '@esbuild/sunos-x64': 0.28.1 + '@esbuild/win32-arm64': 0.28.1 + '@esbuild/win32-ia32': 0.28.1 + '@esbuild/win32-x64': 0.28.1 + escalade@3.2.0: {} escape-string-regexp@4.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 @@ -1554,54 +2605,32 @@ snapshots: flat@5.0.2: {} - fs.realpath@1.0.0: {} + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 fsevents@2.3.3: optional: true get-caller-file@2.0.5: {} - get-func-name@2.0.2: {} - - glob-parent@5.1.2: + glob@10.5.0: 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.5 - once: 1.4.0 - path-is-absolute: 1.0.1 - - growl@1.10.5: {} + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.9 + minipass: 7.1.3 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 has-flag@4.0.0: {} he@1.2.0: {} - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-extglob@2.1.1: {} - is-fullwidth-code-point@3.0.0: {} - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-number@7.0.0: {} + is-path-inside@3.0.3: {} is-plain-obj@2.1.0: {} @@ -1609,14 +2638,15 @@ snapshots: isexe@2.0.0: {} - js-yaml@4.1.0: + jackspeak@3.4.3: dependencies: - argparse: 2.0.1 + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 - json5@1.0.2: + js-yaml@4.1.0: dependencies: - minimist: 1.2.8 - optional: true + argparse: 2.0.1 litesvm-darwin-arm64@1.3.0: optional: true @@ -1663,68 +2693,43 @@ snapshots: 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.5: - dependencies: - brace-expansion: 1.1.14 + lru-cache@10.4.3: {} - minimatch@4.2.1: + minimatch@9.0.9: dependencies: - brace-expansion: 1.1.14 - - minimist@1.2.8: {} + brace-expansion: 2.1.4 - mkdirp@0.5.6: - dependencies: - minimist: 1.2.8 + minipass@7.1.3: {} - mocha@9.2.2: + mocha@11.8.0: 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 + chokidar: 4.0.3 + debug: 4.4.3(supports-color@8.1.1) + diff: 7.0.0 escape-string-regexp: 4.0.0 find-up: 5.0.0 - glob: 7.2.0 - growl: 1.10.5 + glob: 10.5.0 he: 1.2.0 + is-path-inside: 3.0.3 js-yaml: 4.1.0 log-symbols: 4.1.0 - minimatch: 4.2.1 + minimatch: 9.0.9 ms: 2.1.3 - nanoid: 3.3.1 - serialize-javascript: 6.0.0 + picocolors: 1.1.1 + serialize-javascript: 6.0.2 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 + workerpool: 9.3.4 + yargs: 17.7.3 + yargs-parser: 21.1.1 yargs-unparser: 2.0.0 - ms@2.1.2: {} - ms@2.1.3: {} - nanoid@3.3.1: {} - node-gyp-build@4.8.4: optional: true - normalize-path@3.0.0: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -1733,36 +2738,40 @@ snapshots: dependencies: p-limit: 3.1.0 + package-json-from-dist@1.0.1: {} + path-exists@4.0.0: {} - path-is-absolute@1.0.1: {} + path-key@3.1.1: {} - pathval@1.1.1: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.3 - picomatch@2.3.2: {} + picocolors@1.1.1: {} randombytes@2.1.0: dependencies: safe-buffer: 5.2.1 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.2 + readdirp@4.1.2: {} require-directory@2.1.1: {} safe-buffer@5.2.1: {} - serialize-javascript@6.0.0: + serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 - source-map-support@0.5.21: + shebang-command@2.0.0: dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 + shebang-regex: 3.0.0 - source-map@0.6.1: {} + shebang-regex@3.0.0: {} + + signal-exit@4.1.0: {} string-width@4.2.3: dependencies: @@ -1770,12 +2779,19 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.2.0 + strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-bom@3.0.0: - optional: true + strip-ansi@7.2.0: + dependencies: + ansi-regex: 6.2.2 strip-json-comments@3.1.1: {} @@ -1787,41 +2803,15 @@ snapshots: dependencies: has-flag: 4.0.0 - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - ts-mocha@10.1.0(mocha@9.2.2): + tsx@4.23.9: dependencies: - mocha: 9.2.2 - ts-node: 7.0.1 + esbuild: 0.28.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.1 - 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 - - type-detect@4.1.0: {} + fsevents: 2.3.3 typescript@5.9.3: {} - undici-types@6.21.0: {} + undici-types@8.3.0: {} undici-types@8.8.0: {} @@ -1834,7 +2824,7 @@ snapshots: dependencies: isexe: 2.0.0 - workerpool@6.2.0: {} + workerpool@9.3.4: {} wrap-ansi@7.0.0: dependencies: @@ -1842,7 +2832,11 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrappy@1.0.2: {} + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.3 + string-width: 5.1.2 + strip-ansi: 7.2.0 ws@8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: @@ -1851,7 +2845,7 @@ snapshots: y18n@5.0.8: {} - yargs-parser@20.2.4: {} + yargs-parser@21.1.1: {} yargs-unparser@2.0.0: dependencies: @@ -1860,16 +2854,14 @@ snapshots: flat: 5.0.2 is-plain-obj: 2.1.0 - yargs@16.2.0: + yargs@17.7.3: dependencies: - cliui: 7.0.4 + cliui: 8.0.1 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: {} + yargs-parser: 21.1.1 yocto-queue@0.1.0: {} diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs b/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs index e2f6e5a18..56bb776e0 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/create_collection.rs @@ -10,8 +10,7 @@ use pinocchio_system::instructions::CreateAccount; use pinocchio_token::instructions::{InitializeMint2, MintTo}; use crate::instructions::{ - build_metadata_data, create_master_edition_cpi, create_metadata_cpi, read_bump, AUTHORITY_SEED, MINT_SIZE, - TOKEN_DECIMALS, + build_metadata_data, create_master_edition_cpi, create_metadata_cpi, AUTHORITY_SEED, MINT_SIZE, TOKEN_DECIMALS, }; /// Creates a collection NFT: a 0-decimal mint whose authority is the program's @@ -30,8 +29,8 @@ use crate::instructions::{ /// 8. `[]` associated token program /// 9. `[]` token metadata program /// -/// Instruction data: `[authority_bump: u8]`. -pub fn create_collection(program_id: &Address, accounts: &mut [AccountView], args: &[u8]) -> ProgramResult { +/// Instruction data: none. +pub fn create_collection(program_id: &Address, accounts: &mut [AccountView]) -> ProgramResult { let [user, mint, mint_authority, metadata, master_edition, destination, system_program, token_program, _associated_token_program, _token_metadata_program] = accounts else { @@ -42,11 +41,11 @@ pub fn create_collection(program_id: &Address, accounts: &mut [AccountView], arg return Err(ProgramError::MissingRequiredSignature); } - // Confirm the supplied account is the canonical mint-authority PDA. - let bump = read_bump(args)?; - // Derive the canonical PDA on-chain and reject a non-canonical bump. - let (pda, canonical_bump) = Address::find_program_address(&[AUTHORITY_SEED], program_id); - if mint_authority.address() != &pda || bump != canonical_bump { + // Derive the canonical mint-authority PDA and bump on-chain (as the Anchor + // example does) instead of trusting a client-supplied bump, and confirm the + // supplied account matches it. + let (pda, bump) = Address::find_program_address(&[AUTHORITY_SEED], program_id); + if mint_authority.address() != &pda { return Err(ProgramError::InvalidSeeds); } diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs b/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs index 95d9bce02..c6cedc0c3 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/mint_nft.rs @@ -10,8 +10,7 @@ use pinocchio_system::instructions::CreateAccount; use pinocchio_token::instructions::{InitializeMint2, MintTo}; use crate::instructions::{ - build_metadata_data, create_master_edition_cpi, create_metadata_cpi, read_bump, AUTHORITY_SEED, MINT_SIZE, - TOKEN_DECIMALS, + build_metadata_data, create_master_edition_cpi, create_metadata_cpi, AUTHORITY_SEED, MINT_SIZE, TOKEN_DECIMALS, }; /// Mints an NFT that belongs to a collection: a 0-decimal mint (authority = the @@ -32,8 +31,8 @@ use crate::instructions::{ /// 9. `[]` associated token program /// 10. `[]` token metadata program /// -/// Instruction data: `[authority_bump: u8]`. -pub fn mint_nft(program_id: &Address, accounts: &mut [AccountView], args: &[u8]) -> ProgramResult { +/// Instruction data: none. +pub fn mint_nft(program_id: &Address, accounts: &mut [AccountView]) -> ProgramResult { let [owner, mint, mint_authority, metadata, master_edition, destination, collection_mint, system_program, token_program, _associated_token_program, _token_metadata_program] = accounts else { @@ -44,11 +43,11 @@ pub fn mint_nft(program_id: &Address, accounts: &mut [AccountView], args: &[u8]) return Err(ProgramError::MissingRequiredSignature); } - // Confirm the supplied account is the canonical mint-authority PDA. - let bump = read_bump(args)?; - // Derive the canonical PDA on-chain and reject a non-canonical bump. - let (pda, canonical_bump) = Address::find_program_address(&[AUTHORITY_SEED], program_id); - if mint_authority.address() != &pda || bump != canonical_bump { + // Derive the canonical mint-authority PDA and bump on-chain (as the Anchor + // example does) instead of trusting a client-supplied bump, and confirm the + // supplied account matches it. + let (pda, bump) = Address::find_program_address(&[AUTHORITY_SEED], program_id); + if mint_authority.address() != &pda { return Err(ProgramError::InvalidSeeds); } diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/mod.rs b/tokens/nft-operations/pinocchio/program/src/instructions/mod.rs index 93f9a5ab5..afa377f11 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/mod.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/mod.rs @@ -2,7 +2,6 @@ use alloc::vec::Vec; use pinocchio::{ cpi::{invoke_signed, Signer}, - error::ProgramError, instruction::{InstructionAccount, InstructionView}, AccountView, ProgramResult, }; @@ -40,11 +39,6 @@ const VERIFY: u8 = 52; /// `VerificationArgs::CollectionV1` variant index, the argument to `Verify`. const VERIFY_COLLECTION_V1: u8 = 1; -/// Reads the `authority_bump` carried by every instruction's data. -pub(crate) fn read_bump(args: &[u8]) -> Result { - args.first().copied().ok_or(ProgramError::InvalidInstructionData) -} - /// Serializes the data for a Metaplex `CreateMetadataAccountV3` instruction. /// /// Layout: `[33] DataV2 is_mutable:bool collection_details:Option`, where diff --git a/tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs b/tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs index 1f691460d..4f9cd0ad0 100644 --- a/tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs +++ b/tokens/nft-operations/pinocchio/program/src/instructions/verify_collection.rs @@ -6,7 +6,7 @@ use pinocchio::{ }; use pinocchio_log::log; -use crate::instructions::{build_verify_collection_data, read_bump, AUTHORITY_SEED, TOKEN_METADATA_PROGRAM_ID}; +use crate::instructions::{build_verify_collection_data, AUTHORITY_SEED, TOKEN_METADATA_PROGRAM_ID}; /// Verifies an NFT as a member of its collection via the Metaplex `Verify` /// instruction (`VerificationArgs::CollectionV1`), signed by the collection's @@ -23,8 +23,8 @@ use crate::instructions::{build_verify_collection_data, read_bump, AUTHORITY_SEE /// 7. `[]` instructions sysvar /// 8. `[]` token metadata program /// -/// Instruction data: `[authority_bump: u8]`. -pub fn verify_collection(program_id: &Address, accounts: &mut [AccountView], args: &[u8]) -> ProgramResult { +/// Instruction data: none. +pub fn verify_collection(program_id: &Address, accounts: &mut [AccountView]) -> ProgramResult { let [payer, mint_authority, metadata, collection_mint, collection_metadata, collection_master_edition, system_program, sysvar_instructions, token_metadata_program] = accounts else { @@ -35,11 +35,11 @@ pub fn verify_collection(program_id: &Address, accounts: &mut [AccountView], arg return Err(ProgramError::MissingRequiredSignature); } - // Confirm the supplied account is the canonical mint-authority PDA. - let bump = read_bump(args)?; - // Derive the canonical PDA on-chain and reject a non-canonical bump. - let (pda, canonical_bump) = Address::find_program_address(&[AUTHORITY_SEED], program_id); - if mint_authority.address() != &pda || bump != canonical_bump { + // Derive the canonical mint-authority PDA and bump on-chain (as the Anchor + // example does) instead of trusting a client-supplied bump, and confirm the + // supplied account matches it. + let (pda, bump) = Address::find_program_address(&[AUTHORITY_SEED], program_id); + if mint_authority.address() != &pda { return Err(ProgramError::InvalidSeeds); } diff --git a/tokens/nft-operations/pinocchio/program/src/processor.rs b/tokens/nft-operations/pinocchio/program/src/processor.rs index 81ab5e2f3..89ae98282 100644 --- a/tokens/nft-operations/pinocchio/program/src/processor.rs +++ b/tokens/nft-operations/pinocchio/program/src/processor.rs @@ -5,33 +5,32 @@ use crate::instructions::{create_collection, mint_nft, verify_collection}; /// Dispatches an instruction based on its leading discriminator byte. /// -/// Instruction data layout: `[discriminator: u8, authority_bump: u8]` +/// Instruction data layout: `[discriminator: u8]` /// - `0` -> CreateCollection (mints a collection NFT) /// - `1` -> MintNft (mints an NFT that belongs to the collection) /// - `2` -> VerifyCollection (verifies the NFT as part of the collection) /// -/// Every instruction carries the bump of the `[b"authority"]` mint-authority -/// PDA so the program can sign the Metaplex CPIs with it (the Anchor example -/// derives this bump on-chain instead). +/// The `[b"authority"]` mint-authority PDA and its bump are derived on-chain +/// (as the Anchor example does), so no bump is carried in the instruction data. pub fn process_instruction( program_id: &Address, accounts: &mut [AccountView], instruction_data: &[u8], ) -> ProgramResult { - let (discriminator, args) = instruction_data.split_first().ok_or(ProgramError::InvalidInstructionData)?; + let discriminator = *instruction_data.first().ok_or(ProgramError::InvalidInstructionData)?; - match *discriminator { + match discriminator { 0 => { log!("Instruction: CreateCollection"); - create_collection(program_id, accounts, args) + create_collection(program_id, accounts) } 1 => { log!("Instruction: MintNft"); - mint_nft(program_id, accounts, args) + mint_nft(program_id, accounts) } 2 => { log!("Instruction: VerifyCollection"); - verify_collection(program_id, accounts, args) + verify_collection(program_id, accounts) } _ => Err(ProgramError::InvalidInstructionData), } diff --git a/tokens/nft-operations/pinocchio/tests/test.ts b/tokens/nft-operations/pinocchio/tests/test.ts index 08d9922c5..c2e5c6e2b 100644 --- a/tokens/nft-operations/pinocchio/tests/test.ts +++ b/tokens/nft-operations/pinocchio/tests/test.ts @@ -15,7 +15,12 @@ import { } from '@solana/kit'; import { SYSVAR_INSTRUCTIONS_ADDRESS } from '@solana/sysvars'; import { SYSTEM_PROGRAM_ADDRESS } from '@solana-program/system'; -import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS, getTokenDecoder, TOKEN_PROGRAM_ADDRESS } from '@solana-program/token'; +import { + ASSOCIATED_TOKEN_PROGRAM_ADDRESS, + findAssociatedTokenPda, + getTokenDecoder, + TOKEN_PROGRAM_ADDRESS, +} from '@solana-program/token'; import { assert } from 'chai'; import { FailedTransactionMetadata, LiteSVM } from 'litesvm'; @@ -58,14 +63,7 @@ async function getMasterEditionAddress(mint: ReturnType) { } async function getAssociatedTokenAddress(mint: ReturnType, owner: ReturnType) { - const [ata] = await getProgramDerivedAddress({ - programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, - seeds: [ - addressEncoder.encode(owner), - addressEncoder.encode(TOKEN_PROGRAM_ADDRESS), - addressEncoder.encode(mint), - ], - }); + const [ata] = await findAssociatedTokenPda({ owner, mint, tokenProgram: TOKEN_PROGRAM_ADDRESS }); return ata; } @@ -76,7 +74,6 @@ describe('NFT Operations (Pinocchio)', () => { let collectionMint: Awaited>; let nftMint: Awaited>; let mintAuthorityPda: ReturnType; - let mintAuthorityBump: number; before(async () => { svm = new LiteSVM(); @@ -93,14 +90,13 @@ describe('NFT Operations (Pinocchio)', () => { collectionMint = await generateKeyPairSigner(); nftMint = await generateKeyPairSigner(); - // The update/mint authority is a PDA of the program; its canonical bump is - // passed into every instruction and used by the program to sign CPIs. - const [pda, bump] = await getProgramDerivedAddress({ + // The update/mint authority is a PDA of the program; the program derives + // its canonical bump on-chain to sign CPIs, so only the address is needed. + const [pda] = await getProgramDerivedAddress({ programAddress: programId, seeds: ['authority'], }); mintAuthorityPda = pda; - mintAuthorityBump = bump; }); async function send[0]>( @@ -138,7 +134,7 @@ describe('NFT Operations (Pinocchio)', () => { { address: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // associated token program { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program ], - data: new Uint8Array([CREATE_COLLECTION, mintAuthorityBump]), + data: new Uint8Array([CREATE_COLLECTION]), }); const mintAccount = svm.getAccount(collectionMint.address); @@ -175,7 +171,7 @@ describe('NFT Operations (Pinocchio)', () => { { address: ASSOCIATED_TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // associated token program { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program ], - data: new Uint8Array([MINT_NFT, mintAuthorityBump]), + data: new Uint8Array([MINT_NFT]), }); const destinationAccount = svm.getAccount(destination); @@ -214,7 +210,7 @@ describe('NFT Operations (Pinocchio)', () => { { address: SYSVAR_INSTRUCTIONS_ADDRESS, role: AccountRole.READONLY }, // instructions sysvar { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program ], - data: new Uint8Array([VERIFY_COLLECTION, mintAuthorityBump]), + data: new Uint8Array([VERIFY_COLLECTION]), }); const metadataAccount = svm.getAccount(metadata); diff --git a/tokens/nft-operations/pinocchio/tsconfig.json b/tokens/nft-operations/pinocchio/tsconfig.json index 35163d39d..c02443141 100644 --- a/tokens/nft-operations/pinocchio/tsconfig.json +++ b/tokens/nft-operations/pinocchio/tsconfig.json @@ -2,10 +2,14 @@ "compilerOptions": { "types": ["mocha", "chai", "node"], "typeRoots": ["./node_modules/@types"], - "lib": ["es2022", "dom"], - "module": "preserve", + "lib": ["esnext"], + "module": "esnext", + "target": "esnext", "moduleResolution": "bundler", - "target": "es2022", - "esModuleInterop": true + "esModuleInterop": true, + "resolveJsonModule": true, + "allowImportingTsExtensions": true, + "noEmit": true, + "skipLibCheck": true } }