From 826734f31fc82da189e21338bbead63f8dd7423d Mon Sep 17 00:00:00 2001 From: adpthegreat Date: Sun, 20 Oct 2024 14:59:26 +0100 Subject: [PATCH 1/9] added poseidon close accounts --- .../poseidon/close_account_program/.gitignore | 7 + .../close_account_program/.prettierignore | 7 + .../close_account_program/Anchor.toml | 18 + .../poseidon/close_account_program/Cargo.toml | 14 + .../migrations/deploy.ts | 12 + .../close_account_program/package.json | 23 + .../close_account_program/pnpm-lock.yaml | 1470 +++++++++++++++++ .../programs/close_account_program/Cargo.toml | 20 + .../programs/close_account_program/Xargo.toml | 2 + .../programs/close_account_program/src/lib.rs | 44 + .../tests/bankrun.test.ts | 63 + .../tests/close_account_program.ts | 51 + .../ts-programs/package.json | 15 + .../ts-programs/pnpm-lock.yaml | 22 + .../ts-programs/src/close_account_program.ts | 26 + .../close_account_program/tsconfig.json | 10 + 16 files changed, 1804 insertions(+) create mode 100644 basics/close-account/poseidon/close_account_program/.gitignore create mode 100644 basics/close-account/poseidon/close_account_program/.prettierignore create mode 100644 basics/close-account/poseidon/close_account_program/Anchor.toml create mode 100644 basics/close-account/poseidon/close_account_program/Cargo.toml create mode 100644 basics/close-account/poseidon/close_account_program/migrations/deploy.ts create mode 100644 basics/close-account/poseidon/close_account_program/package.json create mode 100644 basics/close-account/poseidon/close_account_program/pnpm-lock.yaml create mode 100644 basics/close-account/poseidon/close_account_program/programs/close_account_program/Cargo.toml create mode 100644 basics/close-account/poseidon/close_account_program/programs/close_account_program/Xargo.toml create mode 100644 basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs create mode 100644 basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts create mode 100644 basics/close-account/poseidon/close_account_program/tests/close_account_program.ts create mode 100644 basics/close-account/poseidon/close_account_program/ts-programs/package.json create mode 100644 basics/close-account/poseidon/close_account_program/ts-programs/pnpm-lock.yaml create mode 100644 basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts create mode 100644 basics/close-account/poseidon/close_account_program/tsconfig.json diff --git a/basics/close-account/poseidon/close_account_program/.gitignore b/basics/close-account/poseidon/close_account_program/.gitignore new file mode 100644 index 000000000..2e0446b07 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/.gitignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +**/*.rs.bk +node_modules +test-ledger +.yarn diff --git a/basics/close-account/poseidon/close_account_program/.prettierignore b/basics/close-account/poseidon/close_account_program/.prettierignore new file mode 100644 index 000000000..414258343 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/.prettierignore @@ -0,0 +1,7 @@ +.anchor +.DS_Store +target +node_modules +dist +build +test-ledger diff --git a/basics/close-account/poseidon/close_account_program/Anchor.toml b/basics/close-account/poseidon/close_account_program/Anchor.toml new file mode 100644 index 000000000..7fc259e89 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/Anchor.toml @@ -0,0 +1,18 @@ +[toolchain] + +[features] +resolution = true +skip-lint = false + +[programs.localnet] +close_account_program = "2q4uoWExFAbZjeDe4n3miipsT9bX9vLnkSetCfZYF2VT" + +[registry] +url = "https://api.apr.dev" + +[provider] +cluster = "Localnet" +wallet = "~/.config/solana/id.json" + +[scripts] +test = "pnpm run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" diff --git a/basics/close-account/poseidon/close_account_program/Cargo.toml b/basics/close-account/poseidon/close_account_program/Cargo.toml new file mode 100644 index 000000000..f39770481 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/Cargo.toml @@ -0,0 +1,14 @@ +[workspace] +members = [ + "programs/*" +] +resolver = "2" + +[profile.release] +overflow-checks = true +lto = "fat" +codegen-units = 1 +[profile.release.build-override] +opt-level = 3 +incremental = false +codegen-units = 1 diff --git a/basics/close-account/poseidon/close_account_program/migrations/deploy.ts b/basics/close-account/poseidon/close_account_program/migrations/deploy.ts new file mode 100644 index 000000000..82fb175fa --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/migrations/deploy.ts @@ -0,0 +1,12 @@ +// Migrations are an early feature. Currently, they're nothing more than this +// single deploy script that's invoked from the CLI, injecting a provider +// configured from the workspace's Anchor.toml. + +const anchor = require("@coral-xyz/anchor"); + +module.exports = async function (provider) { + // Configure client to use the provider. + anchor.setProvider(provider); + + // Add your deploy script here. +}; diff --git a/basics/close-account/poseidon/close_account_program/package.json b/basics/close-account/poseidon/close_account_program/package.json new file mode 100644 index 000000000..151ba4340 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/package.json @@ -0,0 +1,23 @@ +{ + "license": "ISC", + "scripts": { + "lint:fix": "prettier */*.js \"*/**/*{.js,.ts}\" -w", + "lint": "prettier */*.js \"*/**/*{.js,.ts}\" --check", + "ts-mocha": "ts-mocha --project tsconfig.json" + }, + "dependencies": { + "@coral-xyz/anchor": "^0.30.1", + "anchor-bankrun": "^0.5.0", + "solana-bankrun": "^0.4.0" + }, + "devDependencies": { + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "chai": "^4.3.4", + "mocha": "^9.0.3", + "prettier": "^2.6.2", + "ts-mocha": "^10.0.0", + "typescript": "^4.3.5" + } +} diff --git a/basics/close-account/poseidon/close_account_program/pnpm-lock.yaml b/basics/close-account/poseidon/close_account_program/pnpm-lock.yaml new file mode 100644 index 000000000..9b79b8317 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/pnpm-lock.yaml @@ -0,0 +1,1470 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@coral-xyz/anchor': + specifier: ^0.30.1 + version: 0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + anchor-bankrun: + specifier: ^0.5.0 + version: 0.5.0(@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(solana-bankrun@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + solana-bankrun: + specifier: ^0.4.0 + version: 0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + devDependencies: + '@types/bn.js': + specifier: ^5.1.0 + version: 5.1.6 + '@types/chai': + specifier: ^4.3.0 + version: 4.3.20 + '@types/mocha': + specifier: ^9.0.0 + version: 9.1.1 + chai: + specifier: ^4.3.4 + version: 4.5.0 + mocha: + specifier: ^9.0.3 + version: 9.2.2 + prettier: + specifier: ^2.6.2 + version: 2.8.8 + ts-mocha: + specifier: ^10.0.0 + version: 10.0.0(mocha@9.2.2) + typescript: + specifier: ^4.3.5 + version: 4.9.5 + +packages: + + '@babel/runtime@7.25.7': + resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} + engines: {node: '>=6.9.0'} + + '@coral-xyz/anchor-errors@0.30.1': + resolution: {integrity: sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ==} + engines: {node: '>=10'} + + '@coral-xyz/anchor@0.30.1': + resolution: {integrity: sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ==} + engines: {node: '>=11'} + + '@coral-xyz/borsh@0.30.1': + resolution: {integrity: sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.68.0 + + '@noble/curves@1.6.0': + resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.5.0': + resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + engines: {node: ^14.21.3 || >=16} + + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/web3.js@1.95.4': + resolution: {integrity: sha512-sdewnNEA42ZSMxqkzdwEWi6fDgzwtJHaQa5ndUGEJYtoOnM6X5cvPmjoTUp7/k7bRrVAxfBgDnvQQHD6yhlLYw==} + + '@swc/helpers@0.5.13': + resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + + '@types/bn.js@5.1.6': + resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} + + '@types/chai@4.3.20': + resolution: {integrity: sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/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@22.7.7': + resolution: {integrity: sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==} + + '@types/uuid@8.3.4': + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/ws@8.5.12': + resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + + '@ungap/promise-all-settled@1.1.2': + resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} + + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + + anchor-bankrun@0.5.0: + resolution: {integrity: sha512-cNTRv7pN9dy+kiyJ3UlNVTg9hAXhY2HtNVNXJbP/2BkS9nOdLV0qKWhgW8UR9Go0gYuEOLKuPzrGL4HFAZPsVw==} + engines: {node: '>= 10'} + peerDependencies: + '@coral-xyz/anchor': ^0.30.0 + '@solana/web3.js': '>1.92.0' + solana-bankrun: '>=0.2.0 <0.5.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.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + bigint-buffer@1.1.5: + resolution: {integrity: sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==} + engines: {node: '>= 10.0.0'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + + bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer-layout@1.2.2: + resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} + engines: {node: '>=4.5'} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bufferutil@4.0.8: + resolution: {integrity: sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==} + engines: {node: '>=6.14.2'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + 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@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + cross-fetch@3.1.8: + resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} + + crypto-hash@1.3.0: + resolution: {integrity: sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==} + engines: {node: '>=8'} + + 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.0: + resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} + engines: {node: '>=0.3.1'} + + diff@5.0.0: + resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} + engines: {node: '>=0.3.1'} + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + 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@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + + fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + + 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: Glob versions prior to v9 are no longer supported + + 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.1.2: + resolution: {integrity: sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==} + engines: {node: '>=8'} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@4.2.1: + resolution: {integrity: sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==} + engines: {node: '>=10'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + + mocha@9.2.2: + resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} + engines: {node: '>= 12.0.0'} + hasBin: true + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.1: + resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + + node-gyp-build@4.8.2: + resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} + hasBin: true + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + rpc-websockets@9.0.4: + resolution: {integrity: sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + serialize-javascript@6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + solana-bankrun-darwin-arm64@0.4.0: + resolution: {integrity: sha512-6dz78Teoz7ez/3lpRLDjktYLJb79FcmJk2me4/YaB8WiO6W43OdExU4h+d2FyuAryO2DgBPXaBoBNY/8J1HJmw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + solana-bankrun-darwin-universal@0.4.0: + resolution: {integrity: sha512-zSSw/Jx3KNU42pPMmrEWABd0nOwGJfsj7nm9chVZ3ae7WQg3Uty0hHAkn5NSDCj3OOiN0py9Dr1l9vmRJpOOxg==} + engines: {node: '>= 10'} + os: [darwin] + + solana-bankrun-darwin-x64@0.4.0: + resolution: {integrity: sha512-LWjs5fsgHFtyr7YdJR6r0Ho5zrtzI6CY4wvwPXr8H2m3b4pZe6RLIZjQtabCav4cguc14G0K8yQB2PTMuGub8w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + solana-bankrun-linux-x64-gnu@0.4.0: + resolution: {integrity: sha512-SrlVrb82UIxt21Zr/XZFHVV/h9zd2/nP25PMpLJVLD7Pgl2yhkhfi82xj3OjxoQqWe+zkBJ+uszA0EEKr67yNw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + solana-bankrun-linux-x64-musl@0.4.0: + resolution: {integrity: sha512-Nv328ZanmURdYfcLL+jwB1oMzX4ZzK57NwIcuJjGlf0XSNLq96EoaO5buEiUTo4Ls7MqqMyLbClHcrPE7/aKyA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + solana-bankrun@0.4.0: + resolution: {integrity: sha512-NMmXUipPBkt8NgnyNO3SCnPERP6xT/AMNMBooljGA3+rG6NN8lmXJsKeLqQTiFsDeWD74U++QM/DgcueSWvrIg==} + engines: {node: '>= 10'} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + superstruct@0.15.5: + resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} + + superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + ts-mocha@10.0.0: + resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} + engines: {node: '>= 6.X.X'} + hasBin: true + peerDependencies: + mocha: ^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X + + ts-node@7.0.1: + resolution: {integrity: sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==} + engines: {node: '>=4.2.0'} + hasBin: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tslib@2.8.0: + resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + + type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + utf-8-validate@5.0.10: + resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + engines: {node: '>=6.14.2'} + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + workerpool@6.2.0: + resolution: {integrity: sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@7.5.10: + resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yargs-parser@20.2.4: + resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} + engines: {node: '>=10'} + + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + + yn@2.0.0: + resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} + engines: {node: '>=4'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + +snapshots: + + '@babel/runtime@7.25.7': + dependencies: + regenerator-runtime: 0.14.1 + + '@coral-xyz/anchor-errors@0.30.1': {} + + '@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@coral-xyz/anchor-errors': 0.30.1 + '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@noble/hashes': 1.5.0 + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + bs58: 4.0.1 + buffer-layout: 1.2.2 + camelcase: 6.3.0 + cross-fetch: 3.1.8 + crypto-hash: 1.3.0 + eventemitter3: 4.0.7 + pako: 2.1.0 + snake-case: 3.0.4 + superstruct: 0.15.5 + toml: 3.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@coral-xyz/borsh@0.30.1(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + dependencies: + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bn.js: 5.2.1 + buffer-layout: 1.2.2 + + '@noble/curves@1.6.0': + dependencies: + '@noble/hashes': 1.5.0 + + '@noble/hashes@1.5.0': {} + + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.25.7 + '@noble/curves': 1.6.0 + '@noble/hashes': 1.5.0 + '@solana/buffer-layout': 4.0.1 + agentkeepalive: 4.5.0 + bigint-buffer: 1.1.5 + bn.js: 5.2.1 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + node-fetch: 2.7.0 + rpc-websockets: 9.0.4 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + '@swc/helpers@0.5.13': + dependencies: + tslib: 2.8.0 + + '@types/bn.js@5.1.6': + dependencies: + '@types/node': 22.7.7 + + '@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@22.7.7': + dependencies: + undici-types: 6.19.8 + + '@types/uuid@8.3.4': {} + + '@types/ws@7.4.7': + dependencies: + '@types/node': 12.20.55 + + '@types/ws@8.5.12': + dependencies: + '@types/node': 22.7.7 + + '@ungap/promise-all-settled@1.1.2': {} + + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + + agentkeepalive@4.5.0: + dependencies: + humanize-ms: 1.2.1 + + anchor-bankrun@0.5.0(@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(solana-bankrun@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + dependencies: + '@coral-xyz/anchor': 0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + solana-bankrun: 0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + ansi-colors@4.1.1: {} + + ansi-regex@5.0.1: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + argparse@2.0.1: {} + + arrify@1.0.1: {} + + assertion-error@1.1.0: {} + + balanced-match@1.0.2: {} + + base-x@3.0.10: + dependencies: + safe-buffer: 5.2.1 + + base64-js@1.5.1: {} + + bigint-buffer@1.1.5: + dependencies: + bindings: 1.5.0 + + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + + bn.js@5.2.1: {} + + borsh@0.7.0: + dependencies: + bn.js: 5.2.1 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-stdout@1.3.1: {} + + bs58@4.0.1: + dependencies: + base-x: 3.0.10 + + buffer-from@1.1.2: {} + + buffer-layout@1.2.2: {} + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bufferutil@4.0.8: + dependencies: + node-gyp-build: 4.8.2 + 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 + + 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@2.20.3: {} + + concat-map@0.0.1: {} + + cross-fetch@3.1.8: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + crypto-hash@1.3.0: {} + + 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.0: {} + + diff@5.0.0: {} + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.8.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@4.0.7: {} + + eventemitter3@5.0.1: {} + + eyes@0.1.8: {} + + fast-stable-stringify@1.0.0: {} + + file-uri-to-path@1.0.0: {} + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + flat@5.0.2: {} + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + get-caller-file@2.0.5: {} + + get-func-name@2.0.2: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob@7.2.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + growl@1.10.5: {} + + has-flag@4.0.0: {} + + he@1.2.0: {} + + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + + ieee754@1.2.1: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-number@7.0.0: {} + + is-plain-obj@2.1.0: {} + + is-unicode-supported@0.1.0: {} + + isexe@2.0.0: {} + + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + dependencies: + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) + + jayson@4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + JSONStream: 1.3.5 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + json-stringify-safe: 5.0.1 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + json-stringify-safe@5.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + optional: true + + jsonparse@1.3.1: {} + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lower-case@2.0.2: + dependencies: + tslib: 2.8.0 + + make-error@1.3.6: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@4.2.1: + dependencies: + brace-expansion: 1.1.11 + + minimist@1.2.8: {} + + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 + + mocha@9.2.2: + dependencies: + '@ungap/promise-all-settled': 1.1.2 + ansi-colors: 4.1.1 + browser-stdout: 1.3.1 + chokidar: 3.5.3 + debug: 4.3.3(supports-color@8.1.1) + diff: 5.0.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 7.2.0 + growl: 1.10.5 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 4.2.1 + ms: 2.1.3 + nanoid: 3.3.1 + serialize-javascript: 6.0.0 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + which: 2.0.2 + workerpool: 6.2.0 + yargs: 16.2.0 + yargs-parser: 20.2.4 + yargs-unparser: 2.0.0 + + ms@2.1.2: {} + + ms@2.1.3: {} + + nanoid@3.3.1: {} + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.8.0 + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-gyp-build@4.8.2: + optional: true + + normalize-path@3.0.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + pako@2.1.0: {} + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + pathval@1.1.1: {} + + picomatch@2.3.1: {} + + prettier@2.8.8: {} + + randombytes@2.1.0: + dependencies: + safe-buffer: 5.2.1 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + regenerator-runtime@0.14.1: {} + + require-directory@2.1.1: {} + + rpc-websockets@9.0.4: + dependencies: + '@swc/helpers': 0.5.13 + '@types/uuid': 8.3.4 + '@types/ws': 8.5.12 + buffer: 6.0.3 + eventemitter3: 5.0.1 + uuid: 8.3.2 + ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + safe-buffer@5.2.1: {} + + serialize-javascript@6.0.0: + dependencies: + randombytes: 2.1.0 + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.0 + + solana-bankrun-darwin-arm64@0.4.0: + optional: true + + solana-bankrun-darwin-universal@0.4.0: + optional: true + + solana-bankrun-darwin-x64@0.4.0: + optional: true + + solana-bankrun-linux-x64-gnu@0.4.0: + optional: true + + solana-bankrun-linux-x64-musl@0.4.0: + optional: true + + solana-bankrun@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + dependencies: + '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + bs58: 4.0.1 + optionalDependencies: + solana-bankrun-darwin-arm64: 0.4.0 + solana-bankrun-darwin-universal: 0.4.0 + solana-bankrun-darwin-x64: 0.4.0 + solana-bankrun-linux-x64-gnu: 0.4.0 + solana-bankrun-linux-x64-musl: 0.4.0 + transitivePeerDependencies: + - bufferutil + - encoding + - utf-8-validate + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-bom@3.0.0: + optional: true + + strip-json-comments@3.1.1: {} + + superstruct@0.15.5: {} + + superstruct@2.0.2: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + text-encoding-utf-8@1.0.2: {} + + through@2.3.8: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toml@3.0.0: {} + + tr46@0.0.3: {} + + ts-mocha@10.0.0(mocha@9.2.2): + dependencies: + mocha: 9.2.2 + ts-node: 7.0.1 + optionalDependencies: + tsconfig-paths: 3.15.0 + + ts-node@7.0.1: + dependencies: + arrify: 1.0.1 + buffer-from: 1.1.2 + diff: 3.5.0 + make-error: 1.3.6 + minimist: 1.2.8 + mkdirp: 0.5.6 + source-map-support: 0.5.21 + yn: 2.0.0 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + optional: true + + tslib@2.8.0: {} + + type-detect@4.1.0: {} + + typescript@4.9.5: {} + + undici-types@6.19.8: {} + + utf-8-validate@5.0.10: + dependencies: + node-gyp-build: 4.8.2 + optional: true + + uuid@8.3.2: {} + + webidl-conversions@3.0.1: {} + + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + workerpool@6.2.0: {} + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrappy@1.0.2: {} + + ws@7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): + optionalDependencies: + bufferutil: 4.0.8 + utf-8-validate: 5.0.10 + + y18n@5.0.8: {} + + yargs-parser@20.2.4: {} + + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.4 + + yn@2.0.0: {} + + yocto-queue@0.1.0: {} diff --git a/basics/close-account/poseidon/close_account_program/programs/close_account_program/Cargo.toml b/basics/close-account/poseidon/close_account_program/programs/close_account_program/Cargo.toml new file mode 100644 index 000000000..d8c723226 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/programs/close_account_program/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "close_account_program" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "close_account_program" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] + +[dependencies] +anchor-lang = "0.30.1" diff --git a/basics/close-account/poseidon/close_account_program/programs/close_account_program/Xargo.toml b/basics/close-account/poseidon/close_account_program/programs/close_account_program/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/programs/close_account_program/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs b/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs new file mode 100644 index 000000000..a37ff8347 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs @@ -0,0 +1,44 @@ +use anchor_lang::prelude::*; +declare_id!("2q4uoWExFAbZjeDe4n3miipsT9bX9vLnkSetCfZYF2VT"); +#[program] +pub mod close_account { + use super::*; + pub fn create_user(ctx: Context, name: u8) -> Result<()> { + ctx.accounts.user_account.user_bump = ctx.bumps.user_account; + ctx.accounts.user_account.user = ctx.accounts.user.key(); + ctx.accounts.user_account.name = name; + Ok(()) + } + pub fn close_user(ctx: Context) -> Result<()> { + Ok(()) + } +} +#[derive(Accounts)] +pub struct CreateUserContext<'info> { + #[account(mut)] + pub user: Signer<'info>, + #[account( + init, + payer = user, + space = 42, + seeds = [b"USER", + user.key().as_ref()], + bump, + )] + pub user_account: Account<'info, UserAccount>, + pub system_program: Program<'info, System>, +} +#[derive(Accounts)] +pub struct CloseUserContext<'info> { + #[account(mut)] + pub user: Signer<'info>, + #[account(mut, seeds = [b"USER", user.key().as_ref()], bump, close = user)] + pub user_account: Account<'info, UserAccount>, + pub system_program: Program<'info, System>, +} +#[account] +pub struct UserAccount { + pub user_bump: u8, + pub name: u8, + pub user: Pubkey, +} diff --git a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts new file mode 100644 index 000000000..f2c138663 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts @@ -0,0 +1,63 @@ +import assert from "node:assert"; +import { describe, it } from "node:test"; +import * as anchor from "@coral-xyz/anchor"; +import { PublicKey } from "@solana/web3.js"; +import { BankrunProvider } from "anchor-bankrun"; +import { startAnchor } from "solana-bankrun"; +import type { CloseAccountProgram } from "../target/types/close_account_program"; + +const IDL = require("../target/idl/close_account_program.json"); +const PROGRAM_ID = new PublicKey(IDL.address); + +describe("Close an account", async () => { + // Configure the client to use the local cluster. + const context = await startAnchor( + "", + [{ name: "close_account", programId: PROGRAM_ID }], + [] + ); + const provider = new BankrunProvider(context); + + const payer = provider.wallet as anchor.Wallet; + const program = new anchor.Program(IDL, provider); + // Derive the PDA for the user's account. + const [userAccountAddress] = PublicKey.findProgramAddressSync( + [Buffer.from("USER"), payer.publicKey.toBuffer()], + program.programId + ); + + it("Can create an account", async () => { + await program.methods + .createUser("John Doe") + .accounts({ + user: payer.publicKey, + }) + .rpc(); + + // Fetch the account data + const userAccount = await program.account.userAccount.fetch( + userAccountAddress + ); + assert.notEqual(userAccount, null); + }); + + it("Can close an Account", async () => { + await program.methods + .closeUser() + .accounts({ + user: payer.publicKey, + }) + .rpc(); + + // The account should no longer exist, returning null. + try { + const userAccount = await program.account.userAccount.fetchNullable( + userAccountAddress + ); + assert.equal(userAccount, null); + } catch (err) { + // Won't return null and will throw an error in anchor-bankrun' + assert.equal(err.message, `Could not find ${userAccountAddress}`); + } + }); +}); diff --git a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts new file mode 100644 index 000000000..2749c87ff --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts @@ -0,0 +1,51 @@ +import assert from "node:assert"; +import * as anchor from "@coral-xyz/anchor"; +import type { Program } from "@coral-xyz/anchor"; +import { PublicKey } from "@solana/web3.js"; +import type { CloseAccountProgram } from "../target/types/close_account_program"; + +describe("Close an account", () => { + // Configure the client to use the local cluster. + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + + const program = anchor.workspace.CloseAccountProgram as Program; + const payer = provider.wallet as anchor.Wallet; + + // Derive the PDA for the user's account. + const [userAccountAddress] = PublicKey.findProgramAddressSync( + [Buffer.from("USER"), payer.publicKey.toBuffer()], + program.programId + ); + + it("can create an account", async () => { + await program.methods + .createUser("John Doe") + .accounts({ + user: payer.publicKey, + }) + .rpc(); + + // Fetch the account data + const userAccount = await program.account.userAccount.fetch( + userAccountAddress + ); + assert.notEqual(userAccount, null) + }); + + it("can close an account", async () => { + await program.methods + .closeUser() + .accounts({ + user: payer.publicKey + // userAccount: userAccountAddress, + }) + .rpc(); + + // The account should no longer exist, returning null. + const userAccount = await program.account.userAccount.fetchNullable( + userAccountAddress + ); + assert.equal(userAccount, null); + }); +}); diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/package.json b/basics/close-account/poseidon/close_account_program/ts-programs/package.json new file mode 100644 index 000000000..bb6240a8f --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/ts-programs/package.json @@ -0,0 +1,15 @@ +{ + "name": "ts-programs", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@solanaturbine/poseidon": "^0.0.4" + } +} diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/pnpm-lock.yaml b/basics/close-account/poseidon/close_account_program/ts-programs/pnpm-lock.yaml new file mode 100644 index 000000000..0d5092821 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/ts-programs/pnpm-lock.yaml @@ -0,0 +1,22 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@solanaturbine/poseidon': + specifier: ^0.0.4 + version: 0.0.4 + +packages: + + '@solanaturbine/poseidon@0.0.4': + resolution: {integrity: sha512-VNQRtqobzBT+Wkh8fdPb0WVt12aIlgRJuGDxptclkphXi5w+VHUfMPcBshWSFPZg1nheXYgJABwvffYcyirw1g==} + +snapshots: + + '@solanaturbine/poseidon@0.0.4': {} diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts new file mode 100644 index 000000000..46f749ad6 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts @@ -0,0 +1,26 @@ +import { Account, Pubkey, Result, u8, Signer } from "@solanaturbine/poseidon"; + +export default class CloseAccount { + static PROGRAM_ID = new Pubkey( + "2q4uoWExFAbZjeDe4n3miipsT9bX9vLnkSetCfZYF2VT" + ); + + createUser(user: Signer, userAccount: UserAccount, name: u8): Result { + userAccount.derive(["USER", user.key]).init(); + + userAccount.userBump = userAccount.getBump(); + + userAccount.user = user.key; + + userAccount.name = name; + } + closeUser(userAccount: UserAccount, user: Signer): Result { + userAccount.derive(["USER", user.key]).close(user); + } +} + +export interface UserAccount extends Account { + userBump: u8; + name: u8; + user: Pubkey; +} diff --git a/basics/close-account/poseidon/close_account_program/tsconfig.json b/basics/close-account/poseidon/close_account_program/tsconfig.json new file mode 100644 index 000000000..cd5d2e3d0 --- /dev/null +++ b/basics/close-account/poseidon/close_account_program/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "types": ["mocha", "chai"], + "typeRoots": ["./node_modules/@types"], + "lib": ["es2015"], + "module": "commonjs", + "target": "es6", + "esModuleInterop": true + } +} From d3be853e3496398f531cae62c187aca070830fc1 Mon Sep 17 00:00:00 2001 From: adpthegreat Date: Wed, 23 Oct 2024 16:35:49 +0100 Subject: [PATCH 2/9] updated close account program change name to userId --- .../programs/close_account_program/src/lib.rs | 4 ++-- .../poseidon/close_account_program/tests/bankrun.test.ts | 3 ++- .../close_account_program/tests/close_account_program.ts | 5 +++-- .../ts-programs/src/close_account_program.ts | 8 ++++---- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs b/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs index a37ff8347..48b558349 100644 --- a/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs +++ b/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs @@ -3,7 +3,7 @@ declare_id!("2q4uoWExFAbZjeDe4n3miipsT9bX9vLnkSetCfZYF2VT"); #[program] pub mod close_account { use super::*; - pub fn create_user(ctx: Context, name: u8) -> Result<()> { + pub fn create_user(ctx: Context, name: u32) -> Result<()> { ctx.accounts.user_account.user_bump = ctx.bumps.user_account; ctx.accounts.user_account.user = ctx.accounts.user.key(); ctx.accounts.user_account.name = name; @@ -39,6 +39,6 @@ pub struct CloseUserContext<'info> { #[account] pub struct UserAccount { pub user_bump: u8, - pub name: u8, + pub name: u32, pub user: Pubkey, } diff --git a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts index f2c138663..e45007a99 100644 --- a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts +++ b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts @@ -27,8 +27,9 @@ describe("Close an account", async () => { ); it("Can create an account", async () => { + const userId = anchor.BN(76362) await program.methods - .createUser("John Doe") + .createUser(userId) .accounts({ user: payer.publicKey, }) diff --git a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts index 2749c87ff..6338db2da 100644 --- a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts +++ b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts @@ -19,8 +19,10 @@ describe("Close an account", () => { ); it("can create an account", async () => { + const userId = anchor.BN(76362) + await program.methods - .createUser("John Doe") + .createUser(userId) .accounts({ user: payer.publicKey, }) @@ -38,7 +40,6 @@ describe("Close an account", () => { .closeUser() .accounts({ user: payer.publicKey - // userAccount: userAccountAddress, }) .rpc(); diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts index 46f749ad6..8cf30c495 100644 --- a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts +++ b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts @@ -1,18 +1,18 @@ -import { Account, Pubkey, Result, u8, Signer } from "@solanaturbine/poseidon"; +import { Account, Pubkey, Result, u8, Signer, u32 } from "@solanaturbine/poseidon"; export default class CloseAccount { static PROGRAM_ID = new Pubkey( "2q4uoWExFAbZjeDe4n3miipsT9bX9vLnkSetCfZYF2VT" ); - createUser(user: Signer, userAccount: UserAccount, name: u8): Result { + createUser(user: Signer, userAccount: UserAccount, userId: u32): Result { userAccount.derive(["USER", user.key]).init(); userAccount.userBump = userAccount.getBump(); userAccount.user = user.key; - userAccount.name = name; + userAccount.userId = userId; } closeUser(userAccount: UserAccount, user: Signer): Result { userAccount.derive(["USER", user.key]).close(user); @@ -21,6 +21,6 @@ export default class CloseAccount { export interface UserAccount extends Account { userBump: u8; - name: u8; + userId: u32; user: Pubkey; } From c7e5deed9b5754b8050e38b953382d1c73b8915e Mon Sep 17 00:00:00 2001 From: adpthegreat Date: Wed, 23 Oct 2024 16:40:34 +0100 Subject: [PATCH 3/9] fix:ran pnpm fix --- .../migrations/deploy.ts | 4 +- .../tests/bankrun.test.ts | 45 +++++++------------ .../tests/close_account_program.ts | 35 ++++++--------- .../ts-programs/src/close_account_program.ts | 10 ++--- 4 files changed, 37 insertions(+), 57 deletions(-) diff --git a/basics/close-account/poseidon/close_account_program/migrations/deploy.ts b/basics/close-account/poseidon/close_account_program/migrations/deploy.ts index 82fb175fa..64a1c3599 100644 --- a/basics/close-account/poseidon/close_account_program/migrations/deploy.ts +++ b/basics/close-account/poseidon/close_account_program/migrations/deploy.ts @@ -2,9 +2,9 @@ // single deploy script that's invoked from the CLI, injecting a provider // configured from the workspace's Anchor.toml. -const anchor = require("@coral-xyz/anchor"); +const anchor = require('@coral-xyz/anchor'); -module.exports = async function (provider) { +module.exports = async (provider) => { // Configure client to use the provider. anchor.setProvider(provider); diff --git a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts index e45007a99..0822076f6 100644 --- a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts +++ b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts @@ -1,33 +1,26 @@ -import assert from "node:assert"; -import { describe, it } from "node:test"; -import * as anchor from "@coral-xyz/anchor"; -import { PublicKey } from "@solana/web3.js"; -import { BankrunProvider } from "anchor-bankrun"; -import { startAnchor } from "solana-bankrun"; -import type { CloseAccountProgram } from "../target/types/close_account_program"; +import assert from 'node:assert'; +import { describe, it } from 'node:test'; +import * as anchor from '@coral-xyz/anchor'; +import { PublicKey } from '@solana/web3.js'; +import { BankrunProvider } from 'anchor-bankrun'; +import { startAnchor } from 'solana-bankrun'; +import type { CloseAccountProgram } from '../target/types/close_account_program'; -const IDL = require("../target/idl/close_account_program.json"); +const IDL = require('../target/idl/close_account_program.json'); const PROGRAM_ID = new PublicKey(IDL.address); -describe("Close an account", async () => { +describe('Close an account', async () => { // Configure the client to use the local cluster. - const context = await startAnchor( - "", - [{ name: "close_account", programId: PROGRAM_ID }], - [] - ); + const context = await startAnchor('', [{ name: 'close_account', programId: PROGRAM_ID }], []); const provider = new BankrunProvider(context); const payer = provider.wallet as anchor.Wallet; const program = new anchor.Program(IDL, provider); // Derive the PDA for the user's account. - const [userAccountAddress] = PublicKey.findProgramAddressSync( - [Buffer.from("USER"), payer.publicKey.toBuffer()], - program.programId - ); + const [userAccountAddress] = PublicKey.findProgramAddressSync([Buffer.from('USER'), payer.publicKey.toBuffer()], program.programId); - it("Can create an account", async () => { - const userId = anchor.BN(76362) + it('Can create an account', async () => { + const userId = anchor.BN(76362); await program.methods .createUser(userId) .accounts({ @@ -36,13 +29,11 @@ describe("Close an account", async () => { .rpc(); // Fetch the account data - const userAccount = await program.account.userAccount.fetch( - userAccountAddress - ); - assert.notEqual(userAccount, null); + const userAccount = await program.account.userAccount.fetch(userAccountAddress); + assert.notEqual(userAccount, null); }); - it("Can close an Account", async () => { + it('Can close an Account', async () => { await program.methods .closeUser() .accounts({ @@ -52,9 +43,7 @@ describe("Close an account", async () => { // The account should no longer exist, returning null. try { - const userAccount = await program.account.userAccount.fetchNullable( - userAccountAddress - ); + const userAccount = await program.account.userAccount.fetchNullable(userAccountAddress); assert.equal(userAccount, null); } catch (err) { // Won't return null and will throw an error in anchor-bankrun' diff --git a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts index 6338db2da..88e27a967 100644 --- a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts +++ b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts @@ -1,10 +1,10 @@ -import assert from "node:assert"; -import * as anchor from "@coral-xyz/anchor"; -import type { Program } from "@coral-xyz/anchor"; -import { PublicKey } from "@solana/web3.js"; -import type { CloseAccountProgram } from "../target/types/close_account_program"; +import assert from 'node:assert'; +import * as anchor from '@coral-xyz/anchor'; +import type { Program } from '@coral-xyz/anchor'; +import { PublicKey } from '@solana/web3.js'; +import type { CloseAccountProgram } from '../target/types/close_account_program'; -describe("Close an account", () => { +describe('Close an account', () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); @@ -13,13 +13,10 @@ describe("Close an account", () => { const payer = provider.wallet as anchor.Wallet; // Derive the PDA for the user's account. - const [userAccountAddress] = PublicKey.findProgramAddressSync( - [Buffer.from("USER"), payer.publicKey.toBuffer()], - program.programId - ); + const [userAccountAddress] = PublicKey.findProgramAddressSync([Buffer.from('USER'), payer.publicKey.toBuffer()], program.programId); - it("can create an account", async () => { - const userId = anchor.BN(76362) + it('can create an account', async () => { + const userId = anchor.BN(76362); await program.methods .createUser(userId) @@ -29,24 +26,20 @@ describe("Close an account", () => { .rpc(); // Fetch the account data - const userAccount = await program.account.userAccount.fetch( - userAccountAddress - ); - assert.notEqual(userAccount, null) + const userAccount = await program.account.userAccount.fetch(userAccountAddress); + assert.notEqual(userAccount, null); }); - it("can close an account", async () => { + it('can close an account', async () => { await program.methods .closeUser() .accounts({ - user: payer.publicKey + user: payer.publicKey, }) .rpc(); // The account should no longer exist, returning null. - const userAccount = await program.account.userAccount.fetchNullable( - userAccountAddress - ); + const userAccount = await program.account.userAccount.fetchNullable(userAccountAddress); assert.equal(userAccount, null); }); }); diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts index 8cf30c495..143049d91 100644 --- a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts +++ b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts @@ -1,12 +1,10 @@ -import { Account, Pubkey, Result, u8, Signer, u32 } from "@solanaturbine/poseidon"; +import { Account, Pubkey, Result, Signer, u8, u32 } from '@solanaturbine/poseidon'; export default class CloseAccount { - static PROGRAM_ID = new Pubkey( - "2q4uoWExFAbZjeDe4n3miipsT9bX9vLnkSetCfZYF2VT" - ); + static PROGRAM_ID = new Pubkey('2q4uoWExFAbZjeDe4n3miipsT9bX9vLnkSetCfZYF2VT'); createUser(user: Signer, userAccount: UserAccount, userId: u32): Result { - userAccount.derive(["USER", user.key]).init(); + userAccount.derive(['USER', user.key]).init(); userAccount.userBump = userAccount.getBump(); @@ -15,7 +13,7 @@ export default class CloseAccount { userAccount.userId = userId; } closeUser(userAccount: UserAccount, user: Signer): Result { - userAccount.derive(["USER", user.key]).close(user); + userAccount.derive(['USER', user.key]).close(user); } } From dc0edda33d09ba24995ad0221e09485ec331a73e Mon Sep 17 00:00:00 2001 From: adpthegreat Date: Tue, 29 Oct 2024 11:07:28 +0100 Subject: [PATCH 4/9] updated tests, updated code to use newly added String type from poseidon --- .../close_account_program/Anchor.toml | 2 +- .../close_account_program/package.json | 3 +- .../close_account_program/pnpm-lock.yaml | 7 +- .../programs/close_account_program/src/lib.rs | 22 ++--- .../tests/bankrun.test.ts | 75 ++++++++++++---- .../tests/close_account_program.ts | 90 +++++++++---------- .../ts-programs/package.json | 2 +- .../ts-programs/src/close_account_program.ts | 20 ++--- 8 files changed, 134 insertions(+), 87 deletions(-) diff --git a/basics/close-account/poseidon/close_account_program/Anchor.toml b/basics/close-account/poseidon/close_account_program/Anchor.toml index 7fc259e89..088be402c 100644 --- a/basics/close-account/poseidon/close_account_program/Anchor.toml +++ b/basics/close-account/poseidon/close_account_program/Anchor.toml @@ -5,7 +5,7 @@ resolution = true skip-lint = false [programs.localnet] -close_account_program = "2q4uoWExFAbZjeDe4n3miipsT9bX9vLnkSetCfZYF2VT" +close_account_program = "DDhy3V9AQE4wrJ3DXC5Yop2p56J6TiBRaz4zjnYnK8ao" [registry] url = "https://api.apr.dev" diff --git a/basics/close-account/poseidon/close_account_program/package.json b/basics/close-account/poseidon/close_account_program/package.json index 151ba4340..1321fd8f8 100644 --- a/basics/close-account/poseidon/close_account_program/package.json +++ b/basics/close-account/poseidon/close_account_program/package.json @@ -8,7 +8,8 @@ "dependencies": { "@coral-xyz/anchor": "^0.30.1", "anchor-bankrun": "^0.5.0", - "solana-bankrun": "^0.4.0" + "solana-bankrun": "^0.4.0", + "@solana/web3.js": "^1.95.4" }, "devDependencies": { "@types/bn.js": "^5.1.0", diff --git a/basics/close-account/poseidon/close_account_program/pnpm-lock.yaml b/basics/close-account/poseidon/close_account_program/pnpm-lock.yaml index 9b79b8317..9c99347b3 100644 --- a/basics/close-account/poseidon/close_account_program/pnpm-lock.yaml +++ b/basics/close-account/poseidon/close_account_program/pnpm-lock.yaml @@ -11,6 +11,9 @@ importers: '@coral-xyz/anchor': specifier: ^0.30.1 version: 0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/web3.js': + specifier: ^1.95.4 + version: 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) anchor-bankrun: specifier: ^0.5.0 version: 0.5.0(@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(solana-bankrun@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) @@ -833,7 +836,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.7.7 '@types/json5@0.0.29': optional: true @@ -850,7 +853,7 @@ snapshots: '@types/ws@7.4.7': dependencies: - '@types/node': 12.20.55 + '@types/node': 22.7.7 '@types/ws@8.5.12': dependencies: diff --git a/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs b/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs index 48b558349..bae192036 100644 --- a/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs +++ b/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs @@ -1,12 +1,12 @@ use anchor_lang::prelude::*; -declare_id!("2q4uoWExFAbZjeDe4n3miipsT9bX9vLnkSetCfZYF2VT"); +declare_id!("DDhy3V9AQE4wrJ3DXC5Yop2p56J6TiBRaz4zjnYnK8ao"); #[program] pub mod close_account { use super::*; - pub fn create_user(ctx: Context, name: u32) -> Result<()> { - ctx.accounts.user_account.user_bump = ctx.bumps.user_account; - ctx.accounts.user_account.user = ctx.accounts.user.key(); - ctx.accounts.user_account.name = name; + pub fn create_user(ctx: Context, name: String) -> Result<()> { + ctx.accounts.user_state.user_bump = ctx.bumps.user_state; + ctx.accounts.user_state.user = ctx.accounts.user.key(); + ctx.accounts.user_state.name = name; Ok(()) } pub fn close_user(ctx: Context) -> Result<()> { @@ -20,25 +20,25 @@ pub struct CreateUserContext<'info> { #[account( init, payer = user, - space = 42, + space = 95, seeds = [b"USER", user.key().as_ref()], bump, )] - pub user_account: Account<'info, UserAccount>, + pub user_state: Account<'info, UserState>, pub system_program: Program<'info, System>, } #[derive(Accounts)] pub struct CloseUserContext<'info> { + #[account(mut, seeds = [b"USER", user.key().as_ref()], bump, close = user)] + pub user_account: Account<'info, UserState>, #[account(mut)] pub user: Signer<'info>, - #[account(mut, seeds = [b"USER", user.key().as_ref()], bump, close = user)] - pub user_account: Account<'info, UserAccount>, pub system_program: Program<'info, System>, } #[account] -pub struct UserAccount { +pub struct UserState { pub user_bump: u8, - pub name: u32, + pub name: String, pub user: Pubkey, } diff --git a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts index 0822076f6..b8dad80e1 100644 --- a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts +++ b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts @@ -1,53 +1,96 @@ import assert from 'node:assert'; import { describe, it } from 'node:test'; import * as anchor from '@coral-xyz/anchor'; -import { PublicKey } from '@solana/web3.js'; +import { + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, + Transaction, + TransactionInstruction, + TransactionMessage, + VersionedTransaction, + sendAndConfirmTransaction, +} from '@solana/web3.js'; import { BankrunProvider } from 'anchor-bankrun'; -import { startAnchor } from 'solana-bankrun'; -import type { CloseAccountProgram } from '../target/types/close_account_program'; +import { BanksClient, BanksTransactionResultWithMeta, startAnchor } from 'solana-bankrun'; +import type { CloseAccount } from '../target/types/close_account'; -const IDL = require('../target/idl/close_account_program.json'); +const IDL = require('../target/idl/close_account'); const PROGRAM_ID = new PublicKey(IDL.address); +async function createAndProcessTransaction( + client: BanksClient, + payer: Keypair, + instruction: TransactionInstruction, + additionalSigners: Keypair[] = [], +): Promise { + const tx = new Transaction(); + // Get the latest blockhash and minimum rent-exempt balance + const [latestBlockhash] = await client.getLatestBlockhash(); + tx.recentBlockhash = latestBlockhash; + // Add transaction instructions + tx.add(instruction); + tx.feePayer = payer.publicKey; + //Add signers + tx.sign(payer, ...additionalSigners); + const result = await client.tryProcessTransaction(tx); + return result; +} + describe('Close an account', async () => { // Configure the client to use the local cluster. - const context = await startAnchor('', [{ name: 'close_account', programId: PROGRAM_ID }], []); + const context = await startAnchor('', [{ name: 'close_account_program', programId: PROGRAM_ID }], []); const provider = new BankrunProvider(context); const payer = provider.wallet as anchor.Wallet; - const program = new anchor.Program(IDL, provider); + const program = new anchor.Program(IDL, provider); // Derive the PDA for the user's account. - const [userAccountAddress] = PublicKey.findProgramAddressSync([Buffer.from('USER'), payer.publicKey.toBuffer()], program.programId); + const user = Keypair.generate(); // Generate a new user keypair + + //Transfer SOL to the user account to cover rent + const transferInstruction = SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: user.publicKey, + lamports: 2 * LAMPORTS_PER_SOL, + }); + + await createAndProcessTransaction(context.banksClient, payer.payer, transferInstruction, [payer.payer]); + + const [userAccount, userAccountBump] = PublicKey.findProgramAddressSync([Buffer.from('USER'), user.publicKey.toBuffer()], program.programId); it('Can create an account', async () => { - const userId = anchor.BN(76362); await program.methods - .createUser(userId) + .createUser('Jacob') .accounts({ - user: payer.publicKey, + user: user.publicKey, }) + .signers([user]) .rpc(); // Fetch the account data - const userAccount = await program.account.userAccount.fetch(userAccountAddress); - assert.notEqual(userAccount, null); + const userAccountData = await program.account.userState.fetch(userAccount); + assert.equal(userAccountData.name, 'Jacob'); + assert.equal(userAccountData.user.toBase58(), user.publicKey.toBase58()); + assert.notEqual(userAccountData, null); }); it('Can close an Account', async () => { await program.methods .closeUser() .accounts({ - user: payer.publicKey, + user: user.publicKey, }) + .signers([user]) .rpc(); // The account should no longer exist, returning null. try { - const userAccount = await program.account.userAccount.fetchNullable(userAccountAddress); - assert.equal(userAccount, null); + const userAccountData = await program.account.userState.fetchNullable(userAccount); + assert.equal(userAccountData, null); } catch (err) { // Won't return null and will throw an error in anchor-bankrun' - assert.equal(err.message, `Could not find ${userAccountAddress}`); + assert.equal(err.message, `Could not find ${userAccount}`); } }); }); diff --git a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts index 88e27a967..a6e1afe08 100644 --- a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts +++ b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts @@ -1,45 +1,45 @@ -import assert from 'node:assert'; -import * as anchor from '@coral-xyz/anchor'; -import type { Program } from '@coral-xyz/anchor'; -import { PublicKey } from '@solana/web3.js'; -import type { CloseAccountProgram } from '../target/types/close_account_program'; - -describe('Close an account', () => { - // Configure the client to use the local cluster. - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - - const program = anchor.workspace.CloseAccountProgram as Program; - const payer = provider.wallet as anchor.Wallet; - - // Derive the PDA for the user's account. - const [userAccountAddress] = PublicKey.findProgramAddressSync([Buffer.from('USER'), payer.publicKey.toBuffer()], program.programId); - - it('can create an account', async () => { - const userId = anchor.BN(76362); - - await program.methods - .createUser(userId) - .accounts({ - user: payer.publicKey, - }) - .rpc(); - - // Fetch the account data - const userAccount = await program.account.userAccount.fetch(userAccountAddress); - assert.notEqual(userAccount, null); - }); - - it('can close an account', async () => { - await program.methods - .closeUser() - .accounts({ - user: payer.publicKey, - }) - .rpc(); - - // The account should no longer exist, returning null. - const userAccount = await program.account.userAccount.fetchNullable(userAccountAddress); - assert.equal(userAccount, null); - }); -}); +// import assert from 'node:assert'; +// import * as anchor from '@coral-xyz/anchor'; +// import type { Program } from '@coral-xyz/anchor'; +// import { PublicKey } from '@solana/web3.js'; +// import type { CloseAccount } from '../target/types/close_account'; + +// describe('Close an account', () => { +// // Configure the client to use the local cluster. +// const provider = anchor.AnchorProvider.env(); +// anchor.setProvider(provider); + +// const program = anchor.workspace.CloseAccountProgram as Program; +// const payer = provider.wallet as anchor.Wallet; + +// // Derive the PDA for the user's account. +// const [userAccountAddress] = PublicKey.findProgramAddressSync([Buffer.from('USER'), payer.publicKey.toBuffer()], program.programId); + +// it('can create an account', async () => { +// const userId = anchor.BN(76362); + +// await program.methods +// .createUser(userId) +// .accounts({ +// user: payer.publicKey, +// }) +// .rpc(); + +// // Fetch the account data +// const userAccount = await program.account.userAccount.fetch(userAccountAddress); +// assert.notEqual(userAccount, null); +// }); + +// it('can close an account', async () => { +// await program.methods +// .closeUser() +// .accounts({ +// user: payer.publicKey, +// }) +// .rpc(); + +// // The account should no longer exist, returning null. +// const userAccount = await program.account.userAccount.fetchNullable(userAccountAddress); +// assert.equal(userAccount, null); +// }); +// }); diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/package.json b/basics/close-account/poseidon/close_account_program/ts-programs/package.json index bb6240a8f..966692b97 100644 --- a/basics/close-account/poseidon/close_account_program/ts-programs/package.json +++ b/basics/close-account/poseidon/close_account_program/ts-programs/package.json @@ -10,6 +10,6 @@ "author": "", "license": "ISC", "dependencies": { - "@solanaturbine/poseidon": "^0.0.4" + "@solanaturbine/poseidon": "^0.0.8" } } diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts index 143049d91..9ee7108ea 100644 --- a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts +++ b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts @@ -1,24 +1,24 @@ -import { Account, Pubkey, Result, Signer, u8, u32 } from '@solanaturbine/poseidon'; +import { Account, String as PoseidonString, Pubkey, Result, Signer, u8 } from '@solanaturbine/poseidon'; export default class CloseAccount { - static PROGRAM_ID = new Pubkey('2q4uoWExFAbZjeDe4n3miipsT9bX9vLnkSetCfZYF2VT'); + static PROGRAM_ID = new Pubkey('DDhy3V9AQE4wrJ3DXC5Yop2p56J6TiBRaz4zjnYnK8ao'); - createUser(user: Signer, userAccount: UserAccount, userId: u32): Result { - userAccount.derive(['USER', user.key]).init(); + createUser(user: Signer, userState: UserState, name: PoseidonString<50>): Result { + userState.derive(['USER', user.key]).init(); - userAccount.userBump = userAccount.getBump(); + userState.userBump = userState.getBump(); - userAccount.user = user.key; + userState.user = user.key; - userAccount.userId = userId; + userState.name = name; } - closeUser(userAccount: UserAccount, user: Signer): Result { + closeUser(userAccount: UserState, user: Signer): Result { userAccount.derive(['USER', user.key]).close(user); } } -export interface UserAccount extends Account { +export interface UserState extends Account { userBump: u8; - userId: u32; + name: PoseidonString<50>; user: Pubkey; } From c1e8eb9771ac1945bb2e285effb4639f0c32fec9 Mon Sep 17 00:00:00 2001 From: adpthegreat Date: Tue, 29 Oct 2024 11:21:59 +0100 Subject: [PATCH 5/9] tweaked bankrun tests a bit --- .../tests/bankrun.test.ts | 52 +++++++++++++------ 1 file changed, 35 insertions(+), 17 deletions(-) diff --git a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts index b8dad80e1..0d4b27068 100644 --- a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts +++ b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts @@ -1,5 +1,5 @@ import assert from 'node:assert'; -import { describe, it } from 'node:test'; +import {before, describe, it} from "node:test" import * as anchor from '@coral-xyz/anchor'; import { Keypair, @@ -26,7 +26,7 @@ async function createAndProcessTransaction( additionalSigners: Keypair[] = [], ): Promise { const tx = new Transaction(); - // Get the latest blockhash and minimum rent-exempt balance + // Get the latest blockhash const [latestBlockhash] = await client.getLatestBlockhash(); tx.recentBlockhash = latestBlockhash; // Add transaction instructions @@ -34,34 +34,50 @@ async function createAndProcessTransaction( tx.feePayer = payer.publicKey; //Add signers tx.sign(payer, ...additionalSigners); + // Process transaction const result = await client.tryProcessTransaction(tx); return result; } describe('Close an account', async () => { // Configure the client to use the local cluster. - const context = await startAnchor('', [{ name: 'close_account_program', programId: PROGRAM_ID }], []); + const context = await startAnchor( + "", + [{ name: "close_account_program", programId: PROGRAM_ID }], + [] + ); const provider = new BankrunProvider(context); const payer = provider.wallet as anchor.Wallet; const program = new anchor.Program(IDL, provider); - // Derive the PDA for the user's account. + const user = Keypair.generate(); // Generate a new user keypair - //Transfer SOL to the user account to cover rent - const transferInstruction = SystemProgram.transfer({ - fromPubkey: payer.publicKey, - toPubkey: user.publicKey, - lamports: 2 * LAMPORTS_PER_SOL, - }); + before(async () => { + //Transfer SOL to the user account to cover rent + const transferInstruction = SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: user.publicKey, + lamports: 2 * LAMPORTS_PER_SOL, + }); - await createAndProcessTransaction(context.banksClient, payer.payer, transferInstruction, [payer.payer]); + await createAndProcessTransaction( + context.banksClient, + payer.payer, + transferInstruction, + [payer.payer] + ); + }); - const [userAccount, userAccountBump] = PublicKey.findProgramAddressSync([Buffer.from('USER'), user.publicKey.toBuffer()], program.programId); + // Derive the PDA for the user's account. + const [userAccount, userAccountBump] = PublicKey.findProgramAddressSync( + [Buffer.from("USER"), user.publicKey.toBuffer()], + program.programId + ); - it('Can create an account', async () => { + it("Can create an account", async () => { await program.methods - .createUser('Jacob') + .createUser("Jacob") .accounts({ user: user.publicKey, }) @@ -70,12 +86,12 @@ describe('Close an account', async () => { // Fetch the account data const userAccountData = await program.account.userState.fetch(userAccount); - assert.equal(userAccountData.name, 'Jacob'); + assert.equal(userAccountData.name, "Jacob"); assert.equal(userAccountData.user.toBase58(), user.publicKey.toBase58()); assert.notEqual(userAccountData, null); }); - it('Can close an Account', async () => { + it("Can close an Account", async () => { await program.methods .closeUser() .accounts({ @@ -86,7 +102,9 @@ describe('Close an account', async () => { // The account should no longer exist, returning null. try { - const userAccountData = await program.account.userState.fetchNullable(userAccount); + const userAccountData = await program.account.userState.fetchNullable( + userAccount + ); assert.equal(userAccountData, null); } catch (err) { // Won't return null and will throw an error in anchor-bankrun' From e3ca144812551fb22a77276f03fc0124d4cf799a Mon Sep 17 00:00:00 2001 From: adpthegreat Date: Wed, 30 Oct 2024 22:10:22 +0100 Subject: [PATCH 6/9] updated tests --- .../close_account_program/Anchor.toml | 2 +- .../programs/close_account_program/src/lib.rs | 2 +- .../tests/bankrun.test.ts | 2 +- .../tests/close_account_program.ts | 176 +++++++++++++----- .../ts-programs/src/close_account_program.ts | 14 +- 5 files changed, 144 insertions(+), 52 deletions(-) diff --git a/basics/close-account/poseidon/close_account_program/Anchor.toml b/basics/close-account/poseidon/close_account_program/Anchor.toml index 088be402c..1dade2367 100644 --- a/basics/close-account/poseidon/close_account_program/Anchor.toml +++ b/basics/close-account/poseidon/close_account_program/Anchor.toml @@ -5,7 +5,7 @@ resolution = true skip-lint = false [programs.localnet] -close_account_program = "DDhy3V9AQE4wrJ3DXC5Yop2p56J6TiBRaz4zjnYnK8ao" +close_account_program = "AtUc6zMfozxrQoK4PbDUnd5daS86XCPuT2og1293P5XX" [registry] url = "https://api.apr.dev" diff --git a/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs b/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs index bae192036..811df4899 100644 --- a/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs +++ b/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs @@ -1,5 +1,5 @@ use anchor_lang::prelude::*; -declare_id!("DDhy3V9AQE4wrJ3DXC5Yop2p56J6TiBRaz4zjnYnK8ao"); +declare_id!("AtUc6zMfozxrQoK4PbDUnd5daS86XCPuT2og1293P5XX"); #[program] pub mod close_account { use super::*; diff --git a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts index 0d4b27068..91f42b140 100644 --- a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts +++ b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts @@ -16,7 +16,7 @@ import { BankrunProvider } from 'anchor-bankrun'; import { BanksClient, BanksTransactionResultWithMeta, startAnchor } from 'solana-bankrun'; import type { CloseAccount } from '../target/types/close_account'; -const IDL = require('../target/idl/close_account'); +const IDL = require('../target/idl/close_account.json'); const PROGRAM_ID = new PublicKey(IDL.address); async function createAndProcessTransaction( diff --git a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts index a6e1afe08..48e56c8fd 100644 --- a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts +++ b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts @@ -1,45 +1,131 @@ -// import assert from 'node:assert'; -// import * as anchor from '@coral-xyz/anchor'; -// import type { Program } from '@coral-xyz/anchor'; -// import { PublicKey } from '@solana/web3.js'; -// import type { CloseAccount } from '../target/types/close_account'; - -// describe('Close an account', () => { -// // Configure the client to use the local cluster. -// const provider = anchor.AnchorProvider.env(); -// anchor.setProvider(provider); - -// const program = anchor.workspace.CloseAccountProgram as Program; -// const payer = provider.wallet as anchor.Wallet; - -// // Derive the PDA for the user's account. -// const [userAccountAddress] = PublicKey.findProgramAddressSync([Buffer.from('USER'), payer.publicKey.toBuffer()], program.programId); - -// it('can create an account', async () => { -// const userId = anchor.BN(76362); - -// await program.methods -// .createUser(userId) -// .accounts({ -// user: payer.publicKey, -// }) -// .rpc(); - -// // Fetch the account data -// const userAccount = await program.account.userAccount.fetch(userAccountAddress); -// assert.notEqual(userAccount, null); -// }); - -// it('can close an account', async () => { -// await program.methods -// .closeUser() -// .accounts({ -// user: payer.publicKey, -// }) -// .rpc(); - -// // The account should no longer exist, returning null. -// const userAccount = await program.account.userAccount.fetchNullable(userAccountAddress); -// assert.equal(userAccount, null); -// }); -// }); +import assert from "node:assert"; +import * as anchor from "@coral-xyz/anchor"; +import type { Program } from "@coral-xyz/anchor"; +import { + Connection, + Keypair, + LAMPORTS_PER_SOL, + PublicKey, + SystemProgram, + Transaction, + TransactionInstruction, + TransactionMessage, + VersionedTransaction, +} from "@solana/web3.js"; +import type { CloseAccount } from "../target/types/close_account"; + + const connection = new Connection("https://api.devnet.solana.com"); + + async function createAndProcessTransaction( + payer: Keypair, + instruction: TransactionInstruction, + additionalSigners: Keypair[] = [] + ): Promise<{ transaction: VersionedTransaction; signature: string | null }> { + // Get the latest blockhash + const { blockhash, lastValidBlockHeight } = await getLatestBlockhash(); + const message = new TransactionMessage({ + payerKey: payer.publicKey, + recentBlockhash: blockhash, + instructions: [instruction], + }).compileToV0Message(); + + const tx = new VersionedTransaction(message); + + try { + const signature = await sendAndConfirmTransaction(tx); + return { transaction: tx, signature }; + } catch (err) { + return { transaction: tx, signature: null }; + } + } + + async function getLatestBlockhash(): Promise<{ + blockhash: string; + lastValidBlockHeight: number; + }> { + const { blockhash, lastValidBlockHeight } = + await connection.getLatestBlockhash("finalized"); + return { blockhash, lastValidBlockHeight }; + } + + async function sendAndConfirmTransaction(tx: VersionedTransaction): Promise { + + const signature = await connection.sendTransaction(tx); + + const { blockhash, lastValidBlockHeight } = await getLatestBlockhash(); + + await connection.confirmTransaction({ + blockhash: blockhash, + lastValidBlockHeight: lastValidBlockHeight, + signature: signature, + }); + + return signature; +} + +describe("Close an account", () => { + // Configure the client to use the local cluster. + const provider = anchor.AnchorProvider.env(); + anchor.setProvider(provider); + + const program = anchor.workspace.CloseAccountProgram as Program; + const payer = provider.wallet as anchor.Wallet; + + const user = Keypair.generate(); // Generate a new user keypair + + before(async () => { + //Transfer SOL to the user account to cover rent + const transferInstruction = SystemProgram.transfer({ + fromPubkey: payer.publicKey, + toPubkey: user.publicKey, + lamports: 2 * LAMPORTS_PER_SOL, + }); + + await createAndProcessTransaction(payer.payer, transferInstruction, [ + payer.payer, + ]); + }); + + // Derive the PDA for the user's account. + const [userAccount, userAccountBump] = PublicKey.findProgramAddressSync( + [Buffer.from("USER"), payer.publicKey.toBuffer()], + program.programId + ); + + it("Can create an account", async () => { + await program.methods + .createUser("Jacob") + .accounts({ + user: user.publicKey, + }) + .signers([user]) + .rpc(); + + // Fetch the account data + const userAccountData = await program.account.userState.fetch(userAccount); + assert.equal(userAccountData.name, "Jacob"); + assert.equal(userAccountData.user.toBase58(), user.publicKey.toBase58()); + assert.notEqual(userAccountData, null); + }); + + it("Can close an Account", async () => { + await program.methods + .closeUser() + .accounts({ + user: user.publicKey, + }) + .signers([user]) + .rpc(); + + // The account should no longer exist, returning null. + try { + const userAccountData = await program.account.userState.fetchNullable( + userAccount + ); + assert.equal(userAccountData, null); + } catch (err) { + // Won't return null and will throw an error in anchor-bankrun' + assert.equal(err.message, `Could not find ${userAccount}`); + } + }); +}); diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts index 9ee7108ea..e2d716357 100644 --- a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts +++ b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts @@ -1,10 +1,16 @@ import { Account, String as PoseidonString, Pubkey, Result, Signer, u8 } from '@solanaturbine/poseidon'; export default class CloseAccount { - static PROGRAM_ID = new Pubkey('DDhy3V9AQE4wrJ3DXC5Yop2p56J6TiBRaz4zjnYnK8ao'); + static PROGRAM_ID = new Pubkey( + "AtUc6zMfozxrQoK4PbDUnd5daS86XCPuT2og1293P5XXo" + ); - createUser(user: Signer, userState: UserState, name: PoseidonString<50>): Result { - userState.derive(['USER', user.key]).init(); + createUser( + user: Signer, + userState: UserState, + name: PoseidonString<50> + ): Result { + userState.derive(["USER", user.key]).init(); userState.userBump = userState.getBump(); @@ -13,7 +19,7 @@ export default class CloseAccount { userState.name = name; } closeUser(userAccount: UserState, user: Signer): Result { - userAccount.derive(['USER', user.key]).close(user); + userAccount.derive(["USER", user.key]).close(user); } } From 1a20098e7e178a4bd4c0973847c4cdc726796e14 Mon Sep 17 00:00:00 2001 From: adpthegreat Date: Wed, 30 Oct 2024 22:14:04 +0100 Subject: [PATCH 7/9] ran pnpm fix --- .../programs/close_account_program/Cargo.toml | 20 --- .../programs/close_account_program/Xargo.toml | 2 - .../programs/close_account_program/src/lib.rs | 44 ------- .../tests/bankrun.test.ts | 32 ++--- .../tests/close_account_program.ts | 115 ++++++++---------- .../ts-programs/src/close_account_program.ts | 14 +-- 6 files changed, 66 insertions(+), 161 deletions(-) delete mode 100644 basics/close-account/poseidon/close_account_program/programs/close_account_program/Cargo.toml delete mode 100644 basics/close-account/poseidon/close_account_program/programs/close_account_program/Xargo.toml delete mode 100644 basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs diff --git a/basics/close-account/poseidon/close_account_program/programs/close_account_program/Cargo.toml b/basics/close-account/poseidon/close_account_program/programs/close_account_program/Cargo.toml deleted file mode 100644 index d8c723226..000000000 --- a/basics/close-account/poseidon/close_account_program/programs/close_account_program/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "close_account_program" -version = "0.1.0" -description = "Created with Anchor" -edition = "2021" - -[lib] -crate-type = ["cdylib", "lib"] -name = "close_account_program" - -[features] -default = [] -cpi = ["no-entrypoint"] -no-entrypoint = [] -no-idl = [] -no-log-ix-name = [] -idl-build = ["anchor-lang/idl-build"] - -[dependencies] -anchor-lang = "0.30.1" diff --git a/basics/close-account/poseidon/close_account_program/programs/close_account_program/Xargo.toml b/basics/close-account/poseidon/close_account_program/programs/close_account_program/Xargo.toml deleted file mode 100644 index 475fb71ed..000000000 --- a/basics/close-account/poseidon/close_account_program/programs/close_account_program/Xargo.toml +++ /dev/null @@ -1,2 +0,0 @@ -[target.bpfel-unknown-unknown.dependencies.std] -features = [] diff --git a/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs b/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs deleted file mode 100644 index 811df4899..000000000 --- a/basics/close-account/poseidon/close_account_program/programs/close_account_program/src/lib.rs +++ /dev/null @@ -1,44 +0,0 @@ -use anchor_lang::prelude::*; -declare_id!("AtUc6zMfozxrQoK4PbDUnd5daS86XCPuT2og1293P5XX"); -#[program] -pub mod close_account { - use super::*; - pub fn create_user(ctx: Context, name: String) -> Result<()> { - ctx.accounts.user_state.user_bump = ctx.bumps.user_state; - ctx.accounts.user_state.user = ctx.accounts.user.key(); - ctx.accounts.user_state.name = name; - Ok(()) - } - pub fn close_user(ctx: Context) -> Result<()> { - Ok(()) - } -} -#[derive(Accounts)] -pub struct CreateUserContext<'info> { - #[account(mut)] - pub user: Signer<'info>, - #[account( - init, - payer = user, - space = 95, - seeds = [b"USER", - user.key().as_ref()], - bump, - )] - pub user_state: Account<'info, UserState>, - pub system_program: Program<'info, System>, -} -#[derive(Accounts)] -pub struct CloseUserContext<'info> { - #[account(mut, seeds = [b"USER", user.key().as_ref()], bump, close = user)] - pub user_account: Account<'info, UserState>, - #[account(mut)] - pub user: Signer<'info>, - pub system_program: Program<'info, System>, -} -#[account] -pub struct UserState { - pub user_bump: u8, - pub name: String, - pub user: Pubkey, -} diff --git a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts index 91f42b140..9400c31ea 100644 --- a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts +++ b/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts @@ -1,5 +1,5 @@ import assert from 'node:assert'; -import {before, describe, it} from "node:test" +import { before, describe, it } from 'node:test'; import * as anchor from '@coral-xyz/anchor'; import { Keypair, @@ -41,11 +41,7 @@ async function createAndProcessTransaction( describe('Close an account', async () => { // Configure the client to use the local cluster. - const context = await startAnchor( - "", - [{ name: "close_account_program", programId: PROGRAM_ID }], - [] - ); + const context = await startAnchor('', [{ name: 'close_account_program', programId: PROGRAM_ID }], []); const provider = new BankrunProvider(context); const payer = provider.wallet as anchor.Wallet; @@ -61,23 +57,15 @@ describe('Close an account', async () => { lamports: 2 * LAMPORTS_PER_SOL, }); - await createAndProcessTransaction( - context.banksClient, - payer.payer, - transferInstruction, - [payer.payer] - ); + await createAndProcessTransaction(context.banksClient, payer.payer, transferInstruction, [payer.payer]); }); // Derive the PDA for the user's account. - const [userAccount, userAccountBump] = PublicKey.findProgramAddressSync( - [Buffer.from("USER"), user.publicKey.toBuffer()], - program.programId - ); + const [userAccount, userAccountBump] = PublicKey.findProgramAddressSync([Buffer.from('USER'), user.publicKey.toBuffer()], program.programId); - it("Can create an account", async () => { + it('Can create an account', async () => { await program.methods - .createUser("Jacob") + .createUser('Jacob') .accounts({ user: user.publicKey, }) @@ -86,12 +74,12 @@ describe('Close an account', async () => { // Fetch the account data const userAccountData = await program.account.userState.fetch(userAccount); - assert.equal(userAccountData.name, "Jacob"); + assert.equal(userAccountData.name, 'Jacob'); assert.equal(userAccountData.user.toBase58(), user.publicKey.toBase58()); assert.notEqual(userAccountData, null); }); - it("Can close an Account", async () => { + it('Can close an Account', async () => { await program.methods .closeUser() .accounts({ @@ -102,9 +90,7 @@ describe('Close an account', async () => { // The account should no longer exist, returning null. try { - const userAccountData = await program.account.userState.fetchNullable( - userAccount - ); + const userAccountData = await program.account.userState.fetchNullable(userAccount); assert.equal(userAccountData, null); } catch (err) { // Won't return null and will throw an error in anchor-bankrun' diff --git a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts index 48e56c8fd..94d37abdf 100644 --- a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts +++ b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts @@ -1,6 +1,6 @@ -import assert from "node:assert"; -import * as anchor from "@coral-xyz/anchor"; -import type { Program } from "@coral-xyz/anchor"; +import assert from 'node:assert'; +import * as anchor from '@coral-xyz/anchor'; +import type { Program } from '@coral-xyz/anchor'; import { Connection, Keypair, @@ -11,59 +11,57 @@ import { TransactionInstruction, TransactionMessage, VersionedTransaction, -} from "@solana/web3.js"; -import type { CloseAccount } from "../target/types/close_account"; - - const connection = new Connection("https://api.devnet.solana.com"); - - async function createAndProcessTransaction( - payer: Keypair, - instruction: TransactionInstruction, - additionalSigners: Keypair[] = [] - ): Promise<{ transaction: VersionedTransaction; signature: string | null }> { - // Get the latest blockhash - const { blockhash, lastValidBlockHeight } = await getLatestBlockhash(); - const message = new TransactionMessage({ - payerKey: payer.publicKey, - recentBlockhash: blockhash, - instructions: [instruction], - }).compileToV0Message(); - - const tx = new VersionedTransaction(message); - - try { - const signature = await sendAndConfirmTransaction(tx); - return { transaction: tx, signature }; - } catch (err) { - return { transaction: tx, signature: null }; - } - } - - async function getLatestBlockhash(): Promise<{ - blockhash: string; - lastValidBlockHeight: number; - }> { - const { blockhash, lastValidBlockHeight } = - await connection.getLatestBlockhash("finalized"); - return { blockhash, lastValidBlockHeight }; +} from '@solana/web3.js'; +import type { CloseAccount } from '../target/types/close_account'; + +const connection = new Connection('https://api.devnet.solana.com'); + +async function createAndProcessTransaction( + payer: Keypair, + instruction: TransactionInstruction, + additionalSigners: Keypair[] = [], +): Promise<{ transaction: VersionedTransaction; signature: string | null }> { + // Get the latest blockhash + const { blockhash, lastValidBlockHeight } = await getLatestBlockhash(); + const message = new TransactionMessage({ + payerKey: payer.publicKey, + recentBlockhash: blockhash, + instructions: [instruction], + }).compileToV0Message(); + + const tx = new VersionedTransaction(message); + + try { + const signature = await sendAndConfirmTransaction(tx); + return { transaction: tx, signature }; + } catch (err) { + return { transaction: tx, signature: null }; } +} - async function sendAndConfirmTransaction(tx: VersionedTransaction): Promise { +async function getLatestBlockhash(): Promise<{ + blockhash: string; + lastValidBlockHeight: number; +}> { + const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash('finalized'); + return { blockhash, lastValidBlockHeight }; +} - const signature = await connection.sendTransaction(tx); +async function sendAndConfirmTransaction(tx: VersionedTransaction): Promise { + const signature = await connection.sendTransaction(tx); - const { blockhash, lastValidBlockHeight } = await getLatestBlockhash(); + const { blockhash, lastValidBlockHeight } = await getLatestBlockhash(); - await connection.confirmTransaction({ - blockhash: blockhash, - lastValidBlockHeight: lastValidBlockHeight, - signature: signature, - }); + await connection.confirmTransaction({ + blockhash: blockhash, + lastValidBlockHeight: lastValidBlockHeight, + signature: signature, + }); - return signature; + return signature; } -describe("Close an account", () => { +describe('Close an account', () => { // Configure the client to use the local cluster. const provider = anchor.AnchorProvider.env(); anchor.setProvider(provider); @@ -81,20 +79,15 @@ describe("Close an account", () => { lamports: 2 * LAMPORTS_PER_SOL, }); - await createAndProcessTransaction(payer.payer, transferInstruction, [ - payer.payer, - ]); + await createAndProcessTransaction(payer.payer, transferInstruction, [payer.payer]); }); // Derive the PDA for the user's account. - const [userAccount, userAccountBump] = PublicKey.findProgramAddressSync( - [Buffer.from("USER"), payer.publicKey.toBuffer()], - program.programId - ); + const [userAccount, userAccountBump] = PublicKey.findProgramAddressSync([Buffer.from('USER'), payer.publicKey.toBuffer()], program.programId); - it("Can create an account", async () => { + it('Can create an account', async () => { await program.methods - .createUser("Jacob") + .createUser('Jacob') .accounts({ user: user.publicKey, }) @@ -103,12 +96,12 @@ describe("Close an account", () => { // Fetch the account data const userAccountData = await program.account.userState.fetch(userAccount); - assert.equal(userAccountData.name, "Jacob"); + assert.equal(userAccountData.name, 'Jacob'); assert.equal(userAccountData.user.toBase58(), user.publicKey.toBase58()); assert.notEqual(userAccountData, null); }); - it("Can close an Account", async () => { + it('Can close an Account', async () => { await program.methods .closeUser() .accounts({ @@ -119,9 +112,7 @@ describe("Close an account", () => { // The account should no longer exist, returning null. try { - const userAccountData = await program.account.userState.fetchNullable( - userAccount - ); + const userAccountData = await program.account.userState.fetchNullable(userAccount); assert.equal(userAccountData, null); } catch (err) { // Won't return null and will throw an error in anchor-bankrun' diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts index e2d716357..ac15b9297 100644 --- a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts +++ b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts @@ -1,16 +1,10 @@ import { Account, String as PoseidonString, Pubkey, Result, Signer, u8 } from '@solanaturbine/poseidon'; export default class CloseAccount { - static PROGRAM_ID = new Pubkey( - "AtUc6zMfozxrQoK4PbDUnd5daS86XCPuT2og1293P5XXo" - ); + static PROGRAM_ID = new Pubkey('AtUc6zMfozxrQoK4PbDUnd5daS86XCPuT2og1293P5XXo'); - createUser( - user: Signer, - userState: UserState, - name: PoseidonString<50> - ): Result { - userState.derive(["USER", user.key]).init(); + createUser(user: Signer, userState: UserState, name: PoseidonString<50>): Result { + userState.derive(['USER', user.key]).init(); userState.userBump = userState.getBump(); @@ -19,7 +13,7 @@ export default class CloseAccount { userState.name = name; } closeUser(userAccount: UserState, user: Signer): Result { - userAccount.derive(["USER", user.key]).close(user); + userAccount.derive(['USER', user.key]).close(user); } } From 42b1f9b052819cd560f88726dbe10f65c24f39c7 Mon Sep 17 00:00:00 2001 From: adpthegreat Date: Mon, 25 Nov 2024 09:28:17 +0100 Subject: [PATCH 8/9] feat:fixed strings, updated cargo.lock --- Cargo.lock | 169 +++++++++++++----- .../ts-programs/src/close_account_program.ts | 8 +- 2 files changed, 131 insertions(+), 46 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f54b45b7b..c8e52a0b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -15,7 +15,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -219,7 +219,7 @@ dependencies = [ "borsh 0.10.3", "bytemuck", "getrandom 0.2.15", - "solana-program", + "solana-program 1.18.17", "thiserror", ] @@ -451,6 +451,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "bincode" version = "1.3.3" @@ -738,7 +744,7 @@ dependencies = [ name = "checking-accounts-program" version = "0.1.0" dependencies = [ - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -765,7 +771,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -807,7 +813,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "shank", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -815,7 +821,7 @@ name = "counter-solana-native" version = "0.1.0" dependencies = [ "borsh 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -838,7 +844,7 @@ dependencies = [ name = "create-account-program" version = "0.1.0" dependencies = [ - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1154,7 +1160,7 @@ dependencies = [ name = "hello-solana-program" version = "0.1.0" dependencies = [ - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1571,7 +1577,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1674,7 +1680,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1683,7 +1689,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1692,7 +1698,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1830,7 +1836,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -1884,7 +1890,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -2202,13 +2208,59 @@ dependencies = [ "sha3 0.10.8", "solana-frozen-abi", "solana-frozen-abi-macro", - "solana-sdk-macro", + "solana-sdk-macro 1.18.17", "thiserror", "tiny-bip39", "wasm-bindgen", "zeroize", ] +[[package]] +name = "solana-program" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "676cb677930c71e989df31f34640e29c927f0bbc07ce85a1598ff549ef85cb5d" +dependencies = [ + "ark-bn254", + "ark-ec", + "ark-ff", + "ark-serialize", + "base64 0.22.1", + "bincode", + "bitflags", + "blake3", + "borsh 0.10.3", + "borsh 1.5.1", + "bs58 0.5.1", + "bv", + "bytemuck", + "bytemuck_derive", + "console_error_panic_hook", + "console_log", + "curve25519-dalek", + "getrandom 0.2.15", + "js-sys", + "lazy_static", + "libsecp256k1", + "log", + "memoffset", + "num-bigint", + "num-derive 0.4.2", + "num-traits", + "parking_lot", + "rand 0.8.5", + "rustc_version", + "rustversion", + "serde", + "serde_bytes", + "serde_derive", + "sha2 0.10.8", + "sha3 0.10.8", + "solana-sdk-macro 2.0.17", + "thiserror", + "wasm-bindgen", +] + [[package]] name = "solana-sdk" version = "1.18.17" @@ -2257,8 +2309,8 @@ dependencies = [ "solana-frozen-abi", "solana-frozen-abi-macro", "solana-logger", - "solana-program", - "solana-sdk-macro", + "solana-program 1.18.17", + "solana-sdk-macro 1.18.17", "thiserror", "uriparse", "wasm-bindgen", @@ -2277,6 +2329,19 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "solana-sdk-macro" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0768aa8d51ef38e559784ccd62f0523f3e6ed9ba8903f49fb1d961ee8aff4f3e" +dependencies = [ + "bs58 0.5.1", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.72", +] + [[package]] name = "solana-security-txt" version = "1.1.1" @@ -2305,7 +2370,7 @@ dependencies = [ "serde", "serde_json", "sha3 0.9.1", - "solana-program", + "solana-program 1.18.17", "solana-sdk", "subtle", "thiserror", @@ -2322,7 +2387,7 @@ dependencies = [ "borsh 0.10.3", "num-derive 0.4.2", "num-traits", - "solana-program", + "solana-program 1.18.17", "spl-token", "spl-token-2022 1.0.0", "thiserror", @@ -2335,7 +2400,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cce5d563b58ef1bb2cdbbfe0dfb9ffdc24903b10ae6a4df2d8f425ece375033f" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator-derive", ] @@ -2369,7 +2434,7 @@ version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd0dc6f70db6bacea7ff25870b016a65ba1d1b6013536f08e4fd79a8f9005325" dependencies = [ - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -2378,7 +2443,7 @@ version = "4.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a49f49f95f2d02111ded31696ab38a081fab623d4c76bd4cb074286db4560836" dependencies = [ - "solana-program", + "solana-program 1.18.17", ] [[package]] @@ -2389,7 +2454,7 @@ checksum = "2881dddfca792737c0706fa0175345ab282b1b0879c7d877bad129645737c079" dependencies = [ "borsh 0.10.3", "bytemuck", - "solana-program", + "solana-program 1.18.17", "solana-zk-token-sdk", "spl-program-error 0.3.0", ] @@ -2402,7 +2467,7 @@ checksum = "af92f74cd3b0fdfda59fef4b571a92123e4df0f67cc43f73163975d31118ef82" dependencies = [ "num-derive 0.3.3", "num-traits", - "solana-program", + "solana-program 1.18.17", "spl-program-error-derive 0.2.0", "thiserror", ] @@ -2415,7 +2480,7 @@ checksum = "249e0318493b6bcf27ae9902600566c689b7dfba9f1bdff5893e92253374e78c" dependencies = [ "num-derive 0.4.2", "num-traits", - "solana-program", + "solana-program 1.18.17", "spl-program-error-derive 0.3.2", "thiserror", ] @@ -2450,7 +2515,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82149a5a06b5f158d03904066375eaf0c8a2422557cc3d5a25d277260d9a3b16" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-program-error 0.2.0", "spl-type-length-value 0.2.0", @@ -2463,7 +2528,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "615d381f48ddd2bb3c57c7f7fb207591a2a05054639b18a62e785117dd7a8683" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-pod", "spl-program-error 0.3.0", @@ -2481,7 +2546,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "num_enum 0.7.3", - "solana-program", + "solana-program 1.18.17", "thiserror", ] @@ -2496,7 +2561,7 @@ dependencies = [ "num-derive 0.3.3", "num-traits", "num_enum 0.6.1", - "solana-program", + "solana-program 1.18.17", "solana-zk-token-sdk", "spl-memo 3.0.1", "spl-token", @@ -2515,7 +2580,7 @@ dependencies = [ "num-derive 0.4.2", "num-traits", "num_enum 0.7.3", - "solana-program", + "solana-program 1.18.17", "solana-security-txt", "solana-zk-token-sdk", "spl-memo 4.0.4", @@ -2535,7 +2600,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b889509d49fa74a4a033ca5dae6c2307e9e918122d97e58562f5c4ffa795c75d" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-pod", "spl-program-error 0.3.0", @@ -2548,7 +2613,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c16ce3ba6979645fb7627aa1e435576172dd63088dc7848cb09aa331fa1fe4f" dependencies = [ "borsh 0.10.3", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-pod", "spl-program-error 0.3.0", @@ -2566,7 +2631,7 @@ dependencies = [ "num-derive 0.3.3", "num-traits", "num_enum 0.6.1", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-tlv-account-resolution 0.2.0", "spl-type-length-value 0.2.0", @@ -2581,7 +2646,7 @@ checksum = "7aabdb7c471566f6ddcee724beb8618449ea24b399e58d464d6b5bc7db550259" dependencies = [ "arrayref", "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-pod", "spl-program-error 0.3.0", @@ -2596,7 +2661,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1d085f426b33b8365fb98383d1b8b3925e21bdfe579c851ceaa7f511dbec191" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-program-error 0.2.0", ] @@ -2608,12 +2673,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a468e6f6371f9c69aae760186ea9f1a01c2908351b06a5e0026d21cfc4d7ecac" dependencies = [ "bytemuck", - "solana-program", + "solana-program 1.18.17", "spl-discriminator", "spl-pod", "spl-program-error 0.3.0", ] +[[package]] +name = "steel" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d88c610ca9fd5e4e51bdb6e9964114133a42f006713fe38aff37266fac91e1be" +dependencies = [ + "bytemuck", + "num_enum 0.7.3", + "solana-program 1.18.17", + "thiserror", +] + +[[package]] +name = "steel-hello-solana" +version = "0.1.0" +dependencies = [ + "solana-program 2.0.17", + "steel", +] + [[package]] name = "strsim" version = "0.11.1" @@ -2729,7 +2814,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -2740,7 +2825,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -2751,7 +2836,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -2762,7 +2847,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -2773,7 +2858,7 @@ version = "0.1.0" dependencies = [ "borsh 0.10.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", "spl-associated-token-account", "spl-token-2022 0.7.0", ] @@ -2856,7 +2941,7 @@ version = "0.1.0" dependencies = [ "borsh 0.9.3", "borsh-derive 0.9.3", - "solana-program", + "solana-program 1.18.17", ] [[package]] diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts index ac15b9297..e6f92743d 100644 --- a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts +++ b/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts @@ -1,10 +1,10 @@ -import { Account, String as PoseidonString, Pubkey, Result, Signer, u8 } from '@solanaturbine/poseidon'; +import { Account, String, Pubkey, Result, Signer, u8 } from '@solanaturbine/poseidon'; export default class CloseAccount { static PROGRAM_ID = new Pubkey('AtUc6zMfozxrQoK4PbDUnd5daS86XCPuT2og1293P5XXo'); - createUser(user: Signer, userState: UserState, name: PoseidonString<50>): Result { - userState.derive(['USER', user.key]).init(); + createUser(user: Signer, userState: UserState, name: String<50>): Result { + userState.derive(['USER', user.key]).init(user); userState.userBump = userState.getBump(); @@ -19,6 +19,6 @@ export default class CloseAccount { export interface UserState extends Account { userBump: u8; - name: PoseidonString<50>; + name: String<50>; user: Pubkey; } From 8e3abca60ff6855f2d2fb424b917881c2f80011e Mon Sep 17 00:00:00 2001 From: adpthegreat Date: Thu, 28 Nov 2024 07:52:45 +0100 Subject: [PATCH 9/9] added close-account program --- .../{close_account_program => }/Anchor.toml | 2 +- .../{close_account_program => }/Cargo.toml | 0 .../poseidon/close_account_program/.gitignore | 7 - .../close_account_program/.prettierignore | 7 - .../tests/close_account_program.ts | 122 ---------------- .../ts-programs/pnpm-lock.yaml | 22 --- .../migrations/deploy.ts | 0 .../{close_account_program => }/package.json | 14 +- .../pnpm-lock.yaml | 130 +++++++++--------- .../programs/close-account-program/Cargo.toml | 20 +++ .../programs/close-account-program/Xargo.toml | 2 + .../programs/close-account-program/src/lib.rs | 44 ++++++ .../tests/bankrun.test.ts | 6 +- .../ts-programs/package.json | 2 +- .../poseidon/ts-programs/pnpm-lock.yaml | 22 +++ .../src/closeAccountProgram.ts} | 6 +- .../{close_account_program => }/tsconfig.json | 0 17 files changed, 171 insertions(+), 235 deletions(-) rename basics/close-account/poseidon/{close_account_program => }/Anchor.toml (79%) rename basics/close-account/poseidon/{close_account_program => }/Cargo.toml (100%) delete mode 100644 basics/close-account/poseidon/close_account_program/.gitignore delete mode 100644 basics/close-account/poseidon/close_account_program/.prettierignore delete mode 100644 basics/close-account/poseidon/close_account_program/tests/close_account_program.ts delete mode 100644 basics/close-account/poseidon/close_account_program/ts-programs/pnpm-lock.yaml rename basics/close-account/poseidon/{close_account_program => }/migrations/deploy.ts (100%) rename basics/close-account/poseidon/{close_account_program => }/package.json (80%) rename basics/close-account/poseidon/{close_account_program => }/pnpm-lock.yaml (92%) create mode 100644 basics/close-account/poseidon/programs/close-account-program/Cargo.toml create mode 100644 basics/close-account/poseidon/programs/close-account-program/Xargo.toml create mode 100644 basics/close-account/poseidon/programs/close-account-program/src/lib.rs rename basics/close-account/poseidon/{close_account_program => }/tests/bankrun.test.ts (93%) rename basics/close-account/poseidon/{close_account_program => }/ts-programs/package.json (85%) create mode 100644 basics/close-account/poseidon/ts-programs/pnpm-lock.yaml rename basics/close-account/poseidon/{close_account_program/ts-programs/src/close_account_program.ts => ts-programs/src/closeAccountProgram.ts} (72%) rename basics/close-account/poseidon/{close_account_program => }/tsconfig.json (100%) diff --git a/basics/close-account/poseidon/close_account_program/Anchor.toml b/basics/close-account/poseidon/Anchor.toml similarity index 79% rename from basics/close-account/poseidon/close_account_program/Anchor.toml rename to basics/close-account/poseidon/Anchor.toml index 1dade2367..16f8c2480 100644 --- a/basics/close-account/poseidon/close_account_program/Anchor.toml +++ b/basics/close-account/poseidon/Anchor.toml @@ -5,7 +5,7 @@ resolution = true skip-lint = false [programs.localnet] -close_account_program = "AtUc6zMfozxrQoK4PbDUnd5daS86XCPuT2og1293P5XX" +close_account_program = "Cp1rfMVrJoD9aNT8dGVoPAf2BrY6HBMXbsTPfd2heV6C" [registry] url = "https://api.apr.dev" diff --git a/basics/close-account/poseidon/close_account_program/Cargo.toml b/basics/close-account/poseidon/Cargo.toml similarity index 100% rename from basics/close-account/poseidon/close_account_program/Cargo.toml rename to basics/close-account/poseidon/Cargo.toml diff --git a/basics/close-account/poseidon/close_account_program/.gitignore b/basics/close-account/poseidon/close_account_program/.gitignore deleted file mode 100644 index 2e0446b07..000000000 --- a/basics/close-account/poseidon/close_account_program/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -.anchor -.DS_Store -target -**/*.rs.bk -node_modules -test-ledger -.yarn diff --git a/basics/close-account/poseidon/close_account_program/.prettierignore b/basics/close-account/poseidon/close_account_program/.prettierignore deleted file mode 100644 index 414258343..000000000 --- a/basics/close-account/poseidon/close_account_program/.prettierignore +++ /dev/null @@ -1,7 +0,0 @@ -.anchor -.DS_Store -target -node_modules -dist -build -test-ledger diff --git a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts b/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts deleted file mode 100644 index 94d37abdf..000000000 --- a/basics/close-account/poseidon/close_account_program/tests/close_account_program.ts +++ /dev/null @@ -1,122 +0,0 @@ -import assert from 'node:assert'; -import * as anchor from '@coral-xyz/anchor'; -import type { Program } from '@coral-xyz/anchor'; -import { - Connection, - Keypair, - LAMPORTS_PER_SOL, - PublicKey, - SystemProgram, - Transaction, - TransactionInstruction, - TransactionMessage, - VersionedTransaction, -} from '@solana/web3.js'; -import type { CloseAccount } from '../target/types/close_account'; - -const connection = new Connection('https://api.devnet.solana.com'); - -async function createAndProcessTransaction( - payer: Keypair, - instruction: TransactionInstruction, - additionalSigners: Keypair[] = [], -): Promise<{ transaction: VersionedTransaction; signature: string | null }> { - // Get the latest blockhash - const { blockhash, lastValidBlockHeight } = await getLatestBlockhash(); - const message = new TransactionMessage({ - payerKey: payer.publicKey, - recentBlockhash: blockhash, - instructions: [instruction], - }).compileToV0Message(); - - const tx = new VersionedTransaction(message); - - try { - const signature = await sendAndConfirmTransaction(tx); - return { transaction: tx, signature }; - } catch (err) { - return { transaction: tx, signature: null }; - } -} - -async function getLatestBlockhash(): Promise<{ - blockhash: string; - lastValidBlockHeight: number; -}> { - const { blockhash, lastValidBlockHeight } = await connection.getLatestBlockhash('finalized'); - return { blockhash, lastValidBlockHeight }; -} - -async function sendAndConfirmTransaction(tx: VersionedTransaction): Promise { - const signature = await connection.sendTransaction(tx); - - const { blockhash, lastValidBlockHeight } = await getLatestBlockhash(); - - await connection.confirmTransaction({ - blockhash: blockhash, - lastValidBlockHeight: lastValidBlockHeight, - signature: signature, - }); - - return signature; -} - -describe('Close an account', () => { - // Configure the client to use the local cluster. - const provider = anchor.AnchorProvider.env(); - anchor.setProvider(provider); - - const program = anchor.workspace.CloseAccountProgram as Program; - const payer = provider.wallet as anchor.Wallet; - - const user = Keypair.generate(); // Generate a new user keypair - - before(async () => { - //Transfer SOL to the user account to cover rent - const transferInstruction = SystemProgram.transfer({ - fromPubkey: payer.publicKey, - toPubkey: user.publicKey, - lamports: 2 * LAMPORTS_PER_SOL, - }); - - await createAndProcessTransaction(payer.payer, transferInstruction, [payer.payer]); - }); - - // Derive the PDA for the user's account. - const [userAccount, userAccountBump] = PublicKey.findProgramAddressSync([Buffer.from('USER'), payer.publicKey.toBuffer()], program.programId); - - it('Can create an account', async () => { - await program.methods - .createUser('Jacob') - .accounts({ - user: user.publicKey, - }) - .signers([user]) - .rpc(); - - // Fetch the account data - const userAccountData = await program.account.userState.fetch(userAccount); - assert.equal(userAccountData.name, 'Jacob'); - assert.equal(userAccountData.user.toBase58(), user.publicKey.toBase58()); - assert.notEqual(userAccountData, null); - }); - - it('Can close an Account', async () => { - await program.methods - .closeUser() - .accounts({ - user: user.publicKey, - }) - .signers([user]) - .rpc(); - - // The account should no longer exist, returning null. - try { - const userAccountData = await program.account.userState.fetchNullable(userAccount); - assert.equal(userAccountData, null); - } catch (err) { - // Won't return null and will throw an error in anchor-bankrun' - assert.equal(err.message, `Could not find ${userAccount}`); - } - }); -}); diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/pnpm-lock.yaml b/basics/close-account/poseidon/close_account_program/ts-programs/pnpm-lock.yaml deleted file mode 100644 index 0d5092821..000000000 --- a/basics/close-account/poseidon/close_account_program/ts-programs/pnpm-lock.yaml +++ /dev/null @@ -1,22 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@solanaturbine/poseidon': - specifier: ^0.0.4 - version: 0.0.4 - -packages: - - '@solanaturbine/poseidon@0.0.4': - resolution: {integrity: sha512-VNQRtqobzBT+Wkh8fdPb0WVt12aIlgRJuGDxptclkphXi5w+VHUfMPcBshWSFPZg1nheXYgJABwvffYcyirw1g==} - -snapshots: - - '@solanaturbine/poseidon@0.0.4': {} diff --git a/basics/close-account/poseidon/close_account_program/migrations/deploy.ts b/basics/close-account/poseidon/migrations/deploy.ts similarity index 100% rename from basics/close-account/poseidon/close_account_program/migrations/deploy.ts rename to basics/close-account/poseidon/migrations/deploy.ts diff --git a/basics/close-account/poseidon/close_account_program/package.json b/basics/close-account/poseidon/package.json similarity index 80% rename from basics/close-account/poseidon/close_account_program/package.json rename to basics/close-account/poseidon/package.json index 1321fd8f8..ae34cfea9 100644 --- a/basics/close-account/poseidon/close_account_program/package.json +++ b/basics/close-account/poseidon/package.json @@ -7,18 +7,18 @@ }, "dependencies": { "@coral-xyz/anchor": "^0.30.1", + "@solana/web3.js": "^1.95.4", "anchor-bankrun": "^0.5.0", - "solana-bankrun": "^0.4.0", - "@solana/web3.js": "^1.95.4" + "solana-bankrun": "^0.4.0" }, "devDependencies": { - "@types/bn.js": "^5.1.0", - "@types/chai": "^4.3.0", - "@types/mocha": "^9.0.0", "chai": "^4.3.4", "mocha": "^9.0.3", - "prettier": "^2.6.2", "ts-mocha": "^10.0.0", - "typescript": "^4.3.5" + "@types/bn.js": "^5.1.0", + "@types/chai": "^4.3.0", + "@types/mocha": "^9.0.0", + "typescript": "^4.3.5", + "prettier": "^2.6.2" } } diff --git a/basics/close-account/poseidon/close_account_program/pnpm-lock.yaml b/basics/close-account/poseidon/pnpm-lock.yaml similarity index 92% rename from basics/close-account/poseidon/close_account_program/pnpm-lock.yaml rename to basics/close-account/poseidon/pnpm-lock.yaml index 9c99347b3..92ebc0a67 100644 --- a/basics/close-account/poseidon/close_account_program/pnpm-lock.yaml +++ b/basics/close-account/poseidon/pnpm-lock.yaml @@ -13,10 +13,10 @@ importers: version: 0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) '@solana/web3.js': specifier: ^1.95.4 - version: 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + version: 1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) anchor-bankrun: specifier: ^0.5.0 - version: 0.5.0(@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(solana-bankrun@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + version: 0.5.0(@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(solana-bankrun@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)) solana-bankrun: specifier: ^0.4.0 version: 0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) @@ -48,8 +48,8 @@ importers: packages: - '@babel/runtime@7.25.7': - resolution: {integrity: sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==} + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} engines: {node: '>=6.9.0'} '@coral-xyz/anchor-errors@0.30.1': @@ -66,23 +66,27 @@ packages: peerDependencies: '@solana/web3.js': ^1.68.0 - '@noble/curves@1.6.0': - resolution: {integrity: sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==} + '@noble/curves@1.7.0': + resolution: {integrity: sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw==} engines: {node: ^14.21.3 || >=16} - '@noble/hashes@1.5.0': - resolution: {integrity: sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==} + '@noble/hashes@1.6.0': + resolution: {integrity: sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ==} + engines: {node: ^14.21.3 || >=16} + + '@noble/hashes@1.6.1': + resolution: {integrity: sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w==} engines: {node: ^14.21.3 || >=16} '@solana/buffer-layout@4.0.1': resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} engines: {node: '>=5.10'} - '@solana/web3.js@1.95.4': - resolution: {integrity: sha512-sdewnNEA42ZSMxqkzdwEWi6fDgzwtJHaQa5ndUGEJYtoOnM6X5cvPmjoTUp7/k7bRrVAxfBgDnvQQHD6yhlLYw==} + '@solana/web3.js@1.95.5': + resolution: {integrity: sha512-hU9cBrbg1z6gEjLH9vwIckGBVB78Ijm0iZFNk4ocm5OD82piPwuk3MeQ1rfiKD9YQtr95krrcaopb49EmQJlRg==} - '@swc/helpers@0.5.13': - resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} '@types/bn.js@5.1.6': resolution: {integrity: sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w==} @@ -102,8 +106,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@22.7.7': - resolution: {integrity: sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==} + '@types/node@22.10.0': + resolution: {integrity: sha512-XC70cRZVElFHfIUB40FgZOBbgJYFKKMa5nb9lxcwYstFG/Mi+/Y0bGS+rs6Dmhmkpq4pnNiLiuZAbc02YCOnmA==} '@types/uuid@8.3.4': resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} @@ -111,8 +115,8 @@ packages: '@types/ws@7.4.7': resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} - '@types/ws@8.5.12': - resolution: {integrity: sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==} + '@types/ws@8.5.13': + resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} '@ungap/promise-all-settled@1.1.2': resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} @@ -415,8 +419,8 @@ packages: peerDependencies: ws: '*' - jayson@4.1.2: - resolution: {integrity: sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA==} + jayson@4.1.3: + resolution: {integrity: sha512-LtXh5aYZodBZ9Fc3j6f2w+MTNcnxteMOrb+QgIouguGOulWi0lieEkOUg+HkjjFs0DGoWDds6bi4E9hpNFLulQ==} engines: {node: '>=8'} hasBin: true @@ -494,8 +498,8 @@ packages: encoding: optional: true - node-gyp-build@4.8.2: - resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true normalize-path@3.0.0: @@ -664,8 +668,8 @@ packages: tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - tslib@2.8.0: - resolution: {integrity: sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} type-detect@4.1.0: resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} @@ -676,8 +680,8 @@ packages: engines: {node: '>=4.2.0'} hasBin: true - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} utf-8-validate@5.0.10: resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} @@ -758,7 +762,7 @@ packages: snapshots: - '@babel/runtime@7.25.7': + '@babel/runtime@7.26.0': dependencies: regenerator-runtime: 0.14.1 @@ -767,9 +771,9 @@ snapshots: '@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/anchor-errors': 0.30.1 - '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)) - '@noble/hashes': 1.5.0 - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@coral-xyz/borsh': 0.30.1(@solana/web3.js@1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)) + '@noble/hashes': 1.6.1 + '@solana/web3.js': 1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) bn.js: 5.2.1 bs58: 4.0.1 buffer-layout: 1.2.2 @@ -786,27 +790,29 @@ snapshots: - encoding - utf-8-validate - '@coral-xyz/borsh@0.30.1(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))': + '@coral-xyz/borsh@0.30.1(@solana/web3.js@1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))': dependencies: - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) bn.js: 5.2.1 buffer-layout: 1.2.2 - '@noble/curves@1.6.0': + '@noble/curves@1.7.0': dependencies: - '@noble/hashes': 1.5.0 + '@noble/hashes': 1.6.0 + + '@noble/hashes@1.6.0': {} - '@noble/hashes@1.5.0': {} + '@noble/hashes@1.6.1': {} '@solana/buffer-layout@4.0.1': dependencies: buffer: 6.0.3 - '@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10)': + '@solana/web3.js@1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10)': dependencies: - '@babel/runtime': 7.25.7 - '@noble/curves': 1.6.0 - '@noble/hashes': 1.5.0 + '@babel/runtime': 7.26.0 + '@noble/curves': 1.7.0 + '@noble/hashes': 1.6.1 '@solana/buffer-layout': 4.0.1 agentkeepalive: 4.5.0 bigint-buffer: 1.1.5 @@ -815,7 +821,7 @@ snapshots: bs58: 4.0.1 buffer: 6.0.3 fast-stable-stringify: 1.0.0 - jayson: 4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10) + jayson: 4.1.3(bufferutil@4.0.8)(utf-8-validate@5.0.10) node-fetch: 2.7.0 rpc-websockets: 9.0.4 superstruct: 2.0.2 @@ -824,19 +830,19 @@ snapshots: - encoding - utf-8-validate - '@swc/helpers@0.5.13': + '@swc/helpers@0.5.15': dependencies: - tslib: 2.8.0 + tslib: 2.8.1 '@types/bn.js@5.1.6': dependencies: - '@types/node': 22.7.7 + '@types/node': 22.10.0 '@types/chai@4.3.20': {} '@types/connect@3.4.38': dependencies: - '@types/node': 22.7.7 + '@types/node': 22.10.0 '@types/json5@0.0.29': optional: true @@ -845,19 +851,19 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@22.7.7': + '@types/node@22.10.0': dependencies: - undici-types: 6.19.8 + undici-types: 6.20.0 '@types/uuid@8.3.4': {} '@types/ws@7.4.7': dependencies: - '@types/node': 22.7.7 + '@types/node': 22.10.0 - '@types/ws@8.5.12': + '@types/ws@8.5.13': dependencies: - '@types/node': 22.7.7 + '@types/node': 22.10.0 '@ungap/promise-all-settled@1.1.2': {} @@ -870,10 +876,10 @@ snapshots: dependencies: humanize-ms: 1.2.1 - anchor-bankrun@0.5.0(@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10))(solana-bankrun@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)): + anchor-bankrun@0.5.0(@coral-xyz/anchor@0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10))(@solana/web3.js@1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10))(solana-bankrun@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10)): dependencies: '@coral-xyz/anchor': 0.30.1(bufferutil@4.0.8)(utf-8-validate@5.0.10) - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) solana-bankrun: 0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10) ansi-colors@4.1.1: {} @@ -947,7 +953,7 @@ snapshots: bufferutil@4.0.8: dependencies: - node-gyp-build: 4.8.2 + node-gyp-build: 4.8.4 optional: true camelcase@6.3.0: {} @@ -1028,7 +1034,7 @@ snapshots: dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.8.0 + tslib: 2.8.1 emoji-regex@8.0.0: {} @@ -1128,7 +1134,7 @@ snapshots: dependencies: ws: 7.5.10(bufferutil@4.0.8)(utf-8-validate@5.0.10) - jayson@4.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10): + jayson@4.1.3(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: '@types/connect': 3.4.38 '@types/node': 12.20.55 @@ -1174,7 +1180,7 @@ snapshots: lower-case@2.0.2: dependencies: - tslib: 2.8.0 + tslib: 2.8.1 make-error@1.3.6: {} @@ -1228,13 +1234,13 @@ snapshots: no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.8.0 + tslib: 2.8.1 node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 - node-gyp-build@4.8.2: + node-gyp-build@4.8.4: optional: true normalize-path@3.0.0: {} @@ -1277,9 +1283,9 @@ snapshots: rpc-websockets@9.0.4: dependencies: - '@swc/helpers': 0.5.13 + '@swc/helpers': 0.5.15 '@types/uuid': 8.3.4 - '@types/ws': 8.5.12 + '@types/ws': 8.5.13 buffer: 6.0.3 eventemitter3: 5.0.1 uuid: 8.3.2 @@ -1297,7 +1303,7 @@ snapshots: snake-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.8.0 + tslib: 2.8.1 solana-bankrun-darwin-arm64@0.4.0: optional: true @@ -1316,7 +1322,7 @@ snapshots: solana-bankrun@0.4.0(bufferutil@4.0.8)(utf-8-validate@5.0.10): dependencies: - '@solana/web3.js': 1.95.4(bufferutil@4.0.8)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.95.5(bufferutil@4.0.8)(utf-8-validate@5.0.10) bs58: 4.0.1 optionalDependencies: solana-bankrun-darwin-arm64: 0.4.0 @@ -1401,17 +1407,17 @@ snapshots: strip-bom: 3.0.0 optional: true - tslib@2.8.0: {} + tslib@2.8.1: {} type-detect@4.1.0: {} typescript@4.9.5: {} - undici-types@6.19.8: {} + undici-types@6.20.0: {} utf-8-validate@5.0.10: dependencies: - node-gyp-build: 4.8.2 + node-gyp-build: 4.8.4 optional: true uuid@8.3.2: {} diff --git a/basics/close-account/poseidon/programs/close-account-program/Cargo.toml b/basics/close-account/poseidon/programs/close-account-program/Cargo.toml new file mode 100644 index 000000000..41ba2a5a0 --- /dev/null +++ b/basics/close-account/poseidon/programs/close-account-program/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "close-account-program" +version = "0.1.0" +description = "Created with Anchor" +edition = "2021" + +[lib] +crate-type = ["cdylib", "lib"] +name = "close_account_program" + +[features] +default = [] +cpi = ["no-entrypoint"] +no-entrypoint = [] +no-idl = [] +no-log-ix-name = [] +idl-build = ["anchor-lang/idl-build"] + +[dependencies] +anchor-lang = "0.30.1" diff --git a/basics/close-account/poseidon/programs/close-account-program/Xargo.toml b/basics/close-account/poseidon/programs/close-account-program/Xargo.toml new file mode 100644 index 000000000..475fb71ed --- /dev/null +++ b/basics/close-account/poseidon/programs/close-account-program/Xargo.toml @@ -0,0 +1,2 @@ +[target.bpfel-unknown-unknown.dependencies.std] +features = [] diff --git a/basics/close-account/poseidon/programs/close-account-program/src/lib.rs b/basics/close-account/poseidon/programs/close-account-program/src/lib.rs new file mode 100644 index 000000000..63b150f28 --- /dev/null +++ b/basics/close-account/poseidon/programs/close-account-program/src/lib.rs @@ -0,0 +1,44 @@ +use anchor_lang::prelude::*; +declare_id!("Cp1rfMVrJoD9aNT8dGVoPAf2BrY6HBMXbsTPfd2heV6C"); +#[program] +pub mod close_account_program { + use super::*; + pub fn create_user(ctx: Context, name: String) -> Result<()> { + ctx.accounts.user_state.user_bump = ctx.bumps.user_state; + ctx.accounts.user_state.user = ctx.accounts.user.key(); + ctx.accounts.user_state.name = name; + Ok(()) + } + pub fn close_user(ctx: Context) -> Result<()> { + Ok(()) + } +} +#[derive(Accounts)] +pub struct CreateUserContext<'info> { + #[account(mut)] + pub user: Signer<'info>, + #[account( + init, + payer = user, + space = 95, + seeds = [b"USER", + user.key().as_ref()], + bump, + )] + pub user_state: Account<'info, UserState>, + pub system_program: Program<'info, System>, +} +#[derive(Accounts)] +pub struct CloseUserContext<'info> { + #[account(mut)] + pub user: Signer<'info>, + #[account(mut, seeds = [b"USER", user.key().as_ref()], bump, close = user)] + pub user_account: Account<'info, UserState>, + pub system_program: Program<'info, System>, +} +#[account] +pub struct UserState { + pub user_bump: u8, + pub name: String, + pub user: Pubkey, +} diff --git a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts b/basics/close-account/poseidon/tests/bankrun.test.ts similarity index 93% rename from basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts rename to basics/close-account/poseidon/tests/bankrun.test.ts index 9400c31ea..535949ac4 100644 --- a/basics/close-account/poseidon/close_account_program/tests/bankrun.test.ts +++ b/basics/close-account/poseidon/tests/bankrun.test.ts @@ -14,9 +14,9 @@ import { } from '@solana/web3.js'; import { BankrunProvider } from 'anchor-bankrun'; import { BanksClient, BanksTransactionResultWithMeta, startAnchor } from 'solana-bankrun'; -import type { CloseAccount } from '../target/types/close_account'; +import type { CloseAccountProgram } from '../target/types/close_account_program'; -const IDL = require('../target/idl/close_account.json'); +const IDL = require('../target/idl/close_account_program.json'); const PROGRAM_ID = new PublicKey(IDL.address); async function createAndProcessTransaction( @@ -45,7 +45,7 @@ describe('Close an account', async () => { const provider = new BankrunProvider(context); const payer = provider.wallet as anchor.Wallet; - const program = new anchor.Program(IDL, provider); + const program = new anchor.Program(IDL, provider); const user = Keypair.generate(); // Generate a new user keypair diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/package.json b/basics/close-account/poseidon/ts-programs/package.json similarity index 85% rename from basics/close-account/poseidon/close_account_program/ts-programs/package.json rename to basics/close-account/poseidon/ts-programs/package.json index 966692b97..6382941c4 100644 --- a/basics/close-account/poseidon/close_account_program/ts-programs/package.json +++ b/basics/close-account/poseidon/ts-programs/package.json @@ -10,6 +10,6 @@ "author": "", "license": "ISC", "dependencies": { - "@solanaturbine/poseidon": "^0.0.8" + "@solanaturbine/poseidon": "^0.0.10" } } diff --git a/basics/close-account/poseidon/ts-programs/pnpm-lock.yaml b/basics/close-account/poseidon/ts-programs/pnpm-lock.yaml new file mode 100644 index 000000000..64f3eedd2 --- /dev/null +++ b/basics/close-account/poseidon/ts-programs/pnpm-lock.yaml @@ -0,0 +1,22 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@solanaturbine/poseidon': + specifier: ^0.0.10 + version: 0.0.10 + +packages: + + '@solanaturbine/poseidon@0.0.10': + resolution: {integrity: sha512-4C8niySNUp+qArCrtZ9WZszfwntynSzJUq8go7QSh63xUv2s5ACHfwLs73ajaH95NGmEcgpl6raENv0u0GeCqg==} + +snapshots: + + '@solanaturbine/poseidon@0.0.10': {} diff --git a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts b/basics/close-account/poseidon/ts-programs/src/closeAccountProgram.ts similarity index 72% rename from basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts rename to basics/close-account/poseidon/ts-programs/src/closeAccountProgram.ts index e6f92743d..8e26d4b83 100644 --- a/basics/close-account/poseidon/close_account_program/ts-programs/src/close_account_program.ts +++ b/basics/close-account/poseidon/ts-programs/src/closeAccountProgram.ts @@ -1,7 +1,7 @@ -import { Account, String, Pubkey, Result, Signer, u8 } from '@solanaturbine/poseidon'; +import { Account, Pubkey, Result, Signer, String, u8 } from '@solanaturbine/poseidon'; -export default class CloseAccount { - static PROGRAM_ID = new Pubkey('AtUc6zMfozxrQoK4PbDUnd5daS86XCPuT2og1293P5XXo'); +export default class CloseAccountProgram { + static PROGRAM_ID = new Pubkey('Cp1rfMVrJoD9aNT8dGVoPAf2BrY6HBMXbsTPfd2heV6C'); createUser(user: Signer, userState: UserState, name: String<50>): Result { userState.derive(['USER', user.key]).init(user); diff --git a/basics/close-account/poseidon/close_account_program/tsconfig.json b/basics/close-account/poseidon/tsconfig.json similarity index 100% rename from basics/close-account/poseidon/close_account_program/tsconfig.json rename to basics/close-account/poseidon/tsconfig.json