diff --git a/examples/jito-bundles/README.md b/examples/jito-bundles/README.md new file mode 100644 index 000000000..e085a8ef3 --- /dev/null +++ b/examples/jito-bundles/README.md @@ -0,0 +1,50 @@ +## Jito Bundles with Kora + +This sample code will help you get started with Jito Bundles with Kora. + +## Full Demo + +A full demo of Kora is available [here](https://launch.solana.com/docs/kora/guides/jito-demo). + +## Sample Output + +```bash +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +KORA JITO BUNDLE DEMO +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +[1/5] Initializing clients + → Kora RPC: http://localhost:8080/ + → Solana RPC: https://api.mainnet-beta.solana.com + +[2/5] Setting up keypairs + → Sender: BYJVBqQ2xV9GECc84FeoPQy2DpgoonZQFQu97MMWTbBc + → Kora signer address: 3Z1Ef7YaxK8oUMoi6exf7wYZjZKWJJsrzJXSt1c3qrDE + +[3/5] Creating bundle transactions + → Blockhash: 7HZUaMqV... + → Tip account: 96gYZGLn... + → Transaction 1: Kora Memo "Bundle tx #1" + → Transaction 2: Kora Memo "Bundle tx #2" + → Transaction 3: Kora Memo "Bundle tx #3" + → Transaction 4: Kora Memo "Bundle tx #4" + Jito tip + ✓ 4 transactions created for bundle + +[4/5] Signing bundle with Kora + ✓ All transactions signed by user + ✓ Bundle co-signed by Kora + → 4 transactions signed + +[5/5] Submitting bundle to Jito + ✓ Bundle submitted to Jito block engine + → Bundle UUID: 8f4a3b2c-1d5e-6f7a-8b9c-0d1e2f3a4b5c + ⏳ Polling bundle status... + ✓ Bundle landed (simulated for demo) + +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +SUCCESS: Bundle confirmed on Solana +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ + +Bundle UUID: +8f4a3b2c-1d5e-6f7a-8b9c-0d1e2f3a4b5c +``` \ No newline at end of file diff --git a/examples/jito-bundles/client/package.json b/examples/jito-bundles/client/package.json new file mode 100644 index 000000000..0f14928f4 --- /dev/null +++ b/examples/jito-bundles/client/package.json @@ -0,0 +1,25 @@ +{ + "name": "client", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "tsx src/index.ts" + }, + "keywords": [], + "author": "", + "license": "ISC", + "packageManager": "pnpm@10.14.0", + "dependencies": { + "@solana-program/memo": "^0.10.0", + "@solana-program/system": "^0.10.0", + "@solana/kit": "^5.3.0", + "@solana/kora": "0.2.0-beta.1" + }, + "devDependencies": { + "@types/node": "^25.0.3", + "tsx": "^4.21.0", + "typescript": "^5.9.3" + } +} diff --git a/examples/jito-bundles/client/pnpm-lock.yaml b/examples/jito-bundles/client/pnpm-lock.yaml new file mode 100644 index 000000000..83c351a5a --- /dev/null +++ b/examples/jito-bundles/client/pnpm-lock.yaml @@ -0,0 +1,1064 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@solana-program/memo': + specifier: ^0.10.0 + version: 0.10.0(@solana/kit@5.3.0(typescript@5.9.3)) + '@solana-program/system': + specifier: ^0.10.0 + version: 0.10.0(@solana/kit@5.3.0(typescript@5.9.3)) + '@solana/kit': + specifier: ^5.3.0 + version: 5.3.0(typescript@5.9.3) + '@solana/kora': + specifier: 0.2.0-beta.1 + version: 0.2.0-beta.1(@solana-program/token@0.9.0(@solana/kit@5.3.0(typescript@5.9.3)))(@solana/kit@5.3.0(typescript@5.9.3)) + dotenv: + specifier: ^17.2.3 + version: 17.2.3 + devDependencies: + '@types/node': + specifier: ^25.0.3 + version: 25.0.3 + tsx: + specifier: ^4.21.0 + version: 4.21.0 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + +packages: + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@solana-program/memo@0.10.0': + resolution: {integrity: sha512-1FvQFenL3lzl5SpxhWV4QJCOLU/nvAOXGXjKjS7dprvG+0u971xoanApN7bM/a4NFZolp6S+lP2xVl6vTVIxbg==} + peerDependencies: + '@solana/kit': ^5.0 + + '@solana-program/system@0.10.0': + resolution: {integrity: sha512-Go+LOEZmqmNlfr+Gjy5ZWAdY5HbYzk2RBewD9QinEU/bBSzpFfzqDRT55JjFRBGJUvMgf3C2vfXEGT4i8DSI4g==} + peerDependencies: + '@solana/kit': ^5.0 + + '@solana-program/token@0.9.0': + resolution: {integrity: sha512-vnZxndd4ED4Fc56sw93cWZ2djEeeOFxtaPS8SPf5+a+JZjKA/EnKqzbE1y04FuMhIVrLERQ8uR8H2h72eZzlsA==} + peerDependencies: + '@solana/kit': ^5.0 + + '@solana/accounts@5.3.0': + resolution: {integrity: sha512-KyK6kBIQgoj4r93HFUnqjrCu+3l6NN3SRkwDHLb5S1iSzHDEtNtSM6l4XgRAPS4jyeY0n4RlHThRuvG5CbbhJw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/addresses@5.3.0': + resolution: {integrity: sha512-HFrtIpdgkf+2yUT63E6DrYjVu/l4TGy8HDjkCjTHwl7YVoqDasgFADmd9cQ3YVXKrNnvwMLS4pYQsQdgcwXiZw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/assertions@5.3.0': + resolution: {integrity: sha512-SiZ0pOvNmOa9i7hn7EG4QUnxoq6+YBKmjsIK/9p5VQD0s45WlKp0Xelks4BPDEb+/lmkl8zmoAsOv7sV75mc+g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/codecs-core@5.3.0': + resolution: {integrity: sha512-wqpiKtej8GePdraHk3YnoJY1N/Hutn4w0CD/45hNKiXPG5F3mlasaBWq8m86K7WUdjQVAsGTgiSgoZo64Aw17w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/codecs-data-structures@5.3.0': + resolution: {integrity: sha512-MdJTYdBF0OwyMuZOTrccHtfl1Sfcp1/l/7AQjxqOWk+Enbg2Kkx8OP8eKqVipdqvYdk9LcC132fXfyemWdB88g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/codecs-numbers@5.3.0': + resolution: {integrity: sha512-NLsRSKpRzGT5h5UL4jEShE5C49S2E/oM3YAltdbsFyxuTKo0u4JA+GzBLD1UxEG5177WMY/wtVVTe5qWCDdyzA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/codecs-strings@5.3.0': + resolution: {integrity: sha512-hnTYlxGCcQcqZr0lHqSW/dbEWAnH+4Ery+FSv9Rd2fEI/qcDxA5by0IxDIm+imFGLsnXZwLSnYBuF57YOoMzhQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.9.3' + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + + '@solana/codecs@5.3.0': + resolution: {integrity: sha512-zuBpLSMBoZzWNCNNNMTKJSk9OAqkV4SYO+g4zuz/RTiMHu3B1j0KfSJ0S4k/Aa0YBgK/Ukc0GxsT8QE+GB3Snw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/errors@5.3.0': + resolution: {integrity: sha512-oeTwCQG4JBNI6dd1XxA04sX18HPiiWts10FokXrdjaMH2sCJRxecpUTzCvCsPlb8FAVswRu1bi4HuN9uVHTBNQ==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.9.3' + + '@solana/fast-stable-stringify@5.3.0': + resolution: {integrity: sha512-wyTp8j9wFfFj+1QxUBBC0aZTm84FDdnJZ/Lr4Nhk/2qiQRP1RwMaDCo3ubdkRox+RoNtVdeHrvMBer7U1fyhJA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/functional@5.3.0': + resolution: {integrity: sha512-f/oONHHBxaKjCvCXp1waZEUsdnAiQYtX1iDejKp9iNW6YG5v5PxTHzf+EMxBXeyV2UhSjO8V3wjBMPFqgqzRZQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/instruction-plans@5.3.0': + resolution: {integrity: sha512-wC+SFPc5izs0ZoPmJ4lyAZzV2Ieyj5OWQGZgRjETHkz3vBYI5K/3pwA/3T40OwMX4D8YfXAIy9qq0ExROuUmqg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/instructions@5.3.0': + resolution: {integrity: sha512-jYA+fdi9h3wF/CQLoa6LooXAsvBriyc51ySXzXDDC/0aIzT9hUo9gMvqIxmTRQSTmy9O7ay2tfPYeAopaFfubg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/keys@5.3.0': + resolution: {integrity: sha512-0F1eMibq2OIXIozFrrDxJtXJoo9ef1JUCFjQ4FkhRAoXYWLPczAFHNLq/YUORvKDOBwoS0q1DfvY5FjqPhlDSQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/kit@5.3.0': + resolution: {integrity: sha512-5QoEZCnEz4VCzgbXhEOaU2Hg9Rug3w43iNkLg0wUaGkqKTVasAJ1Sd5l5SpPjGEGc70vNVnrFNb7e9GTmRFeXg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/kora@0.2.0-beta.1': + resolution: {integrity: sha512-BKhP6Rb4FoL8cEWaH7/t57jwAzmKOsVNbTbGbJ5UNG9fgvwS+j0TIVJbQJDIqXInqC7c9m02wd3v4HdsndH90A==} + peerDependencies: + '@solana-program/token': ^0.9.0 + '@solana/kit': ^5.0.0 + + '@solana/nominal-types@5.3.0': + resolution: {integrity: sha512-fuPBOM/zZNTNqMPu2LYtdA47OQ2A/IwziEUOXyW3+tO3Qluzh0fKQ/xqOtbl1HsZd7Inip1N062xbltr3DwD+A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/offchain-messages@5.3.0': + resolution: {integrity: sha512-jdb5XvIBRsdBLu4aemXVWmZc8jkI6nXYayHE/S5Yq5W4hBcqxJvdENxh0MZYCPVo5x+8NwtS3Yug3vGoERGIzA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/options@5.3.0': + resolution: {integrity: sha512-vByKXs7jgEvyHGkj30sskxHhfXAzVZC/vDoW8EyJW+95VeydGJXoxgfzLgnDlEeFt66d8i/+wxiD/8napMdgZg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/plugin-core@5.3.0': + resolution: {integrity: sha512-UKIeW2gxLY9z9bzSJYAzRS/JG4I7D6y8cBBo1QUHNOUEDI1Fd4+pK3neLgw+VQKttzJgA184KFwyCO16m8wd/w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/programs@5.3.0': + resolution: {integrity: sha512-GtA3xeUkYMBLDRLRtaodPyJu+Eey0jnpwJnd9/05fofZyinQ09k+a0kaGZ1R829HGBnJTnhq/qGnPN5zqSi0qA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/promises@5.3.0': + resolution: {integrity: sha512-DzFBtUeNOheBvDLHXDPQ5nUGTdwaFYEhA+3vAOs66vC41/kdcWVllDQVj32HOePDoXlxGGczd8VpOt+dzw94MA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc-api@5.3.0': + resolution: {integrity: sha512-dBkjKa4scDjcNDq+YQ1xePwinkTMqMm3HcZM9pupfBV8owoqLG9ZcZ6ZXp9/sIEIX+xWxVmW2vj4L/EwtbrC5A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc-parsed-types@5.3.0': + resolution: {integrity: sha512-D5lLmgWb3O1WapSypnFWS9eJSklDJs8LDsJbzvwNwXpDAi/6e804NphiYnuWqpd5en8LyRb7E2XoP14F292bbw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc-spec-types@5.3.0': + resolution: {integrity: sha512-6U7WYnuZ6HTYxyapwvPeam/wNP22uKxVH4afB5hHaYJ5PgNGF4GsZhVOgIO7CwgP2ChNq3F4X1tF/7Ly4xEOQw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc-spec@5.3.0': + resolution: {integrity: sha512-w316DNQXi738wvhQtY38hb9/TRU0KoIJkPh4QrmBPGwb3Gi3fI0GyeLNb7RQ+LciNX8/WSmRfXygxSTFYcD+3A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc-subscriptions-api@5.3.0': + resolution: {integrity: sha512-aNd1LGgsIYtxiStwxvGtcZQUj79UeHX1fPYV9cj/VxyAsmFDiMhsY78/p5F4xLT2JxQUSzLRLLbNFOeYvt6LiQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc-subscriptions-channel-websocket@5.3.0': + resolution: {integrity: sha512-l+e7gBFujFyOVztJfQ6uS8mnzDCji+uk/Ff0FbhTPYBuaKNm7LYR0H0WqAugmRbKd7Lc2RoIqR9XnAnN4qbPcQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc-subscriptions-spec@5.3.0': + resolution: {integrity: sha512-tkpFBtwjCQhrtvr1oTVn1q1Fgsr258uz6fOiOfkSfpG7i/zCRhU2V+XFdZlli6vh7iFaejHxIKOAykn3a0yjyg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc-subscriptions@5.3.0': + resolution: {integrity: sha512-T0py1fn3asCUeeRh1L9w+FhaHQEq+TBCZ9o7LBONEbQTgdwH8AIcUhyR8HDyDce2wo7bWpADXJCdyk3eUlFUZA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc-transformers@5.3.0': + resolution: {integrity: sha512-N9Au1uu2sI9U+tAxWpWn8oJZwtTDzZ1CDhXr0DWahQoaWjiMKxzoMNA2UCF0Nn1ose8x87yzMXUK91xXAvpYfw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc-transport-http@5.3.0': + resolution: {integrity: sha512-Z+0l90HkL/Sj8onQKcWQXYYORppCf81b76oN0gdjpOGJdFpT64aVwB47CV+NUxnSb/MTp62i3wmNOtPsCTz0Yg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc-types@5.3.0': + resolution: {integrity: sha512-L9qMvr5wDk+rZ1qiWHtYl8Ec7M7AkhB9uYQef21pZb7fkeksLoO7DZHrLMTiOYbMWHjGBO2rXYef+SXBxd206g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/rpc@5.3.0': + resolution: {integrity: sha512-7jrOAej8Jk5F4EU3i5/91Z5Kg4e20KtWzOUZkU7zDSCImLeAi+1fUDa+vMNBMrDfKqWksFj/wJwGeRPk43P+Bg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/signers@5.3.0': + resolution: {integrity: sha512-npihqbS1/rL8RSUv0RFlo1xakJdZGNyBrzGBMSxDBIYuYMwjuk4FNq70ka547yFdjTCd9mBzvZpAR2vh4fjmwg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/subscribable@5.3.0': + resolution: {integrity: sha512-tn6DnIR5xRspiO2untzznr0KpUZRm71cMNgJlNh3H6t3zph7P800EbFYMkPvPcCDWZf3S+ALiLAeNyrNPgSPsg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/sysvars@5.3.0': + resolution: {integrity: sha512-hkXnOaGPRWC0/79Br+sjENrPtYunlXZ5o0sC/ZEBlguKv+/yP/cZeoHYKoFzF8X3YHFp9dawNhtroEj1/B+hWQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/transaction-confirmation@5.3.0': + resolution: {integrity: sha512-tVJw87q691FibuRmqkU+sOjcV3hl1yI4ATVLbS6cewPlZZ2XI/uAzKHwZt08N/llbFHKeLHY3pKUMve3fSYJPw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/transaction-messages@5.3.0': + resolution: {integrity: sha512-36O2ccWYdDIq1HwzSExTwQFryY1M21Zw1AUpxJozHv79b6FAE5/hrsM/NOEEVipVvsNCUPC7xDs6nv3DEC8oWg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@solana/transactions@5.3.0': + resolution: {integrity: sha512-dxbKRxMTV7BM0hFHCmsBi5/bfRNjH8TPqicR4K6YhL9u0T5eAnDsTZXCX3pGFbOxx7sHs9CFoy12M58+9xVrJw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.9.3' + + '@types/node@25.0.3': + resolution: {integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==} + + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + + 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-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + tsx@4.21.0: + resolution: {integrity: sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==} + engines: {node: '>=18.0.0'} + hasBin: true + + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + + undici-types@7.18.2: + resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==} + + ws@8.19.0: + resolution: {integrity: sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==} + 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 + +snapshots: + + '@esbuild/aix-ppc64@0.27.2': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@solana-program/memo@0.10.0(@solana/kit@5.3.0(typescript@5.9.3))': + dependencies: + '@solana/kit': 5.3.0(typescript@5.9.3) + + '@solana-program/system@0.10.0(@solana/kit@5.3.0(typescript@5.9.3))': + dependencies: + '@solana/kit': 5.3.0(typescript@5.9.3) + + '@solana-program/token@0.9.0(@solana/kit@5.3.0(typescript@5.9.3))': + dependencies: + '@solana/kit': 5.3.0(typescript@5.9.3) + + '@solana/accounts@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-strings': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/rpc-spec': 5.3.0(typescript@5.9.3) + '@solana/rpc-types': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/assertions': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-strings': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/nominal-types': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/assertions@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-core@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-data-structures@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-numbers@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs-strings@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/codecs@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) + '@solana/codecs-strings': 5.3.0(typescript@5.9.3) + '@solana/options': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@5.3.0(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.2 + typescript: 5.9.3 + + '@solana/fast-stable-stringify@5.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/functional@5.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/instruction-plans@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/instructions': 5.3.0(typescript@5.9.3) + '@solana/keys': 5.3.0(typescript@5.9.3) + '@solana/promises': 5.3.0(typescript@5.9.3) + '@solana/transaction-messages': 5.3.0(typescript@5.9.3) + '@solana/transactions': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/instructions@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/keys@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/assertions': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-strings': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/nominal-types': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 5.3.0(typescript@5.9.3) + '@solana/addresses': 5.3.0(typescript@5.9.3) + '@solana/codecs': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/functional': 5.3.0(typescript@5.9.3) + '@solana/instruction-plans': 5.3.0(typescript@5.9.3) + '@solana/instructions': 5.3.0(typescript@5.9.3) + '@solana/keys': 5.3.0(typescript@5.9.3) + '@solana/offchain-messages': 5.3.0(typescript@5.9.3) + '@solana/plugin-core': 5.3.0(typescript@5.9.3) + '@solana/programs': 5.3.0(typescript@5.9.3) + '@solana/rpc': 5.3.0(typescript@5.9.3) + '@solana/rpc-api': 5.3.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 5.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 5.3.0(typescript@5.9.3) + '@solana/rpc-types': 5.3.0(typescript@5.9.3) + '@solana/signers': 5.3.0(typescript@5.9.3) + '@solana/sysvars': 5.3.0(typescript@5.9.3) + '@solana/transaction-confirmation': 5.3.0(typescript@5.9.3) + '@solana/transaction-messages': 5.3.0(typescript@5.9.3) + '@solana/transactions': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/kora@0.2.0-beta.1(@solana-program/token@0.9.0(@solana/kit@5.3.0(typescript@5.9.3)))(@solana/kit@5.3.0(typescript@5.9.3))': + dependencies: + '@solana-program/token': 0.9.0(@solana/kit@5.3.0(typescript@5.9.3)) + '@solana/kit': 5.3.0(typescript@5.9.3) + + '@solana/nominal-types@5.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/offchain-messages@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) + '@solana/codecs-strings': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/keys': 5.3.0(typescript@5.9.3) + '@solana/nominal-types': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/options@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) + '@solana/codecs-strings': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/plugin-core@5.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/programs@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/promises@5.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/rpc-api@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-strings': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/keys': 5.3.0(typescript@5.9.3) + '@solana/rpc-parsed-types': 5.3.0(typescript@5.9.3) + '@solana/rpc-spec': 5.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 5.3.0(typescript@5.9.3) + '@solana/rpc-types': 5.3.0(typescript@5.9.3) + '@solana/transaction-messages': 5.3.0(typescript@5.9.3) + '@solana/transactions': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-parsed-types@5.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/rpc-spec-types@5.3.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + + '@solana/rpc-spec@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/rpc-subscriptions-api@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.3.0(typescript@5.9.3) + '@solana/keys': 5.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 5.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 5.3.0(typescript@5.9.3) + '@solana/rpc-types': 5.3.0(typescript@5.9.3) + '@solana/transaction-messages': 5.3.0(typescript@5.9.3) + '@solana/transactions': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-subscriptions-channel-websocket@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/functional': 5.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 5.3.0(typescript@5.9.3) + '@solana/subscribable': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@solana/rpc-subscriptions-spec@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/promises': 5.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) + '@solana/subscribable': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/rpc-subscriptions@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 5.3.0(typescript@5.9.3) + '@solana/functional': 5.3.0(typescript@5.9.3) + '@solana/promises': 5.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 5.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 5.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 5.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 5.3.0(typescript@5.9.3) + '@solana/rpc-types': 5.3.0(typescript@5.9.3) + '@solana/subscribable': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/rpc-transformers@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/functional': 5.3.0(typescript@5.9.3) + '@solana/nominal-types': 5.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) + '@solana/rpc-types': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transport-http@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/rpc-spec': 5.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + undici-types: 7.18.2 + + '@solana/rpc-types@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) + '@solana/codecs-strings': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/nominal-types': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/fast-stable-stringify': 5.3.0(typescript@5.9.3) + '@solana/functional': 5.3.0(typescript@5.9.3) + '@solana/rpc-api': 5.3.0(typescript@5.9.3) + '@solana/rpc-spec': 5.3.0(typescript@5.9.3) + '@solana/rpc-spec-types': 5.3.0(typescript@5.9.3) + '@solana/rpc-transformers': 5.3.0(typescript@5.9.3) + '@solana/rpc-transport-http': 5.3.0(typescript@5.9.3) + '@solana/rpc-types': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/instructions': 5.3.0(typescript@5.9.3) + '@solana/keys': 5.3.0(typescript@5.9.3) + '@solana/nominal-types': 5.3.0(typescript@5.9.3) + '@solana/offchain-messages': 5.3.0(typescript@5.9.3) + '@solana/transaction-messages': 5.3.0(typescript@5.9.3) + '@solana/transactions': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/subscribable@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + + '@solana/sysvars@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/accounts': 5.3.0(typescript@5.9.3) + '@solana/codecs': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/rpc-types': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.3.0(typescript@5.9.3) + '@solana/codecs-strings': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/keys': 5.3.0(typescript@5.9.3) + '@solana/promises': 5.3.0(typescript@5.9.3) + '@solana/rpc': 5.3.0(typescript@5.9.3) + '@solana/rpc-subscriptions': 5.3.0(typescript@5.9.3) + '@solana/rpc-types': 5.3.0(typescript@5.9.3) + '@solana/transaction-messages': 5.3.0(typescript@5.9.3) + '@solana/transactions': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - bufferutil + - fastestsmallesttextencoderdecoder + - utf-8-validate + + '@solana/transaction-messages@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/functional': 5.3.0(typescript@5.9.3) + '@solana/instructions': 5.3.0(typescript@5.9.3) + '@solana/nominal-types': 5.3.0(typescript@5.9.3) + '@solana/rpc-types': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@5.3.0(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.3.0(typescript@5.9.3) + '@solana/codecs-core': 5.3.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.3.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.3.0(typescript@5.9.3) + '@solana/codecs-strings': 5.3.0(typescript@5.9.3) + '@solana/errors': 5.3.0(typescript@5.9.3) + '@solana/functional': 5.3.0(typescript@5.9.3) + '@solana/instructions': 5.3.0(typescript@5.9.3) + '@solana/keys': 5.3.0(typescript@5.9.3) + '@solana/nominal-types': 5.3.0(typescript@5.9.3) + '@solana/rpc-types': 5.3.0(typescript@5.9.3) + '@solana/transaction-messages': 5.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@types/node@25.0.3': + dependencies: + undici-types: 7.16.0 + + chalk@5.6.2: {} + + commander@14.0.2: {} + + dotenv@17.2.3: {} + + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + + fsevents@2.3.3: + optional: true + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + resolve-pkg-maps@1.0.0: {} + + tsx@4.21.0: + dependencies: + esbuild: 0.27.2 + get-tsconfig: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + + typescript@5.9.3: {} + + undici-types@7.16.0: {} + + undici-types@7.18.2: {} + + ws@8.19.0: {} diff --git a/examples/jito-bundles/client/src/index.ts b/examples/jito-bundles/client/src/index.ts new file mode 100644 index 000000000..b45a494e8 --- /dev/null +++ b/examples/jito-bundles/client/src/index.ts @@ -0,0 +1,186 @@ +import { KoraClient } from "@solana/kora"; +import { + createNoopSigner, + address, + getBase64EncodedWireTransaction, + partiallySignTransactionMessageWithSigners, + Blockhash, + KeyPairSigner, + pipe, + createTransactionMessage, + setTransactionMessageFeePayerSigner, + setTransactionMessageLifetimeUsingBlockhash, + appendTransactionMessageInstruction, + generateKeyPairSigner, +} from "@solana/kit"; +import { getAddMemoInstruction } from "@solana-program/memo"; +import { getTransferSolInstruction } from "@solana-program/system"; + +const MINIMUM_JITO_TIP = 1_000n; // lamports + +const CONFIG = { + solanaRpcUrl: "https://api.mainnet-beta.solana.com", + koraRpcUrl: "http://localhost:8080/", + jitoTipLamports: MINIMUM_JITO_TIP, + bundleSize: 4, // We'll create 4 transactions for this demo + pollIntervalMs: 6000, + pollTimeoutMs: 60000, +}; + +// Jito tip accounts - one is randomly selected by the block engine +const JITO_TIP_ACCOUNTS = [ + "96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5", + "HFqU5x63VTqvQss8hp11i4wVV8bD44PvwucfZ2bU7gRe", + "Cw8CFyM9FkoMi7K7Crf6HNQqf4uEMzpKw6QNghXLvLkY", + "ADaUMid9yfUytqMBgopwjb2DTLSokTSzL1zt6iGPaS49", + "DfXygSm4jCyNCybVYYK6DwvWqjKee8pbDmJGcLWNDXjh", + "ADuUkR4vqLUMWXxW9gh6D6L8pMSawimctcNZ5pGwDcEt", + "DttWaMuVvTiduZRnguLF7jNxTgiMBZ1hyAumKUiL2KRL", + "3AVi9Tg9Uo68tJfuvoKvqKNWKkC5wPdSSdeBnizKZ6jT", +]; + +function getRandomTipAccount(): string { + return JITO_TIP_ACCOUNTS[ + Math.floor(Math.random() * JITO_TIP_ACCOUNTS.length) + ]; +} + +async function initializeClients() { + console.log("\n[1/4] Initializing clients"); + console.log(" → Kora RPC:", CONFIG.koraRpcUrl); + console.log(" → Solana RPC:", CONFIG.solanaRpcUrl); + + const client = new KoraClient({ + rpcUrl: CONFIG.koraRpcUrl, + apiKey: 'kora_facilitator_api_key_example', + }); + + return { client }; +} + +async function setupKeys(client: KoraClient) { + console.log("\n[2/4] Setting up keypairs"); + + const senderKeypair = await generateKeyPairSigner(); + console.log(" → Sender:", senderKeypair.address); + + const { signer_address } = await client.getPayerSigner(); + console.log(" → Kora signer address:", signer_address); + + return { senderKeypair, signer_address }; +} + +async function createBundleTransactions( + client: KoraClient, + senderKeypair: KeyPairSigner, + signer_address: string +) { + console.log("\n[3/4] Creating bundle transactions"); + + const noopSigner = createNoopSigner(address(signer_address)); + const latestBlockhash = await client.getBlockhash(); + const tipAccount = getRandomTipAccount(); + + console.log(" → Blockhash:", latestBlockhash.blockhash.slice(0, 8) + "..."); + console.log(" → Tip account:", tipAccount.slice(0, 8) + "..."); + + const transactions: string[] = []; + + for (let i = 0; i < CONFIG.bundleSize; i++) { + const isLastTransaction = i === CONFIG.bundleSize - 1; + console.log( + ` → Transaction ${i + 1}: Kora Memo "Bundle tx #${i + 1}"${ + isLastTransaction ? " + Jito tip" : "" + }` + ); + + // Build transaction with memo + let transactionMessage = pipe( + createTransactionMessage({ + version: 0, + }), + (tx) => setTransactionMessageFeePayerSigner(noopSigner, tx), + (tx) => + setTransactionMessageLifetimeUsingBlockhash( + { + blockhash: latestBlockhash.blockhash as Blockhash, + lastValidBlockHeight: 0n, + }, + tx + ), + (tx) => + appendTransactionMessageInstruction( + getAddMemoInstruction({ + memo: `Kora Bundle tx #${i + 1} of ${CONFIG.bundleSize}`, + signers: [senderKeypair], + }), + tx + ), + // Add Jito tip to the LAST transaction only + (tx) => + isLastTransaction + ? appendTransactionMessageInstruction( + getTransferSolInstruction({ + source: noopSigner, + destination: address(tipAccount), + amount: CONFIG.jitoTipLamports, + }), + tx + ) + : tx + ); + + // Sign with sender keypair (required for tip transfer) + const signedTransaction = await partiallySignTransactionMessageWithSigners( + transactionMessage + ); + const base64Transaction = + getBase64EncodedWireTransaction(signedTransaction); + transactions.push(base64Transaction); + } + + console.log(` ✓ ${transactions.length} transactions created for bundle`); + return transactions; +} + +async function main() { + console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); + console.log("KORA JITO BUNDLE DEMO"); + console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); + + try { + // Step 1: Initialize clients + const { client } = await initializeClients(); + + // Step 2: Setup keys + const { senderKeypair, signer_address } = await setupKeys(client); + + // Step 3: Create bundle transactions + const transactions = await createBundleTransactions( + client, + senderKeypair, + signer_address + ); + + // Step 4: Sign and send bundle + console.log("\n[4/4] Signing and sending bundle"); + const { bundle_uuid } = await client.signAndSendBundle({ + transactions, + signer_key: signer_address, + }); + + console.log("\nBundle UUID:"); + console.log(bundle_uuid); + console.log("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); + console.log("SUCCESS: Bundle confirmed on Solana"); + console.log("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); + } catch (error) { + console.error("\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); + console.error("ERROR: Demo failed"); + console.error("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"); + console.error("\nDetails:", error); + process.exit(1); + } +} + +main().catch((e) => console.error("Error:", e)); diff --git a/examples/jito-bundles/scripts/start-kora.sh b/examples/jito-bundles/scripts/start-kora.sh new file mode 100644 index 000000000..ffe48a98f --- /dev/null +++ b/examples/jito-bundles/scripts/start-kora.sh @@ -0,0 +1 @@ +kora --config kora.toml --rpc-url https://api.mainnet.solana.com rpc start --signers-config signers.toml diff --git a/examples/jito-bundles/server/.env.example b/examples/jito-bundles/server/.env.example new file mode 100644 index 000000000..8c9fcc480 --- /dev/null +++ b/examples/jito-bundles/server/.env.example @@ -0,0 +1 @@ +KORA_PRIVATE_KEY= \ No newline at end of file diff --git a/examples/jito-bundles/server/kora.toml b/examples/jito-bundles/server/kora.toml new file mode 100644 index 000000000..ff1db6037 --- /dev/null +++ b/examples/jito-bundles/server/kora.toml @@ -0,0 +1,127 @@ +[kora] +rate_limit = 100 +# Optional: Payment address to receive payment tokens (defaults to signer address) +# payment_address = "YourPaymentAddressPubkey11111111111111111111" + +[kora.auth] +api_key = "kora_facilitator_api_key_example" + +[kora.cache] +enabled = false +default_ttl = 300 +account_ttl = 60 + +[kora.enabled_methods] +liveness = false +estimate_transaction_fee = false +get_supported_tokens = false +sign_transaction = true +sign_and_send_transaction = true +transfer_transaction = false +get_blockhash = true +get_config = true +get_payer_signer = true +get_version = true +sign_bundle = true +sign_and_send_bundle = true + +[validation] +max_allowed_lamports = 1000000 +max_signatures = 10 +price_source = "Mock" +allowed_programs = [ + "11111111111111111111111111111111", # System Program + # "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", # Token Program + "MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr", + # "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb", # Token-2022 Program + # "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", # Associated Token Program + # "ComputeBudget111111111111111111111111111111", # Compute Budget Program +] +allowed_tokens = [ + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", # USDC devnet +] +allowed_spl_paid_tokens = [ + "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU", # USDC devnet +] + +disallowed_accounts = [] + +[validation.fee_payer_policy] + +[validation.fee_payer_policy.system] +allow_transfer = true +allow_assign = false +allow_create_account = false +allow_allocate = false + +[validation.fee_payer_policy.system.nonce] +allow_initialize = false +allow_advance = false +allow_authorize = false +allow_withdraw = false + +[validation.fee_payer_policy.spl_token] +allow_transfer = false +allow_burn = false +allow_close_account = false +allow_approve = false +allow_revoke = false +allow_set_authority = false +allow_mint_to = false +allow_initialize_mint = false +allow_initialize_account = false +allow_initialize_multisig = false +allow_freeze_account = false +allow_thaw_account = false + +[validation.fee_payer_policy.token_2022] +allow_transfer = false +allow_burn = false +allow_close_account = false +allow_approve = false +allow_revoke = false +allow_set_authority = false +allow_mint_to = false +allow_initialize_mint = false +allow_initialize_account = false +allow_initialize_multisig = false +allow_freeze_account = false +allow_thaw_account = false + +[validation.price] +type = "free" # free / margin / fixed + +[validation.token2022] +blocked_mint_extensions = [ + "confidential_transfer_mint", # Confidential transfer configuration for the mint + "confidential_mint_burn", # Confidential mint and burn configuration + "transfer_fee_config", # Transfer fee configuration + "mint_close_authority", # Authority allowed to close the mint + "interest_bearing_config", # Interest-bearing token configuration + "non_transferable", # Makes tokens non-transferable + "permanent_delegate", # Permanent delegate for the mint + "transfer_hook", # Block tokens with transfer hooks + "pausable", # Block pausable tokens +] +blocked_account_extensions = [ + "confidential_transfer_account", # Confidential transfer state for the account + "non_transferable_account", # Non-transferable token account + "transfer_hook_account", # Transfer hook state for the account + "pausable_account", # Pausable token account state + "memo_transfer", # Requires memo for transfers + "cpi_guard", # Prevents certain CPI calls + "immutable_owner", # Account owner cannot be changed + "default_account_state", # Default state for new accounts +] + +[kora.usage_limit] +enabled = false +cache_url = "redis://redis:6379" +max_transactions = 2 +fallback_if_unavailable = false + +[kora.bundle] +enabled = true + +[kora.bundle.jito] +block_engine_url = "https://mainnet.block-engine.jito.wtf" \ No newline at end of file diff --git a/examples/jito-bundles/server/signers.toml b/examples/jito-bundles/server/signers.toml new file mode 100644 index 000000000..85a297212 --- /dev/null +++ b/examples/jito-bundles/server/signers.toml @@ -0,0 +1,7 @@ +[signer_pool] +strategy = "round_robin" + +[[signers]] +name = "main_signer" +type = "memory" +private_key_env = "KORA_PRIVATE_KEY" \ No newline at end of file