From 4d34e10860bdbdddd867bfb777fe2275f98d60a5 Mon Sep 17 00:00:00 2001 From: MarkFeder Date: Thu, 25 Jun 2026 00:58:30 +0200 Subject: [PATCH 1/9] add pinocchio pda-mint-authority example --- Cargo.lock | 12 + Cargo.toml | 1 + README.md | 2 +- tokens/pda-mint-authority/pinocchio/cicd.sh | 8 + .../pda-mint-authority/pinocchio/package.json | 24 + .../pinocchio/pnpm-lock.yaml | 1357 +++++++++++++++++ .../pda-mint-authority/pinocchio/prepare.mjs | 35 + .../pinocchio/program/Cargo.toml | 22 + .../program/src/instructions/create.rs | 156 ++ .../program/src/instructions/init.rs | 64 + .../program/src/instructions/mint.rs | 139 ++ .../pinocchio/program/src/instructions/mod.rs | 59 + .../pinocchio/program/src/lib.rs | 15 + .../pinocchio/program/src/processor.rs | 37 + .../pinocchio/program/src/state.rs | 33 + .../pinocchio/tests/test.ts | 178 +++ .../pinocchio/tsconfig.json | 10 + 17 files changed, 2151 insertions(+), 1 deletion(-) create mode 100644 tokens/pda-mint-authority/pinocchio/cicd.sh create mode 100644 tokens/pda-mint-authority/pinocchio/package.json create mode 100644 tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml create mode 100644 tokens/pda-mint-authority/pinocchio/prepare.mjs create mode 100644 tokens/pda-mint-authority/pinocchio/program/Cargo.toml create mode 100644 tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs create mode 100644 tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs create mode 100644 tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs create mode 100644 tokens/pda-mint-authority/pinocchio/program/src/instructions/mod.rs create mode 100644 tokens/pda-mint-authority/pinocchio/program/src/lib.rs create mode 100644 tokens/pda-mint-authority/pinocchio/program/src/processor.rs create mode 100644 tokens/pda-mint-authority/pinocchio/program/src/state.rs create mode 100644 tokens/pda-mint-authority/pinocchio/tests/test.ts create mode 100644 tokens/pda-mint-authority/pinocchio/tsconfig.json diff --git a/Cargo.lock b/Cargo.lock index f2e02c09a..2c724eea3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2462,6 +2462,18 @@ dependencies = [ "spl-token-interface", ] +[[package]] +name = "pda-mint-authority-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 = "pda-rent-payer" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 3eba5e90c..ea1b087a4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -56,6 +56,7 @@ members = [ "tokens/escrow/native/program", "tokens/escrow/pinocchio/program", "tokens/pda-mint-authority/native/program", + "tokens/pda-mint-authority/pinocchio/program", "tokens/transfer-tokens/native/program", "tokens/transfer-tokens/pinocchio/program", "tokens/token-2022/mint-close-authority/native/program", diff --git a/README.md b/README.md index 4fa3a78bf..4dae72be4 100644 --- a/README.md +++ b/README.md @@ -158,7 +158,7 @@ Create a fundraiser account specifying a target mint and amount, allowing contri [Mint a Token from inside your own onchain program using the Token program.](./tokens/pda-mint-authority/README.md) Reminder: you don't need your own program just to mint an NFT, see the note at the top of this README. -[anchor](./tokens/pda-mint-authority/anchor) [native](./tokens/pda-mint-authority/native) +[anchor](./tokens/pda-mint-authority/anchor) [native](./tokens/pda-mint-authority/native) [pinocchio](./tokens/pda-mint-authority/pinocchio) ### Creating an Automated Market Maker diff --git a/tokens/pda-mint-authority/pinocchio/cicd.sh b/tokens/pda-mint-authority/pinocchio/cicd.sh new file mode 100644 index 000000000..b2407c75f --- /dev/null +++ b/tokens/pda-mint-authority/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/pda-mint-authority/pinocchio/package.json b/tokens/pda-mint-authority/pinocchio/package.json new file mode 100644 index 000000000..a00a1de30 --- /dev/null +++ b/tokens/pda-mint-authority/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/pda-mint-authority/pinocchio/pnpm-lock.yaml b/tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml new file mode 100644 index 000000000..4b2f4d88c --- /dev/null +++ b/tokens/pda-mint-authority/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/pda-mint-authority/pinocchio/prepare.mjs b/tokens/pda-mint-authority/pinocchio/prepare.mjs new file mode 100644 index 000000000..3ffe52750 --- /dev/null +++ b/tokens/pda-mint-authority/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/pda-mint-authority/pinocchio/program/Cargo.toml b/tokens/pda-mint-authority/pinocchio/program/Cargo.toml new file mode 100644 index 000000000..de3053ac2 --- /dev/null +++ b/tokens/pda-mint-authority/pinocchio/program/Cargo.toml @@ -0,0 +1,22 @@ +[package] +name = "pda-mint-authority-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/pda-mint-authority/pinocchio/program/src/instructions/create.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs new file mode 100644 index 000000000..b0536e3d4 --- /dev/null +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs @@ -0,0 +1,156 @@ +use alloc::vec::Vec; + +use pinocchio::{ + cpi::{invoke_signed, Seed, Signer}, + error::ProgramError, + instruction::{InstructionAccount, InstructionView}, + sysvars::{rent::Rent, Sysvar}, + AccountView, Address, ProgramResult, +}; +use pinocchio_log::log; +use pinocchio_pubkey::derive_address; +use pinocchio_system::instructions::CreateAccount; +use pinocchio_token::instructions::InitializeMint2; + +use crate::instructions::{CreateTokenArgs, MINT_SIZE, TOKEN_DECIMALS, TOKEN_METADATA_PROGRAM_ID}; +use crate::state::MintAuthorityPda; + +/// Discriminator of the Metaplex `CreateMetadataAccountV3` instruction (variant +/// 33 of the Token Metadata program's instruction enum). +const CREATE_METADATA_ACCOUNT_V3: u8 = 33; + +/// Creates a new SPL Token mint (with 0 decimals, the NFT standard) whose mint +/// authority is the program's mint-authority PDA, and attaches an on-chain +/// Metaplex metadata account to it (name, symbol, URI). +/// +/// Accounts: +/// 0. `[signer, writable]` mint account (a fresh keypair to initialize) +/// 1. `[]` mint authority PDA (also the metadata update authority) +/// 2. `[writable]` metadata account (the Metaplex metadata PDA) +/// 3. `[signer, writable]` payer (funds the new accounts) +/// 4. `[]` system program +/// 5. `[]` token program +/// 6. `[]` token metadata program +/// +/// Instruction data: Borsh `[name: string, symbol: string, uri: string]`. +/// +/// The mint authority is the program-derived address, so the metadata CPI (which +/// requires the mint authority to sign) is authorized with the PDA's seeds via +/// `invoke_signed` rather than a wallet signature. +pub fn create_token(program_id: &Address, accounts: &[AccountView], data: &[u8]) -> ProgramResult { + // `token_program` and `token_metadata_program` are unused directly, but must + // be supplied so they are present in the transaction for the CPIs below. + let [mint_account, mint_authority, metadata_account, payer, system_program, _token_program, _token_metadata_program] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let args = CreateTokenArgs::parse(data)?; + + // Recover the PDA bump recorded by `init` and confirm the supplied account is + // the canonical mint-authority PDA. + let bump = MintAuthorityPda::deserialize(&mint_authority.try_borrow()?)?.bump; + let pda = derive_address( + &[MintAuthorityPda::SEED_PREFIX], + Some(bump), + program_id.as_array(), + ); + if mint_authority.address().as_array() != &pda { + return Err(ProgramError::InvalidSeeds); + } + + // Fund the mint account with enough lamports to stay rent-exempt. + let lamports = Rent::get()?.try_minimum_balance(MINT_SIZE)?; + + log!("Creating mint account"); + CreateAccount { + from: payer, + to: mint_account, + lamports, + space: MINT_SIZE as u64, + owner: &pinocchio_token::ID, + } + .invoke()?; + + log!("Initializing mint account"); + InitializeMint2 { + mint: mint_account, + decimals: TOKEN_DECIMALS, + mint_authority: mint_authority.address(), + freeze_authority: Some(mint_authority.address()), + } + .invoke()?; + + log!("Creating metadata account"); + let metadata_data = build_metadata_data(&args); + let metadata_accounts = [ + InstructionAccount::writable(metadata_account.address()), + InstructionAccount::readonly(mint_account.address()), + InstructionAccount::readonly_signer(mint_authority.address()), + InstructionAccount::writable_signer(payer.address()), + // Update authority — recorded only, not required to sign for V3. + InstructionAccount::readonly(mint_authority.address()), + InstructionAccount::readonly(system_program.address()), + ]; + let instruction = InstructionView { + program_id: &TOKEN_METADATA_PROGRAM_ID, + accounts: &metadata_accounts, + data: &metadata_data, + }; + + // Sign for the mint-authority PDA. + let bump_bytes = [bump]; + let seeds = [ + Seed::from(MintAuthorityPda::SEED_PREFIX), + Seed::from(&bump_bytes), + ]; + let signers = [Signer::from(&seeds)]; + + invoke_signed( + &instruction, + &[ + metadata_account, + mint_account, + mint_authority, + payer, + mint_authority, + system_program, + ], + &signers, + )?; + + log!("Token mint created successfully"); + Ok(()) +} + +/// 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`. Mirrors the values used by +/// the `anchor` and `native` examples (no royalties, no creators, immutable). +fn build_metadata_data(args: &CreateTokenArgs) -> Vec { + let mut data = Vec::new(); + data.push(CREATE_METADATA_ACCOUNT_V3); + + // DataV2 + push_borsh_string(&mut data, args.name); + push_borsh_string(&mut data, args.symbol); + push_borsh_string(&mut data, args.uri); + data.extend_from_slice(&0u16.to_le_bytes()); // seller_fee_basis_points + data.push(0); // creators: None + data.push(0); // collection: None + data.push(0); // uses: None + + data.push(0); // is_mutable: false + data.push(0); // collection_details: None + + data +} + +/// 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/pda-mint-authority/pinocchio/program/src/instructions/init.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs new file mode 100644 index 000000000..e0619c64e --- /dev/null +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs @@ -0,0 +1,64 @@ +use pinocchio::{ + cpi::{Seed, Signer}, + error::ProgramError, + sysvars::{rent::Rent, Sysvar}, + AccountView, Address, ProgramResult, +}; +use pinocchio_log::log; +use pinocchio_pubkey::derive_address; +use pinocchio_system::instructions::CreateAccount; + +use crate::state::MintAuthorityPda; + +/// Creates the mint-authority PDA account and stores its canonical bump. +/// +/// The PDA (`[b"mint_authority"]`) becomes the mint and freeze authority for +/// every token minted by this program, so a single program-owned address — not +/// any wallet — controls minting. +/// +/// Accounts: +/// 0. `[writable]` mint authority PDA (created here) +/// 1. `[signer, writable]` payer (funds the new account) +/// 2. `[]` system program +/// +/// Instruction data: `[bump: u8]` (the canonical bump for the PDA). +pub fn init(program_id: &Address, accounts: &[AccountView], data: &[u8]) -> ProgramResult { + let [mint_authority, payer, _system_program] = accounts else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + let bump = *data.first().ok_or(ProgramError::InvalidInstructionData)?; + + // Verify the supplied account is the canonical PDA for this bump. + let pda = derive_address( + &[MintAuthorityPda::SEED_PREFIX], + Some(bump), + program_id.as_array(), + ); + if mint_authority.address().as_array() != &pda { + return Err(ProgramError::InvalidSeeds); + } + + let lamports = Rent::get()?.try_minimum_balance(MintAuthorityPda::ACCOUNT_SPACE)?; + let bump_bytes = [bump]; + let seeds = [ + Seed::from(MintAuthorityPda::SEED_PREFIX), + Seed::from(&bump_bytes), + ]; + let signers = [Signer::from(&seeds)]; + + log!("Creating mint authority PDA"); + CreateAccount { + from: payer, + to: mint_authority, + lamports, + space: MintAuthorityPda::ACCOUNT_SPACE as u64, + owner: program_id, + } + .invoke_signed(&signers)?; + + MintAuthorityPda { bump }.serialize(&mut mint_authority.try_borrow_mut()?)?; + + log!("Mint authority PDA created successfully"); + Ok(()) +} diff --git a/tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs new file mode 100644 index 000000000..b1c2c5d97 --- /dev/null +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs @@ -0,0 +1,139 @@ +use alloc::vec::Vec; + +use pinocchio::{ + cpi::{invoke_signed, Seed, Signer}, + error::ProgramError, + instruction::{InstructionAccount, InstructionView}, + AccountView, Address, ProgramResult, +}; +use pinocchio_associated_token_account::instructions::CreateIdempotent; +use pinocchio_log::log; +use pinocchio_pubkey::derive_address; +use pinocchio_token::instructions::MintTo; + +use crate::instructions::TOKEN_METADATA_PROGRAM_ID; +use crate::state::MintAuthorityPda; + +/// Discriminator of the Metaplex `CreateMasterEditionV3` instruction (variant 17 +/// of the Token Metadata program's instruction enum). +const CREATE_MASTER_EDITION_V3: u8 = 17; + +/// Mints the single NFT token to the payer's associated token account and then +/// creates its master edition account. Both the `MintTo` and the master edition +/// CPIs require the mint authority to sign; since that authority is the program's +/// mint-authority PDA, they are authorized with the PDA's seeds via +/// `invoke_signed`. +/// +/// Accounts: +/// 0. `[writable]` mint account +/// 1. `[writable]` metadata account +/// 2. `[writable]` master edition account (the edition PDA) +/// 3. `[]` mint authority PDA (also the metadata update authority) +/// 4. `[writable]` payer's associated token account (the destination) +/// 5. `[signer, writable]` payer (funds the accounts and owns the NFT) +/// 6. `[]` system program +/// 7. `[]` token program +/// 8. `[]` associated token program +/// 9. `[]` token metadata program +/// +/// Instruction data: none. +pub fn mint_to(program_id: &Address, accounts: &[AccountView]) -> ProgramResult { + // `associated_token_program` and `token_metadata_program` are unused + // directly, but must be supplied so they are present for the CPIs below. + let [mint_account, metadata_account, edition_account, mint_authority, associated_token_account, payer, system_program, token_program, _associated_token_program, _token_metadata_program] = + accounts + else { + return Err(ProgramError::NotEnoughAccountKeys); + }; + + // Recover the PDA bump recorded by `init` and confirm the supplied account is + // the canonical mint-authority PDA. + let bump = MintAuthorityPda::deserialize(&mint_authority.try_borrow()?)?.bump; + let pda = derive_address( + &[MintAuthorityPda::SEED_PREFIX], + Some(bump), + program_id.as_array(), + ); + if mint_authority.address().as_array() != &pda { + return Err(ProgramError::InvalidSeeds); + } + + // Signer seeds for the mint-authority PDA, reused by both CPIs below. + let bump_bytes = [bump]; + let seeds = [ + Seed::from(MintAuthorityPda::SEED_PREFIX), + Seed::from(&bump_bytes), + ]; + let signers = [Signer::from(&seeds)]; + + log!("Creating associated token account if needed"); + CreateIdempotent { + funding_account: payer, + account: associated_token_account, + wallet: payer, + mint: mint_account, + system_program, + token_program, + } + .invoke()?; + + log!("Minting NFT to associated token account"); + MintTo { + mint: mint_account, + account: associated_token_account, + mint_authority, + amount: 1, + } + .invoke_signed(&signers)?; + + // Create the master edition. This is what makes the token a real NFT: the + // Token Metadata program takes over the mint and freeze authorities, so no + // further tokens can ever be minted from this mint. + log!("Creating master edition account"); + let edition_data = build_master_edition_data(); + let edition_accounts = [ + InstructionAccount::writable(edition_account.address()), + InstructionAccount::writable(mint_account.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_account.address()), + InstructionAccount::readonly(token_program.address()), + InstructionAccount::readonly(system_program.address()), + ]; + let instruction = InstructionView { + program_id: &TOKEN_METADATA_PROGRAM_ID, + accounts: &edition_accounts, + data: &edition_data, + }; + invoke_signed( + &instruction, + &[ + edition_account, + mint_account, + mint_authority, + mint_authority, + payer, + metadata_account, + token_program, + system_program, + ], + &signers, + )?; + + log!("NFT minted successfully"); + Ok(()) +} + +/// Serializes the data for a Metaplex `CreateMasterEditionV3` instruction. +/// +/// Layout: `[17] max_supply:Option`. A `max_supply` of `Some(1)` caps the +/// number of printable editions, mirroring the `native` example. +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(&1u64.to_le_bytes()); // max_supply value + data +} diff --git a/tokens/pda-mint-authority/pinocchio/program/src/instructions/mod.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/mod.rs new file mode 100644 index 000000000..9f37ee7d6 --- /dev/null +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/mod.rs @@ -0,0 +1,59 @@ +use pinocchio::error::ProgramError; + +mod create; +mod init; +mod mint; + +pub use create::*; +pub use init::*; +pub use mint::*; + +/// 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; + +/// The Metaplex Token Metadata program ID +/// (`metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s`). +pub const TOKEN_METADATA_PROGRAM_ID: pinocchio::Address = + pinocchio::Address::from_str_const("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"); + +/// Borsh-encoded arguments for the `Create` instruction. +/// +/// Field order matches the `native` example's `CreateTokenArgs`. +pub struct CreateTokenArgs<'a> { + pub name: &'a [u8], + pub symbol: &'a [u8], + pub uri: &'a [u8], +} + +impl<'a> CreateTokenArgs<'a> { + /// Parses the instruction data: three Borsh strings (title, symbol, uri). + pub fn parse(data: &'a [u8]) -> Result { + let mut offset = 0; + let name = read_borsh_string(data, &mut offset)?; + let symbol = read_borsh_string(data, &mut offset)?; + let uri = read_borsh_string(data, &mut offset)?; + Ok(Self { name, symbol, uri }) + } +} + +/// Reads a Borsh `string` (a 4-byte little-endian length prefix followed by that +/// many UTF-8 bytes) starting at `*offset`, advancing `offset` past it. +fn read_borsh_string<'a>(data: &'a [u8], offset: &mut usize) -> Result<&'a [u8], ProgramError> { + let len_bytes: [u8; 4] = data + .get(*offset..*offset + 4) + .ok_or(ProgramError::InvalidInstructionData)? + .try_into() + .map_err(|_| ProgramError::InvalidInstructionData)?; + let len = u32::from_le_bytes(len_bytes) as usize; + *offset += 4; + + let bytes = data + .get(*offset..*offset + len) + .ok_or(ProgramError::InvalidInstructionData)?; + *offset += len; + Ok(bytes) +} diff --git a/tokens/pda-mint-authority/pinocchio/program/src/lib.rs b/tokens/pda-mint-authority/pinocchio/program/src/lib.rs new file mode 100644 index 000000000..8dafd1e0f --- /dev/null +++ b/tokens/pda-mint-authority/pinocchio/program/src/lib.rs @@ -0,0 +1,15 @@ +#![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; +pub mod state; + +use pinocchio::{entrypoint, nostd_panic_handler}; + +entrypoint!(processor::process_instruction); +nostd_panic_handler!(); diff --git a/tokens/pda-mint-authority/pinocchio/program/src/processor.rs b/tokens/pda-mint-authority/pinocchio/program/src/processor.rs new file mode 100644 index 000000000..d6fb902ad --- /dev/null +++ b/tokens/pda-mint-authority/pinocchio/program/src/processor.rs @@ -0,0 +1,37 @@ +use pinocchio::{error::ProgramError, AccountView, Address, ProgramResult}; +use pinocchio_log::log; + +use crate::instructions::{create_token, init, mint_to}; + +/// Dispatches an instruction based on its leading discriminator byte. +/// +/// The discriminator is the Borsh enum variant index, matching the `native` +/// example's `MyInstruction`: +/// - `0` -> Init (args: `[bump: u8]`) +/// - `1` -> Create (args: `[title: string, symbol: string, uri: string]`) +/// - `2` -> Mint (no args) +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: Init"); + init(program_id, accounts, args) + } + 1 => { + log!("Instruction: Create"); + create_token(program_id, accounts, args) + } + 2 => { + log!("Instruction: Mint"); + mint_to(program_id, accounts) + } + _ => Err(ProgramError::InvalidInstructionData), + } +} diff --git a/tokens/pda-mint-authority/pinocchio/program/src/state.rs b/tokens/pda-mint-authority/pinocchio/program/src/state.rs new file mode 100644 index 000000000..8455331cb --- /dev/null +++ b/tokens/pda-mint-authority/pinocchio/program/src/state.rs @@ -0,0 +1,33 @@ +use pinocchio::error::ProgramError; + +/// Persistent record stored in the mint-authority PDA. +/// +/// The PDA is derived from `[b"mint_authority"]` and acts as the mint and +/// freeze authority for every token this program creates. Persisting the +/// canonical bump lets later instructions rebuild the signer seeds without +/// re-deriving the address on-chain. +pub struct MintAuthorityPda { + /// Canonical bump for the mint-authority PDA. + pub bump: u8, +} + +impl MintAuthorityPda { + /// Seed for the mint-authority PDA: `[SEED_PREFIX]`. + pub const SEED_PREFIX: &'static [u8] = b"mint_authority"; + + /// Bytes allocated for the account. Mirrors the `native` example (8 + 8); + /// only the first byte (the bump) is meaningful. + pub const ACCOUNT_SPACE: usize = 16; + + /// Writes the bump into the first byte of `dst`. + pub fn serialize(&self, dst: &mut [u8]) -> Result<(), ProgramError> { + *dst.first_mut().ok_or(ProgramError::AccountDataTooSmall)? = self.bump; + Ok(()) + } + + /// Reads the bump from the first byte of `src`. + pub fn deserialize(src: &[u8]) -> Result { + let bump = *src.first().ok_or(ProgramError::InvalidAccountData)?; + Ok(Self { bump }) + } +} diff --git a/tokens/pda-mint-authority/pinocchio/tests/test.ts b/tokens/pda-mint-authority/pinocchio/tests/test.ts new file mode 100644 index 000000000..9ad106133 --- /dev/null +++ b/tokens/pda-mint-authority/pinocchio/tests/test.ts @@ -0,0 +1,178 @@ +import { Buffer } from "node:buffer"; +import { Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction } from "@solana/web3.js"; +import * as borsh from "borsh"; +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"); + +// Instruction discriminators (the Borsh enum variant index). +const INIT = 0; +const CREATE = 1; +const MINT = 2; + +// Borsh schema for the Create instruction data, matching the program's +// `CreateTokenArgs` (and the native example's wire format). +const CreateTokenArgsSchema: borsh.Schema = { + struct: { + instruction: "u8", + nft_title: "string", + nft_symbol: "string", + nft_uri: "string", + }, +}; + +function getMintAuthorityPda(programId: PublicKey): [PublicKey, number] { + return PublicKey.findProgramAddressSync([Buffer.from("mint_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("PDA Mint Authority (Pinocchio)", async () => { + const PROGRAM_ID = PublicKey.unique(); + const context = await start( + [ + { name: "pda_mint_authority_pinocchio_program", programId: PROGRAM_ID }, + { name: "token_metadata", programId: TOKEN_METADATA_PROGRAM_ID }, + ], + [], + ); + const client = context.banksClient; + const payer = context.payer; + + const mintKeypair = Keypair.generate(); + const [mintAuthorityPda, mintAuthorityBump] = getMintAuthorityPda(PROGRAM_ID); + + 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("Initialize the mint authority PDA!", async () => { + const ix = new TransactionInstruction({ + programId: PROGRAM_ID, + keys: [ + { pubkey: mintAuthorityPda, isSigner: false, isWritable: true }, // mint authority PDA + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // payer + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // system program + ], + data: Buffer.from([INIT, mintAuthorityBump]), + }); + + await sendInstruction(ix, [payer]); + + const pdaAccount = await client.getAccount(mintAuthorityPda); + if (pdaAccount === null) throw new Error("Mint authority PDA not found"); + assert.deepEqual(pdaAccount.owner.toBytes(), PROGRAM_ID.toBytes()); + // The program persists the canonical bump in the first byte. + assert.equal(pdaAccount.data[0], mintAuthorityBump); + }); + + it("Create an NFT!", async () => { + const metadataAddress = getMetadataAddress(mintKeypair.publicKey); + + const data = Buffer.from( + borsh.serialize(CreateTokenArgsSchema, { + instruction: CREATE, + nft_title: "Homer NFT", + nft_symbol: "HOMR", + nft_uri: + "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json", + }), + ); + + const ix = new TransactionInstruction({ + programId: PROGRAM_ID, + keys: [ + { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // mint account + { pubkey: mintAuthorityPda, isSigner: false, isWritable: false }, // mint authority PDA + { pubkey: metadataAddress, isSigner: false, isWritable: true }, // metadata account + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // payer + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // system program + { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // token program + { pubkey: TOKEN_METADATA_PROGRAM_ID, isSigner: false, isWritable: false }, // token metadata program + ], + data, + }); + + await sendInstruction(ix, [payer, mintKeypair]); + + const mintAccount = await client.getAccount(mintKeypair.publicKey); + if (mintAccount === null) throw new Error("Mint account not found"); + assert.deepEqual(mintAccount.owner.toBytes(), TOKEN_PROGRAM_ID.toBytes()); + + const metadataAccount = await client.getAccount(metadataAddress); + if (metadataAccount === null) throw new Error("Metadata account not found"); + assert.deepEqual(metadataAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + assert.isTrue(Buffer.from(metadataAccount.data).toString("utf-8").includes("Homer NFT")); + }); + + it("Mint the NFT to your wallet!", async () => { + const metadataAddress = getMetadataAddress(mintKeypair.publicKey); + const editionAddress = getMasterEditionAddress(mintKeypair.publicKey); + const ata = getAssociatedTokenAddress(mintKeypair.publicKey, payer.publicKey); + + const ix = new TransactionInstruction({ + programId: PROGRAM_ID, + keys: [ + { pubkey: mintKeypair.publicKey, isSigner: false, isWritable: true }, // mint account + { pubkey: metadataAddress, isSigner: false, isWritable: true }, // metadata account + { pubkey: editionAddress, isSigner: false, isWritable: true }, // master edition account + { pubkey: mintAuthorityPda, isSigner: false, isWritable: false }, // mint authority PDA + { pubkey: ata, isSigner: false, isWritable: true }, // associated token account + { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // payer + { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // system program + { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // token program + { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // associated token program + { pubkey: TOKEN_METADATA_PROGRAM_ID, isSigner: false, isWritable: false }, // token metadata program + ], + data: Buffer.from([MINT]), + }); + + await sendInstruction(ix, [payer]); + + // The NFT (a single token) landed in the payer's associated token account. + const ataAccount = await client.getAccount(ata); + if (ataAccount === null) throw new Error("Associated token account not found"); + assert.equal(readTokenAmount(ataAccount.data), 1n); + + // The master edition account exists and is owned by the Token Metadata + // program — proof the CreateMasterEditionV3 CPI (signed by the PDA) succeeded. + const editionAccount = await client.getAccount(editionAddress); + if (editionAccount === null) throw new Error("Master edition account not found"); + assert.deepEqual(editionAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + }); +}); diff --git a/tokens/pda-mint-authority/pinocchio/tsconfig.json b/tokens/pda-mint-authority/pinocchio/tsconfig.json new file mode 100644 index 000000000..8c20b2236 --- /dev/null +++ b/tokens/pda-mint-authority/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 2fcf18cf16ae6af3909313cf1528f68f321f0493 Mon Sep 17 00:00:00 2001 From: MarkFeder Date: Thu, 25 Jun 2026 18:55:13 +0200 Subject: [PATCH 2/9] pda-mint-authority pinocchio: dump fixture via per-command -um Use 'solana program dump -um' instead of 'solana config set -um', so running pnpm install no longer permanently switches the developer's Solana CLI cluster to mainnet. --- tokens/pda-mint-authority/pinocchio/prepare.mjs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tokens/pda-mint-authority/pinocchio/prepare.mjs b/tokens/pda-mint-authority/pinocchio/prepare.mjs index 3ffe52750..b7e99c98e 100644 --- a/tokens/pda-mint-authority/pinocchio/prepare.mjs +++ b/tokens/pda-mint-authority/pinocchio/prepare.mjs @@ -21,13 +21,13 @@ 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" }); + // `-um` points this dump at mainnet without mutating the developer's + // global Solana CLI cluster config. + execSync(`solana program dump -um ${id} ${outputFile}`, { stdio: "inherit" }); console.log(`Dumped ${id} -> ${outputFile}`); } } catch (error) { From 12e79e64f2293347fe8a76d38d1b70f1886de062 Mon Sep 17 00:00:00 2001 From: MarkFeder <5670736+MarkFeder@users.noreply.github.com> Date: Wed, 15 Jul 2026 23:27:48 +0200 Subject: [PATCH 3/9] pda-mint-authority 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 test now executing, replace `Rent::try_minimum_balance` (both the mint and the PDA account) 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. --- .../program/src/instructions/create.rs | 11 +++++-- .../program/src/instructions/init.rs | 10 +++++-- .../pinocchio/tests/test.ts | 29 ++++++++++++------- 3 files changed, 35 insertions(+), 15 deletions(-) diff --git a/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs index b0536e3d4..369b65e71 100644 --- a/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs @@ -4,7 +4,7 @@ use pinocchio::{ cpi::{invoke_signed, Seed, Signer}, error::ProgramError, instruction::{InstructionAccount, InstructionView}, - sysvars::{rent::Rent, Sysvar}, + sysvars::rent::{ACCOUNT_STORAGE_OVERHEAD, DEFAULT_LAMPORTS_PER_BYTE}, AccountView, Address, ProgramResult, }; use pinocchio_log::log; @@ -60,8 +60,13 @@ pub fn create_token(program_id: &Address, accounts: &[AccountView], data: &[u8]) return Err(ProgramError::InvalidSeeds); } - // Fund the mint account with enough lamports to stay rent-exempt. - let lamports = Rent::get()?.try_minimum_balance(MINT_SIZE)?; + // Fund the mint account with enough lamports to stay rent-exempt. 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 { diff --git a/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs index e0619c64e..b002dcd45 100644 --- a/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.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_log::log; @@ -39,7 +39,13 @@ pub fn init(program_id: &Address, accounts: &[AccountView], data: &[u8]) -> Prog return Err(ProgramError::InvalidSeeds); } - let lamports = Rent::get()?.try_minimum_balance(MintAuthorityPda::ACCOUNT_SPACE)?; + // Rent 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 + MintAuthorityPda::ACCOUNT_SPACE as u64) + * DEFAULT_LAMPORTS_PER_BYTE; let bump_bytes = [bump]; let seeds = [ Seed::from(MintAuthorityPda::SEED_PREFIX), diff --git a/tokens/pda-mint-authority/pinocchio/tests/test.ts b/tokens/pda-mint-authority/pinocchio/tests/test.ts index 9ad106133..ebc59346a 100644 --- a/tokens/pda-mint-authority/pinocchio/tests/test.ts +++ b/tokens/pda-mint-authority/pinocchio/tests/test.ts @@ -57,19 +57,28 @@ function readTokenAmount(data: Uint8Array): bigint { return Buffer.from(data).readBigUInt64LE(64); } -describe("PDA Mint Authority (Pinocchio)", async () => { +describe("PDA Mint Authority (Pinocchio)", () => { const PROGRAM_ID = PublicKey.unique(); - const context = await start( - [ - { name: "pda_mint_authority_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 mintKeypair = 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: "pda_mint_authority_pinocchio_program", programId: PROGRAM_ID }, + { name: "token_metadata", programId: TOKEN_METADATA_PROGRAM_ID }, + ], + [], + ); + client = context.banksClient; + payer = context.payer; + }); const [mintAuthorityPda, mintAuthorityBump] = getMintAuthorityPda(PROGRAM_ID); async function sendInstruction(ix: TransactionInstruction, signers: Keypair[]) { From c89c34be18d2e55e879eb43ab293d375d37838b0 Mon Sep 17 00:00:00 2001 From: MarkFeder <5670736+MarkFeder@users.noreply.github.com> Date: Wed, 22 Jul 2026 01:04:39 +0200 Subject: [PATCH 4/9] pda-mint-authority 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 mint-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, 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 --- .../pda-mint-authority/pinocchio/package.json | 10 +- .../pinocchio/pnpm-lock.yaml | 1371 ++++++++++++----- .../pinocchio/tests/test.ts | 258 ++-- .../pinocchio/tsconfig.json | 4 +- 4 files changed, 1095 insertions(+), 548 deletions(-) diff --git a/tokens/pda-mint-authority/pinocchio/package.json b/tokens/pda-mint-authority/pinocchio/package.json index a00a1de30..ee585b2ff 100644 --- a/tokens/pda-mint-authority/pinocchio/package.json +++ b/tokens/pda-mint-authority/pinocchio/package.json @@ -8,17 +8,17 @@ "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", + "borsh": "^2.0.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/pda-mint-authority/pinocchio/pnpm-lock.yaml b/tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml index 4b2f4d88c..cda3d2e47 100644 --- a/tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml +++ b/tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml @@ -8,118 +8,448 @@ 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) + '@solana/kit': + specifier: ^6.10.0 + version: 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) borsh: specifier: ^2.0.0 version: 2.0.0 + 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 + + '@solana-program/token@0.14.0': + resolution: {integrity: sha512-zpLMr6JZndlsQCQvrm0gezfwdr1lmzOGqN6v2WIYXjtDmbF+xg6zh/MAp2UFHRpv3uDmylEdjtQo05pa2OeaYg==} + engines: {node: '>=24.0.0'} + peerDependencies: + '@solana/kit': ^6.5.0 + + '@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/addresses@6.10.0': + resolution: {integrity: sha512-vEoCGBTxG0HCERAn84KXkrJjl+pDaNzOpZ0qbgcPS98fYxP5yzbKB8SNOY2bzrbkRUmmw5Q3hqTRERemUN2Gcw==} + 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'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true - '@noble/curves@1.9.7': - resolution: {integrity: sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw==} - engines: {node: ^14.21.3 || >=16} + '@solana/codecs-core@6.10.0': + resolution: {integrity: sha512-nfAl9OMGo4HanIMxGsQoVB7BxMoqBCYEUxl8oEAZZ09pDxnaXQZkTRXEwPPccag37XfW1ciPd1vWPKwB2b0HHQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true - '@noble/hashes@1.8.0': - resolution: {integrity: sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==} - engines: {node: ^14.21.3 || >=16} + '@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/buffer-layout@4.0.1': - resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} - engines: {node: '>=5.10'} + '@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-core@2.3.0': - resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} + '@solana/codecs-strings@6.10.0': + resolution: {integrity: sha512-zlaqkg7K6F6IN4V/Ec8TWkTn054gxv7ZLagvGkuEyAdPQ6BzzsehOm2TqCuyXgJJTCGPLY1bEk6yH9NxANe0kA==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.3.3' + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.4.0' + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true - '@solana/codecs-numbers@2.3.0': - resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} + '@solana/codecs@6.10.0': + resolution: {integrity: sha512-lLVuxod4ChWp9i7OvpgIykYG8Q9OGPVXKnHM9VlzDDLylsx7Y1FoQL00sHa7PqFkJVmkBufaA6dcGbQ7FU+lAQ==} engines: {node: '>=20.18.0'} peerDependencies: - typescript: '>=5.3.3' + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true - '@solana/errors@2.3.0': - resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} + '@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/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@6.10.0': + resolution: {integrity: sha512-yQdbWw5mZEWrwsunHR9NHkuhMXIB9sPOObwm18D53v5tAJnxTB0IcHvO647XqFDLTK/yQ4AdDtlYD1vsY07AMQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.4.0' + peerDependenciesMeta: + typescript: + optional: true + + '@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/web3.js@1.98.4': - resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + '@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 - '@swc/helpers@0.5.21': - resolution: {integrity: sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==} + '@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 - '@types/bn.js@5.2.0': - resolution: {integrity: sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q==} + '@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,22 +479,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==} @@ -178,15 +496,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 +536,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 +560,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 +571,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 +579,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 +626,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 +664,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 +760,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 +805,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 +818,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 +834,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 +842,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 +861,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 +895,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 +933,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 - '@types/connect@3.4.38': + '@solana/rpc-spec@6.10.0(typescript@5.9.3)': dependencies: - '@types/node': 12.20.55 + '@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/json5@0.0.29': - optional: true + '@solana/rpc-subscriptions-api@6.10.0(typescript@5.9.3)': + dependencies: + '@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/mocha@9.1.1': {} + '@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 + + '@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 - agentkeepalive@4.6.0: + '@types/mocha@9.1.1': {} + + '@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,22 +1447,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: @@ -850,17 +1462,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 +1516,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 +1532,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 +1581,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 +1608,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 +1715,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 +1750,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 +1763,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 +1778,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 +1786,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 +1816,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 +1843,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/pda-mint-authority/pinocchio/tests/test.ts b/tokens/pda-mint-authority/pinocchio/tests/test.ts index ebc59346a..4b2985afe 100644 --- a/tokens/pda-mint-authority/pinocchio/tests/test.ts +++ b/tokens/pda-mint-authority/pinocchio/tests/test.ts @@ -1,15 +1,29 @@ 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 * as borsh from "borsh"; 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"); +// 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"); // Instruction discriminators (the Borsh enum variant index). const INIT = 0; @@ -27,91 +41,110 @@ const CreateTokenArgsSchema: borsh.Schema = { }, }; -function getMintAuthorityPda(programId: PublicKey): [PublicKey, number] { - return PublicKey.findProgramAddressSync([Buffer.from("mint_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, "pda_mint_authority_pinocchio_program.so"); +const TOKEN_METADATA_SO = path.join(FIXTURES, "token_metadata.so"); -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]; +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; } -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("PDA Mint Authority (Pinocchio)", () => { - const PROGRAM_ID = PublicKey.unique(); - let context: Awaited>; - let client: (typeof context)["banksClient"]; - let payer: (typeof context)["payer"]; + let svm: LiteSVM; + let programId: ReturnType; + let payer: Awaited>; + let mint: Awaited>; + let mintAuthorityPda: ReturnType; + let mintAuthorityBump: number; - const mintKeypair = 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: "pda_mint_authority_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 mint is created in the Create test and reused (as a non-signer) by the + // Mint test, so it is generated once for the whole suite. + mint = await generateKeyPairSigner(); + + // The mint authority is a PDA of the program; its canonical bump is passed + // into Init and later used by the program to sign CPIs (invoke_signed). + const [pda, bump] = await getProgramDerivedAddress({ + programAddress: programId, + seeds: ["mint_authority"], + }); + mintAuthorityPda = pda; + mintAuthorityBump = bump; }); - const [mintAuthorityPda, mintAuthorityBump] = getMintAuthorityPda(PROGRAM_ID); - - 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("Initialize the mint authority PDA!", async () => { - const ix = new TransactionInstruction({ - programId: PROGRAM_ID, - keys: [ - { pubkey: mintAuthorityPda, isSigner: false, isWritable: true }, // mint authority PDA - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // payer - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // system program + await send({ + programAddress: programId, + accounts: [ + { address: mintAuthorityPda, role: AccountRole.WRITABLE }, // mint authority PDA + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer + { address: SYSTEM_PROGRAM_ID, role: AccountRole.READONLY }, // system program ], - data: Buffer.from([INIT, mintAuthorityBump]), + data: new Uint8Array([INIT, mintAuthorityBump]), }); - await sendInstruction(ix, [payer]); - - const pdaAccount = await client.getAccount(mintAuthorityPda); - if (pdaAccount === null) throw new Error("Mint authority PDA not found"); - assert.deepEqual(pdaAccount.owner.toBytes(), PROGRAM_ID.toBytes()); + const pdaAccount = svm.getAccount(mintAuthorityPda); + if (!pdaAccount?.exists) throw new Error("Mint authority PDA not found"); + assert.equal(pdaAccount.programAddress, programId); // The program persists the canonical bump in the first byte. assert.equal(pdaAccount.data[0], mintAuthorityBump); }); it("Create an NFT!", async () => { - const metadataAddress = getMetadataAddress(mintKeypair.publicKey); + const metadataAddress = await getMetadataAddress(mint.address); const data = Buffer.from( borsh.serialize(CreateTokenArgsSchema, { @@ -123,65 +156,62 @@ describe("PDA Mint Authority (Pinocchio)", () => { }), ); - const ix = new TransactionInstruction({ - programId: PROGRAM_ID, - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: true, isWritable: true }, // mint account - { pubkey: mintAuthorityPda, isSigner: false, isWritable: false }, // mint authority PDA - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // metadata account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // payer - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // system program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // token program - { pubkey: TOKEN_METADATA_PROGRAM_ID, isSigner: false, isWritable: false }, // token metadata program + await send({ + programAddress: programId, + accounts: [ + { address: mint.address, role: AccountRole.WRITABLE_SIGNER, signer: mint }, // mint account + { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA + { address: metadataAddress, role: AccountRole.WRITABLE }, // metadata account + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer + { address: SYSTEM_PROGRAM_ID, role: AccountRole.READONLY }, // system program + { address: TOKEN_PROGRAM_ID, role: AccountRole.READONLY }, // token program + { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program ], - data, + data: new Uint8Array(data), }); - await sendInstruction(ix, [payer, mintKeypair]); - - const mintAccount = await client.getAccount(mintKeypair.publicKey); - if (mintAccount === null) throw new Error("Mint account not found"); - assert.deepEqual(mintAccount.owner.toBytes(), TOKEN_PROGRAM_ID.toBytes()); + const mintAccount = svm.getAccount(mint.address); + if (!mintAccount?.exists) throw new Error("Mint account not found"); + assert.equal(mintAccount.programAddress, TOKEN_PROGRAM_ID); - const metadataAccount = await client.getAccount(metadataAddress); - if (metadataAccount === null) throw new Error("Metadata account not found"); - assert.deepEqual(metadataAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + const metadataAccount = svm.getAccount(metadataAddress); + if (!metadataAccount?.exists) throw new Error("Metadata account not found"); + assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); assert.isTrue(Buffer.from(metadataAccount.data).toString("utf-8").includes("Homer NFT")); }); it("Mint the NFT to your wallet!", async () => { - const metadataAddress = getMetadataAddress(mintKeypair.publicKey); - const editionAddress = getMasterEditionAddress(mintKeypair.publicKey); - const ata = getAssociatedTokenAddress(mintKeypair.publicKey, payer.publicKey); - - const ix = new TransactionInstruction({ - programId: PROGRAM_ID, - keys: [ - { pubkey: mintKeypair.publicKey, isSigner: false, isWritable: true }, // mint account - { pubkey: metadataAddress, isSigner: false, isWritable: true }, // metadata account - { pubkey: editionAddress, isSigner: false, isWritable: true }, // master edition account - { pubkey: mintAuthorityPda, isSigner: false, isWritable: false }, // mint authority PDA - { pubkey: ata, isSigner: false, isWritable: true }, // associated token account - { pubkey: payer.publicKey, isSigner: true, isWritable: true }, // payer - { pubkey: SystemProgram.programId, isSigner: false, isWritable: false }, // system program - { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // token program - { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false }, // associated token program - { pubkey: TOKEN_METADATA_PROGRAM_ID, isSigner: false, isWritable: false }, // token metadata program + const metadataAddress = await getMetadataAddress(mint.address); + const editionAddress = await getMasterEditionAddress(mint.address); + const ata = await getAssociatedTokenAddress(mint.address, payer.address); + + await send({ + programAddress: programId, + accounts: [ + { address: mint.address, role: AccountRole.WRITABLE }, // mint account + { address: metadataAddress, role: AccountRole.WRITABLE }, // metadata account + { address: editionAddress, role: AccountRole.WRITABLE }, // master edition account + { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA + { address: ata, role: AccountRole.WRITABLE }, // associated token account + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer + { 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]), + data: new Uint8Array([MINT]), }); - await sendInstruction(ix, [payer]); - // The NFT (a single token) landed in the payer's associated token account. - const ataAccount = await client.getAccount(ata); - if (ataAccount === null) throw new Error("Associated token account not found"); - assert.equal(readTokenAmount(ataAccount.data), 1n); + const ataAccount = svm.getAccount(ata); + if (!ataAccount?.exists) throw new Error("Associated token account not found"); + const amount = Buffer.from(ataAccount.data).readBigUInt64LE(TOKEN_ACCOUNT_AMOUNT_OFFSET); + assert.equal(amount, 1n); // The master edition account exists and is owned by the Token Metadata // program — proof the CreateMasterEditionV3 CPI (signed by the PDA) succeeded. - const editionAccount = await client.getAccount(editionAddress); - if (editionAccount === null) throw new Error("Master edition account not found"); - assert.deepEqual(editionAccount.owner.toBytes(), TOKEN_METADATA_PROGRAM_ID.toBytes()); + const editionAccount = svm.getAccount(editionAddress); + if (!editionAccount?.exists) throw new Error("Master edition account not found"); + assert.equal(editionAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); }); }); diff --git a/tokens/pda-mint-authority/pinocchio/tsconfig.json b/tokens/pda-mint-authority/pinocchio/tsconfig.json index 8c20b2236..032d00180 100644 --- a/tokens/pda-mint-authority/pinocchio/tsconfig.json +++ b/tokens/pda-mint-authority/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 49bcc9b22287b740a7c51dbf38ba932eb439e72d Mon Sep 17 00:00:00 2001 From: MarkFeder <5670736+MarkFeder@users.noreply.github.com> Date: Thu, 23 Jul 2026 21:22:22 +0200 Subject: [PATCH 5/9] pda-mint-authority 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(..)? in both the Init (PDA account) and Create (mint) 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 from the official @solana-program/token and @solana-program/system 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. --- .../pda-mint-authority/pinocchio/package.json | 2 ++ .../pinocchio/pnpm-lock.yaml | 6 ++++ .../program/src/instructions/create.rs | 13 +++---- .../program/src/instructions/init.rs | 12 +++---- .../pinocchio/tests/test.ts | 36 +++++++++---------- .../pinocchio/tsconfig.json | 3 +- 6 files changed, 37 insertions(+), 35 deletions(-) diff --git a/tokens/pda-mint-authority/pinocchio/package.json b/tokens/pda-mint-authority/pinocchio/package.json index ee585b2ff..d484fa2da 100644 --- a/tokens/pda-mint-authority/pinocchio/package.json +++ b/tokens/pda-mint-authority/pinocchio/package.json @@ -8,6 +8,8 @@ "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", "borsh": "^2.0.0", "litesvm": "^1.3.0" diff --git a/tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml b/tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml index cda3d2e47..b95201dea 100644 --- a/tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml +++ b/tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml @@ -8,6 +8,12 @@ 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) diff --git a/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs index 369b65e71..485b06865 100644 --- a/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs @@ -4,7 +4,7 @@ use pinocchio::{ cpi::{invoke_signed, Seed, Signer}, error::ProgramError, instruction::{InstructionAccount, InstructionView}, - sysvars::rent::{ACCOUNT_STORAGE_OVERHEAD, DEFAULT_LAMPORTS_PER_BYTE}, + sysvars::{rent::Rent, Sysvar}, AccountView, Address, ProgramResult, }; use pinocchio_log::log; @@ -60,13 +60,10 @@ pub fn create_token(program_id: &Address, accounts: &[AccountView], data: &[u8]) return Err(ProgramError::InvalidSeeds); } - // Fund the mint account with enough lamports to stay rent-exempt. 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; + // Fund the mint account with enough lamports to stay rent-exempt, read from + // the Rent sysvar. + let rent = Rent::get()?; + let lamports = rent.try_minimum_balance(MINT_SIZE)?; log!("Creating mint account"); CreateAccount { diff --git a/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs index b002dcd45..73eba7776 100644 --- a/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.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_log::log; @@ -39,13 +39,9 @@ pub fn init(program_id: &Address, accounts: &[AccountView], data: &[u8]) -> Prog return Err(ProgramError::InvalidSeeds); } - // Rent 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 + MintAuthorityPda::ACCOUNT_SPACE as u64) - * DEFAULT_LAMPORTS_PER_BYTE; + // Rent-exempt minimum for the PDA account, read from the Rent sysvar. + let rent = Rent::get()?; + let lamports = rent.try_minimum_balance(MintAuthorityPda::ACCOUNT_SPACE)?; let bump_bytes = [bump]; let seeds = [ Seed::from(MintAuthorityPda::SEED_PREFIX), diff --git a/tokens/pda-mint-authority/pinocchio/tests/test.ts b/tokens/pda-mint-authority/pinocchio/tests/test.ts index 4b2985afe..0c9463cec 100644 --- a/tokens/pda-mint-authority/pinocchio/tests/test.ts +++ b/tokens/pda-mint-authority/pinocchio/tests/test.ts @@ -13,17 +13,18 @@ import { setTransactionMessageFeePayerSigner, signTransactionMessageWithSigners, } from "@solana/kit"; +import { SYSTEM_PROGRAM_ADDRESS } from "@solana-program/system"; +import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS, getTokenDecoder, TOKEN_PROGRAM_ADDRESS } from "@solana-program/token"; import * as borsh from "borsh"; 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 come from the official +// @solana-program/token client. 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"); // Instruction discriminators (the Borsh enum variant index). const INIT = 0; @@ -41,9 +42,6 @@ const CreateTokenArgsSchema: borsh.Schema = { }, }; -// 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. @@ -71,8 +69,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; } @@ -131,7 +129,7 @@ describe("PDA Mint Authority (Pinocchio)", () => { accounts: [ { address: mintAuthorityPda, role: AccountRole.WRITABLE }, // mint authority PDA { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer - { address: SYSTEM_PROGRAM_ID, role: AccountRole.READONLY }, // system program + { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program ], data: new Uint8Array([INIT, mintAuthorityBump]), }); @@ -163,8 +161,8 @@ describe("PDA Mint Authority (Pinocchio)", () => { { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA { address: metadataAddress, role: AccountRole.WRITABLE }, // metadata account { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer - { address: SYSTEM_PROGRAM_ID, role: AccountRole.READONLY }, // system program - { address: TOKEN_PROGRAM_ID, role: AccountRole.READONLY }, // token program + { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program + { address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // token program { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program ], data: new Uint8Array(data), @@ -172,7 +170,7 @@ describe("PDA Mint Authority (Pinocchio)", () => { const mintAccount = svm.getAccount(mint.address); if (!mintAccount?.exists) throw new Error("Mint account not found"); - assert.equal(mintAccount.programAddress, TOKEN_PROGRAM_ID); + assert.equal(mintAccount.programAddress, TOKEN_PROGRAM_ADDRESS); const metadataAccount = svm.getAccount(metadataAddress); if (!metadataAccount?.exists) throw new Error("Metadata account not found"); @@ -194,9 +192,9 @@ describe("PDA Mint Authority (Pinocchio)", () => { { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA { address: ata, role: AccountRole.WRITABLE }, // associated token account { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer - { 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]), @@ -205,7 +203,9 @@ describe("PDA Mint Authority (Pinocchio)", () => { // The NFT (a single token) landed in the payer's associated token account. const ataAccount = svm.getAccount(ata); if (!ataAccount?.exists) throw new Error("Associated token account not found"); - const amount = Buffer.from(ataAccount.data).readBigUInt64LE(TOKEN_ACCOUNT_AMOUNT_OFFSET); + // Decode the token account with the official codec instead of reading the + // `amount` field from a raw byte offset by hand. + const amount = getTokenDecoder().decode(ataAccount.data).amount; assert.equal(amount, 1n); // The master edition account exists and is owned by the Token Metadata diff --git a/tokens/pda-mint-authority/pinocchio/tsconfig.json b/tokens/pda-mint-authority/pinocchio/tsconfig.json index 032d00180..237de9f97 100644 --- a/tokens/pda-mint-authority/pinocchio/tsconfig.json +++ b/tokens/pda-mint-authority/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 8fc79757a9a72cc3177925fd96df64f9d7a89cd1 Mon Sep 17 00:00:00 2001 From: MarkFeder Date: Wed, 5 Aug 2026 10:15:56 +0200 Subject: [PATCH 6/9] pda-mint-authority 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. init now rejects a non-canonical bump, addressing the earlier review comment. - process_instruction / instruction handlers take &mut [AccountView]; pass copied AccountViews into the metadata/edition CPIs. - pinocchio-token MintTo gained multisig_signers (&[]). --- Cargo.lock | 4 +- .../pinocchio/program/Cargo.toml | 4 +- .../program/src/instructions/create.rs | 42 ++++--------------- .../program/src/instructions/init.rs | 20 ++++----- .../program/src/instructions/mint.rs | 40 +++++++----------- .../pinocchio/program/src/instructions/mod.rs | 4 +- .../pinocchio/program/src/processor.rs | 6 +-- 7 files changed, 39 insertions(+), 81 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2c724eea3..79da24db5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2466,12 +2466,12 @@ dependencies = [ name = "pda-mint-authority-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/pda-mint-authority/pinocchio/program/Cargo.toml b/tokens/pda-mint-authority/pinocchio/program/Cargo.toml index de3053ac2..2e938fc4d 100644 --- a/tokens/pda-mint-authority/pinocchio/program/Cargo.toml +++ b/tokens/pda-mint-authority/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/pda-mint-authority/pinocchio/program/src/instructions/create.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs index 485b06865..d653d2044 100644 --- a/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs @@ -8,7 +8,6 @@ use pinocchio::{ AccountView, Address, ProgramResult, }; use pinocchio_log::log; -use pinocchio_pubkey::derive_address; use pinocchio_system::instructions::CreateAccount; use pinocchio_token::instructions::InitializeMint2; @@ -37,7 +36,7 @@ const CREATE_METADATA_ACCOUNT_V3: u8 = 33; /// The mint authority is the program-derived address, so the metadata CPI (which /// requires the mint authority to sign) is authorized with the PDA's seeds via /// `invoke_signed` rather than a wallet signature. -pub fn create_token(program_id: &Address, accounts: &[AccountView], data: &[u8]) -> ProgramResult { +pub fn create_token(program_id: &Address, accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { // `token_program` and `token_metadata_program` are unused directly, but must // be supplied so they are present in the transaction for the CPIs below. let [mint_account, mint_authority, metadata_account, payer, system_program, _token_program, _token_metadata_program] = @@ -51,12 +50,8 @@ pub fn create_token(program_id: &Address, accounts: &[AccountView], data: &[u8]) // Recover the PDA bump recorded by `init` and confirm the supplied account is // the canonical mint-authority PDA. let bump = MintAuthorityPda::deserialize(&mint_authority.try_borrow()?)?.bump; - let pda = derive_address( - &[MintAuthorityPda::SEED_PREFIX], - Some(bump), - program_id.as_array(), - ); - if mint_authority.address().as_array() != &pda { + let (pda, _) = Address::find_program_address(&[MintAuthorityPda::SEED_PREFIX], program_id); + if mint_authority.address() != &pda { return Err(ProgramError::InvalidSeeds); } @@ -66,14 +61,8 @@ pub fn create_token(program_id: &Address, accounts: &[AccountView], data: &[u8]) let lamports = rent.try_minimum_balance(MINT_SIZE)?; log!("Creating mint account"); - CreateAccount { - from: payer, - to: mint_account, - lamports, - space: MINT_SIZE as u64, - owner: &pinocchio_token::ID, - } - .invoke()?; + CreateAccount { from: payer, to: mint_account, lamports, space: MINT_SIZE as u64, owner: &pinocchio_token::ID } + .invoke()?; log!("Initializing mint account"); InitializeMint2 { @@ -95,30 +84,17 @@ pub fn create_token(program_id: &Address, accounts: &[AccountView], data: &[u8]) InstructionAccount::readonly(mint_authority.address()), InstructionAccount::readonly(system_program.address()), ]; - let instruction = InstructionView { - program_id: &TOKEN_METADATA_PROGRAM_ID, - accounts: &metadata_accounts, - data: &metadata_data, - }; + let instruction = + InstructionView { program_id: &TOKEN_METADATA_PROGRAM_ID, accounts: &metadata_accounts, data: &metadata_data }; // Sign for the mint-authority PDA. let bump_bytes = [bump]; - let seeds = [ - Seed::from(MintAuthorityPda::SEED_PREFIX), - Seed::from(&bump_bytes), - ]; + let seeds = [Seed::from(MintAuthorityPda::SEED_PREFIX), Seed::from(&bump_bytes)]; let signers = [Signer::from(&seeds)]; invoke_signed( &instruction, - &[ - metadata_account, - mint_account, - mint_authority, - payer, - mint_authority, - system_program, - ], + &[*metadata_account, *mint_account, *mint_authority, *payer, *mint_authority, *system_program], &signers, )?; diff --git a/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs index 73eba7776..2f9705fd8 100644 --- a/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/init.rs @@ -5,7 +5,6 @@ use pinocchio::{ AccountView, Address, ProgramResult, }; use pinocchio_log::log; -use pinocchio_pubkey::derive_address; use pinocchio_system::instructions::CreateAccount; use crate::state::MintAuthorityPda; @@ -22,20 +21,18 @@ use crate::state::MintAuthorityPda; /// 2. `[]` system program /// /// Instruction data: `[bump: u8]` (the canonical bump for the PDA). -pub fn init(program_id: &Address, accounts: &[AccountView], data: &[u8]) -> ProgramResult { +pub fn init(program_id: &Address, accounts: &mut [AccountView], data: &[u8]) -> ProgramResult { let [mint_authority, payer, _system_program] = accounts else { return Err(ProgramError::NotEnoughAccountKeys); }; let bump = *data.first().ok_or(ProgramError::InvalidInstructionData)?; - // Verify the supplied account is the canonical PDA for this bump. - let pda = derive_address( - &[MintAuthorityPda::SEED_PREFIX], - Some(bump), - program_id.as_array(), - ); - if mint_authority.address().as_array() != &pda { + // Derive the canonical PDA on-chain and require both the supplied account and + // bump to match it, so a non-canonical bump cannot create the account at a + // different address than clients derive with `findProgramAddressSync`. + let (pda, canonical_bump) = Address::find_program_address(&[MintAuthorityPda::SEED_PREFIX], program_id); + if mint_authority.address() != &pda || bump != canonical_bump { return Err(ProgramError::InvalidSeeds); } @@ -43,10 +40,7 @@ pub fn init(program_id: &Address, accounts: &[AccountView], data: &[u8]) -> Prog let rent = Rent::get()?; let lamports = rent.try_minimum_balance(MintAuthorityPda::ACCOUNT_SPACE)?; let bump_bytes = [bump]; - let seeds = [ - Seed::from(MintAuthorityPda::SEED_PREFIX), - Seed::from(&bump_bytes), - ]; + let seeds = [Seed::from(MintAuthorityPda::SEED_PREFIX), Seed::from(&bump_bytes)]; let signers = [Signer::from(&seeds)]; log!("Creating mint authority PDA"); diff --git a/tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs index b1c2c5d97..be63ebb25 100644 --- a/tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs @@ -8,7 +8,6 @@ use pinocchio::{ }; use pinocchio_associated_token_account::instructions::CreateIdempotent; use pinocchio_log::log; -use pinocchio_pubkey::derive_address; use pinocchio_token::instructions::MintTo; use crate::instructions::TOKEN_METADATA_PROGRAM_ID; @@ -37,7 +36,7 @@ const CREATE_MASTER_EDITION_V3: u8 = 17; /// 9. `[]` token metadata program /// /// Instruction data: none. -pub fn mint_to(program_id: &Address, accounts: &[AccountView]) -> ProgramResult { +pub fn mint_to(program_id: &Address, accounts: &mut [AccountView]) -> ProgramResult { // `associated_token_program` and `token_metadata_program` are unused // directly, but must be supplied so they are present for the CPIs below. let [mint_account, metadata_account, edition_account, mint_authority, associated_token_account, payer, system_program, token_program, _associated_token_program, _token_metadata_program] = @@ -49,21 +48,14 @@ pub fn mint_to(program_id: &Address, accounts: &[AccountView]) -> ProgramResult // Recover the PDA bump recorded by `init` and confirm the supplied account is // the canonical mint-authority PDA. let bump = MintAuthorityPda::deserialize(&mint_authority.try_borrow()?)?.bump; - let pda = derive_address( - &[MintAuthorityPda::SEED_PREFIX], - Some(bump), - program_id.as_array(), - ); - if mint_authority.address().as_array() != &pda { + let (pda, _) = Address::find_program_address(&[MintAuthorityPda::SEED_PREFIX], program_id); + if mint_authority.address() != &pda { return Err(ProgramError::InvalidSeeds); } // Signer seeds for the mint-authority PDA, reused by both CPIs below. let bump_bytes = [bump]; - let seeds = [ - Seed::from(MintAuthorityPda::SEED_PREFIX), - Seed::from(&bump_bytes), - ]; + let seeds = [Seed::from(MintAuthorityPda::SEED_PREFIX), Seed::from(&bump_bytes)]; let signers = [Signer::from(&seeds)]; log!("Creating associated token account if needed"); @@ -83,6 +75,7 @@ pub fn mint_to(program_id: &Address, accounts: &[AccountView]) -> ProgramResult account: associated_token_account, mint_authority, amount: 1, + multisig_signers: &[] as &[&AccountView], } .invoke_signed(&signers)?; @@ -102,22 +95,19 @@ pub fn mint_to(program_id: &Address, accounts: &[AccountView]) -> ProgramResult InstructionAccount::readonly(token_program.address()), InstructionAccount::readonly(system_program.address()), ]; - let instruction = InstructionView { - program_id: &TOKEN_METADATA_PROGRAM_ID, - accounts: &edition_accounts, - data: &edition_data, - }; + let instruction = + InstructionView { program_id: &TOKEN_METADATA_PROGRAM_ID, accounts: &edition_accounts, data: &edition_data }; invoke_signed( &instruction, &[ - edition_account, - mint_account, - mint_authority, - mint_authority, - payer, - metadata_account, - token_program, - system_program, + *edition_account, + *mint_account, + *mint_authority, + *mint_authority, + *payer, + *metadata_account, + *token_program, + *system_program, ], &signers, )?; diff --git a/tokens/pda-mint-authority/pinocchio/program/src/instructions/mod.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/mod.rs index 9f37ee7d6..c842f26b2 100644 --- a/tokens/pda-mint-authority/pinocchio/program/src/instructions/mod.rs +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/mod.rs @@ -51,9 +51,7 @@ fn read_borsh_string<'a>(data: &'a [u8], offset: &mut usize) -> Result<&'a [u8], let len = u32::from_le_bytes(len_bytes) as usize; *offset += 4; - let bytes = data - .get(*offset..*offset + len) - .ok_or(ProgramError::InvalidInstructionData)?; + let bytes = data.get(*offset..*offset + len).ok_or(ProgramError::InvalidInstructionData)?; *offset += len; Ok(bytes) } diff --git a/tokens/pda-mint-authority/pinocchio/program/src/processor.rs b/tokens/pda-mint-authority/pinocchio/program/src/processor.rs index d6fb902ad..7587f964d 100644 --- a/tokens/pda-mint-authority/pinocchio/program/src/processor.rs +++ b/tokens/pda-mint-authority/pinocchio/program/src/processor.rs @@ -12,12 +12,10 @@ use crate::instructions::{create_token, init, mint_to}; /// - `2` -> Mint (no args) 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 13b54b324d53a294d84afe87e3a4dd83cb7b429e Mon Sep 17 00:00:00 2001 From: MarkFeder Date: Wed, 5 Aug 2026 10:33:23 +0200 Subject: [PATCH 7/9] pda-mint-authority pinocchio: prettier formatting for test.ts and tsconfig.json --- .../pinocchio/tests/test.ts | 356 +++++++++--------- .../pinocchio/tsconfig.json | 18 +- 2 files changed, 189 insertions(+), 185 deletions(-) diff --git a/tokens/pda-mint-authority/pinocchio/tests/test.ts b/tokens/pda-mint-authority/pinocchio/tests/test.ts index 0c9463cec..dfa67e180 100644 --- a/tokens/pda-mint-authority/pinocchio/tests/test.ts +++ b/tokens/pda-mint-authority/pinocchio/tests/test.ts @@ -1,30 +1,30 @@ -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 { SYSTEM_PROGRAM_ADDRESS } from "@solana-program/system"; -import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS, getTokenDecoder, TOKEN_PROGRAM_ADDRESS } from "@solana-program/token"; -import * as borsh from "borsh"; -import { assert } from "chai"; -import { FailedTransactionMetadata, LiteSVM } from "litesvm"; + AccountRole, + address, + appendTransactionMessageInstruction, + createTransactionMessage, + generateKeyPairSigner, + getAddressEncoder, + getProgramDerivedAddress, + lamports, + pipe, + setTransactionMessageFeePayerSigner, + signTransactionMessageWithSigners, +} from '@solana/kit'; +import { SYSTEM_PROGRAM_ADDRESS } from '@solana-program/system'; +import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS, getTokenDecoder, TOKEN_PROGRAM_ADDRESS } from '@solana-program/token'; +import * as borsh from 'borsh'; +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 come from the official // @solana-program/token client. 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 TOKEN_METADATA_PROGRAM_ID = address('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s'); // Instruction discriminators (the Borsh enum variant index). const INIT = 0; @@ -34,184 +34,188 @@ const MINT = 2; // Borsh schema for the Create instruction data, matching the program's // `CreateTokenArgs` (and the native example's wire format). const CreateTokenArgsSchema: borsh.Schema = { - struct: { - instruction: "u8", - nft_title: "string", - nft_symbol: "string", - nft_uri: "string", - }, + struct: { + instruction: 'u8', + nft_title: 'string', + nft_symbol: 'string', + nft_uri: 'string', + }, }; // 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, "pda_mint_authority_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, 'pda_mint_authority_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("PDA Mint Authority (Pinocchio)", () => { - let svm: LiteSVM; - let programId: ReturnType; - let payer: Awaited>; - let mint: 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 mint is created in the Create test and reused (as a non-signer) by the - // Mint test, so it is generated once for the whole suite. - mint = await generateKeyPairSigner(); - - // The mint authority is a PDA of the program; its canonical bump is passed - // into Init and later used by the program to sign CPIs (invoke_signed). - const [pda, bump] = await getProgramDerivedAddress({ - programAddress: programId, - seeds: ["mint_authority"], +describe('PDA Mint Authority (Pinocchio)', () => { + let svm: LiteSVM; + let programId: ReturnType; + let payer: Awaited>; + let mint: 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 mint is created in the Create test and reused (as a non-signer) by the + // Mint test, so it is generated once for the whole suite. + mint = await generateKeyPairSigner(); + + // The mint authority is a PDA of the program; its canonical bump is passed + // into Init and later used by the program to sign CPIs (invoke_signed). + const [pda, bump] = await getProgramDerivedAddress({ + programAddress: programId, + seeds: ['mint_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("Initialize the mint authority PDA!", async () => { - await send({ - programAddress: programId, - accounts: [ - { address: mintAuthorityPda, role: AccountRole.WRITABLE }, // mint authority PDA - { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer - { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program - ], - data: new Uint8Array([INIT, mintAuthorityBump]), - }); - const pdaAccount = svm.getAccount(mintAuthorityPda); - if (!pdaAccount?.exists) throw new Error("Mint authority PDA not found"); - assert.equal(pdaAccount.programAddress, programId); - // The program persists the canonical bump in the first byte. - assert.equal(pdaAccount.data[0], mintAuthorityBump); - }); - - it("Create an NFT!", async () => { - const metadataAddress = await getMetadataAddress(mint.address); - - const data = Buffer.from( - borsh.serialize(CreateTokenArgsSchema, { - instruction: CREATE, - nft_title: "Homer NFT", - nft_symbol: "HOMR", - nft_uri: - "https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json", - }), - ); - - await send({ - programAddress: programId, - accounts: [ - { address: mint.address, role: AccountRole.WRITABLE_SIGNER, signer: mint }, // mint account - { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA - { address: metadataAddress, role: AccountRole.WRITABLE }, // metadata account - { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer - { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program - { address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // token program - { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program - ], - data: new Uint8Array(data), + it('Initialize the mint authority PDA!', async () => { + await send({ + programAddress: programId, + accounts: [ + { address: mintAuthorityPda, role: AccountRole.WRITABLE }, // mint authority PDA + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer + { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program + ], + data: new Uint8Array([INIT, mintAuthorityBump]), + }); + + const pdaAccount = svm.getAccount(mintAuthorityPda); + if (!pdaAccount?.exists) throw new Error('Mint authority PDA not found'); + assert.equal(pdaAccount.programAddress, programId); + // The program persists the canonical bump in the first byte. + assert.equal(pdaAccount.data[0], mintAuthorityBump); }); - const mintAccount = svm.getAccount(mint.address); - if (!mintAccount?.exists) throw new Error("Mint account not found"); - assert.equal(mintAccount.programAddress, TOKEN_PROGRAM_ADDRESS); - - const metadataAccount = svm.getAccount(metadataAddress); - if (!metadataAccount?.exists) throw new Error("Metadata account not found"); - assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); - assert.isTrue(Buffer.from(metadataAccount.data).toString("utf-8").includes("Homer NFT")); - }); - - it("Mint the NFT to your wallet!", async () => { - const metadataAddress = await getMetadataAddress(mint.address); - const editionAddress = await getMasterEditionAddress(mint.address); - const ata = await getAssociatedTokenAddress(mint.address, payer.address); - - await send({ - programAddress: programId, - accounts: [ - { address: mint.address, role: AccountRole.WRITABLE }, // mint account - { address: metadataAddress, role: AccountRole.WRITABLE }, // metadata account - { address: editionAddress, role: AccountRole.WRITABLE }, // master edition account - { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA - { address: ata, role: AccountRole.WRITABLE }, // associated token account - { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer - { 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]), + it('Create an NFT!', async () => { + const metadataAddress = await getMetadataAddress(mint.address); + + const data = Buffer.from( + borsh.serialize(CreateTokenArgsSchema, { + instruction: CREATE, + nft_title: 'Homer NFT', + nft_symbol: 'HOMR', + nft_uri: + 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json', + }), + ); + + await send({ + programAddress: programId, + accounts: [ + { address: mint.address, role: AccountRole.WRITABLE_SIGNER, signer: mint }, // mint account + { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA + { address: metadataAddress, role: AccountRole.WRITABLE }, // metadata account + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer + { address: SYSTEM_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // system program + { address: TOKEN_PROGRAM_ADDRESS, role: AccountRole.READONLY }, // token program + { address: TOKEN_METADATA_PROGRAM_ID, role: AccountRole.READONLY }, // token metadata program + ], + data: new Uint8Array(data), + }); + + const mintAccount = svm.getAccount(mint.address); + if (!mintAccount?.exists) throw new Error('Mint account not found'); + assert.equal(mintAccount.programAddress, TOKEN_PROGRAM_ADDRESS); + + const metadataAccount = svm.getAccount(metadataAddress); + if (!metadataAccount?.exists) throw new Error('Metadata account not found'); + assert.equal(metadataAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); + assert.isTrue(Buffer.from(metadataAccount.data).toString('utf-8').includes('Homer NFT')); }); - // The NFT (a single token) landed in the payer's associated token account. - const ataAccount = svm.getAccount(ata); - if (!ataAccount?.exists) throw new Error("Associated token account not found"); - // Decode the token account with the official codec instead of reading the - // `amount` field from a raw byte offset by hand. - const amount = getTokenDecoder().decode(ataAccount.data).amount; - assert.equal(amount, 1n); - - // The master edition account exists and is owned by the Token Metadata - // program — proof the CreateMasterEditionV3 CPI (signed by the PDA) succeeded. - const editionAccount = svm.getAccount(editionAddress); - if (!editionAccount?.exists) throw new Error("Master edition account not found"); - assert.equal(editionAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); - }); + it('Mint the NFT to your wallet!', async () => { + const metadataAddress = await getMetadataAddress(mint.address); + const editionAddress = await getMasterEditionAddress(mint.address); + const ata = await getAssociatedTokenAddress(mint.address, payer.address); + + await send({ + programAddress: programId, + accounts: [ + { address: mint.address, role: AccountRole.WRITABLE }, // mint account + { address: metadataAddress, role: AccountRole.WRITABLE }, // metadata account + { address: editionAddress, role: AccountRole.WRITABLE }, // master edition account + { address: mintAuthorityPda, role: AccountRole.READONLY }, // mint authority PDA + { address: ata, role: AccountRole.WRITABLE }, // associated token account + { address: payer.address, role: AccountRole.WRITABLE_SIGNER, signer: payer }, // payer + { 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]), + }); + + // The NFT (a single token) landed in the payer's associated token account. + const ataAccount = svm.getAccount(ata); + if (!ataAccount?.exists) throw new Error('Associated token account not found'); + // Decode the token account with the official codec instead of reading the + // `amount` field from a raw byte offset by hand. + const amount = getTokenDecoder().decode(ataAccount.data).amount; + assert.equal(amount, 1n); + + // The master edition account exists and is owned by the Token Metadata + // program — proof the CreateMasterEditionV3 CPI (signed by the PDA) succeeded. + const editionAccount = svm.getAccount(editionAddress); + if (!editionAccount?.exists) throw new Error('Master edition account not found'); + assert.equal(editionAccount.programAddress, TOKEN_METADATA_PROGRAM_ID); + }); }); diff --git a/tokens/pda-mint-authority/pinocchio/tsconfig.json b/tokens/pda-mint-authority/pinocchio/tsconfig.json index 237de9f97..35163d39d 100644 --- a/tokens/pda-mint-authority/pinocchio/tsconfig.json +++ b/tokens/pda-mint-authority/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 fa30489533f7337bed4228746f716a2e99c10e93 Mon Sep 17 00:00:00 2001 From: MarkFeder Date: Wed, 5 Aug 2026 11:02:19 +0200 Subject: [PATCH 8/9] pda-mint-authority pinocchio: prettier formatting (prepare.mjs, test.ts, tsconfig) with repo prettier 3.9.6 --- .../pda-mint-authority/pinocchio/prepare.mjs | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/tokens/pda-mint-authority/pinocchio/prepare.mjs b/tokens/pda-mint-authority/pinocchio/prepare.mjs index b7e99c98e..e24c12689 100644 --- a/tokens/pda-mint-authority/pinocchio/prepare.mjs +++ b/tokens/pda-mint-authority/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 }); + mkdirSync(outputDir, { recursive: true }); - for (const { id, name } of programs) { - const outputFile = join(outputDir, name); - rmSync(outputFile, { force: true }); - // `-um` points this dump at mainnet without mutating the developer's - // global Solana CLI cluster config. - execSync(`solana program dump -um ${id} ${outputFile}`, { stdio: "inherit" }); - console.log(`Dumped ${id} -> ${outputFile}`); - } + for (const { id, name } of programs) { + const outputFile = join(outputDir, name); + rmSync(outputFile, { force: true }); + // `-um` points this dump at mainnet without mutating the developer's + // global Solana CLI cluster config. + execSync(`solana program dump -um ${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 a500411c6533db834598c83323656eedf2ddc861 Mon Sep 17 00:00:00 2001 From: MarkFeder Date: Thu, 6 Aug 2026 20:04:49 +0200 Subject: [PATCH 9/9] tokens/pda-mint-authority pinocchio: address review feedback - create/mint: derive the mint-authority PDA directly with create_program_address (the canonical bump is already known and stored) instead of searching with find_program_address - test: build instruction data with @solana/kit codecs instead of the borsh package, and derive the ATA with findAssociatedTokenPda instead of hand-rolling the seeds (follows #675) - test stack: switch to mocha + tsx and @solana/kit ^7 per AGENTS.md / #656 --- .../pda-mint-authority/pinocchio/package.json | 19 +- .../pinocchio/pnpm-lock.yaml | 2002 ++++++++++++----- .../program/src/instructions/create.rs | 7 +- .../program/src/instructions/mint.rs | 7 +- .../pinocchio/tests/test.ts | 66 +- .../pinocchio/tsconfig.json | 12 +- 6 files changed, 1540 insertions(+), 573 deletions(-) diff --git a/tokens/pda-mint-authority/pinocchio/package.json b/tokens/pda-mint-authority/pinocchio/package.json index d484fa2da..9021d074c 100644 --- a/tokens/pda-mint-authority/pinocchio/package.json +++ b/tokens/pda-mint-authority/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,16 @@ "dependencies": { "@solana-program/system": "^0.12.2", "@solana-program/token": "^0.14.0", - "@solana/kit": "^6.10.0", - "borsh": "^2.0.0", + "@solana/kit": "^7.0.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/pda-mint-authority/pinocchio/pnpm-lock.yaml b/tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml index b95201dea..8e81c03d4 100644 --- a/tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml +++ b/tokens/pda-mint-authority/pinocchio/pnpm-lock.yaml @@ -10,44 +10,205 @@ 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(typescript@5.9.3)) '@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(typescript@5.9.3)) '@solana/kit': - specifier: ^6.10.0 - version: 6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) - borsh: - specifier: ^2.0.0 - version: 2.0.0 + specifier: ^7.0.0 + version: 7.0.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) + version: 1.3.0(typescript@5.9.3) 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.8 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 +229,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 +247,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 +265,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 +283,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 +301,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 +319,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 +340,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 +361,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 +380,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,6 +399,15 @@ packages: typescript: optional: true + '@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'} @@ -162,6 +417,15 @@ packages: 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'} @@ -171,6 +435,15 @@ packages: 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'} @@ -180,6 +453,15 @@ packages: 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'} @@ -189,6 +471,15 @@ packages: 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'} @@ -198,6 +489,15 @@ packages: 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'} @@ -207,8 +507,260 @@ packages: typescript: optional: true - '@solana/nominal-types@6.10.0': - resolution: {integrity: sha512-9ykyBBvnkInH7fCacjJi7zu2PJyd+OCt+VTjIISv070fHzKIMFqZqJJ/dJ0SRH2aHwfB3n86iVsmtBtuxi4KKA==} + '@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' + peerDependenciesMeta: + typescript: + optional: true + + '@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 + + '@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' + peerDependenciesMeta: + typescript: + optional: true + + '@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-api@7.0.0': + resolution: {integrity: sha512-o2PZDeNC/kg3VO3ry4R0JySJ1xMHLchZwmzVwamxGidlLe9uvzm6CHlCqv/JCq4/zHLo7qbLqnmOckZ6vlDqaw==} + 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-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 +768,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 +777,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 +786,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 +795,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 +804,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 +813,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 +822,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 +831,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 +840,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 +849,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 +858,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 +867,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 +876,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 +885,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 +894,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 +903,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 +912,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 +921,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 +930,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 +939,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 +948,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 +957,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 +966,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 +975,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 +984,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,81 +993,57 @@ 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'} - - 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'} + 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'} - camelcase@6.3.0: 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==} @@ -525,15 +1053,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==} @@ -546,11 +1072,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: '*' @@ -562,21 +1089,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'} @@ -585,10 +1115,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'} @@ -597,8 +1123,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==} @@ -609,20 +1136,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==} @@ -632,32 +1149,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==} @@ -670,14 +1168,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'} @@ -730,53 +1227,25 @@ 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==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - minimatch@4.2.1: - resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} - engines: {node: '>=10'} - - 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'} @@ -785,27 +1254,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==} @@ -814,27 +1286,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==} @@ -848,58 +1329,37 @@ 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.8: + resolution: {integrity: sha512-8W675THjbzfFmLOQzjDBIBna+WjqMGIxmSZ1mMc1+o9qoVsEuAgQu5j5ueLhau8inOkDu9OslVg0FmfBs1RIHw==} + 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==} - utf-8-validate@6.0.6: - resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} - engines: {node: '>=6.14.2'} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 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==} @@ -917,21 +1377,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==} @@ -939,14 +1395,113 @@ packages: snapshots: - '@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))': + '@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(typescript@5.9.3))': + dependencies: + '@solana/kit': 6.10.0(typescript@5.9.3) + + '@solana-program/system@0.12.2(@solana/kit@7.0.0(typescript@5.9.3))': + dependencies: + '@solana/kit': 7.0.0(typescript@5.9.3) + + '@solana-program/token@0.14.0(@solana/kit@6.10.0(typescript@5.9.3))': 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@6.10.0(typescript@5.9.3)) + '@solana/kit': 6.10.0(typescript@5.9.3) - '@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-program/token@0.14.0(@solana/kit@7.0.0(typescript@5.9.3))': 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/system': 0.12.2(@solana/kit@7.0.0(typescript@5.9.3)) + '@solana/kit': 7.0.0(typescript@5.9.3) '@solana/accounts@6.10.0(typescript@5.9.3)': dependencies: @@ -961,6 +1516,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) @@ -973,18 +1541,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) @@ -993,6 +1585,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) @@ -1000,6 +1600,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) @@ -1008,6 +1615,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) @@ -1021,6 +1636,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 @@ -1028,7 +1656,18 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/fast-stable-stringify@6.10.0(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 @@ -1039,10 +1678,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) @@ -1056,6 +1706,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) @@ -1063,6 +1726,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) @@ -1076,7 +1746,20 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/kit@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + '@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(typescript@5.9.3)': dependencies: '@solana/accounts': 6.10.0(typescript@5.9.3) '@solana/addresses': 6.10.0(typescript@5.9.3) @@ -1095,12 +1778,12 @@ snapshots: '@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-subscriptions': 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) '@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-confirmation': 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: @@ -1110,10 +1793,49 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate + '@solana/kit@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': 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(typescript@5.9.3) + '@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(typescript@5.9.3) + '@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) @@ -1129,6 +1851,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) @@ -1141,10 +1878,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) @@ -1159,6 +1912,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) @@ -1175,6 +1942,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) @@ -1184,10 +1967,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) @@ -1206,14 +2002,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) @@ -1222,6 +2046,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) @@ -1236,13 +2068,40 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@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-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(typescript@5.9.3)': 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) + ws: 8.21.0 + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@solana/rpc-subscriptions-channel-websocket@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/rpc-subscriptions-spec': 7.0.0(typescript@5.9.3) + '@solana/subscribable': 7.0.0(typescript@5.9.3) + ws: 8.21.0 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -1258,7 +2117,16 @@ snapshots: 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)': + '@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(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) @@ -1266,7 +2134,7 @@ snapshots: '@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-channel-websocket': 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) @@ -1278,6 +2146,26 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate + '@solana/rpc-subscriptions@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/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(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/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) @@ -1290,6 +2178,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) @@ -1299,6 +2199,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) @@ -1313,6 +2222,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) @@ -1329,6 +2252,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) @@ -1345,6 +2284,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) @@ -1352,6 +2307,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) @@ -1365,7 +2327,20 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transaction-confirmation@6.10.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': + '@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(typescript@5.9.3)': dependencies: '@solana/addresses': 6.10.0(typescript@5.9.3) '@solana/codecs-strings': 6.10.0(typescript@5.9.3) @@ -1373,7 +2348,7 @@ snapshots: '@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-subscriptions': 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) @@ -1384,6 +2359,40 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate + '@solana/transaction-confirmation@7.0.0(typescript@5.9.3)': + 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(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: + - 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) @@ -1400,6 +2409,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) @@ -1419,73 +2444,63 @@ 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: {} - - borsh@2.0.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 - 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 + chai@6.2.2: {} chalk@4.1.2: dependencies: @@ -1494,23 +2509,11 @@ snapshots: chalk@5.6.2: {} - check-error@1.0.3: - dependencies: - get-func-name: 2.0.2 - - chokidar@3.5.3: + chokidar@4.0.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 + readdirp: 4.1.2 - cliui@7.0.4: + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 @@ -1524,34 +2527,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 @@ -1559,54 +2589,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: - dependencies: - is-glob: 4.0.3 - - glob@7.2.0: + glob@10.5.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: {} @@ -1614,14 +2622,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 @@ -1641,11 +2650,11 @@ snapshots: 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): + litesvm@1.3.0(typescript@5.9.3): 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) + '@solana-program/system': 0.12.2(@solana/kit@6.10.0(typescript@5.9.3)) + '@solana-program/token': 0.14.0(@solana/kit@6.10.0(typescript@5.9.3)) + '@solana/kit': 6.10.0(typescript@5.9.3) optionalDependencies: litesvm-darwin-arm64: 1.3.0 litesvm-darwin-x64: 1.3.0 @@ -1668,68 +2677,40 @@ 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 @@ -1738,36 +2719,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: @@ -1775,12 +2760,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: {} @@ -1792,54 +2784,23 @@ 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.8: 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: {} - utf-8-validate@6.0.6: - dependencies: - node-gyp-build: 4.8.4 - optional: true - which@2.0.2: dependencies: isexe: 2.0.0 - workerpool@6.2.0: {} + workerpool@9.3.4: {} wrap-ansi@7.0.0: dependencies: @@ -1847,16 +2808,17 @@ 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: - bufferutil: 4.1.0 - utf-8-validate: 6.0.6 + ws@8.21.0: {} y18n@5.0.8: {} - yargs-parser@20.2.4: {} + yargs-parser@21.1.1: {} yargs-unparser@2.0.0: dependencies: @@ -1865,16 +2827,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/pda-mint-authority/pinocchio/program/src/instructions/create.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs index d653d2044..dc6f3f0a6 100644 --- a/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/create.rs @@ -48,9 +48,12 @@ pub fn create_token(program_id: &Address, accounts: &mut [AccountView], data: &[ let args = CreateTokenArgs::parse(data)?; // Recover the PDA bump recorded by `init` and confirm the supplied account is - // the canonical mint-authority PDA. + // the mint-authority PDA. The canonical bump is already known, so derive the + // address directly with `create_program_address` rather than searching for it + // with `find_program_address`. let bump = MintAuthorityPda::deserialize(&mint_authority.try_borrow()?)?.bump; - let (pda, _) = Address::find_program_address(&[MintAuthorityPda::SEED_PREFIX], program_id); + let pda = Address::create_program_address(&[MintAuthorityPda::SEED_PREFIX, &[bump]], program_id) + .map_err(|_| ProgramError::InvalidSeeds)?; if mint_authority.address() != &pda { return Err(ProgramError::InvalidSeeds); } diff --git a/tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs b/tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs index be63ebb25..2e2d717fa 100644 --- a/tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs +++ b/tokens/pda-mint-authority/pinocchio/program/src/instructions/mint.rs @@ -46,9 +46,12 @@ pub fn mint_to(program_id: &Address, accounts: &mut [AccountView]) -> ProgramRes }; // Recover the PDA bump recorded by `init` and confirm the supplied account is - // the canonical mint-authority PDA. + // the mint-authority PDA. The canonical bump is already known, so derive the + // address directly with `create_program_address` rather than searching for it + // with `find_program_address`. let bump = MintAuthorityPda::deserialize(&mint_authority.try_borrow()?)?.bump; - let (pda, _) = Address::find_program_address(&[MintAuthorityPda::SEED_PREFIX], program_id); + let pda = Address::create_program_address(&[MintAuthorityPda::SEED_PREFIX, &[bump]], program_id) + .map_err(|_| ProgramError::InvalidSeeds)?; if mint_authority.address() != &pda { return Err(ProgramError::InvalidSeeds); } diff --git a/tokens/pda-mint-authority/pinocchio/tests/test.ts b/tokens/pda-mint-authority/pinocchio/tests/test.ts index dfa67e180..5a56abefb 100644 --- a/tokens/pda-mint-authority/pinocchio/tests/test.ts +++ b/tokens/pda-mint-authority/pinocchio/tests/test.ts @@ -3,19 +3,28 @@ import * as path from 'node:path'; import { AccountRole, address, + addEncoderSizePrefix, appendTransactionMessageInstruction, createTransactionMessage, generateKeyPairSigner, getAddressEncoder, getProgramDerivedAddress, + getStructEncoder, + getU32Encoder, + getU8Encoder, + getUtf8Encoder, lamports, pipe, setTransactionMessageFeePayerSigner, signTransactionMessageWithSigners, } from '@solana/kit'; import { SYSTEM_PROGRAM_ADDRESS } from '@solana-program/system'; -import { ASSOCIATED_TOKEN_PROGRAM_ADDRESS, getTokenDecoder, TOKEN_PROGRAM_ADDRESS } from '@solana-program/token'; -import * as borsh from 'borsh'; +import { + ASSOCIATED_TOKEN_PROGRAM_ADDRESS, + findAssociatedTokenPda, + getTokenDecoder, + TOKEN_PROGRAM_ADDRESS, +} from '@solana-program/token'; import { assert } from 'chai'; import { FailedTransactionMetadata, LiteSVM } from 'litesvm'; @@ -31,16 +40,16 @@ const INIT = 0; const CREATE = 1; const MINT = 2; -// Borsh schema for the Create instruction data, matching the program's -// `CreateTokenArgs` (and the native example's wire format). -const CreateTokenArgsSchema: borsh.Schema = { - struct: { - instruction: 'u8', - nft_title: 'string', - nft_symbol: 'string', - nft_uri: 'string', - }, -}; +// Create instruction data layout, matching the program's `CreateTokenArgs` (and +// the native example's wire format). Borsh strings are a u32-LE length prefix +// followed by the UTF-8 bytes. +const borshString = () => addEncoderSizePrefix(getUtf8Encoder(), getU32Encoder()); +const createTokenArgsEncoder = getStructEncoder([ + ['instruction', getU8Encoder()], + ['nftTitle', borshString()], + ['nftSymbol', borshString()], + ['nftUri', borshString()], +]); // 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 @@ -67,18 +76,6 @@ async function getMasterEditionAddress(mint: ReturnType) { 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; -} - describe('PDA Mint Authority (Pinocchio)', () => { let svm: LiteSVM; let programId: ReturnType; @@ -148,15 +145,12 @@ describe('PDA Mint Authority (Pinocchio)', () => { it('Create an NFT!', async () => { const metadataAddress = await getMetadataAddress(mint.address); - const data = Buffer.from( - borsh.serialize(CreateTokenArgsSchema, { - instruction: CREATE, - nft_title: 'Homer NFT', - nft_symbol: 'HOMR', - nft_uri: - 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json', - }), - ); + const data = createTokenArgsEncoder.encode({ + instruction: CREATE, + nftTitle: 'Homer NFT', + nftSymbol: 'HOMR', + nftUri: 'https://raw.githubusercontent.com/solana-developers/program-examples/new-examples/tokens/tokens/.assets/nft.json', + }); await send({ programAddress: programId, @@ -185,7 +179,11 @@ describe('PDA Mint Authority (Pinocchio)', () => { it('Mint the NFT to your wallet!', async () => { const metadataAddress = await getMetadataAddress(mint.address); const editionAddress = await getMasterEditionAddress(mint.address); - const ata = await getAssociatedTokenAddress(mint.address, payer.address); + const [ata] = await findAssociatedTokenPda({ + owner: payer.address, + mint: mint.address, + tokenProgram: TOKEN_PROGRAM_ADDRESS, + }); await send({ programAddress: programId, diff --git a/tokens/pda-mint-authority/pinocchio/tsconfig.json b/tokens/pda-mint-authority/pinocchio/tsconfig.json index 35163d39d..c02443141 100644 --- a/tokens/pda-mint-authority/pinocchio/tsconfig.json +++ b/tokens/pda-mint-authority/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 } }