diff --git a/.changeset/soft-cameras-lay.md b/.changeset/soft-cameras-lay.md new file mode 100644 index 00000000000..3e7a273320e --- /dev/null +++ b/.changeset/soft-cameras-lay.md @@ -0,0 +1,5 @@ +--- +"@thirdweb-dev/vault-sdk": minor +--- + +Added Vault operations support for Solana. diff --git a/packages/vault-sdk/biome.json b/packages/vault-sdk/biome.json index 709230af37e..f9869db792f 100644 --- a/packages/vault-sdk/biome.json +++ b/packages/vault-sdk/biome.json @@ -1,16 +1,4 @@ { "$schema": "https://biomejs.dev/schemas/2.0.6/schema.json", - "extends": "//", - "overrides": [ - { - "assist": { - "actions": { - "source": { - "useSortedKeys": "off" - } - } - }, - "includes": ["package.json"] - } - ] + "extends": "//" } diff --git a/packages/vault-sdk/package.json b/packages/vault-sdk/package.json index 64a4d1b2d6b..90b449be013 100644 --- a/packages/vault-sdk/package.json +++ b/packages/vault-sdk/package.json @@ -7,12 +7,20 @@ "@noble/ciphers": "^1.2.1", "@noble/curves": "1.8.2", "@noble/hashes": "1.7.2", + "@solana/addresses": "^3.0.0", + "@solana/keys": "^3.0.0", + "@solana/kit": "^4.0.0", + "@solana/rpc": "^3.0.0", + "@solana/transactions": "^3.0.0", "abitype": "1.0.8", "jose": "6.0.11" }, "devDependencies": { "@biomejs/biome": "2.0.6", - "rimraf": "6.0.1" + "@solana-program/system": "^0.8.1", + "bs58": "^6.0.0", + "rimraf": "6.0.1", + "vitest": "3.2.4" }, "engines": { "node": ">=18" @@ -51,6 +59,7 @@ "build:esm": "tsc --project ./tsconfig.build.json --module es2020 --outDir ./dist/esm && printf '{\"type\": \"module\",\"sideEffects\":false}' > ./dist/esm/package.json", "build:types": "tsc --project ./tsconfig.build.json --module esnext --declarationDir ./dist/types --emitDeclarationOnly --declaration --declarationMap", "clean": "rimraf dist", + "test:solana": "vitest ./tests/solana.test.ts", "dev": "tsc --project ./tsconfig.build.json --module es2020 --outDir ./dist/esm --watch", "fix": "biome check ./src --fix", "format": "biome format ./src --write", diff --git a/packages/vault-sdk/src/exports/thirdweb.ts b/packages/vault-sdk/src/exports/thirdweb.ts index 51059bdc5a1..687441a9be9 100644 --- a/packages/vault-sdk/src/exports/thirdweb.ts +++ b/packages/vault-sdk/src/exports/thirdweb.ts @@ -3,15 +3,19 @@ export { createEoa, createServiceAccount, createSignedAccessToken, + createSolanaAccount, createVaultClient, getServiceAccount, listAccessTokens, listEoas, + listSolanaAccounts, ping, revokeAccessToken, rotateServiceAccount, signAuthorization, signMessage, + signSolanaMessage, + signSolanaTransaction, signStructuredMessage, signTransaction, signTypedData, @@ -31,6 +35,7 @@ export type { CreateAccessTokenPayload, CreateEoaPayload, CreateServiceAccountPayload, + CreateSolanaAccountPayload, EncryptedPayload, GenericPayload, GetAccessTokensData, @@ -38,6 +43,7 @@ export type { GetServiceAccountPayload, ListAccessTokensPayload, ListEoaPayload, + ListSolanaAccountsPayload, Payload, PingPayload, PolicyComponent, @@ -49,6 +55,8 @@ export type { SignAuthorizationRules, SignedAuthorization, SignMessagePayload, + SignSolanaMessagePayload, + SignSolanaTransactionPayload, SignStructuredMessageData, SignStructuredMessageOptions, SignStructuredMessagePayload, diff --git a/packages/vault-sdk/src/sdk.ts b/packages/vault-sdk/src/sdk.ts index 4ddeef31548..25bb00c0796 100644 --- a/packages/vault-sdk/src/sdk.ts +++ b/packages/vault-sdk/src/sdk.ts @@ -3,18 +3,27 @@ import { x25519 } from "@noble/curves/ed25519"; import { hkdf } from "@noble/hashes/hkdf"; import { sha256 } from "@noble/hashes/sha256"; import { bytesToHex, hexToBytes, randomBytes } from "@noble/hashes/utils"; + +import { + address, + getBase58Encoder, + getTransactionDecoder, + getTransactionEncoder, +} from "@solana/kit"; + import type { TypedData } from "abitype"; import * as jose from "jose"; - import type { CheckedSignTypedDataPayload, CreateAccessTokenPayload, CreateEoaPayload, CreateServiceAccountPayload, + CreateSolanaAccountPayload, EncryptedPayload, GetServiceAccountPayload, ListAccessTokensPayload, ListEoaPayload, + ListSolanaAccountsPayload, Payload, PingPayload, PolicyComponent, @@ -23,6 +32,8 @@ import type { RotateServiceAccountPayload, SignAuthorizationPayload, SignMessagePayload, + SignSolanaMessagePayload, + SignSolanaTransactionPayload, SignStructuredMessagePayload, SignTransactionPayload, UnencryptedErrorResponse, @@ -447,6 +458,96 @@ export function listAccessTokens({ }); } +// ========== Solana Functions ========== + +export function createSolanaAccount({ + client, + request: options, +}: PayloadParams) { + return sendRequest({ + client, + request: { + operation: "solana:create", + ...options, + }, + }); +} + +export function listSolanaAccounts({ + client, + request: options, +}: PayloadParams) { + return sendRequest({ + client, + request: { + operation: "solana:list", + ...options, + }, + }); +} + +export function signSolanaTransaction({ + client, + request: options, +}: PayloadParams) { + return sendRequest({ + client, + request: { + operation: "solana:signTransaction", + ...options, + }, + }); +} + +/** + * Reconstruct a signed solana transaction from the vault signature using @solana/kit + */ +export function reconstructSolanaSignedTransaction( + base64Transaction: string, + base58Signature: string, + signerPubkey: string, +): Uint8Array { + // Decode the base64 transaction into bytes + const base64TransactionBytes = new Uint8Array( + Buffer.from(base64Transaction, "base64"), + ); + // Decode the transaction to get its structure + const transactionDecoder = getTransactionDecoder(); + const transaction = transactionDecoder.decode(base64TransactionBytes); + + // Decode the base58 signature to bytes + const base58Encoder = getBase58Encoder(); + const signatureBytes = base58Encoder.encode(base58Signature); + + // Add the signature to the transaction + const signedTransaction = { + ...transaction, + signatures: { + ...transaction.signatures, + [address(signerPubkey)]: signatureBytes, + }, + }; + + // Re-encode the signed transaction + const transactionEncoder = getTransactionEncoder(); + const signedTransactionBytes = transactionEncoder.encode(signedTransaction); + + return new Uint8Array(signedTransactionBytes); +} + +export function signSolanaMessage({ + client, + request: options, +}: PayloadParams) { + return sendRequest({ + client, + request: { + operation: "solana:signMessage", + ...options, + }, + }); +} + const SIGNED_TOKEN_PREFIX = "vt_sat_"; const DEFAULT_SIGNING_CONTEXT = "encryption"; // Default context for HKDF diff --git a/packages/vault-sdk/src/types.ts b/packages/vault-sdk/src/types.ts index 6ea9632234c..4d1b07a7128 100644 --- a/packages/vault-sdk/src/types.ts +++ b/packages/vault-sdk/src/types.ts @@ -58,7 +58,7 @@ export type UnencryptedErrorResponse = { type EncryptedError = { code: string; message: string; - details?: string; + details?: string | { reason: string }; }; type GenericSuccessResponse = { @@ -148,6 +148,50 @@ type SignMessageOptions = { format?: "text" | "hex"; }; +// ========== Solana Options Types ========== + +// Solana message type that's compatible with both Kit and our Rust serialization +export type SolanaVersionedMessage = { + version: "legacy" | "v0"; + header: { + numRequiredSignatures: number; + numReadonlySignedAccounts: number; + numReadonlyUnsignedAccounts: number; + }; + staticAccountKeys: string[]; // Use string instead of SolanaAddress for simplicity + recentBlockhash: string; + instructions: Array<{ + programIdIndex: number; + accountKeyIndexes: number[]; + data: Uint8Array; + }>; + addressTableLookups?: Array<{ + accountKey: string; // Use string instead of SolanaAddress + writableIndexes: number[]; + readonlyIndexes: number[]; + }>; +}; + +type CreateSolanaAccountOptions = { + metadata: Record; +}; + +type GetSolanaAccountsOptions = { + page?: number; + pageSize?: number; +}; + +type SignSolanaTransactionOptions = { + transaction: string; // Base64 encoded VersionedTransaction + from: string; // Use string for Solana public key +}; + +type SignSolanaMessageOptions = { + message: string; + from: string; // Use string for Solana public key + format?: "text" | "hex"; +}; + type CheckedSignTypedDataOptions< Types extends TypedData, PrimaryType extends keyof Types | "EIP712Domain" = keyof Types, @@ -315,12 +359,63 @@ export type PolicyComponent = useropV07?: UserOperationV07Rules; }; } + | { + type: "solana:create"; + requiredMetadataPatterns?: MetadataRule[]; + allowedMetadataPatterns?: MetadataRule[]; + } + | { + type: "solana:read"; + metadataPatterns?: MetadataRule[]; + } + | { + type: "solana:signTransaction"; + allowlist?: string[]; // Use string for Solana addresses + metadataPatterns?: MetadataRule[]; + payloadPatterns?: Record; + transactionPatterns?: SolanaTransactionPatterns; + } + | { + type: "solana:signMessage"; + allowlist?: string[]; // Use string for Solana addresses + metadataPatterns?: MetadataRule[]; + messagePattern?: string; + } | { type: "accessToken:read"; metadataPatterns?: MetadataRule[]; revealSensitive: boolean; }; +// Solana transaction patterns +export type SolanaTransactionPatterns = { + programs?: ProgramAccessControl; + writableAccounts?: AccountAccessControl; + requiredCosigners?: string[]; + maxInstructions?: number; + canPayFees?: boolean; +}; + +export type ProgramAccessControl = + | { + type: "allow"; + programs: string[]; + } + | { + type: "deny"; + programs: string[]; + }; + +export type AccountAccessControl = + | { + type: "allow"; + accounts: string[]; + } + | { + type: "deny"; + accounts: string[]; + }; + type OwnerType = string; // Define based on your eoa models type CreateAccessTokenOptions = { @@ -399,6 +494,30 @@ type SignMessageData = { signature: string; }; +// ========== Solana Data Types ========== +type CreateSolanaAccountData = { + pubkey: string; + metadata: Record; + createdAt: string; + updatedAt: string; +}; + +type GetSolanaAccountsData = { + accounts: CreateSolanaAccountData[]; + totalCount: number; + page: number; + pageSize: number; +}; + +type SignSolanaTransactionData = { + signature: string; // Base58 encoded signature + signerPubkey: string; // Use string for Solana public key +}; + +type SignSolanaMessageData = { + signature: string; // Base58 encoded signature +}; + type SignTypedDataData = { signature: string; }; @@ -553,6 +672,35 @@ export type RevokeAccessTokenPayload = GenericPayload<{ data: AccessTokenData; }>; +// ========== Solana Payload Types ========== +export type CreateSolanaAccountPayload = GenericPayload<{ + operation: "solana:create"; + auth: Auth; + options: CreateSolanaAccountOptions; + data: CreateSolanaAccountData; +}>; + +export type ListSolanaAccountsPayload = GenericPayload<{ + operation: "solana:list"; + auth: Auth; + options: GetSolanaAccountsOptions; + data: GetSolanaAccountsData; +}>; + +export type SignSolanaTransactionPayload = GenericPayload<{ + operation: "solana:signTransaction"; + auth: Auth; + options: SignSolanaTransactionOptions; + data: SignSolanaTransactionData; +}>; + +export type SignSolanaMessagePayload = GenericPayload<{ + operation: "solana:signMessage"; + auth: Auth; + options: SignSolanaMessageOptions; + data: SignSolanaMessageData; +}>; + // ========== Union of all payloads ========== export type Payload = | PingPayload @@ -568,4 +716,8 @@ export type Payload = | RevokeAccessTokenPayload | SignAuthorizationPayload | SignStructuredMessagePayload - | ListAccessTokensPayload; + | ListAccessTokensPayload + | CreateSolanaAccountPayload + | ListSolanaAccountsPayload + | SignSolanaTransactionPayload + | SignSolanaMessagePayload; diff --git a/packages/vault-sdk/tests/.env.example b/packages/vault-sdk/tests/.env.example new file mode 100644 index 00000000000..0ab3952ac14 --- /dev/null +++ b/packages/vault-sdk/tests/.env.example @@ -0,0 +1,6 @@ +# Solana RPC Configuration +SOLANA_RPC_HTTP_URL=http://127.0.0.1:8899 +SOLANA_RPC_WS_URL=ws://127.0.0.1:8900 + +# Vault Configuration +VAULT_URL=http://localhost:3000 \ No newline at end of file diff --git a/packages/vault-sdk/tests/env-setup.ts b/packages/vault-sdk/tests/env-setup.ts new file mode 100644 index 00000000000..afc7d9be561 --- /dev/null +++ b/packages/vault-sdk/tests/env-setup.ts @@ -0,0 +1,11 @@ +import { dirname, join } from "node:path"; +import { loadEnvFile } from "node:process"; +import { fileURLToPath } from "node:url"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +try { + loadEnvFile(join(__dirname, ".env")); +} catch (_error) { + console.warn("No .env file found, using default values"); +} diff --git a/packages/vault-sdk/tests/solana.test.ts b/packages/vault-sdk/tests/solana.test.ts new file mode 100644 index 00000000000..9b136f36777 --- /dev/null +++ b/packages/vault-sdk/tests/solana.test.ts @@ -0,0 +1,1700 @@ +import { + address, + airdropFactory, + appendTransactionMessageInstruction, + type Base64EncodedWireTransaction, + compileTransaction, + createNoopSigner, + createSolanaRpc, + createSolanaRpcSubscriptions, + createTransactionMessage, + type DevnetUrl, + devnet, + getBase64EncodedWireTransaction, + lamports, + pipe, + type Signature, + setTransactionMessageFeePayer, + setTransactionMessageLifetimeUsingBlockhash, +} from "@solana/kit"; +import { getTransferSolInstruction } from "@solana-program/system"; +import bs58 from "bs58"; +import { beforeAll, describe, expect, it } from "vitest"; +import { + createAccessToken, + createServiceAccount, + createSolanaAccount, + createVaultClient, + signSolanaTransaction, + type VaultClient, +} from "../src/exports/thirdweb.js"; +import { reconstructSolanaSignedTransaction } from "../src/sdk.js"; + +// Environment variables with fallbacks +const SOLANA_RPC_HTTP_URL = + process.env.SOLANA_RPC_HTTP_URL || "http://127.0.0.1:8899"; +const SOLANA_RPC_WS_URL = + process.env.SOLANA_RPC_WS_URL || "ws://127.0.0.1:8900"; +const VAULT_URL = process.env.VAULT_URL || "http://localhost:3000"; +const LAMPORTS_PER_SOL = 1_000_000_000n; + +/** + * Generate Solana explorer URL with custom RPC endpoint + */ +function getExplorerUrl(path: string, type: "address" | "tx" = "tx"): string { + const encodedRpcUrl = encodeURIComponent(SOLANA_RPC_HTTP_URL); + return `https://explorer.solana.com/${type}/${path}?cluster=custom&customUrl=${encodedRpcUrl}`; +} + +/** + * Send a signed transaction to the Solana network + */ +async function sendSignedTransaction( + rpc: ReturnType, + signedTransactionBytes: Uint8Array, +): Promise { + const base64SignedTransaction = Buffer.from(signedTransactionBytes).toString( + "base64", + ); + + const response = await rpc + .sendTransaction(base64SignedTransaction as Base64EncodedWireTransaction, { + encoding: "base64", + skipPreflight: false, + preflightCommitment: "confirmed", + }) + .send(); + + return response; +} + +describe("Solana Vault Integration Tests", () => { + let vaultClient: VaultClient; + let adminKey: string; + let senderPubkey: string; + let receiverPubkey: string; + let rpc: ReturnType>; + let rpcSubscriptions: ReturnType< + typeof createSolanaRpcSubscriptions + >; + + beforeAll(async () => { + // Setup RPC connections + rpc = createSolanaRpc(devnet(SOLANA_RPC_HTTP_URL)); + rpcSubscriptions = createSolanaRpcSubscriptions(devnet(SOLANA_RPC_WS_URL)); + + // Create vault client + vaultClient = await createVaultClient({ baseUrl: VAULT_URL }); + + // Create service account + const serviceAccountResult = await createServiceAccount({ + client: vaultClient, + request: { + options: { + metadata: { + name: "Solana Test Service Account", + description: "Testing Solana integration", + }, + }, + }, + }); + + adminKey = serviceAccountResult.data?.adminKey || ""; + expect(adminKey).toBeTruthy(); + + // Create sender account + const senderAccount = await createSolanaAccount({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + metadata: { + name: "Test Sender", + purpose: "Sender account for tests", + }, + }, + }, + }); + + // Create receiver account + const receiverAccount = await createSolanaAccount({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + metadata: { + name: "Test Receiver", + purpose: "Receiver account for tests", + }, + }, + }, + }); + + senderPubkey = senderAccount.data?.pubkey || ""; + receiverPubkey = receiverAccount.data?.pubkey || ""; + + expect(senderPubkey).toBeTruthy(); + expect(receiverPubkey).toBeTruthy(); + + console.log("\n=== Account Setup ==="); + console.log(`Sender account: ${senderPubkey}`); + console.log(`View sender: ${getExplorerUrl(senderPubkey, "address")}`); + console.log(`Receiver account: ${receiverPubkey}`); + console.log(`View receiver: ${getExplorerUrl(receiverPubkey, "address")}`); + + // Airdrop minimal SOL to sender (just enough for tx fees + transfers) + // ~5000 lamports per tx fee * 4 txs + 4 lamports for transfers = ~20004 lamports + console.log("\n=== Airdrop ==="); + console.log("Requesting airdrop of 3000000000 lamports (3 SOL)..."); + const airdrop = airdropFactory({ rpc, rpcSubscriptions }); + const airdropSignature = await airdrop({ + commitment: "confirmed", + recipientAddress: address(senderPubkey), + lamports: lamports(3_000_000_000n), // 3 SOL for tests + }); + + console.log(`Airdrop signature: ${airdropSignature}`); + console.log(`View airdrop: ${getExplorerUrl(airdropSignature)}`); + + // Wait a bit for airdrop to confirm + await new Promise((resolve) => setTimeout(resolve, 2000)); + }, 60000); // 60 second timeout for setup + + describe("Vault Health Check", () => { + it("should successfully connect to vault", async () => { + const response = await fetch(`${VAULT_URL}/health`, { + method: "GET", + headers: { "Content-Type": "application/json" }, + }); + + expect(response.ok).toBe(true); + }); + }); + + describe("Account Management", () => { + it("should have created sender account with valid pubkey", () => { + expect(senderPubkey).toMatch(/^[1-9A-HJ-NP-Za-km-z]{32,44}$/); + }); + + it("should have created receiver account with valid pubkey", () => { + expect(receiverPubkey).toMatch(/^[1-9A-HJ-NP-Za-km-z]{32,44}$/); + }); + + it("should have different pubkeys for sender and receiver", () => { + expect(senderPubkey).not.toBe(receiverPubkey); + }); + }); + + describe("Access Token - Solana Account Creation", () => { + it("should create a Solana account using an access token", async () => { + // Create an access token with solana:create permission + const expiresAt = new Date(Date.now() + 3600000).toISOString(); // 1 hour from now + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:create", + allowedMetadataPatterns: [ + { + key: "purpose", + rule: { pattern: ".*" }, // Allow any purpose + }, + { + key: "name", + rule: { pattern: ".*" }, + }, + ], + }, + { + type: "solana:read", + metadataPatterns: [ + { + key: "purpose", + rule: { pattern: ".*" }, // Allow reading any + }, + ], + }, + ], + expiresAt, + metadata: { + name: "Solana Access Token", + description: "Token for creating Solana accounts", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + expect(accessTokenResult.data?.accessToken).toBeTruthy(); + + const accessToken = accessTokenResult.data?.accessToken || ""; + console.log("\n=== Access Token Created ==="); + console.log(`Access Token ID: ${accessTokenResult.data?.id}`); + + // Use the access token to create a new Solana account + const accountResult = await createSolanaAccount({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + metadata: { + name: "Access Token Created Account", + purpose: "Testing access token creation", + }, + }, + }, + }); + + expect(accountResult.success).toBe(true); + expect(accountResult.data?.pubkey).toBeTruthy(); + expect(accountResult.data?.pubkey).toMatch( + /^[1-9A-HJ-NP-Za-km-z]{32,44}$/, + ); + + console.log("\n=== Account Created via Access Token ==="); + console.log(`Account pubkey: ${accountResult.data?.pubkey}`); + console.log( + `View account: ${getExplorerUrl(accountResult.data?.pubkey || "", "address")}`, + ); + console.log(`Created at: ${accountResult.data?.createdAt}`); + }); + + it("should fail to create account without proper permissions", async () => { + // Create an access token without solana:create permission (only read) + const expiresAt = new Date(Date.now() + 3600000).toISOString(); // 1 hour from now + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:read", + metadataPatterns: [ + { + key: "purpose", + rule: { pattern: ".*" }, + }, + ], + }, + ], + expiresAt, + metadata: { + name: "Read-Only Token", + description: "Token without create permission", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + // Attempt to create account should fail + const accountResult = await createSolanaAccount({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + metadata: { + name: "Should Fail", + purpose: "This should not work", + }, + }, + }, + }); + + expect(accountResult.success).toBe(false); + expect(accountResult.error).toBeTruthy(); + }); + }); + + describe("Transaction Creation and Signing", () => { + it("should create a valid transfer transaction", async () => { + const transferAmount = lamports(100_000_000n); + + // Get latest blockhash + const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); + expect(latestBlockhash.blockhash).toBeTruthy(); + + const signer = createNoopSigner(address(senderPubkey)); + + // Create transfer instruction + const transferInstruction = getTransferSolInstruction({ + source: signer, + destination: address(receiverPubkey), + amount: transferAmount, + }); + + // Build transaction message + const transactionMessage = pipe( + createTransactionMessage({ version: 0 }), + (tx) => setTransactionMessageFeePayer(address(senderPubkey), tx), + (tx) => + setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), + (tx) => appendTransactionMessageInstruction(transferInstruction, tx), + ); + + // Compile transaction + const compiledTransaction = compileTransaction(transactionMessage); + const base64Transaction = + getBase64EncodedWireTransaction(compiledTransaction); + + expect(base64Transaction).toBeTruthy(); + expect(base64Transaction.length).toBeGreaterThan(0); + }); + + it("should sign transaction with vault and return valid signature", async () => { + const transferAmount = lamports(100_000_000n); + + // Get latest blockhash + const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); + + const signer = createNoopSigner(address(senderPubkey)); + + // Create transfer instruction + const transferInstruction = getTransferSolInstruction({ + source: signer, + destination: address(receiverPubkey), + amount: transferAmount, + }); + + // Build transaction message + const transactionMessage = pipe( + createTransactionMessage({ version: 0 }), + (tx) => setTransactionMessageFeePayer(address(senderPubkey), tx), + (tx) => + setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), + (tx) => appendTransactionMessageInstruction(transferInstruction, tx), + ); + + // Compile and encode + const compiledTransaction = compileTransaction(transactionMessage); + const base64Transaction = + getBase64EncodedWireTransaction(compiledTransaction); + + // Sign with vault + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + expect(signatureResult.data?.signerPubkey).toBe(senderPubkey); + + // Validate signature format (base58) + const signature = signatureResult.data?.signature || ""; + expect(signature).toMatch(/^[1-9A-HJ-NP-Za-km-z]+$/); + + // Decode to verify it's 64 bytes + const signatureBytes = bs58.decode(signature); + expect(signatureBytes.length).toBe(64); + }); + }); + + describe("End-to-End Transfer", () => { + it("should create, sign, and broadcast a SOL transfer", async () => { + const transferAmount = lamports(100_000_000n); + + // Get sender's initial balance + const initialBalance = await rpc.getBalance(address(senderPubkey)).send(); + console.log( + `Initial sender balance: ${Number(initialBalance.value) / Number(LAMPORTS_PER_SOL)} SOL`, + ); + + // Get latest blockhash + const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); + + const signer = createNoopSigner(address(senderPubkey)); + + // Create transfer instruction + const transferInstruction = getTransferSolInstruction({ + source: signer, + destination: address(receiverPubkey), + amount: transferAmount, + }); + + // Build transaction message + const transactionMessage = pipe( + createTransactionMessage({ version: 0 }), + (tx) => setTransactionMessageFeePayer(address(senderPubkey), tx), + (tx) => + setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), + (tx) => appendTransactionMessageInstruction(transferInstruction, tx), + ); + + // Compile and encode + const compiledTransaction = compileTransaction(transactionMessage); + const base64Transaction = + getBase64EncodedWireTransaction(compiledTransaction); + + // Sign with vault + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + if (!signatureResult.success) { + throw new Error("Failed to sign transaction"); + } + + const { signature, signerPubkey } = signatureResult.data; + expect(signerPubkey).toBe(senderPubkey); + + // Reconstruct signed transaction + const signedTransactionBytes = reconstructSolanaSignedTransaction( + base64Transaction, + signature, + senderPubkey, + ); + + expect(signedTransactionBytes.length).toBeGreaterThan(0); + + // Send transaction to network + const txSignature = await sendSignedTransaction( + rpc, + signedTransactionBytes, + ); + + expect(txSignature).toBeTruthy(); + expect(typeof txSignature).toBe("string"); + + console.log("\n=== Transfer Transaction ==="); + console.log(`Transaction signature: ${txSignature}`); + console.log(`View transaction: ${getExplorerUrl(txSignature)}`); + + // Wait for confirmation + await new Promise((resolve) => setTimeout(resolve, 3000)); + + // Verify transaction was successful + const txDetails = await rpc + .getTransaction(txSignature as Signature, { + encoding: "json", + maxSupportedTransactionVersion: 0, + }) + .send(); + + expect(txDetails).toBeTruthy(); + expect(txDetails?.meta?.err).toBeNull(); + + // Get final balance + const finalBalance = await rpc.getBalance(address(senderPubkey)).send(); + console.log( + `Final sender balance: ${Number(finalBalance.value) / Number(LAMPORTS_PER_SOL)} SOL`, + ); + + // Balance should have decreased (transfer amount + fees) + expect(Number(finalBalance.value)).toBeLessThan( + Number(initialBalance.value), + ); + }, 30000); // 30 second timeout for network operations + }); + + describe("Multiple Transfers", () => { + it("should handle multiple sequential transfers", async () => { + const numTransfers = 3; + const transferAmount = lamports(100_000_000n); + + const signatures: string[] = []; + + for (let i = 0; i < numTransfers; i++) { + console.log(`\nProcessing transfer ${i + 1}/${numTransfers}...`); + + // Get latest blockhash (fresh for each transaction) + const { value: latestBlockhash } = await rpc + .getLatestBlockhash() + .send(); + + const signer = createNoopSigner(address(senderPubkey)); + + // Create transfer instruction + const transferInstruction = getTransferSolInstruction({ + source: signer, + destination: address(receiverPubkey), + amount: transferAmount, + }); + + // Build transaction + const transactionMessage = pipe( + createTransactionMessage({ version: 0 }), + (tx) => setTransactionMessageFeePayer(address(senderPubkey), tx), + (tx) => + setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), + (tx) => appendTransactionMessageInstruction(transferInstruction, tx), + ); + + const compiledTransaction = compileTransaction(transactionMessage); + const base64Transaction = + getBase64EncodedWireTransaction(compiledTransaction); + + // Sign with vault + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + if (!signatureResult.success) continue; + + // Reconstruct and send + const signedTransactionBytes = reconstructSolanaSignedTransaction( + base64Transaction, + signatureResult.data.signature, + senderPubkey, + ); + + const txSignature = await sendSignedTransaction( + rpc, + signedTransactionBytes, + ); + + signatures.push(txSignature); + console.log(`Transfer ${i + 1} signature: ${txSignature}`); + console.log(`View transfer ${i + 1}: ${getExplorerUrl(txSignature)}`); + + // Wait between transactions + await new Promise((resolve) => setTimeout(resolve, 2000)); + } + + expect(signatures.length).toBe(numTransfers); + console.log(`\n=== Summary ===`); + console.log(`Completed ${numTransfers} transfers successfully!`); + for (let i = 0; i < signatures.length; i++) { + console.log(`Transfer ${i + 1}: ${getExplorerUrl(signatures[i])}`); + } + }, 60000); // 60 second timeout + }); + + describe("Access Token - Transaction Pattern Policies", () => { + // Helper to create a simple transfer transaction + const createTransferTransaction = async ( + from: string, + to: string, + amount: bigint, + ) => { + const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); + const signer = createNoopSigner(address(from)); + + const transferInstruction = getTransferSolInstruction({ + source: signer, + destination: address(to), + amount: lamports(amount), + }); + + const transactionMessage = pipe( + createTransactionMessage({ version: 0 }), + (tx) => setTransactionMessageFeePayer(address(from), tx), + (tx) => + setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), + (tx) => appendTransactionMessageInstruction(transferInstruction, tx), + ); + + const compiledTransaction = compileTransaction(transactionMessage); + return getBase64EncodedWireTransaction(compiledTransaction); + }; + + describe("Program Access Control", () => { + it("should allow transaction with allowed program", async () => { + // System program ID (used for transfers) + const systemProgramId = "11111111111111111111111111111111"; + + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + programs: { + type: "allow", + programs: [systemProgramId], + }, + }, + }, + ], + expiresAt, + metadata: { + name: "Allow System Program Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + }); + + it("should deny transaction with non-allowed program", async () => { + // Only allow a different program (not system program) + const fakeProgramId = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + programs: { + type: "allow", + programs: [fakeProgramId], + }, + }, + }, + ], + expiresAt, + metadata: { + name: "Restricted Program Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(false); + expect(signatureResult.error).toBeTruthy(); + }); + + it("should allow transaction when program is not in deny list", async () => { + // Deny a different program (not system program) + const fakeProgramId = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + programs: { + type: "deny", + programs: [fakeProgramId], + }, + }, + }, + ], + expiresAt, + metadata: { + name: "Deny List Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + }); + + it("should deny transaction when program is in deny list", async () => { + // Deny system program + const systemProgramId = "11111111111111111111111111111111"; + + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + programs: { + type: "deny", + programs: [systemProgramId], + }, + }, + }, + ], + expiresAt, + metadata: { + name: "Deny System Program Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(false); + expect(signatureResult.error).toBeTruthy(); + }); + }); + + describe("Can Pay Fees", () => { + it("should allow fee payment when canPayFees is true", async () => { + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + canPayFees: true, + }, + }, + ], + expiresAt, + metadata: { + name: "Allow Fees Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + }); + + it("should deny fee payment when canPayFees is false", async () => { + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + canPayFees: false, + }, + }, + ], + expiresAt, + metadata: { + name: "No Fees Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(false); + expect(signatureResult.error).toBeTruthy(); + + expect( + typeof signatureResult.error?.details === "object" + ? signatureResult.error?.details.reason + : "", + ).toContain("not authorized to pay transaction fees"); + }); + + it("should allow fee payment by default (no transactionPatterns)", async () => { + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + // No transactionPatterns means default behavior (allow fees) + }, + ], + expiresAt, + metadata: { + name: "Default Behavior Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + }); + }); + + describe("Max Instructions", () => { + it("should allow transaction within instruction limit", async () => { + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + maxInstructions: 5, // Allow up to 5 instructions + }, + }, + ], + expiresAt, + metadata: { + name: "Max 5 Instructions Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + // Create transaction with 1 instruction + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + }); + + it("should deny transaction exceeding instruction limit", async () => { + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + maxInstructions: 0, // No instructions allowed + }, + }, + ], + expiresAt, + metadata: { + name: "Zero Instructions Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + // Create transaction with 1 instruction (exceeds limit of 0) + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(false); + expect(signatureResult.error).toBeTruthy(); + }); + }); + + describe("Combined Transaction Patterns", () => { + it("should enforce multiple patterns together", async () => { + const systemProgramId = "11111111111111111111111111111111"; + + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + programs: { + type: "allow", + programs: [systemProgramId], + }, + maxInstructions: 5, + canPayFees: true, + }, + }, + ], + expiresAt, + metadata: { + name: "Combined Patterns Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + }); + + it("should fail if any pattern is violated", async () => { + const systemProgramId = "11111111111111111111111111111111"; + + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + programs: { + type: "allow", + programs: [systemProgramId], + }, + maxInstructions: 5, + canPayFees: false, // This will cause failure + }, + }, + ], + expiresAt, + metadata: { + name: "Combined Patterns (Violation) Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(false); + expect(signatureResult.error).toBeTruthy(); + }); + }); + + describe("Writable Accounts Access Control", () => { + it("should allow transaction with allowed writable account", async () => { + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + writableAccounts: { + type: "allow", + accounts: [senderPubkey, receiverPubkey], + }, + }, + }, + ], + expiresAt, + metadata: { + name: "Allow Writable Accounts Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + }); + + it("should deny transaction with non-allowed writable account", async () => { + // Only allow sender to be writable, not receiver + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + writableAccounts: { + type: "allow", + accounts: [senderPubkey], // Only sender, not receiver + }, + }, + }, + ], + expiresAt, + metadata: { + name: "Restricted Writable Accounts Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(false); + expect(signatureResult.error).toBeTruthy(); + }); + + it("should allow transaction when writable account is not in deny list", async () => { + // Deny a different account (not sender or receiver) + const fakeAccount = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; + + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + writableAccounts: { + type: "deny", + accounts: [fakeAccount], + }, + }, + }, + ], + expiresAt, + metadata: { + name: "Deny List Writable Accounts Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + }); + + it("should deny transaction when writable account is in deny list", async () => { + // Deny receiver as writable + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + writableAccounts: { + type: "deny", + accounts: [receiverPubkey], + }, + }, + }, + ], + expiresAt, + metadata: { + name: "Deny Receiver Writable Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(false); + expect(signatureResult.error).toBeTruthy(); + }); + }); + + describe("Required Cosigners", () => { + it("should allow transaction without cosigners when none required", async () => { + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + requiredCosigners: [], // No cosigners required + }, + }, + ], + expiresAt, + metadata: { + name: "No Cosigners Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + }); + + it("should deny transaction when required cosigner is missing", async () => { + // Require receiver as cosigner (but it won't be in the transaction) + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + requiredCosigners: [receiverPubkey], + }, + }, + ], + expiresAt, + metadata: { + name: "Required Cosigner Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(false); + expect(signatureResult.error).toBeTruthy(); + }); + + it("should deny transaction when multiple required cosigners are missing", async () => { + // Require multiple cosigners that won't be in the transaction + const fakeCosigner1 = "CosignerAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; + const fakeCosigner2 = "CosignerBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"; + + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + transactionPatterns: { + requiredCosigners: [fakeCosigner1, fakeCosigner2], + }, + }, + ], + expiresAt, + metadata: { + name: "Multiple Cosigners Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(false); + expect(signatureResult.error).toBeTruthy(); + }); + + it("should allow transaction by default when no cosigners specified", async () => { + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], + // No requiredCosigners field means any transaction is allowed + }, + ], + expiresAt, + metadata: { + name: "Default Cosigners Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + }); + }); + + describe("Allowlist", () => { + it("should allow signing from account in allowlist", async () => { + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [senderPubkey], // Explicitly allow sender + }, + ], + expiresAt, + metadata: { + name: "Allowlist Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(true); + expect(signatureResult.data?.signature).toBeTruthy(); + }); + + it("should deny signing from account not in allowlist", async () => { + // Create allowlist with only receiver (not sender) + const expiresAt = new Date(Date.now() + 3600000).toISOString(); + const accessTokenResult = await createAccessToken({ + client: vaultClient, + request: { + auth: { adminKey }, + options: { + policies: [ + { + type: "solana:signTransaction", + allowlist: [receiverPubkey], // Only allow receiver, not sender + }, + ], + expiresAt, + metadata: { + name: "Restricted Allowlist Token", + }, + }, + }, + }); + + expect(accessTokenResult.success).toBe(true); + const accessToken = accessTokenResult.data?.accessToken || ""; + + const base64Transaction = await createTransferTransaction( + senderPubkey, + receiverPubkey, + 1n, + ); + + const signatureResult = await signSolanaTransaction({ + client: vaultClient, + request: { + auth: { accessToken }, + options: { + transaction: base64Transaction, + from: senderPubkey, + }, + }, + }); + + expect(signatureResult.success).toBe(false); + expect(signatureResult.error).toBeTruthy(); + }); + }); + }); +}); diff --git a/packages/vault-sdk/vitest.config.ts b/packages/vault-sdk/vitest.config.ts new file mode 100644 index 00000000000..58f6496a323 --- /dev/null +++ b/packages/vault-sdk/vitest.config.ts @@ -0,0 +1,17 @@ +import { join } from "node:path"; +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + globals: true, + environment: "node", + testTimeout: 60000, // 60 seconds default timeout + hookTimeout: 60000, // 60 seconds for beforeAll/afterAll + teardownTimeout: 10000, + sequence: { + shuffle: false, // Run tests in order + }, + // load .env.test + setupFiles: [join(__dirname, "./tests/env-setup.ts")], + }, +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee7594c79aa..ce60bbea88e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1444,7 +1444,7 @@ importers: version: 2.37.9(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.75) x402: specifier: 0.6.1 - version: 0.6.1(@react-native-async-storage/async-storage@2.2.0(react-native@0.78.1(@babel/core@7.28.4)(@babel/preset-env@7.28.0(@babel/core@7.28.4))(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.81.5(react@19.1.0))(@types/react@19.1.8)(aws4fetch@1.0.20)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.6.1)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + version: 0.6.1(@react-native-async-storage/async-storage@2.2.0(react-native@0.78.1(@babel/core@7.28.4)(@babel/preset-env@7.28.0(@babel/core@7.28.4))(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.81.5(react@19.1.0))(@types/react@19.1.8)(aws4fetch@1.0.20)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.6.1)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) zod: specifier: 3.25.75 version: 3.25.75 @@ -1714,6 +1714,21 @@ importers: '@noble/hashes': specifier: 1.7.2 version: 1.7.2 + '@solana/addresses': + specifier: ^3.0.0 + version: 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/keys': + specifier: ^3.0.0 + version: 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/kit': + specifier: ^4.0.0 + version: 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@solana/rpc': + specifier: ^3.0.0 + version: 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transactions': + specifier: ^3.0.0 + version: 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) abitype: specifier: 1.0.8 version: 1.0.8(typescript@5.8.3)(zod@3.25.76) @@ -1727,9 +1742,18 @@ importers: '@biomejs/biome': specifier: 2.0.6 version: 2.0.6 + '@solana-program/system': + specifier: ^0.8.1 + version: 0.8.1(@solana/kit@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))) + bs58: + specifier: ^6.0.0 + version: 6.0.0 rimraf: specifier: 6.0.1 version: 6.0.1 + vitest: + specifier: 3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.0.10)(typescript@5.8.3))(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) packages/wagmi-adapter: dependencies: @@ -6518,6 +6542,11 @@ packages: peerDependencies: '@solana/kit': ^2.1.0 + '@solana-program/system@0.8.1': + resolution: {integrity: sha512-71U9Mzdpw8HQtfgfJSL5xKZbLMRnza2Llsfk7gGnmg2waqK+o8MMH4YNma8xXS1UmOBptXIiNvoZ3p7cmOVktg==} + peerDependencies: + '@solana/kit': ^3.0 + '@solana-program/token-2022@0.4.2': resolution: {integrity: sha512-zIpR5t4s9qEU3hZKupzIBxJ6nUV5/UVyIT400tu9vT1HMs5JHxaTTsb5GUhYjiiTvNwU0MQavbwc4Dl29L0Xvw==} peerDependencies: @@ -6535,18 +6564,48 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/accounts@4.0.0': + resolution: {integrity: sha512-fxTtTk7PCJrigdzqhkc0eZYACVZpONKJZy4MkGvZzx5tCC7rUeDJvzau3IYACUCRaaAGPpkINHwYtp8weKsn8w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/addresses@2.3.0': resolution: {integrity: sha512-ypTNkY2ZaRFpHLnHAgaW8a83N0/WoqdFvCqf4CQmnMdFsZSdC7qOwcbd7YzdaQn9dy+P2hybewzB+KP7LutxGA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/addresses@3.0.3': + resolution: {integrity: sha512-AuMwKhJI89ANqiuJ/fawcwxNKkSeHH9CApZd2xelQQLS7X8uxAOovpcmEgiObQuiVP944s9ScGUT62Bdul9qYg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/addresses@4.0.0': + resolution: {integrity: sha512-1OS4nU0HFZxHRxgUb6A72Qg0QbIz6Vu2AbB0j/YSxN4EI+S2BftA83Y6uXhTFDQjKuA+MtHjxe6edB3cs1Pqxw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/assertions@2.3.0': resolution: {integrity: sha512-Ekoet3khNg3XFLN7MIz8W31wPQISpKUGDGTylLptI+JjCDWx3PIa88xjEMqFo02WJ8sBj2NLV64Xg1sBcsHjZQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/assertions@3.0.3': + resolution: {integrity: sha512-2qspxdbWp2y62dfCIlqeWQr4g+hE8FYSSwcaP6itwMwGRb8393yDGCJfI/znuzJh6m/XVWhMHIgFgsBwnevCmg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/assertions@4.0.0': + resolution: {integrity: sha512-QwtImPVM5JLEWOFpvHh+eKdvmxdNP6PW8FkmFFEVYR6VFDaZD/hbmSJlwt5p3L69sVmxJA0ughYgD/kkHM7fbg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/buffer-layout-utils@0.2.0': resolution: {integrity: sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==} engines: {node: '>= 10'} @@ -6566,6 +6625,18 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/codecs-core@3.0.3': + resolution: {integrity: sha512-emKykJ3h1DmnDOY29Uv9eJXP8E/FHzvlUBJ6te+5EbKdFjj7vdlKYPfDxOI6iGdXTY+YC/ELtbNBh6QwF2uEDQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-core@4.0.0': + resolution: {integrity: sha512-28kNUsyIlhU3MO3/7ZLDqeJf2YAm32B4tnTjl5A9HrbBqsTZ+upT/RzxZGP1MMm7jnPuIKCMwmTpsyqyR6IUpw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/codecs-data-structures@2.0.0-rc.1': resolution: {integrity: sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog==} peerDependencies: @@ -6577,6 +6648,18 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/codecs-data-structures@3.0.3': + resolution: {integrity: sha512-R15cLp8riJvToXziW8lP6AMSwsztGhEnwgyGmll32Mo0Yjq+hduW2/fJrA/TJs6tA/OgTzMQjlxgk009EqZHCw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-data-structures@4.0.0': + resolution: {integrity: sha512-pvh+Oxz6UIbWxcgwvVwMJIV4nvZn3EHL5ZvCIPClE5Ep8K5sJ8RoRvOohqLcIv9LYn/EZNoXpCodREX/OYpsGw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/codecs-numbers@2.0.0-rc.1': resolution: {integrity: sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ==} peerDependencies: @@ -6588,6 +6671,18 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/codecs-numbers@3.0.3': + resolution: {integrity: sha512-pfXkH9J0glrM8qj6389GAn30+cJOxzXLR2FsPOHCUMXrqLhGjMMZAWhsQkpOQ37SGc/7EiQsT/gmyGC7gxHqJQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@4.0.0': + resolution: {integrity: sha512-z9zpjtcwzqT9rbkKVZpkWB5/0V7+6YRKs6BccHkGJlaDx8Pe/+XOvPi2rEdXPqrPd9QWb5Xp1iBfcgaDMyiOiA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/codecs-strings@2.0.0-rc.1': resolution: {integrity: sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g==} peerDependencies: @@ -6601,6 +6696,20 @@ packages: fastestsmallesttextencoderdecoder: ^1.0.22 typescript: '>=5.3.3' + '@solana/codecs-strings@3.0.3': + resolution: {integrity: sha512-VHBXnnTVtcQ1j+7Vrz+qSYo38no+jiHRdGnhFspRXEHNJbllzwKqgBE7YN3qoIXH+MKxgJUcwO5KHmdzf8Wn2A==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.3.3' + + '@solana/codecs-strings@4.0.0': + resolution: {integrity: sha512-XvyD+sQ1zyA0amfxbpoFZsucLoe+yASQtDiLUGMDg5TZ82IHE3B7n82jE8d8cTAqi0HgqQiwU13snPhvg1O0Ow==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.3.3' + '@solana/codecs@2.0.0-rc.1': resolution: {integrity: sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ==} peerDependencies: @@ -6612,6 +6721,12 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/codecs@4.0.0': + resolution: {integrity: sha512-qh+Le1u9QBDPubqUrFU5BGX3Kyj7x0viO6z2SUuM0CSqYUvwE7w724LXwDA9QoEL5JkED1rB3bQg4M0bDrABpA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/errors@2.0.0-rc.1': resolution: {integrity: sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ==} hasBin: true @@ -6625,42 +6740,128 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/errors@3.0.3': + resolution: {integrity: sha512-1l84xJlHNva6io62PcYfUamwWlc0eM95nHgCrKX0g0cLoC6D6QHYPCEbEVkR+C5UtP9JDgyQM8MFiv+Ei5tO9Q==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/errors@4.0.0': + resolution: {integrity: sha512-3YEtvcMvtcnTl4HahqLt0VnaGVf7vVWOnt6/uPky5e0qV6BlxDSbGkbBzttNjxLXHognV0AQi3pjvrtfUnZmbg==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + '@solana/fast-stable-stringify@2.3.0': resolution: {integrity: sha512-KfJPrMEieUg6D3hfQACoPy0ukrAV8Kio883llt/8chPEG3FVTX9z/Zuf4O01a15xZmBbmQ7toil2Dp0sxMJSxw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/fast-stable-stringify@3.0.3': + resolution: {integrity: sha512-ED0pxB6lSEYvg+vOd5hcuQrgzEDnOrURFgp1ZOY+lQhJkQU6xo+P829NcJZQVP1rdU2/YQPAKJKEseyfe9VMIw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/fast-stable-stringify@4.0.0': + resolution: {integrity: sha512-sNJRi0RQ93vkGQ9VyFTSGm6mfKLk0FWOFpJLcqyP0BNUK1CugBaUMnxAmGqNaVSCktJagTSLqAMi9k1VSdh+Cg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/functional@2.3.0': resolution: {integrity: sha512-AgsPh3W3tE+nK3eEw/W9qiSfTGwLYEvl0rWaxHht/lRcuDVwfKRzeSa5G79eioWFFqr+pTtoCr3D3OLkwKz02Q==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/functional@3.0.3': + resolution: {integrity: sha512-2qX1kKANn8995vOOh5S9AmF4ItGZcfbny0w28Eqy8AFh+GMnSDN4gqpmV2LvxBI9HibXZptGH3RVOMk82h1Mpw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/functional@4.0.0': + resolution: {integrity: sha512-duprxASuT0VXlHj3bLBdy9+ZpqdmCZhzCUmTsXps4UlDKr9PxSCQIQ+NK6OPhtBWOh1sNEcT1f1nY/MVqF/KHg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/instruction-plans@4.0.0': + resolution: {integrity: sha512-FcyptPR5XmKoj1EyF9xARiqy2BuF+CfrIxTU0WQn5Tix/y7whKYz5CCFtBlWbwIcGxQftmG5tAlcidgnCb7jVw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/instructions@2.3.0': resolution: {integrity: sha512-PLMsmaIKu7hEAzyElrk2T7JJx4D+9eRwebhFZpy2PXziNSmFF929eRHKUsKqBFM3cYR1Yy3m6roBZfA+bGE/oQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/instructions@3.0.3': + resolution: {integrity: sha512-4csIi8YUDb5j/J+gDzmYtOvq7ZWLbCxj4t0xKn+fPrBk/FD2pK29KVT3Fu7j4Lh1/ojunQUP9X4NHwUexY3PnA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/instructions@4.0.0': + resolution: {integrity: sha512-/Lf3E+6mhe6EL7a3+9FY020yq71lVNgueplJGr221b4wP6ykwPVtoaAiNf+lIrRRYkW8DC81auhmjd2DYpND1w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/keys@2.3.0': resolution: {integrity: sha512-ZVVdga79pNH+2pVcm6fr2sWz9HTwfopDVhYb0Lh3dh+WBmJjwkabXEIHey2rUES7NjFa/G7sV8lrUn/v8LDCCQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/keys@3.0.3': + resolution: {integrity: sha512-tp8oK9tMadtSIc4vF4aXXWkPd4oU5XPW8nf28NgrGDWGt25fUHIydKjkf2hPtMt9i1WfRyQZ33B5P3dnsNqcPQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/keys@4.0.0': + resolution: {integrity: sha512-aPz+LF9QK3EHjuklYBnnalcLVHUNz5s4m4DXNVGAtjJD7Q9zEu2dBUm9mRKwlLbQibNOEGa1m86HCjcboqXdjg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/kit@2.3.0': resolution: {integrity: sha512-sb6PgwoW2LjE5oTFu4lhlS/cGt/NB3YrShEyx7JgWFWysfgLdJnhwWThgwy/4HjNsmtMrQGWVls0yVBHcMvlMQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/kit@4.0.0': + resolution: {integrity: sha512-5c4qMRL+ciWewEtNZ2gX4wf4VpscZYXbWnU2kBiyQhWiqj8zzFIh6iCHbqMX/Myx3pOHfQs/m/iQCnQHPOag9Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/nominal-types@2.3.0': resolution: {integrity: sha512-uKlMnlP4PWW5UTXlhKM8lcgIaNj8dvd8xO4Y9l+FVvh9RvW2TO0GwUO6JCo7JBzCB0PSqRJdWWaQ8pu1Ti/OkA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/nominal-types@3.0.3': + resolution: {integrity: sha512-aZavCiexeUAoMHRQg4s1AHkH3wscbOb70diyfjhwZVgFz1uUsFez7csPp9tNFkNolnadVb2gky7yBk3IImQJ6A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/nominal-types@4.0.0': + resolution: {integrity: sha512-zIjHZY+5uboigbzsNhHmF3AlP/xACYxbB0Cb1VAI9i+eFShMeu/3VIrj7x1vbq9hfQKGSFHNFGFqQTivdzpbLw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/options@2.0.0-rc.1': resolution: {integrity: sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA==} peerDependencies: @@ -6672,48 +6873,120 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/options@4.0.0': + resolution: {integrity: sha512-QTjBh24a34At66mGfs0lVF1voug1KnA13IZkvcVPr52zFb90+xYiqYeKiICTaf3HkoeoKG+TC2Q0K64+se0+CQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/programs@2.3.0': resolution: {integrity: sha512-UXKujV71VCI5uPs+cFdwxybtHZAIZyQkqDiDnmK+DawtOO9mBn4Nimdb/6RjR2CXT78mzO9ZCZ3qfyX+ydcB7w==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/programs@4.0.0': + resolution: {integrity: sha512-tJCNoKyDKfipGTsQtUO6R9EXk4l4ai+gYuD2R3NubJgMaLPBqIv3IMSCeDSvhuSCDuN2lQ1mLkQrDnE3lm0/iQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/promises@2.3.0': resolution: {integrity: sha512-GjVgutZKXVuojd9rWy1PuLnfcRfqsaCm7InCiZc8bqmJpoghlyluweNc7ml9Y5yQn1P2IOyzh9+p/77vIyNybQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/promises@4.0.0': + resolution: {integrity: sha512-zEh815+n2OrrQunZ6m1iuNcoZRc9YnQaTeivBSgl1SYfPaq/Qj/rRiK5DID25Njo4L44p5quu7aal3Bk/eR+tQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/rpc-api@2.3.0': resolution: {integrity: sha512-UUdiRfWoyYhJL9PPvFeJr4aJ554ob2jXcpn4vKmRVn9ire0sCbpQKYx6K8eEKHZWXKrDW8IDspgTl0gT/aJWVg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/rpc-api@3.0.3': + resolution: {integrity: sha512-Yym9/Ama62OY69rAZgbOCAy1QlqaWAyb0VlqFuwSaZV1pkFCCFSwWEJEsiN1n8pb2ZP+RtwNvmYixvWizx9yvA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-api@4.0.0': + resolution: {integrity: sha512-nfQkTJCIW3qzUDRrhvr9MBm9jKQ+dZn4ypK35UDPrV+QB5Gc9UmPJ6prvpPtDq8WoU7wqUzswKeY3k7qtgYjEg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/rpc-parsed-types@2.3.0': resolution: {integrity: sha512-B5pHzyEIbBJf9KHej+zdr5ZNAdSvu7WLU2lOUPh81KHdHQs6dEb310LGxcpCc7HVE8IEdO20AbckewDiAN6OCg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/rpc-parsed-types@3.0.3': + resolution: {integrity: sha512-/koM05IM2fU91kYDQxXil3VBNlOfcP+gXE0js1sdGz8KonGuLsF61CiKB5xt6u1KEXhRyDdXYLjf63JarL4Ozg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-parsed-types@4.0.0': + resolution: {integrity: sha512-aOjwJwen5D0aDXoSths+ekdBO4mu7nmM+yASqCVW2PLN6v7NZmRBzV1/PgMFjDTiymVQj25ipCUvL395s1wsKg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/rpc-spec-types@2.3.0': resolution: {integrity: sha512-xQsb65lahjr8Wc9dMtP7xa0ZmDS8dOE2ncYjlvfyw/h4mpdXTUdrSMi6RtFwX33/rGuztQ7Hwaid5xLNSLvsFQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/rpc-spec-types@3.0.3': + resolution: {integrity: sha512-A6Jt8SRRetnN3CeGAvGJxigA9zYRslGgWcSjueAZGvPX+MesFxEUjSWZCfl+FogVFvwkqfkgQZQbPAGZQFJQ6Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-spec-types@4.0.0': + resolution: {integrity: sha512-rpFMIaetpubeyDXIlxV08vtmiDt7ME9527kCI61slHj6O2rbj+7fABhmlN6J4YDCcL/kfnMCxZyNna94DovHZA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/rpc-spec@2.3.0': resolution: {integrity: sha512-fA2LMX4BMixCrNB2n6T83AvjZ3oUQTu7qyPLyt8gHQaoEAXs8k6GZmu6iYcr+FboQCjUmRPgMaABbcr9j2J9Sw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/rpc-spec@3.0.3': + resolution: {integrity: sha512-MZn5/8BebB6MQ4Gstw6zyfWsFAZYAyLzMK+AUf/rSfT8tPmWiJ/mcxnxqOXvFup/l6D67U8pyGpIoFqwCeZqqA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-spec@4.0.0': + resolution: {integrity: sha512-9PFTFWjdgA/KFG4rgzbgA7gm9+aRDwsRJgI1aP7n3dGsGzYUp8vNgRQBhogWscEOETkgZNlsi/artLxgvHEHEg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/rpc-subscriptions-api@2.3.0': resolution: {integrity: sha512-9mCjVbum2Hg9KGX3LKsrI5Xs0KX390lS+Z8qB80bxhar6MJPugqIPH8uRgLhCW9GN3JprAfjRNl7our8CPvsPQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/rpc-subscriptions-api@4.0.0': + resolution: {integrity: sha512-6/MzQT9VkcD7Rh8ExoGdbERTSEubA5eI+Q0R9FRuujl/SIy2BsWaNxaBMuZS0DFmKbIHM+m1ptUFdjKAVjGQuw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/rpc-subscriptions-channel-websocket@2.3.0': resolution: {integrity: sha512-2oL6ceFwejIgeWzbNiUHI2tZZnaOxNTSerszcin7wYQwijxtpVgUHiuItM/Y70DQmH9sKhmikQp+dqeGalaJxw==} engines: {node: '>=20.18.0'} @@ -6721,48 +6994,121 @@ packages: typescript: '>=5.3.3' ws: ^8.18.0 + '@solana/rpc-subscriptions-channel-websocket@4.0.0': + resolution: {integrity: sha512-dc4cGfkQJEdkux/CXpItffuytnSU6wktReHEBL+2xaYmF+yGMBeBLzTvkCJ9BbGGfBMf06c5y5QH8X48W5CJdg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + ws: ^8.18.0 + '@solana/rpc-subscriptions-spec@2.3.0': resolution: {integrity: sha512-rdmVcl4PvNKQeA2l8DorIeALCgJEMSu7U8AXJS1PICeb2lQuMeaR+6cs/iowjvIB0lMVjYN2sFf6Q3dJPu6wWg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/rpc-subscriptions-spec@4.0.0': + resolution: {integrity: sha512-2ROfFymoy/TjDAlEPpsmSQAr6LZwG4l/UIhkW7+/VraRu7QPAycuWfSopJnG8D7F3fksICFSeQNwwgBXTN1TWA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/rpc-subscriptions@2.3.0': resolution: {integrity: sha512-Uyr10nZKGVzvCOqwCZgwYrzuoDyUdwtgQRefh13pXIrdo4wYjVmoLykH49Omt6abwStB0a4UL5gX9V4mFdDJZg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/rpc-subscriptions@4.0.0': + resolution: {integrity: sha512-rM+R4Xpsym0tYF3sGAEpdY+D+c6fOMk/fhCEewR+veqdubRfvI5QEhq4kHs8qdKKuRbcpGmedPC306H+PQ6Hmg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/rpc-transformers@2.3.0': resolution: {integrity: sha512-UuHYK3XEpo9nMXdjyGKkPCOr7WsZsxs7zLYDO1A5ELH3P3JoehvrDegYRAGzBS2VKsfApZ86ZpJToP0K3PhmMA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/rpc-transformers@3.0.3': + resolution: {integrity: sha512-lzdaZM/dG3s19Tsk4mkJA5JBoS1eX9DnD7z62gkDwrwJDkDBzkAJT9aLcsYFfTmwTfIp6uU2UPgGYc97i1wezw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-transformers@4.0.0': + resolution: {integrity: sha512-3B3C9zpqN2O76CJV9tethtybMFdT2ViN5b2u8sObftGNFqxPmjt7XmbOmPdn7zwLyRM5S2RuZShzfcVJpBf+yQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/rpc-transport-http@2.3.0': resolution: {integrity: sha512-HFKydmxGw8nAF5N+S0NLnPBDCe5oMDtI2RAmW8DMqP4U3Zxt2XWhvV1SNkAldT5tF0U1vP+is6fHxyhk4xqEvg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/rpc-transport-http@3.0.3': + resolution: {integrity: sha512-bIXFwr2LR5A97Z46dI661MJPbHnPfcShBjFzOS/8Rnr8P4ho3j/9EUtjDrsqoxGJT3SLWj5OlyXAlaDAvVTOUQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-transport-http@4.0.0': + resolution: {integrity: sha512-RjXcQehF3wHm8eoIala+MrdmS3mDSPRl+xwEWzmA1QmBdQl44/XTNOdPJvNkqWXrzE+bAsZGfn0gVua/oCC+zQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/rpc-types@2.3.0': resolution: {integrity: sha512-O09YX2hED2QUyGxrMOxQ9GzH1LlEwwZWu69QbL4oYmIf6P5dzEEHcqRY6L1LsDVqc/dzAdEs/E1FaPrcIaIIPw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/rpc-types@3.0.3': + resolution: {integrity: sha512-petWQ5xSny9UfmC3Qp2owyhNU0w9SyBww4+v7tSVyXMcCC9v6j/XsqTeimH1S0qQUllnv0/FY83ohFaxofmZ6Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-types@4.0.0': + resolution: {integrity: sha512-mY4W6DQVaLf3M8hSSzIEtaRsVgLg9zv5qdjjYvxkALw0fzjkLW55h3ctGbJ/k+dNpYm9gcKg7zatA7eBNnNmtQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/rpc@2.3.0': resolution: {integrity: sha512-ZWN76iNQAOCpYC7yKfb3UNLIMZf603JckLKOOLTHuy9MZnTN8XV6uwvDFhf42XvhglgUjGCEnbUqWtxQ9pa/pQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/rpc@3.0.3': + resolution: {integrity: sha512-3oukAaLK78GegkKcm6iNmRnO4mFeNz+BMvA8T56oizoBNKiRVEq/6DFzVX/LkmZ+wvD601pAB3uCdrTPcC0YKQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc@4.0.0': + resolution: {integrity: sha512-KF91ghi7P48aeWd4eSY5Fly/ioYz9ww2loQd/YqV3eLQwo3/2HUWd6r6lpSHsLh/HUoUkm+EsYmVN8r/3mE5fg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/signers@2.3.0': resolution: {integrity: sha512-OSv6fGr/MFRx6J+ZChQMRqKNPGGmdjkqarKkRzkwmv7v8quWsIRnJT5EV8tBy3LI4DLO/A8vKiNSPzvm1TdaiQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/signers@4.0.0': + resolution: {integrity: sha512-r3ZrltruadsQXmx3fsGOSqAZ3SsgD7zq/QB8sT6IOVcg11Pgdvx48/CEv7djdy44wF4HVpqNCZLfi12EhoaSXQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/spl-token-group@0.0.7': resolution: {integrity: sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug==} engines: {node: '>=16'} @@ -6787,30 +7133,72 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/subscribable@4.0.0': + resolution: {integrity: sha512-lDI4HkDuGkmdnX7hSgvJsFFadkQxt0pLHIpZTxOt7/6KBDtNs63NTwJGd3d/EuA7ReXwYg5HDG0QtOm64divXQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/sysvars@2.3.0': resolution: {integrity: sha512-LvjADZrpZ+CnhlHqfI5cmsRzX9Rpyb1Ox2dMHnbsRNzeKAMhu9w4ZBIaeTdO322zsTr509G1B+k2ABD3whvUBA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/sysvars@4.0.0': + resolution: {integrity: sha512-HUu2B8P7iRYWAt1KL/5a6nNTKp73y04cSxZ9PZf2Ap1/KE0/5D8WnkEfnurUQmU3zBner95d+szNOyWMNBOoTw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/transaction-confirmation@2.3.0': resolution: {integrity: sha512-UiEuiHCfAAZEKdfne/XljFNJbsKAe701UQHKXEInYzIgBjRbvaeYZlBmkkqtxwcasgBTOmEaEKT44J14N9VZDw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/transaction-confirmation@4.0.0': + resolution: {integrity: sha512-DTBIMB5/UCOpVyL5E0xwswtxs/PGeSD1VL5+C1UCPlggpZNIOlhZoaQqFO56wrJDFASzPMx+dakda5BUuhQkBg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/transaction-messages@2.3.0': resolution: {integrity: sha512-bgqvWuy3MqKS5JdNLH649q+ngiyOu5rGS3DizSnWwYUd76RxZl1kN6CoqHSrrMzFMvis6sck/yPGG3wqrMlAww==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/transaction-messages@3.0.3': + resolution: {integrity: sha512-s+6NWRnBhnnjFWV4x2tzBzoWa6e5LiIxIvJlWwVQBFkc8fMGY04w7jkFh0PM08t/QFKeXBEWkyBDa/TFYdkWug==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/transaction-messages@4.0.0': + resolution: {integrity: sha512-rQo0rRyvkrROFZHUT0uL3vqeBBtxTsNKDtx8pZo6BC3TgGA7V1MoSC3rVOLwYCK6rK5NJZiYNjmneHz/7hVpwQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/transactions@2.3.0': resolution: {integrity: sha512-LnTvdi8QnrQtuEZor5Msje61sDpPstTVwKg4y81tNxDhiyomjuvnSNLAq6QsB9gIxUqbNzPZgOG9IU4I4/Uaug==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/transactions@3.0.3': + resolution: {integrity: sha512-iMX+n9j4ON7H1nKlWEbMqMOpKYC6yVGxKKmWHT1KdLRG7v+03I4DnDeFoI+Zmw56FA+7Bbne8jwwX60Q1vk/MQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/transactions@4.0.0': + resolution: {integrity: sha512-bmHIIVTQq+Wlqg4es91Ew4KSbOrvdfPsKg/pVha8ZR77huwvfqQMxRyYF4zMQ+Fm3QXGFKOU0RPVKKYic15jBw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + '@solana/wallet-adapter-base@0.9.23': resolution: {integrity: sha512-apqMuYwFp1jFi55NxDfvXUX2x1T0Zh07MxhZ/nCCTGys5raSfYUh82zen2BLv8BSDj/JxZ2P/s7jrQZGrX8uAw==} engines: {node: '>=16'} @@ -8978,6 +9366,10 @@ packages: resolution: {integrity: sha512-1tm8DTaJhPBG3bIkVeZt1iZM9GfSX2lzOeDVZH9R9ffRHpmHvxZ/QhgQH/aDTkswQVt+YHdXAdS/In/30OjCbg==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@5.4.4: resolution: {integrity: sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==} @@ -9221,6 +9613,10 @@ packages: resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} engines: {node: '>=20'} + commander@14.0.1: + resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + engines: {node: '>=20'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -21118,6 +21514,14 @@ snapshots: '@types/node': 22.14.1 optional: true + '@inquirer/confirm@5.1.14(@types/node@24.0.10)': + dependencies: + '@inquirer/core': 10.1.15(@types/node@24.0.10) + '@inquirer/type': 3.0.8(@types/node@24.0.10) + optionalDependencies: + '@types/node': 24.0.10 + optional: true + '@inquirer/core@10.1.14(@types/node@22.14.1)': dependencies: '@inquirer/figures': 1.0.12 @@ -21158,6 +21562,20 @@ snapshots: '@types/node': 22.14.1 optional: true + '@inquirer/core@10.1.15(@types/node@24.0.10)': + dependencies: + '@inquirer/figures': 1.0.13 + '@inquirer/type': 3.0.8(@types/node@24.0.10) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + optionalDependencies: + '@types/node': 24.0.10 + optional: true + '@inquirer/editor@4.2.13(@types/node@22.14.1)': dependencies: '@inquirer/core': 10.1.14(@types/node@22.14.1) @@ -21256,6 +21674,11 @@ snapshots: '@types/node': 22.14.1 optional: true + '@inquirer/type@3.0.8(@types/node@24.0.10)': + optionalDependencies: + '@types/node': 24.0.10 + optional: true + '@internationalized/date@3.9.0': dependencies: '@swc/helpers': 0.5.17 @@ -24494,7 +24917,7 @@ snapshots: estree-walker: 2.0.2 fdir: 6.4.6(picomatch@4.0.2) is-reference: 1.2.1 - magic-string: 0.30.17 + magic-string: 0.30.18 picomatch: 4.0.2 optionalDependencies: rollup: 4.35.0 @@ -24854,7 +25277,7 @@ snapshots: dependencies: '@phosphor-icons/core': 2.1.1 '@types/node': 22.14.1 - chalk: 5.5.0 + chalk: 5.6.2 vue: 3.5.21(typescript@5.8.3) transitivePeerDependencies: - typescript @@ -25924,10 +26347,14 @@ snapshots: dependencies: '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana-program/token-2022@0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3))': + '@solana-program/system@0.8.1(@solana/kit@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)))': + dependencies: + '@solana/kit': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + + '@solana-program/token-2022@0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@solana/sysvars@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3))': dependencies: '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) - '@solana/sysvars': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/sysvars': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) '@solana-program/token@0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': dependencies: @@ -25945,6 +26372,18 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/accounts@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/rpc-spec': 4.0.0(typescript@5.8.3) + '@solana/rpc-types': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/addresses@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/assertions': 2.3.0(typescript@5.8.3) @@ -25956,11 +26395,43 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/addresses@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/assertions': 3.0.3(typescript@5.8.3) + '@solana/codecs-core': 3.0.3(typescript@5.8.3) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 3.0.3(typescript@5.8.3) + '@solana/nominal-types': 3.0.3(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/assertions': 4.0.0(typescript@5.8.3) + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/nominal-types': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/assertions@2.3.0(typescript@5.8.3)': dependencies: '@solana/errors': 2.3.0(typescript@5.8.3) typescript: 5.8.3 + '@solana/assertions@3.0.3(typescript@5.8.3)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/assertions@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + '@solana/buffer-layout-utils@0.2.0(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10)': dependencies: '@solana/buffer-layout': 4.0.1 @@ -25989,6 +26460,16 @@ snapshots: '@solana/errors': 2.3.0(typescript@5.8.3) typescript: 5.8.3 + '@solana/codecs-core@3.0.3(typescript@5.8.3)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/codecs-core@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + '@solana/codecs-data-structures@2.0.0-rc.1(typescript@5.8.3)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@5.8.3) @@ -26004,6 +26485,20 @@ snapshots: '@solana/errors': 2.3.0(typescript@5.8.3) typescript: 5.8.3 + '@solana/codecs-data-structures@3.0.3(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.8.3) + '@solana/codecs-numbers': 3.0.3(typescript@5.8.3) + '@solana/errors': 3.0.3(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/codecs-data-structures@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-numbers': 4.0.0(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + '@solana/codecs-numbers@2.0.0-rc.1(typescript@5.8.3)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@5.8.3) @@ -26017,6 +26512,18 @@ snapshots: '@solana/errors': 2.3.0(typescript@5.8.3) typescript: 5.8.3 + '@solana/codecs-numbers@3.0.3(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.8.3) + '@solana/errors': 3.0.3(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/codecs-numbers@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + '@solana/codecs-strings@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@5.8.3) @@ -26034,6 +26541,22 @@ snapshots: fastestsmallesttextencoderdecoder: 1.0.22 typescript: 5.8.3 + '@solana/codecs-strings@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.8.3) + '@solana/codecs-numbers': 3.0.3(typescript@5.8.3) + '@solana/errors': 3.0.3(typescript@5.8.3) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.8.3 + + '@solana/codecs-strings@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-numbers': 4.0.0(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.8.3 + '@solana/codecs@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@5.8.3) @@ -26057,33 +26580,95 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/codecs@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-data-structures': 4.0.0(typescript@5.8.3) + '@solana/codecs-numbers': 4.0.0(typescript@5.8.3) + '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/options': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/errors@2.0.0-rc.1(typescript@5.8.3)': dependencies: - chalk: 5.5.0 + chalk: 5.6.2 commander: 12.1.0 typescript: 5.8.3 optional: true '@solana/errors@2.3.0(typescript@5.8.3)': dependencies: - chalk: 5.5.0 + chalk: 5.6.2 + commander: 14.0.0 + typescript: 5.8.3 + + '@solana/errors@3.0.3(typescript@5.8.3)': + dependencies: + chalk: 5.6.2 commander: 14.0.0 typescript: 5.8.3 + '@solana/errors@4.0.0(typescript@5.8.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.1 + typescript: 5.8.3 + '@solana/fast-stable-stringify@2.3.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 + '@solana/fast-stable-stringify@3.0.3(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@solana/fast-stable-stringify@4.0.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + '@solana/functional@2.3.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 + '@solana/functional@3.0.3(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@solana/functional@4.0.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@solana/instruction-plans@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/instructions': 4.0.0(typescript@5.8.3) + '@solana/promises': 4.0.0(typescript@5.8.3) + '@solana/transaction-messages': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transactions': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/instructions@2.3.0(typescript@5.8.3)': dependencies: '@solana/codecs-core': 2.3.0(typescript@5.8.3) '@solana/errors': 2.3.0(typescript@5.8.3) typescript: 5.8.3 + '@solana/instructions@3.0.3(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.8.3) + '@solana/errors': 3.0.3(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/instructions@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + '@solana/keys@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/assertions': 2.3.0(typescript@5.8.3) @@ -26095,6 +26680,28 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/keys@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/assertions': 3.0.3(typescript@5.8.3) + '@solana/codecs-core': 3.0.3(typescript@5.8.3) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 3.0.3(typescript@5.8.3) + '@solana/nominal-types': 3.0.3(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/keys@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/assertions': 4.0.0(typescript@5.8.3) + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/nominal-types': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/accounts': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) @@ -26120,10 +26727,44 @@ snapshots: - fastestsmallesttextencoderdecoder - ws + '@solana/kit@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + dependencies: + '@solana/accounts': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/addresses': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/functional': 4.0.0(typescript@5.8.3) + '@solana/instruction-plans': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/instructions': 4.0.0(typescript@5.8.3) + '@solana/keys': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/programs': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-parsed-types': 4.0.0(typescript@5.8.3) + '@solana/rpc-spec-types': 4.0.0(typescript@5.8.3) + '@solana/rpc-subscriptions': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@solana/rpc-types': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/signers': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/sysvars': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transaction-confirmation': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@solana/transaction-messages': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transactions': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + '@solana/nominal-types@2.3.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 + '@solana/nominal-types@3.0.3(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@solana/nominal-types@4.0.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + '@solana/options@2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/codecs-core': 2.0.0-rc.1(typescript@5.8.3) @@ -26147,6 +26788,17 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/options@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-data-structures': 4.0.0(typescript@5.8.3) + '@solana/codecs-numbers': 4.0.0(typescript@5.8.3) + '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/programs@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) @@ -26155,10 +26807,22 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/programs@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/promises@2.3.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 + '@solana/promises@4.0.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + '@solana/rpc-api@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) @@ -26176,20 +26840,82 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc-api@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs-core': 3.0.3(typescript@5.8.3) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 3.0.3(typescript@5.8.3) + '@solana/keys': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-parsed-types': 3.0.3(typescript@5.8.3) + '@solana/rpc-spec': 3.0.3(typescript@5.8.3) + '@solana/rpc-transformers': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transaction-messages': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transactions': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-api@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/keys': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-parsed-types': 4.0.0(typescript@5.8.3) + '@solana/rpc-spec': 4.0.0(typescript@5.8.3) + '@solana/rpc-transformers': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-types': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transaction-messages': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transactions': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/rpc-parsed-types@2.3.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 + '@solana/rpc-parsed-types@3.0.3(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@solana/rpc-parsed-types@4.0.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + '@solana/rpc-spec-types@2.3.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 + '@solana/rpc-spec-types@3.0.3(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@solana/rpc-spec-types@4.0.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + '@solana/rpc-spec@2.3.0(typescript@5.8.3)': dependencies: '@solana/errors': 2.3.0(typescript@5.8.3) '@solana/rpc-spec-types': 2.3.0(typescript@5.8.3) typescript: 5.8.3 + '@solana/rpc-spec@3.0.3(typescript@5.8.3)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.8.3) + '@solana/rpc-spec-types': 3.0.3(typescript@5.8.3) + typescript: 5.8.3 + + '@solana/rpc-spec@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/rpc-spec-types': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + '@solana/rpc-subscriptions-api@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) @@ -26203,6 +26929,19 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc-subscriptions-api@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/keys': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-subscriptions-spec': 4.0.0(typescript@5.8.3) + '@solana/rpc-transformers': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-types': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transaction-messages': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transactions': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/rpc-subscriptions-channel-websocket@2.3.0(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/errors': 2.3.0(typescript@5.8.3) @@ -26212,6 +26951,15 @@ snapshots: typescript: 5.8.3 ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions-channel-websocket@4.0.0(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/functional': 4.0.0(typescript@5.8.3) + '@solana/rpc-subscriptions-spec': 4.0.0(typescript@5.8.3) + '@solana/subscribable': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5) + '@solana/rpc-subscriptions-spec@2.3.0(typescript@5.8.3)': dependencies: '@solana/errors': 2.3.0(typescript@5.8.3) @@ -26220,6 +26968,14 @@ snapshots: '@solana/subscribable': 2.3.0(typescript@5.8.3) typescript: 5.8.3 + '@solana/rpc-subscriptions-spec@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/promises': 4.0.0(typescript@5.8.3) + '@solana/rpc-spec-types': 4.0.0(typescript@5.8.3) + '@solana/subscribable': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + '@solana/rpc-subscriptions@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/errors': 2.3.0(typescript@5.8.3) @@ -26238,6 +26994,24 @@ snapshots: - fastestsmallesttextencoderdecoder - ws + '@solana/rpc-subscriptions@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/fast-stable-stringify': 4.0.0(typescript@5.8.3) + '@solana/functional': 4.0.0(typescript@5.8.3) + '@solana/promises': 4.0.0(typescript@5.8.3) + '@solana/rpc-spec-types': 4.0.0(typescript@5.8.3) + '@solana/rpc-subscriptions-api': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-subscriptions-channel-websocket': 4.0.0(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@solana/rpc-subscriptions-spec': 4.0.0(typescript@5.8.3) + '@solana/rpc-transformers': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-types': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/subscribable': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + '@solana/rpc-transformers@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/errors': 2.3.0(typescript@5.8.3) @@ -26249,6 +27023,28 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc-transformers@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.8.3) + '@solana/functional': 3.0.3(typescript@5.8.3) + '@solana/nominal-types': 3.0.3(typescript@5.8.3) + '@solana/rpc-spec-types': 3.0.3(typescript@5.8.3) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transformers@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/functional': 4.0.0(typescript@5.8.3) + '@solana/nominal-types': 4.0.0(typescript@5.8.3) + '@solana/rpc-spec-types': 4.0.0(typescript@5.8.3) + '@solana/rpc-types': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/rpc-transport-http@2.3.0(typescript@5.8.3)': dependencies: '@solana/errors': 2.3.0(typescript@5.8.3) @@ -26257,6 +27053,22 @@ snapshots: typescript: 5.8.3 undici-types: 7.16.0 + '@solana/rpc-transport-http@3.0.3(typescript@5.8.3)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.8.3) + '@solana/rpc-spec': 3.0.3(typescript@5.8.3) + '@solana/rpc-spec-types': 3.0.3(typescript@5.8.3) + typescript: 5.8.3 + undici-types: 7.16.0 + + '@solana/rpc-transport-http@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/rpc-spec': 4.0.0(typescript@5.8.3) + '@solana/rpc-spec-types': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + undici-types: 7.16.0 + '@solana/rpc-types@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) @@ -26269,6 +27081,30 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc-types@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs-core': 3.0.3(typescript@5.8.3) + '@solana/codecs-numbers': 3.0.3(typescript@5.8.3) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 3.0.3(typescript@5.8.3) + '@solana/nominal-types': 3.0.3(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-types@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-numbers': 4.0.0(typescript@5.8.3) + '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/nominal-types': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/rpc@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/errors': 2.3.0(typescript@5.8.3) @@ -26284,6 +27120,36 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.8.3) + '@solana/fast-stable-stringify': 3.0.3(typescript@5.8.3) + '@solana/functional': 3.0.3(typescript@5.8.3) + '@solana/rpc-api': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-spec': 3.0.3(typescript@5.8.3) + '@solana/rpc-spec-types': 3.0.3(typescript@5.8.3) + '@solana/rpc-transformers': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-transport-http': 3.0.3(typescript@5.8.3) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/fast-stable-stringify': 4.0.0(typescript@5.8.3) + '@solana/functional': 4.0.0(typescript@5.8.3) + '@solana/rpc-api': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-spec': 4.0.0(typescript@5.8.3) + '@solana/rpc-spec-types': 4.0.0(typescript@5.8.3) + '@solana/rpc-transformers': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-transport-http': 4.0.0(typescript@5.8.3) + '@solana/rpc-types': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/signers@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) @@ -26298,6 +27164,20 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/signers@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/instructions': 4.0.0(typescript@5.8.3) + '@solana/keys': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/nominal-types': 4.0.0(typescript@5.8.3) + '@solana/transaction-messages': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transactions': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/spl-token-group@0.0.7(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/codecs': 2.0.0-rc.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) @@ -26337,6 +27217,11 @@ snapshots: '@solana/errors': 2.3.0(typescript@5.8.3) typescript: 5.8.3 + '@solana/subscribable@4.0.0(typescript@5.8.3)': + dependencies: + '@solana/errors': 4.0.0(typescript@5.8.3) + typescript: 5.8.3 + '@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/accounts': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) @@ -26347,6 +27232,16 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/sysvars@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/accounts': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/rpc-types': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/transaction-confirmation@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) @@ -26364,6 +27259,23 @@ snapshots: - fastestsmallesttextencoderdecoder - ws + '@solana/transaction-confirmation@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5))': + dependencies: + '@solana/addresses': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/keys': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/promises': 4.0.0(typescript@5.8.3) + '@solana/rpc': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/rpc-subscriptions': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@6.0.5)) + '@solana/rpc-types': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transaction-messages': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transactions': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + '@solana/transaction-messages@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) @@ -26379,6 +27291,36 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/transaction-messages@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs-core': 3.0.3(typescript@5.8.3) + '@solana/codecs-data-structures': 3.0.3(typescript@5.8.3) + '@solana/codecs-numbers': 3.0.3(typescript@5.8.3) + '@solana/errors': 3.0.3(typescript@5.8.3) + '@solana/functional': 3.0.3(typescript@5.8.3) + '@solana/instructions': 3.0.3(typescript@5.8.3) + '@solana/nominal-types': 3.0.3(typescript@5.8.3) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-messages@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-data-structures': 4.0.0(typescript@5.8.3) + '@solana/codecs-numbers': 4.0.0(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/functional': 4.0.0(typescript@5.8.3) + '@solana/instructions': 4.0.0(typescript@5.8.3) + '@solana/nominal-types': 4.0.0(typescript@5.8.3) + '@solana/rpc-types': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/transactions@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': dependencies: '@solana/addresses': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) @@ -26397,6 +27339,42 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/transactions@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs-core': 3.0.3(typescript@5.8.3) + '@solana/codecs-data-structures': 3.0.3(typescript@5.8.3) + '@solana/codecs-numbers': 3.0.3(typescript@5.8.3) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 3.0.3(typescript@5.8.3) + '@solana/functional': 3.0.3(typescript@5.8.3) + '@solana/instructions': 3.0.3(typescript@5.8.3) + '@solana/keys': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/nominal-types': 3.0.3(typescript@5.8.3) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transaction-messages': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)': + dependencies: + '@solana/addresses': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/codecs-core': 4.0.0(typescript@5.8.3) + '@solana/codecs-data-structures': 4.0.0(typescript@5.8.3) + '@solana/codecs-numbers': 4.0.0(typescript@5.8.3) + '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/errors': 4.0.0(typescript@5.8.3) + '@solana/functional': 4.0.0(typescript@5.8.3) + '@solana/instructions': 4.0.0(typescript@5.8.3) + '@solana/keys': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/nominal-types': 4.0.0(typescript@5.8.3) + '@solana/rpc-types': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + '@solana/transaction-messages': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/wallet-adapter-base@0.9.23(@solana/web3.js@1.98.2(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.8.3)(utf-8-validate@5.0.10))': dependencies: '@solana/wallet-standard-features': 1.3.0 @@ -28038,16 +29016,25 @@ snapshots: dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.18 optionalDependencies: msw: 2.10.2(@types/node@22.14.1)(typescript@5.8.3) vite: 7.0.1(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + '@vitest/mocker@3.2.4(msw@2.10.2(@types/node@24.0.10)(typescript@5.8.3))(vite@7.0.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': + dependencies: + '@vitest/spy': 3.2.4 + estree-walker: 3.0.3 + magic-string: 0.30.18 + optionalDependencies: + msw: 2.10.2(@types/node@24.0.10)(typescript@5.8.3) + vite: 7.0.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + '@vitest/mocker@3.2.4(msw@2.7.5(@types/node@24.0.10)(typescript@5.8.3))(vite@7.0.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.18 optionalDependencies: msw: 2.7.5(@types/node@24.0.10)(typescript@5.8.3) vite: 7.0.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) @@ -28065,7 +29052,7 @@ snapshots: '@vitest/snapshot@3.2.4': dependencies: '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 + magic-string: 0.30.18 pathe: 2.0.3 '@vitest/spy@3.2.4': @@ -31293,6 +32280,8 @@ snapshots: chalk@5.5.0: {} + chalk@5.6.2: {} + change-case@5.4.4: {} character-entities-html4@2.1.0: {} @@ -31565,6 +32554,8 @@ snapshots: commander@14.0.0: {} + commander@14.0.1: {} + commander@2.20.3: {} commander@4.1.1: {} @@ -35197,7 +36188,7 @@ snapshots: log-symbols@6.0.0: dependencies: - chalk: 5.4.1 + chalk: 5.5.0 is-unicode-supported: 1.3.0 lokijs@1.5.12: {} @@ -36169,6 +37160,32 @@ snapshots: - '@types/node' optional: true + msw@2.10.2(@types/node@24.0.10)(typescript@5.8.3): + dependencies: + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 5.1.14(@types/node@24.0.10) + '@mswjs/interceptors': 0.39.5 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.6 + graphql: 16.11.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + strict-event-emitter: 0.5.1 + type-fest: 4.41.0 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.8.3 + transitivePeerDependencies: + - '@types/node' + optional: true + msw@2.7.5(@types/node@24.0.10)(typescript@5.8.3): dependencies: '@bundled-es-modules/cookie': 2.0.1 @@ -40499,7 +41516,7 @@ snapshots: chai: 5.2.0 debug: 4.4.1(supports-color@8.1.1) expect-type: 1.2.1 - magic-string: 0.30.17 + magic-string: 0.30.18 pathe: 2.0.3 picomatch: 4.0.2 std-env: 3.9.0 @@ -40543,7 +41560,7 @@ snapshots: chai: 5.2.0 debug: 4.4.1(supports-color@8.1.1) expect-type: 1.2.1 - magic-string: 0.30.17 + magic-string: 0.30.18 pathe: 2.0.3 picomatch: 4.0.2 std-env: 3.9.0 @@ -40574,6 +41591,50 @@ snapshots: - tsx - yaml + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.0.10)(@vitest/ui@3.2.4)(happy-dom@18.0.1)(jiti@2.4.2)(lightningcss@1.30.1)(msw@2.10.2(@types/node@24.0.10)(typescript@5.8.3))(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0): + dependencies: + '@types/chai': 5.2.2 + '@vitest/expect': 3.2.4 + '@vitest/mocker': 3.2.4(msw@2.10.2(@types/node@24.0.10)(typescript@5.8.3))(vite@7.0.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0)) + '@vitest/pretty-format': 3.2.4 + '@vitest/runner': 3.2.4 + '@vitest/snapshot': 3.2.4 + '@vitest/spy': 3.2.4 + '@vitest/utils': 3.2.4 + chai: 5.2.0 + debug: 4.4.1(supports-color@8.1.1) + expect-type: 1.2.1 + magic-string: 0.30.18 + pathe: 2.0.3 + picomatch: 4.0.2 + std-env: 3.9.0 + tinybench: 2.9.0 + tinyexec: 0.3.2 + tinyglobby: 0.2.14 + tinypool: 1.1.1 + tinyrainbow: 2.0.0 + vite: 7.0.1(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.0.10)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.43.1)(tsx@4.20.3)(yaml@2.8.0) + why-is-node-running: 2.3.0 + optionalDependencies: + '@types/debug': 4.1.12 + '@types/node': 24.0.10 + '@vitest/ui': 3.2.4(vitest@3.2.4) + happy-dom: 18.0.1 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vlq@1.0.1: {} vm-browserify@1.1.2: {} @@ -41079,12 +42140,12 @@ snapshots: bufferutil: 4.0.9 utf-8-validate: 6.0.5 - x402@0.6.1(@react-native-async-storage/async-storage@2.2.0(react-native@0.78.1(@babel/core@7.28.4)(@babel/preset-env@7.28.0(@babel/core@7.28.4))(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.81.5(react@19.1.0))(@types/react@19.1.8)(aws4fetch@1.0.20)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.6.1)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + x402@0.6.1(@react-native-async-storage/async-storage@2.2.0(react-native@0.78.1(@babel/core@7.28.4)(@babel/preset-env@7.28.0(@babel/core@7.28.4))(@types/react@19.1.8)(bufferutil@4.0.9)(react@19.1.0)(utf-8-validate@5.0.10)))(@solana/sysvars@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3))(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.81.5(react@19.1.0))(@types/react@19.1.8)(aws4fetch@1.0.20)(bufferutil@4.0.9)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(ioredis@5.6.1)(react@19.1.0)(typescript@5.8.3)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: '@scure/base': 1.2.6 '@solana-program/compute-budget': 0.8.0(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))) '@solana-program/token': 0.5.1(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))) - '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@solana/sysvars@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)) + '@solana-program/token-2022': 0.4.2(@solana/kit@2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@solana/sysvars@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)) '@solana/kit': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@solana/transaction-confirmation': 2.3.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.8.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) viem: 2.37.9(bufferutil@4.0.9)(typescript@5.8.3)(utf-8-validate@5.0.10)(zod@3.25.75)