From e91d991742ac2ee52db2ca853b6ed97bc0e3e64c Mon Sep 17 00:00:00 2001 From: Loris Leiva Date: Fri, 19 Dec 2025 09:52:15 +0000 Subject: [PATCH] Add LiteSVM plugin --- packages/kit-plugin-litesvm/.gitignore | 1 + packages/kit-plugin-litesvm/.prettierignore | 4 + packages/kit-plugin-litesvm/LICENSE | 22 ++++ packages/kit-plugin-litesvm/README.md | 48 +++++++ packages/kit-plugin-litesvm/package.json | 69 ++++++++++ packages/kit-plugin-litesvm/src/index.ts | 102 +++++++++++++++ .../kit-plugin-litesvm/test/index.test.ts | 121 ++++++++++++++++++ .../tsconfig.declarations.json | 10 ++ packages/kit-plugin-litesvm/tsconfig.json | 7 + packages/kit-plugin-litesvm/tsup.config.ts | 5 + packages/kit-plugin-litesvm/vitest.config.mts | 8 ++ packages/kit-plugins/package.json | 1 + packages/kit-plugins/src/defaults.ts | 5 + packages/kit-plugins/src/index.ts | 1 + packages/kit-plugins/test/defaults.test.ts | 16 ++- packages/kit-plugins/tsup.config.ts | 4 +- pnpm-lock.yaml | 109 ++++++++++++++++ 17 files changed, 530 insertions(+), 3 deletions(-) create mode 100644 packages/kit-plugin-litesvm/.gitignore create mode 100644 packages/kit-plugin-litesvm/.prettierignore create mode 100644 packages/kit-plugin-litesvm/LICENSE create mode 100644 packages/kit-plugin-litesvm/README.md create mode 100644 packages/kit-plugin-litesvm/package.json create mode 100644 packages/kit-plugin-litesvm/src/index.ts create mode 100644 packages/kit-plugin-litesvm/test/index.test.ts create mode 100644 packages/kit-plugin-litesvm/tsconfig.declarations.json create mode 100644 packages/kit-plugin-litesvm/tsconfig.json create mode 100644 packages/kit-plugin-litesvm/tsup.config.ts create mode 100644 packages/kit-plugin-litesvm/vitest.config.mts diff --git a/packages/kit-plugin-litesvm/.gitignore b/packages/kit-plugin-litesvm/.gitignore new file mode 100644 index 0000000..849ddff --- /dev/null +++ b/packages/kit-plugin-litesvm/.gitignore @@ -0,0 +1 @@ +dist/ diff --git a/packages/kit-plugin-litesvm/.prettierignore b/packages/kit-plugin-litesvm/.prettierignore new file mode 100644 index 0000000..c52dcf5 --- /dev/null +++ b/packages/kit-plugin-litesvm/.prettierignore @@ -0,0 +1,4 @@ +dist/ +test-ledger/ +target/ +CHANGELOG.md diff --git a/packages/kit-plugin-litesvm/LICENSE b/packages/kit-plugin-litesvm/LICENSE new file mode 100644 index 0000000..f7e0a95 --- /dev/null +++ b/packages/kit-plugin-litesvm/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2025 Anza + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/kit-plugin-litesvm/README.md b/packages/kit-plugin-litesvm/README.md new file mode 100644 index 0000000..aa55bf2 --- /dev/null +++ b/packages/kit-plugin-litesvm/README.md @@ -0,0 +1,48 @@ +# Kit Plugins ➤ LiteSVM + +[![npm][npm-image]][npm-url] +[![npm-downloads][npm-downloads-image]][npm-url] + +[npm-downloads-image]: https://img.shields.io/npm/dm/@solana/kit-plugin-litesvm.svg?style=flat +[npm-image]: https://img.shields.io/npm/v/@solana/kit-plugin-litesvm.svg?style=flat&label=%40solana%2Fkit-plugin-litesvm +[npm-url]: https://www.npmjs.com/package/@solana/kit-plugin-litesvm + +This package provides a plugin that adds LiteSVM functionality to your Kit clients. + +## Installation + +```sh +pnpm install @solana/kit-plugin-litesvm +``` + +> [!NOTE] +> This package is included in the main [`@solana/kit-plugins`](../kit-plugins) package. +> +> ```sh +> pnpm install @solana/kit-plugins +> ``` + +## `litesvm` plugin + +The LiteSVM plugin starts a new LiteSVM instance within your Kit client, allowing you to simulate Solana programs and accounts locally. Additionally, it derives a small RPC subset that interacts with the LiteSVM instance instead of making network requests. + +### Installation + +```ts +import { createEmptyClient } from '@solana/kit'; +import { litesvm } from '@solana/kit-plugins'; + +const client = createEmptyClient().use(litesvm()); +``` + +### Features + +- `svm`: Access the underlying LiteSVM instance. + ```ts + client.svm.setAccount(myAccount); + client.svm.addProgramFromFile(myProgramAddress, 'my_program.so'); + ``` +- `rpc`: Call a subset of Solana RPC methods against the LiteSVM instance. Currently supported methods are: `getAccountInfo`, `getMultipleAccounts`, and `getLatestBlockhash`. + ```ts + const { value: latestBlockhash } = await client.rpc.getLatestBlockhash().send(); + ``` diff --git a/packages/kit-plugin-litesvm/package.json b/packages/kit-plugin-litesvm/package.json new file mode 100644 index 0000000..d059496 --- /dev/null +++ b/packages/kit-plugin-litesvm/package.json @@ -0,0 +1,69 @@ +{ + "name": "@solana/kit-plugin-litesvm", + "version": "0.1.0", + "description": "LiteSVM support for Kit clients", + "exports": { + "types": "./dist/types/index.d.ts", + "react-native": "./dist/index.react-native.mjs", + "browser": { + "import": "./dist/index.browser.mjs", + "require": "./dist/index.browser.cjs" + }, + "node": { + "import": "./dist/index.node.mjs", + "require": "./dist/index.node.cjs" + } + }, + "browser": { + "./dist/index.node.cjs": "./dist/index.browser.cjs", + "./dist/index.node.mjs": "./dist/index.browser.mjs" + }, + "main": "./dist/index.node.cjs", + "module": "./dist/index.node.mjs", + "react-native": "./dist/index.react-native.mjs", + "types": "./dist/types/index.d.ts", + "type": "commonjs", + "files": [ + "./dist/types", + "./dist/index.*" + ], + "sideEffects": false, + "keywords": [ + "solana", + "kit", + "plugin", + "LiteSVM" + ], + "scripts": { + "build": "rimraf dist && tsup && tsc -p ./tsconfig.declarations.json", + "dev": "vitest --project node", + "lint": "eslint . && prettier --check .", + "lint:fix": "eslint --fix . && prettier --write .", + "test": "pnpm test:types && pnpm test:treeshakability && pnpm test:unit", + "test:treeshakability": "for file in dist/index.*.mjs; do agadoo $file; done", + "test:types": "tsc --noEmit", + "test:unit": "vitest run" + }, + "peerDependencies": { + "@solana/kit": "^5.1.0" + }, + "dependencies": { + "@loris-sandbox/litesvm-kit": "^0.5.0" + }, + "devDependencies": { + "@solana/kit": "^5.1.0", + "@solana/plugin-core": "workspace:*" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/anza-xyz/kit-plugins" + }, + "bugs": { + "url": "http://github.com/anza-xyz/kit-plugins/issues" + }, + "browserslist": [ + "supports bigint and not dead", + "maintained node versions" + ] +} diff --git a/packages/kit-plugin-litesvm/src/index.ts b/packages/kit-plugin-litesvm/src/index.ts new file mode 100644 index 0000000..4e07c55 --- /dev/null +++ b/packages/kit-plugin-litesvm/src/index.ts @@ -0,0 +1,102 @@ +import { LiteSVM } from '@loris-sandbox/litesvm-kit'; +import { + AccountInfoBase, + AccountInfoWithBase64EncodedData, + Address, + Base64EncodedBytes, + GetAccountInfoApi, + getBase64Decoder, + GetLatestBlockhashApi, + GetMultipleAccountsApi, + MaybeEncodedAccount, + PendingRpcRequest, + Rpc, + SolanaRpcResponse, +} from '@solana/kit'; + +// Re-export the LiteSVM type to make the `litesvm` type-portable. +export type { LiteSVM } from '@loris-sandbox/litesvm-kit'; + +/** The RPC subset provided by the LiteSVM plugin. */ +export type RpcFromLiteSVM = Rpc; + +/** + * A Kit plugin that adds LiteSVM functionality to your client. + * + * This plugin starts a new LiteSVM instance within your Kit client, + * allowing you to simulate Solana programs and accounts locally. + * Additionally, it derives a small RPC subset that interacts with the + * LiteSVM instance instead of making network requests. + * + * @example + * ```ts + * import { createEmptyClient } from '@solana/kit'; + * import { litesvm } from '@solana/kit-plugins'; + * + * // Install the LiteSVM plugin. + * const client = createEmptyClient().use(litesvm()); + * + * // Use LiteSVM to set up accounts and programs. + * client.svm.setAccount(myAccount); + * client.svm.addProgramFromFile(myProgramAddress, 'my_program.so'); + * + * // Make some RPC calls. + * const { value: latestBlockhash } = await client.rpc.getLatestBlockhash().send(); + * ``` + */ +export function litesvm() { + return (client: T) => { + const svm = new LiteSVM(); + const rpc = createRpcFromSvm(svm); + return { ...client, rpc, svm }; + }; +} + +type Encoding = 'base58' | 'base64' | 'base64+zstd' | 'jsonParsed'; + +function createRpcFromSvm(svm: LiteSVM): RpcFromLiteSVM { + const base64Decoder = getBase64Decoder(); + const convertMaybeEncodedAccount = ( + account: MaybeEncodedAccount, + ): (AccountInfoBase & AccountInfoWithBase64EncodedData) | null => { + if (!account.exists) return null; + return { + data: [base64Decoder.decode(account.data) as Base64EncodedBytes, 'base64'] as const, + executable: account.executable, + lamports: account.lamports, + owner: account.programAddress, + space: account.space, + }; + }; + + return { + getAccountInfo: (address: Address, config?: { encoding?: Encoding }) => { + assertEncodingIsBase64(config?.encoding); + const response = convertMaybeEncodedAccount(svm.getAccount(address)); + return wrapInPendingRpcRequest(wrapInSolanaRpcResponse(response)); + }, + getLatestBlockhash: () => { + const response = { blockhash: svm.latestBlockhash(), lastValidBlockHeight: 0n }; + return wrapInPendingRpcRequest(wrapInSolanaRpcResponse(response)); + }, + getMultipleAccounts: (addresses: readonly Address[], config?: { encoding?: Encoding }) => { + assertEncodingIsBase64(config?.encoding); + const response = addresses.map(address => convertMaybeEncodedAccount(svm.getAccount(address))); + return wrapInPendingRpcRequest(wrapInSolanaRpcResponse(response)); + }, + } as RpcFromLiteSVM; +} + +function wrapInPendingRpcRequest(response: T): PendingRpcRequest { + return { send: () => Promise.resolve(response) }; +} + +function wrapInSolanaRpcResponse(value: T): SolanaRpcResponse { + return { context: { slot: 0n }, value }; +} + +function assertEncodingIsBase64(encoding: Encoding | undefined) { + if (encoding && encoding !== 'base64') { + throw new Error(`Please use 'base64' encoding when using LiteSVM RPC. Requested encoding: ${encoding}`); + } +} diff --git a/packages/kit-plugin-litesvm/test/index.test.ts b/packages/kit-plugin-litesvm/test/index.test.ts new file mode 100644 index 0000000..7e81a5b --- /dev/null +++ b/packages/kit-plugin-litesvm/test/index.test.ts @@ -0,0 +1,121 @@ +import { LiteSVM } from '@loris-sandbox/litesvm-kit'; +import { + address, + generateKeyPairSigner, + GetAccountInfoApi, + GetLatestBlockhashApi, + GetMultipleAccountsApi, + lamports, + Rpc, +} from '@solana/kit'; +import { createEmptyClient } from '@solana/plugin-core'; +import { describe, expect, expectTypeOf, it } from 'vitest'; + +import { litesvm } from '../src'; + +describe('litesvm', () => { + it('instantiates and attaches a new LiteSVM client', () => { + const client = createEmptyClient().use(litesvm()); + expect(client).toHaveProperty('svm'); + expect(client.svm).toBeInstanceOf(LiteSVM); + }); + + it('derives a small RPC from the LiteSVM client', () => { + const client = createEmptyClient().use(litesvm()); + expect(client).toHaveProperty('rpc'); + expect(client.rpc).toBeTypeOf('object'); + expect(client.rpc.getAccountInfo).toBeTypeOf('function'); + expect(client.rpc.getLatestBlockhash).toBeTypeOf('function'); + expect(client.rpc.getMultipleAccounts).toBeTypeOf('function'); + expectTypeOf(client.rpc).toEqualTypeOf< + Rpc + >(); + }); + + it('can fetch an account set on the svm', async () => { + const client = createEmptyClient().use(litesvm()); + const accountAddress = await generateKeyPairSigner().then(signer => signer.address); + + client.svm.setAccount({ + address: accountAddress, + data: new Uint8Array([1, 1]), + executable: false, + lamports: lamports(1_000_000n), + programAddress: address('11111111111111111111111111111111'), + space: 2n, + }); + + const { value } = await client.rpc.getAccountInfo(accountAddress).send(); + expect(value).toEqual({ + data: ['AQE=', 'base64'], + executable: false, + lamports: lamports(1_000_000n), + owner: address('11111111111111111111111111111111'), + space: 2n, + }); + }); + + it('can fetch a missing account on the svm', async () => { + const client = createEmptyClient().use(litesvm()); + const missingAddress = await generateKeyPairSigner().then(signer => signer.address); + + const { value } = await client.rpc.getAccountInfo(missingAddress).send(); + expect(value).toBeNull(); + }); + + it('can fetch multiple accounts set on the svm', async () => { + const client = createEmptyClient().use(litesvm()); + + const [addressA, addressB, missingAddressC] = await Promise.all([ + generateKeyPairSigner().then(signer => signer.address), + generateKeyPairSigner().then(signer => signer.address), + generateKeyPairSigner().then(signer => signer.address), + ]); + + client.svm.setAccount({ + address: addressA, + data: new Uint8Array([1, 1]), + executable: false, + lamports: lamports(1_000_000n), + programAddress: address('11111111111111111111111111111111'), + space: 2n, + }); + client.svm.setAccount({ + address: addressB, + data: new Uint8Array([2, 2, 2, 2]), + executable: false, + lamports: lamports(2_000_000n), + programAddress: address('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'), + space: 4n, + }); + + const { value } = await client.rpc.getMultipleAccounts([addressA, addressB, missingAddressC]).send(); + + expect(value).toHaveLength(3); + expect(value[0]).toEqual({ + data: ['AQE=', 'base64'], + executable: false, + lamports: lamports(1_000_000n), + owner: address('11111111111111111111111111111111'), + space: 2n, + }); + expect(value[1]).toEqual({ + data: ['AgICAg==', 'base64'], + executable: false, + lamports: lamports(2_000_000n), + owner: address('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA'), + space: 4n, + }); + expect(value[2]).toBeNull(); + }); + + it('can fetch a the latest blockhash', async () => { + const client = createEmptyClient().use(litesvm()); + + const { value } = await client.rpc.getLatestBlockhash({ commitment: 'finalized' }).send(); + expect(value).toStrictEqual({ + blockhash: client.svm.latestBlockhash(), + lastValidBlockHeight: 0n, + }); + }); +}); diff --git a/packages/kit-plugin-litesvm/tsconfig.declarations.json b/packages/kit-plugin-litesvm/tsconfig.declarations.json new file mode 100644 index 0000000..dc2d27b --- /dev/null +++ b/packages/kit-plugin-litesvm/tsconfig.declarations.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "declaration": true, + "declarationMap": true, + "emitDeclarationOnly": true, + "outDir": "./dist/types" + }, + "extends": "./tsconfig.json", + "include": ["src/index.ts", "src/types"] +} diff --git a/packages/kit-plugin-litesvm/tsconfig.json b/packages/kit-plugin-litesvm/tsconfig.json new file mode 100644 index 0000000..44d7a98 --- /dev/null +++ b/packages/kit-plugin-litesvm/tsconfig.json @@ -0,0 +1,7 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { "lib": [] }, + "display": "@solana/kit-plugin-litesvm", + "extends": "../../tsconfig.json", + "include": ["src", "test"] +} diff --git a/packages/kit-plugin-litesvm/tsup.config.ts b/packages/kit-plugin-litesvm/tsup.config.ts new file mode 100644 index 0000000..55e9945 --- /dev/null +++ b/packages/kit-plugin-litesvm/tsup.config.ts @@ -0,0 +1,5 @@ +import { defineConfig } from 'tsup'; + +import { getPackageBuildConfigs } from '../../tsup.config.base'; + +export default defineConfig(getPackageBuildConfigs()); diff --git a/packages/kit-plugin-litesvm/vitest.config.mts b/packages/kit-plugin-litesvm/vitest.config.mts new file mode 100644 index 0000000..8fd0137 --- /dev/null +++ b/packages/kit-plugin-litesvm/vitest.config.mts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config'; +import { getVitestConfig } from '../../vitest.config.base.mjs'; + +export default defineConfig({ + test: { + projects: [getVitestConfig('browser'), getVitestConfig('node'), getVitestConfig('react-native')], + }, +}); diff --git a/packages/kit-plugins/package.json b/packages/kit-plugins/package.json index 00691cf..0a52500 100644 --- a/packages/kit-plugins/package.json +++ b/packages/kit-plugins/package.json @@ -50,6 +50,7 @@ "@solana/kit": "^5.1.0" }, "dependencies": { + "@solana/kit-plugin-litesvm": "workspace:*", "@solana/kit-plugin-rpc": "workspace:*", "@solana/plugin-core": "workspace:*" }, diff --git a/packages/kit-plugins/src/defaults.ts b/packages/kit-plugins/src/defaults.ts index afd5aef..8fa5566 100644 --- a/packages/kit-plugins/src/defaults.ts +++ b/packages/kit-plugins/src/defaults.ts @@ -1,6 +1,11 @@ +import { litesvm } from '@solana/kit-plugin-litesvm'; import { localhostRpc } from '@solana/kit-plugin-rpc'; import { createEmptyClient } from '@solana/plugin-core'; export function createDefaultLocalhostClient() { return createEmptyClient().use(localhostRpc()); } + +export function createDefaultLiteSVMClient() { + return createEmptyClient().use(litesvm()); +} diff --git a/packages/kit-plugins/src/index.ts b/packages/kit-plugins/src/index.ts index a76543a..9b831b9 100644 --- a/packages/kit-plugins/src/index.ts +++ b/packages/kit-plugins/src/index.ts @@ -1,3 +1,4 @@ +export * from '@solana/kit-plugin-litesvm'; export * from '@solana/kit-plugin-rpc'; export * from './defaults'; diff --git a/packages/kit-plugins/test/defaults.test.ts b/packages/kit-plugins/test/defaults.test.ts index c7b54a2..d0ac342 100644 --- a/packages/kit-plugins/test/defaults.test.ts +++ b/packages/kit-plugins/test/defaults.test.ts @@ -1,7 +1,7 @@ import { Rpc, RpcSubscriptions, SolanaRpcApi, SolanaRpcSubscriptionsApi } from '@solana/kit'; import { describe, expect, expectTypeOf, it } from 'vitest'; -import { createDefaultLocalhostClient } from '../src'; +import { createDefaultLiteSVMClient, createDefaultLocalhostClient, type LiteSVM, RpcFromLiteSVM } from '../src'; describe('createDefaultLocalhostClient', () => { it('it offers an RPC client', () => { @@ -16,3 +16,17 @@ describe('createDefaultLocalhostClient', () => { expectTypeOf(client.rpcSubscriptions).toEqualTypeOf>(); }); }); + +describe('createDefaultLiteSVMClient', () => { + it('it offers a LiteSVM instance', () => { + const client = createDefaultLiteSVMClient(); + expect(client.svm).toBeTypeOf('object'); + expectTypeOf(client.svm).toEqualTypeOf(); + }); + + it('it offers an RPC subset', () => { + const client = createDefaultLiteSVMClient(); + expect(client.rpc).toBeTypeOf('object'); + expectTypeOf(client.rpc).toEqualTypeOf(); + }); +}); diff --git a/packages/kit-plugins/tsup.config.ts b/packages/kit-plugins/tsup.config.ts index 9d61d48..55e9945 100644 --- a/packages/kit-plugins/tsup.config.ts +++ b/packages/kit-plugins/tsup.config.ts @@ -1,5 +1,5 @@ import { defineConfig } from 'tsup'; -import { getBuildConfig, getPackageBuildConfigs } from '../../tsup.config.base'; +import { getPackageBuildConfigs } from '../../tsup.config.base'; -export default defineConfig([...getPackageBuildConfigs(), getBuildConfig({ format: 'iife', platform: 'browser' })]); +export default defineConfig(getPackageBuildConfigs()); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3f4cc27..fad04a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,6 +57,19 @@ importers: specifier: ^8.18.3 version: 8.18.3 + packages/kit-plugin-litesvm: + dependencies: + '@loris-sandbox/litesvm-kit': + specifier: ^0.5.0 + version: 0.5.0(typescript@5.9.3)(ws@8.18.3) + devDependencies: + '@solana/kit': + specifier: ^5.1.0 + version: 5.1.0(typescript@5.9.3)(ws@8.18.3) + '@solana/plugin-core': + specifier: workspace:* + version: link:../plugin-core + packages/kit-plugin-rpc: devDependencies: '@solana/kit': @@ -68,6 +81,9 @@ importers: packages/kit-plugins: dependencies: + '@solana/kit-plugin-litesvm': + specifier: workspace:* + version: link:../kit-plugin-litesvm '@solana/kit-plugin-rpc': specifier: workspace:* version: link:../kit-plugin-rpc @@ -659,6 +675,46 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@loris-sandbox/litesvm-kit-darwin-arm64@0.5.0': + resolution: {integrity: sha512-yWPgh8bQsHJtmVcHcwhJFFEjh5G6wigHYuiRBIbY+lybKPTQ1LKJ3CK/zlD74KwL/xfgUdiyBLz+fORQrCO19Q==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@loris-sandbox/litesvm-kit-darwin-x64@0.5.0': + resolution: {integrity: sha512-fddPO15++i67Yemiopxj/qEw4X/Jup/jBcWBN/UeE1bPt2GDrj02alzO1CSOKfaRrfu7MeWbwPumG07xQpwF9Q==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@loris-sandbox/litesvm-kit-linux-arm64-gnu@0.5.0': + resolution: {integrity: sha512-otmfH7UBYseWzPMPOKVc4k6/G8QXCeZ8scd+eoINwcvNYtEtKoUe0CBItnwTSCiwLyzYDcWB4LXzcpQV0ZNZKg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@loris-sandbox/litesvm-kit-linux-arm64-musl@0.5.0': + resolution: {integrity: sha512-mCGPqtl5PcJ3PTb20NnaCnFZ00E54c4r00e1IPB7O4DW+fLYoICfgNUy5S6mVNv0Yt45fT8QaUQbWcoGnmL6IQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@loris-sandbox/litesvm-kit-linux-x64-gnu@0.5.0': + resolution: {integrity: sha512-zbXvI71o9k715m1H/CtH2vEIwlf54O5oUmIZthVmnMRa33ct9vZj/sz0mcPW7NIIsYQEm1+rKysqXXNoThiFwg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@loris-sandbox/litesvm-kit-linux-x64-musl@0.5.0': + resolution: {integrity: sha512-bI30I12C7HczA9Q6c9d6DMKGHEqQBn0zRHDHAYX1T8YfGFFEKxTm0XtTFPH1BZrFfBzEHEUHfPB/pYaVjzb1cA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@loris-sandbox/litesvm-kit@0.5.0': + resolution: {integrity: sha512-zJcAFmEX82td18uzxhLX9yM6lqQ3as3FzLpJpARdJtTrIMNe0txVdAB+vZw1FqMQ9dL3h6IkUBahIWdCT4uHzw==} + engines: {node: '>= 20'} + '@manypkg/find-root@1.1.0': resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} @@ -816,6 +872,16 @@ packages: '@sinonjs/fake-timers@13.0.5': resolution: {integrity: sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==} + '@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.1.0': resolution: {integrity: sha512-Q1KzykCrl/YjLUH2RXF8vPq65U/ehAV2SHZicPbZ0jvgQUU6X1+Eca+0ilxA9xH8srYn3YTVDyEs/LYdfbY/2A==} engines: {node: '>=20.18.0'} @@ -3763,6 +3829,41 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@loris-sandbox/litesvm-kit-darwin-arm64@0.5.0': + optional: true + + '@loris-sandbox/litesvm-kit-darwin-x64@0.5.0': + optional: true + + '@loris-sandbox/litesvm-kit-linux-arm64-gnu@0.5.0': + optional: true + + '@loris-sandbox/litesvm-kit-linux-arm64-musl@0.5.0': + optional: true + + '@loris-sandbox/litesvm-kit-linux-x64-gnu@0.5.0': + optional: true + + '@loris-sandbox/litesvm-kit-linux-x64-musl@0.5.0': + optional: true + + '@loris-sandbox/litesvm-kit@0.5.0(typescript@5.9.3)(ws@8.18.3)': + dependencies: + '@solana-program/system': 0.10.0(@solana/kit@5.1.0(typescript@5.9.3)(ws@8.18.3)) + '@solana-program/token': 0.9.0(@solana/kit@5.1.0(typescript@5.9.3)(ws@8.18.3)) + '@solana/kit': 5.1.0(typescript@5.9.3)(ws@8.18.3) + optionalDependencies: + '@loris-sandbox/litesvm-kit-darwin-arm64': 0.5.0 + '@loris-sandbox/litesvm-kit-darwin-x64': 0.5.0 + '@loris-sandbox/litesvm-kit-linux-arm64-gnu': 0.5.0 + '@loris-sandbox/litesvm-kit-linux-arm64-musl': 0.5.0 + '@loris-sandbox/litesvm-kit-linux-x64-gnu': 0.5.0 + '@loris-sandbox/litesvm-kit-linux-x64-musl': 0.5.0 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - typescript + - ws + '@manypkg/find-root@1.1.0': dependencies: '@babel/runtime': 7.28.4 @@ -3883,6 +3984,14 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 + '@solana-program/system@0.10.0(@solana/kit@5.1.0(typescript@5.9.3)(ws@8.18.3))': + dependencies: + '@solana/kit': 5.1.0(typescript@5.9.3)(ws@8.18.3) + + '@solana-program/token@0.9.0(@solana/kit@5.1.0(typescript@5.9.3)(ws@8.18.3))': + dependencies: + '@solana/kit': 5.1.0(typescript@5.9.3)(ws@8.18.3) + '@solana/accounts@5.1.0(typescript@5.9.3)': dependencies: '@solana/addresses': 5.1.0(typescript@5.9.3)