diff --git a/.github/workflows/publish-sdks.yml b/.github/workflows/publish-sdks.yml index 22800f1..d983372 100644 --- a/.github/workflows/publish-sdks.yml +++ b/.github/workflows/publish-sdks.yml @@ -14,7 +14,7 @@ on: options: - all - connector - - devtools + - connector-debugger permissions: contents: read @@ -66,8 +66,8 @@ jobs: working-directory: packages/connector run: npm publish --access public - - name: Publish @solana/devtools - if: ${{ startsWith(github.ref, 'refs/tags/') || github.event.inputs.package == 'all' || github.event.inputs.package == 'devtools' }} + - name: Publish @solana/connector-debugger + if: ${{ startsWith(github.ref, 'refs/tags/') || github.event.inputs.package == 'all' || github.event.inputs.package == 'connector-debugger' }} working-directory: packages/devtools run: npm publish --access public @@ -95,8 +95,8 @@ jobs: - Version: ${{ github.ref_name }} - Registry: npm - ### @solana/devtools - - Package: `@solana/devtools` + ### @solana/connector-debugger + - Package: `@solana/connector-debugger` - Version: ${{ github.ref_name }} - Registry: npm @@ -104,7 +104,7 @@ jobs: ```bash npm install @solana/connector@${{ github.ref_name }} - npm install @solana/devtools@${{ github.ref_name }} + npm install @solana/connector-debugger@${{ github.ref_name }} ``` draft: false prerelease: ${{ contains(github.ref_name, '-') }} diff --git a/README.md b/README.md index 5054db3..64efb3a 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Production-ready Solana wallet infrastructure. A headless, framework-agnostic wa | Package | Description | | ----------------------------------------- | ---------------------------------------------------------- | | [@solana/connector](./packages/connector) | Core wallet connector with React hooks and headless client | -| [@solana/devtools](./packages/devtools) | Framework-agnostic devtools with transaction tracking | +| [@solana/connector-debugger](./packages/devtools) | Framework-agnostic devtools with transaction tracking | ## Why ConnectorKit? @@ -77,11 +77,11 @@ See the [connector package docs](./packages/connector/README.md) for full API re Framework-agnostic devtools that work with any web framework via the imperative DOM API. ```bash -npm install @solana/devtools +npm install @solana/connector-debugger ``` ```typescript -import { ConnectorDevtools } from '@solana/devtools'; +import { ConnectorDevtools } from '@solana/connector-debugger'; // Create devtools (auto-detects window.__connectorClient from ConnectorProvider) const devtools = new ConnectorDevtools({ @@ -114,7 +114,7 @@ export function DevtoolsLoader() { let devtools: any; let container: HTMLDivElement; - import('@solana/devtools').then(({ ConnectorDevtools }) => { + import('@solana/connector-debugger').then(({ ConnectorDevtools }) => { container = document.createElement('div'); document.body.appendChild(container); devtools = new ConnectorDevtools(); diff --git a/connectorkit/SKILL.md b/connectorkit/SKILL.md index bf41e17..9d2a8bd 100644 --- a/connectorkit/SKILL.md +++ b/connectorkit/SKILL.md @@ -285,7 +285,7 @@ Details (provider configs + protocol types + security) live in `references/remot ### Devtools (Development Only) -ConnectorKit also ships devtools (`@solana/devtools`) that can be dynamically mounted in development. +ConnectorKit also ships devtools (`@solana/connector-debugger`) that can be dynamically mounted in development. ```tsx 'use client'; @@ -299,7 +299,7 @@ export function DevtoolsLoader() { let devtools: { mount: (el: HTMLElement) => void; unmount: () => void } | undefined; let container: HTMLDivElement | undefined; - import('@solana/devtools').then(({ ConnectorDevtools }) => { + import('@solana/connector-debugger').then(({ ConnectorDevtools }) => { container = document.createElement('div'); document.body.appendChild(container); devtools = new ConnectorDevtools({ config: { position: 'bottom-right', theme: 'dark' } }); diff --git a/examples/next-js/app/api/titan/[...path]/route.ts b/examples/next-js/app/api/titan/[...path]/route.ts new file mode 100644 index 0000000..2f674e4 --- /dev/null +++ b/examples/next-js/app/api/titan/[...path]/route.ts @@ -0,0 +1,79 @@ +import { NextRequest, NextResponse } from 'next/server'; + +// Demo endpoints by region +const TITAN_DEMO_URLS: Record = { + us1: 'https://us1.api.demo.titan.exchange', + jp1: 'https://jp1.api.demo.titan.exchange', + de1: 'https://de1.api.demo.titan.exchange', +}; + +/** + * Next.js API route proxy for Titan API. + * Proxies all requests to Titan's API to work around CORS restrictions. + * + * Usage: /api/titan/api/v1/quote/swap?inputMint=...®ion=us1 + * → proxied to https://us1.api.demo.titan.exchange/api/v1/quote/swap?inputMint=... + * + * Environment: + * - TITAN_API_TOKEN: Your Titan API JWT token (required for demo endpoints) + * + * Query params: + * - region: 'us1' | 'jp1' | 'de1' (default: 'us1') - selects Titan endpoint + * - ...all other params forwarded to Titan + */ +export async function GET(request: NextRequest, { params }: { params: Promise<{ path: string[] }> }) { + const { path } = await params; + const titanPath = '/' + path.join('/'); + const searchParams = request.nextUrl.searchParams; + + // Extract region (used for routing, not forwarded) + const region = searchParams.get('region') || 'us1'; + const baseUrl = TITAN_DEMO_URLS[region] || TITAN_DEMO_URLS.us1; + + // Build params to forward (exclude 'region') + const forwardParams = new URLSearchParams(); + searchParams.forEach((value, key) => { + if (key !== 'region') { + forwardParams.set(key, value); + } + }); + + const url = forwardParams.toString() ? `${baseUrl}${titanPath}?${forwardParams}` : `${baseUrl}${titanPath}`; + + try { + // Use server-side token from env, or forward client header as fallback + const authToken = process.env.TITAN_API_TOKEN || request.headers.get('Authorization')?.replace('Bearer ', ''); + const headers: Record = { + Accept: 'application/msgpack', + }; + if (authToken) { + headers['Authorization'] = `Bearer ${authToken}`; + } + + const response = await fetch(url, { headers }); + + if (!response.ok) { + const errorText = await response.text().catch(() => 'Unknown error'); + console.error(`Titan API error (${response.status}) at ${titanPath}:`, errorText); + return new NextResponse('Titan API request failed', { + status: response.status, + headers: { 'Content-Type': 'text/plain' }, + }); + } + + // Return MessagePack binary response as-is + const buffer = await response.arrayBuffer(); + return new NextResponse(buffer, { + status: 200, + headers: { + 'Content-Type': 'application/msgpack', + }, + }); + } catch (error) { + console.error('Titan API proxy error:', error); + return new NextResponse('Titan API request failed', { + status: 500, + headers: { 'Content-Type': 'text/plain' }, + }); + } +} diff --git a/examples/next-js/app/providers.tsx b/examples/next-js/app/providers.tsx index a8a51f8..df91805 100644 --- a/examples/next-js/app/providers.tsx +++ b/examples/next-js/app/providers.tsx @@ -92,7 +92,7 @@ export function Providers({ children }: { children: ReactNode }) { let container: HTMLDivElement | undefined; // Dynamic import to avoid bundling in production - import('@solana/devtools').then(({ ConnectorDevtools }) => { + import('@solana/connector-debugger').then(({ ConnectorDevtools }) => { // Create container for devtools container = document.createElement('div'); container.id = 'connector-devtools-container'; diff --git a/examples/next-js/components/playground/transactions-section.tsx b/examples/next-js/components/playground/transactions-section.tsx index 6f7d18b..0303791 100644 --- a/examples/next-js/components/playground/transactions-section.tsx +++ b/examples/next-js/components/playground/transactions-section.tsx @@ -3,6 +3,9 @@ import { LegacySolTransfer, ModernSolTransfer, + ModernWalletTransfer, + TitanSwap, + titanSwapCode, KitSignerDemo, ChainUtilitiesDemo, ConnectionAbstractionDemo, @@ -257,6 +260,149 @@ export function ModernSolTransfer() { }`, render: () => , }, + { + id: 'modern-wallet-transfer', + name: 'Modern Wallet Transfer', + description: 'Transfer 1 lamport to another wallet using @solana/kit with a kit-compatible signer.', + fileName: 'components/transactions/modern-wallet-transfer.tsx', + code: `'use client'; + +import { useCallback, useMemo } from 'react'; +import { + createSolanaRpc, + pipe, + createTransactionMessage, + setTransactionMessageFeePayerSigner, + setTransactionMessageLifetimeUsingBlockhash, + appendTransactionMessageInstructions, + sendAndConfirmTransactionFactory, + signTransactionMessageWithSigners, + createSolanaRpcSubscriptions, + lamports, + assertIsTransactionWithBlockhashLifetime, + signature as createSignature, + address, + type TransactionSigner, +} from '@solana/kit'; +import { getTransferSolInstruction } from '@solana-program/system'; +import { useKitTransactionSigner, useCluster, useConnectorClient } from '@solana/connector'; +import { PipelineHeaderButton, PipelineVisualization } from '@/components/pipeline'; +import { VisualPipeline } from '@/lib/visual-pipeline'; +import { useExampleCardHeaderActions } from '@/components/playground/example-card-actions'; +import { + getBase58SignatureFromSignedTransaction, + getBase64EncodedWireTransaction, + getWebSocketUrlForRpcUrl, + isRpcProxyUrl, + waitForSignatureConfirmation, +} from './rpc-utils'; + +// Destination wallet address +const DESTINATION_ADDRESS = address('A7Xmq3qqt4uvw3GELHw9HHNFbwZzHDJNtmk6fe2p5b5s'); + +export function ModernWalletTransfer() { + const { signer, ready } = useKitTransactionSigner(); + const { cluster } = useCluster(); + const client = useConnectorClient(); + + const visualPipeline = useMemo( + () => + new VisualPipeline('modern-wallet-transfer', [ + { name: 'Build instruction', type: 'instruction' }, + { name: 'Transfer SOL', type: 'transaction' }, + ]), + [], + ); + + const getExplorerUrl = useCallback( + (sig: string) => { + const clusterSlug = cluster?.id?.replace('solana:', ''); + if (!clusterSlug || clusterSlug === 'mainnet' || clusterSlug === 'mainnet-beta') { + return 'https://explorer.solana.com/tx/' + sig; + } + return 'https://explorer.solana.com/tx/' + sig + '?cluster=' + clusterSlug; + }, + [cluster?.id], + ); + + const executeWalletTransfer = useCallback(async () => { + if (!signer || !client) return; + + const rpcUrl = client.getRpcUrl(); + if (!rpcUrl) throw new Error('No RPC endpoint configured'); + const rpc = createSolanaRpc(rpcUrl); + + let signatureBase58: string | null = null; + + await visualPipeline.execute(async () => { + visualPipeline.setStepState('Build instruction', { type: 'building' }); + visualPipeline.setStepState('Transfer SOL', { type: 'building' }); + + const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); + + // Transfer to another wallet instead of self + const transferInstruction = getTransferSolInstruction({ + source: signer as TransactionSigner, + destination: DESTINATION_ADDRESS, + amount: lamports(1n), + }); + + const transactionMessage = pipe( + createTransactionMessage({ version: 0 }), + tx => setTransactionMessageFeePayerSigner(signer, tx), + tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), + tx => appendTransactionMessageInstructions([transferInstruction], tx), + ); + + visualPipeline.setStepState('Transfer SOL', { type: 'signing' }); + + const signedTransaction = await signTransactionMessageWithSigners(transactionMessage); + signatureBase58 = getBase58SignatureFromSignedTransaction(signedTransaction); + + visualPipeline.setStepState('Build instruction', { type: 'confirmed', signature: signatureBase58, cost: 0 }); + visualPipeline.setStepState('Transfer SOL', { type: 'sending' }); + + assertIsTransactionWithBlockhashLifetime(signedTransaction); + + if (isRpcProxyUrl(rpcUrl)) { + const encodedTransaction = getBase64EncodedWireTransaction(signedTransaction); + await rpc.sendTransaction(encodedTransaction, { encoding: 'base64' }).send(); + await waitForSignatureConfirmation({ + signature: signatureBase58, + commitment: 'confirmed', + getSignatureStatuses: async sig => + await rpc.getSignatureStatuses([createSignature(sig)]).send(), + }); + } else { + const rpcSubscriptions = createSolanaRpcSubscriptions(getWebSocketUrlForRpcUrl(rpcUrl)); + await sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions })(signedTransaction, { + commitment: 'confirmed', + }); + } + + visualPipeline.setStepState('Transfer SOL', { type: 'confirmed', signature: signatureBase58, cost: 0.000005 }); + }); + }, [client, signer, visualPipeline]); + + useExampleCardHeaderActions( + , + ); + + return ( + + ); +}`, + render: () => , + }, + { + id: 'titan-swap', + name: 'Titan Swap (SOL → USDC)', + description: + 'Swap 0.01 SOL for USDC using Titan InstructionPlans and track the transaction(s) in Connector Devtools.', + fileName: 'components/transactions/titan-swap.tsx', + code: titanSwapCode, + render: () => , + }, { id: 'kit-signer', name: 'Kit Signers', diff --git a/examples/next-js/components/transactions/index.ts b/examples/next-js/components/transactions/index.ts index 4a4a3f3..ea0e477 100644 --- a/examples/next-js/components/transactions/index.ts +++ b/examples/next-js/components/transactions/index.ts @@ -1,6 +1,8 @@ export { TransactionDemo } from './transaction-demo'; export { LegacySolTransfer } from './legacy-sol-transfer'; export { ModernSolTransfer } from './modern-sol-transfer'; +export { ModernWalletTransfer } from './modern-wallet-transfer'; +export { TitanSwap, titanSwapCode } from './titan-swap'; export { TransactionForm } from './transaction-form'; export { TransactionResult } from './transaction-result'; export { KitSignerDemo } from './kit-signer-demo'; diff --git a/examples/next-js/components/transactions/legacy-sol-transfer.tsx b/examples/next-js/components/transactions/legacy-sol-transfer.tsx index e1a6cf7..8b5639d 100644 --- a/examples/next-js/components/transactions/legacy-sol-transfer.tsx +++ b/examples/next-js/components/transactions/legacy-sol-transfer.tsx @@ -84,6 +84,9 @@ export function LegacySolTransfer() { visualPipeline.setStepState('Self transfer', { type: 'signing' }); + // Pre-send devtools preview: emit wire bytes so the debugger can simulate before sending. + client.previewTransaction(transaction); + sig = await walletAdapter.sendTransaction(transaction, connection); typedSignature = createSignature(sig); diff --git a/examples/next-js/components/transactions/modern-sol-transfer.tsx b/examples/next-js/components/transactions/modern-sol-transfer.tsx index 6b24b5e..f39e2be 100644 --- a/examples/next-js/components/transactions/modern-sol-transfer.tsx +++ b/examples/next-js/components/transactions/modern-sol-transfer.tsx @@ -104,6 +104,7 @@ export function ModernSolTransfer() { const signedTransaction = await signTransactionMessageWithSigners(transactionMessage); signatureBase58 = getBase58SignatureFromSignedTransaction(signedTransaction); + const wireTransactionBase64 = getBase64EncodedWireTransaction(signedTransaction); // Track transaction in debugger client.trackTransaction({ @@ -111,6 +112,7 @@ export function ModernSolTransfer() { status: 'pending', method: 'sendTransaction', feePayer: signer.address, + metadata: { wireTransactionBase64 }, }); visualPipeline.setStepState('Build instruction', { diff --git a/examples/next-js/components/transactions/modern-wallet-transfer.tsx b/examples/next-js/components/transactions/modern-wallet-transfer.tsx new file mode 100644 index 0000000..42aeb79 --- /dev/null +++ b/examples/next-js/components/transactions/modern-wallet-transfer.tsx @@ -0,0 +1,182 @@ +'use client'; + +import { useCallback, useMemo } from 'react'; +import { + createSolanaRpc, + pipe, + createTransactionMessage, + setTransactionMessageFeePayerSigner, + setTransactionMessageLifetimeUsingBlockhash, + appendTransactionMessageInstructions, + sendAndConfirmTransactionFactory, + signTransactionMessageWithSigners, + createSolanaRpcSubscriptions, + lamports, + assertIsTransactionWithBlockhashLifetime, + signature as createSignature, + address, + type TransactionSigner, +} from '@solana/kit'; +import { getTransferSolInstruction } from '@solana-program/system'; +import { useKitTransactionSigner, useCluster, useConnectorClient } from '@solana/connector'; +import { PipelineHeaderButton, PipelineVisualization } from '@/components/pipeline'; +import { + getBase58SignatureFromSignedTransaction, + getBase64EncodedWireTransaction, + getWebSocketUrlForRpcUrl, + isRpcProxyUrl, + waitForSignatureConfirmation, +} from './rpc-utils'; +import { VisualPipeline } from '@/lib/visual-pipeline'; +import { useExampleCardHeaderActions } from '@/components/playground/example-card-actions'; + +// Destination wallet address +const DESTINATION_ADDRESS = address('A7Xmq3qqt4uvw3GELHw9HHNFbwZzHDJNtmk6fe2p5b5s'); + +/** + * Modern Wallet Transfer Component + * + * Demonstrates using @solana/kit (web3.js 2.0) to transfer SOL to another wallet. + * This shows the modern, type-safe approach to Solana development using + * connector-kit's kit-compatible TransactionSigner. + */ +export function ModernWalletTransfer() { + const { signer, ready } = useKitTransactionSigner(); + const { cluster } = useCluster(); + const client = useConnectorClient(); + + const visualPipeline = useMemo( + () => + new VisualPipeline('modern-wallet-transfer', [ + { name: 'Build instruction', type: 'instruction' }, + { name: 'Transfer SOL', type: 'transaction' }, + ]), + [], + ); + + const getExplorerUrl = useCallback( + (signature: string) => { + const clusterSlug = cluster?.id?.replace('solana:', ''); + if (!clusterSlug || clusterSlug === 'mainnet' || clusterSlug === 'mainnet-beta') { + return `https://explorer.solana.com/tx/${signature}`; + } + return `https://explorer.solana.com/tx/${signature}?cluster=${clusterSlug}`; + }, + [cluster?.id], + ); + + const executeWalletTransfer = useCallback(async () => { + if (!signer || !client) return; + + // Get RPC URL from connector client + const rpcUrl = client.getRpcUrl(); + if (!rpcUrl) throw new Error('No RPC endpoint configured'); + + // Create RPC client using web3.js 2.0 + const rpc = createSolanaRpc(rpcUrl); + + let signatureBase58: string | null = null; + + try { + await visualPipeline.execute(async () => { + visualPipeline.setStepState('Build instruction', { type: 'building' }); + visualPipeline.setStepState('Transfer SOL', { type: 'building' }); + + // Get recent blockhash using web3.js 2.0 RPC + const { value: latestBlockhash } = await rpc.getLatestBlockhash().send(); + + // 1 lamport transfer to another wallet + const amountInLamports = lamports(1n); + + // Create transfer instruction to destination wallet + const transferInstruction = getTransferSolInstruction({ + source: signer as TransactionSigner, + destination: DESTINATION_ADDRESS, + amount: amountInLamports, + }); + + // Build transaction message with fee payer and lifetime + const transactionMessage = pipe( + createTransactionMessage({ version: 0 }), + tx => setTransactionMessageFeePayerSigner(signer, tx), + tx => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, tx), + tx => appendTransactionMessageInstructions([transferInstruction], tx), + ); + + visualPipeline.setStepState('Transfer SOL', { type: 'signing' }); + + const signedTransaction = await signTransactionMessageWithSigners(transactionMessage); + signatureBase58 = getBase58SignatureFromSignedTransaction(signedTransaction); + const wireTransactionBase64 = getBase64EncodedWireTransaction(signedTransaction); + + // Track transaction in debugger + client.trackTransaction({ + signature: createSignature(signatureBase58), + status: 'pending', + method: 'sendTransaction', + feePayer: signer.address, + metadata: { wireTransactionBase64 }, + }); + + visualPipeline.setStepState('Build instruction', { + type: 'confirmed', + signature: signatureBase58, + cost: 0, + }); + visualPipeline.setStepState('Transfer SOL', { type: 'sending' }); + + // Assert transaction has blockhash lifetime (we set it above with setTransactionMessageLifetimeUsingBlockhash) + assertIsTransactionWithBlockhashLifetime(signedTransaction); + + if (isRpcProxyUrl(rpcUrl)) { + // Next.js `/api/rpc` proxy is HTTP-only; confirm via polling (no WebSocket). + const encodedTransaction = getBase64EncodedWireTransaction(signedTransaction); + await rpc.sendTransaction(encodedTransaction, { encoding: 'base64' }).send(); + await waitForSignatureConfirmation({ + signature: signatureBase58, + commitment: 'confirmed', + getSignatureStatuses: async sig => + await rpc.getSignatureStatuses([createSignature(sig)]).send(), + }); + } else { + const rpcSubscriptions = createSolanaRpcSubscriptions(getWebSocketUrlForRpcUrl(rpcUrl)); + await sendAndConfirmTransactionFactory({ rpc, rpcSubscriptions })(signedTransaction, { + commitment: 'confirmed', + }); + } + + visualPipeline.setStepState('Transfer SOL', { + type: 'confirmed', + signature: signatureBase58, + cost: 0.000005, + }); + client.updateTransactionStatus(createSignature(signatureBase58), 'confirmed'); + }); + } catch (error) { + if (signatureBase58) { + client.updateTransactionStatus( + createSignature(signatureBase58), + 'failed', + error instanceof Error ? error.message : String(error), + ); + } + } + }, [client, signer, visualPipeline]); + + const headerAction = useMemo( + () => ( + + ), + [client, executeWalletTransfer, ready, visualPipeline], + ); + + useExampleCardHeaderActions(headerAction); + + return ( + + ); +} diff --git a/examples/next-js/components/transactions/titan-swap.tsx b/examples/next-js/components/transactions/titan-swap.tsx new file mode 100644 index 0000000..4ef8ed1 --- /dev/null +++ b/examples/next-js/components/transactions/titan-swap.tsx @@ -0,0 +1,223 @@ +'use client'; + +import { useCallback, useMemo } from 'react'; +import { TransactionBuilder, diagnoseError } from '@pipeit/core'; +import { getTitanSwapPlan, titanInstructionToKit } from '@pipeit/actions/titan'; +import { createSolanaRpc, getBase64Encoder, signature as createSignature } from '@solana/kit'; +import { useKitTransactionSigner, useCluster, useConnectorClient } from '@solana/connector'; +import { PipelineHeaderButton, PipelineVisualization } from '@/components/pipeline'; +import { VisualPipeline } from '@/lib/visual-pipeline'; +import { useExampleCardHeaderActions } from '@/components/playground/example-card-actions'; +import { waitForSignatureConfirmation } from './rpc-utils'; + +// Token addresses +const SOL_MINT = 'So11111111111111111111111111111111111111112'; +const USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'; + +// Proxy through Next.js API route to avoid CORS (add ?region=jp1 or ?region=de1 to switch) +const TITAN_PROXY_URL = '/api/titan'; + +/** + * Example: Titan Swap using @pipeit/actions + * + * This demonstrates using the new InstructionPlan-first approach with Titan, + * including ALT (Address Lookup Table) support for optimal transaction packing. + */ +export function TitanSwap() { + const { signer, ready } = useKitTransactionSigner(); + const { cluster } = useCluster(); + const client = useConnectorClient(); + + const visualPipeline = useMemo( + () => + new VisualPipeline('titan-swap', [ + { name: 'Build swap plan', type: 'instruction' }, + { name: 'Swap transaction', type: 'transaction' }, + ]), + [], + ); + + const getExplorerUrl = useCallback( + (signature: string) => { + const clusterSlug = cluster?.id?.replace('solana:', ''); + if (!clusterSlug || clusterSlug === 'mainnet' || clusterSlug === 'mainnet-beta') { + return `https://explorer.solana.com/tx/${signature}`; + } + return `https://explorer.solana.com/tx/${signature}?cluster=${clusterSlug}`; + }, + [cluster?.id], + ); + + const executeSwap = useCallback(async () => { + if (!signer || !client) return; + + const rpcUrl = client.getRpcUrl(); + if (!rpcUrl) throw new Error('No RPC endpoint configured'); + + const rpc = createSolanaRpc(rpcUrl); + let signatureBase58: string | null = null; + let typedSignature: ReturnType | null = null; + + try { + await visualPipeline.execute(async () => { + visualPipeline.setStepState('Build swap plan', { type: 'building' }); + visualPipeline.setStepState('Swap transaction', { type: 'building' }); + + const swapResult = await getTitanSwapPlan( + { + swap: { + inputMint: SOL_MINT, + outputMint: USDC_MINT, + amount: 10_000_000n, // 0.01 SOL + slippageBps: 50, + }, + transaction: { + userPublicKey: signer.address, + createOutputTokenAccount: true, + }, + }, + { + clientConfig: { baseUrl: TITAN_PROXY_URL }, + }, + ); + + const instructions = swapResult.route.instructions.map(titanInstructionToKit); + const computeUnitsSafe = swapResult.route.computeUnitsSafe + ? Number(swapResult.route.computeUnitsSafe) + : 400_000; + const computeUnits = Math.min(Math.max(computeUnitsSafe, 200_000), 1_400_000); + + visualPipeline.setStepState('Swap transaction', { type: 'signing' }); + + const exportedTransaction = await new TransactionBuilder({ + rpc, + computeUnits, + priorityFee: 'none', + autoRetry: false, + lookupTableAddresses: + swapResult.lookupTableAddresses.length > 0 ? swapResult.lookupTableAddresses : undefined, + }) + .setFeePayerSigner(signer) + .addInstructions(instructions) + .export('base64'); + + if (exportedTransaction.format !== 'base64') throw new Error('Unexpected transaction export format'); + + visualPipeline.setStepState('Swap transaction', { type: 'sending' }); + + // Pre-send devtools preview: emit wire bytes so the debugger can simulate before sending. + const previewBytes = new Uint8Array(getBase64Encoder().encode(exportedTransaction.data)); + client.previewTransaction(previewBytes); + + const sentSignature = await rpc + .sendTransaction(exportedTransaction.data, { encoding: 'base64' }) + .send(); + signatureBase58 = String(sentSignature); + typedSignature = createSignature(signatureBase58); + + client.trackTransaction({ + signature: typedSignature, + status: 'pending', + method: 'sendTransaction', + feePayer: signer.address, + metadata: { wireTransactionBase64: exportedTransaction.data }, + }); + + // We can show the signature immediately; confirmation happens next. + visualPipeline.setStepState('Build swap plan', { + type: 'confirmed', + signature: signatureBase58, + cost: 0, + }); + + await waitForSignatureConfirmation({ + signature: signatureBase58, + commitment: 'confirmed', + getSignatureStatuses: async sig => await rpc.getSignatureStatuses([createSignature(sig)]).send(), + }); + + visualPipeline.setStepState('Swap transaction', { + type: 'confirmed', + signature: signatureBase58, + cost: 0, + }); + client.updateTransactionStatus(typedSignature, 'confirmed'); + }); + } catch (error) { + const diagnosis = diagnoseError(error); + console.error('[TitanSwap] failed', diagnosis, error); + if (typedSignature) { + client.updateTransactionStatus(typedSignature, 'failed', diagnosis.summary); + } + } + }, [client, signer, visualPipeline]); + + const headerAction = useMemo( + () => ( + + ), + [client, executeSwap, ready, visualPipeline], + ); + + useExampleCardHeaderActions(headerAction); + + return ( + + ); +} + +export const titanSwapCode = `import { getTitanSwapPlan, TITAN_DEMO_BASE_URLS } from '@pipeit/actions/titan' +import { TransactionBuilder } from '@pipeit/core' +import { titanInstructionToKit } from '@pipeit/actions/titan' + +// Token addresses +const SOL = 'So11111111111111111111111111111111111111112' +const USDC = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v' + +// Server-side: use Titan directly +// const titanBaseUrl = TITAN_DEMO_BASE_URLS.us1 +// Browser: proxy through your API to avoid CORS +const titanBaseUrl = '/api/titan' + +// Get a swap plan from Titan +// Returns an InstructionPlan + ALT addresses for compression +const { route, lookupTableAddresses, quote, providerId } = await getTitanSwapPlan( + { + swap: { + inputMint: SOL, + outputMint: USDC, + amount: 10_000_000n, // 0.01 SOL in lamports + slippageBps: 50, // 0.5% slippage tolerance + }, + transaction: { + userPublicKey: signer.address, + createOutputTokenAccount: true, + }, + }, + { + clientConfig: { baseUrl: titanBaseUrl }, + }, +) + +console.log(\`Swapping for ~\${quote.outputAmount} USDC via \${providerId}\`) + +const instructions = route.instructions.map(titanInstructionToKit) + +const exported = await new TransactionBuilder({ + rpc, + computeUnits: 400_000, + priorityFee: 'none', + lookupTableAddresses, +}) + .setFeePayerSigner(signer) + .addInstructions(instructions) + .export('base64') + +// Send + confirm without WebSocket subscriptions +const signature = await rpc.sendTransaction(exported.data, { encoding: 'base64' }).send() + +console.log('Swap executed:', signature)`; diff --git a/examples/next-js/package.json b/examples/next-js/package.json index 0a5150f..b0eb25f 100644 --- a/examples/next-js/package.json +++ b/examples/next-js/package.json @@ -20,10 +20,12 @@ "@radix-ui/react-tabs": "^1.1.12", "@solana-program/system": "^0.7.0", "@solana/connector": "workspace:*", - "@solana/devtools": "workspace:*", + "@solana/connector-debugger": "workspace:*", "@solana/keychain": "^0.2.1", "@solana/kit": "^6.0.0", "@solana/web3.js": "^1.98.4", + "@pipeit/core": "^0.2.5", + "@pipeit/actions": "^0.1.1", "@tanstack/react-query": "^5.90.5", "@wallet-standard/app": "^1.1.0", "@walletconnect/universal-provider": "^2.23.0", diff --git a/package.json b/package.json index 042ee94..512b306 100644 --- a/package.json +++ b/package.json @@ -23,18 +23,18 @@ "release": "turbo build && changeset publish" }, "devDependencies": { - "@changesets/cli": "^2.29.8", + "@changesets/cli": "^2.30.0", "@solana/prettier-config-solana": "0.0.5", "@types/d3-path": "^3.1.1", "@types/js-cookie": "^3.0.6", - "@types/node": "^24.10.15", - "@typescript-eslint/eslint-plugin": "^8.56.1", - "@typescript-eslint/parser": "^8.56.1", - "eslint": "^9.39.3", + "@types/node": "^24.12.0", + "@typescript-eslint/eslint-plugin": "^8.57.0", + "@typescript-eslint/parser": "^8.57.0", + "eslint": "^9.39.4", "prettier": "^3.8.1", "react": "^19.2.4", "react-dom": "^19.2.4", - "turbo": "^2.8.12" + "turbo": "^2.8.17" }, "engines": { "node": ">=20.18.0" diff --git a/packages/connector/src/lib/core/connector-client.ts b/packages/connector/src/lib/core/connector-client.ts index 3f2e092..2c4bf9f 100644 --- a/packages/connector/src/lib/core/connector-client.ts +++ b/packages/connector/src/lib/core/connector-client.ts @@ -6,7 +6,7 @@ import type { ConnectorDebugState, Listener, } from '../../types/connector'; -import type { TransactionActivity } from '../../types/transactions'; +import type { SolanaTransaction, TransactionActivity } from '../../types/transactions'; import type { ConnectorEvent, ConnectorEventListener } from '../../types/events'; import type { SolanaClusterId, SolanaCluster } from '@wallet-ui/core'; import type { WalletInfo } from '../../types/wallets'; @@ -26,6 +26,7 @@ import { AUTO_CONNECT_DELAY_MS, DEFAULT_MAX_TRACKED_TRANSACTIONS } from '../cons import { createLogger } from '../utils/secure-logger'; import { tryCatchSync } from './try-catch'; import type { WalletConnectRegistration } from '../wallet/walletconnect'; +import { prepareTransactionForWallet } from '../../utils/transaction-format'; const logger = createLogger('ConnectorClient'); @@ -319,6 +320,23 @@ export class ConnectorClient { this.transactionTracker.trackTransaction(activity); } + /** + * Emit a pre-send transaction preview event for devtools. + * + * This does not sign or send the transaction. It exists so apps that do not + * use the connector transaction signer can still surface wire bytes in the + * debugger (e.g. to simulate before sending). + */ + previewTransaction(transaction: SolanaTransaction): void { + const { serialized } = prepareTransactionForWallet(transaction); + this.eventEmitter.emit({ + type: 'transaction:preparing', + transaction: serialized, + size: serialized.length, + timestamp: new Date().toISOString(), + }); + } + updateTransactionStatus(signature: string, status: TransactionActivity['status'], error?: string): void { this.transactionTracker.updateStatus(signature, status, error); } diff --git a/packages/devtools/README.md b/packages/devtools/README.md index be3e2ca..951d1dc 100644 --- a/packages/devtools/README.md +++ b/packages/devtools/README.md @@ -1,4 +1,4 @@ -# @solana/devtools +# @solana/connector-debugger Framework-agnostic devtools for `@solana/connector`. Works with any web framework via the imperative DOM API. @@ -7,15 +7,16 @@ Framework-agnostic devtools for `@solana/connector`. Works with any web framewor - **Framework-agnostic**: Pure DOM-based UI using Web Components - **Auto-detection**: Automatically finds `window.__connectorClient` when available - **TanStack-style API**: Simple `mount(el)` / `unmount()` lifecycle -- **Plugin system**: Built-in Overview, Events, and Transactions tabs +- **Plugin system**: Built-in Overview, Events, Transactions, and IDL tabs - **In-flight transactions**: Captures `transaction:preparing` before a signature exists and progresses through signing → sent - **Transaction inspection**: Decodes wire bytes (fee payer, size, compute budget) and fetches RPC details (status/confirmations + `getTransaction` JSON/logs) +- **IDL interaction**: Fetch Program Metadata IDLs (seed: `idl`) and execute modern Anchor instructions from the devtools panel - **Persistent settings + cache**: Remembers panel state and persists a devtools cache (clearable from the UI) ## Installation ```bash -npm install @solana/devtools +npm install @solana/connector-debugger ``` ## Usage @@ -25,7 +26,7 @@ npm install @solana/devtools When using `@solana/connector/react` with `ConnectorProvider`, the client is automatically exposed on `window.__connectorClient`: ```typescript -import { ConnectorDevtools } from '@solana/devtools'; +import { ConnectorDevtools } from '@solana/connector-debugger'; // Create devtools instance (auto-detects client from window.__connectorClient) const devtools = new ConnectorDevtools(); @@ -44,7 +45,7 @@ devtools.unmount(); If you're using the headless API or want explicit control: ```typescript -import { ConnectorDevtools } from '@solana/devtools'; +import { ConnectorDevtools } from '@solana/connector-debugger'; import { ConnectorClient } from '@solana/connector/headless'; const client = new ConnectorClient({ debug: true }); @@ -74,7 +75,7 @@ export function DevtoolsLoader() { let devtools: any; - import('@solana/devtools').then(({ ConnectorDevtools }) => { + import('@solana/connector-debugger').then(({ ConnectorDevtools }) => { devtools = new ConnectorDevtools(); const container = document.createElement('div'); container.id = 'connector-devtools'; @@ -92,6 +93,22 @@ export function DevtoolsLoader() { } ``` +### IDL Tab (Interact with program instructions) + +The **IDL** tab lets you fetch a program’s IDL from **Program Metadata** or **Anchor IDL** and execute instructions using the currently connected wallet. + +- **Fetch from chain**: Enter a program id, select **Program Metadata** or **Anchor IDL**, and click **Fetch** (requires an RPC URL via `config.rpcUrl` or the connector cluster). +- **Local override**: Use **Paste JSON** / **Upload JSON** to load an IDL from your codebase during development. +- **Execute**: Select an instruction, fill accounts/args, then click **Execute**. +- **Auto-prefill (Explorer-like)**: + - Known program accounts (System/Token/Associated Token, etc.) are filled when detected by name. + - Wallet-controlled accounts (authority/owner/payer/signer patterns) are filled with the connected wallet. + - PDA accounts are computed when seeds are available and filled automatically (locked by default; toggle **PDAs: Locked/Editable**). + - Use **Reset** to clear inputs and re-apply prefills. +- **Safety**: On mainnet, you’ll be prompted before sending a real transaction. + +Note: v1 supports **modern Anchor IDLs**. + ## Configuration ```typescript diff --git a/packages/devtools/package.json b/packages/devtools/package.json index 7eb472e..f5f3966 100644 --- a/packages/devtools/package.json +++ b/packages/devtools/package.json @@ -1,6 +1,6 @@ { - "name": "@solana/devtools", - "version": "0.1.0", + "name": "@solana/connector-debugger", + "version": "0.2.0", "description": "Framework-agnostic devtools for @solana/connector", "main": "./dist/index.js", "module": "./dist/index.mjs", @@ -49,12 +49,17 @@ "connector" ], "dependencies": { + "@coral-xyz/anchor": "^0.32.1", "@solana-program/compute-budget": "^0.11.0", + "@solana-program/program-metadata": "^0.4.1", "@solana-program/system": "^0.10.0", "@solana-program/token": "^0.9.0", "@solana-program/token-2022": "^0.6.1", + "@solana/codecs": "^5.0.0", "@solana/kit": "^6.0.0", "@solana/transaction-messages": "^5.0.0", - "@solana/transactions": "^5.0.0" + "@solana/transactions": "^5.0.0", + "@solana/web3.js": "^1.98.4", + "bn.js": "^5.2.2" } } diff --git a/packages/devtools/src/components/devtools-element.ts b/packages/devtools/src/components/devtools-element.ts index a9cc904..8ff9b2e 100644 --- a/packages/devtools/src/components/devtools-element.ts +++ b/packages/devtools/src/components/devtools-element.ts @@ -104,6 +104,7 @@ export function createDevtoolsElement(options: DevtoolsElementOptions): Devtools ${BASE_STYLES} :host { ${generateThemeCss(theme)} + color-scheme: ${theme}; } @keyframes cdtToolbarEnter { @@ -352,6 +353,61 @@ ${BASE_STYLES} .cdt-close-btn:active { transform: scale(0.92); } .cdt-close-btn svg { width: 16px; height: 16px; } +/* Tooltip */ +.cdt-tooltip-wrap { + position: relative; + display: inline-flex; +} + +.cdt-tooltip-wrap[data-visible="false"] { + display: none; +} + +.cdt-tooltip { + position: absolute; + right: 0; + bottom: calc(100% + 10px); + width: 260px; + padding: 10px 10px 9px; + border-radius: 12px; + border: 1px solid var(--cdt-border); + background: var(--cdt-bg-panel); + box-shadow: 0 10px 26px rgba(0, 0, 0, 0.28); + color: var(--cdt-text); + font-size: 11px; + line-height: 1.35; + opacity: 0; + transform: translateY(4px); + pointer-events: none; + transition: opacity 0.12s ease, transform 0.12s ease; + z-index: 2; +} + +.cdt-tooltip-title { + font-weight: 750; + margin-bottom: 4px; +} + +.cdt-tooltip-body { + color: var(--cdt-text-muted); +} + +.cdt-tooltip-wrap:hover .cdt-tooltip, +.cdt-tooltip-wrap:focus-within .cdt-tooltip { + opacity: 1; + transform: translateY(0); +} + +.cdt-fresh-user-btn svg { + width: 14px; + height: 14px; +} + +.cdt-fresh-user-btn:hover:not(:disabled) { + border-color: var(--cdt-warning); + color: var(--cdt-warning); +} + /* Content */ .cdt-content { flex: 1; @@ -378,7 +434,7 @@ ${BASE_STYLES}
${/* Plugin icon/name are developer-configured, not user input. icon must be trusted static SVG. */ ''} @@ -400,6 +456,17 @@ ${BASE_STYLES} }> Disconnect +
+ + +
@@ -416,9 +483,21 @@ ${BASE_STYLES} const resizeHandle = shadow.querySelector('.cdt-resize-handle'); const closeBtn = shadow.querySelector('.cdt-close-btn'); const disconnectBtn = shadow.querySelector('#disconnect-btn'); + const freshUserWrapEl = shadow.querySelector('#fresh-user-wrap'); + const freshUserBtn = shadow.querySelector('#fresh-user-btn'); const pluginContentEl = shadow.getElementById('plugin-content'); - if (!stylesEl || !triggerBtn || !panelEl || !resizeHandle || !closeBtn || !disconnectBtn || !pluginContentEl) { + if ( + !stylesEl || + !triggerBtn || + !panelEl || + !resizeHandle || + !closeBtn || + !disconnectBtn || + !freshUserWrapEl || + !freshUserBtn || + !pluginContentEl + ) { return container; } @@ -429,6 +508,8 @@ ${BASE_STYLES} const resize = resizeHandle; const close = closeBtn; const disconnect = disconnectBtn; + const freshUserWrap = freshUserWrapEl; + const freshUser = freshUserBtn; const pluginContent = pluginContentEl; function updateStyles() { @@ -437,6 +518,11 @@ ${BASE_STYLES} panel.style.setProperty('--cdt-panel-height', `${panelHeight}px`); } + function updateFreshUserVisibility() { + // Persist across all tabs (like Disconnect). + freshUserWrap.dataset.visible = 'true'; + } + function setPanelState(next: PanelAnimState) { panelAnimState = next; panel.dataset.state = next; @@ -535,6 +621,35 @@ ${BASE_STYLES} { signal: abortController.signal }, ); + freshUser.addEventListener( + 'click', + () => { + if (!window.confirm('This will clear stored wallet/account/network and reload the page. Continue?')) return; + + try { + context.client.resetStorage(); + } catch { + // best-effort + } + + try { + // Keep in sync with default-config storage keys and the Overview plugin persistence hints. + localStorage.removeItem('connector-kit:v1:account'); + localStorage.removeItem('connector-kit:v1:wallet'); + localStorage.removeItem('connector-kit:v1:cluster'); + // Legacy keys (pre-v1) + localStorage.removeItem('connector-kit:account'); + localStorage.removeItem('connector-kit:wallet'); + localStorage.removeItem('connector-kit:cluster'); + } catch { + // ignore + } + + window.location.reload(); + }, + { signal: abortController.signal }, + ); + // Tab clicks shadow.querySelectorAll('.cdt-tab').forEach(tab => { tab.addEventListener( @@ -546,6 +661,7 @@ ${BASE_STYLES} onStateChange({ activeTab }); shadow.querySelectorAll('.cdt-tab').forEach(t => t.classList.remove('cdt-active')); tab.classList.add('cdt-active'); + updateFreshUserVisibility(); renderActivePlugin(); } }, @@ -553,6 +669,169 @@ ${BASE_STYLES} ); }); + function setDropdownOpen(dropdown: HTMLElement, isOpen: boolean) { + dropdown.dataset.open = isOpen ? 'true' : 'false'; + const trigger = dropdown.querySelector('[data-cdt-dropdown-trigger]'); + if (trigger) trigger.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); + } + + function closeAllDropdowns(except?: HTMLElement) { + shadow.querySelectorAll('.cdt-dropdown[data-open="true"]').forEach(dropdown => { + if (except && dropdown === except) return; + setDropdownOpen(dropdown, false); + }); + } + + function selectDropdownValue(dropdown: HTMLElement, value: string, label?: string) { + dropdown.dataset.value = value; + const textEl = dropdown.querySelector('.cdt-dropdown-trigger-text'); + if (textEl && label !== undefined) textEl.textContent = label; + + dropdown.querySelectorAll('[data-cdt-dropdown-option]').forEach(option => { + const optionValue = option.getAttribute('data-value') ?? ''; + const isSelected = optionValue === value; + option.dataset.selected = isSelected ? 'true' : 'false'; + option.setAttribute('aria-selected', isSelected ? 'true' : 'false'); + }); + } + + // Custom dropdown behavior (single implementation for all plugins). + shadow.addEventListener( + 'pointerdown', + e => { + const target = e.target as HTMLElement | null; + if (!target) return; + const withinDropdown = target.closest?.('.cdt-dropdown'); + if (withinDropdown) return; + closeAllDropdowns(); + }, + { signal: abortController.signal }, + ); + + shadow.addEventListener( + 'click', + e => { + const target = e.target as HTMLElement | null; + if (!target) return; + + const option = target.closest('[data-cdt-dropdown-option]'); + if (option) { + const dropdown = option.closest('.cdt-dropdown'); + if (!dropdown) return; + + const value = option.getAttribute('data-value') ?? ''; + const current = dropdown.dataset.value ?? ''; + const label = option.querySelector('.cdt-dropdown-item-label')?.textContent ?? value; + + setDropdownOpen(dropdown, false); + + if (value !== current) { + selectDropdownValue(dropdown, value, label); + dropdown.dispatchEvent( + new CustomEvent('cdt-dropdown-change', { + detail: { id: dropdown.id, value }, + bubbles: true, + }), + ); + } + + e.preventDefault(); + e.stopPropagation(); + return; + } + + const trigger = target.closest('[data-cdt-dropdown-trigger]'); + if (trigger) { + const dropdown = trigger.closest('.cdt-dropdown'); + if (!dropdown) return; + + const isOpenNow = dropdown.dataset.open === 'true'; + if (isOpenNow) setDropdownOpen(dropdown, false); + else { + closeAllDropdowns(dropdown); + setDropdownOpen(dropdown, true); + } + + e.preventDefault(); + e.stopPropagation(); + } + }, + { signal: abortController.signal }, + ); + + shadow.addEventListener( + 'keydown', + e => { + const keyboardEvent = e as KeyboardEvent; + const target = e.target as HTMLElement | null; + if (!target) return; + + const dropdown = target.closest('.cdt-dropdown'); + if (!dropdown) return; + + const isOpen = dropdown.dataset.open === 'true'; + const trigger = dropdown.querySelector('[data-cdt-dropdown-trigger]'); + const items = Array.from(dropdown.querySelectorAll('[data-cdt-dropdown-option]')); + const currentItem = target.closest('[data-cdt-dropdown-option]'); + + if (keyboardEvent.key === 'Escape') { + setDropdownOpen(dropdown, false); + trigger?.focus(); + keyboardEvent.preventDefault(); + keyboardEvent.stopPropagation(); + return; + } + + if ( + !isOpen && + (keyboardEvent.key === 'Enter' || + keyboardEvent.key === ' ' || + keyboardEvent.key === 'ArrowDown' || + keyboardEvent.key === 'ArrowUp') + ) { + closeAllDropdowns(dropdown); + setDropdownOpen(dropdown, true); + + const selected = dropdown.querySelector( + '[data-cdt-dropdown-option][data-selected="true"]', + ); + const fallback = keyboardEvent.key === 'ArrowUp' ? items[items.length - 1] : items[0]; + (selected ?? fallback)?.focus(); + + keyboardEvent.preventDefault(); + keyboardEvent.stopPropagation(); + return; + } + + if (!isOpen) return; + + if ((keyboardEvent.key === 'Enter' || keyboardEvent.key === ' ') && currentItem) { + currentItem.click(); + keyboardEvent.preventDefault(); + keyboardEvent.stopPropagation(); + return; + } + + if (keyboardEvent.key === 'Tab') { + setDropdownOpen(dropdown, false); + return; + } + + if (keyboardEvent.key !== 'ArrowDown' && keyboardEvent.key !== 'ArrowUp') return; + + const idx = currentItem ? items.indexOf(currentItem) : -1; + if (!items.length) return; + const nextIdx = + keyboardEvent.key === 'ArrowDown' + ? (idx + 1 + items.length) % items.length + : (idx - 1 + items.length) % items.length; + items[nextIdx]?.focus(); + keyboardEvent.preventDefault(); + keyboardEvent.stopPropagation(); + }, + { signal: abortController.signal }, + ); + // Resize handle resizeHandle.addEventListener( 'mousedown', @@ -603,6 +882,7 @@ ${BASE_STYLES} const unsubscribeContext = context.subscribe(() => { updateStyles(); updateTriggerVisibility(); + updateFreshUserVisibility(); if (isOpen) renderActivePlugin(); }); @@ -622,6 +902,7 @@ ${BASE_STYLES} // Initial paint updateStyles(); updateTriggerVisibility(); + updateFreshUserVisibility(); if (isOpen) { animatePanelOpen(); renderActivePlugin(); diff --git a/packages/devtools/src/components/dropdown.ts b/packages/devtools/src/components/dropdown.ts new file mode 100644 index 0000000..b0acb44 --- /dev/null +++ b/packages/devtools/src/components/dropdown.ts @@ -0,0 +1,77 @@ +import { escapeAttr, escapeHtml } from '../utils/dom'; +import { ICONS } from './icons'; + +export interface CdtDropdownOption { + value: string; + label: string; +} + +export interface RenderCdtDropdownParams { + id: string; + value: string; + options: readonly CdtDropdownOption[]; + ariaLabel: string; + /** + * Extra classes applied to the outer wrapper. + * Use for layout only (styling is provided by shared tokens). + */ + className?: string; + /** + * Classes applied to the trigger button. + * Defaults to `cdt-select cdt-select-compact` to match existing styling. + */ + triggerClassName?: string; +} + +export function renderCdtDropdown({ + id, + value, + options, + ariaLabel, + className, + triggerClassName, +}: RenderCdtDropdownParams): string { + const selected = options.find(o => o.value === value) ?? null; + const selectedLabel = selected?.label ?? options[0]?.label ?? value; + + return ` +
+ +
+ ${options + .map( + option => ` + + `, + ) + .join('')} +
+
+ `; +} diff --git a/packages/devtools/src/components/icons.ts b/packages/devtools/src/components/icons.ts index ac47996..be289da 100644 --- a/packages/devtools/src/components/icons.ts +++ b/packages/devtools/src/components/icons.ts @@ -32,6 +32,14 @@ export const ICONS = { `, + code: ` + + `, + + idl: ` + + `, + refresh: ` `, diff --git a/packages/devtools/src/core.ts b/packages/devtools/src/core.ts index 10713c6..62b35f6 100644 --- a/packages/devtools/src/core.ts +++ b/packages/devtools/src/core.ts @@ -35,6 +35,7 @@ import { createDevtoolsElement } from './components/devtools-element'; import { createOverviewPlugin } from './plugins/overview'; import { createEventsPlugin } from './plugins/events'; import { createTransactionsPlugin } from './plugins/transactions'; +import { createIdlPlugin } from './plugins/idl'; declare global { interface Window { @@ -89,6 +90,7 @@ export class ConnectorDevtools { createOverviewPlugin(), createEventsPlugin(this.#config.maxEvents), createTransactionsPlugin(this.#config.maxTransactions), + createIdlPlugin(), ...(init.plugins ?? []), ]; } @@ -352,10 +354,38 @@ export class ConnectorDevtools { const signatureStr = String(event.signature); this.#updateCache(cache => { const existingIdx = cache.transactions.items.findIndex(tx => tx.signature === signatureStr); + + // Best-effort correlation for pre-send previews: + // If an inflight entry exists without a signature (e.g. emitted via `transaction:preparing`), + // attach this tracked signature to the latest such inflight entry so simulation can use + // captured wire bytes even when the app does not emit `transaction:sent`. + const inflight = cache.transactions.inflight.slice(); + let matchedInflight: DevtoolsInflightTransaction | undefined; + if (event.status === 'pending') { + const idx = findLatestInflightIndex(inflight); + if (idx !== -1 && !inflight[idx].signature) { + const inflightTs = new Date(inflight[idx].timestamp).getTime(); + const trackedTs = new Date(event.timestamp).getTime(); + const isRecent = + Number.isFinite(inflightTs) && + Number.isFinite(trackedTs) && + Math.abs(trackedTs - inflightTs) < 60_000; + + if (isRecent) { + inflight[idx] = { ...inflight[idx], stage: 'sent', signature: signatureStr }; + matchedInflight = inflight[idx]; + } + } + } + const nextItem = { signature: signatureStr, timestamp: event.timestamp, status: event.status, + ...(matchedInflight?.size ? { size: matchedInflight.size } : {}), + ...(matchedInflight?.transactionBase64 + ? { wireTransactionBase64: matchedInflight.transactionBase64 } + : {}), }; const nextItems = existingIdx === -1 @@ -364,8 +394,6 @@ export class ConnectorDevtools { i === existingIdx ? { ...tx, ...nextItem } : tx, ); - const inflight = cache.transactions.inflight.slice(); - // Fallback for apps that manually call `client.trackTransaction(...)` (common in Kit flows). // If we don't already have an inflight entry for this signature, create one so the UI can // show it while it's pending. diff --git a/packages/devtools/src/index.ts b/packages/devtools/src/index.ts index 2b2f9cf..032f2ed 100644 --- a/packages/devtools/src/index.ts +++ b/packages/devtools/src/index.ts @@ -1,11 +1,11 @@ /** - * @solana/devtools + * @solana/connector-debugger * * Framework-agnostic devtools for @solana/connector * * Usage: * ```typescript - * import { ConnectorDevtools } from '@solana/devtools'; + * import { ConnectorDevtools } from '@solana/connector-debugger'; * * const devtools = new ConnectorDevtools(); * devtools.mount(document.body); @@ -33,3 +33,4 @@ export type { export { createOverviewPlugin } from './plugins/overview'; export { createEventsPlugin } from './plugins/events'; export { createTransactionsPlugin } from './plugins/transactions'; +export { createIdlPlugin } from './plugins/idl'; diff --git a/packages/devtools/src/plugins/events.ts b/packages/devtools/src/plugins/events.ts index 252cb00..771c585 100644 --- a/packages/devtools/src/plugins/events.ts +++ b/packages/devtools/src/plugins/events.ts @@ -10,6 +10,7 @@ import type { ConnectorDevtoolsPlugin, PluginContext } from '../types'; import { ICONS } from '../components/icons'; +import { renderCdtDropdown } from '../components/dropdown'; interface StoredEvent { id: number; @@ -107,16 +108,6 @@ export function createEventsPlugin(maxEvents = 100): ConnectorDevtoolsPlugin { gap: 8px; } - .cdt-events-filter { - padding: 4px 8px; - font-size: 11px; - border-radius: 4px; - background: var(--cdt-bg-hover); - border: 1px solid var(--cdt-border); - color: var(--cdt-text); - cursor: pointer; - } - .cdt-events-count { font-size: 11px; color: var(--cdt-text-muted); @@ -254,10 +245,16 @@ export function createEventsPlugin(maxEvents = 100): ConnectorDevtoolsPlugin { - + ${renderCdtDropdown({ + id: 'event-filter', + ariaLabel: 'Event filter', + value: selectedType ?? '', + options: [ + { value: '', label: 'All events' }, + ...eventTypes.map(type => ({ value: type, label: type })), + ], + triggerClassName: 'cdt-select cdt-select-compact', + })}
${isPaused ? '
⏸ Paused
' : ''} @@ -307,7 +304,7 @@ export function createEventsPlugin(maxEvents = 100): ConnectorDevtoolsPlugin { // Attach event handlers const togglePauseBtn = el.querySelector('#toggle-pause'); const clearBtn = el.querySelector('#clear-events'); - const filterSelect = el.querySelector('#event-filter') as HTMLSelectElement | null; + const filterDropdown = el.querySelector('#event-filter'); const eventItems = el.querySelectorAll('.cdt-event-item'); togglePauseBtn?.addEventListener('click', () => { @@ -321,8 +318,9 @@ export function createEventsPlugin(maxEvents = 100): ConnectorDevtoolsPlugin { renderContent(); }); - filterSelect?.addEventListener('change', () => { - selectedType = filterSelect.value || null; + filterDropdown?.addEventListener('cdt-dropdown-change', e => { + const detail = (e as CustomEvent<{ id: string; value: string }>).detail; + selectedType = detail.value || null; renderContent(); }); diff --git a/packages/devtools/src/plugins/idl.ts b/packages/devtools/src/plugins/idl.ts new file mode 100644 index 0000000..bd439bf --- /dev/null +++ b/packages/devtools/src/plugins/idl.ts @@ -0,0 +1,989 @@ +/** + * IDL Plugin + * + * Goal: Provide an Explorer-like "Interact with IDL" experience inside @solana/connector-debugger, + * but using the currently-connected @solana/connector wallet session. + * + * Notes: + * - DOM-only UI (framework-agnostic) + * - Chain-first IDL sourcing via Program Metadata (seed: "idl") + * - Optional local overrides (paste / file upload) + */ + +import type { ConnectorDevtoolsPlugin, PluginContext } from '../types'; +import { ICONS } from '../components/icons'; +import { renderCdtDropdown } from '../components/dropdown'; +import { escapeAttr, escapeHtml, getExplorerUrl, getRpcUrl } from '../utils/dom'; +import { fetchProgramMetadataIdl } from '../utils/idl'; +import { PublicKey } from '@solana/web3.js'; +import { isAccountGroup } from './idl/account-tree'; +import { getInstructionList, isModernAnchorIdl } from './idl/anchor-idl'; +import { findKnownAddressForAccountName, isPrefilledAccountName, isWalletAccountName } from './idl/account-patterns'; +import { buildAnchorInstruction } from './idl/build-anchor-instruction'; +import { findDefaultValueForArgumentType } from './idl/default-values'; +import { isRecord } from './idl/guards'; +import { readFileAsText } from './idl/file'; +import { getInputKey } from './idl/keys'; +import { camelCase } from './idl/naming'; +import { computePdasForInstruction, type PdaGenerationResult } from './idl/pda'; +import { IDL_STYLES } from './idl/styles'; +import type { + AnchorIdlInstruction, + AnchorIdlInstructionAccount, + AnchorIdlInstructionAccountItem, + AnchorIdlInstructionArg, + AnchorIdlLike, + IdlPluginState, + IdlSource, +} from './idl/types'; + +function isMainnetCluster(clusterId: string | null | undefined): boolean { + if (!clusterId) return false; + return clusterId.includes('mainnet'); +} + +export function createIdlPlugin(): ConnectorDevtoolsPlugin { + let unsubscribeClient: (() => void) | undefined; + let unsubscribeContext: (() => void) | undefined; + + let renderFn: (() => void) | undefined; + let fetchRequestId = 0; + let executeRequestId = 0; + + let state: IdlPluginState = { + source: 'anchor-idl', + programIdInput: '', + pasteJson: '', + isFetchingIdl: false, + fetchError: null, + idl: null, + idlKind: null, + selectedIxName: null, + accountValues: {}, + argValues: {}, + autoFilled: {}, + lockPdas: true, + isExecuting: false, + executeError: null, + lastSignature: null, + }; + + function setState(partial: Partial) { + state = { ...state, ...partial }; + renderFn?.(); + } + + function setIdl(nextIdl: unknown | null, opts?: { resetSelection?: boolean }) { + const idlKind: IdlPluginState['idlKind'] = nextIdl + ? isModernAnchorIdl(nextIdl) + ? 'anchor' + : 'unsupported' + : null; + const instructions = nextIdl ? getInstructionList(nextIdl) : []; + + const nextSelection = + opts?.resetSelection === false ? state.selectedIxName : instructions.length ? instructions[0].name : null; + + setState({ + idl: nextIdl, + idlKind, + selectedIxName: nextSelection, + fetchError: null, + executeError: null, + lastSignature: null, + }); + } + + async function loadFromProgramMetadata(ctx: PluginContext) { + const programId = state.programIdInput.trim(); + const rpcUrl = getRpcUrl(ctx); + + if (!programId) { + setState({ fetchError: 'Enter a program id.', isFetchingIdl: false }); + return; + } + if (!rpcUrl) { + setState({ + fetchError: 'No RPC URL available (set devtools config.rpcUrl or ensure connector has an RPC URL).', + isFetchingIdl: false, + }); + return; + } + + const requestId = ++fetchRequestId; + setState({ isFetchingIdl: true, fetchError: null }); + + try { + const idl = await fetchProgramMetadataIdl({ programId, rpcUrl }); + if (requestId !== fetchRequestId) return; + setIdl(idl, { resetSelection: true }); + } catch (err) { + if (requestId !== fetchRequestId) return; + setIdl(null, { resetSelection: true }); + setState({ fetchError: err instanceof Error ? err.message : 'Failed to fetch IDL' }); + } finally { + if (requestId === fetchRequestId) setState({ isFetchingIdl: false }); + } + } + + async function loadFromAnchorIdl(ctx: PluginContext) { + const programIdStr = state.programIdInput.trim(); + const rpcUrl = getRpcUrl(ctx); + + if (!programIdStr) { + setState({ fetchError: 'Enter a program id.', isFetchingIdl: false }); + return; + } + if (!rpcUrl) { + setState({ + fetchError: 'No RPC URL available (set devtools config.rpcUrl or ensure connector has an RPC URL).', + isFetchingIdl: false, + }); + return; + } + + const requestId = ++fetchRequestId; + setState({ isFetchingIdl: true, fetchError: null }); + + try { + const [{ Connection, Keypair, PublicKey }, anchorMod] = await Promise.all([ + import('@solana/web3.js'), + import('@coral-xyz/anchor'), + ]); + + const { AnchorProvider, Program } = anchorMod as any; + + const connection = new Connection(rpcUrl, 'confirmed'); + + const snapshot = ctx.client.getSnapshot(); + const payerPubkey = snapshot.selectedAccount + ? new PublicKey(String(snapshot.selectedAccount)) + : Keypair.generate().publicKey; + + const walletForAnchor = { + publicKey: payerPubkey, + signTransaction: async (tx: any) => tx, + signAllTransactions: async (txs: any[]) => txs, + }; + + const provider = new AnchorProvider(connection, walletForAnchor, {}); + const programId = new PublicKey(programIdStr); + + const idl = await Program.fetchIdl(programId, provider); + if (!idl) throw new Error('Anchor IDL not found for this program.'); + + const normalized = (() => { + if (!isRecord(idl)) return idl; + + const maybeMetadata = isRecord((idl as any).metadata) + ? ((idl as any).metadata as Record) + : {}; + const rootVersion = typeof (idl as any).version === 'string' ? (idl as any).version : undefined; + const metaVersion = + typeof maybeMetadata.version === 'string' + ? (maybeMetadata.version as string) + : (rootVersion ?? 'unknown'); + + const metaSpec = typeof maybeMetadata.spec === 'string' ? (maybeMetadata.spec as string) : undefined; + + return { + ...(idl as any), + address: typeof (idl as any).address === 'string' ? (idl as any).address : programIdStr, + metadata: { + ...(maybeMetadata as any), + ...(metaSpec ? { spec: metaSpec } : {}), + ...(metaVersion ? { version: metaVersion } : {}), + }, + } as unknown; + })(); + + if (requestId !== fetchRequestId) return; + setIdl(normalized, { resetSelection: true }); + } catch (err) { + if (requestId !== fetchRequestId) return; + setIdl(null, { resetSelection: true }); + setState({ fetchError: err instanceof Error ? err.message : 'Failed to fetch Anchor IDL' }); + } finally { + if (requestId === fetchRequestId) setState({ isFetchingIdl: false }); + } + } + + function loadFromPaste() { + const raw = state.pasteJson.trim(); + if (!raw) { + setState({ fetchError: 'Paste an IDL JSON first.' }); + return; + } + try { + const parsed = JSON.parse(raw) as unknown; + setIdl(parsed, { resetSelection: true }); + } catch (err) { + setIdl(null, { resetSelection: true }); + setState({ fetchError: err instanceof Error ? err.message : 'Failed to parse JSON' }); + } + } + + async function loadFromFile(file: File) { + try { + const text = await readFileAsText(file); + const parsed = JSON.parse(text) as unknown; + setIdl(parsed, { resetSelection: true }); + } catch (err) { + setIdl(null, { resetSelection: true }); + setState({ fetchError: err instanceof Error ? err.message : 'Failed to load file' }); + } + } + + function getConnectedWalletState(ctx: PluginContext) { + const snapshot = ctx.client.getSnapshot(); + const wallet = snapshot.selectedWallet ?? null; + const selectedAccount = snapshot.selectedAccount ? String(snapshot.selectedAccount) : null; + const accountInfo = selectedAccount ? snapshot.accounts.find(a => String(a.address) === selectedAccount) : null; + const accountRaw = accountInfo?.raw ?? null; + + return { + snapshot, + wallet, + selectedAccount, + accountRaw, + }; + } + + async function executeSelectedInstruction(ctx: PluginContext, ixName: string) { + const { snapshot, wallet, accountRaw } = getConnectedWalletState(ctx); + if (!snapshot.connected || !wallet || !accountRaw) { + setState({ executeError: 'Connect a wallet first.', isExecuting: false }); + return; + } + + if (!state.idl || state.idlKind !== 'anchor') { + setState({ + executeError: 'No supported IDL loaded. Fetch or load a modern Anchor IDL first.', + isExecuting: false, + }); + return; + } + + const requestId = ++executeRequestId; + setState({ isExecuting: true, executeError: null, lastSignature: null }); + + try { + const clusterId = snapshot.cluster?.id ?? ctx.client.getCluster()?.id; + if (isMainnetCluster(clusterId)) { + const ok = confirm( + `You are on mainnet. This will send a real transaction.\n\nInstruction: ${ixName}\nProgram: ${state.programIdInput.trim()}\n\nContinue?`, + ); + if (!ok) { + setState({ isExecuting: false, executeError: 'Cancelled.' }); + return; + } + } + + const { tx } = await buildAnchorInstruction({ + ctx, + idl: state.idl as AnchorIdlLike, + ixName, + programIdInput: state.programIdInput, + accountValues: state.accountValues, + argValues: state.argValues, + }); + + // Serialize for Wallet Standard. + const serialized = tx.serialize({ requireAllSignatures: false, verifySignatures: false }); + + // Emit devtools-friendly lifecycle events (consumed by core.ts cache + Transactions tab). + ctx.client.emitEvent({ + type: 'transaction:preparing', + transaction: serialized, + size: serialized.length, + timestamp: new Date().toISOString(), + } as any); + + ctx.client.emitEvent({ + type: 'transaction:signing', + timestamp: new Date().toISOString(), + } as any); + + const sendFeature = (wallet as any).features?.['solana:signAndSendTransaction']; + if (!sendFeature || typeof sendFeature.signAndSendTransaction !== 'function') { + throw new Error('Wallet does not support solana:signAndSendTransaction.'); + } + + const inputBase: Record = { + account: accountRaw, + ...(snapshot.cluster ? { chain: snapshot.cluster.id } : {}), + }; + + let result: unknown; + try { + result = await sendFeature.signAndSendTransaction({ + ...inputBase, + transactions: [serialized], + }); + } catch { + result = await sendFeature.signAndSendTransaction({ + ...inputBase, + transaction: serialized, + }); + } + + // Extract signature (string or bytes) as base58 string. + const { getBase58Decoder } = await import('@solana/codecs'); + const base58Decoder = getBase58Decoder(); + + function signatureBytesToBase58(bytes: Uint8Array): string { + if (bytes.length !== 64) + throw new Error(`Invalid signature length: expected 64 bytes, got ${bytes.length}`); + return base58Decoder.decode(bytes); + } + + function extractSignatureString(value: unknown): string { + if (typeof value === 'string') return value; + if (value instanceof Uint8Array) return signatureBytesToBase58(value); + if (Array.isArray(value) && value.length > 0) return extractSignatureString(value[0]); + if (value && typeof value === 'object') { + const record = value as Record; + if ('signature' in record) return extractSignatureString(record.signature); + if (Array.isArray(record.signatures) && record.signatures.length > 0) + return extractSignatureString(record.signatures[0]); + } + throw new Error('Unexpected wallet response format for signAndSendTransaction'); + } + + const signature = extractSignatureString(result); + + ctx.client.emitEvent({ + type: 'transaction:sent', + signature, + timestamp: new Date().toISOString(), + } as any); + + if (requestId !== executeRequestId) return; + setState({ lastSignature: signature, isExecuting: false }); + } catch (err) { + if (requestId !== executeRequestId) return; + setState({ + executeError: err instanceof Error ? err.message : 'Failed to execute instruction', + isExecuting: false, + }); + } + } + + return { + id: 'idl', + name: 'IDL', + icon: ICONS.idl, + + render(el: HTMLElement, ctx: PluginContext) { + function renderContent() { + const snapshot = ctx.client.getSnapshot(); + const rpcUrl = getRpcUrl(ctx); + const instructions = state.idl ? getInstructionList(state.idl) : []; + const selectedIx = state.selectedIxName + ? (instructions.find(ix => ix.name === state.selectedIxName) ?? null) + : null; + + const clusterId = snapshot.cluster?.id ?? ctx.client.getCluster()?.id ?? null; + const walletAddress = snapshot.selectedAccount ? String(snapshot.selectedAccount) : null; + + let pdaByKey: Record = {}; + + // Explorer-like prefills: default args, known accounts, wallet accounts, PDAs. + if (state.idlKind === 'anchor' && state.idl && selectedIx) { + const ixName = selectedIx.name; + + // 1) Default argument values (best-effort, only fill empty fields). + for (const arg of selectedIx.args ?? []) { + if (!arg || typeof arg.name !== 'string') continue; + const key = getInputKey(ixName, arg.name); + const current = (state.argValues[key] ?? '').trim(); + if (current) continue; + const next = findDefaultValueForArgumentType(arg.type, walletAddress); + if (next) state.argValues[key] = next; + } + + // 2) Known + wallet account prefills (only fill empty fields). + const walkAccounts = (items: AnchorIdlInstructionAccountItem[], path: string[] = []) => { + for (const item of items) { + if (!item || typeof (item as any).name !== 'string') continue; + if (isAccountGroup(item)) { + walkAccounts(item.accounts ?? [], [...path, item.name]); + continue; + } + + const meta = item as AnchorIdlInstructionAccount; + const key = getInputKey(ixName, ...path, meta.name); + const current = (state.accountValues[key] ?? '').trim(); + if (current) continue; + + // Fixed address (if present) overrides other prefills. + if (typeof meta.address === 'string' && meta.address.trim()) { + state.accountValues[key] = meta.address.trim(); + state.autoFilled[key] = meta.address.trim(); + continue; + } + + const known = findKnownAddressForAccountName(meta.name); + if (known) { + state.accountValues[key] = known; + state.autoFilled[key] = known; + continue; + } + + if (!walletAddress) continue; + if (isPrefilledAccountName(meta.name)) continue; + + const hasPda = Boolean(meta.pda); + const shouldPrefillWallet = + Boolean(meta.isSigner) || isWalletAccountName(meta.name) || (meta.isMut && !hasPda); + + if (shouldPrefillWallet) { + state.accountValues[key] = walletAddress; + state.autoFilled[key] = walletAddress; + } + } + }; + + walkAccounts(selectedIx.accounts ?? []); + + // 3) PDA prefills (compute and fill when empty/auto-filled). + pdaByKey = computePdasForInstruction({ + accountValues: state.accountValues, + argValues: state.argValues, + idl: state.idl as AnchorIdlLike, + instruction: selectedIx, + ixName, + }); + + for (const [key, result] of Object.entries(pdaByKey)) { + if (!result.generated) continue; + + const current = (state.accountValues[key] ?? '').trim(); + const lastAuto = state.autoFilled[key]; + + const isEmpty = !current; + const neverTracked = lastAuto === undefined; + const wasAutoFilled = lastAuto !== undefined && current === lastAuto; + + const shouldAutoFill = isEmpty || wasAutoFilled || neverTracked; + if (shouldAutoFill && current !== result.generated) { + state.accountValues[key] = result.generated; + state.autoFilled[key] = result.generated; + } + } + } + + const idlHeader = (() => { + if (!state.idl) return `No IDL loaded`; + if (state.idlKind === 'anchor') return `Modern Anchor IDL`; + return `Unsupported IDL`; + })(); + + const fetchStatus = state.isFetchingIdl + ? `Fetching…` + : state.fetchError + ? `${escapeHtml(state.fetchError)}` + : ''; + + const executeStatus = state.isExecuting + ? `Executing…` + : state.executeError + ? `${escapeHtml(state.executeError)}` + : state.lastSignature + ? `Sent` + : ''; + + const sourceControls = (() => { + if (state.source === 'program-metadata' || state.source === 'anchor-idl') { + return ` + + `; + } + if (state.source === 'paste') { + return ` + + `; + } + return ` + + `; + })(); + + const pasteArea = + state.source === 'paste' + ? ` + + ` + : ''; + + const instructionsHtml = instructions.length + ? instructions + .map(ix => { + const selected = selectedIx?.name === ix.name; + return ` +
+
${escapeHtml(ix.name)}
+
+ ${(ix.accounts?.length ?? 0).toString()} accts + ${(ix.args?.length ?? 0).toString()} args +
+
+ `; + }) + .join('') + : `
${state.idl ? 'No instructions found.' : 'Load an IDL to begin.'}
`; + + const detailsHtml = (() => { + if (!state.idl) { + return ` +
+ Provide a program id, fetch IDL from chain (Program Metadata), or load a local IDL.\n + RPC: ${escapeHtml(rpcUrl ?? 'N/A')}\n + Wallet: ${escapeHtml(walletAddress ?? 'Not connected')} +
+ `; + } + + if (state.idlKind !== 'anchor') { + return ` +
+ This IDL format isn’t supported yet. For v1, devtools supports modern Anchor IDLs.\n + Tip: Use the “Paste JSON” source to load an Anchor IDL directly. +
+ `; + } + + if (!selectedIx) { + return `
Select an instruction.
`; + } + + const selectedIxName = selectedIx.name; + + const accountsMeta = (selectedIx.accounts ?? []) as AnchorIdlInstructionAccountItem[]; + const argsMeta = (selectedIx.args ?? []) as AnchorIdlInstructionArg[]; + + function countAccountLeaves(items: AnchorIdlInstructionAccountItem[]): number { + let count = 0; + for (const item of items) { + if (!item || typeof (item as any).name !== 'string') continue; + if (isAccountGroup(item)) count += countAccountLeaves(item.accounts ?? []); + else count += 1; + } + return count; + } + + function renderAccountItems(items: AnchorIdlInstructionAccountItem[], path: string[] = []): string { + if (!items.length) return ''; + + return items + .map(item => { + if (!item || typeof (item as any).name !== 'string') return ''; + + if (isAccountGroup(item)) { + const inner = renderAccountItems(item.accounts ?? [], [...path, item.name]); + if (!inner) return ''; + return ` +
+
${escapeHtml(item.name)}
+
${inner}
+
+ `; + } + + const meta = item as AnchorIdlInstructionAccount; + const key = getInputKey(selectedIxName, ...path, meta.name); + const value = state.accountValues[key] ?? ''; + + const isAuto = + state.autoFilled[key] !== undefined && value.trim() === state.autoFilled[key]; + const pdaInfo = pdaByKey[key]; + const isPda = Boolean(pdaInfo); + const isKnown = Boolean(findKnownAddressForAccountName(meta.name) || meta.address); + const isWalletValue = Boolean(walletAddress && value.trim() === walletAddress); + + const badges = [ + meta.optional ? `optional` : '', + meta.isSigner + ? `signer` + : `account`, + meta.isMut === true + ? `writable` + : `readonly`, + isPda ? `pda` : '', + isKnown ? `known` : '', + isWalletValue ? `wallet` : '', + isAuto ? `auto` : '', + ] + .filter(Boolean) + .join(' '); + + const showUseWallet = Boolean(walletAddress); + const pdaSeedsHtml = + isPda && pdaInfo?.seeds?.length + ? ` +
+ PDA seeds +
+ ${pdaInfo.seeds + .map(s => { + const v = s.value ?? 'N/A'; + return `
${escapeHtml(s.name)}
${escapeHtml(v)}
`; + }) + .join('')} +
+
+ ` + : ''; + + const readOnlyAttr = isPda && state.lockPdas && isAuto ? 'readonly' : ''; + + return ` +
+
+
${escapeHtml(meta.name)}
+
${badges}
+
+
+ + ${ + showUseWallet + ? `` + : '' + } +
+ ${pdaSeedsHtml} +
+ `; + }) + .join(''); + } + + const accountsLeafCount = countAccountLeaves(accountsMeta); + const accountsRows = accountsLeafCount + ? renderAccountItems(accountsMeta) + : `
No accounts.
`; + + const argsRows = argsMeta.length + ? argsMeta + .map(meta => { + const key = getInputKey(selectedIxName, meta.name); + const value = state.argValues[key] ?? ''; + const typePreview = isRecord(meta.type) + ? safeTypePreview(meta.type) + : String(meta.type ?? ''); + return ` +
+
+
${escapeHtml(meta.name)}
+
${escapeHtml(typePreview)}
+
+ +
+ `; + }) + .join('') + : `
No arguments.
`; + + const sigHtml = state.lastSignature + ? ` +
+
Last signature
+
+
signature
+
${escapeHtml(state.lastSignature)}
+
+
+ + + ${ICONS.external} Explorer + +
+
+ ` + : ''; + + return ` +
+
${escapeHtml(selectedIx.name)}
+
+ + + +
+
+ + ${executeStatus ? `
${executeStatus}
` : ''} + +
+ ${ICONS.chevronDown}Accounts (${accountsLeafCount}) +
${accountsRows}
+
+ +
+ ${ICONS.chevronDown}Arguments (${argsMeta.length}) +
${argsRows}
+
+ + ${sigHtml} + `; + })(); + + el.innerHTML = ` +
+ + +
+
+ ${idlHeader} + ${fetchStatus} + ${rpcUrl ? `RPC ${escapeHtml(rpcUrl.replace(/^https?:\/\//, ''))}` : `No RPC`} + ${walletAddress ? `Wallet ${escapeHtml(walletAddress.slice(0, 4))}…${escapeHtml(walletAddress.slice(-4))}` : `Wallet none`} + ${clusterId ? `${escapeHtml(clusterId)}` : ''} +
+
+ + ${renderCdtDropdown({ + id: 'cdt-idl-source', + ariaLabel: 'IDL source', + value: state.source, + options: [ + { value: 'anchor-idl', label: 'Anchor IDL' }, + { value: 'program-metadata', label: 'Program Metadata' }, + { value: 'paste', label: 'Paste JSON' }, + { value: 'file', label: 'Upload JSON' }, + ], + triggerClassName: 'cdt-select cdt-select-compact', + })} + ${sourceControls} +
+
+ + ${pasteArea ? `
${pasteArea}
` : ''} + +
+
+
Instructions
+
${instructionsHtml}
+
+
+ ${detailsHtml} +
+
+
+ `; + + function updatePdasInDom() { + if (state.idlKind !== 'anchor' || !state.idl || !selectedIx) return; + + const ixName = selectedIx.name; + const next = computePdasForInstruction({ + accountValues: state.accountValues, + argValues: state.argValues, + idl: state.idl as AnchorIdlLike, + instruction: selectedIx, + ixName, + }); + + // Build quick lookup for current account inputs. + const inputs = new Map(); + el.querySelectorAll('input[data-kind="account"][data-key]').forEach(input => { + const k = input.getAttribute('data-key'); + if (k) inputs.set(k, input); + }); + + for (const [key, result] of Object.entries(next)) { + if (!result.generated) continue; + + const current = (state.accountValues[key] ?? '').trim(); + const lastAuto = state.autoFilled[key]; + + const isEmpty = !current; + const neverTracked = lastAuto === undefined; + const wasAutoFilled = lastAuto !== undefined && current === lastAuto; + + const shouldAutoFill = isEmpty || wasAutoFilled; + if (!shouldAutoFill) continue; + + if (current !== result.generated) { + state.accountValues[key] = result.generated; + state.autoFilled[key] = result.generated; + + const input = inputs.get(key); + if (input) { + // Only mutate the DOM if the input still has the old value. + if (input.value.trim() === current) input.value = result.generated; + } + } + } + } + + // --- Wire up handlers --- + const programIdInput = el.querySelector('#cdt-program-id'); + programIdInput?.addEventListener('input', () => { + state.programIdInput = programIdInput.value; + }); + + const sourceDropdown = el.querySelector('#cdt-idl-source'); + sourceDropdown?.addEventListener('cdt-dropdown-change', e => { + const detail = (e as CustomEvent<{ id: string; value: string }>).detail; + const next = (detail.value as IdlSource) ?? 'program-metadata'; + setState({ source: next, fetchError: null }); + }); + + const fetchBtn = el.querySelector('#cdt-idl-fetch'); + fetchBtn?.addEventListener('click', () => { + if (state.source === 'anchor-idl') { + loadFromAnchorIdl(ctx); + return; + } + loadFromProgramMetadata(ctx); + }); + + const loadPasteBtn = el.querySelector('#cdt-idl-load-paste'); + loadPasteBtn?.addEventListener('click', () => { + loadFromPaste(); + }); + + const pasteEl = el.querySelector('#cdt-idl-paste'); + pasteEl?.addEventListener('input', () => { + state.pasteJson = pasteEl.value; + }); + + const fileEl = el.querySelector('#cdt-idl-file'); + fileEl?.addEventListener('change', async () => { + const file = fileEl.files?.[0]; + if (!file) return; + await loadFromFile(file); + }); + + el.querySelectorAll('.cdt-idl-item[data-ix]').forEach(item => { + item.addEventListener('click', () => { + const ix = item.getAttribute('data-ix'); + if (!ix) return; + setState({ selectedIxName: ix }); + }); + }); + + el.querySelectorAll('[data-kind="account"][data-key]').forEach(input => { + input.addEventListener('input', () => { + const key = input.getAttribute('data-key'); + if (!key) return; + state.accountValues = { ...state.accountValues, [key]: input.value }; + + const auto = state.autoFilled[key]; + if (auto !== undefined && input.value.trim() !== auto) { + const next = { ...state.autoFilled }; + delete next[key]; + state.autoFilled = next; + } + + updatePdasInDom(); + }); + }); + + el.querySelectorAll('[data-kind="arg"][data-key]').forEach(input => { + input.addEventListener('input', () => { + const key = input.getAttribute('data-key'); + if (!key) return; + state.argValues = { ...state.argValues, [key]: input.value }; + updatePdasInDom(); + }); + }); + + el.querySelectorAll('[data-use-wallet]').forEach(btn => { + btn.addEventListener('click', e => { + e.preventDefault(); + const key = btn.getAttribute('data-use-wallet'); + if (!key || !walletAddress) return; + state.accountValues = { ...state.accountValues, [key]: walletAddress }; + renderFn?.(); + }); + }); + + const resetBtn = el.querySelector('#cdt-idl-reset'); + resetBtn?.addEventListener('click', () => { + if (!selectedIx) return; + const prefix = `${selectedIx.name}.`; + + const nextAccounts = Object.fromEntries( + Object.entries(state.accountValues).filter(([k]) => !k.startsWith(prefix)), + ); + const nextArgs = Object.fromEntries( + Object.entries(state.argValues).filter(([k]) => !k.startsWith(prefix)), + ); + const nextAuto = Object.fromEntries( + Object.entries(state.autoFilled).filter(([k]) => !k.startsWith(prefix)), + ); + + setState({ + accountValues: nextAccounts, + argValues: nextArgs, + autoFilled: nextAuto, + executeError: null, + lastSignature: null, + }); + }); + + const pdaLockBtn = el.querySelector('#cdt-idl-toggle-pda-lock'); + pdaLockBtn?.addEventListener('click', () => { + setState({ lockPdas: !state.lockPdas }); + }); + + const execBtn = el.querySelector('#cdt-idl-exec'); + execBtn?.addEventListener('click', () => { + if (!selectedIx) return; + executeSelectedInstruction(ctx, selectedIx.name); + }); + + const copySigBtn = el.querySelector('#cdt-idl-copy-sig'); + copySigBtn?.addEventListener('click', async () => { + if (!state.lastSignature) return; + try { + await navigator.clipboard.writeText(state.lastSignature); + } catch { + // ignore + } + }); + } + + function safeTypePreview(type: Record): string { + if ('option' in type) return `option`; + if ('vec' in type) return `vec`; + if ('array' in type) return `array`; + if ('defined' in type) return `defined`; + return 'complex'; + } + + // Store render function for updates + renderFn = renderContent; + + // Subscribe to connector state changes (wallet, cluster, etc.) + unsubscribeClient = ctx.client.subscribe(() => renderContent()); + unsubscribeContext = ctx.subscribe(() => renderContent()); + + // Initial render + renderContent(); + }, + + destroy() { + unsubscribeClient?.(); + unsubscribeClient = undefined; + unsubscribeContext?.(); + unsubscribeContext = undefined; + renderFn = undefined; + }, + }; +} diff --git a/packages/devtools/src/plugins/idl/account-patterns.ts b/packages/devtools/src/plugins/idl/account-patterns.ts new file mode 100644 index 0000000..b46ff3f --- /dev/null +++ b/packages/devtools/src/plugins/idl/account-patterns.ts @@ -0,0 +1,62 @@ +import { generateNameVariations, normalizePatternKey } from './naming'; + +const KNOWN_PATTERN_TO_ADDRESS: Map = (() => { + const map = new Map(); + + function add(address: string, patterns: string[]) { + patterns.forEach(p => map.set(normalizePatternKey(p), address)); + } + + // Common program ids / sysvars + add('11111111111111111111111111111111', generateNameVariations(['system', 'program'], ['system'])); + add('TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA', generateNameVariations(['token', 'program'], ['token'])); + add('ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL', [ + ...generateNameVariations(['associated', 'token', 'program'], ['associatedToken', 'associated']), + ...generateNameVariations(['ata', 'program'], ['ata']), + ]); + add( + 'ComputeBudget111111111111111111111111111111', + generateNameVariations(['compute', 'budget', 'program'], ['computeBudget', 'computeBudgetProgram']), + ); + add('MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr', generateNameVariations(['memo', 'program'], ['memo'])); + + add('SysvarRent111111111111111111111111111111111', generateNameVariations(['rent'], ['rentSysvar', 'sysvarRent'])); + add( + 'SysvarC1ock11111111111111111111111111111111', + generateNameVariations(['clock'], ['clockSysvar', 'sysvarClock']), + ); + add( + 'Sysvar1nstructions1111111111111111111111111', + generateNameVariations(['instructions'], ['instructionsSysvar', 'sysvarInstructions']), + ); + + // Known non-program accounts + add( + 'So11111111111111111111111111111111111111112', + generateNameVariations(['wsol', 'mint'], ['wsol', 'wrappedSol', 'nativeMint']), + ); + + return map; +})(); + +export function findKnownAddressForAccountName(accountName: string): string | null { + return KNOWN_PATTERN_TO_ADDRESS.get(normalizePatternKey(accountName)) ?? null; +} + +export function isPrefilledAccountName(accountName: string): boolean { + return KNOWN_PATTERN_TO_ADDRESS.has(normalizePatternKey(accountName)); +} + +const WALLET_PATTERN_KEYS = new Set( + [ + ...generateNameVariations(['authority']), + ...generateNameVariations(['owner']), + ...generateNameVariations(['payer'], ['feePayer']), + ...generateNameVariations(['signer']), + ...generateNameVariations(['user']), + ].map(normalizePatternKey), +); + +export function isWalletAccountName(accountName: string): boolean { + return WALLET_PATTERN_KEYS.has(normalizePatternKey(accountName)); +} diff --git a/packages/devtools/src/plugins/idl/account-tree.ts b/packages/devtools/src/plugins/idl/account-tree.ts new file mode 100644 index 0000000..b8f01e3 --- /dev/null +++ b/packages/devtools/src/plugins/idl/account-tree.ts @@ -0,0 +1,6 @@ +import { isRecord } from './guards'; +import type { AnchorIdlInstructionAccountGroup, AnchorIdlInstructionAccountItem } from './types'; + +export function isAccountGroup(item: AnchorIdlInstructionAccountItem): item is AnchorIdlInstructionAccountGroup { + return isRecord(item) && Array.isArray((item as any).accounts); +} diff --git a/packages/devtools/src/plugins/idl/anchor-idl.ts b/packages/devtools/src/plugins/idl/anchor-idl.ts new file mode 100644 index 0000000..2eb1b9d --- /dev/null +++ b/packages/devtools/src/plugins/idl/anchor-idl.ts @@ -0,0 +1,19 @@ +import { isRecord } from './guards'; +import type { AnchorIdlInstruction, AnchorIdlLike } from './types'; + +export function isModernAnchorIdl(idl: unknown): idl is AnchorIdlLike { + if (!isRecord(idl)) return false; + const maybe = idl as AnchorIdlLike; + if (typeof maybe.address !== 'string') return false; + const hasMetadata = Boolean( + isRecord(maybe.metadata) && + (typeof maybe.metadata?.version === 'string' || typeof maybe.metadata?.spec === 'string'), + ); + if (!hasMetadata) return false; + return Array.isArray(maybe.instructions); +} + +export function getInstructionList(idl: unknown): AnchorIdlInstruction[] { + if (!isModernAnchorIdl(idl)) return []; + return (idl.instructions ?? []).filter(ix => Boolean(ix && typeof ix.name === 'string')); +} diff --git a/packages/devtools/src/plugins/idl/build-anchor-instruction.ts b/packages/devtools/src/plugins/idl/build-anchor-instruction.ts new file mode 100644 index 0000000..96df3c1 --- /dev/null +++ b/packages/devtools/src/plugins/idl/build-anchor-instruction.ts @@ -0,0 +1,264 @@ +import type { PluginContext } from '../../types'; +import { getRpcUrl } from '../../utils/dom'; +import { isAccountGroup } from './account-tree'; +import { findKnownAddressForAccountName, isWalletAccountName } from './account-patterns'; +import { isRecord } from './guards'; +import { getInputKey } from './keys'; +import type { + AnchorIdlInstructionAccount, + AnchorIdlInstructionAccountItem, + AnchorIdlInstructionArg, + AnchorIdlLike, +} from './types'; + +export interface BuildAnchorInstructionParams { + ctx: PluginContext; + idl: AnchorIdlLike; + ixName: string; + programIdInput: string; + accountValues: Record; + argValues: Record; +} + +export async function buildAnchorInstruction({ + ctx, + idl, + ixName, + programIdInput, + accountValues, + argValues, +}: BuildAnchorInstructionParams): Promise<{ tx: import('@solana/web3.js').Transaction }> { + const rpcUrl = getRpcUrl(ctx); + if (!rpcUrl) throw new Error('No RPC URL available.'); + + const snapshot = ctx.client.getSnapshot(); + const selectedAccount = snapshot.selectedAccount ? String(snapshot.selectedAccount) : null; + if (!snapshot.connected || !selectedAccount) throw new Error('Wallet not connected.'); + + const ixDef = (idl.instructions ?? []).find(ix => ix.name === ixName); + if (!ixDef) throw new Error(`Instruction "${ixName}" not found in IDL.`); + + // Dynamic imports to keep the plugin lightweight at module init. + const [{ Connection, PublicKey, Transaction }, anchorMod, bnMod] = await Promise.all([ + import('@solana/web3.js'), + import('@coral-xyz/anchor'), + import('bn.js'), + ]); + + const BN = (bnMod as any).default ?? (bnMod as any); + const { AnchorProvider, Program } = anchorMod as any; + + const programIdStr = programIdInput.trim() || idl.address || ''; + if (!programIdStr) throw new Error('Program id is required.'); + + const programId = new PublicKey(programIdStr); + + // Anchor's provider wallet adapter (we only need publicKey for instruction building). + const walletPubkey = new PublicKey(selectedAccount); + const walletForAnchor = { + publicKey: walletPubkey, + signTransaction: async (tx: any) => tx, + signAllTransactions: async (txs: any[]) => txs, + }; + + const connection = new Connection(rpcUrl, 'confirmed'); + const provider = new AnchorProvider(connection, walletForAnchor, {}); + const program = new Program(idl as any, programId, provider); + + function parseArrayInput(value: unknown): unknown[] { + if (Array.isArray(value)) return value; + if (typeof value === 'string') { + const trimmed = value.trim(); + if (!trimmed) return []; + try { + const parsed = JSON.parse(trimmed); + if (Array.isArray(parsed)) return parsed; + } catch { + // fallthrough + } + return trimmed + .split(',') + .map(s => s.trim()) + .filter(Boolean); + } + return []; + } + + function parseArgValue(raw: string, type: unknown): unknown { + // Handle option + if (isRecord(type) && 'option' in type) { + if (raw.trim() === '') return null; + return parseArgValue(raw, (type as any).option); + } + + function hexToBytes(hex: string): Uint8Array { + const clean = hex.length % 2 === 0 ? hex : `0${hex}`; + const bytes = new Uint8Array(clean.length / 2); + for (let i = 0; i < bytes.length; i++) { + bytes[i] = Number.parseInt(clean.slice(i * 2, i * 2 + 2), 16); + } + return bytes; + } + + function base64ToBytes(base64: string): Uint8Array { + const binary = atob(base64); + const bytes = new Uint8Array(binary.length); + for (let i = 0; i < binary.length; i++) { + bytes[i] = binary.charCodeAt(i); + } + return bytes; + } + + // Primitives + if (typeof type === 'string') { + const trimmed = raw.trim(); + + if ( + type === 'u8' || + type === 'u16' || + type === 'u32' || + type === 'u64' || + type === 'u128' || + type === 'i8' || + type === 'i16' || + type === 'i32' || + type === 'i64' || + type === 'i128' + ) { + if (!trimmed) throw new Error('Missing integer argument'); + const base = trimmed.startsWith('0x') ? 16 : 10; + const value = trimmed.startsWith('0x') ? trimmed.slice(2) : trimmed; + return new BN(value, base); + } + + if (type === 'bool') { + if (!trimmed) throw new Error('Missing boolean argument'); + return trimmed === 'true' || trimmed === '1'; + } + + if (type === 'string') { + // Allow empty string + return raw; + } + + if (type === 'pubkey' || type === 'publicKey') { + if (!trimmed) throw new Error('Missing pubkey argument'); + return new PublicKey(trimmed); + } + + if (type === 'bytes') { + if (trimmed.startsWith('0x')) return hexToBytes(trimmed.slice(2)); + if (trimmed.startsWith('base64:')) return base64ToBytes(trimmed.slice('base64:'.length)); + return new TextEncoder().encode(raw); + } + + return raw; + } + + // vec + if (isRecord(type) && 'vec' in type) { + const items = parseArrayInput(raw); + return items.map(item => parseArgValue(String(item), (type as any).vec)); + } + + // array + if (isRecord(type) && 'array' in type && Array.isArray((type as any).array) && (type as any).array.length) { + const items = parseArrayInput(raw); + return items.map(item => parseArgValue(String(item), (type as any).array[0])); + } + + // defined types: accept JSON object as a best-effort (Anchor expects object shapes) + if (isRecord(type) && 'defined' in type) { + const trimmed = raw.trim(); + if (!trimmed) throw new Error('Missing defined-type argument'); + try { + return JSON.parse(trimmed); + } catch { + return raw; + } + } + + return raw; + } + + const accountsMeta = (ixDef.accounts ?? []) as AnchorIdlInstructionAccountItem[]; + const argsMeta = (ixDef.args ?? []) as AnchorIdlInstructionArg[]; + + function buildAccountsObject(items: AnchorIdlInstructionAccountItem[], path: string[] = []): Record { + const result: Record = {}; + + for (const item of items) { + if (!item || typeof (item as any).name !== 'string') continue; + + if (isAccountGroup(item)) { + result[item.name] = buildAccountsObject(item.accounts ?? [], [...path, item.name]); + continue; + } + + const meta = item as AnchorIdlInstructionAccount; + const key = getInputKey(ixName, ...path, meta.name); + const raw = accountValues[key]?.trim() ?? ''; + + if (!raw) { + // Priority 1: fixed/known addresses + const fixed = typeof meta.address === 'string' ? meta.address : null; + const known = fixed ?? findKnownAddressForAccountName(meta.name); + if (known) { + result[meta.name] = new PublicKey(known); + continue; + } + + // Priority 2: wallet prefill (signers / common wallet-controlled accounts) + const hasPda = Boolean(meta.pda); + const shouldPrefillWallet = + Boolean(meta.isSigner) || isWalletAccountName(meta.name) || (meta.isMut && !hasPda); + if (shouldPrefillWallet) { + result[meta.name] = walletPubkey; + continue; + } + + // Priority 3: optional accounts + if (meta.optional) { + result[meta.name] = null; + continue; + } + + throw new Error(`Missing account "${meta.name}".`); + } + + result[meta.name] = new PublicKey(raw); + } + + return result; + } + + const accounts = buildAccountsObject(accountsMeta); + + const args = argsMeta.map(arg => { + const key = getInputKey(ixName, arg.name); + const raw = argValues[key] ?? ''; + + // For option types, allow blank -> null. + if (isRecord(arg.type) && 'option' in arg.type && raw.trim() === '') return null; + if (typeof arg.type === 'string' && arg.type === 'string') return raw; + if (raw.trim() === '') throw new Error(`Missing argument "${arg.name}".`); + return parseArgValue(raw, arg.type); + }); + + if (!(ixName in (program.methods as any))) { + const available = Object.keys((program.methods as any) ?? {}); + throw new Error(`Instruction "${ixName}" not found. Available: ${available.slice(0, 30).join(', ')}`); + } + + const ixBuilder = (program.methods as any)[ixName]; + const ix = await ixBuilder(...args) + .accounts(accounts) + .instruction(); + + const tx = new Transaction().add(ix); + tx.feePayer = walletForAnchor.publicKey; + const { blockhash } = await connection.getLatestBlockhash(); + tx.recentBlockhash = blockhash; + + return { tx }; +} diff --git a/packages/devtools/src/plugins/idl/default-values.ts b/packages/devtools/src/plugins/idl/default-values.ts new file mode 100644 index 0000000..db36b37 --- /dev/null +++ b/packages/devtools/src/plugins/idl/default-values.ts @@ -0,0 +1,42 @@ +import { isRecord } from './guards'; + +const DEFAULT_ARG_VALUES_PER_TYPE: Record = { + bool: 'false', + u8: '1', + u16: '1', + u32: '1', + u64: '1', + u128: '1', + i8: '1', + i16: '1', + i32: '1', + i64: '1', + i128: '1', + f32: '1.0', + f64: '1.0', + string: 'default', + bytes: 'data', + pubkey: '11111111111111111111111111111111', + publicKey: '11111111111111111111111111111111', +} as const; + +export function findDefaultValueForArgumentType(type: unknown, walletAddress: string | null): string { + if (typeof type === 'string') { + if (type === 'pubkey' || type === 'publicKey') return walletAddress ?? DEFAULT_ARG_VALUES_PER_TYPE[type]; + return DEFAULT_ARG_VALUES_PER_TYPE[type] ?? ''; + } + + if (!isRecord(type)) return ''; + + if ('vec' in type) return findDefaultValueForArgumentType((type as any).vec, walletAddress); + if ('option' in type) return findDefaultValueForArgumentType((type as any).option, walletAddress); + if ('coption' in type) return findDefaultValueForArgumentType((type as any).coption, walletAddress); + if ('array' in type && Array.isArray((type as any).array) && (type as any).array.length >= 1) { + const [innerType, length] = (type as any).array as [unknown, unknown]; + const innerDefault = findDefaultValueForArgumentType(innerType, walletAddress); + if (typeof length === 'number' && length > 1) return Array.from({ length }, () => innerDefault).join(', '); + return innerDefault; + } + + return ''; +} diff --git a/packages/devtools/src/plugins/idl/file.ts b/packages/devtools/src/plugins/idl/file.ts new file mode 100644 index 0000000..4c4c375 --- /dev/null +++ b/packages/devtools/src/plugins/idl/file.ts @@ -0,0 +1,8 @@ +export async function readFileAsText(file: File): Promise { + return await new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.onerror = () => reject(reader.error ?? new Error('Failed to read file')); + reader.onload = () => resolve(String(reader.result ?? '')); + reader.readAsText(file); + }); +} diff --git a/packages/devtools/src/plugins/idl/guards.ts b/packages/devtools/src/plugins/idl/guards.ts new file mode 100644 index 0000000..55ba67b --- /dev/null +++ b/packages/devtools/src/plugins/idl/guards.ts @@ -0,0 +1,3 @@ +export function isRecord(value: unknown): value is Record { + return Boolean(value) && typeof value === 'object' && !Array.isArray(value); +} diff --git a/packages/devtools/src/plugins/idl/keys.ts b/packages/devtools/src/plugins/idl/keys.ts new file mode 100644 index 0000000..bf5b926 --- /dev/null +++ b/packages/devtools/src/plugins/idl/keys.ts @@ -0,0 +1,3 @@ +export function getInputKey(ixName: string, ...path: string[]): string { + return [ixName, ...path].join('.'); +} diff --git a/packages/devtools/src/plugins/idl/naming.ts b/packages/devtools/src/plugins/idl/naming.ts new file mode 100644 index 0000000..18aff29 --- /dev/null +++ b/packages/devtools/src/plugins/idl/naming.ts @@ -0,0 +1,38 @@ +export function generateNameVariations(words: string[], additionalKeys: string[] = []): string[] { + return [...generateConventions(words), ...additionalKeys]; +} + +export function generateConventions(words: string[]): string[] { + const lowerWords = words.map(w => w.toLowerCase()); + const capitalize = (word: string) => word.charAt(0).toUpperCase() + word.slice(1); + + return [ + lowerWords[0] + lowerWords.slice(1).map(capitalize).join(''), // camelCase + lowerWords.join('_'), // snake_case + lowerWords.join(' '), // space separated + lowerWords.join(''), // concatenated + ]; +} + +export function normalizePatternKey(value: string): string { + return value.toLowerCase().replace(/[^a-z0-9]/g, ''); +} + +export function camelCase(value: string): string { + const trimmed = value.trim(); + if (!trimmed) return ''; + + // If it already looks like camelCase / PascalCase (no separators), keep internal capitals. + if (!/[\s._-]/.test(trimmed) && /[A-Z]/.test(trimmed)) { + return trimmed.charAt(0).toLowerCase() + trimmed.slice(1); + } + + const parts = trimmed.split(/[^a-zA-Z0-9]+/g).filter(Boolean); + if (!parts.length) return ''; + const head = parts[0].toLowerCase(); + const tail = parts + .slice(1) + .map(p => p.charAt(0).toUpperCase() + p.slice(1).toLowerCase()) + .join(''); + return `${head}${tail}`; +} diff --git a/packages/devtools/src/plugins/idl/pda.ts b/packages/devtools/src/plugins/idl/pda.ts new file mode 100644 index 0000000..94232d0 --- /dev/null +++ b/packages/devtools/src/plugins/idl/pda.ts @@ -0,0 +1,344 @@ +import { PublicKey } from '@solana/web3.js'; +import { isAccountGroup } from './account-tree'; +import { isRecord } from './guards'; +import { getInputKey } from './keys'; +import { camelCase } from './naming'; +import type { + AnchorIdlInstruction, + AnchorIdlInstructionAccount, + AnchorIdlInstructionAccountItem, + AnchorIdlInstructionArg, + AnchorIdlLike, +} from './types'; + +export interface PdaGenerationResult { + generated: string | null; + seeds: Array<{ name: string; value: string | null }>; +} + +type IdlSeed = { kind: 'const' | 'arg' | 'account'; path?: string; value?: number[] } & Record; + +function toHex(bytes: Uint8Array): string { + return Array.from(bytes) + .map(b => b.toString(16).padStart(2, '0')) + .join(''); +} + +const INTEGER_SIZE_MAP: Record = { + i128: 16, + i16: 2, + i32: 4, + i64: 8, + i8: 1, + u128: 16, + u16: 2, + u32: 4, + u64: 8, + u8: 1, +} as const; + +function bigintToLeBytes(value: bigint, byteLength: number): Uint8Array { + // Two's complement for negative values (best-effort for signed ints) + const mod = 1n << BigInt(byteLength * 8); + let v = value; + if (v < 0n) v = mod + v; + + const out = new Uint8Array(byteLength); + for (let i = 0; i < byteLength; i++) { + out[i] = Number(v & 0xffn); + v >>= 8n; + } + return out; +} + +function convertArgToSeedBytes(value: string, type: unknown): Uint8Array | null { + if (!value || typeof type !== 'string') return null; + + const size = INTEGER_SIZE_MAP[type]; + if (size !== undefined) { + try { + const trimmed = value.trim(); + const bigintValue = BigInt(trimmed); + return bigintToLeBytes(bigintValue, size); + } catch { + return null; + } + } + + if (type === 'pubkey' || type === 'publicKey') { + try { + return new PublicKey(value).toBytes(); + } catch { + return null; + } + } + + if (type === 'string' || type === 'bytes') { + return new TextEncoder().encode(value); + } + + return null; +} + +function getStringFromPath(root: unknown, path: string): string | null { + if (!path) return null; + + // Try exact key first. + if (isRecord(root) && typeof root[path] === 'string') return String(root[path]); + + // Try camelCase variant. + const camel = camelCase(path); + if (isRecord(root) && typeof root[camel] === 'string') return String(root[camel]); + + // Try dot path traversal. + const parts = path.split('.').filter(Boolean); + if (parts.length > 1 && isRecord(root)) { + let current: unknown = root; + for (const part of parts) { + if (!isRecord(current)) return null; + const next = current[part] ?? current[camelCase(part)]; + current = next; + } + return typeof current === 'string' ? current : null; + } + + return null; +} + +function buildArgsMap( + ixName: string, + args: AnchorIdlInstructionArg[], + argValues: Record, +): Record { + const out: Record = {}; + for (const arg of args) { + if (!arg || typeof arg.name !== 'string') continue; + const key = getInputKey(ixName, arg.name); + const raw = (argValues[key] ?? '').trim(); + if (!raw) continue; + + out[arg.name] = raw; + out[camelCase(arg.name)] = raw; + } + return out; +} + +function buildAccountsValueTree( + ixName: string, + items: AnchorIdlInstructionAccountItem[], + accountValues: Record, + path: string[] = [], +): Record> { + const out: Record = {}; + + for (const item of items) { + if (!item || typeof (item as any).name !== 'string') continue; + + if (isAccountGroup(item)) { + out[item.name] = buildAccountsValueTree(ixName, item.accounts ?? [], accountValues, [...path, item.name]); + continue; + } + + const meta = item as AnchorIdlInstructionAccount; + const key = getInputKey(ixName, ...path, meta.name); + const value = (accountValues[key] ?? '').trim(); + if (value) { + out[meta.name] = value; + out[camelCase(meta.name)] = value; + } + } + + return out; +} + +function buildSeedsWithInfo( + seeds: IdlSeed[], + args: Record, + accountsTree: Record, + instruction: AnchorIdlInstruction, +): { buffers: Uint8Array[] | null; info: Array<{ name: string; value: string | null }> } { + const seedBuffers: Uint8Array[] = []; + const seedInfo: Array<{ name: string; value: string | null }> = []; + let buffersValid = true; + + function findArgDef(seedPath: string): AnchorIdlInstructionArg | null { + const camel = camelCase(seedPath); + return ( + (instruction.args ?? []).find(a => a.name === seedPath) ?? + (instruction.args ?? []).find(a => camelCase(a.name) === camel) ?? + null + ); + } + + for (const seed of seeds) { + if (!seed || typeof seed.kind !== 'string') { + seedInfo.push({ name: 'unknown', value: null }); + buffersValid = false; + continue; + } + + if (seed.kind === 'const') { + const bytes = new Uint8Array(Array.isArray(seed.value) ? seed.value : []); + const hex = `0x${toHex(bytes)}`; + seedBuffers.push(bytes); + seedInfo.push({ name: hex, value: hex }); + continue; + } + + if (seed.kind === 'arg') { + const path = typeof seed.path === 'string' ? seed.path : ''; + const value = args[path] ?? args[camelCase(path)] ?? null; + seedInfo.push({ name: camelCase(path) || path || 'arg', value }); + + if (!value) { + buffersValid = false; + continue; + } + + const argDef = findArgDef(path); + const buffer = argDef ? convertArgToSeedBytes(value, argDef.type) : null; + if (buffer) seedBuffers.push(buffer); + else buffersValid = false; + continue; + } + + if (seed.kind === 'account') { + const path = typeof seed.path === 'string' ? seed.path : ''; + const value = getStringFromPath(accountsTree, path); + seedInfo.push({ name: camelCase(path) || path || 'account', value }); + + if (!value) { + buffersValid = false; + continue; + } + + try { + seedBuffers.push(new PublicKey(value).toBytes()); + } catch { + buffersValid = false; + } + continue; + } + + seedInfo.push({ name: 'unknown', value: null }); + buffersValid = false; + } + + return { buffers: buffersValid ? seedBuffers : null, info: seedInfo }; +} + +function resolveDerivationProgramId( + defaultProgramId: PublicKey, + pdaProgram: IdlSeed | undefined, + context: { args: Record; accounts: Record }, +): PublicKey | null { + if (!pdaProgram) return defaultProgramId; + + if (pdaProgram.kind === 'const') { + const bytes = new Uint8Array(Array.isArray(pdaProgram.value) ? pdaProgram.value : []); + try { + return new PublicKey(bytes); + } catch { + return null; + } + } + + const path = typeof pdaProgram.path === 'string' ? pdaProgram.path : ''; + + if (pdaProgram.kind === 'arg') { + const value = context.args[path] ?? context.args[camelCase(path)]; + if (!value) return null; + try { + return new PublicKey(value); + } catch { + return null; + } + } + + if (pdaProgram.kind === 'account') { + const value = getStringFromPath(context.accounts, path); + if (!value) return null; + try { + return new PublicKey(value); + } catch { + return null; + } + } + + return defaultProgramId; +} + +export interface ComputePdasForInstructionParams { + idl: AnchorIdlLike; + instruction: AnchorIdlInstruction; + ixName: string; + argValues: Record; + accountValues: Record; +} + +export function computePdasForInstruction( + params: ComputePdasForInstructionParams, +): Record { + const { idl, instruction, ixName, argValues, accountValues } = params; + + const results: Record = {}; + + const programIdStr = typeof idl.address === 'string' ? idl.address : null; + if (!programIdStr) return results; + + let defaultProgramId: PublicKey; + try { + defaultProgramId = new PublicKey(programIdStr); + } catch { + return results; + } + + const args = buildArgsMap(ixName, instruction.args ?? [], argValues); + const accountsTree = buildAccountsValueTree(ixName, instruction.accounts ?? [], accountValues); + + function walk(items: AnchorIdlInstructionAccountItem[], path: string[]) { + for (const item of items) { + if (!item || typeof (item as any).name !== 'string') continue; + + if (isAccountGroup(item)) { + walk(item.accounts ?? [], [...path, item.name]); + continue; + } + + const meta = item as AnchorIdlInstructionAccount; + const pda = (meta as any).pda as any; + + // Skip if pda is absent or is just a boolean (older Anchor versions). + if (!pda || typeof pda === 'boolean' || !isRecord(pda) || !Array.isArray(pda.seeds)) continue; + + const seeds = pda.seeds as IdlSeed[]; + const { buffers, info } = buildSeedsWithInfo(seeds, args, accountsTree, instruction); + + const derivationProgramId = resolveDerivationProgramId( + defaultProgramId, + pda.program as IdlSeed | undefined, + { + args, + accounts: accountsTree, + }, + ); + + let generated: string | null = null; + if (buffers && derivationProgramId) { + try { + // PublicKey expects Buffer[], but Uint8Array works at runtime; cast for TS. + const [pdaPk] = (PublicKey as any).findProgramAddressSync(buffers as any, derivationProgramId); + generated = pdaPk.toBase58(); + } catch { + generated = null; + } + } + + const key = getInputKey(ixName, ...path, meta.name); + results[key] = { generated, seeds: info }; + } + } + + walk(instruction.accounts ?? [], []); + return results; +} diff --git a/packages/devtools/src/plugins/idl/styles.ts b/packages/devtools/src/plugins/idl/styles.ts new file mode 100644 index 0000000..94dbc3c --- /dev/null +++ b/packages/devtools/src/plugins/idl/styles.ts @@ -0,0 +1,202 @@ +export const IDL_STYLES = ` + .cdt-idl { display:flex; flex-direction: column; height: 100%; } + + .cdt-idl-toolbar { + display:flex; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 8px 12px; + border-bottom: 1px solid var(--cdt-border); + background: var(--cdt-bg-panel); + flex-wrap: wrap; + } + + .cdt-idl-toolbar-left { display:flex; align-items:center; gap: 8px; flex-wrap: wrap; } + .cdt-idl-toolbar-right { display:flex; align-items:center; gap: 8px; flex-wrap: wrap; } + + .cdt-idl-body { + display: grid; + grid-template-columns: 1fr 1fr; + min-height: 0; + flex: 1; + } + + @media (max-width: 720px) { + .cdt-idl-body { grid-template-columns: 1fr; grid-template-rows: 1fr 1fr; } + } + + .cdt-idl-pane { + min-width: 0; + overflow: auto; + border-right: 1px solid var(--cdt-border); + } + + @media (max-width: 720px) { + .cdt-idl-pane { border-right: none; border-bottom: 1px solid var(--cdt-border); } + } + + .cdt-idl-details { min-width: 0; overflow: auto; padding: 12px; } + + .cdt-section-title { + font-size: 11px; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--cdt-text-muted); + padding: 10px 12px; + border-bottom: 1px solid var(--cdt-border); + background: var(--cdt-bg-panel); + } + + .cdt-idl-item { + display:flex; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 10px 12px; + border-bottom: 1px solid var(--cdt-border); + cursor: pointer; + transition: background 0.1s; + } + .cdt-idl-item:hover { background: var(--cdt-bg-hover); } + .cdt-idl-item[data-selected="true"] { background: var(--cdt-bg-active); } + .cdt-idl-item-name { font-family: ui-monospace, monospace; font-size: 12px; color: var(--cdt-text); } + .cdt-idl-item-meta { display:flex; gap: 6px; flex-wrap: wrap; justify-content: flex-end; } + + .cdt-input { + width: 260px; + max-width: 100%; + padding: 6px 10px; + border-radius: 8px; + border: 1px solid var(--cdt-border); + background: var(--cdt-bg); + color: var(--cdt-text); + font-size: 12px; + font-family: ui-monospace, monospace; + } + + .cdt-input[readonly] { + opacity: 0.85; + background: var(--cdt-bg-panel); + border-style: dashed; + } + + .cdt-textarea { + width: min(820px, 100%); + min-height: 120px; + padding: 8px 10px; + border-radius: 10px; + border: 1px solid var(--cdt-border); + background: var(--cdt-bg); + color: var(--cdt-text); + font-size: 11px; + font-family: ui-monospace, monospace; + } + + .cdt-pill { + display: inline-flex; + align-items: center; + padding: 2px 8px; + border-radius: 999px; + font-size: 10px; + border: 1px solid var(--cdt-border); + background: var(--cdt-bg); + color: var(--cdt-text-muted); + } + .cdt-pill.warn { color: var(--cdt-warning); border-color: color-mix(in srgb, var(--cdt-warning) 40%, var(--cdt-border)); } + .cdt-pill.info { color: var(--cdt-info); border-color: color-mix(in srgb, var(--cdt-info) 40%, var(--cdt-border)); } + .cdt-pill.success { color: var(--cdt-success); border-color: color-mix(in srgb, var(--cdt-success) 40%, var(--cdt-border)); } + + .cdt-empty { + padding: 18px; + color: var(--cdt-text-muted); + font-size: 12px; + white-space: pre-wrap; + } + + .cdt-details-header { + display:flex; + align-items: center; + justify-content: space-between; + gap: 10px; + margin-bottom: 10px; + } + + .cdt-details-title { font-size: 13px; font-weight: 700; color: var(--cdt-text); } + + .cdt-details-section { + margin-top: 10px; + border: 1px solid var(--cdt-border); + border-radius: 12px; + background: var(--cdt-bg-panel); + overflow: hidden; + } + + .cdt-details-section summary { + cursor: pointer; + padding: 10px 12px; + font-size: 12px; + font-weight: 700; + color: var(--cdt-text); + list-style: none; + display:flex; + align-items:center; + gap: 6px; + } + .cdt-details-section summary::-webkit-details-marker { display:none; } + + .cdt-chevron { + display: inline-flex; + width: 14px; + height: 14px; + transition: transform 0.15s ease; + transform: rotate(-90deg); + flex-shrink: 0; + } + .cdt-details-section[open] .cdt-chevron { transform: rotate(0deg); } + .cdt-details-section[open] summary { border-bottom: 1px solid var(--cdt-border); } + + .cdt-details-section-content { padding: 10px 12px; background: var(--cdt-bg); } + + .cdt-field-group { + margin-top: 10px; + padding: 10px; + border: 1px dashed var(--cdt-border); + border-radius: 12px; + background: var(--cdt-bg-panel); + } + + .cdt-field-group-title { + font-size: 11px; + font-weight: 700; + letter-spacing: 0.06em; + text-transform: uppercase; + color: var(--cdt-text-muted); + margin-bottom: 8px; + } + + .cdt-field-group-body { } + + .cdt-field { padding: 10px; border: 1px solid var(--cdt-border); border-radius: 10px; background: var(--cdt-bg); } + .cdt-field + .cdt-field { margin-top: 10px; } + .cdt-field-head { display:flex; align-items:center; justify-content: space-between; gap: 10px; margin-bottom: 8px; } + .cdt-field-name { font-size: 12px; color: var(--cdt-text); font-weight: 650; font-family: ui-monospace, monospace; } + .cdt-field-badges { display:flex; gap: 6px; flex-wrap: wrap; justify-content:flex-end; } + .cdt-field-input-row { display:flex; gap: 6px; align-items:center; } + + .cdt-status-row { margin-bottom: 8px; display:flex; justify-content:flex-end; } + + .cdt-card { + margin-top: 10px; + border: 1px solid var(--cdt-border); + border-radius: 12px; + background: var(--cdt-bg-panel); + padding: 10px 12px; + } + .cdt-card-title { font-size: 12px; font-weight: 700; color: var(--cdt-text); margin-bottom: 8px; } + + .cdt-kv { display:grid; grid-template-columns: 120px 1fr; gap: 6px 12px; font-size: 11px; } + .cdt-k { color: var(--cdt-text-muted); } + .cdt-v { color: var(--cdt-text); font-family: ui-monospace, monospace; word-break: break-all; } +`; diff --git a/packages/devtools/src/plugins/idl/types.ts b/packages/devtools/src/plugins/idl/types.ts new file mode 100644 index 0000000..aafb73b --- /dev/null +++ b/packages/devtools/src/plugins/idl/types.ts @@ -0,0 +1,61 @@ +export type IdlSource = 'program-metadata' | 'anchor-idl' | 'paste' | 'file'; + +export interface AnchorIdlInstructionAccount { + name: string; + isMut?: boolean; + isSigner?: boolean; + optional?: boolean; + /** Optional PDA definition (Anchor >= 0.30) */ + pda?: unknown; + /** Optional fixed address (some IDLs include this) */ + address?: string; +} + +export interface AnchorIdlInstructionAccountGroup { + name: string; + accounts: AnchorIdlInstructionAccountItem[]; +} + +export type AnchorIdlInstructionAccountItem = AnchorIdlInstructionAccount | AnchorIdlInstructionAccountGroup; + +export interface AnchorIdlInstructionArg { + name: string; + type: unknown; +} + +export interface AnchorIdlInstruction { + name: string; + accounts?: AnchorIdlInstructionAccountItem[]; + args?: AnchorIdlInstructionArg[]; +} + +export interface AnchorIdlLike { + address?: string; + metadata?: { name?: string; version?: string; spec?: string }; + instructions?: AnchorIdlInstruction[]; +} + +export interface IdlPluginState { + source: IdlSource; + programIdInput: string; + pasteJson: string; + isFetchingIdl: boolean; + fetchError: string | null; + idl: unknown | null; + idlKind: 'anchor' | 'unsupported' | null; + selectedIxName: string | null; + /** Keyed as `${ixName}.${fieldName}` */ + accountValues: Record; + /** Keyed as `${ixName}.${argName}` */ + argValues: Record; + /** + * Tracks last auto-filled values, keyed by field key. + * If a user edits a field to something else, we stop auto-updating it. + */ + autoFilled: Record; + /** When true, PDA fields auto-filled by devtools are read-only. */ + lockPdas: boolean; + isExecuting: boolean; + executeError: string | null; + lastSignature: string | null; +} diff --git a/packages/devtools/src/plugins/overview.ts b/packages/devtools/src/plugins/overview.ts index cde18a3..c5116f0 100644 --- a/packages/devtools/src/plugins/overview.ts +++ b/packages/devtools/src/plugins/overview.ts @@ -73,27 +73,17 @@ function getPersistenceInfo(autoConnect: boolean): PersistenceInfo { } } -// Clear all connector storage -function clearAllStorage(): void { - if (typeof window === 'undefined') return; - - try { - localStorage.removeItem(STORAGE_KEYS.account); - localStorage.removeItem(STORAGE_KEYS.wallet); - localStorage.removeItem(STORAGE_KEYS.cluster); - } catch { - // Ignore errors - } -} - // Check RPC health by getting current slot async function checkRpcHealth(rpcUrl: string): Promise { const start = performance.now(); + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 8000); try { const response = await fetch(rpcUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, + signal: controller.signal, body: JSON.stringify({ jsonrpc: '2.0', id: 1, @@ -115,11 +105,19 @@ async function checkRpcHealth(rpcUrl: string): Promise { return { status, latency, slot }; } catch (err) { const latency = Math.round(performance.now() - start); + const errorMessage = + err instanceof DOMException && err.name === 'AbortError' + ? 'Request timed out' + : err instanceof Error + ? err.message + : 'Failed to connect'; return { status: 'error', latency, - error: err instanceof Error ? err.message : 'Failed to connect', + error: errorMessage, }; + } finally { + clearTimeout(timeoutId); } } @@ -127,7 +125,11 @@ export function createOverviewPlugin(): ConnectorDevtoolsPlugin { let unsubscribe: (() => void) | undefined; let unsubscribeContext: (() => void) | undefined; let rpcHealth: RpcHealth = { status: 'checking' }; + let isRefreshingRpcHealth = false; + let rpcHealthRefreshMode: 'manual' | 'poll' | undefined; + let rpcHealthCheckedAt: number | undefined; let healthCheckInterval: ReturnType | undefined; + let renderLatest: (() => void) | undefined; return { id: 'overview', @@ -182,11 +184,20 @@ export function createOverviewPlugin(): ConnectorDevtoolsPlugin { return 'cdt-text-error'; }; + const lastCheckedLabel = rpcHealthCheckedAt ? new Date(rpcHealthCheckedAt).toLocaleTimeString() : '—'; + const shouldSpinRefresh = isRefreshingRpcHealth && rpcHealthRefreshMode === 'manual'; + el.innerHTML = `
-
- -
-
-
- ${ICONS.wallet} - Connection -
- ${getStatusBadge(snapshot.connected, snapshot.connecting)} -
-
-
- Wallet - ${snapshot.selectedWallet?.name ?? 'None'} +
+
+ +
+
+
+ ${ICONS.wallet} + Connection +
+ ${getStatusBadge(snapshot.connected, snapshot.connecting)}
-
- Account - ${truncateAddress(snapshot.selectedAccount)} +
+
+ Wallet + ${snapshot.selectedWallet?.name ?? 'None'} +
+
+ Account + ${truncateAddress(snapshot.selectedAccount)} +
+
+ Accounts + ${snapshot.accounts.length} +
+
+ Wallets Detected + ${snapshot.wallets.length} +
-
- Accounts - ${snapshot.accounts.length} +
+ + +
+
+
+ ${ICONS.network} + Network +
+ ${snapshot.cluster ? `${snapshot.cluster.label}` : 'None'}
-
- Wallets Detected - ${snapshot.wallets.length} +
+
+ Cluster ID + ${snapshot.cluster?.id ?? 'N/A'} +
+
+ RPC URL + ${formatRpcUrl(rpcUrl)} +
+
+ Available Clusters + ${snapshot.clusters.length} +
-
- -
-
-
- ${ICONS.network} - Network + +
+
+
+ ${ICONS.info} + On Reload +
+ ${ + persistence.willAutoConnect + ? 'Auto-connect' + : 'Fresh start' + }
- ${snapshot.cluster ? `${snapshot.cluster.label}` : 'None'} -
-
-
- Cluster ID - ${snapshot.cluster?.id ?? 'N/A'} +
+
+ Auto-Connect + ${clientConfig.autoConnect ? 'Enabled' : 'Disabled'} +
+
+ Remembered Wallet + ${persistence.storedWallet ?? 'None'} +
+
+ Remembered Network + ${persistence.storedCluster ?? 'Default'} +
-
- RPC URL - ${formatRpcUrl(rpcUrl)} +
+ ${ + persistence.willAutoConnect + ? `Will reconnect to ${persistence.storedWallet} on page reload.` + : persistence.hasStoredWallet + ? `Wallet stored but auto-connect is disabled.` + : `No stored wallet. User will see connect prompt.` + }
-
- Available Clusters - ${snapshot.clusters.length} +
+ + +
+
+
+ ${ICONS.events} + Metrics +
+
+
+
+ ${metrics.stateUpdates} + State Updates +
+
+ ${metrics.optimizationRate.toFixed(0)}% + Optimization +
+
+ ${metrics.eventListenerCount} + Event Listeners +
+
+ ${metrics.avgUpdateTimeMs.toFixed(1)}ms + Avg Update +
- -
-
-
+
+ + + @@ -1167,7 +1090,11 @@ export function createTransactionsPlugin(_maxTransactions = 50): ConnectorDevtoo clearBtn?.addEventListener('click', () => { selectedSignature = null; selectedInflightId = null; - detailsBySignature.clear(); + detailsTab = 'details'; + detailsState.detailsRequestId += 1; + detailsState.detailsBySignature.clear(); + simulationState.requestId += 1; + simulationState.entriesByKey.clear(); ctx.clearCache?.('transactions'); ctx.client.clearTransactionHistory(); renderContent(); @@ -1175,7 +1102,7 @@ export function createTransactionsPlugin(_maxTransactions = 50): ConnectorDevtoo const refreshBtn = el.querySelector('#refresh-selected'); refreshBtn?.addEventListener('click', () => { - if (selectedSignature) fetchDetails(selectedSignature, ctx, renderContent); + if (selectedSignature) fetchTransactionDetails(selectedSignature, ctx, detailsState, renderContent); }); el.querySelectorAll('.cdt-tx-item[data-kind="tx"]').forEach(item => { @@ -1184,7 +1111,7 @@ export function createTransactionsPlugin(_maxTransactions = 50): ConnectorDevtoo if (!sig) return; selectedSignature = sig; selectedInflightId = null; - fetchDetails(sig, ctx, renderContent); + fetchTransactionDetails(sig, ctx, detailsState, renderContent); renderContent(); }); }); @@ -1195,10 +1122,97 @@ export function createTransactionsPlugin(_maxTransactions = 50): ConnectorDevtoo if (!id) return; selectedInflightId = id; selectedSignature = null; + detailsTab = 'details'; renderContent(); }); }); + el.querySelectorAll('[data-details-tab]').forEach(btn => { + btn.addEventListener('click', () => { + const tab = btn.getAttribute('data-details-tab'); + if (tab !== 'details' && tab !== 'flow' && tab !== 'simulate') return; + detailsTab = tab; + renderContent(); + }); + }); + + const simulateCommitmentDropdown = el.querySelector('#cdt-sim-commitment'); + simulateCommitmentDropdown?.addEventListener('cdt-dropdown-change', e => { + const detail = (e as CustomEvent<{ id: string; value: string }>).detail; + const next = detail.value; + if (next === 'processed' || next === 'confirmed' || next === 'finalized') { + simulateCommitment = next; + renderContent(); + } + }); + + const simulateSnapshotsToggle = el.querySelector('#cdt-sim-snapshots'); + simulateSnapshotsToggle?.addEventListener('change', () => { + simulateIncludeSnapshots = Boolean(simulateSnapshotsToggle.checked); + renderContent(); + }); + + const simulateRunBtn = el.querySelector('#cdt-sim-run'); + simulateRunBtn?.addEventListener('click', () => { + if (!simulationKey) return; + const requestId = ++simulationState.requestId; + const prev = simulationState.entriesByKey.get(simulationKey) ?? { isLoading: false, result: null }; + + simulationState.entriesByKey.set(simulationKey, { + ...prev, + error: undefined, + isLoading: true, + lastCommitment: simulateCommitment, + lastIncludeSnapshots: simulateIncludeSnapshots, + lastWireTransactionBase64: + selectedInflight?.transactionBase64 ?? + selectedTx?.wireTransactionBase64 ?? + prev.lastWireTransactionBase64, + requestId, + result: prev.result, + }); + renderContent(); + + void (async () => { + try { + const result = await runTransactionSimulation({ + key: simulationKey, + ctx, + commitment: simulateCommitment, + includeSnapshots: simulateIncludeSnapshots, + signature: selectedTx?.signature ?? selectedInflight?.signature ?? null, + wireTransactionBase64: + selectedInflight?.transactionBase64 ?? selectedTx?.wireTransactionBase64 ?? null, + }); + + const current = simulationState.entriesByKey.get(simulationKey); + if (current?.requestId !== requestId) return; + + simulationState.entriesByKey.set(simulationKey, { + ...current, + error: undefined, + isLoading: false, + lastCommitment: simulateCommitment, + lastIncludeSnapshots: simulateIncludeSnapshots, + lastWireTransactionBase64: result.wireTransactionBase64, + result, + }); + } catch (err) { + const current = simulationState.entriesByKey.get(simulationKey); + if (current?.requestId !== requestId) return; + + simulationState.entriesByKey.set(simulationKey, { + ...current, + error: err instanceof Error ? err.message : 'Failed to simulate transaction', + isLoading: false, + result: current?.result ?? null, + }); + } finally { + renderContent(); + } + })(); + }); + // Copy signature buttons in list rows el.querySelectorAll('[data-copy-sig]').forEach(btn => { btn.addEventListener('click', e => { @@ -1222,7 +1236,7 @@ export function createTransactionsPlugin(_maxTransactions = 50): ConnectorDevtoo const copyJsonBtn = el.querySelector('[data-copy-json]'); copyJsonBtn?.addEventListener('click', () => { if (selectedSignature) { - const details = detailsBySignature.get(selectedSignature); + const details = detailsState.detailsBySignature.get(selectedSignature); if (details?.tx) { copyToClipboard(safeJsonStringify(details.tx, 2)); } @@ -1244,7 +1258,7 @@ export function createTransactionsPlugin(_maxTransactions = 50): ConnectorDevtoo if (!selectedSignature) return; const tx = mergeTransactions(ctx).find(t => t.signature === selectedSignature); if (!tx || tx.status !== 'pending') return; - fetchDetails(selectedSignature, ctx, renderContent); + fetchTransactionDetails(selectedSignature, ctx, detailsState, renderContent); }, 5000); }, diff --git a/packages/devtools/src/plugins/transactions/details.ts b/packages/devtools/src/plugins/transactions/details.ts new file mode 100644 index 0000000..9553c74 --- /dev/null +++ b/packages/devtools/src/plugins/transactions/details.ts @@ -0,0 +1,136 @@ +import type { DevtoolsTrackedTransaction, PluginContext } from '../../types'; +import { getRpcUrl } from '../../utils/dom'; +import { fetchSignatureStatus, fetchTransactionJsonParsed, type SignatureStatusSummary } from '../../utils/rpc'; +import { safeJsonStringify, unwrapRpcValue } from './format'; + +export interface TransactionDetailsEntry { + isLoading: boolean; + status: SignatureStatusSummary | null; + tx: unknown | null; + error?: string; +} + +export interface TransactionDetailsState { + detailsBySignature: Map; + detailsRequestId: number; +} + +export function createTransactionDetailsState(): TransactionDetailsState { + return { + detailsBySignature: new Map(), + detailsRequestId: 0, + }; +} + +export function mergeTransactions(ctx: PluginContext): DevtoolsTrackedTransaction[] { + const cacheTxs = ctx.getCache?.().transactions.items ?? []; + const debugTxs = ctx.client.getDebugState().transactions ?? []; + + const bySig = new Map(); + + // Base: persisted cache + cacheTxs.forEach(tx => bySig.set(tx.signature, { ...tx })); + + // Overlay: connector debug state (has method/cluster/error, etc.) + debugTxs.forEach(tx => { + const signature = String(tx.signature); + const existing = bySig.get(signature); + bySig.set(signature, { + ...(existing ?? { signature, timestamp: tx.timestamp, status: tx.status }), + cluster: tx.cluster, + error: tx.error, + feePayer: tx.feePayer ? String(tx.feePayer) : existing?.feePayer, + method: tx.method, + size: (tx.metadata as any)?.size ?? existing?.size, + wireTransactionBase64: + (tx.metadata as any)?.wireTransactionBase64 ?? + (tx.metadata as any)?.transactionBase64 ?? + existing?.wireTransactionBase64, + status: tx.status, + timestamp: tx.timestamp, + }); + }); + + const list = Array.from(bySig.values()); + list.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime()); + return list; +} + +export async function fetchTransactionDetails( + signature: string, + ctx: PluginContext, + state: TransactionDetailsState, + onChange: () => void, +): Promise { + const rpcUrl = getRpcUrl(ctx); + if (!rpcUrl) { + state.detailsBySignature.set(signature, { + error: 'No RPC URL available (set devtools config.rpcUrl or ensure connector has an RPC URL).', + isLoading: false, + status: null, + tx: null, + }); + onChange(); + return; + } + + const requestId = ++state.detailsRequestId; + const prev = state.detailsBySignature.get(signature); + state.detailsBySignature.set(signature, { ...(prev ?? { status: null, tx: null }), isLoading: true }); + onChange(); + + try { + const [status, txResp] = await Promise.all([ + fetchSignatureStatus(rpcUrl, signature), + fetchTransactionJsonParsed(rpcUrl, signature), + ]); + + if (requestId !== state.detailsRequestId) return; + + const tx = unwrapRpcValue(txResp); + state.detailsBySignature.set(signature, { isLoading: false, status, tx }); + + // Best-effort: update connector + persisted cache when we can determine final status. + if (status) { + const nextStatus: DevtoolsTrackedTransaction['status'] = status.err + ? 'failed' + : status.confirmationStatus === 'confirmed' || status.confirmationStatus === 'finalized' + ? 'confirmed' + : 'pending'; + + if (nextStatus !== 'pending') { + ctx.client.updateTransactionStatus( + signature, + nextStatus, + status.err ? safeJsonStringify(status.err, 0) : undefined, + ); + } + + ctx.updateCache?.(cache => { + const idx = cache.transactions.items.findIndex(t => t.signature === signature); + if (idx === -1) return cache; + const nextItems = cache.transactions.items.map((t, i) => + i === idx + ? { + ...t, + confirmations: status.confirmations ?? null, + slot: status.slot ?? undefined, + status: nextStatus, + } + : t, + ); + return { ...cache, transactions: { ...cache.transactions, items: nextItems } }; + }); + } + } catch (err) { + if (requestId !== state.detailsRequestId) return; + state.detailsBySignature.set(signature, { + error: err instanceof Error ? err.message : 'Failed to fetch transaction details', + isLoading: false, + status: null, + tx: null, + }); + } finally { + onChange(); + } +} diff --git a/packages/devtools/src/plugins/transactions/format.ts b/packages/devtools/src/plugins/transactions/format.ts new file mode 100644 index 0000000..e7c12cc --- /dev/null +++ b/packages/devtools/src/plugins/transactions/format.ts @@ -0,0 +1,102 @@ +import { escapeHtml } from '../../utils/dom'; + +export function unwrapRpcValue(resp: unknown): T | null { + if (!resp) return null; + if (typeof resp === 'object' && resp !== null && 'value' in resp) return (resp as any).value as T; + return resp as T; +} + +export function safeJsonStringify(value: unknown, space = 2): string { + try { + return JSON.stringify(value, (_key, v) => (typeof v === 'bigint' ? v.toString() : v), space); + } catch (err) { + return err instanceof Error ? err.message : String(err); + } +} + +export function toBigIntOrNull(value: unknown): bigint | null { + if (value === null || value === undefined) return null; + if (typeof value === 'bigint') return value; + if (typeof value === 'number') { + if (!Number.isFinite(value)) return null; + return BigInt(Math.trunc(value)); + } + if (typeof value === 'string') { + if (value.trim() === '') return null; + try { + return BigInt(value); + } catch { + return null; + } + } + return null; +} + +export function formatIntegerLike(value: unknown): string { + const big = toBigIntOrNull(value); + if (big !== null) return big.toString(); + if (typeof value === 'string') return value; + if (typeof value === 'number') return Number.isFinite(value) ? String(value) : 'N/A'; + if (value === null) return 'null'; + if (value === undefined) return 'N/A'; + return safeJsonStringify(value, 0); +} + +const LAMPORTS_PER_SOL = 1_000_000_000n; + +export function formatSolFromLamports(lamports: bigint): string { + const sign = lamports < 0n ? '-' : ''; + const abs = lamports < 0n ? -lamports : lamports; + const whole = abs / LAMPORTS_PER_SOL; + const frac = abs % LAMPORTS_PER_SOL; + + const fracStr = frac.toString().padStart(9, '0').replace(/0+$/, ''); + return fracStr ? `${sign}${whole.toString()}.${fracStr}` : `${sign}${whole.toString()}`; +} + +export function formatBlockTime(blockTime: unknown): string { + const seconds = toBigIntOrNull(blockTime); + if (seconds === null) return 'N/A'; + const ms = Number(seconds) * 1000; + if (!Number.isFinite(ms)) return seconds.toString(); + return new Date(ms).toLocaleString('en-US', { hour12: false }); +} + +export function getAccountPubkey(accountKey: unknown): string { + if (!accountKey) return ''; + if (typeof accountKey === 'string') return accountKey; + if (typeof accountKey === 'object' && accountKey !== null && 'pubkey' in accountKey) + return String((accountKey as any).pubkey); + return safeJsonStringify(accountKey, 0); +} + +export function renderKeyValueRows(rows: Array<{ key: string; value: string }>, className = 'cdt-kv'): string { + return ` +
+ ${rows + .map( + row => ` +
${escapeHtml(row.key)}
+
${escapeHtml(row.value)}
+ `, + ) + .join('')} +
+ `; +} + +export function formatRelativeTime(timestamp: string): string { + const now = Date.now(); + const then = new Date(timestamp).getTime(); + const diff = now - then; + + if (diff < 1000) return 'just now'; + if (diff < 60000) return `${Math.floor(diff / 1000)}s ago`; + if (diff < 3600000) return `${Math.floor(diff / 60000)}m ago`; + return new Date(timestamp).toLocaleTimeString('en-US', { + hour12: false, + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + }); +} diff --git a/packages/devtools/src/plugins/transactions/render-flow.ts b/packages/devtools/src/plugins/transactions/render-flow.ts new file mode 100644 index 0000000..c6e8c2c --- /dev/null +++ b/packages/devtools/src/plugins/transactions/render-flow.ts @@ -0,0 +1,579 @@ +import type { DevtoolsTrackedTransaction } from '../../types'; +import { ICONS } from '../../components/icons'; +import { escapeHtml, truncateMiddle } from '../../utils/dom'; +import type { TransactionDetailsEntry } from './details'; +import { formatSolFromLamports, getAccountPubkey, safeJsonStringify, toBigIntOrNull } from './format'; + +export interface RenderTransactionFlowPanelParams { + selectedTx: DevtoolsTrackedTransaction; + selectedDetails?: TransactionDetailsEntry; +} + +interface FlowAccountNode { + index: number; + pubkey: string; + signer: boolean; + writable: boolean; + source?: string; +} + +interface FlowInstructionNode { + index: number; + programId: string; + programName?: string; + parsedType?: string; + accountPubkeys: string[]; + summary?: string; + transferFrom?: string; + transferTo?: string; +} + +interface FlowProgramNode { + programId: string; + label: string; +} + +function collectStringValues(value: unknown, out: string[]): void { + if (value === null || value === undefined) return; + if (typeof value === 'string') { + out.push(value); + return; + } + if (Array.isArray(value)) { + value.forEach(v => collectStringValues(v, out)); + return; + } + if (typeof value === 'object') { + Object.values(value as Record).forEach(v => collectStringValues(v, out)); + } +} + +function buildAccountNodes(rpcAccountKeys: unknown[]): FlowAccountNode[] { + return rpcAccountKeys.map((ak, index) => { + const pubkey = getAccountPubkey(ak); + const signer = Boolean((ak as any)?.signer); + const writable = Boolean((ak as any)?.writable); + const source = (ak as any)?.source ? String((ak as any).source) : undefined; + return { index, pubkey, signer, writable, source }; + }); +} + +function getInstructionProgramId(ix: any, accountPubkeys: string[]): string { + if (typeof ix?.programId === 'string') return ix.programId; + const programIdIndex = ix?.programIdIndex; + if (typeof programIdIndex === 'number' && Number.isFinite(programIdIndex)) + return accountPubkeys[programIdIndex] ?? ''; + return ''; +} + +function getInstructionAccountPubkeys(ix: any, accountPubkeys: string[], knownPubkeys: Set): string[] { + const accounts = new Set(); + + // 1) If we have explicit accounts (either pubkeys or indices) + if (Array.isArray(ix?.accounts)) { + for (const entry of ix.accounts) { + if (typeof entry === 'string') accounts.add(entry); + if (typeof entry === 'number' && Number.isFinite(entry)) { + const pk = accountPubkeys[entry]; + if (pk) accounts.add(pk); + } + } + } + + // 2) Best-effort: extract pubkeys from parsed.info object + const info = ix?.parsed?.info; + if (info && typeof info === 'object') { + const strings: string[] = []; + collectStringValues(info, strings); + for (const s of strings) if (knownPubkeys.has(s)) accounts.add(s); + } + + return Array.from(accounts); +} + +function buildInstructionNodes(rpcInstructions: unknown[], accountPubkeys: string[]): FlowInstructionNode[] { + const knownPubkeys = new Set(accountPubkeys); + + return rpcInstructions.map((ix, index) => { + const programId = getInstructionProgramId(ix, accountPubkeys); + const programName = typeof (ix as any)?.program === 'string' ? String((ix as any).program) : undefined; + const parsedType = typeof (ix as any)?.parsed?.type === 'string' ? String((ix as any).parsed.type) : undefined; + const accountPubkeysForIx = getInstructionAccountPubkeys(ix, accountPubkeys, knownPubkeys); + + const info = (ix as any)?.parsed?.info; + const infoObj = info && typeof info === 'object' && !Array.isArray(info) ? (info as any) : null; + + const maybeFrom = infoObj && typeof infoObj.source === 'string' ? String(infoObj.source) : undefined; + const maybeTo = infoObj && typeof infoObj.destination === 'string' ? String(infoObj.destination) : undefined; + const isTransfer = Boolean(parsedType && parsedType.toLowerCase().includes('transfer')); + + let summary: string | undefined; + let transferFrom: string | undefined; + let transferTo: string | undefined; + + if (isTransfer) { + transferFrom = maybeFrom; + transferTo = maybeTo; + } + + if (programName === 'system' && parsedType === 'transfer' && infoObj) { + const lamports = toBigIntOrNull(infoObj.lamports); + const amountLabel = lamports !== null ? `${formatSolFromLamports(lamports)} SOL` : undefined; + const routeLabel = + maybeFrom && maybeTo + ? maybeFrom === maybeTo + ? 'to self' + : `${truncateMiddle(maybeFrom, 5, 5)} → ${truncateMiddle(maybeTo, 5, 5)}` + : undefined; + + summary = [amountLabel ? `transfer ${amountLabel}` : 'transfer', routeLabel].filter(Boolean).join(' • '); + } + + if ((programName === 'spl-token' || programName === 'token') && isTransfer && infoObj) { + const tokenAmount = + infoObj.tokenAmount && typeof infoObj.tokenAmount === 'object' ? infoObj.tokenAmount : null; + const uiAmountString = + tokenAmount && typeof (tokenAmount as any).uiAmountString === 'string' + ? String((tokenAmount as any).uiAmountString) + : undefined; + const amountRaw = + typeof infoObj.amount === 'string' + ? infoObj.amount + : typeof infoObj.amount === 'number' + ? String(infoObj.amount) + : undefined; + const amountLabel = uiAmountString ?? amountRaw; + const mint = typeof infoObj.mint === 'string' ? String(infoObj.mint) : undefined; + const mintLabel = mint ? truncateMiddle(mint, 5, 5) : undefined; + + const routeLabel = + maybeFrom && maybeTo + ? maybeFrom === maybeTo + ? 'to self' + : `${truncateMiddle(maybeFrom, 5, 5)} → ${truncateMiddle(maybeTo, 5, 5)}` + : undefined; + + summary = [ + amountLabel ? `transfer ${amountLabel}${mintLabel ? ` (${mintLabel})` : ''}` : 'transfer', + routeLabel, + ] + .filter(Boolean) + .join(' • '); + } + + return { + index, + programId, + programName, + parsedType, + accountPubkeys: accountPubkeysForIx, + summary, + transferFrom, + transferTo, + }; + }); +} + +function buildProgramNodes(instructions: FlowInstructionNode[]): FlowProgramNode[] { + const seen = new Set(); + const programs: FlowProgramNode[] = []; + + for (const ix of instructions) { + if (!ix.programId) continue; + if (seen.has(ix.programId)) continue; + seen.add(ix.programId); + + const label = ix.programName ? ix.programName : truncateMiddle(ix.programId, 6, 6); + programs.push({ programId: ix.programId, label }); + } + + return programs; +} + +function renderAccountInstructionProgramGraph(params: { + accounts: FlowAccountNode[]; + instructions: FlowInstructionNode[]; + programs: FlowProgramNode[]; +}): string { + const { accounts, instructions, programs } = params; + + const nodeH = 112; + const rowGap = 18; + const rowStride = nodeH + rowGap; + const sectionHeaderH = 24; + const sectionGap = 26; + const canvasPadX = 18; + const canvasPadY = 18; + const nodeW = 300; + + type Rect = { x: number; y: number; w: number; h: number }; + type Point = { x: number; y: number }; + + const viewBoxWidth = 500; + const x = (viewBoxWidth - nodeW) / 2; + const w = nodeW; + + const yAccounts = canvasPadY; + const yAccountsNodes = yAccounts + sectionHeaderH; + + const accountPosByPubkey = new Map(); + accounts.forEach((a, i) => { + const y = yAccountsNodes + i * rowStride; + accountPosByPubkey.set(a.pubkey, { x, y, w, h: nodeH }); + }); + + const yInstructions = yAccountsNodes + accounts.length * rowStride + sectionGap; + const yInstructionsNodes = yInstructions + sectionHeaderH; + + const instructionPosByIndex = new Map(); + instructions.forEach((ix, i) => { + const y = yInstructionsNodes + i * rowStride; + instructionPosByIndex.set(ix.index, { x, y, w, h: nodeH }); + }); + + const yPrograms = yInstructionsNodes + instructions.length * rowStride + sectionGap; + const yProgramsNodes = yPrograms + sectionHeaderH; + + const programPosByProgramId = new Map(); + programs.forEach((p, i) => { + const y = yProgramsNodes + i * rowStride; + programPosByProgramId.set(p.programId, { x, y, w, h: nodeH }); + }); + + const width = viewBoxWidth; + const height = yProgramsNodes + programs.length * rowStride + canvasPadY; + + function centerX(pos: Rect): number { + return pos.x + pos.w / 2; + } + + function topHandle(pos: Rect): Point { + return { x: centerX(pos), y: pos.y }; + } + + function bottomHandle(pos: Rect): Point { + return { x: centerX(pos), y: pos.y + pos.h }; + } + + function edgePath(from: Point, to: Point): string { + return `M${from.x} ${from.y} L${to.x} ${to.y}`; + } + + function renderSectionLabel(label: string, y: number): string { + return ` + + ${escapeHtml(label)} + + `; + } + + function renderHandleCircle(p: Point, stroke: string): string { + return ` + + + `; + } + + function renderCardNode(params: { + pos: Rect; + kind: 'account' | 'instruction' | 'program'; + iconSvg: string; + title: string; + chip: { label: string; tone?: 'default' | 'accent' | 'info' | 'warning' | 'success' }; + bodyPrimary: string; + bodySecondary?: string; + tooltip?: string; + }): string { + const { pos, kind, iconSvg, title, chip, bodyPrimary, bodySecondary, tooltip } = params; + const tone = chip.tone ?? 'default'; + const tooltipAttr = tooltip ? `title="${escapeHtml(tooltip)}"` : ''; + return ` + +
+
+
${escapeHtml(title)}
+ + ${iconSvg} + ${escapeHtml(chip.label)} + +
+
+
${escapeHtml(bodyPrimary)}
+ ${bodySecondary ? `
${escapeHtml(bodySecondary)}
` : ''} +
+
+
+ `; + } + + const accountToIxEdges: string[] = []; + const ixToProgramEdges: string[] = []; + + for (const ix of instructions) { + const ixPos = instructionPosByIndex.get(ix.index); + if (!ixPos) continue; + + const edgeAccounts = (() => { + const set = new Set(); + if (ix.transferFrom) set.add(ix.transferFrom); + if (ix.transferTo) set.add(ix.transferTo); + if (set.size) return Array.from(set); + return ix.accountPubkeys.slice(0, 6); + })(); + + for (const pk of edgeAccounts) { + const aPos = accountPosByPubkey.get(pk); + if (!aPos) continue; + accountToIxEdges.push( + ``, + ); + } + + const pPos = ix.programId ? programPosByProgramId.get(ix.programId) : undefined; + if (pPos) { + ixToProgramEdges.push( + ``, + ); + } + } + + const accountNodes = accounts + .map(a => { + const pos = accountPosByPubkey.get(a.pubkey); + if (!pos) return ''; + + const tooltip = [ + `Account #${a.index}`, + a.pubkey, + ...(a.source ? [`source: ${a.source}`] : []), + ...(a.signer ? ['signer'] : []), + ...(a.writable ? ['writable'] : ['readonly']), + ].join('\n'); + + const flags = [...(a.signer ? ['signer'] : []), a.writable ? 'writable' : 'readonly'].join(' • '); + + const tone = a.signer ? 'info' : a.writable ? 'warning' : 'default'; + + return renderCardNode({ + pos, + kind: 'account', + iconSvg: ICONS.wallet, + title: `Account #${a.index}`, + chip: { label: 'Account', tone }, + bodyPrimary: truncateMiddle(a.pubkey, 8, 8), + bodySecondary: flags, + tooltip, + }); + }) + .join(''); + + const instructionNodes = instructions + .map(ix => { + const pos = instructionPosByIndex.get(ix.index); + if (!pos) return ''; + + const tooltip = [ + `Instruction #${ix.index}`, + ix.programId ? `program: ${ix.programId}` : 'program: unknown', + ...(ix.parsedType ? [`type: ${ix.parsedType}`] : []), + ...(ix.summary ? [`summary: ${ix.summary}`] : []), + ...(ix.accountPubkeys.length ? [`accounts: ${ix.accountPubkeys.length}`] : []), + ].join('\n'); + + const programLabel = ix.programName + ? ix.programName + : ix.programId + ? truncateMiddle(ix.programId, 6, 6) + : 'unknown'; + const typeSuffix = ix.parsedType ? `:${ix.parsedType}` : ''; + const headerTitle = `${programLabel}${typeSuffix}`; + + const isTransfer = Boolean(ix.parsedType && ix.parsedType.toLowerCase().includes('transfer')); + const chip = isTransfer + ? { label: 'Transfer', tone: 'success' as const } + : { label: 'Instruction', tone: 'accent' as const }; + + const bodyPrimary = ix.summary ? ix.summary : `Ix #${ix.index}`; + const bodySecondary = ix.summary + ? `Ix #${ix.index} • ${ix.accountPubkeys.length} accounts` + : ix.accountPubkeys.length + ? `${ix.accountPubkeys.length} accounts` + : undefined; + + return renderCardNode({ + pos, + kind: 'instruction', + iconSvg: ICONS.transactions, + title: headerTitle, + chip, + bodyPrimary, + bodySecondary, + tooltip, + }); + }) + .join(''); + + const programNodes = programs + .map(p => { + const pos = programPosByProgramId.get(p.programId); + if (!pos) return ''; + + const tooltip = `Program\n${p.programId}`; + return renderCardNode({ + pos, + kind: 'program', + iconSvg: ICONS.code, + title: p.label, + chip: { label: 'Program', tone: 'default' }, + bodyPrimary: truncateMiddle(p.programId, 10, 10), + bodySecondary: undefined, + tooltip, + }); + }) + .join(''); + + const handleMarks = (() => { + const marks: string[] = []; + + for (const a of accounts) { + const pos = accountPosByPubkey.get(a.pubkey); + if (!pos) continue; + const stroke = a.signer ? 'var(--cdt-info)' : a.writable ? 'var(--cdt-warning)' : 'var(--cdt-border)'; + marks.push(renderHandleCircle(bottomHandle(pos), stroke)); + } + + for (const ix of instructions) { + const pos = instructionPosByIndex.get(ix.index); + if (!pos) continue; + const stroke = 'var(--cdt-accent)'; + marks.push(renderHandleCircle(topHandle(pos), stroke)); + marks.push(renderHandleCircle(bottomHandle(pos), stroke)); + } + + for (const p of programs) { + const pos = programPosByProgramId.get(p.programId); + if (!pos) continue; + marks.push(renderHandleCircle(topHandle(pos), 'var(--cdt-accent)')); + } + + return marks.join(''); + })(); + + return ` + + ${renderSectionLabel('Accounts', yAccounts + 16)} + ${renderSectionLabel('Instructions', yInstructions + 16)} + ${renderSectionLabel('Programs', yPrograms + 16)} + + ${accountToIxEdges.join('')} + ${ixToProgramEdges.join('')} + + ${accountNodes} + ${instructionNodes} + ${programNodes} + + ${handleMarks} + + `; +} + +export function renderTransactionFlowPanel({ selectedTx, selectedDetails }: RenderTransactionFlowPanelParams): string { + if (!selectedDetails) { + return `
No RPC details loaded yet. Select a transaction to fetch details.
`; + } + + if (selectedDetails.error) { + return `
${escapeHtml( + selectedDetails.error, + )}
`; + } + + const rpcTx = selectedDetails.tx as any; + const rpcTransaction = rpcTx && typeof rpcTx === 'object' ? (rpcTx as any).transaction : undefined; + const rpcMessage = + rpcTransaction && typeof rpcTransaction === 'object' ? (rpcTransaction as any).message : undefined; + const rpcInstructions = Array.isArray(rpcMessage?.instructions) ? (rpcMessage.instructions as unknown[]) : []; + const rpcAccountKeys = Array.isArray(rpcMessage?.accountKeys) ? (rpcMessage.accountKeys as unknown[]) : []; + + const allAccounts = buildAccountNodes(rpcAccountKeys); + const accountPubkeys = allAccounts.map(a => a.pubkey); + const instructions = buildInstructionNodes(rpcInstructions, accountPubkeys); + const programs = buildProgramNodes(instructions); + + const signatureLabel = truncateMiddle(selectedTx.signature, 10, 10); + const statusLabel = + selectedDetails.status?.err && selectedDetails.status.err !== null + ? 'failed' + : selectedDetails.status?.confirmationStatus + ? String(selectedDetails.status.confirmationStatus) + : selectedTx.status; + + const statusChipClass = + statusLabel === 'finalized' || statusLabel === 'confirmed' + ? 'success' + : statusLabel === 'failed' + ? 'error' + : 'info'; + + const rawStatus = + selectedDetails.status?.err && selectedDetails.status.err !== null + ? safeJsonStringify(selectedDetails.status.err, 2) + : null; + + const programIds = new Set(programs.map(p => p.programId)); + const displayAccounts = allAccounts.filter(a => !programIds.has(a.pubkey)); + const accountsForGraph = displayAccounts.length ? displayAccounts : allAccounts; + + const graphHtml = + accountsForGraph.length === 0 && instructions.length === 0 + ? `
No message accounts/instructions found on this transaction.
` + : ` +
+ ${renderAccountInstructionProgramGraph({ accounts: accountsForGraph, instructions, programs })} +
+ `; + + return ` +
+
+
+
Flow
+ ${escapeHtml(statusLabel)} + ${escapeHtml(signatureLabel)} +
+
+ +
+
signer
+
writable
+
readonly
+
invokes
+
transfer trail
+
Built from message + parsed RPC.
+
+ + ${selectedDetails.isLoading ? `
Loading RPC details…
` : ''} + + ${graphHtml} + + ${ + rawStatus + ? `
+ Status error +
+
${escapeHtml(rawStatus)}
+
+
` + : '' + } +
+ `; +} diff --git a/packages/devtools/src/plugins/transactions/render-sent-details.ts b/packages/devtools/src/plugins/transactions/render-sent-details.ts new file mode 100644 index 0000000..5f0c262 --- /dev/null +++ b/packages/devtools/src/plugins/transactions/render-sent-details.ts @@ -0,0 +1,263 @@ +import type { DevtoolsTrackedTransaction } from '../../types'; +import { ICONS } from '../../components/icons'; +import { escapeHtml, truncateMiddle } from '../../utils/dom'; +import { + formatBlockTime, + formatIntegerLike, + formatSolFromLamports, + getAccountPubkey, + renderKeyValueRows, + safeJsonStringify, + toBigIntOrNull, +} from './format'; +import type { TransactionDetailsEntry } from './details'; + +interface DecodedWireTransactionLike { + summary: { + feePayer?: string | null; + }; +} + +export interface RenderSentTransactionDetailsPanelParams { + selectedTx: DevtoolsTrackedTransaction; + selectedTxDecoded: DecodedWireTransactionLike | null; + selectedDetails?: TransactionDetailsEntry; +} + +export function renderSentTransactionDetailsPanel({ + selectedTx, + selectedTxDecoded, + selectedDetails, +}: RenderSentTransactionDetailsPanelParams): string { + const rpcTx = selectedDetails?.tx as any; + const rpcMeta = rpcTx && typeof rpcTx === 'object' ? (rpcTx as any).meta : undefined; + const rpcTransaction = rpcTx && typeof rpcTx === 'object' ? (rpcTx as any).transaction : undefined; + const rpcMessage = + rpcTransaction && typeof rpcTransaction === 'object' ? (rpcTransaction as any).message : undefined; + + const rpcInstructions = Array.isArray(rpcMessage?.instructions) ? (rpcMessage.instructions as any[]) : []; + const rpcAccountKeys = Array.isArray(rpcMessage?.accountKeys) ? (rpcMessage.accountKeys as any[]) : []; + const rpcLogs = Array.isArray(rpcMeta?.logMessages) ? (rpcMeta.logMessages as string[]) : []; + + const feeLamports = toBigIntOrNull(rpcMeta?.fee); + const computeUnitsConsumed = toBigIntOrNull(rpcMeta?.computeUnitsConsumed); + + const summaryRows: Array<{ key: string; value: string }> = [ + { key: 'signature', value: selectedTx.signature }, + { key: 'status', value: selectedTx.status }, + { key: 'cluster', value: selectedTx.cluster ?? 'N/A' }, + { key: 'method', value: selectedTx.method ?? 'N/A' }, + { key: 'slot', value: formatIntegerLike(rpcTx?.slot) }, + { key: 'block time', value: formatBlockTime(rpcTx?.blockTime) }, + { key: 'version', value: formatIntegerLike(rpcTx?.version) }, + ...(selectedTxDecoded?.summary.feePayer + ? [{ key: 'fee payer (wire)', value: selectedTxDecoded.summary.feePayer }] + : []), + ...(feeLamports !== null + ? [ + { + key: 'fee', + value: `${feeLamports.toString()} lamports (${formatSolFromLamports(feeLamports)} SOL)`, + }, + ] + : []), + ...(computeUnitsConsumed !== null ? [{ key: 'compute units', value: computeUnitsConsumed.toString() }] : []), + ...(selectedDetails?.status?.confirmations !== null && selectedDetails?.status?.confirmations !== undefined + ? [{ key: 'confirmations', value: String(selectedDetails.status.confirmations) }] + : []), + ...(selectedDetails?.status?.confirmationStatus + ? [{ key: 'confirmation status', value: String(selectedDetails.status.confirmationStatus) }] + : []), + ]; + + const instructionsHtml = rpcInstructions.length + ? rpcInstructions + .map((ix, idx) => { + const program = typeof ix.program === 'string' ? ix.program : ''; + const programId = typeof ix.programId === 'string' ? ix.programId : ''; + const parsedType = typeof ix.parsed?.type === 'string' ? ix.parsed.type : ''; + const stackHeight = + ix.stackHeight !== null && ix.stackHeight !== undefined ? String(ix.stackHeight) : ''; + + const titlePieces = [ + `#${idx}`, + program ? program : programId ? truncateMiddle(programId, 6, 6) : 'unknown', + parsedType ? `:${parsedType}` : '', + ].filter(Boolean); + + const info = ix.parsed?.info; + const infoEntries = + info && typeof info === 'object' && !Array.isArray(info) + ? Object.entries(info as Record) + : []; + + const infoRows = infoEntries.map(([k, v]) => ({ + key: k, + value: + typeof v === 'string' + ? v + : typeof v === 'number' + ? String(v) + : typeof v === 'bigint' + ? v.toString() + : safeJsonStringify(v, 0), + })); + + const headerRows: Array<{ key: string; value: string }> = [ + ...(programId ? [{ key: 'program id', value: programId }] : []), + ...(stackHeight ? [{ key: 'stack height', value: stackHeight }] : []), + ]; + + return ` +
+
${escapeHtml(titlePieces.join(' '))}
+ ${headerRows.length ? renderKeyValueRows(headerRows, 'cdt-kv cdt-kv-compact') : ''} + ${ + infoRows.length + ? renderKeyValueRows(infoRows, 'cdt-kv cdt-kv-compact') + : `
No parsed info
` + } +
+ `; + }) + .join('') + : `
No instructions.
`; + + const accountsHtml = rpcAccountKeys.length + ? rpcAccountKeys + .map((ak, idx) => { + const pubkey = getAccountPubkey(ak); + const signer = Boolean((ak as any)?.signer); + const writable = Boolean((ak as any)?.writable); + const source = (ak as any)?.source ? String((ak as any).source) : ''; + + const badges = [ + signer ? `signer` : '', + writable + ? `writable` + : `readonly`, + source ? `${escapeHtml(source)}` : '', + ].filter(Boolean); + + return ` + + `; + }) + .join('') + : `
No accounts.
`; + + const balancesHtml = (() => { + const pre = Array.isArray(rpcMeta?.preBalances) ? (rpcMeta.preBalances as unknown[]) : []; + const post = Array.isArray(rpcMeta?.postBalances) ? (rpcMeta.postBalances as unknown[]) : []; + const len = Math.max(pre.length, post.length, rpcAccountKeys.length); + + const rows: string[] = []; + for (let i = 0; i < len; i++) { + const preLamports = toBigIntOrNull(pre[i]); + const postLamports = toBigIntOrNull(post[i]); + if (preLamports === null || postLamports === null) continue; + + const delta = postLamports - preLamports; + if (delta === 0n) continue; + + const pubkey = getAccountPubkey(rpcAccountKeys[i]); + const deltaStr = `${delta.toString()} lamports (${formatSolFromLamports(delta)} SOL)`; + const postStr = `${postLamports.toString()} lamports (${formatSolFromLamports(postLamports)} SOL)`; + + rows.push(` +
+
${escapeHtml(pubkey)}
+
${escapeHtml(deltaStr)}
+
${escapeHtml(postStr)}
+
+ `); + } + + if (rows.length === 0) return `
No non-zero SOL balance changes.
`; + return `
${rows.join('')}
`; + })(); + + const logsHtml = rpcLogs.length + ? ` +
+ ${rpcLogs + .map( + (line, i) => ` +
+
${i + 1}
+
${escapeHtml(line)}
+
+ `, + ) + .join('')} +
+ ` + : `
No logs.
`; + + const rawJson = selectedDetails?.tx ? escapeHtml(safeJsonStringify(selectedDetails.tx, 2)) : 'null'; + + return ` +
+
Transaction
+
+ ${selectedTx.wireTransactionBase64 ? `` : ''} +
+
+ + ${ + selectedDetails?.error + ? `
${escapeHtml(selectedDetails.error)}
` + : '' + } + + ${selectedDetails?.isLoading ? `
Loading RPC details…
` : ''} + +
+
Summary
+ ${renderKeyValueRows(summaryRows)} +
+ +
+ ${ICONS.chevronDown}Instructions (${rpcInstructions.length}) +
+ ${instructionsHtml} +
+
+ +
+ ${ICONS.chevronDown}Accounts (${rpcAccountKeys.length}) +
+ ${accountsHtml} +
+
+ +
+ ${ICONS.chevronDown}Balance changes (SOL) +
+ ${balancesHtml} +
+
+ +
+ ${ICONS.chevronDown}Logs (${rpcLogs.length}) +
+ ${logsHtml} +
+
+ +
+ ${ICONS.chevronDown}Raw JSON +
+ +
${rawJson}
+
+
+ `; +} diff --git a/packages/devtools/src/plugins/transactions/render-simulation.ts b/packages/devtools/src/plugins/transactions/render-simulation.ts new file mode 100644 index 0000000..6f41790 --- /dev/null +++ b/packages/devtools/src/plugins/transactions/render-simulation.ts @@ -0,0 +1,351 @@ +import { ICONS } from '../../components/icons'; +import { renderCdtDropdown } from '../../components/dropdown'; +import { escapeHtml, truncateMiddle } from '../../utils/dom'; +import { formatSolFromLamports, safeJsonStringify } from './format'; +import type { + SimulationBalanceChange, + SimulationCommitment, + SimulationInstructionDecoded, + SimulationWritableAccount, + TransactionSimulationEntry, + TransactionSimulationResult, +} from './simulation/state'; + +function formatLamportsDelta(delta: bigint): string { + const sol = formatSolFromLamports(delta); + return `${delta.toString()} lamports (${sol} SOL)`; +} + +function renderWarnings(warnings: TransactionSimulationResult['warnings']): string { + if (!warnings.length) return `
No warnings.
`; + return ` +
+ ${warnings + .map(w => { + const tone = w.severity === 'critical' ? 'error' : 'warn'; + const label = w.account ? `${w.shortMessage} • ${truncateMiddle(w.account, 5, 5)}` : w.shortMessage; + return `${escapeHtml(label)}`; + }) + .join('')} +
+ `; +} + +function renderBalanceChanges(changes: SimulationBalanceChange[]): string { + if (!changes.length) return `
No non-zero balance changes detected.
`; + + const rows = changes + .slice() + .sort((a, b) => (a.kind === b.kind ? 0 : a.kind === 'sol' ? -1 : 1)) + .map(ch => { + const amountLabel = + ch.kind === 'sol' + ? formatLamportsDelta(ch.amount) + : `${ch.amount.toString()}${ch.mint ? ` (mint ${truncateMiddle(ch.mint, 5, 5)})` : ''}`; + + return ` +
+
${escapeHtml(truncateMiddle(ch.address, 10, 10))}
+
${escapeHtml(amountLabel)}
+
${escapeHtml(ch.kind === 'sol' ? 'SOL' : 'SPL')}
+
+ `; + }) + .join(''); + + return `
${rows}
`; +} + +function renderWritableAccountsTable(accounts: SimulationWritableAccount[], includeSnapshots: boolean): string { + if (!accounts.length) return `
No writable accounts found.
`; + + return ` +
+
Writable accounts (${accounts.length})
+
+ ${includeSnapshots ? 'Changed-in-simulation is computed from lamports + account data bytes.' : 'Snapshots disabled; diffs not computed.'} +
+
+ ${accounts + .map(a => { + const chipTone = a.changedInSimulation ? 'success' : 'warn'; + const chipLabel = a.changedInSimulation ? 'changed' : 'unchanged'; + const flags = [ + a.isSigner ? `signer` : '', + a.isWritable + ? `writable` + : `readonly`, + ] + .filter(Boolean) + .join(' '); + + const delta = includeSnapshots ? (a.post.lamports ?? 0n) - (a.pre.lamports ?? 0n) : null; + + const deltaLabel = includeSnapshots && delta !== null ? formatLamportsDelta(delta) : 'N/A'; + const tokenDelta = (() => { + if (!includeSnapshots) return null; + const pre = a.tokenPre?.amount ?? 0n; + const post = a.tokenPost?.amount ?? 0n; + const mint = a.tokenPost?.mint ?? a.tokenPre?.mint ?? null; + const d = post - pre; + if (!mint || d === 0n) return null; + return `${d.toString()} (mint ${truncateMiddle(mint, 5, 5)})`; + })(); + + return ` +
+
+
+
+ ${escapeHtml(chipLabel)} + ${escapeHtml(truncateMiddle(a.address, 10, 10))} +
+
${flags}
+
+
+ ${ + includeSnapshots + ? `${escapeHtml(deltaLabel)}` + : '' + } + ${tokenDelta ? `${escapeHtml(tokenDelta)}` : ''} +
+
+
+ `; + }) + .join('')} +
+
+ `; +} + +function renderInstructions(instructions: SimulationInstructionDecoded[]): string { + if (!instructions.length) return `
No decoded instructions.
`; + + return ` +
+ ${instructions + .map(ix => { + const programLabel = ix.programName ? ix.programName : truncateMiddle(ix.programAddress, 6, 6); + const title = `${programLabel}${ix.parsed?.name ? `:${ix.parsed.name}` : ''}`; + const argsJson = ix.parsed ? escapeHtml(safeJsonStringify(ix.parsed.args, 2)) : ''; + const dataPreview = + ix.raw.dataHex.length > 120 ? `${ix.raw.dataHex.slice(0, 120)}…` : ix.raw.dataHex || ''; + + const accountsHtml = (ix.parsed?.accounts ?? ix.raw.accounts ?? []).length + ? (ix.parsed?.accounts ?? ix.raw.accounts) + .map(a => { + const badges = [ + a.isSigner ? `signer` : '', + a.isWritable + ? `writable` + : `readonly`, + a.name ? `${escapeHtml(a.name)}` : '', + ] + .filter(Boolean) + .join(' '); + return ` + + `; + }) + .join('') + : `
No accounts.
`; + + return ` +
+ ${ICONS.chevronDown}#${ix.index} ${escapeHtml(title)} +
+
+
Program
+
+
program
${escapeHtml(ix.programAddress)}
+
+
+ + ${ + ix.parsed + ? ` +
+
Args (Anchor)
+
${argsJson}
+
+ ` + : ` +
+
Data (hex)
+
${escapeHtml(dataPreview || 'N/A')}
+
+ ` + } + +
+
Accounts
+ ${accountsHtml} +
+
+
+ `; + }) + .join('')} +
+ `; +} + +function renderLogs(logs: string[] | null): string { + if (!logs?.length) return `
No logs.
`; + const maxLines = 200; + const truncated = logs.length > maxLines; + const display = logs.slice(0, maxLines); + + return ` + ${truncated ? `
Showing first ${maxLines} lines (of ${logs.length}).
` : ''} +
+ ${display + .map( + (line, i) => ` +
+
${i + 1}
+
${escapeHtml(line)}
+
+ `, + ) + .join('')} +
+ `; +} + +export interface RenderTransactionSimulationPanelParams { + simulationEntry?: TransactionSimulationEntry; + commitment: SimulationCommitment; + includeSnapshots: boolean; + canSimulate: boolean; + missingReason?: string; +} + +export function renderTransactionSimulationPanel({ + simulationEntry, + commitment, + includeSnapshots, + canSimulate, + missingReason, +}: RenderTransactionSimulationPanelParams): string { + const result = simulationEntry?.result ?? null; + + const inspectorUrl = result?.explorerInspectorUrl ?? null; + const isLoading = Boolean(simulationEntry?.isLoading); + const error = simulationEntry?.error ?? null; + + return ` +
+
Simulation
+
+
+ commitment + ${renderCdtDropdown({ + id: 'cdt-sim-commitment', + ariaLabel: 'Simulation commitment', + value: commitment, + options: (['processed', 'confirmed', 'finalized'] as const).map(c => ({ value: c, label: c })), + triggerClassName: 'cdt-select cdt-select-compact', + })} +
+ + + + +
+
+ + ${ + !canSimulate + ? `
${escapeHtml( + missingReason ?? 'Simulation unavailable.', + )}
` + : '' + } + + ${error ? `
${escapeHtml(error)}
` : ''} + + ${isLoading ? `
${ICONS.refresh}Simulating…
` : ''} + + ${ + result + ? ` +
+
Summary
+
+
status
${escapeHtml(result.error ? 'failed' : 'ok')}
+
units
${result.unitsConsumed !== null ? escapeHtml(String(result.unitsConsumed)) : 'N/A'}
+
writable accounts
${escapeHtml(String(result.writableAccounts.length))}${result.truncatedWritableAccounts ? ' (truncated)' : ''}
+
started
${escapeHtml(new Date(result.startedAt).toLocaleTimeString('en-US', { hour12: false }))}
+
duration
${escapeHtml(String(result.finishedAt - result.startedAt))}ms
+ ${ + inspectorUrl + ? `
inspector
` + : '' + } +
+
+ +
+ ${ICONS.chevronDown}Warnings (${result.warnings.length}) +
+ ${renderWarnings(result.warnings)} +
+
+ +
+ ${ICONS.chevronDown}Balance changes (${result.balanceChanges.length}) +
+ ${renderBalanceChanges(result.balanceChanges)} +
+
+ +
+ ${ICONS.chevronDown}Writable accounts +
+ ${renderWritableAccountsTable(result.writableAccounts, result.includeSnapshots)} +
+
+ +
+ ${ICONS.chevronDown}Instructions (${result.instructions.length}) +
+ ${renderInstructions(result.instructions)} +
+
+ +
+ ${ICONS.chevronDown}Logs (${result.logs?.length ?? 0}) +
+ ${renderLogs(result.logs)} +
+
+ +
+ ${ICONS.chevronDown}Raw simulation +
+
${escapeHtml(safeJsonStringify(result.rawSimulation, 2))}
+
+
+ ` + : `
Run a simulation to see results.
` + } + `; +} diff --git a/packages/devtools/src/plugins/transactions/simulation/anchor-decode.ts b/packages/devtools/src/plugins/transactions/simulation/anchor-decode.ts new file mode 100644 index 0000000..d9363e7 --- /dev/null +++ b/packages/devtools/src/plugins/transactions/simulation/anchor-decode.ts @@ -0,0 +1,146 @@ +import type { Instruction } from '@solana/kit'; +import { PublicKey, type AccountMeta as Web3AccountMeta } from '@solana/web3.js'; + +import { fetchProgramMetadataIdl } from '../../../utils/idl'; +import { isModernAnchorIdl } from '../../idl/anchor-idl'; +import type { SimulationInstructionAccount, SimulationInstructionDecoded } from './state'; + +function isSignerRole(role: unknown): boolean { + return role === 2 || role === 3; +} + +function isWritableRole(role: unknown): boolean { + return role === 1 || role === 3; +} + +function bytesToHex(bytes: Uint8Array): string { + let out = ''; + for (let i = 0; i < bytes.length; i++) out += bytes[i].toString(16).padStart(2, '0'); + return out; +} + +function toSimulationAccounts(accounts: readonly any[] | undefined): SimulationInstructionAccount[] { + if (!accounts?.length) return []; + return accounts + .map(acc => { + const address = typeof acc?.address === 'string' ? acc.address : String(acc?.address ?? ''); + const role = (acc as any)?.role; + return { + address, + isSigner: isSignerRole(role), + isWritable: isWritableRole(role), + }; + }) + .filter(a => Boolean(a.address)); +} + +function toWeb3AccountMetas(accounts: SimulationInstructionAccount[]): Web3AccountMeta[] { + return accounts.map(a => ({ + pubkey: new PublicKey(a.address), + isSigner: a.isSigner, + isWritable: a.isWritable, + })); +} + +export async function decodeInstructionsWithAnchorIdls(params: { + rpcUrl: string; + instructions: readonly Instruction[]; + maxPrograms?: number; +}): Promise { + const maxPrograms = params.maxPrograms ?? 10; + const instructions = params.instructions ?? []; + + const uniquePrograms: string[] = []; + const seen = new Set(); + for (const ix of instructions) { + const program = typeof (ix as any)?.programAddress === 'string' ? String((ix as any).programAddress) : ''; + if (!program || seen.has(program)) continue; + seen.add(program); + uniquePrograms.push(program); + if (uniquePrograms.length >= maxPrograms) break; + } + + const idlByProgram = new Map(); + + for (const programAddress of uniquePrograms) { + try { + const idl = await fetchProgramMetadataIdl({ programId: programAddress, rpcUrl: params.rpcUrl }); + if (!isModernAnchorIdl(idl)) continue; + const programName = + idl && + typeof idl === 'object' && + (idl as any).metadata && + typeof (idl as any).metadata.name === 'string' + ? String((idl as any).metadata.name) + : undefined; + idlByProgram.set(programAddress, { idl, programName }); + } catch { + // best-effort + } + } + + const hasAnyIdl = idlByProgram.size > 0; + const anchorMod = hasAnyIdl ? ((await import('@coral-xyz/anchor')) as any) : null; + const BorshInstructionCoder = anchorMod?.BorshInstructionCoder; + + const coderByProgram = new Map(); + for (const [programAddress, { idl }] of idlByProgram) { + if (!BorshInstructionCoder) break; + try { + coderByProgram.set(programAddress, new BorshInstructionCoder(idl)); + } catch { + // ignore invalid IDLs + } + } + + return instructions.map((ix, index) => { + const programAddress = + typeof (ix as any)?.programAddress === 'string' ? String((ix as any).programAddress) : ''; + const rawAccounts = toSimulationAccounts((ix as any)?.accounts); + const dataBytes = (ix as any)?.data ? new Uint8Array((ix as any).data as Uint8Array) : new Uint8Array(); + const dataHex = dataBytes.length ? bytesToHex(dataBytes) : ''; + + const base: SimulationInstructionDecoded = { + index, + programAddress, + programName: idlByProgram.get(programAddress)?.programName, + raw: { dataHex, accounts: rawAccounts }, + }; + + const coder = programAddress ? coderByProgram.get(programAddress) : null; + if (!coder || !dataHex) return base; + + try { + const decoded = coder.decode(dataHex, 'hex') as { name: string; data: unknown } | null; + if (!decoded) return base; + + const formatted = coder.format(decoded, toWeb3AccountMetas(rawAccounts)) as + | { + args: unknown; + accounts: Array<{ name?: string; pubkey: PublicKey; isSigner: boolean; isWritable: boolean }>; + } + | null + | undefined; + + const parsedAccounts = formatted?.accounts?.length + ? formatted.accounts.map(a => ({ + name: a.name, + address: a.pubkey.toBase58(), + isSigner: Boolean(a.isSigner), + isWritable: Boolean(a.isWritable), + })) + : rawAccounts; + + return { + ...base, + parsed: { + name: decoded.name, + args: decoded.data, + accounts: parsedAccounts, + }, + }; + } catch { + return base; + } + }); +} diff --git a/packages/devtools/src/plugins/transactions/simulation/engine.ts b/packages/devtools/src/plugins/transactions/simulation/engine.ts new file mode 100644 index 0000000..e5774d5 --- /dev/null +++ b/packages/devtools/src/plugins/transactions/simulation/engine.ts @@ -0,0 +1,491 @@ +import { type Base64EncodedWireTransaction } from '@solana/kit'; + +import { getRpcUrl } from '../../../utils/dom'; +import { bytesToBase64, base64ToBytes, bytesToHexPreview } from '../../../utils/tx-bytes'; +import { decodeWireTransactionBase64, decompileMessageFromWireTransactionBase64 } from '../../../utils/tx-decode'; +import { + fetchMultipleAccountsBase64, + fetchTransactionWireBase64, + simulateWireTransactionBase64, +} from '../../../utils/rpc'; +import type { PluginContext } from '../../../types'; + +import { decodeInstructionsWithAnchorIdls } from './anchor-decode'; +import type { + SimulationAccountInfoBase64, + SimulationBalanceChange, + SimulationTokenAccountState, + SimulationWarning, + SimulationWritableAccount, + SimulationWritableAccountMeta, + TransactionSimulationResult, + SimulationCommitment, +} from './state'; +import { PublicKey } from '@solana/web3.js'; + +function toBigIntOrNull(value: unknown): bigint | null { + if (value === null || value === undefined) return null; + if (typeof value === 'bigint') return value; + if (typeof value === 'number') return Number.isFinite(value) ? BigInt(Math.trunc(value)) : null; + if (typeof value === 'string') { + const trimmed = value.trim(); + if (!trimmed) return null; + try { + return BigInt(trimmed); + } catch { + return null; + } + } + return null; +} + +function normalizeAccountInfoBase64(raw: unknown | null | undefined): SimulationAccountInfoBase64 { + if (!raw || typeof raw !== 'object') return { lamports: null, owner: null, dataBase64: null }; + const r = raw as any; + const lamports = toBigIntOrNull(r.lamports); + const owner = typeof r.owner === 'string' ? r.owner : null; + const dataBase64 = (() => { + const data = r.data; + if (Array.isArray(data) && typeof data[0] === 'string') return data[0]; + if (typeof data === 'string') return data; + return null; + })(); + const executable = typeof r.executable === 'boolean' ? r.executable : undefined; + const rentEpoch = toBigIntOrNull(r.rentEpoch); + return { dataBase64, executable, lamports, owner, rentEpoch }; +} + +function getExplorerInspectorClusterParam(clusterId: string | null): string { + if (!clusterId) return 'mainnet-beta'; + if (clusterId.includes('devnet')) return 'devnet'; + if (clusterId.includes('testnet')) return 'testnet'; + if (clusterId.includes('custom')) return 'custom'; + if (clusterId.includes('mainnet')) return 'mainnet-beta'; + return 'mainnet-beta'; +} + +function getExplorerInspectorUrl(messageBase64: string, clusterId: string | null): string { + const cluster = getExplorerInspectorClusterParam(clusterId); + return `https://explorer.solana.com/tx/inspector?cluster=${cluster}&message=${encodeURIComponent(messageBase64)}`; +} + +function mergeMeta(byAddress: Map, next: SimulationWritableAccountMeta): void { + const prev = byAddress.get(next.address); + if (!prev) { + byAddress.set(next.address, next); + return; + } + byAddress.set(next.address, { + address: next.address, + isSigner: prev.isSigner || next.isSigner, + isWritable: prev.isWritable || next.isWritable, + }); +} + +function roleIsSigner(role: unknown): boolean { + return role === 2 || role === 3; +} + +function roleIsWritable(role: unknown): boolean { + return role === 1 || role === 3; +} + +function readU32LE(bytes: Uint8Array, offset: number): number | null { + if (bytes.byteLength < offset + 4) return null; + const view = new DataView(bytes.buffer, bytes.byteOffset + offset, 4); + return view.getUint32(0, true); +} + +function readU64LE(bytes: Uint8Array, offset: number): bigint | null { + if (bytes.byteLength < offset + 8) return null; + const view = new DataView(bytes.buffer, bytes.byteOffset + offset, 8); + return view.getBigUint64(0, true); +} + +function parseClassicSplTokenAccount(dataBase64: string | null): SimulationTokenAccountState | null { + if (!dataBase64) return null; + const bytes = base64ToBytes(dataBase64); + if (bytes.byteLength !== 165) return null; + + const mint = new PublicKey(bytes.subarray(0, 32)).toBase58(); + const owner = new PublicKey(bytes.subarray(32, 64)).toBase58(); + const amount = readU64LE(bytes, 64); + if (amount === null) return null; + + const delegateOption = readU32LE(bytes, 72); + const delegate = delegateOption && delegateOption !== 0 ? new PublicKey(bytes.subarray(76, 108)).toBase58() : null; + + const closeAuthorityOption = readU32LE(bytes, 129); + const closeAuthority = + closeAuthorityOption && closeAuthorityOption !== 0 ? new PublicKey(bytes.subarray(133, 165)).toBase58() : null; + + return { amount, closeAuthority, delegate, mint, owner }; +} + +function isBlockhashNotFound(simulationErr: unknown): boolean { + if (!simulationErr) return false; + const s = typeof simulationErr === 'string' ? simulationErr : JSON.stringify(simulationErr); + return s.includes('BlockhashNotFound') || s.toLowerCase().includes('blockhash not found'); +} + +function isInsufficientFunds(simulationErr: unknown): boolean { + if (!simulationErr) return false; + const s = typeof simulationErr === 'string' ? simulationErr : JSON.stringify(simulationErr); + return ( + s.includes('InsufficientFunds') || + s.includes('insufficient funds') || + s.includes('InsufficientFundsForFee') || + s.includes('InsufficientFundsForRent') + ); +} + +function safeLamportsDelta(pre: SimulationAccountInfoBase64, post: SimulationAccountInfoBase64): bigint | null { + if (pre.lamports === null && post.lamports === null) return null; + const preLamports = pre.lamports ?? 0n; + const postLamports = post.lamports ?? 0n; + return postLamports - preLamports; +} + +function didDataChange(pre: SimulationAccountInfoBase64, post: SimulationAccountInfoBase64): boolean { + if (pre.dataBase64 === null && post.dataBase64 === null) return false; + return pre.dataBase64 !== post.dataBase64; +} + +function formatAccountNameHint(address: string, walletAddress: string | null): string { + if (walletAddress && address === walletAddress) return 'Wallet'; + return 'Account'; +} + +export interface RunTransactionSimulationParams { + key: string; + ctx: PluginContext; + signature?: string | null; + wireTransactionBase64?: string | null; + commitment?: SimulationCommitment; + includeSnapshots?: boolean; + maxWritableAccounts?: number; +} + +export async function runTransactionSimulation( + params: RunTransactionSimulationParams, +): Promise { + const startedAt = Date.now(); + + const { ctx } = params; + const rpcUrl = getRpcUrl(ctx); + if (!rpcUrl) + throw new Error('No RPC URL available (set devtools config.rpcUrl or ensure connector has an RPC URL).'); + const rpcUrlValue = rpcUrl; + + const snapshot = ctx.client.getSnapshot(); + const walletAddress = snapshot.selectedAccount ? String(snapshot.selectedAccount) : null; + const clusterId = ctx.client.getCluster()?.id ?? null; + + const commitment = params.commitment ?? 'confirmed'; + const includeSnapshots = params.includeSnapshots ?? true; + const maxWritableAccounts = params.maxWritableAccounts ?? 64; + + let wireBase64 = params.wireTransactionBase64?.trim() ? String(params.wireTransactionBase64).trim() : ''; + const signature = params.signature?.trim() ? String(params.signature).trim() : null; + + if (!wireBase64 && signature) { + const maxAttempts = 4; + for (let attempt = 0; attempt < maxAttempts; attempt++) { + wireBase64 = + (await fetchTransactionWireBase64(rpcUrlValue, signature, { + commitment, + })) ?? ''; + if (wireBase64) break; + if (attempt < maxAttempts - 1) { + const delayMs = 250 * (attempt + 1); + await new Promise(r => window.setTimeout(r, delayMs)); + } + } + } + if (!wireBase64) { + if (signature) { + throw new Error( + 'Unable to fetch wire transaction bytes from RPC yet. ' + + 'If this transaction is still pending/unconfirmed, wait a few seconds and try again. ' + + 'To enable pre-send simulation, send via the connector signer (captures bytes via transaction:preparing) ' + + 'or call client.previewTransaction(tx) / track with metadata.wireTransactionBase64.', + ); + } + throw new Error('No wire transaction bytes available to simulate (missing base64 bytes and signature).'); + } + + const decoded = decodeWireTransactionBase64(wireBase64); + const messageBase64 = bytesToBase64(new Uint8Array(decoded.transaction.messageBytes as unknown as Uint8Array)); + const explorerInspectorUrl = getExplorerInspectorUrl(messageBase64, clusterId); + + const warnings: SimulationWarning[] = []; + + // Prefer decompiled message (lookup tables resolved) to derive accounts + instructions. + let decompiledMessage: any | null = null; + try { + decompiledMessage = await decompileMessageFromWireTransactionBase64(wireBase64, rpcUrlValue); + } catch { + decompiledMessage = null; + } + + const instructions = (decompiledMessage?.instructions ?? []) as any[]; + const decodedInstructions = await decodeInstructionsWithAnchorIdls({ + instructions: instructions as any, + rpcUrl: rpcUrlValue, + }); + + const metaByAddress = new Map(); + + const feePayerAddress = + (typeof decompiledMessage?.feePayer?.address === 'string' + ? String(decompiledMessage.feePayer.address) + : null) ?? + decoded.summary.feePayer ?? + null; + + if (feePayerAddress) { + mergeMeta(metaByAddress, { address: feePayerAddress, isSigner: true, isWritable: true }); + } + + for (const ix of instructions) { + const accounts = Array.isArray(ix?.accounts) ? (ix.accounts as any[]) : []; + for (const acc of accounts) { + const address = typeof acc?.address === 'string' ? String(acc.address) : ''; + if (!address) continue; + mergeMeta(metaByAddress, { + address, + isSigner: roleIsSigner((acc as any)?.role), + isWritable: roleIsWritable((acc as any)?.role), + }); + } + } + + const writableMetas = Array.from(metaByAddress.values()).filter(m => m.isWritable); + const truncatedWritableAccounts = writableMetas.length > maxWritableAccounts; + const writableForSimulation = writableMetas.slice(0, maxWritableAccounts); + const writableAddresses = writableForSimulation.map(m => m.address); + + if (truncatedWritableAccounts) { + warnings.push({ + severity: 'warning', + shortMessage: 'Truncated', + message: `Only the first ${maxWritableAccounts} writable accounts were simulated to reduce RPC load.`, + }); + } + + const preByAddress = new Map(); + if (includeSnapshots) { + const pre = await fetchMultipleAccountsBase64(rpcUrlValue, writableAddresses, { commitment }); + for (let i = 0; i < writableAddresses.length; i++) { + preByAddress.set(writableAddresses[i], normalizeAccountInfoBase64(pre[i])); + } + } + + async function simulateOnce(): Promise { + return await simulateWireTransactionBase64(rpcUrlValue, wireBase64 as Base64EncodedWireTransaction, { + commitment, + replaceRecentBlockhash: true, + ...(includeSnapshots ? { accounts: { addresses: writableAddresses, encoding: 'base64' } } : {}), + }); + } + + let simResp: any; + let tries = 0; + while (true) { + tries += 1; + simResp = await simulateOnce(); + const err = simResp?.value?.err ?? null; + if (!isBlockhashNotFound(err) || tries >= 4) break; + await new Promise(r => window.setTimeout(r, 150)); + } + + const simValue = simResp?.value ?? null; + const simErr = simValue?.err ?? null; + const logs = Array.isArray(simValue?.logs) ? (simValue.logs as string[]) : null; + const unitsConsumed = + typeof simValue?.unitsConsumed === 'number' && Number.isFinite(simValue.unitsConsumed) + ? (simValue.unitsConsumed as number) + : null; + + if (simErr) { + warnings.push({ + severity: 'critical', + shortMessage: 'Simulation Failed', + message: 'Transaction failed in simulation.', + }); + } + if (isInsufficientFunds(simErr)) { + warnings.push({ + severity: 'critical', + shortMessage: 'Insufficient Funds', + message: 'Simulation indicates insufficient funds for this transaction.', + }); + } + + const postAccountsRaw = Array.isArray(simValue?.accounts) ? (simValue.accounts as Array) : []; + const postByAddress = new Map(); + if (includeSnapshots) { + for (let i = 0; i < writableAddresses.length; i++) { + postByAddress.set(writableAddresses[i], normalizeAccountInfoBase64(postAccountsRaw[i])); + } + } + + const writableAccounts: SimulationWritableAccount[] = writableForSimulation.map(meta => { + const pre = includeSnapshots + ? (preByAddress.get(meta.address) ?? { lamports: null, owner: null, dataBase64: null }) + : { lamports: null, owner: null, dataBase64: null }; + const post = includeSnapshots + ? (postByAddress.get(meta.address) ?? { lamports: null, owner: null, dataBase64: null }) + : { lamports: null, owner: null, dataBase64: null }; + + const deltaLamports = includeSnapshots ? safeLamportsDelta(pre, post) : null; + const changedInSimulation = includeSnapshots + ? Boolean((deltaLamports !== null && deltaLamports !== 0n) || didDataChange(pre, post)) + : false; + + const tokenPre = includeSnapshots ? parseClassicSplTokenAccount(pre.dataBase64) : null; + const tokenPost = includeSnapshots ? parseClassicSplTokenAccount(post.dataBase64) : null; + + return { + address: meta.address, + changedInSimulation, + isSigner: meta.isSigner, + isWritable: meta.isWritable, + post, + pre, + tokenPost, + tokenPre, + }; + }); + + if (includeSnapshots) { + for (const acc of writableAccounts) { + if (!acc.changedInSimulation) { + warnings.push({ + severity: 'warning', + shortMessage: 'Unchanged', + message: + 'Account did not change in simulation but was labeled as writable. Behavior may differ from the simulation.', + account: acc.address, + }); + } + + const preT = acc.tokenPre; + const postT = acc.tokenPost; + + if (preT && postT) { + if (!preT.owner || !postT.owner) continue; + + if (preT.delegate === null && postT.delegate) { + warnings.push({ + severity: 'warning', + shortMessage: 'Delegated', + message: `Delegation was set on a token account. This can allow withdrawals without the owner’s approval.`, + account: acc.address, + }); + } + + if (preT.owner !== postT.owner) { + warnings.push({ + severity: 'critical', + shortMessage: 'Owner Changed', + message: `Token account owner changed in simulation.`, + account: acc.address, + }); + } + + if (preT.closeAuthority !== postT.closeAuthority) { + warnings.push({ + severity: 'warning', + shortMessage: 'Close Authority', + message: `Token account close authority changed in simulation.`, + account: acc.address, + }); + } + } + } + } + + const balanceChanges: SimulationBalanceChange[] = []; + if (includeSnapshots) { + for (const acc of writableAccounts) { + const deltaLamports = safeLamportsDelta(acc.pre, acc.post); + if (deltaLamports !== null && deltaLamports !== 0n) { + balanceChanges.push({ + kind: 'sol', + address: acc.address, + owner: walletAddress && acc.address === walletAddress ? walletAddress : undefined, + amount: deltaLamports, + }); + } + + const preT = acc.tokenPre; + const postT = acc.tokenPost; + const mint = postT?.mint ?? preT?.mint; + const owner = postT?.owner ?? preT?.owner; + const preAmount = preT?.amount ?? 0n; + const postAmount = postT?.amount ?? 0n; + const delta = postAmount - preAmount; + if (mint && owner && delta !== 0n) { + balanceChanges.push({ + kind: 'spl-token', + address: acc.address, + owner, + mint, + amount: delta, + }); + } + } + } + + if (includeSnapshots) { + const negativeCount = balanceChanges.filter(b => b.amount < 0n).length; + if (negativeCount >= 3) { + warnings.push({ + severity: 'warning', + shortMessage: '3+ Negative', + message: + 'Three or more accounts show negative balance change in simulation. Make sure this is expected.', + }); + } + } + + if (!instructions.length) { + warnings.push({ + severity: 'warning', + shortMessage: 'Limited Decode', + message: 'Lookup table decompile failed; instruction/account decoding may be incomplete.', + }); + } + + const finishedAt = Date.now(); + return { + balanceChanges, + cluster: clusterId, + commitment, + error: simErr, + explorerInspectorUrl, + finishedAt, + includeSnapshots, + instructions: decodedInstructions.map(ix => { + // If we couldn’t decompile instruction data, ensure we have a minimal raw payload. + const rawHex = ix.raw.dataHex + ? ix.raw.dataHex + : decoded.compiledMessage?.instructions?.[ix.index]?.data + ? bytesToHexPreview(decoded.compiledMessage.instructions[ix.index].data as Uint8Array, 256) + : ''; + return { ...ix, raw: { ...ix.raw, dataHex: rawHex } }; + }), + key: params.key, + logs, + messageBase64, + rawSimulation: simValue, + signature, + startedAt, + truncatedWritableAccounts, + unitsConsumed, + warnings, + wireTransactionBase64: wireBase64, + writableAccounts, + }; +} diff --git a/packages/devtools/src/plugins/transactions/simulation/state.ts b/packages/devtools/src/plugins/transactions/simulation/state.ts new file mode 100644 index 0000000..8365677 --- /dev/null +++ b/packages/devtools/src/plugins/transactions/simulation/state.ts @@ -0,0 +1,114 @@ +export type SimulationCommitment = 'processed' | 'confirmed' | 'finalized'; + +export interface SimulationWarning { + severity: 'critical' | 'warning'; + shortMessage: string; + message: string; + account?: string; +} + +export interface SimulationAccountInfoBase64 { + lamports: bigint | null; + owner: string | null; + dataBase64: string | null; + executable?: boolean; + rentEpoch?: bigint | null; +} + +export interface SimulationTokenAccountState { + mint: string; + owner: string; + amount: bigint; + delegate?: string | null; + closeAuthority?: string | null; +} + +export interface SimulationWritableAccountMeta { + address: string; + isSigner: boolean; + isWritable: boolean; +} + +export interface SimulationWritableAccount { + address: string; + isSigner: boolean; + isWritable: boolean; + changedInSimulation: boolean; + pre: SimulationAccountInfoBase64; + post: SimulationAccountInfoBase64; + tokenPre?: SimulationTokenAccountState | null; + tokenPost?: SimulationTokenAccountState | null; +} + +export interface SimulationBalanceChange { + kind: 'sol' | 'spl-token'; + address: string; + owner?: string; + amount: bigint; + mint?: string; + symbol?: string; + decimals?: number; +} + +export interface SimulationInstructionAccount { + name?: string; + address: string; + isSigner: boolean; + isWritable: boolean; +} + +export interface SimulationInstructionDecoded { + index: number; + programAddress: string; + programName?: string; + parsed?: { + name: string; + args: unknown; + accounts: SimulationInstructionAccount[]; + }; + raw: { + dataHex: string; + accounts: SimulationInstructionAccount[]; + }; +} + +export interface TransactionSimulationResult { + key: string; + signature: string | null; + cluster: string | null; + commitment: SimulationCommitment; + includeSnapshots: boolean; + wireTransactionBase64: string; + messageBase64: string; + explorerInspectorUrl: string; + unitsConsumed: number | null; + logs: string[] | null; + error: unknown | null; + warnings: SimulationWarning[]; + truncatedWritableAccounts: boolean; + writableAccounts: SimulationWritableAccount[]; + balanceChanges: SimulationBalanceChange[]; + instructions: SimulationInstructionDecoded[]; + rawSimulation: unknown | null; + startedAt: number; + finishedAt: number; +} + +export interface TransactionSimulationEntry { + isLoading: boolean; + error?: string; + result: TransactionSimulationResult | null; + requestId?: number; + lastCommitment?: SimulationCommitment; + lastIncludeSnapshots?: boolean; + lastWireTransactionBase64?: string; +} + +export interface TransactionSimulationState { + entriesByKey: Map; + requestId: number; +} + +export function createTransactionSimulationState(): TransactionSimulationState { + return { entriesByKey: new Map(), requestId: 0 }; +} diff --git a/packages/devtools/src/styles/tokens.ts b/packages/devtools/src/styles/tokens.ts index e8e8f1c..c04e250 100644 --- a/packages/devtools/src/styles/tokens.ts +++ b/packages/devtools/src/styles/tokens.ts @@ -105,6 +105,156 @@ export const BASE_STYLES = ` font-size: inherit; } + .cdt-select { + -webkit-appearance: none; + appearance: none; + padding: 6px 30px 6px 10px; + border-radius: 8px; + border: 1px solid var(--cdt-border); + background-color: var(--cdt-bg); + color: var(--cdt-text); + font-size: 12px; + font-family: ui-monospace, monospace; + line-height: 1.2; + cursor: pointer; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none'%3E%3Cpath d='M6 9l6 6 6-6' stroke='%23888888' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 10px center; + background-size: 14px 14px; + } + + .cdt-select:hover:not(:disabled) { + background-color: var(--cdt-bg-hover); + border-color: var(--cdt-border-hover); + } + + .cdt-select:focus { + outline: none; + border-color: var(--cdt-accent); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--cdt-accent) 25%, transparent); + } + + .cdt-select:disabled { + cursor: not-allowed; + opacity: 0.5; + } + + .cdt-select option { + background: var(--cdt-bg); + color: var(--cdt-text); + } + + .cdt-select-compact { + font-size: 11px; + background-position: right 8px center; + background-size: 13px 13px; + } + + .cdt-dropdown { + position: relative; + display: inline-block; + } + + .cdt-dropdown-trigger { + text-align: left; + display: inline-flex; + align-items: center; + min-width: 120px; + } + + .cdt-dropdown-trigger-text { + display: block; + max-width: 240px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .cdt-dropdown-menu { + position: absolute; + top: calc(100% + 6px); + left: 0; + z-index: 50; + min-width: 100%; + max-width: 320px; + padding: 4px; + border-radius: 10px; + border: 1px solid var(--cdt-border); + background: var(--cdt-bg-panel); + box-shadow: 0 14px 34px rgba(0, 0, 0, 0.32); + max-height: 260px; + overflow: auto; + overscroll-behavior: contain; + opacity: 0; + transform: translateY(-4px); + visibility: hidden; + pointer-events: none; + transition: opacity 0.12s ease, transform 0.12s ease, visibility 0s linear 0.12s; + } + + .cdt-dropdown[data-open="true"] .cdt-dropdown-menu { + opacity: 1; + transform: translateY(0); + visibility: visible; + pointer-events: auto; + transition: opacity 0.12s ease, transform 0.12s ease, visibility 0s; + } + + .cdt-dropdown-item { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 7px 8px; + border-radius: 8px; + font-size: 12px; + color: var(--cdt-text); + background: transparent; + border: none; + } + + .cdt-dropdown-item:hover:not(:disabled) { + background: var(--cdt-bg-hover); + } + + .cdt-dropdown-item:focus { + outline: none; + background: var(--cdt-bg-hover); + box-shadow: 0 0 0 2px color-mix(in srgb, var(--cdt-accent) 25%, transparent); + } + + .cdt-dropdown-item[data-selected="true"] { + background: var(--cdt-bg-active); + } + + .cdt-dropdown-item-label { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + min-width: 0; + } + + .cdt-dropdown-check { + display: inline-flex; + align-items: center; + justify-content: center; + width: 14px; + height: 14px; + flex: none; + color: var(--cdt-accent); + opacity: 0; + } + + .cdt-dropdown-check svg { + width: 14px; + height: 14px; + } + + .cdt-dropdown-item[data-selected="true"] .cdt-dropdown-check { + opacity: 1; + } + /* Scrollbar styling */ ::-webkit-scrollbar { width: 8px; diff --git a/packages/devtools/src/types/bnjs.d.ts b/packages/devtools/src/types/bnjs.d.ts new file mode 100644 index 0000000..f6067fa --- /dev/null +++ b/packages/devtools/src/types/bnjs.d.ts @@ -0,0 +1,4 @@ +declare module 'bn.js' { + const BN: any; + export default BN; +} diff --git a/packages/devtools/src/utils/dom.ts b/packages/devtools/src/utils/dom.ts new file mode 100644 index 0000000..8a16e76 --- /dev/null +++ b/packages/devtools/src/utils/dom.ts @@ -0,0 +1,54 @@ +import type { PluginContext } from '../types'; + +export function escapeHtml(text: string): string { + return text + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); +} + +export function escapeAttr(text: string): string { + // Conservative: treat same as HTML escaping (prevents breaking out of attribute values) + return escapeHtml(text); +} + +export function getRpcUrl(ctx: PluginContext): string | null { + const cfg = ctx.getConfig(); + return cfg.rpcUrl ?? ctx.client.getRpcUrl() ?? null; +} + +export function getExplorerUrl(signature: string, cluster?: string): string { + const baseUrl = 'https://explorer.solana.com'; + let clusterParam = ''; + if (cluster?.includes('devnet')) clusterParam = '?cluster=devnet'; + else if (cluster?.includes('testnet')) clusterParam = '?cluster=testnet'; + else if (cluster?.includes('custom')) clusterParam = '?cluster=custom'; + return `${baseUrl}/tx/${signature}${clusterParam}`; +} + +export async function copyToClipboard(text: string): Promise { + if (typeof navigator !== 'undefined' && navigator.clipboard?.writeText) { + try { + await navigator.clipboard.writeText(text); + return; + } catch { + // Fall through to legacy copy method. + } + } + + if (typeof document === 'undefined') return; + + const textarea = document.createElement('textarea'); + textarea.value = text; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand('copy'); + document.body.removeChild(textarea); +} + +export function truncateMiddle(value: string, head = 8, tail = 8): string { + if (value.length <= head + tail + 3) return value; + return `${value.slice(0, head)}...${value.slice(-tail)}`; +} diff --git a/packages/devtools/src/utils/idl.ts b/packages/devtools/src/utils/idl.ts new file mode 100644 index 0000000..bf04fa0 --- /dev/null +++ b/packages/devtools/src/utils/idl.ts @@ -0,0 +1,55 @@ +/** + * IDL utilities for @solana/connector-debugger + * + * Chain-first IDL fetch mirrors Solana Explorer's Program Metadata IDL flow: + * - Fetch metadata via seeds (authority:null, seed:"idl") + * - Unpack + fetch referenced content + * - Parse JSON + */ + +import { address, createSolanaRpc } from '@solana/kit'; +import { fetchMetadataFromSeeds, unpackAndFetchData } from '@solana-program/program-metadata'; + +export interface FetchProgramMetadataIdlParams { + rpcUrl: string; + programId: string; + seed?: string; +} + +const DEFAULT_IDL_SEED = 'idl'; + +export async function fetchProgramMetadataIdl({ + rpcUrl, + programId, + seed = DEFAULT_IDL_SEED, +}: FetchProgramMetadataIdlParams): Promise { + if (!rpcUrl) throw new Error('RPC URL is required'); + if (!programId) throw new Error('Program id is required'); + + const rpc = createSolanaRpc(rpcUrl); + + let metadata; + try { + metadata = await fetchMetadataFromSeeds(rpc, { + authority: null, + program: address(programId), + seed, + }); + } catch (err) { + throw new Error(err instanceof Error ? err.message : 'Failed to fetch program metadata'); + } + + let content: string; + try { + content = await unpackAndFetchData({ rpc, ...metadata.data }); + } catch (err) { + throw new Error(err instanceof Error ? err.message : 'Failed to unpack program metadata'); + } + + try { + return JSON.parse(content) as unknown; + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + throw new Error(`IDL JSON parse failed: ${msg}`); + } +} diff --git a/packages/devtools/src/utils/rpc.ts b/packages/devtools/src/utils/rpc.ts index 8ef4544..c1f9774 100644 --- a/packages/devtools/src/utils/rpc.ts +++ b/packages/devtools/src/utils/rpc.ts @@ -10,6 +10,12 @@ export function createRpc(rpcUrl: string): Rpc { return createSolanaRpc(rpcUrl) as Rpc; } +function unwrapRpcValue(resp: unknown): T | null { + if (!resp) return null; + if (typeof resp === 'object' && resp !== null && 'value' in resp) return (resp as any).value as T; + return resp as T; +} + export interface SignatureStatusSummary { slot: number | null; confirmationStatus?: string | null; @@ -50,21 +56,69 @@ export async function fetchTransactionJsonParsed(rpcUrl: string, signature: stri .send(); } +export async function fetchTransactionWireBase64( + rpcUrl: string, + signature: string, + config?: { commitment?: 'processed' | 'confirmed' | 'finalized' }, +): Promise { + const rpc = createRpc(rpcUrl) as any; + const resp = await rpc + .getTransaction(createSignature(signature), { + commitment: config?.commitment ?? 'confirmed', + encoding: 'base64', + maxSupportedTransactionVersion: 0, + }) + .send(); + + const value = unwrapRpcValue(resp); + const tx = value && typeof value === 'object' ? (value as any).transaction : null; + if (!tx) return null; + + if (Array.isArray(tx) && typeof tx[0] === 'string') return tx[0]; + if (typeof tx === 'string') return tx; + return null; +} + +export async function fetchMultipleAccountsBase64( + rpcUrl: string, + addresses: string[], + config?: { commitment?: 'processed' | 'confirmed' | 'finalized' }, +): Promise> { + if (addresses.length === 0) return []; + const rpc = createRpc(rpcUrl) as any; + const resp = await rpc + .getMultipleAccounts(addresses, { + commitment: config?.commitment ?? 'confirmed', + encoding: 'base64', + }) + .send(); + const value = unwrapRpcValue(resp); + return Array.isArray(value) ? value : []; +} + export async function simulateWireTransactionBase64( rpcUrl: string, transactionBase64: Base64EncodedWireTransaction, config?: { commitment?: 'processed' | 'confirmed' | 'finalized'; replaceRecentBlockhash?: boolean; + accounts?: { addresses: string[]; encoding?: 'base64' }; }, ) { - const rpc = createRpc(rpcUrl); + const rpc = createRpc(rpcUrl) as any; + + const accounts = + config?.accounts?.addresses?.length && config.accounts.addresses.length > 0 + ? { encoding: config.accounts.encoding ?? 'base64', addresses: config.accounts.addresses } + : undefined; + return await rpc .simulateTransaction(transactionBase64, { commitment: config?.commitment ?? 'confirmed', encoding: 'base64', replaceRecentBlockhash: config?.replaceRecentBlockhash ?? true, sigVerify: false, + ...(accounts ? { accounts } : {}), }) .send(); } diff --git a/packages/devtools/src/vendor/helium-sus/LICENSE-APACHE-2.0.txt b/packages/devtools/src/vendor/helium-sus/LICENSE-APACHE-2.0.txt new file mode 100644 index 0000000..57bc88a --- /dev/null +++ b/packages/devtools/src/vendor/helium-sus/LICENSE-APACHE-2.0.txt @@ -0,0 +1,202 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + diff --git a/packages/devtools/src/vendor/helium-sus/NOTICE.md b/packages/devtools/src/vendor/helium-sus/NOTICE.md new file mode 100644 index 0000000..fb7a136 --- /dev/null +++ b/packages/devtools/src/vendor/helium-sus/NOTICE.md @@ -0,0 +1,23 @@ +# Third-Party Notice: `@helium/sus` + +This project includes **logic adapted** from Helium’s transaction simulation checker library: + +- **Package**: `@helium/sus` +- **Version referenced**: `0.11.11` +- **License**: Apache-2.0 +- **Upstream**: `https://github.com/helium/helium-program-library` + +## What we adapted (best-effort) + +- **Explorer tx inspector link format** (`/tx/inspector?cluster=…&message=…`) +- **Blockhash-not-found retry loop** idea for simulation +- **Warnings heuristics** inspired by Sus output: + - “Unchanged but writable” warning + - Token-account delegation/owner/close-authority changes + +## Where it lives in this repo + +- `packages/devtools/src/plugins/transactions/simulation/*` +- `packages/devtools/src/utils/rpc.ts` + +See `LICENSE-APACHE-2.0.txt` for the Apache 2.0 license text. diff --git a/packages/devtools/src/vendor/helium-sus/README.md b/packages/devtools/src/vendor/helium-sus/README.md new file mode 100644 index 0000000..ab829b9 --- /dev/null +++ b/packages/devtools/src/vendor/helium-sus/README.md @@ -0,0 +1,34 @@ +# `@helium/sus` (vendored/adapted notes) + +This repo does **not** depend on `@helium/sus` directly. Instead, `packages/devtools` implements a **Sus-inspired** simulation/analysis view using only existing dependencies in this monorepo. + +## Upstream + +- **Name**: `@helium/sus` +- **Version referenced**: `0.11.11` +- **Repo**: `https://github.com/helium/helium-program-library` +- **License**: Apache-2.0 (see `LICENSE-APACHE-2.0.txt`) + +## What we implemented (best-effort) + +The Transactions → Simulate sub-tab reimplements a minimal subset of Sus-like behavior: + +- Build an **Explorer tx inspector link** from the transaction message bytes. +- Run **`simulateTransaction`** (optionally requesting post-state snapshots for selected accounts). +- Compute **writable-account diffs** (changed vs unchanged) from lamports + raw account data bytes. +- Compute **balance deltas**: + - SOL deltas (lamports) + - Classic SPL token-account amount deltas when the account layout is the fixed 165-byte form +- Emit **warnings** inspired by Sus output (e.g. unchanged writable, token delegation/owner/close-authority changes). +- Best-effort **Anchor instruction decoding** by fetching Program Metadata IDLs and decoding instruction data with Anchor’s `BorshInstructionCoder`. + +## What we intentionally did not implement + +To keep `packages/devtools` dependency-free (no new npm deps), we do not include: + +- DAS/cNFT scanning (`searchAssets`) +- Token metadata fetching for tickers/URIs +- Extra RPC batching/axios helpers from upstream +- Anchor account diffing using `decodeIdlAccount` field-level comparisons + +If you want the full Sus feature set, consider integrating upstream `@helium/sus` in an application layer (not in this devtools package), or expanding this implementation with additional features as needed. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ecd65b9..c3a700b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: devDependencies: '@changesets/cli': - specifier: ^2.29.8 - version: 2.29.8(@types/node@24.10.15) + specifier: ^2.30.0 + version: 2.30.0(@types/node@24.12.0) '@solana/prettier-config-solana': specifier: 0.0.5 version: 0.0.5(prettier@3.8.1) @@ -21,17 +21,17 @@ importers: specifier: ^3.0.6 version: 3.0.6 '@types/node': - specifier: ^24.10.15 - version: 24.10.15 + specifier: ^24.12.0 + version: 24.12.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.56.1 - version: 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.57.0 + version: 8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) '@typescript-eslint/parser': - specifier: ^8.56.1 - version: 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.57.0 + version: 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) eslint: - specifier: ^9.39.3 - version: 9.39.3(jiti@2.6.1) + specifier: ^9.39.4 + version: 9.39.4(jiti@2.6.1) prettier: specifier: ^3.8.1 version: 3.8.1 @@ -42,14 +42,20 @@ importers: specifier: ^19.2.4 version: 19.2.4(react@19.2.4) turbo: - specifier: ^2.8.12 - version: 2.8.12 + specifier: ^2.8.17 + version: 2.8.17 examples/next-js: dependencies: '@base-ui/react': specifier: ^1.0.0 - version: 1.2.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.3.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@pipeit/actions': + specifier: ^0.1.1 + version: 0.1.2(@pipeit/core@0.2.7(22357f262e716ae2f314a28b0b8cbb91))(@solana/addresses@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/instruction-plans@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/instructions@6.3.1(typescript@5.9.3))(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6))(@solana/rpc-subscriptions@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6))(@solana/rpc@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/signers@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/transactions@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@pipeit/core': + specifier: ^0.2.5 + version: 0.2.7(22357f262e716ae2f314a28b0b8cbb91) '@radix-ui/react-accordion': specifier: ^1.2.3 version: 1.2.12(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -76,11 +82,11 @@ importers: version: 1.1.13(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@solana-program/system': specifier: ^0.7.0 - version: 0.7.0(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.7.0(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)) '@solana/connector': specifier: workspace:* version: link:../../packages/connector - '@solana/devtools': + '@solana/connector-debugger': specifier: workspace:* version: link:../../packages/devtools '@solana/keychain': @@ -88,10 +94,10 @@ importers: version: 0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/kit': specifier: ^6.0.0 - version: 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) '@solana/web3.js': specifier: ^1.98.4 - version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) '@tanstack/react-query': specifier: ^5.90.5 version: 5.90.21(react@19.2.4) @@ -100,7 +106,7 @@ importers: version: 1.1.0 '@walletconnect/universal-provider': specifier: ^2.23.0 - version: 2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + version: 2.23.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -112,7 +118,7 @@ importers: version: 0.546.0(react@19.2.4) motion: specifier: ^12.23.24 - version: 12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 12.36.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next: specifier: 16.1.0 version: 16.1.0(@babel/core@7.29.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) @@ -137,13 +143,13 @@ importers: devDependencies: '@eslint/eslintrc': specifier: ^3.3.1 - version: 3.3.4 + version: 3.3.5 '@tailwindcss/postcss': specifier: ^4.1.14 version: 4.2.1 '@types/node': specifier: ^24.8.1 - version: 24.10.15 + version: 24.12.0 '@types/qrcode': specifier: ^1.5.5 version: 1.5.6 @@ -158,10 +164,10 @@ importers: version: 15.5.13 eslint: specifier: ^9.38.0 - version: 9.39.3(jiti@2.6.1) + version: 9.39.4(jiti@2.6.1) eslint-config-next: specifier: 16.1.0 - version: 16.1.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + version: 16.1.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) tailwindcss: specifier: ^4.1.14 version: 4.2.1 @@ -176,7 +182,7 @@ importers: dependencies: '@solana-mobile/wallet-standard-mobile': specifier: ^0.4.3 - version: 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.9.3) + version: 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) '@solana/addresses': specifier: ^5.0.0 version: 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -206,7 +212,7 @@ importers: version: 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/kit': specifier: ^6.0.0 - version: 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) '@solana/signers': specifier: ^5.0.0 version: 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -218,7 +224,7 @@ importers: version: 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/web3.js': specifier: ^1.0.0 - version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) '@solana/webcrypto-ed25519-polyfill': specifier: ^4.0.0 version: 4.0.0(typescript@5.9.3) @@ -233,10 +239,10 @@ importers: version: 1.1.0 '@wallet-ui/core': specifier: ^2.1.0 - version: 2.2.2(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 2.2.2(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) '@walletconnect/universal-provider': specifier: ^2.0.0 - version: 2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + version: 2.23.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) zod: specifier: ^4.0.0 version: 4.3.6 @@ -261,7 +267,7 @@ importers: version: 3.2.4(vitest@3.2.4) happy-dom: specifier: ^20.0.7 - version: 20.7.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + version: 20.8.4(bufferutil@4.1.0) react: specifier: ^19.2.1 version: 19.2.4 @@ -270,44 +276,59 @@ importers: version: 19.2.4(react@19.2.4) tsup: specifier: ^8.5.0 - version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.9.3 version: 5.9.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.10.15)(@vitest/ui@3.2.4)(happy-dom@20.7.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) + version: 3.2.4(@types/node@24.12.0)(@vitest/ui@3.2.4)(happy-dom@20.8.4(bufferutil@4.1.0))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) packages/devtools: dependencies: + '@coral-xyz/anchor': + specifier: ^0.32.1 + version: 0.32.1(bufferutil@4.1.0)(typescript@5.9.3) '@solana-program/compute-budget': specifier: ^0.11.0 - version: 0.11.0(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.11.0(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@solana-program/program-metadata': + specifier: ^0.4.1 + version: 0.4.1(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) '@solana-program/system': specifier: ^0.10.0 - version: 0.10.0(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.10.0(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) '@solana-program/token': specifier: ^0.9.0 - version: 0.9.0(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + version: 0.9.0(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) '@solana-program/token-2022': specifier: ^0.6.1 - version: 0.6.1(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + version: 0.6.1(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/sysvars@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@solana/codecs': + specifier: ^5.0.0 + version: 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/connector': specifier: '>=0.1.0' - version: 0.2.4(@solana/keychain-aws-kms@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-fireblocks@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-privy@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-turnkey@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-vault@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(@walletconnect/universal-provider@2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 0.2.4(@solana/keychain-aws-kms@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-fireblocks@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-privy@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-turnkey@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-vault@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(@walletconnect/universal-provider@2.23.8(bufferutil@4.1.0)(typescript@5.9.3)(zod@4.3.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3) '@solana/kit': specifier: ^6.0.0 - version: 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + version: 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) '@solana/transaction-messages': specifier: ^5.0.0 version: 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/transactions': specifier: ^5.0.0 version: 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/web3.js': + specifier: ^1.98.4 + version: 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bn.js: + specifier: ^5.2.2 + version: 5.2.3 devDependencies: tsup: specifier: ^8.5.0 - version: 8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.2) + version: 8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -341,91 +362,91 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-kms@3.1000.0': - resolution: {integrity: sha512-aOVqRFXddOtMm6zJPM34KSdvsRU4xrb8NGwdcFubUWhCfr01loFTSBSi74mNoOMLNBaPHZZvDIByMsLdAqNqdw==} + '@aws-sdk/client-kms@3.1009.0': + resolution: {integrity: sha512-p/SKs/OT4s1ktCyzIrUOQE1UVWMLxvZ5Y1JIyizO6eal8R2KPdrPqYrpPq/XZsWi4lsMmALgkJ4mjXldSOtu2A==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.973.15': - resolution: {integrity: sha512-AlC0oQ1/mdJ8vCIqu524j5RB7M8i8E24bbkZmya1CuiQxkY7SdIZAyw7NDNMGaNINQFq/8oGRMX0HeOfCVsl/A==} + '@aws-sdk/core@3.973.20': + resolution: {integrity: sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.972.13': - resolution: {integrity: sha512-6ljXKIQ22WFKyIs1jbORIkGanySBHaPPTOI4OxACP5WXgbcR0nDYfqNJfXEGwCK7IzHdNbCSFsNKKs0qCexR8Q==} + '@aws-sdk/credential-provider-env@3.972.18': + resolution: {integrity: sha512-X0B8AlQY507i5DwjLByeU2Af4ARsl9Vr84koDcXCbAkplmU+1xBFWxEPrWRAoh56waBne/yJqEloSwvRf4x6XA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.972.15': - resolution: {integrity: sha512-dJuSTreu/T8f24SHDNTjd7eQ4rabr0TzPh2UTCwYexQtzG3nTDKm1e5eIdhiroTMDkPEJeY+WPkA6F9wod/20A==} + '@aws-sdk/credential-provider-http@3.972.20': + resolution: {integrity: sha512-ey9Lelj001+oOfrbKmS6R2CJAiXX7QKY4Vj9VJv6L2eE6/VjD8DocHIoYqztTm70xDLR4E1jYPTKfIui+eRNDA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.972.13': - resolution: {integrity: sha512-JKSoGb7XeabZLBJptpqoZIFbROUIS65NuQnEHGOpuT9GuuZwag2qciKANiDLFiYk4u8nSrJC9JIOnWKVvPVjeA==} + '@aws-sdk/credential-provider-ini@3.972.20': + resolution: {integrity: sha512-5flXSnKHMloObNF+9N0cupKegnH1Z37cdVlpETVgx8/rAhCe+VNlkcZH3HDg2SDn9bI765S+rhNPXGDJJPfbtA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.972.13': - resolution: {integrity: sha512-RtYcrxdnJHKY8MFQGLltCURcjuMjnaQpAxPE6+/QEdDHHItMKZgabRe/KScX737F9vJMQsmJy9EmMOkCnoC1JQ==} + '@aws-sdk/credential-provider-login@3.972.20': + resolution: {integrity: sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.972.14': - resolution: {integrity: sha512-WqoC2aliIjQM/L3oFf6j+op/enT2i9Cc4UTxxMEKrJNECkq4/PlKE5BOjSYFcq6G9mz65EFbXJh7zOU4CvjSKQ==} + '@aws-sdk/credential-provider-node@3.972.21': + resolution: {integrity: sha512-hah8if3/B/Q+LBYN5FukyQ1Mym6PLPDsBOBsIgNEYD6wLyZg0UmUF/OKIVC3nX9XH8TfTPuITK+7N/jenVACWA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.972.13': - resolution: {integrity: sha512-rsRG0LQA4VR+jnDyuqtXi2CePYSmfm5GNL9KxiW8DSe25YwJSr06W8TdUfONAC+rjsTI+aIH2rBGG5FjMeANrw==} + '@aws-sdk/credential-provider-process@3.972.18': + resolution: {integrity: sha512-Tpl7SRaPoOLT32jbTWchPsn52hYYgJ0kpiFgnwk8pxTANQdUymVSZkzFvv1+oOgZm1CrbQUP9MBeoMZ9IzLZjA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.972.13': - resolution: {integrity: sha512-fr0UU1wx8kNHDhTQBXioc/YviSW8iXuAxHvnH7eQUtn8F8o/FU3uu6EUMvAQgyvn7Ne5QFnC0Cj0BFlwCk+RFw==} + '@aws-sdk/credential-provider-sso@3.972.20': + resolution: {integrity: sha512-p+R+PYR5Z7Gjqf/6pvbCnzEHcqPCpLzR7Yf127HjJ6EAb4hUcD+qsNRnuww1sB/RmSeCLxyay8FMyqREw4p1RA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.972.13': - resolution: {integrity: sha512-a6iFMh1pgUH0TdcouBppLJUfPM7Yd3R9S1xFodPtCRoLqCz2RQFA3qjA8x4112PVYXEd4/pHX2eihapq39w0rA==} + '@aws-sdk/credential-provider-web-identity@3.972.20': + resolution: {integrity: sha512-rWCmh8o7QY4CsUj63qopzMzkDq/yPpkrpb+CnjBEFSOg/02T/we7sSTVg4QsDiVS9uwZ8VyONhq98qt+pIh3KA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.972.6': - resolution: {integrity: sha512-5XHwjPH1lHB+1q4bfC7T8Z5zZrZXfaLcjSMwTd1HPSPrCmPFMbg3UQ5vgNWcVj0xoX4HWqTGkSf2byrjlnRg5w==} + '@aws-sdk/middleware-host-header@3.972.8': + resolution: {integrity: sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.972.6': - resolution: {integrity: sha512-iFnaMFMQdljAPrvsCVKYltPt2j40LQqukAbXvW7v0aL5I+1GO7bZ/W8m12WxW3gwyK5p5u1WlHg8TSAizC5cZw==} + '@aws-sdk/middleware-logger@3.972.8': + resolution: {integrity: sha512-CWl5UCM57WUFaFi5kB7IBY1UmOeLvNZAZ2/OZ5l20ldiJ3TiIz1pC65gYj8X0BCPWkeR1E32mpsCk1L1I4n+lA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.972.6': - resolution: {integrity: sha512-dY4v3of5EEMvik6+UDwQ96KfUFDk8m1oZDdkSc5lwi4o7rFrjnv0A+yTV+gu230iybQZnKgDLg/rt2P3H+Vscw==} + '@aws-sdk/middleware-recursion-detection@3.972.8': + resolution: {integrity: sha512-BnnvYs2ZEpdlmZ2PNlV2ZyQ8j8AEkMTjN79y/YA475ER1ByFYrkVR85qmhni8oeTaJcDqbx364wDpitDAA/wCA==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.972.15': - resolution: {integrity: sha512-ABlFVcIMmuRAwBT+8q5abAxOr7WmaINirDJBnqGY5b5jSDo00UMlg/G4a0xoAgwm6oAECeJcwkvDlxDwKf58fQ==} + '@aws-sdk/middleware-user-agent@3.972.21': + resolution: {integrity: sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.996.3': - resolution: {integrity: sha512-AU5TY1V29xqwg/MxmA2odwysTez+ccFAhmfRJk+QZT5HNv90UTA9qKd1J9THlsQkvmH7HWTEV1lDNxkQO5PzNw==} + '@aws-sdk/nested-clients@3.996.10': + resolution: {integrity: sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.972.6': - resolution: {integrity: sha512-Aa5PusHLXAqLTX1UKDvI3pHQJtIsF7Q+3turCHqfz/1F61/zDMWfbTC8evjhrrYVAtz9Vsv3SJ/waSUeu7B6gw==} + '@aws-sdk/region-config-resolver@3.972.8': + resolution: {integrity: sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.999.0': - resolution: {integrity: sha512-cx0hHUlgXULfykx4rdu/ciNAJaa3AL5xz3rieCz7NKJ68MJwlj3664Y8WR5MGgxfyYJBdamnkjNSx5Kekuc0cg==} + '@aws-sdk/token-providers@3.1009.0': + resolution: {integrity: sha512-KCPLuTqN9u0Rr38Arln78fRG9KXpzsPWmof+PZzfAHMMQq2QED6YjQrkrfiH7PDefLWEposY1o4/eGwrmKA4JA==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.973.4': - resolution: {integrity: sha512-RW60aH26Bsc016Y9B98hC0Plx6fK5P2v/iQYwMzrSjiDh1qRMUCP6KrXHYEHe3uFvKiOC93Z9zk4BJsUi6Tj1Q==} + '@aws-sdk/types@3.973.6': + resolution: {integrity: sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.996.3': - resolution: {integrity: sha512-yWIQSNiCjykLL+ezN5A+DfBb1gfXTytBxm57e64lYmwxDHNmInYHRJYYRAGWG1o77vKEiWaw4ui28e3yb1k5aQ==} + '@aws-sdk/util-endpoints@3.996.5': + resolution: {integrity: sha512-Uh93L5sXFNbyR5sEPMzUU8tJ++Ku97EY4udmC01nB8Zu+xfBPwpIwJ6F7snqQeq8h2pf+8SGN5/NoytfKgYPIw==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-locate-window@3.965.4': - resolution: {integrity: sha512-H1onv5SkgPBK2P6JR2MjGgbOnttoNzSPIRoeZTNPZYyaplwGg50zS3amXvXqF0/qfXpWEC9rLWU564QTB9bSog==} + '@aws-sdk/util-locate-window@3.965.5': + resolution: {integrity: sha512-WhlJNNINQB+9qtLtZJcpQdgZw3SCDCpXdUJP7cToGwHbCWCnRckGlc6Bx/OhWwIYFNAn+FIydY8SZ0QmVu3xTQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-user-agent-browser@3.972.6': - resolution: {integrity: sha512-Fwr/llD6GOrFgQnKaI2glhohdGuBDfHfora6iG9qsBBBR8xv1SdCSwbtf5CWlUdCw5X7g76G/9Hf0Inh0EmoxA==} + '@aws-sdk/util-user-agent-browser@3.972.8': + resolution: {integrity: sha512-B3KGXJviV2u6Cdw2SDY2aDhoJkVfY/Q/Trwk2CMSkikE1Oi6gRzxhvhIfiRpHfmIsAhV4EA54TVEX8K6CbHbkA==} - '@aws-sdk/util-user-agent-node@3.973.0': - resolution: {integrity: sha512-A9J2G4Nf236e9GpaC1JnA8wRn6u6GjnOXiTwBLA6NUJhlBTIGfrTy+K1IazmF8y+4OFdW3O5TZlhyspJMqiqjA==} + '@aws-sdk/util-user-agent-node@3.973.7': + resolution: {integrity: sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -433,12 +454,12 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.972.8': - resolution: {integrity: sha512-Ql8elcUdYCha83Ol7NznBsgN5GVZnv3vUd86fEc6waU6oUdY0T1O9NODkEEOS/Uaogr87avDrUC6DSeM4oXjZg==} + '@aws-sdk/xml-builder@3.972.11': + resolution: {integrity: sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==} engines: {node: '>=20.0.0'} - '@aws/lambda-invoke-store@0.2.3': - resolution: {integrity: sha512-oLvsaPMTBejkkmHhjf09xTgk71mOqyr/409NKhRIL08If7AhVfUsJhVsx386uJaqNd42v9kWamQ9lFbkoC2dYw==} + '@aws/lambda-invoke-store@0.2.4': + resolution: {integrity: sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==} engines: {node: '>=18.0.0'} '@babel/code-frame@7.29.0': @@ -595,8 +616,8 @@ packages: resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} engines: {node: '>=6.9.0'} - '@base-ui/react@1.2.0': - resolution: {integrity: sha512-O6aEQHcm+QyGTFY28xuwRD3SEJGZOBDpyjN2WvpfWYFVhg+3zfXPysAILqtM0C1kWC82MccOE/v1j+GHXE4qIw==} + '@base-ui/react@1.3.0': + resolution: {integrity: sha512-FwpKqZbPz14AITp1CVgf4AjhKPe1OeeVKSBMdgD10zbFlj3QSWelmtCMLi2+/PFZZcIm3l87G7rwtCZJwHyXWA==} engines: {node: '>=14.0.0'} peerDependencies: '@types/react': ^17 || ^18 || ^19 @@ -606,8 +627,8 @@ packages: '@types/react': optional: true - '@base-ui/utils@0.2.5': - resolution: {integrity: sha512-oYC7w0gp76RI5MxprlGLV0wze0SErZaRl3AAkeP3OnNB/UBMb6RqNf6ZSIlxOc9Qp68Ab3C2VOcJQyRs7Xc7Vw==} + '@base-ui/utils@0.2.6': + resolution: {integrity: sha512-yQ+qeuqohwhsNpoYDqqXaLllYAkPCP4vYdDrVo8FQXaAPfHWm1pG/Vm+jmGTA5JFS0BAIjookyapuJFY8F9PIw==} peerDependencies: '@types/react': ^17 || ^18 || ^19 react: ^17 || ^18 || ^19 @@ -620,8 +641,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@changesets/apply-release-plan@7.0.14': - resolution: {integrity: sha512-ddBvf9PHdy2YY0OUiEl3TV78mH9sckndJR14QAt87KLEbIov81XO0q0QAmvooBxXlqRRP8I9B7XOzZwQG7JkWA==} + '@changesets/apply-release-plan@7.1.0': + resolution: {integrity: sha512-yq8ML3YS7koKQ/9bk1PqO0HMzApIFNwjlwCnwFEXMzNe8NpzeeYYKCmnhWJGkN8g7E51MnWaSbqRcTcdIxUgnQ==} '@changesets/assemble-release-plan@6.0.9': resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} @@ -629,12 +650,12 @@ packages: '@changesets/changelog-git@0.2.1': resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.29.8': - resolution: {integrity: sha512-1weuGZpP63YWUYjay/E84qqwcnt5yJMM0tep10Up7Q5cS/DGe2IZ0Uj3HNMxGhCINZuR7aO9WBMdKnPit5ZDPA==} + '@changesets/cli@2.30.0': + resolution: {integrity: sha512-5D3Nk2JPqMI1wK25pEymeWRSlSMdo5QOGlyfrKg0AOufrUcjEE3RQgaCpHoBiM31CSNrtSgdJ0U6zL1rLDDfBA==} hasBin: true - '@changesets/config@3.1.2': - resolution: {integrity: sha512-CYiRhA4bWKemdYi/uwImjPxqWNpqGPNbEBdX1BdONALFIDK7MCUj6FPkzD+z9gJcvDFUQJn9aDVf4UG7OT6Kog==} + '@changesets/config@3.1.3': + resolution: {integrity: sha512-vnXjcey8YgBn2L1OPWd3ORs0bGC4LoYcK/ubpgvzNVr53JXV5GiTVj7fWdMRsoKUH7hhhMAQnsJUqLr21EncNw==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} @@ -642,8 +663,8 @@ packages: '@changesets/get-dependents-graph@2.1.3': resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-release-plan@4.0.14': - resolution: {integrity: sha512-yjZMHpUHgl4Xl5gRlolVuxDkm4HgSJqT93Ri1Uz8kGrQb+5iJ8dkXJ20M2j/Y4iV5QzS2c5SeTxVSKX+2eMI0g==} + '@changesets/get-release-plan@4.0.15': + resolution: {integrity: sha512-Q04ZaRPuEVZtA+auOYgFaVQQSA98dXiVe/yFaZfY7hoSmQICHGvP0TF4u3EDNHWmmCS4ekA/XSpKlSM2PyTS2g==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} @@ -654,14 +675,14 @@ packages: '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.2': - resolution: {integrity: sha512-Uo5MC5mfg4OM0jU3up66fmSn6/NE9INK+8/Vn/7sMVcdWg46zfbvvUSjD9EMonVqPi9fbrJH9SXHn48Tr1f2yA==} + '@changesets/parse@0.4.3': + resolution: {integrity: sha512-ZDmNc53+dXdWEv7fqIUSgRQOLYoUom5Z40gmLgmATmYR9NbL6FJJHwakcCpzaeCy+1D0m0n7mT4jj2B/MQPl7A==} '@changesets/pre@2.0.2': resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.6': - resolution: {integrity: sha512-P5QaN9hJSQQKJShzzpBT13FzOSPyHbqdoIBUd2DJdgvnECCyO6LmAOWSV+O8se2TaZJVwSXjL+v9yhb+a9JeJg==} + '@changesets/read@0.6.7': + resolution: {integrity: sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA==} '@changesets/should-skip-package@0.1.2': resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} @@ -675,167 +696,181 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@emnapi/core@1.8.1': - resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} + '@coral-xyz/anchor-errors@0.31.1': + resolution: {integrity: sha512-NhNEku4F3zzUSBtrYz84FzYWm48+9OvmT1Hhnwr6GnPQry2dsEqH/ti/7ASjjpoFTWRnPXrjAIT1qM6Isop+LQ==} + engines: {node: '>=10'} + + '@coral-xyz/anchor@0.32.1': + resolution: {integrity: sha512-zAyxFtfeje2FbMA1wzgcdVs7Hng/MijPKpRijoySPCicnvcTQs/+dnPZ/cR+LcXM9v9UYSyW81uRNYZtN5G4yg==} + engines: {node: '>=17'} - '@emnapi/runtime@1.8.1': - resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + '@coral-xyz/borsh@0.31.1': + resolution: {integrity: sha512-9N8AU9F0ubriKfNE3g1WF0/4dtlGXoBN/hd1PvbNBamBNwRgHxH4P+o3Zt7rSEloW1HUs6LfZEchlx9fW7POYw==} + engines: {node: '>=10'} + peerDependencies: + '@solana/web3.js': ^1.69.0 - '@emnapi/wasi-threads@1.1.0': - resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emnapi/core@1.9.0': + resolution: {integrity: sha512-0DQ98G9ZQZOxfUcQn1waV2yS8aWdZ6kJMbYCJB3oUBecjWYO1fqJ+a1DRfPF3O5JEkwqwP1A9QEN/9mYm2Yd0w==} - '@esbuild/aix-ppc64@0.27.3': - resolution: {integrity: sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==} + '@emnapi/runtime@1.9.0': + resolution: {integrity: sha512-QN75eB0IH2ywSpRpNddCRfQIhmJYBCJ1x5Lb3IscKAL8bMnVAKnRg8dCoXbHzVLLH7P38N2Z3mtulB7W0J0FKw==} + + '@emnapi/wasi-threads@1.2.0': + resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==} + + '@esbuild/aix-ppc64@0.27.4': + resolution: {integrity: sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.27.3': - resolution: {integrity: sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==} + '@esbuild/android-arm64@0.27.4': + resolution: {integrity: sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.27.3': - resolution: {integrity: sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==} + '@esbuild/android-arm@0.27.4': + resolution: {integrity: sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.27.3': - resolution: {integrity: sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==} + '@esbuild/android-x64@0.27.4': + resolution: {integrity: sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.27.3': - resolution: {integrity: sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==} + '@esbuild/darwin-arm64@0.27.4': + resolution: {integrity: sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.27.3': - resolution: {integrity: sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==} + '@esbuild/darwin-x64@0.27.4': + resolution: {integrity: sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.27.3': - resolution: {integrity: sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==} + '@esbuild/freebsd-arm64@0.27.4': + resolution: {integrity: sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.27.3': - resolution: {integrity: sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==} + '@esbuild/freebsd-x64@0.27.4': + resolution: {integrity: sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.27.3': - resolution: {integrity: sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==} + '@esbuild/linux-arm64@0.27.4': + resolution: {integrity: sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.27.3': - resolution: {integrity: sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==} + '@esbuild/linux-arm@0.27.4': + resolution: {integrity: sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.27.3': - resolution: {integrity: sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==} + '@esbuild/linux-ia32@0.27.4': + resolution: {integrity: sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.27.3': - resolution: {integrity: sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==} + '@esbuild/linux-loong64@0.27.4': + resolution: {integrity: sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.27.3': - resolution: {integrity: sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==} + '@esbuild/linux-mips64el@0.27.4': + resolution: {integrity: sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.27.3': - resolution: {integrity: sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==} + '@esbuild/linux-ppc64@0.27.4': + resolution: {integrity: sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.27.3': - resolution: {integrity: sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==} + '@esbuild/linux-riscv64@0.27.4': + resolution: {integrity: sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.27.3': - resolution: {integrity: sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==} + '@esbuild/linux-s390x@0.27.4': + resolution: {integrity: sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.27.3': - resolution: {integrity: sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==} + '@esbuild/linux-x64@0.27.4': + resolution: {integrity: sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.27.3': - resolution: {integrity: sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==} + '@esbuild/netbsd-arm64@0.27.4': + resolution: {integrity: sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.27.3': - resolution: {integrity: sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==} + '@esbuild/netbsd-x64@0.27.4': + resolution: {integrity: sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.27.3': - resolution: {integrity: sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==} + '@esbuild/openbsd-arm64@0.27.4': + resolution: {integrity: sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.27.3': - resolution: {integrity: sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==} + '@esbuild/openbsd-x64@0.27.4': + resolution: {integrity: sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.27.3': - resolution: {integrity: sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==} + '@esbuild/openharmony-arm64@0.27.4': + resolution: {integrity: sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.27.3': - resolution: {integrity: sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==} + '@esbuild/sunos-x64@0.27.4': + resolution: {integrity: sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.27.3': - resolution: {integrity: sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==} + '@esbuild/win32-arm64@0.27.4': + resolution: {integrity: sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.27.3': - resolution: {integrity: sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==} + '@esbuild/win32-ia32@0.27.4': + resolution: {integrity: sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.27.3': - resolution: {integrity: sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==} + '@esbuild/win32-x64@0.27.4': + resolution: {integrity: sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -850,8 +885,8 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.21.1': - resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/config-helpers@0.4.2': @@ -862,12 +897,12 @@ packages: resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.3.4': - resolution: {integrity: sha512-4h4MVF8pmBsncB60r0wSJiIeUKTSD4m7FmTFThG8RHlsg9ajqckLm9OraguFGZE4vVdpiI1Q4+hFnisopmG6gQ==} + '@eslint/eslintrc@3.3.5': + resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.39.3': - resolution: {integrity: sha512-1B1VkCq6FuUNlQvlBYb+1jDu/gV297TIs/OeiaSR9l1H27SVW55ONE1e1Vp16NqP683+xEGzxYtv4XCiDPaQiw==} + '@eslint/js@9.39.4': + resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': @@ -878,20 +913,20 @@ packages: resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@floating-ui/core@1.7.4': - resolution: {integrity: sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg==} + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} - '@floating-ui/dom@1.7.5': - resolution: {integrity: sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg==} + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} - '@floating-ui/react-dom@2.1.7': - resolution: {integrity: sha512-0tLRojf/1Go2JgEVm+3Frg9A3IW8bJgKgdO0BN5RkF//ufuz2joZM63Npau2ff3J6lUVYgDSNzNkR+aH3IVfjg==} + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/utils@0.2.10': - resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} @@ -909,8 +944,11 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@img/colour@1.0.0': - resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + '@iarna/toml@2.2.5': + resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} + + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} engines: {node: '>=18'} '@img/sharp-darwin-arm64@0.34.5': @@ -1238,6 +1276,38 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@pipeit/actions@0.1.2': + resolution: {integrity: sha512-u3Hy7PwYpES6CvbhY/u77juAtWUEKtqyjEkPuoT0MaWz6Gcnp6J1sBH2l/MgK9uWmY/mUDIfhF4NjhpbMAoTEg==} + peerDependencies: + '@pipeit/core': ^0.2.6 + '@solana/addresses': ^6.0.1 + '@solana/instruction-plans': ^6.0.1 + '@solana/instructions': ^6.0.1 + '@solana/kit': ^6.0.1 + '@solana/rpc': ^6.0.1 + '@solana/rpc-subscriptions': ^6.0.1 + '@solana/signers': ^6.0.1 + '@solana/transactions': ^6.0.1 + + '@pipeit/core@0.2.7': + resolution: {integrity: sha512-52Yg7HeQWgAoQ829PaiP4orSCIzuzrzN8PWA6sKiMNJYM52vHQYcrMFldBsa9hpUrNKNESwgO/NKbiukBe24hw==} + peerDependencies: + '@solana-program/compute-budget': ^0.13.0 + '@solana/addresses': ^6.0.1 + '@solana/codecs-strings': ^6.0.1 + '@solana/errors': ^6.0.1 + '@solana/functional': ^6.0.1 + '@solana/instruction-plans': ^6.0.1 + '@solana/instructions': ^6.0.1 + '@solana/kit': ^6.0.1 + '@solana/programs': ^6.0.1 + '@solana/rpc': ^6.0.1 + '@solana/rpc-subscriptions': ^6.0.1 + '@solana/rpc-types': ^6.0.1 + '@solana/signers': ^6.0.1 + '@solana/transaction-messages': ^6.0.1 + '@solana/transactions': ^6.0.1 + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1869,176 +1939,176 @@ packages: '@sinonjs/fake-timers@10.3.0': resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - '@smithy/abort-controller@4.2.10': - resolution: {integrity: sha512-qocxM/X4XGATqQtUkbE9SPUB6wekBi+FyJOMbPj0AhvyvFGYEmOlz6VB22iMePCQsFmMIvFSeViDvA7mZJG47g==} + '@smithy/abort-controller@4.2.12': + resolution: {integrity: sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==} engines: {node: '>=18.0.0'} - '@smithy/config-resolver@4.4.9': - resolution: {integrity: sha512-ejQvXqlcU30h7liR9fXtj7PIAau1t/sFbJpgWPfiYDs7zd16jpH0IsSXKcba2jF6ChTXvIjACs27kNMc5xxE2Q==} + '@smithy/config-resolver@4.4.11': + resolution: {integrity: sha512-YxFiiG4YDAtX7WMN7RuhHZLeTmRRAOyCbr+zB8e3AQzHPnUhS8zXjB1+cniPVQI3xbWsQPM0X2aaIkO/ME0ymw==} engines: {node: '>=18.0.0'} - '@smithy/core@3.23.6': - resolution: {integrity: sha512-4xE+0L2NrsFKpEVFlFELkIHQddBvMbQ41LRIP74dGCXnY1zQ9DgksrBcRBDJT+iOzGy4VEJIeU3hkUK5mn06kg==} + '@smithy/core@3.23.11': + resolution: {integrity: sha512-952rGf7hBRnhUIaeLp6q4MptKW8sPFe5VvkoZ5qIzFAtx6c/QZ/54FS3yootsyUSf9gJX/NBqEBNdNR7jMIlpQ==} engines: {node: '>=18.0.0'} - '@smithy/credential-provider-imds@4.2.10': - resolution: {integrity: sha512-3bsMLJJLTZGZqVGGeBVFfLzuRulVsGTj12BzRKODTHqUABpIr0jMN1vN3+u6r2OfyhAQ2pXaMZWX/swBK5I6PQ==} + '@smithy/credential-provider-imds@4.2.12': + resolution: {integrity: sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==} engines: {node: '>=18.0.0'} - '@smithy/fetch-http-handler@5.3.11': - resolution: {integrity: sha512-wbTRjOxdFuyEg0CpumjZO0hkUl+fetJFqxNROepuLIoijQh51aMBmzFLfoQdwRjxsuuS2jizzIUTjPWgd8pd7g==} + '@smithy/fetch-http-handler@5.3.15': + resolution: {integrity: sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==} engines: {node: '>=18.0.0'} - '@smithy/hash-node@4.2.10': - resolution: {integrity: sha512-1VzIOI5CcsvMDvP3iv1vG/RfLJVVVc67dCRyLSB2Hn9SWCZrDO3zvcIzj3BfEtqRW5kcMg5KAeVf1K3dR6nD3w==} + '@smithy/hash-node@4.2.12': + resolution: {integrity: sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==} engines: {node: '>=18.0.0'} - '@smithy/invalid-dependency@4.2.10': - resolution: {integrity: sha512-vy9KPNSFUU0ajFYk0sDZIYiUlAWGEAhRfehIr5ZkdFrRFTAuXEPUd41USuqHU6vvLX4r6Q9X7MKBco5+Il0Org==} + '@smithy/invalid-dependency@4.2.12': + resolution: {integrity: sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==} engines: {node: '>=18.0.0'} '@smithy/is-array-buffer@2.2.0': resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} engines: {node: '>=14.0.0'} - '@smithy/is-array-buffer@4.2.1': - resolution: {integrity: sha512-Yfu664Qbf1B4IYIsYgKoABt010daZjkaCRvdU/sPnZG6TtHOB0md0RjNdLGzxe5UIdn9js4ftPICzmkRa9RJ4Q==} + '@smithy/is-array-buffer@4.2.2': + resolution: {integrity: sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==} engines: {node: '>=18.0.0'} - '@smithy/middleware-content-length@4.2.10': - resolution: {integrity: sha512-TQZ9kX5c6XbjhaEBpvhSvMEZ0klBs1CFtOdPFwATZSbC9UeQfKHPLPN9Y+I6wZGMOavlYTOlHEPDrt42PMSH9w==} + '@smithy/middleware-content-length@4.2.12': + resolution: {integrity: sha512-YE58Yz+cvFInWI/wOTrB+DbvUVz/pLn5mC5MvOV4fdRUc6qGwygyngcucRQjAhiCEbmfLOXX0gntSIcgMvAjmA==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.20': - resolution: {integrity: sha512-9W6Np4ceBP3XCYAGLoMCmn8t2RRVzuD1ndWPLBbv7H9CrwM9Bprf6Up6BM9ZA/3alodg0b7Kf6ftBK9R1N04vw==} + '@smithy/middleware-endpoint@4.4.25': + resolution: {integrity: sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.37': - resolution: {integrity: sha512-/1psZZllBBSQ7+qo5+hhLz7AEPGLx3Z0+e3ramMBEuPK2PfvLK4SrncDB9VegX5mBn+oP/UTDrM6IHrFjvX1ZA==} + '@smithy/middleware-retry@4.4.42': + resolution: {integrity: sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-serde@4.2.11': - resolution: {integrity: sha512-STQdONGPwbbC7cusL60s7vOa6He6A9w2jWhoapL0mgVjmR19pr26slV+yoSP76SIssMTX/95e5nOZ6UQv6jolg==} + '@smithy/middleware-serde@4.2.14': + resolution: {integrity: sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-stack@4.2.10': - resolution: {integrity: sha512-pmts/WovNcE/tlyHa8z/groPeOtqtEpp61q3W0nW1nDJuMq/x+hWa/OVQBtgU0tBqupeXq0VBOLA4UZwE8I0YA==} + '@smithy/middleware-stack@4.2.12': + resolution: {integrity: sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==} engines: {node: '>=18.0.0'} - '@smithy/node-config-provider@4.3.10': - resolution: {integrity: sha512-UALRbJtVX34AdP2VECKVlnNgidLHA2A7YgcJzwSBg1hzmnO/bZBHl/LDQQyYifzUwp1UOODnl9JJ3KNawpUJ9w==} + '@smithy/node-config-provider@4.3.12': + resolution: {integrity: sha512-tr2oKX2xMcO+rBOjobSwVAkV05SIfUKz8iI53rzxEmgW3GOOPOv0UioSDk+J8OpRQnpnhsO3Af6IEBabQBVmiw==} engines: {node: '>=18.0.0'} - '@smithy/node-http-handler@4.4.12': - resolution: {integrity: sha512-zo1+WKJkR9x7ZtMeMDAAsq2PufwiLDmkhcjpWPRRkmeIuOm6nq1qjFICSZbnjBvD09ei8KMo26BWxsu2BUU+5w==} + '@smithy/node-http-handler@4.4.16': + resolution: {integrity: sha512-ULC8UCS/HivdCB3jhi+kLFYe4B5gxH2gi9vHBfEIiRrT2jfKiZNiETJSlzRtE6B26XbBHjPtc8iZKSNqMol9bw==} engines: {node: '>=18.0.0'} - '@smithy/property-provider@4.2.10': - resolution: {integrity: sha512-5jm60P0CU7tom0eNrZ7YrkgBaoLFXzmqB0wVS+4uK8PPGmosSrLNf6rRd50UBvukztawZ7zyA8TxlrKpF5z9jw==} + '@smithy/property-provider@4.2.12': + resolution: {integrity: sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==} engines: {node: '>=18.0.0'} - '@smithy/protocol-http@5.3.10': - resolution: {integrity: sha512-2NzVWpYY0tRdfeCJLsgrR89KE3NTWT2wGulhNUxYlRmtRmPwLQwKzhrfVaiNlA9ZpJvbW7cjTVChYKgnkqXj1A==} + '@smithy/protocol-http@5.3.12': + resolution: {integrity: sha512-fit0GZK9I1xoRlR4jXmbLhoN0OdEpa96ul8M65XdmXnxXkuMxM0Y8HDT0Fh0Xb4I85MBvBClOzgSrV1X2s1Hxw==} engines: {node: '>=18.0.0'} - '@smithy/querystring-builder@4.2.10': - resolution: {integrity: sha512-HeN7kEvuzO2DmAzLukE9UryiUvejD3tMp9a1D1NJETerIfKobBUCLfviP6QEk500166eD2IATaXM59qgUI+YDA==} + '@smithy/querystring-builder@4.2.12': + resolution: {integrity: sha512-6wTZjGABQufekycfDGMEB84BgtdOE/rCVTov+EDXQ8NHKTUNIp/j27IliwP7tjIU9LR+sSzyGBOXjeEtVgzCHg==} engines: {node: '>=18.0.0'} - '@smithy/querystring-parser@4.2.10': - resolution: {integrity: sha512-4Mh18J26+ao1oX5wXJfWlTT+Q1OpDR8ssiC9PDOuEgVBGloqg18Fw7h5Ct8DyT9NBYwJgtJ2nLjKKFU6RP1G1Q==} + '@smithy/querystring-parser@4.2.12': + resolution: {integrity: sha512-P2OdvrgiAKpkPNKlKUtWbNZKB1XjPxM086NeVhK+W+wI46pIKdWBe5QyXvhUm3MEcyS/rkLvY8rZzyUdmyDZBw==} engines: {node: '>=18.0.0'} - '@smithy/service-error-classification@4.2.10': - resolution: {integrity: sha512-0R/+/Il5y8nB/By90o8hy/bWVYptbIfvoTYad0igYQO5RefhNCDmNzqxaMx7K1t/QWo0d6UynqpqN5cCQt1MCg==} + '@smithy/service-error-classification@4.2.12': + resolution: {integrity: sha512-LlP29oSQN0Tw0b6D0Xo6BIikBswuIiGYbRACy5ujw/JgWSzTdYj46U83ssf6Ux0GyNJVivs2uReU8pt7Eu9okQ==} engines: {node: '>=18.0.0'} - '@smithy/shared-ini-file-loader@4.4.5': - resolution: {integrity: sha512-pHgASxl50rrtOztgQCPmOXFjRW+mCd7ALr/3uXNzRrRoGV5G2+78GOsQ3HlQuBVHCh9o6xqMNvlIKZjWn4Euug==} + '@smithy/shared-ini-file-loader@4.4.7': + resolution: {integrity: sha512-HrOKWsUb+otTeo1HxVWeEb99t5ER1XrBi/xka2Wv6NVmTbuCUC1dvlrksdvxFtODLBjsC+PHK+fuy2x/7Ynyiw==} engines: {node: '>=18.0.0'} - '@smithy/signature-v4@5.3.10': - resolution: {integrity: sha512-Wab3wW8468WqTKIxI+aZe3JYO52/RYT/8sDOdzkUhjnLakLe9qoQqIcfih/qxcF4qWEFoWBszY0mj5uxffaVXA==} + '@smithy/signature-v4@5.3.12': + resolution: {integrity: sha512-B/FBwO3MVOL00DaRSXfXfa/TRXRheagt/q5A2NM13u7q+sHS59EOVGQNfG7DkmVtdQm5m3vOosoKAXSqn/OEgw==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.12.0': - resolution: {integrity: sha512-R8bQ9K3lCcXyZmBnQqUZJF4ChZmtWT5NLi6x5kgWx5D+/j0KorXcA0YcFg/X5TOgnTCy1tbKc6z2g2y4amFupQ==} + '@smithy/smithy-client@4.12.5': + resolution: {integrity: sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w==} engines: {node: '>=18.0.0'} - '@smithy/types@4.13.0': - resolution: {integrity: sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==} + '@smithy/types@4.13.1': + resolution: {integrity: sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==} engines: {node: '>=18.0.0'} - '@smithy/url-parser@4.2.10': - resolution: {integrity: sha512-uypjF7fCDsRk26u3qHmFI/ePL7bxxB9vKkE+2WKEciHhz+4QtbzWiHRVNRJwU3cKhrYDYQE3b0MRFtqfLYdA4A==} + '@smithy/url-parser@4.2.12': + resolution: {integrity: sha512-wOPKPEpso+doCZGIlr+e1lVI6+9VAKfL4kZWFgzVgGWY2hZxshNKod4l2LXS3PRC9otH/JRSjtEHqQ/7eLciRA==} engines: {node: '>=18.0.0'} - '@smithy/util-base64@4.3.1': - resolution: {integrity: sha512-BKGuawX4Doq/bI/uEmg+Zyc36rJKWuin3py89PquXBIBqmbnJwBBsmKhdHfNEp0+A4TDgLmT/3MSKZ1SxHcR6w==} + '@smithy/util-base64@4.3.2': + resolution: {integrity: sha512-XRH6b0H/5A3SgblmMa5ErXQ2XKhfbQB+Fm/oyLZ2O2kCUrwgg55bU0RekmzAhuwOjA9qdN5VU2BprOvGGUkOOQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-browser@4.2.1': - resolution: {integrity: sha512-SiJeLiozrAoCrgDBUgsVbmqHmMgg/2bA15AzcbcW+zan7SuyAVHN4xTSbq0GlebAIwlcaX32xacnrG488/J/6g==} + '@smithy/util-body-length-browser@4.2.2': + resolution: {integrity: sha512-JKCrLNOup3OOgmzeaKQwi4ZCTWlYR5H4Gm1r2uTMVBXoemo1UEghk5vtMi1xSu2ymgKVGW631e2fp9/R610ZjQ==} engines: {node: '>=18.0.0'} - '@smithy/util-body-length-node@4.2.2': - resolution: {integrity: sha512-4rHqBvxtJEBvsZcFQSPQqXP2b/yy/YlB66KlcEgcH2WNoOKCKB03DSLzXmOsXjbl8dJ4OEYTn31knhdznwk7zw==} + '@smithy/util-body-length-node@4.2.3': + resolution: {integrity: sha512-ZkJGvqBzMHVHE7r/hcuCxlTY8pQr1kMtdsVPs7ex4mMU+EAbcXppfo5NmyxMYi2XU49eqaz56j2gsk4dHHPG/g==} engines: {node: '>=18.0.0'} '@smithy/util-buffer-from@2.2.0': resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} engines: {node: '>=14.0.0'} - '@smithy/util-buffer-from@4.2.1': - resolution: {integrity: sha512-/swhmt1qTiVkaejlmMPPDgZhEaWb/HWMGRBheaxwuVkusp/z+ErJyQxO6kaXumOciZSWlmq6Z5mNylCd33X7Ig==} + '@smithy/util-buffer-from@4.2.2': + resolution: {integrity: sha512-FDXD7cvUoFWwN6vtQfEta540Y/YBe5JneK3SoZg9bThSoOAC/eGeYEua6RkBgKjGa/sz6Y+DuBZj3+YEY21y4Q==} engines: {node: '>=18.0.0'} - '@smithy/util-config-provider@4.2.1': - resolution: {integrity: sha512-462id/00U8JWFw6qBuTSWfN5TxOHvDu4WliI97qOIOnuC/g+NDAknTU8eoGXEPlLkRVgWEr03jJBLV4o2FL8+A==} + '@smithy/util-config-provider@4.2.2': + resolution: {integrity: sha512-dWU03V3XUprJwaUIFVv4iOnS1FC9HnMHDfUrlNDSh4315v0cWyaIErP8KiqGVbf5z+JupoVpNM7ZB3jFiTejvQ==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.36': - resolution: {integrity: sha512-R0smq7EHQXRVMxkAxtH5akJ/FvgAmNF6bUy/GwY/N20T4GrwjT633NFm0VuRpC+8Bbv8R9A0DoJ9OiZL/M3xew==} + '@smithy/util-defaults-mode-browser@4.3.41': + resolution: {integrity: sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.39': - resolution: {integrity: sha512-otWuoDm35btJV1L8MyHrPl462B07QCdMTktKc7/yM+Psv6KbED/ziXiHnmr7yPHUjfIwE9S8Max0LO24Mo3ZVg==} + '@smithy/util-defaults-mode-node@4.2.44': + resolution: {integrity: sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ==} engines: {node: '>=18.0.0'} - '@smithy/util-endpoints@3.3.1': - resolution: {integrity: sha512-xyctc4klmjmieQiF9I1wssBWleRV0RhJ2DpO8+8yzi2LO1Z+4IWOZNGZGNj4+hq9kdo+nyfrRLmQTzc16Op2Vg==} + '@smithy/util-endpoints@3.3.3': + resolution: {integrity: sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==} engines: {node: '>=18.0.0'} - '@smithy/util-hex-encoding@4.2.1': - resolution: {integrity: sha512-c1hHtkgAWmE35/50gmdKajgGAKV3ePJ7t6UtEmpfCWJmQE9BQAQPz0URUVI89eSkcDqCtzqllxzG28IQoZPvwA==} + '@smithy/util-hex-encoding@4.2.2': + resolution: {integrity: sha512-Qcz3W5vuHK4sLQdyT93k/rfrUwdJ8/HZ+nMUOyGdpeGA1Wxt65zYwi3oEl9kOM+RswvYq90fzkNDahPS8K0OIg==} engines: {node: '>=18.0.0'} - '@smithy/util-middleware@4.2.10': - resolution: {integrity: sha512-LxaQIWLp4y0r72eA8mwPNQ9va4h5KeLM0I3M/HV9klmFaY2kN766wf5vsTzmaOpNNb7GgXAd9a25P3h8T49PSA==} + '@smithy/util-middleware@4.2.12': + resolution: {integrity: sha512-Er805uFUOvgc0l8nv0e0su0VFISoxhJ/AwOn3gL2NWNY2LUEldP5WtVcRYSQBcjg0y9NfG8JYrCJaYDpupBHJQ==} engines: {node: '>=18.0.0'} - '@smithy/util-retry@4.2.10': - resolution: {integrity: sha512-HrBzistfpyE5uqTwiyLsFHscgnwB0kgv8vySp7q5kZ0Eltn/tjosaSGGDj/jJ9ys7pWzIP/icE2d+7vMKXLv7A==} + '@smithy/util-retry@4.2.12': + resolution: {integrity: sha512-1zopLDUEOwumjcHdJ1mwBHddubYF8GMQvstVCLC54Y46rqoHwlIU+8ZzUeaBcD+WCJHyDGSeZ2ml9YSe9aqcoQ==} engines: {node: '>=18.0.0'} - '@smithy/util-stream@4.5.15': - resolution: {integrity: sha512-OlOKnaqnkU9X+6wEkd7mN+WB7orPbCVDauXOj22Q7VtiTkvy7ZdSsOg4QiNAZMgI4OkvNf+/VLUC3VXkxuWJZw==} + '@smithy/util-stream@4.5.19': + resolution: {integrity: sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==} engines: {node: '>=18.0.0'} - '@smithy/util-uri-escape@4.2.1': - resolution: {integrity: sha512-YmiUDn2eo2IOiWYYvGQkgX5ZkBSiTQu4FlDo5jNPpAxng2t6Sjb6WutnZV9l6VR4eJul1ABmCrnWBC9hKHQa6Q==} + '@smithy/util-uri-escape@4.2.2': + resolution: {integrity: sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==} engines: {node: '>=18.0.0'} '@smithy/util-utf8@2.3.0': resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} engines: {node: '>=14.0.0'} - '@smithy/util-utf8@4.2.1': - resolution: {integrity: sha512-DSIwNaWtmzrNQHv8g7DBGR9mulSit65KSj5ymGEIAknmIN8IpbZefEep10LaMG/P/xquwbmJ1h9ectz8z6mV6g==} + '@smithy/util-utf8@4.2.2': + resolution: {integrity: sha512-75MeYpjdWRe8M5E3AW0O4Cx3UadweS+cwdXjwYGBW5h/gxxnbeZ877sLPX/ZJA9GVTlL/qG0dXP29JWFCD1Ayw==} engines: {node: '>=18.0.0'} - '@smithy/uuid@1.1.1': - resolution: {integrity: sha512-dSfDCeihDmZlV2oyr0yWPTUfh07suS+R5OB+FZGiv/hHyK3hrFBW5rR1UYjfa57vBsrP9lciFkRPzebaV1Qujw==} + '@smithy/uuid@1.1.2': + resolution: {integrity: sha512-O/IEdcCUKkubz60tFbGA7ceITTAJsty+lBjNoorP4Z6XRqaFb/OjQjZODophEcuq68nKm6/0r+6/lLQ+XVpk8g==} engines: {node: '>=18.0.0'} '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5': @@ -2049,11 +2119,22 @@ packages: '@solana-mobile/wallet-standard-mobile@0.4.4': resolution: {integrity: sha512-LMvqkS5/aEH+EiDje9Dk351go6wO3POysgmobM4qm8RsG5s6rDAW3U0zA+5f2coGCTyRx8BKE1I/9nHlwtBuow==} + '@solana-program/compute-budget@0.10.0': + resolution: {integrity: sha512-UAJpPViY4N/6HtaxBfE92YGob6RDaasIb2v9BiVf44JIpue5b7pNJ2wbFxE/89EPX91xhGCwkDP/+ZgsuCQT1A==} + peerDependencies: + '@solana/kit': ^4.0 + '@solana-program/compute-budget@0.11.0': resolution: {integrity: sha512-7f1ePqB/eURkTwTOO9TNIdUXZcyrZoX3Uy2hNo7cXMfNhPFWp9AVgIyRNBc2jf15sdUa9gNpW+PfP2iV8AYAaw==} peerDependencies: '@solana/kit': ^5.0 + '@solana-program/program-metadata@0.4.1': + resolution: {integrity: sha512-JnCgiNg/+y5JSSQQCPLawtdDjUNlqp3UBcdNUB4ysVtYHf7DtHviZYIkbNzVF8mm+qdUONtwvLJXu6HOpI6Bvg==} + hasBin: true + peerDependencies: + '@solana/kit': ^4.0 + '@solana-program/system@0.10.0': resolution: {integrity: sha512-Go+LOEZmqmNlfr+Gjy5ZWAdY5HbYzk2RBewD9QinEU/bBSzpFfzqDRT55JjFRBGJUvMgf3C2vfXEGT4i8DSI4g==} peerDependencies: @@ -2064,6 +2145,11 @@ packages: peerDependencies: '@solana/kit': ^2.1.0 + '@solana-program/system@0.9.1': + resolution: {integrity: sha512-2N30CgYJw0qX8jKU8vW808yLmx5oRoDSM+FC6tqhsLQiph7agK9eRXJlnrq6OUfTAZd5yCYQHQvGtx0S8I9SAA==} + peerDependencies: + '@solana/kit': ^5.0 + '@solana-program/token-2022@0.6.1': resolution: {integrity: sha512-Ex02cruDMGfBMvZZCrggVR45vdQQSI/unHVpt/7HPt/IwFYB4eTlXtO8otYZyqV/ce5GqZ8S6uwyRf0zy6fdbA==} peerDependencies: @@ -2084,8 +2170,8 @@ packages: typescript: optional: true - '@solana/accounts@6.1.0': - resolution: {integrity: sha512-0jhmhSSS71ClLtBQIDrLlhkiNER4M9RIXTl1eJ1yJoFlE608JaKHTjNWsdVKdke7uBD6exdjNZkIVmouQPHMcA==} + '@solana/accounts@6.3.1': + resolution: {integrity: sha512-6HlpxGVWbSMUEEdRovU4Blkc63uOyD/wNyLtiO3A99R8qFG49Ae95m37sBMd7+jqOw2/Ik4Lrmvb4r5mF9JiIw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2102,8 +2188,8 @@ packages: typescript: optional: true - '@solana/addresses@6.1.0': - resolution: {integrity: sha512-QT04Vie4iICaalQQRJFMGj/P56IxXiwFtVuZHu1qjZUNmuGTOvX6G98b27RaGtLzpJ3NIku/6OtKxLUBqAKAyQ==} + '@solana/addresses@6.3.1': + resolution: {integrity: sha512-XlNRV0vOrxe28EVr4diG8tR0n8jn+8Z1GYw+Bm66z07GlyZOd4ArqgbiWU6WH6MCMiNb6TiY3msXp1SGH6Oy1A==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2120,8 +2206,8 @@ packages: typescript: optional: true - '@solana/assertions@6.1.0': - resolution: {integrity: sha512-pLgxB2xxTk2QfTaWpnRpSMYgaPkKYDQgptRvbwmuDQnOW1Zopg+42MT2UrDGd3UFMML1uOFPxIwKM6m51H0uXw==} + '@solana/assertions@6.3.1': + resolution: {integrity: sha512-QNO9QhwDSOQWjXihK+eaJ1fmaQ/4KGHFErx/ukS0cW0665ugd5wWBp2xQ+YUyCt0Ce9/v9bPzczPIcpi0AMXBg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2154,8 +2240,8 @@ packages: typescript: optional: true - '@solana/codecs-core@6.1.0': - resolution: {integrity: sha512-5rNnDOOm2GRFMJbd9imYCPNvGOrQ+TZ53NCkFFWbbB7f+L9KkLeuuAsDMFN1lCziJFlymvN785YtDnMeWj2W+g==} + '@solana/codecs-core@6.3.1': + resolution: {integrity: sha512-OwklAT1GnY72Gg2Yd7NoKi4WeUAUl9DfTOdLXJmTcOGSB05K742X3yVwyiMsX1cs8V8DB8KOHGQjeO0XLUUCEQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2172,8 +2258,8 @@ packages: typescript: optional: true - '@solana/codecs-data-structures@6.1.0': - resolution: {integrity: sha512-1cb9g5hrrucTuGkGxqVVq7dCwSMnn4YqwTe365iKkK8HBpLBmUl8XATf1MUs5UtDun1g9eNWOL72Psr8mIUqTQ==} + '@solana/codecs-data-structures@6.3.1': + resolution: {integrity: sha512-dSndxfKKKQTFxqAlH3jQEaLs5NFYcIF2HRSi60jB3w8pVEiVcvjIgYF7bG4HJ61EKb/6kgicUhdLBi+5aj7qHw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2202,8 +2288,8 @@ packages: typescript: optional: true - '@solana/codecs-numbers@6.1.0': - resolution: {integrity: sha512-YPQwwl6LE3igH23ah+d8kgpyE5xFcPbuwhxCDsLWqY/ESrvO/0YQSbsgIXahbhZxN59ZC4uq1LnHhBNbpCSVQg==} + '@solana/codecs-numbers@6.3.1': + resolution: {integrity: sha512-rudL1RjVBdpD60QPn3DhATQzxuBnrUn6N/QHzSyB24oPr/wgIJY++slgitpxCBtjSOvcIe6iYDOPTwd6lyTpjQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2230,8 +2316,8 @@ packages: typescript: optional: true - '@solana/codecs-strings@6.1.0': - resolution: {integrity: sha512-pRH5uAn4VCFUs2rYiDITyWsRnpvs3Uh/nhSc6OSP/kusghcCcCJcUzHBIjT4x08MVacXmGUlSLe/9qPQO+QK3Q==} + '@solana/codecs-strings@6.3.1': + resolution: {integrity: sha512-ODcenZ9kkQjbhU4jrXtXLeYqr957XkypU3/rph/o+rbgye9BtO6aAZaSMoHcAu3vqC9Ix9BdcQAD8kpC41CWrg==} engines: {node: '>=20.18.0'} peerDependencies: fastestsmallesttextencoderdecoder: ^1.0.22 @@ -2251,8 +2337,8 @@ packages: typescript: optional: true - '@solana/codecs@6.1.0': - resolution: {integrity: sha512-VHBS3t8fyVjE0Nqo6b4TUnzdwdRaVo+B5ufHhPLbbjkEXzz8HB4E/OBjgasn+zWGlfScfQAiBFOsfZjbVWu4XA==} + '@solana/codecs@6.3.1': + resolution: {integrity: sha512-v8ocwl7YIfs6lQ/1BR3/78GQjUjcFHGtJtHZAoB76Kzm+TlB9RIqxQPpDxNQitJcmRyWFmd1QhOsVEUUSO1hMg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2313,8 +2399,8 @@ packages: typescript: optional: true - '@solana/errors@6.1.0': - resolution: {integrity: sha512-cqSwcw3Rmn85UR7PyF5nKPdlQsRYBkx7YGRvFaJ6Sal1PM+bfolhL5iT7STQoXxdhXGYwHMPg7kZYxmMdjwnJA==} + '@solana/errors@6.3.1': + resolution: {integrity: sha512-56497UfLZRLEvtQq09FO8PuLr6bciSP6HWoQ/sZvPMNL5LXJ6z2W1qaY6r8CibHrBoVH9vmVW+DdgQE63K4cIw==} engines: {node: '>=20.18.0'} hasBin: true peerDependencies: @@ -2332,8 +2418,8 @@ packages: typescript: optional: true - '@solana/fast-stable-stringify@6.1.0': - resolution: {integrity: sha512-QXUfDFaJCFeARsxJgScWmJ153Tit7Cimk9y0UWWreNBr2Aphi67Nlcj/tr7UABTO0Qaw/0gwrK76zz3m1t3nIw==} + '@solana/fast-stable-stringify@6.3.1': + resolution: {integrity: sha512-UqK4MckdOpLXXV1rOZp21om3MtSTi/gTFI1Es/TFh2v2+qDQf54/PyH6xQEotjPWvW0ekp2YInj1W9+Zi99ueg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2350,8 +2436,8 @@ packages: typescript: optional: true - '@solana/functional@6.1.0': - resolution: {integrity: sha512-+Sm8ldVxSTHIKaZDvcBu81FPjknXx6OMPlakkKmXjKxPgVLl86ruqMo2yEwoDUHV7DysLrLLcRNn13rfulomRw==} + '@solana/functional@6.3.1': + resolution: {integrity: sha512-WCqih7trFtYkjuFJBmIgOZhFB4LfjxatN6r8vaEXeXIOi2DDuXdUHcPxINb3bulOnivwigBM4815Ap7lF8TTPg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2368,8 +2454,8 @@ packages: typescript: optional: true - '@solana/instruction-plans@6.1.0': - resolution: {integrity: sha512-zcsHg544t1zn7LLOVUxOWYlsKn9gvT7R+pL3cTiP2wFNoUN0h9En87H6nVqkZ8LWw23asgW0uM5uJGwfBx2h1Q==} + '@solana/instruction-plans@6.3.1': + resolution: {integrity: sha512-AgEmvrM8s+z7wYzDGj3ymJXfqMl0yirq2prQWFHTM7Qi6B7O7vvIjRXkQpyV/hzsaXtqtTMahGByQ3V04CdQCQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2386,8 +2472,8 @@ packages: typescript: optional: true - '@solana/instructions@6.1.0': - resolution: {integrity: sha512-w1LdbJ3yanESckNTYC5KPckgN/25FyGCm07WWrs+dCnnpRNeLiVHIytXCPmArOVAXVkOYidXzhWmqCzqKUjYaA==} + '@solana/instructions@6.3.1': + resolution: {integrity: sha512-iRRgmA9bTrI6A17zVwsDqg8PViGcixmj+BxsXVFM2BkJSdmfi0A4NHB11sOCF7icEQhdp1jnXibSkOglBYOEOA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2425,8 +2511,8 @@ packages: typescript: optional: true - '@solana/keys@6.1.0': - resolution: {integrity: sha512-C/SGCl3VOgBQZ0mLrMxCcJYnMsGpgE8wbx29jqRY+R91m5YhS1f/GfXJPR1lN/h7QGrJ6YDm8eI0Y3AZ7goKHg==} + '@solana/keys@6.3.1': + resolution: {integrity: sha512-pjgeVwuAgJMOOnrmrViTJnhx+HcagGAFAMiVZUYv28zR5GdP5clbBL7FSDT8Kqhye4s75+zxS6YDDwvhhCsKqQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2443,8 +2529,8 @@ packages: typescript: optional: true - '@solana/kit@6.1.0': - resolution: {integrity: sha512-24exn11BPonquufyCkGgypVtmN4JOsdGMsbF3EZ4kFyk7ZNryCn/N8eELr1FCVrHWRXoc0xy/HFaESBULTMf6g==} + '@solana/kit@6.3.1': + resolution: {integrity: sha512-4KUAYxZnGq5JQrDGKcD4VAhPEEYHUEKeypnxKtlbAN8oHiBrFbVWqkDah24H+LKThVhoNdlmaUSyDGG/TFmAUg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2461,8 +2547,8 @@ packages: typescript: optional: true - '@solana/nominal-types@6.1.0': - resolution: {integrity: sha512-+skHjN0arNNB9TLsGqA94VCx7euyGURI+qG6wck6E4D7hH6i6DxGiVrtKRghx+smJkkLtTm9BvdVKGoeNQYr7Q==} + '@solana/nominal-types@6.3.1': + resolution: {integrity: sha512-ovpJ9JUVwJWWOEgrQjJXh5YPokCdKcNtiq7jrFwUUQrNsqhc+v68v7qoIzzmF8XH7xRfaqy5aSKs6E/CeNxwLw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2479,8 +2565,8 @@ packages: typescript: optional: true - '@solana/offchain-messages@6.1.0': - resolution: {integrity: sha512-jrUb7HGUnRA+k44upcqKeevtEdqMxYRSlFdE0JTctZunGlP3GCcTl12tFOpbnFHvBLt8RwS62+nyeES8zzNwXA==} + '@solana/offchain-messages@6.3.1': + resolution: {integrity: sha512-O6lA2FvxstTzWKP+NGK+IP5UD+UnK2xqXJiUdac+yZ4smfUINEtnj63rc2/9+qShvLVhWS8AqtFkiz4tk4msbg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2497,8 +2583,8 @@ packages: typescript: optional: true - '@solana/options@6.1.0': - resolution: {integrity: sha512-/4FtVfR6nkHkMCumyh7/lJ6jMqyES6tKUbOJRa6gJxcIUWeRDu+XrHTHLf3gRNUqDAbFvW8FMIrQm7PdreZgRA==} + '@solana/options@6.3.1': + resolution: {integrity: sha512-lBVcXli518q4bKyxm680COLI/HFuFUgEZQVaOMZbhXyKbu94vbMWQTJ3NV12BN6XNUyXq/C0I+ckYgD+Eb5YJA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2515,8 +2601,8 @@ packages: typescript: optional: true - '@solana/plugin-core@6.1.0': - resolution: {integrity: sha512-2nmNCPa6B1QArqpAZHWUkK6K7UXLTrekfcfJm2V//ATEtLpKEBlv0c3mrhOYwNAKP2TpNuvEV33InXWKst9oXQ==} + '@solana/plugin-core@6.3.1': + resolution: {integrity: sha512-A0VAlxSOA9H0jL27iVLAhdTo3P9sWGMPhuGDg+mFgiYgGzyGdyWDmnx5/pKA02KHTKaDkj4XbGPsV4O69tiZ2g==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2524,8 +2610,8 @@ packages: typescript: optional: true - '@solana/plugin-interfaces@6.1.0': - resolution: {integrity: sha512-eWSzfOuwtHUp8vljf5V24Tkz3WxqxiV0vD/BJZBNRZMdYRw3Cw3oeWcvEqHHxGUOie6AjIK8GrKggi8F73ZXbg==} + '@solana/plugin-interfaces@6.3.1': + resolution: {integrity: sha512-GVL04hoPvUUNoQpR1S2W6dsoAnMUketpH/5+V4LJF6mIrI5d6oQkobTBpRAIyT/EiaunVcwtFllbev/etA4+Ug==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2538,8 +2624,8 @@ packages: peerDependencies: prettier: ^3.2.0 - '@solana/program-client-core@6.1.0': - resolution: {integrity: sha512-5Apka+ulWNfLNLYNR63pLnr5XvkXTQWeaftWED93iTWTZrZv9SyFWcmIsaes6eqGXMQ3RhlebnrWODtKuAA62g==} + '@solana/program-client-core@6.3.1': + resolution: {integrity: sha512-V4WtLnDJA8GZZ3xwFg2rte/GIgVFrRCGtlhgjCTsE6ct4vXSSSkez7Dyod7eIqhsHZVC4Brq6n3BuuC4GciUzg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2556,8 +2642,8 @@ packages: typescript: optional: true - '@solana/programs@6.1.0': - resolution: {integrity: sha512-i4L4gSlIHDsdYRt3/YKVKMIN3UuYSKHRqK9B+AejcIc0y6Y/AXnHqzmpBRXEhvTXz18nt59MLXpVU4wu7ASjJA==} + '@solana/programs@6.3.1': + resolution: {integrity: sha512-gDmgJbGRqEmJuTvBThquSVZZvqO9jwbYwQ0IWB+VBqu52FXH1DyJU48YvZd3j9egzwqNoanEnRX8QGoBWKBuSw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2574,8 +2660,8 @@ packages: typescript: optional: true - '@solana/promises@6.1.0': - resolution: {integrity: sha512-/mUW6peXQiEOaylLpGv4vtkvPzQvSbfhX9j5PNIK/ry4S3SHRQ3j3W/oGy4y3LR5alwo7NcVbubrkh4e4xwcww==} + '@solana/promises@6.3.1': + resolution: {integrity: sha512-mVArbzD8quxrVG54CFfod78ufbSi/bmBNCsSc7Ll0GuiH7hmB6ym3A9vfXgmjUkoJGZAAmA1c0B+75NjafUg9Q==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2592,8 +2678,8 @@ packages: typescript: optional: true - '@solana/rpc-api@6.1.0': - resolution: {integrity: sha512-+hO5+kZjJHuUNATUQxlJ1+ztXFkgn1j46zRwt3X7kF+VHkW3wsQ7up0JTS+Xsacmkrj1WKfymQweq8JTrsAG8A==} + '@solana/rpc-api@6.3.1': + resolution: {integrity: sha512-BSuylWAx7osPd9b5/RbVnVU8FvaJpJ9ZevFBpbwHxoiEFfPO2kA7WaCLbNZ/ErTdxbySSmUtD+oskq+f8t++Vg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2610,8 +2696,8 @@ packages: typescript: optional: true - '@solana/rpc-parsed-types@6.1.0': - resolution: {integrity: sha512-YKccynVgWt/gbs0tBYstNw6BSVuOeWdeAldTB2OgH95o2Q04DpO4v97X1MZDysA4SvSZM30Ek5Ni5ss3kskgdw==} + '@solana/rpc-parsed-types@6.3.1': + resolution: {integrity: sha512-dy3lDkaeNj4MCbz6KKmO4eghAUa2fp5kdQYuou09JBOUNqaVQGnYOIH2aOZY80VU7tgmqYViVUzX+EtwXxXpkQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2628,8 +2714,8 @@ packages: typescript: optional: true - '@solana/rpc-spec-types@6.1.0': - resolution: {integrity: sha512-tldMv1b6VGcvcRrY5MDWKlsyEKH6K96zE7gAIpKDX2G4T47ZOV+OMA3nh6xQpRgtyCUBsej0t80qmvTBDX/5IQ==} + '@solana/rpc-spec-types@6.3.1': + resolution: {integrity: sha512-D67H6madoPn0KzzkWsBarFBlNetqCdIP1ZBBMdPLztvlWeVPBf5B3E91BjNPpWhGc2rseBBuLgRLAaj+x9IZTg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2646,8 +2732,8 @@ packages: typescript: optional: true - '@solana/rpc-spec@6.1.0': - resolution: {integrity: sha512-RxpkIGizCYhXGUcap7npV2S/rAXZ7P/liozY/ExjMmCxYTDwGIW33kp/uH/JRxuzrL8+f8FqY76VsqqIe+2VZw==} + '@solana/rpc-spec@6.3.1': + resolution: {integrity: sha512-xK8DIbjPQ7xBcLEj6mq3atSeixltJAYi/rmPRjUcuRSqXraLyTBEzH/hZqItgcTRSyl3/mG0ShT6yGaZtnZSew==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2664,8 +2750,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-api@6.1.0': - resolution: {integrity: sha512-I6J+3VU0dda6EySKbDyd+1urC7RGIRPRp0DcWRVcy68NOLbq0I5C40Dn9O2Zf8iCdK4PbQ7JKdCvZ/bDd45hdg==} + '@solana/rpc-subscriptions-api@6.3.1': + resolution: {integrity: sha512-w+yKkBWm067+M0OVircPoBdMqAmfYi7wRD5MBze+znDZwnm9RRHWoYE9/2JnXX+4p9HGItNDz8Rw26p968yayw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2682,8 +2768,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-channel-websocket@6.1.0': - resolution: {integrity: sha512-vsx9b+uyCr9L3giao/BTiBFA8DxV5+gDNFq0t5uL21uQ17JXzBektwzHuHoth9IjkvXV/h+IhwXfuLE9Qm4GQg==} + '@solana/rpc-subscriptions-channel-websocket@6.3.1': + resolution: {integrity: sha512-ndHPIMhH1Ph4CueOdNSnxv546s4wXWLDCulk36xxnwiDQspy500sjeNrBhzYTSyKYmuLjeOz1KFJS+RAU4gT0w==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2700,8 +2786,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions-spec@6.1.0': - resolution: {integrity: sha512-P06jhqzHpZGaLeJmIQkpDeMDD1xUp53ARpmXMsduMC+U5ZKQt29CLo+JrR18boNtls6WfttjVMEbzF25/4UPVA==} + '@solana/rpc-subscriptions-spec@6.3.1': + resolution: {integrity: sha512-GZZ6Vxupi4dv9MNbQWjopEDQwWPD1MX1dXwbqqOAIrpZcVSohqN8ppgHB5GVQSG8fMk4/yXMHw0UlqBhM7ZDlg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2718,8 +2804,8 @@ packages: typescript: optional: true - '@solana/rpc-subscriptions@6.1.0': - resolution: {integrity: sha512-sqwj+cQinWcZ7M/9+cudKxMPTkTQyGP73980vPCWM7vCpPkp2qzgrEie4DdgDGo+NMwIjeFgu2kdUuLHI3GD/g==} + '@solana/rpc-subscriptions@6.3.1': + resolution: {integrity: sha512-+s47DRgt8ZVl34QQLJbIhU9P47XMKDTMVy2HgduqoE0uLH8icI2zaGlCtKQlgfpc6VL7gzUkSAZgFycCWZPTzw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2736,8 +2822,8 @@ packages: typescript: optional: true - '@solana/rpc-transformers@6.1.0': - resolution: {integrity: sha512-OsSuuRPmsmS02eR9Zz+4iTsr+21hvEMEex5vwbwN6LAGPFlQ4ohqGkxgZCwmYd+Q5HWpnn9Uuf1MDTLLrKQkig==} + '@solana/rpc-transformers@6.3.1': + resolution: {integrity: sha512-FDyqd8zK0x4rjFrocg8GkS3SAW+ZFSJ24iPD+oMW2jbXzmiMvj9riw4qTa647PeeG/yvRvDJwKO1AkD5pMR9Ew==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2754,8 +2840,8 @@ packages: typescript: optional: true - '@solana/rpc-transport-http@6.1.0': - resolution: {integrity: sha512-3ebaTYuglLJagaXtjwDPVI7SQeeeFN2fpetpGKsuMAiti4fzYqEkNN8FIo+nXBzqqG/cVc2421xKjXl6sO1k/g==} + '@solana/rpc-transport-http@6.3.1': + resolution: {integrity: sha512-Y1sq/Ir5/WHlcQy7XQOnnw7DLvNyvQDvKlsKB/wqvwp3AYy4A1crqGKPhT3SldTA3XvKDKqF1uKnzpFlJHt5wQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2772,8 +2858,8 @@ packages: typescript: optional: true - '@solana/rpc-types@6.1.0': - resolution: {integrity: sha512-lR+Cb3v5Rpl49HsXWASy++TSE1AD86eRKabY+iuWnbBMYVGI4MamAvYwgBiygsCNc30nyO2TFNj9STMeSD/gAg==} + '@solana/rpc-types@6.3.1': + resolution: {integrity: sha512-NoaWcKy79y5FuDDEWIAgOSiGVs74FWSVynF+DXDYb1wwArFDvf7PEHLZ0Z4cqjuUKuVcPDnYraJ85K7ovirVqA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2790,8 +2876,8 @@ packages: typescript: optional: true - '@solana/rpc@6.1.0': - resolution: {integrity: sha512-R3y5PklW9mPy5Y34hsXj40R28zN2N7AGLnHqYJVkXkllwVub/QCNpSdDxAnbbS5EGOYGoUOW8s5LFoXwMSr1LQ==} + '@solana/rpc@6.3.1': + resolution: {integrity: sha512-ApTgWby/J/8DcQWRN5DQDSFEA//Ctect9j/gmOK/TLoIinuN/Wy8dVrsD8wwr69rxoeo/USt89sckE3YGm4wXA==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2808,8 +2894,8 @@ packages: typescript: optional: true - '@solana/signers@6.1.0': - resolution: {integrity: sha512-WDPGZJr6jIe2dEChv/2KQBnaga8dqOjd6ceBj/HcDHxnCudo66t7GlyZ9+9jMO40AgOOb7EDE5FDqPMrHMg5Yw==} + '@solana/signers@6.3.1': + resolution: {integrity: sha512-PYvMKHASkz12tqVc28MKOugs9HefXRLorQHQb2dd8zL/r/FwvM9d95z5g4JzGqf5v3FTpK495lTalgDvuCOQeQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2826,8 +2912,8 @@ packages: typescript: optional: true - '@solana/subscribable@6.1.0': - resolution: {integrity: sha512-HiUfkxN7638uxPmY4t0gI4+yqnFLZYJKFaT9EpWIuGrOB1d9n+uOHNs3NU7cVMwWXgfZUbztTCKyCVTbcwesNg==} + '@solana/subscribable@6.3.1': + resolution: {integrity: sha512-g4KuISHyy6IUxU9Qf8+ER2nGAEMKO5m6RTLuqrT9I1nujvOPmivnBm3YykxMFXljIcep0DMwTYlCXfnDhySsbw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2844,8 +2930,8 @@ packages: typescript: optional: true - '@solana/sysvars@6.1.0': - resolution: {integrity: sha512-KwJyBBrAOx0BgkiZqOKAaySDb/0JrUFSBQL9/O1kSKGy9TCRX55Ytr1HxNTcTPppWNpbM6JZVK+yW3Ruey0HRw==} + '@solana/sysvars@6.3.1': + resolution: {integrity: sha512-kPNxVZVcBdVeUOTb7YyUCZEx45aUsYBhYpNDUQ+sW9XKg2SiP9q5LOP/QtngM9fhUAw9lI25WzjQpAKjaGijyg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2862,8 +2948,8 @@ packages: typescript: optional: true - '@solana/transaction-confirmation@6.1.0': - resolution: {integrity: sha512-akSjcqAMOGPFvKctFDSzhjcRc/45WbEVdVQ9mjgH6OYo7B11WZZZaeGPlzAw5KyuG34Px941xmICkBmNqEH47Q==} + '@solana/transaction-confirmation@6.3.1': + resolution: {integrity: sha512-FFbmMNcGYR9PHqHcyAuiWHwPq9LVxkfaYOohiAR5cWLmharSGSqFQem3oEVXlTluk/X46K9TeVRHePXjURg0Og==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2880,8 +2966,8 @@ packages: typescript: optional: true - '@solana/transaction-messages@6.1.0': - resolution: {integrity: sha512-Dpv54LRVcfFbFEa/uB53LaY/TRfKuPGMKR7Z4F290zBgkj9xkpZkI+WLiJBiSloI7Qo2KZqXj3514BIeZvJLcg==} + '@solana/transaction-messages@6.3.1': + resolution: {integrity: sha512-XRT2NCmGaij49zGjjT43p4yiRGYQWUpVeAB6V13TRGn3oJiTvfgMaE4Rp9ODrJrfgsTTeMb7yrnvNIfuowiPXw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -2898,8 +2984,8 @@ packages: typescript: optional: true - '@solana/transactions@6.1.0': - resolution: {integrity: sha512-1dkiNJcTtlHm4Fvs5VohNVpv7RbvbUYYKV7lYXMPIskoLF1eZp0tVlEqD/cRl91RNz7HEysfHqBAwlcJcRmrRg==} + '@solana/transactions@6.3.1': + resolution: {integrity: sha512-J09e2Cj2SLu55N5aIyw53t/vfP6tvN9mutsfY3slefVGkd2rnv6CcCX7bGRLRSdCUPygTtHu+Kjo1pcwflRlLw==} engines: {node: '>=20.18.0'} peerDependencies: typescript: ^5.0.0 @@ -3151,8 +3237,8 @@ packages: '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} - '@types/node@24.10.15': - resolution: {integrity: sha512-BgjLoRuSr0MTI5wA6gMw9Xy0sFudAaUuvrnjgGx9wZ522fYYLA5SYJ+1Y30vTcJEG+DRCyDHx/gzQVfofYzSdg==} + '@types/node@24.12.0': + resolution: {integrity: sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==} '@types/qrcode@1.5.6': resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==} @@ -3174,8 +3260,8 @@ packages: '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} - '@types/uuid@8.3.4': - resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} '@types/whatwg-mimetype@3.0.2': resolution: {integrity: sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==} @@ -3192,63 +3278,63 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@typescript-eslint/eslint-plugin@8.56.1': - resolution: {integrity: sha512-Jz9ZztpB37dNC+HU2HI28Bs9QXpzCz+y/twHOwhyrIRdbuVDxSytJNDl6z/aAKlaRIwC7y8wJdkBv7FxYGgi0A==} + '@typescript-eslint/eslint-plugin@8.57.0': + resolution: {integrity: sha512-qeu4rTHR3/IaFORbD16gmjq9+rEs9fGKdX0kF6BKSfi+gCuG3RCKLlSBYzn/bGsY9Tj7KE/DAQStbp8AHJGHEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.56.1 + '@typescript-eslint/parser': ^8.57.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.56.1': - resolution: {integrity: sha512-klQbnPAAiGYFyI02+znpBRLyjL4/BrBd0nyWkdC0s/6xFLkXYQ8OoRrSkqacS1ddVxf/LDyODIKbQ5TgKAf/Fg==} + '@typescript-eslint/parser@8.57.0': + resolution: {integrity: sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.56.1': - resolution: {integrity: sha512-TAdqQTzHNNvlVFfR+hu2PDJrURiwKsUvxFn1M0h95BB8ah5jejas08jUWG4dBA68jDMI988IvtfdAI53JzEHOQ==} + '@typescript-eslint/project-service@8.57.0': + resolution: {integrity: sha512-pR+dK0BlxCLxtWfaKQWtYr7MhKmzqZxuii+ZjuFlZlIGRZm22HnXFqa2eY+90MUz8/i80YJmzFGDUsi8dMOV5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.56.1': - resolution: {integrity: sha512-YAi4VDKcIZp0O4tz/haYKhmIDZFEUPOreKbfdAN3SzUDMcPhJ8QI99xQXqX+HoUVq8cs85eRKnD+rne2UAnj2w==} + '@typescript-eslint/scope-manager@8.57.0': + resolution: {integrity: sha512-nvExQqAHF01lUM66MskSaZulpPL5pgy5hI5RfrxviLgzZVffB5yYzw27uK/ft8QnKXI2X0LBrHJFr1TaZtAibw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.56.1': - resolution: {integrity: sha512-qOtCYzKEeyr3aR9f28mPJqBty7+DBqsdd63eO0yyDwc6vgThj2UjWfJIcsFeSucYydqcuudMOprZ+x1SpF3ZuQ==} + '@typescript-eslint/tsconfig-utils@8.57.0': + resolution: {integrity: sha512-LtXRihc5ytjJIQEH+xqjB0+YgsV4/tW35XKX3GTZHpWtcC8SPkT/d4tqdf1cKtesryHm2bgp6l555NYcT2NLvA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.56.1': - resolution: {integrity: sha512-yB/7dxi7MgTtGhZdaHCemf7PuwrHMenHjmzgUW1aJpO+bBU43OycnM3Wn+DdvDO/8zzA9HlhaJ0AUGuvri4oGg==} + '@typescript-eslint/type-utils@8.57.0': + resolution: {integrity: sha512-yjgh7gmDcJ1+TcEg8x3uWQmn8ifvSupnPfjP21twPKrDP/pTHlEQgmKcitzF/rzPSmv7QjJ90vRpN4U+zoUjwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.56.1': - resolution: {integrity: sha512-dbMkdIUkIkchgGDIv7KLUpa0Mda4IYjo4IAMJUZ+3xNoUXxMsk9YtKpTHSChRS85o+H9ftm51gsK1dZReY9CVw==} + '@typescript-eslint/types@8.57.0': + resolution: {integrity: sha512-dTLI8PEXhjUC7B9Kre+u0XznO696BhXcTlOn0/6kf1fHaQW8+VjJAVHJ3eTI14ZapTxdkOmc80HblPQLaEeJdg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.56.1': - resolution: {integrity: sha512-qzUL1qgalIvKWAf9C1HpvBjif+Vm6rcT5wZd4VoMb9+Km3iS3Cv9DY6dMRMDtPnwRAFyAi7YXJpTIEXLvdfPxg==} + '@typescript-eslint/typescript-estree@8.57.0': + resolution: {integrity: sha512-m7faHcyVg0BT3VdYTlX8GdJEM7COexXxS6KqGopxdtkQRvBanK377QDHr4W/vIPAR+ah9+B/RclSW5ldVniO1Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.56.1': - resolution: {integrity: sha512-HPAVNIME3tABJ61siYlHzSWCGtOoeP2RTIaHXFMPqjrQKCGB9OgUVdiNgH7TJS2JNIQ5qQ4RsAUDuGaGme/KOA==} + '@typescript-eslint/utils@8.57.0': + resolution: {integrity: sha512-5iIHvpD3CZe06riAsbNxxreP+MuYgVUsV0n4bwLH//VJmgtt54sQeY2GszntJ4BjYCpMzrfVh2SBnUQTtys2lQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.56.1': - resolution: {integrity: sha512-KiROIzYdEV85YygXw6BI/Dx4fnBlFQu6Mq4QE4MOH9fFnhohw6wX/OAvDY2/C+ut0I3RSPKenvZJIVYqJNkhEw==} + '@typescript-eslint/visitor-keys@8.57.0': + resolution: {integrity: sha512-zm6xx8UT/Xy2oSr2ZXD0pZo7Jx2XsCoID2IUh9YSTFRu7z+WdwYTRk6LhUftm1crwqbuoF6I8zAFeCMw0YjwDg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -3420,8 +3506,8 @@ packages: peerDependencies: '@solana/kit': ^5.0.0 - '@walletconnect/core@2.23.7': - resolution: {integrity: sha512-yTyymn9mFaDZkUfLfZ3E9VyaSDPeHAXlrPxQRmNx2zFsEt/25GmTU2A848aomimLxZnAG2jNLhxbJ8I0gyNV+w==} + '@walletconnect/core@2.23.8': + resolution: {integrity: sha512-559+fA6Hh9CkEIOtrWKdDWoa3HL47glDF7D75LbqQzv4v325KXq24KEsjzDPBYr7pI49gQo7P2HpPnY1ax+8Aw==} engines: {node: '>=18.20.8'} '@walletconnect/environment@1.0.1': @@ -3468,20 +3554,20 @@ packages: '@walletconnect/safe-json@1.0.2': resolution: {integrity: sha512-Ogb7I27kZ3LPC3ibn8ldyUr5544t3/STow9+lzz7Sfo808YD7SBWk7SAsdBFlYgP2zDRy2hS3sKRcuSRM0OTmA==} - '@walletconnect/sign-client@2.23.7': - resolution: {integrity: sha512-SX61lzb1bTl/LijlcHQttnoHPBzzoY5mW9ArR6qhFtDNDTS7yr2rcH7rCngxHlYeb4rAYcWLHgbiGSrdKxl/mg==} + '@walletconnect/sign-client@2.23.8': + resolution: {integrity: sha512-7DtFDQZwOK4E9q+TKWL819d01dpNHA3jMcntSsQqSLNU34orbkDB/BJzW4nyWZ6H9DuGHRvibJA9wvfXjOCWBw==} '@walletconnect/time@1.0.2': resolution: {integrity: sha512-uzdd9woDcJ1AaBZRhqy5rNC9laqWGErfc4dxA9a87mPdKOgWMD85mcFo9dIYIts/Jwocfwn07EC6EzclKubk/g==} - '@walletconnect/types@2.23.7': - resolution: {integrity: sha512-6PAKK+iR2IntmlkCFLMAHjYeIaerCJJYRDmdRimhon0u+aNmQT+HyGM6zxDAth0rdpBD7qEvKP5IXZTE7KFUhw==} + '@walletconnect/types@2.23.8': + resolution: {integrity: sha512-OI/0Z7/8r11EDU9bBPy5nixYgsk6SrTcOvWe9r7Nf2WvkMcPLgV7aS8rb6+nInRmDPfXuyTgzdAox0rtmfJMzg==} - '@walletconnect/universal-provider@2.23.7': - resolution: {integrity: sha512-6UicU/Mhr/1bh7MNoajypz7BhigORbHpP1LFTf8FYLQGDqzmqHMqmMH2GDAImtaY2sFTi2jBvc22tLl8VMze/A==} + '@walletconnect/universal-provider@2.23.8': + resolution: {integrity: sha512-TFn2TNhp5vlbV2HqPU/LfkEIYZEop4WDCTTZKw/RU4DbM1e1+etmvTr5JA+8dkZU7ee48mVUDodY0zQedP+KZA==} - '@walletconnect/utils@2.23.7': - resolution: {integrity: sha512-3p38gNrkVcIiQixVrlsWSa66Gjs5PqHOug2TxDgYUVBW5NcKjwQA08GkC6CKBQUfr5iaCtbfy6uZJW1LKSIvWQ==} + '@walletconnect/utils@2.23.8': + resolution: {integrity: sha512-vJrRrZFZANWmnEEnWnfVSnpQ+jdjqBb5fqSgp0VGeRX3pNr2KAHJ0TwNnEN+fbhR76JxuFrpcY7HJUT7DHDJ7w==} '@walletconnect/window-getters@1.0.1': resolution: {integrity: sha512-vHp+HqzGxORPAN8gY03qnbTMnhqIwjeRJNOMOAzePRg4xVEEE2WvYsI9G2NMjOknA8hnuYbU3/hwLcKbjhc8+Q==} @@ -3693,8 +3779,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.10.0: - resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + baseline-browser-mapping@2.10.8: + resolution: {integrity: sha512-PCLz/LXGBsNTErbtB6i5u4eLpHeMfi93aUv5duMmj6caNu6IphS4q6UevDnL36sZQv9lrP11dbPKGMaXPwMKfQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -3745,6 +3831,10 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer-layout@1.2.2: + resolution: {integrity: sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==} + engines: {node: '>=4.5'} + buffer@6.0.3: resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} @@ -3786,8 +3876,8 @@ packages: resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} engines: {node: '>=10'} - caniuse-lite@1.0.30001774: - resolution: {integrity: sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==} + caniuse-lite@1.0.30001779: + resolution: {integrity: sha512-U5og2PN7V4DMgF50YPNtnZJGWVLFjjsN3zb6uMT5VGYIewieDj1upwfuVNXf4Kor+89c3iCRJnSzMD5LmTvsfA==} chai@5.3.3: resolution: {integrity: sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==} @@ -4052,8 +4142,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.302: - resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} + electron-to-chromium@1.5.313: + resolution: {integrity: sha512-QBMrTWEf00GXZmJyx2lbYD45jpI3TUFnNIzJ5BBc8piGUDwMPa1GV6HJWTZVvY/eiN3fSopl7NRbgGp9sZ9LTA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -4069,8 +4159,8 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} - enhanced-resolve@5.19.0: - resolution: {integrity: sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==} + enhanced-resolve@5.20.0: + resolution: {integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -4096,8 +4186,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.2: - resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} + es-iterator-helpers@1.3.1: + resolution: {integrity: sha512-zWwRvqWiuBPr0muUG/78cW3aHROFCNIQ3zpmYDpwdbnt2m+xlNyRWpHBpa2lJjSBit7BQ+RXA1iwbSmu5yJ/EQ==} engines: {node: '>= 0.4'} es-module-lexer@1.7.0: @@ -4128,8 +4218,8 @@ packages: es6-promisify@5.0.0: resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} - esbuild@0.27.3: - resolution: {integrity: sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==} + esbuild@0.27.4: + resolution: {integrity: sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==} engines: {node: '>=18'} hasBin: true @@ -4238,8 +4328,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@9.39.3: - resolution: {integrity: sha512-VmQ+sifHUbI/IcSopBCF/HO3YiHQx/AVd3UVyYL6weuwW+HvON9VYn5l6Zl1WZzPWXPNZrSQpxwkkZ/VuvJZzg==} + eslint@9.39.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -4284,6 +4374,9 @@ packages: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} + eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.1: resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} @@ -4328,8 +4421,11 @@ packages: fast-stable-stringify@1.0.0: resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} - fast-xml-parser@5.3.6: - resolution: {integrity: sha512-QNI3sAvSvaOiaMl8FYU4trnEzCwiRr8XMWgAHzlrWpTSj+QaCSvOf1h82OEP1s4hiAXhnbXSyFWCf4ldZzZRVA==} + fast-xml-builder@1.1.3: + resolution: {integrity: sha512-1o60KoFw2+LWKQu3IdcfcFlGTW4dpqEWmjhYec6H82AYZU2TVBXep6tMl8Z1Y+wM+ZrzCwe3BZ9Vyd9N2rIvmg==} + + fast-xml-parser@5.4.1: + resolution: {integrity: sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==} hasBin: true fastestsmallesttextencoderdecoder@1.0.22: @@ -4388,8 +4484,8 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + flatted@3.4.1: + resolution: {integrity: sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==} flow-enums-runtime@0.0.6: resolution: {integrity: sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==} @@ -4406,8 +4502,8 @@ packages: resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} engines: {node: '>=0.4.x'} - framer-motion@12.34.3: - resolution: {integrity: sha512-v81ecyZKYO/DfpTwHivqkxSUBzvceOpoI+wLfgCgoUIKxlFKEXdg0oR9imxwXumT4SFy8vRk9xzJ5l3/Du/55Q==} + framer-motion@12.36.0: + resolution: {integrity: sha512-4PqYHAT7gev0ke0wos+PyrcFxI0HScjm3asgU8nSYa8YzJFuwgIvdj3/s3ZaxLq0bUSboIn19A2WS/MHwLCvfw==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -4525,11 +4621,11 @@ packages: graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - h3@1.15.5: - resolution: {integrity: sha512-xEyq3rSl+dhGX2Lm0+eFQIAzlDN6Fs0EcC4f7BNUmzaRX/PTzeuM+Tr2lHB8FoXggsQIeXLj8EDVgs5ywxyxmg==} + h3@1.15.6: + resolution: {integrity: sha512-oi15ESLW5LRthZ+qPCi5GNasY/gvynSKUQxgiovrY63bPAtG59wtM+LSrlcwvOHAXzGrXVLnI97brbkdPF9WoQ==} - happy-dom@20.7.0: - resolution: {integrity: sha512-hR/uLYQdngTyEfxnOoa+e6KTcfBFyc1hgFj/Cc144A5JJUuHFYqIEBDcD4FeGqUeKLRZqJ9eN9u7/GDjYEgS1g==} + happy-dom@20.8.4: + resolution: {integrity: sha512-GKhjq4OQCYB4VLFBzv8mmccUadwlAusOZOI7hC1D9xDIT5HhzkJK17c4el2f6R6C715P9xB4uiMxeKUa2nHMwQ==} engines: {node: '>=20.0.0'} has-bigints@1.1.0: @@ -4881,8 +4977,8 @@ packages: resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} hasBin: true - jose@6.1.3: - resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} + jose@6.2.1: + resolution: {integrity: sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==} joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} @@ -5079,8 +5175,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.2.6: - resolution: {integrity: sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==} + lru-cache@11.2.7: + resolution: {integrity: sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==} engines: {node: 20 || >=22} lru-cache@5.1.1: @@ -5125,61 +5221,61 @@ packages: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} - metro-babel-transformer@0.83.4: - resolution: {integrity: sha512-xfNtsYIigybqm9xVL3ygTYYNFyYTMf2lGg/Wt+znVGtwcjXoRPG80WlL5SS09ZjYVei3MoE920i7MNr7ukSULA==} + metro-babel-transformer@0.83.5: + resolution: {integrity: sha512-d9FfmgUEVejTiSb7bkQeLRGl6aeno2UpuPm3bo3rCYwxewj03ymvOn8s8vnS4fBqAPQ+cE9iQM40wh7nGXR+eA==} engines: {node: '>=20.19.4'} - metro-cache-key@0.83.4: - resolution: {integrity: sha512-Y8E6mm1alkYIRzmfkOdrwXMzJ4HKANYiZE7J2d3iYTwmnLIQG+aoIpvla+bo6LRxH1Gm3qjEiOl+LbxvPCzIug==} + metro-cache-key@0.83.5: + resolution: {integrity: sha512-Ycl8PBajB7bhbAI7Rt0xEyiF8oJ0RWX8EKkolV1KfCUlC++V/GStMSGpPLwnnBZXZWkCC5edBPzv1Hz1Yi0Euw==} engines: {node: '>=20.19.4'} - metro-cache@0.83.4: - resolution: {integrity: sha512-Pm6CiksVms0cZNDDe/nFzYr1xpXzJLOSwvOjl4b3cYtXxEFllEjD6EeBgoQK5C8yk7U54PcuRaUAFSvJ+eCKbg==} + metro-cache@0.83.5: + resolution: {integrity: sha512-oH+s4U+IfZyg8J42bne2Skc90rcuESIYf86dYittcdWQtPfcaFXWpByPyTuWk3rR1Zz3Eh5HOrcVImfEhhJLng==} engines: {node: '>=20.19.4'} - metro-config@0.83.4: - resolution: {integrity: sha512-ydOgMNI9aT8l2LOTOugt1FvC7getPKG9uJo9Vclg9/RWJxbwkBF/FMBm6w5gH8NwJokSmQrbNkojXPn7nm0kGw==} + metro-config@0.83.5: + resolution: {integrity: sha512-JQ/PAASXH7yczgV6OCUSRhZYME+NU8NYjI2RcaG5ga4QfQ3T/XdiLzpSb3awWZYlDCcQb36l4Vl7i0Zw7/Tf9w==} engines: {node: '>=20.19.4'} - metro-core@0.83.4: - resolution: {integrity: sha512-EE+j/imryd3og/6Ly9usku9vcTLQr2o4IDax/izsr6b0HRqZK9k6f5SZkGkOPqnsACLq6csPCx+2JsgF9DkVbw==} + metro-core@0.83.5: + resolution: {integrity: sha512-YcVcLCrf0ed4mdLa82Qob0VxYqfhmlRxUS8+TO4gosZo/gLwSvtdeOjc/Vt0pe/lvMNrBap9LlmvZM8FIsMgJQ==} engines: {node: '>=20.19.4'} - metro-file-map@0.83.4: - resolution: {integrity: sha512-RSZLpGQhW9topefjJ9dp77Ff7BP88b17sb/YjxLHC1/H0lJVYYC9Cgqua21Vxe4RUJK2z64hw72g+ySLGTCawA==} + metro-file-map@0.83.5: + resolution: {integrity: sha512-ZEt8s3a1cnYbn40nyCD+CsZdYSlwtFh2kFym4lo+uvfM+UMMH+r/BsrC6rbNClSrt+B7rU9T+Te/sh/NL8ZZKQ==} engines: {node: '>=20.19.4'} - metro-minify-terser@0.83.4: - resolution: {integrity: sha512-KmZnpxfj0nPIRkbBNTc6xul5f5GPvWL5kQ1UkisB7qFkgh6+UiJG+L4ukJ2sK7St6+8Za/Cb68MUEYkUouIYcQ==} + metro-minify-terser@0.83.5: + resolution: {integrity: sha512-Toe4Md1wS1PBqbvB0cFxBzKEVyyuYTUb0sgifAZh/mSvLH84qA1NAWik9sISWatzvfWf3rOGoUoO5E3f193a3Q==} engines: {node: '>=20.19.4'} - metro-resolver@0.83.4: - resolution: {integrity: sha512-drWdylyNqgdaJufz0GjU/ielv2hjcc6piegjjJwKn8l7A/72aLQpUpOHtP+GMR+kOqhSsD4MchhJ6PSANvlSEw==} + metro-resolver@0.83.5: + resolution: {integrity: sha512-7p3GtzVUpbAweJeCcUJihJeOQl1bDuimO5ueo1K0BUpUtR41q5EilbQ3klt16UTPPMpA+tISWBtsrqU556mY1A==} engines: {node: '>=20.19.4'} - metro-runtime@0.83.4: - resolution: {integrity: sha512-sWj9KN311yG22Zv0kVbAp9dorB9HtTThvQKsAn6PLxrVrz+1UBsLrQSxjE/s4PtzDi1HABC648jo4K9Euz/5jw==} + metro-runtime@0.83.5: + resolution: {integrity: sha512-f+b3ue9AWTVlZe2Xrki6TAoFtKIqw30jwfk7GQ1rDUBQaE0ZQ+NkiMEtb9uwH7uAjJ87U7Tdx1Jg1OJqUfEVlA==} engines: {node: '>=20.19.4'} - metro-source-map@0.83.4: - resolution: {integrity: sha512-pPbmQwS0zgU+/0u5KPkuvlsQP0V+WYQ9qNshqupIL720QRH0vS3QR25IVVtbunofEDJchI11Q4QtIbmUyhpOBw==} + metro-source-map@0.83.5: + resolution: {integrity: sha512-VT9bb2KO2/4tWY9Z2yeZqTUao7CicKAOps9LUg2aQzsz+04QyuXL3qgf1cLUVRjA/D6G5u1RJAlN1w9VNHtODQ==} engines: {node: '>=20.19.4'} - metro-symbolicate@0.83.4: - resolution: {integrity: sha512-clyWAXDgkDHPwvldl95pcLTrJIqUj9GbZayL8tfeUs69ilsIUBpVym2lRd/8l3/8PIHCInxL868NvD2Y7OqKXg==} + metro-symbolicate@0.83.5: + resolution: {integrity: sha512-EMIkrjNRz/hF+p0RDdxoE60+dkaTLPN3vaaGkFmX5lvFdO6HPfHA/Ywznzkev+za0VhPQ5KSdz49/MALBRteHA==} engines: {node: '>=20.19.4'} hasBin: true - metro-transform-plugins@0.83.4: - resolution: {integrity: sha512-c0ROVcyvdaGPUFIg2N5nEQF4xbsqB2p1PPPhVvK1d/Y7ZhBAFiwQ75so0SJok32q+I++lc/hq7IdPCp2frPGQg==} + metro-transform-plugins@0.83.5: + resolution: {integrity: sha512-KxYKzZL+lt3Os5H2nx7YkbkWVduLZL5kPrE/Yq+Prm/DE1VLhpfnO6HtPs8vimYFKOa58ncl60GpoX0h7Wm0Vw==} engines: {node: '>=20.19.4'} - metro-transform-worker@0.83.4: - resolution: {integrity: sha512-6I81IZLeU/0ww7OBgCPALFl0OE0FQwvIuKCtuViSiKufmislF7kVr7IHH9GYtQuZcnualQ82gYeQ11KzZQTouw==} + metro-transform-worker@0.83.5: + resolution: {integrity: sha512-8N4pjkNXc6ytlP9oAM6MwqkvUepNSW39LKYl9NjUMpRDazBQ7oBpQDc8Sz4aI8jnH6AGhF7s1m/ayxkN1t04yA==} engines: {node: '>=20.19.4'} - metro@0.83.4: - resolution: {integrity: sha512-eBkAtcob+YmvSLL+/rsFiK8dHNfDbQA2/pi0lnxg3E6LLtUpwDfdGJ9WBWXkj0PVeOhoWQyj9Rt7s/+6k/GXuA==} + metro@0.83.5: + resolution: {integrity: sha512-BgsXevY1MBac/3ZYv/RfNFf/4iuW9X7f4H8ZNkiH+r667HD9sVujxcmu4jvEzGCAm4/WyKdZCuyhAcyhTHOucQ==} engines: {node: '>=20.19.4'} hasBin: true @@ -5227,17 +5323,17 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.8.0: - resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} + mlly@1.8.1: + resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==} - motion-dom@12.34.3: - resolution: {integrity: sha512-sYgFe+pR9aIM7o4fhs2aXtOI+oqlUd33N9Yoxcgo1Fv7M20sRkHtCmzE/VRNIcq7uNJ+qio+Xubt1FXH3pQ+eQ==} + motion-dom@12.36.0: + resolution: {integrity: sha512-Ep1pq8P88rGJ75om8lTCA13zqd7ywPGwCqwuWwin6BKc0hMLkVfcS6qKlRqEo2+t0DwoUcgGJfXwaiFn4AOcQA==} - motion-utils@12.29.2: - resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==} + motion-utils@12.36.0: + resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} - motion@12.34.3: - resolution: {integrity: sha512-xZIkBGO7v/Uvm+EyaqYd+9IpXu0sZqLywVlGdCFrrMiaO9JI4Kx51mO9KlHSWwll+gZUVY5OJsWgYI5FywJ/tw==} + motion@12.36.0: + resolution: {integrity: sha512-5BMQuktYUX8aEByKWYx5tR4X3G08H2OMgp46wTxZ4o7CDDstyy4A0fe9RLNMjZiwvntCWGDvs16sC87/emz4Yw==} peerDependencies: '@emotion/is-prop-valid': '*' react: ^18.0.0 || ^19.0.0 @@ -5338,8 +5434,8 @@ packages: node-mock-http@1.0.4: resolution: {integrity: sha512-8DY+kFsDkNXy1sJglUfuODx1/opAGJGyrTuFqEoN90oRc2Vk0ZbD4K2qmKXBBEhZQzdKHIVfEJpDU8Ak2NJEvQ==} - node-releases@2.0.27: - resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} + node-releases@2.0.36: + resolution: {integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -5348,8 +5444,8 @@ packages: nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - ob1@0.83.4: - resolution: {integrity: sha512-9JiflaRKCkxKzH8uuZlax72cHzZ8iFLsNIORFOAKDgZUOfvfwYWOVS0ezGLzPp/yEhVktD+PTTImC0AAehSOBw==} + ob1@0.83.5: + resolution: {integrity: sha512-vNKPYC8L5ycVANANpF/S+WZHpfnRWKx/F3AYP4QMn6ZJTh+l2HOrId0clNkEmua58NB9vmI9Qh7YOoV/4folYg==} engines: {node: '>=20.19.4'} object-assign@4.1.1: @@ -5459,6 +5555,9 @@ packages: package-manager-detector@0.2.11: resolution: {integrity: sha512-BEnLolu+yuz22S56CU1SUKq3XC3PkwD5wv4ikR4MfGvnRVcmzXR9DwSlW2fEamyTPyXHomBJRzgapeuBvRNzJQ==} + pako@2.1.0: + resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -5474,6 +5573,10 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + path-expression-matcher@1.1.3: + resolution: {integrity: sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==} + engines: {node: '>=14.0.0'} + path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -5562,8 +5665,8 @@ packages: resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -5786,8 +5889,8 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true - rpc-websockets@9.3.3: - resolution: {integrity: sha512-OkCsBBzrwxX4DoSv4Zlf9DgXKRB0MzVfCFg5MC+fNnf9ktr4SMWjsri0VNZQlDbCnGcImT6KNEv4ZoxktQhdpA==} + rpc-websockets@9.3.5: + resolution: {integrity: sha512-4mAmr+AEhPYJ9TmDtxF3r3ZcbWy7W8kvZ4PoZYw/Xgp2J7WixjwTgiQZsoTDvch5nimmg3Ay6/0Kuh9oIvVs9A==} run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -6036,8 +6139,8 @@ packages: strip-literal@3.1.0: resolution: {integrity: sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==} - strnum@2.1.2: - resolution: {integrity: sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==} + strnum@2.2.0: + resolution: {integrity: sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==} styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} @@ -6057,6 +6160,9 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + superstruct@0.15.5: + resolution: {integrity: sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ==} + superstruct@2.0.2: resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} engines: {node: '>=14.0.0'} @@ -6157,6 +6263,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -6205,38 +6314,38 @@ packages: typescript: optional: true - turbo-darwin-64@2.8.12: - resolution: {integrity: sha512-EiHJmW2MeQQx+21x8hjMHw/uPhXt9PIxvDrxzOtyVwrXzL0tQmsxtO4qHf2l7uA+K6PUJ4+TjY1MHZDuCvWXrw==} + turbo-darwin-64@2.8.17: + resolution: {integrity: sha512-ZFkv2hv7zHpAPEXBF6ouRRXshllOavYc+jjcrYyVHvxVTTwJWsBZwJ/gpPzmOKGvkSjsEyDO5V6aqqtZzwVF+Q==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.8.12: - resolution: {integrity: sha512-cbqqGN0vd7ly2TeuaM8k9AK9u1CABO4kBA5KPSqovTiLL3sORccn/mZzJSbvQf0EsYRfU34MgW5FotfwW3kx8Q==} + turbo-darwin-arm64@2.8.17: + resolution: {integrity: sha512-5DXqhQUt24ycEryXDfMNKEkW5TBHs+QmU23a2qxXwwFDaJsWcPo2obEhBxxdEPOv7qmotjad+09RGeWCcJ9JDw==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.8.12: - resolution: {integrity: sha512-jXKw9j4r4q6s0goSXuKI3aKbQK2qiNeP25lGGEnq018TM6SWRW1CCpPMxyG91aCKrub7wDm/K45sGNT4ZFBcFQ==} + turbo-linux-64@2.8.17: + resolution: {integrity: sha512-KLUbz6w7F73D/Ihh51hVagrKR0/CTsPEbRkvXLXvoND014XJ4BCrQUqSxlQ4/hu+nqp1v5WlM85/h3ldeyujuA==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.8.12: - resolution: {integrity: sha512-BRJCMdyXjyBoL0GYpvj9d2WNfMHwc3tKmJG5ATn2Efvil9LsiOsd/93/NxDqW0jACtHFNVOPnd/CBwXRPiRbwA==} + turbo-linux-arm64@2.8.17: + resolution: {integrity: sha512-pJK67XcNJH40lTAjFu7s/rUlobgVXyB3A3lDoq+/JccB3hf+SysmkpR4Itlc93s8LEaFAI4mamhFuTV17Z6wOg==} cpu: [arm64] os: [linux] - turbo-windows-64@2.8.12: - resolution: {integrity: sha512-vyFOlpFFzQFkikvSVhVkESEfzIopgs2J7J1rYvtSwSHQ4zmHxkC95Q8Kjkus8gg+8X2mZyP1GS5jirmaypGiPw==} + turbo-windows-64@2.8.17: + resolution: {integrity: sha512-EijeQ6zszDMmGZLP2vT2RXTs/GVi9rM0zv2/G4rNu2SSRSGFapgZdxgW4b5zUYLVaSkzmkpWlGfPfj76SW9yUg==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.8.12: - resolution: {integrity: sha512-9nRnlw5DF0LkJClkIws1evaIF36dmmMEO84J5Uj4oQ8C0QTHwlH7DNe5Kq2Jdmu8GXESCNDNuUYG8Cx6W/vm3g==} + turbo-windows-arm64@2.8.17: + resolution: {integrity: sha512-crpfeMPkfECd4V1PQ/hMoiyVcOy04+bWedu/if89S15WhOalHZ2BYUi6DOJhZrszY+mTT99OwpOsj4wNfb/GHQ==} cpu: [arm64] os: [win32] - turbo@2.8.12: - resolution: {integrity: sha512-auUAMLmi0eJhxDhQrxzvuhfEbICnVt0CTiYQYY8WyRJ5nwCDZxD0JG8bCSxT4nusI2CwJzmZAay5BfF6LmK7Hw==} + turbo@2.8.17: + resolution: {integrity: sha512-YwPsNSqU2f/RXU/+Kcb7cPkPZARxom4+me7LKEdN5jsvy2tpfze3zDZ4EiGrJnvOm9Avu9rK0aaYsP7qZ3iz7A==} hasBin: true tw-animate-css@1.4.0: @@ -6270,8 +6379,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.56.1: - resolution: {integrity: sha512-U4lM6pjmBX7J5wk4szltF7I1cGBHXZopnAXCMXb3+fZ3B/0Z3hq3wS/CCUB2NZBNAExK92mCU2tEohWuwVMsDQ==} + typescript-eslint@8.57.0: + resolution: {integrity: sha512-W8GcigEMEeB07xEZol8oJ26rigm3+bfPHxHvwbYUlu1fUDsGuQ7Hiskx5xGW/xM4USc9Ephe3jtv7ZYPQntHeA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -6298,8 +6407,8 @@ packages: undici-types@7.16.0: resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} - undici-types@7.22.0: - resolution: {integrity: sha512-RKZvifiL60xdsIuC80UY0dq8Z7DbJUV8/l2hOVbyZAxBzEeQU4Z58+4ZzJ6WN2Lidi9KzT5EbiGX+PI/UGYuRw==} + undici-types@7.24.3: + resolution: {integrity: sha512-frL/LoWYV3AWaHtW+Oa3oNLX1k6fVDBd/4gspN4nkRwzO9tRj/R1HzDQpyXnt0H/5DKHbFpdn2BktNQl1tbFYA==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -6408,14 +6517,18 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - utf-8-validate@5.0.10: - resolution: {integrity: sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==} + utf-8-validate@6.0.6: + resolution: {integrity: sha512-q3l3P9UtEEiAHcsgsqTgf9PPjctrDWoIXW3NpOHFdRDbLvu4DLIcxHangJ4RLrWkBcKjmcs/6NkerI8T/rE4LA==} engines: {node: '>=6.14.2'} utils-merge@1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + uuid@11.1.0: + resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + hasBin: true + uuid@8.3.2: resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} hasBin: true @@ -6654,15 +6767,15 @@ snapshots: '@aws-crypto/sha256-js': 5.2.0 '@aws-crypto/supports-web-crypto': 5.2.0 '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-locate-window': 3.965.4 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-locate-window': 3.965.5 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 '@aws-crypto/sha256-js@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 - '@aws-sdk/types': 3.973.4 + '@aws-sdk/types': 3.973.6 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -6671,307 +6784,309 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.973.4 + '@aws-sdk/types': 3.973.6 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-kms@3.1000.0': + '@aws-sdk/client-kms@3.1009.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.15 - '@aws-sdk/credential-provider-node': 3.972.14 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.15 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.3 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.0 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.6 - '@smithy/fetch-http-handler': 5.3.11 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.20 - '@smithy/middleware-retry': 4.4.37 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.12 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.0 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.36 - '@smithy/util-defaults-mode-node': 4.2.39 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/credential-provider-node': 3.972.21 + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-user-agent': 3.972.21 + '@aws-sdk/region-config-resolver': 3.972.8 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.996.5 + '@aws-sdk/util-user-agent-browser': 3.972.8 + '@aws-sdk/util-user-agent-node': 3.973.7 + '@smithy/config-resolver': 4.4.11 + '@smithy/core': 3.23.11 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/hash-node': 4.2.12 + '@smithy/invalid-dependency': 4.2.12 + '@smithy/middleware-content-length': 4.2.12 + '@smithy/middleware-endpoint': 4.4.25 + '@smithy/middleware-retry': 4.4.42 + '@smithy/middleware-serde': 4.2.14 + '@smithy/middleware-stack': 4.2.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/node-http-handler': 4.4.16 + '@smithy/protocol-http': 5.3.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.41 + '@smithy/util-defaults-mode-node': 4.2.44 + '@smithy/util-endpoints': 3.3.3 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-retry': 4.2.12 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.973.15': - dependencies: - '@aws-sdk/types': 3.973.4 - '@aws-sdk/xml-builder': 3.972.8 - '@smithy/core': 3.23.6 - '@smithy/node-config-provider': 4.3.10 - '@smithy/property-provider': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/signature-v4': 5.3.10 - '@smithy/smithy-client': 4.12.0 - '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-utf8': 4.2.1 + '@aws-sdk/core@3.973.20': + dependencies: + '@aws-sdk/types': 3.973.6 + '@aws-sdk/xml-builder': 3.972.11 + '@smithy/core': 3.23.11 + '@smithy/node-config-provider': 4.3.12 + '@smithy/property-provider': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/signature-v4': 5.3.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.972.13': + '@aws-sdk/credential-provider-env@3.972.18': dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.972.15': - dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/types': 3.973.4 - '@smithy/fetch-http-handler': 5.3.11 - '@smithy/node-http-handler': 4.4.12 - '@smithy/property-provider': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.0 - '@smithy/types': 4.13.0 - '@smithy/util-stream': 4.5.15 + '@aws-sdk/credential-provider-http@3.972.20': + dependencies: + '@aws-sdk/core': 3.973.20 + '@aws-sdk/types': 3.973.6 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/node-http-handler': 4.4.16 + '@smithy/property-provider': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 + '@smithy/util-stream': 4.5.19 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.972.13': - dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/credential-provider-env': 3.972.13 - '@aws-sdk/credential-provider-http': 3.972.15 - '@aws-sdk/credential-provider-login': 3.972.13 - '@aws-sdk/credential-provider-process': 3.972.13 - '@aws-sdk/credential-provider-sso': 3.972.13 - '@aws-sdk/credential-provider-web-identity': 3.972.13 - '@aws-sdk/nested-clients': 3.996.3 - '@aws-sdk/types': 3.973.4 - '@smithy/credential-provider-imds': 4.2.10 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/credential-provider-ini@3.972.20': + dependencies: + '@aws-sdk/core': 3.973.20 + '@aws-sdk/credential-provider-env': 3.972.18 + '@aws-sdk/credential-provider-http': 3.972.20 + '@aws-sdk/credential-provider-login': 3.972.20 + '@aws-sdk/credential-provider-process': 3.972.18 + '@aws-sdk/credential-provider-sso': 3.972.20 + '@aws-sdk/credential-provider-web-identity': 3.972.20 + '@aws-sdk/nested-clients': 3.996.10 + '@aws-sdk/types': 3.973.6 + '@smithy/credential-provider-imds': 4.2.12 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.972.13': + '@aws-sdk/credential-provider-login@3.972.20': dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/nested-clients': 3.996.3 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/nested-clients': 3.996.10 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.972.14': - dependencies: - '@aws-sdk/credential-provider-env': 3.972.13 - '@aws-sdk/credential-provider-http': 3.972.15 - '@aws-sdk/credential-provider-ini': 3.972.13 - '@aws-sdk/credential-provider-process': 3.972.13 - '@aws-sdk/credential-provider-sso': 3.972.13 - '@aws-sdk/credential-provider-web-identity': 3.972.13 - '@aws-sdk/types': 3.973.4 - '@smithy/credential-provider-imds': 4.2.10 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/credential-provider-node@3.972.21': + dependencies: + '@aws-sdk/credential-provider-env': 3.972.18 + '@aws-sdk/credential-provider-http': 3.972.20 + '@aws-sdk/credential-provider-ini': 3.972.20 + '@aws-sdk/credential-provider-process': 3.972.18 + '@aws-sdk/credential-provider-sso': 3.972.20 + '@aws-sdk/credential-provider-web-identity': 3.972.20 + '@aws-sdk/types': 3.973.6 + '@smithy/credential-provider-imds': 4.2.12 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.972.13': + '@aws-sdk/credential-provider-process@3.972.18': dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.972.13': + '@aws-sdk/credential-provider-sso@3.972.20': dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/nested-clients': 3.996.3 - '@aws-sdk/token-providers': 3.999.0 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/nested-clients': 3.996.10 + '@aws-sdk/token-providers': 3.1009.0 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.972.13': + '@aws-sdk/credential-provider-web-identity@3.972.20': dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/nested-clients': 3.996.3 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/nested-clients': 3.996.10 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-host-header@3.972.6': + '@aws-sdk/middleware-host-header@3.972.8': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 + '@aws-sdk/types': 3.973.6 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.972.6': + '@aws-sdk/middleware-logger@3.972.8': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/types': 4.13.0 + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.972.6': + '@aws-sdk/middleware-recursion-detection@3.972.8': dependencies: - '@aws-sdk/types': 3.973.4 - '@aws/lambda-invoke-store': 0.2.3 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 + '@aws-sdk/types': 3.973.6 + '@aws/lambda-invoke-store': 0.2.4 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.972.15': + '@aws-sdk/middleware-user-agent@3.972.21': dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.3 - '@smithy/core': 3.23.6 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.996.5 + '@smithy/core': 3.23.11 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-retry': 4.2.12 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.996.3': + '@aws-sdk/nested-clients@3.996.10': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.973.15 - '@aws-sdk/middleware-host-header': 3.972.6 - '@aws-sdk/middleware-logger': 3.972.6 - '@aws-sdk/middleware-recursion-detection': 3.972.6 - '@aws-sdk/middleware-user-agent': 3.972.15 - '@aws-sdk/region-config-resolver': 3.972.6 - '@aws-sdk/types': 3.973.4 - '@aws-sdk/util-endpoints': 3.996.3 - '@aws-sdk/util-user-agent-browser': 3.972.6 - '@aws-sdk/util-user-agent-node': 3.973.0 - '@smithy/config-resolver': 4.4.9 - '@smithy/core': 3.23.6 - '@smithy/fetch-http-handler': 5.3.11 - '@smithy/hash-node': 4.2.10 - '@smithy/invalid-dependency': 4.2.10 - '@smithy/middleware-content-length': 4.2.10 - '@smithy/middleware-endpoint': 4.4.20 - '@smithy/middleware-retry': 4.4.37 - '@smithy/middleware-serde': 4.2.11 - '@smithy/middleware-stack': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/node-http-handler': 4.4.12 - '@smithy/protocol-http': 5.3.10 - '@smithy/smithy-client': 4.12.0 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-body-length-node': 4.2.2 - '@smithy/util-defaults-mode-browser': 4.3.36 - '@smithy/util-defaults-mode-node': 4.2.39 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/util-utf8': 4.2.1 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/middleware-host-header': 3.972.8 + '@aws-sdk/middleware-logger': 3.972.8 + '@aws-sdk/middleware-recursion-detection': 3.972.8 + '@aws-sdk/middleware-user-agent': 3.972.21 + '@aws-sdk/region-config-resolver': 3.972.8 + '@aws-sdk/types': 3.973.6 + '@aws-sdk/util-endpoints': 3.996.5 + '@aws-sdk/util-user-agent-browser': 3.972.8 + '@aws-sdk/util-user-agent-node': 3.973.7 + '@smithy/config-resolver': 4.4.11 + '@smithy/core': 3.23.11 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/hash-node': 4.2.12 + '@smithy/invalid-dependency': 4.2.12 + '@smithy/middleware-content-length': 4.2.12 + '@smithy/middleware-endpoint': 4.4.25 + '@smithy/middleware-retry': 4.4.42 + '@smithy/middleware-serde': 4.2.14 + '@smithy/middleware-stack': 4.2.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/node-http-handler': 4.4.16 + '@smithy/protocol-http': 5.3.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-body-length-node': 4.2.3 + '@smithy/util-defaults-mode-browser': 4.3.41 + '@smithy/util-defaults-mode-node': 4.2.44 + '@smithy/util-endpoints': 3.3.3 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-retry': 4.2.12 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.972.6': + '@aws-sdk/region-config-resolver@3.972.8': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/config-resolver': 4.4.9 - '@smithy/node-config-provider': 4.3.10 - '@smithy/types': 4.13.0 + '@aws-sdk/types': 3.973.6 + '@smithy/config-resolver': 4.4.11 + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/token-providers@3.999.0': + '@aws-sdk/token-providers@3.1009.0': dependencies: - '@aws-sdk/core': 3.973.15 - '@aws-sdk/nested-clients': 3.996.3 - '@aws-sdk/types': 3.973.4 - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@aws-sdk/core': 3.973.20 + '@aws-sdk/nested-clients': 3.996.10 + '@aws-sdk/types': 3.973.6 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.973.4': + '@aws-sdk/types@3.973.6': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.996.3': + '@aws-sdk/util-endpoints@3.996.5': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-endpoints': 3.3.1 + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-endpoints': 3.3.3 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.965.4': + '@aws-sdk/util-locate-window@3.965.5': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.972.6': + '@aws-sdk/util-user-agent-browser@3.972.8': dependencies: - '@aws-sdk/types': 3.973.4 - '@smithy/types': 4.13.0 + '@aws-sdk/types': 3.973.6 + '@smithy/types': 4.13.1 bowser: 2.14.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.973.0': + '@aws-sdk/util-user-agent-node@3.973.7': dependencies: - '@aws-sdk/middleware-user-agent': 3.972.15 - '@aws-sdk/types': 3.973.4 - '@smithy/node-config-provider': 4.3.10 - '@smithy/types': 4.13.0 + '@aws-sdk/middleware-user-agent': 3.972.21 + '@aws-sdk/types': 3.973.6 + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-config-provider': 4.2.2 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.972.8': + '@aws-sdk/xml-builder@3.972.11': dependencies: - '@smithy/types': 4.13.0 - fast-xml-parser: 5.3.6 + '@smithy/types': 4.13.1 + fast-xml-parser: 5.4.1 tslib: 2.8.1 - '@aws/lambda-invoke-store@0.2.3': {} + '@aws/lambda-invoke-store@0.2.4': {} '@babel/code-frame@7.29.0': dependencies: @@ -7152,12 +7267,12 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.28.5 - '@base-ui/react@1.2.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@base-ui/react@1.3.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 - '@base-ui/utils': 0.2.5(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) - '@floating-ui/utils': 0.2.10 + '@base-ui/utils': 0.2.6(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/utils': 0.2.11 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) tabbable: 6.4.0 @@ -7165,10 +7280,10 @@ snapshots: optionalDependencies: '@types/react': 19.2.14 - '@base-ui/utils@0.2.5(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@base-ui/utils@0.2.6(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: '@babel/runtime': 7.28.6 - '@floating-ui/utils': 0.2.10 + '@floating-ui/utils': 0.2.11 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) reselect: 5.1.1 @@ -7178,9 +7293,9 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@changesets/apply-release-plan@7.0.14': + '@changesets/apply-release-plan@7.1.0': dependencies: - '@changesets/config': 3.1.2 + '@changesets/config': 3.1.3 '@changesets/get-version-range-type': 0.4.0 '@changesets/git': 3.0.4 '@changesets/should-skip-package': 0.1.2 @@ -7207,30 +7322,28 @@ snapshots: dependencies: '@changesets/types': 6.1.0 - '@changesets/cli@2.29.8(@types/node@24.10.15)': + '@changesets/cli@2.30.0(@types/node@24.12.0)': dependencies: - '@changesets/apply-release-plan': 7.0.14 + '@changesets/apply-release-plan': 7.1.0 '@changesets/assemble-release-plan': 6.0.9 '@changesets/changelog-git': 0.2.1 - '@changesets/config': 3.1.2 + '@changesets/config': 3.1.3 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 - '@changesets/get-release-plan': 4.0.14 + '@changesets/get-release-plan': 4.0.15 '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.6 + '@changesets/read': 0.6.7 '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@changesets/write': 0.4.0 - '@inquirer/external-editor': 1.0.3(@types/node@24.10.15) + '@inquirer/external-editor': 1.0.3(@types/node@24.12.0) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 - ci-info: 3.9.0 enquirer: 2.4.1 fs-extra: 7.0.1 mri: 1.2.0 - p-limit: 2.3.0 package-manager-detector: 0.2.11 picocolors: 1.1.1 resolve-from: 5.0.0 @@ -7240,11 +7353,12 @@ snapshots: transitivePeerDependencies: - '@types/node' - '@changesets/config@3.1.2': + '@changesets/config@3.1.3': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.3 '@changesets/logger': 0.1.1 + '@changesets/should-skip-package': 0.1.2 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 @@ -7261,12 +7375,12 @@ snapshots: picocolors: 1.1.1 semver: 7.7.4 - '@changesets/get-release-plan@4.0.14': + '@changesets/get-release-plan@4.0.15': dependencies: '@changesets/assemble-release-plan': 6.0.9 - '@changesets/config': 3.1.2 + '@changesets/config': 3.1.3 '@changesets/pre': 2.0.2 - '@changesets/read': 0.6.6 + '@changesets/read': 0.6.7 '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 @@ -7284,7 +7398,7 @@ snapshots: dependencies: picocolors: 1.1.1 - '@changesets/parse@0.4.2': + '@changesets/parse@0.4.3': dependencies: '@changesets/types': 6.1.0 js-yaml: 4.1.1 @@ -7296,11 +7410,11 @@ snapshots: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.6': + '@changesets/read@0.6.7': dependencies: '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.2 + '@changesets/parse': 0.4.3 '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 @@ -7322,108 +7436,137 @@ snapshots: human-id: 4.1.3 prettier: 2.8.8 - '@emnapi/core@1.8.1': + '@coral-xyz/anchor-errors@0.31.1': {} + + '@coral-xyz/anchor@0.32.1(bufferutil@4.1.0)(typescript@5.9.3)': dependencies: - '@emnapi/wasi-threads': 1.1.0 + '@coral-xyz/anchor-errors': 0.31.1 + '@coral-xyz/borsh': 0.31.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)) + '@noble/hashes': 1.8.0 + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bn.js: 5.2.3 + bs58: 4.0.1 + buffer-layout: 1.2.2 + camelcase: 6.3.0 + cross-fetch: 3.2.0 + eventemitter3: 4.0.7 + pako: 2.1.0 + superstruct: 0.15.5 + toml: 3.0.0 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + + '@coral-xyz/borsh@0.31.1(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))': + dependencies: + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + bn.js: 5.2.3 + buffer-layout: 1.2.2 + + '@emnapi/core@1.9.0': + dependencies: + '@emnapi/wasi-threads': 1.2.0 tslib: 2.8.1 optional: true - '@emnapi/runtime@1.8.1': + '@emnapi/runtime@1.9.0': dependencies: tslib: 2.8.1 optional: true - '@emnapi/wasi-threads@1.1.0': + '@emnapi/wasi-threads@1.2.0': dependencies: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.27.3': + '@esbuild/aix-ppc64@0.27.4': optional: true - '@esbuild/android-arm64@0.27.3': + '@esbuild/android-arm64@0.27.4': optional: true - '@esbuild/android-arm@0.27.3': + '@esbuild/android-arm@0.27.4': optional: true - '@esbuild/android-x64@0.27.3': + '@esbuild/android-x64@0.27.4': optional: true - '@esbuild/darwin-arm64@0.27.3': + '@esbuild/darwin-arm64@0.27.4': optional: true - '@esbuild/darwin-x64@0.27.3': + '@esbuild/darwin-x64@0.27.4': optional: true - '@esbuild/freebsd-arm64@0.27.3': + '@esbuild/freebsd-arm64@0.27.4': optional: true - '@esbuild/freebsd-x64@0.27.3': + '@esbuild/freebsd-x64@0.27.4': optional: true - '@esbuild/linux-arm64@0.27.3': + '@esbuild/linux-arm64@0.27.4': optional: true - '@esbuild/linux-arm@0.27.3': + '@esbuild/linux-arm@0.27.4': optional: true - '@esbuild/linux-ia32@0.27.3': + '@esbuild/linux-ia32@0.27.4': optional: true - '@esbuild/linux-loong64@0.27.3': + '@esbuild/linux-loong64@0.27.4': optional: true - '@esbuild/linux-mips64el@0.27.3': + '@esbuild/linux-mips64el@0.27.4': optional: true - '@esbuild/linux-ppc64@0.27.3': + '@esbuild/linux-ppc64@0.27.4': optional: true - '@esbuild/linux-riscv64@0.27.3': + '@esbuild/linux-riscv64@0.27.4': optional: true - '@esbuild/linux-s390x@0.27.3': + '@esbuild/linux-s390x@0.27.4': optional: true - '@esbuild/linux-x64@0.27.3': + '@esbuild/linux-x64@0.27.4': optional: true - '@esbuild/netbsd-arm64@0.27.3': + '@esbuild/netbsd-arm64@0.27.4': optional: true - '@esbuild/netbsd-x64@0.27.3': + '@esbuild/netbsd-x64@0.27.4': optional: true - '@esbuild/openbsd-arm64@0.27.3': + '@esbuild/openbsd-arm64@0.27.4': optional: true - '@esbuild/openbsd-x64@0.27.3': + '@esbuild/openbsd-x64@0.27.4': optional: true - '@esbuild/openharmony-arm64@0.27.3': + '@esbuild/openharmony-arm64@0.27.4': optional: true - '@esbuild/sunos-x64@0.27.3': + '@esbuild/sunos-x64@0.27.4': optional: true - '@esbuild/win32-arm64@0.27.3': + '@esbuild/win32-arm64@0.27.4': optional: true - '@esbuild/win32-ia32@0.27.3': + '@esbuild/win32-ia32@0.27.4': optional: true - '@esbuild/win32-x64@0.27.3': + '@esbuild/win32-x64@0.27.4': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.39.3(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': dependencies: - eslint: 9.39.3(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.21.1': + '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3 @@ -7439,7 +7582,7 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.3.4': + '@eslint/eslintrc@3.3.5': dependencies: ajv: 6.14.0 debug: 4.4.3 @@ -7453,7 +7596,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.39.3': {} + '@eslint/js@9.39.4': {} '@eslint/object-schema@2.1.7': {} @@ -7462,22 +7605,22 @@ snapshots: '@eslint/core': 0.17.0 levn: 0.4.1 - '@floating-ui/core@1.7.4': + '@floating-ui/core@1.7.5': dependencies: - '@floating-ui/utils': 0.2.10 + '@floating-ui/utils': 0.2.11 - '@floating-ui/dom@1.7.5': + '@floating-ui/dom@1.7.6': dependencies: - '@floating-ui/core': 1.7.4 - '@floating-ui/utils': 0.2.10 + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 - '@floating-ui/react-dom@2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@floating-ui/react-dom@2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@floating-ui/dom': 1.7.5 + '@floating-ui/dom': 1.7.6 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - '@floating-ui/utils@0.2.10': {} + '@floating-ui/utils@0.2.11': {} '@humanfs/core@0.19.1': {} @@ -7490,7 +7633,9 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@img/colour@1.0.0': + '@iarna/toml@2.2.5': {} + + '@img/colour@1.1.0': optional: true '@img/sharp-darwin-arm64@0.34.5': @@ -7575,7 +7720,7 @@ snapshots: '@img/sharp-wasm32@0.34.5': dependencies: - '@emnapi/runtime': 1.8.1 + '@emnapi/runtime': 1.9.0 optional: true '@img/sharp-win32-arm64@0.34.5': @@ -7587,12 +7732,12 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/external-editor@1.0.3(@types/node@24.10.15)': + '@inquirer/external-editor@1.0.3(@types/node@24.12.0)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 '@isaacs/cliui@8.0.2': dependencies: @@ -7623,14 +7768,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.10.15 + '@types/node': 24.12.0 jest-mock: 29.7.0 '@jest/fake-timers@29.7.0': dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 24.10.15 + '@types/node': 24.12.0 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -7664,7 +7809,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.10.15 + '@types/node': 24.12.0 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -7716,8 +7861,8 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.8.1 - '@emnapi/runtime': 1.8.1 + '@emnapi/core': 1.9.0 + '@emnapi/runtime': 1.9.0 '@tybys/wasm-util': 0.10.1 optional: true @@ -7791,6 +7936,37 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@pipeit/actions@0.1.2(@pipeit/core@0.2.7(22357f262e716ae2f314a28b0b8cbb91))(@solana/addresses@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/instruction-plans@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/instructions@6.3.1(typescript@5.9.3))(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6))(@solana/rpc-subscriptions@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6))(@solana/rpc@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/signers@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/transactions@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': + dependencies: + '@msgpack/msgpack': 3.1.3 + '@pipeit/core': 0.2.7(22357f262e716ae2f314a28b0b8cbb91) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/instruction-plans': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/instructions': 6.3.1(typescript@5.9.3) + '@solana/kit': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/signers': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + + '@pipeit/core@0.2.7(22357f262e716ae2f314a28b0b8cbb91)': + dependencies: + '@solana-program/compute-budget': 0.11.0(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-strings': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/functional': 6.3.1(typescript@5.9.3) + '@solana/instruction-plans': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/instructions': 6.3.1(typescript@5.9.3) + '@solana/kit': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/programs': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@pkgjs/parseargs@0.11.0': optional: true @@ -7993,7 +8169,7 @@ snapshots: '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: - '@floating-ui/react-dom': 2.1.7(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@floating-ui/react-dom': 2.1.8(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) '@radix-ui/react-context': 1.1.2(@types/react@19.2.14)(react@19.2.4) @@ -8216,14 +8392,14 @@ snapshots: tinyglobby: 0.2.15 yargs: 17.7.2 - '@react-native/community-cli-plugin@0.84.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + '@react-native/community-cli-plugin@0.84.1(bufferutil@4.1.0)': dependencies: - '@react-native/dev-middleware': 0.84.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@react-native/dev-middleware': 0.84.1(bufferutil@4.1.0) debug: 4.4.3 invariant: 2.2.4 - metro: 0.83.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) - metro-config: 0.83.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) - metro-core: 0.83.4 + metro: 0.83.5(bufferutil@4.1.0) + metro-config: 0.83.5(bufferutil@4.1.0) + metro-core: 0.83.5 semver: 7.7.4 transitivePeerDependencies: - bufferutil @@ -8240,7 +8416,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@react-native/dev-middleware@0.84.1(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + '@react-native/dev-middleware@0.84.1(bufferutil@4.1.0)': dependencies: '@isaacs/ttlcache': 1.4.1 '@react-native/debugger-frontend': 0.84.1 @@ -8253,7 +8429,7 @@ snapshots: nullthrows: 1.1.1 open: 7.4.2 serve-static: 1.16.3 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - supports-color @@ -8265,12 +8441,12 @@ snapshots: '@react-native/normalize-colors@0.84.1': {} - '@react-native/virtualized-lists@0.84.1(@types/react@19.2.14)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)': + '@react-native/virtualized-lists@0.84.1(@types/react@19.2.14)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4))(react@19.2.4)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 react: 19.2.4 - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4) optionalDependencies: '@types/react': 19.2.14 @@ -8374,196 +8550,197 @@ snapshots: dependencies: '@sinonjs/commons': 3.0.1 - '@smithy/abort-controller@4.2.10': + '@smithy/abort-controller@4.2.12': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/config-resolver@4.4.9': + '@smithy/config-resolver@4.4.11': dependencies: - '@smithy/node-config-provider': 4.3.10 - '@smithy/types': 4.13.0 - '@smithy/util-config-provider': 4.2.1 - '@smithy/util-endpoints': 3.3.1 - '@smithy/util-middleware': 4.2.10 + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-config-provider': 4.2.2 + '@smithy/util-endpoints': 3.3.3 + '@smithy/util-middleware': 4.2.12 tslib: 2.8.1 - '@smithy/core@3.23.6': - dependencies: - '@smithy/middleware-serde': 4.2.11 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - '@smithy/util-body-length-browser': 4.2.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-stream': 4.5.15 - '@smithy/util-utf8': 4.2.1 - '@smithy/uuid': 1.1.1 + '@smithy/core@3.23.11': + dependencies: + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-base64': 4.3.2 + '@smithy/util-body-length-browser': 4.2.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-stream': 4.5.19 + '@smithy/util-utf8': 4.2.2 + '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/credential-provider-imds@4.2.10': + '@smithy/credential-provider-imds@4.2.12': dependencies: - '@smithy/node-config-provider': 4.3.10 - '@smithy/property-provider': 4.2.10 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 + '@smithy/node-config-provider': 4.3.12 + '@smithy/property-provider': 4.2.12 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 tslib: 2.8.1 - '@smithy/fetch-http-handler@5.3.11': + '@smithy/fetch-http-handler@5.3.15': dependencies: - '@smithy/protocol-http': 5.3.10 - '@smithy/querystring-builder': 4.2.10 - '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 + '@smithy/protocol-http': 5.3.12 + '@smithy/querystring-builder': 4.2.12 + '@smithy/types': 4.13.1 + '@smithy/util-base64': 4.3.2 tslib: 2.8.1 - '@smithy/hash-node@4.2.10': + '@smithy/hash-node@4.2.12': dependencies: - '@smithy/types': 4.13.0 - '@smithy/util-buffer-from': 4.2.1 - '@smithy/util-utf8': 4.2.1 + '@smithy/types': 4.13.1 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/invalid-dependency@4.2.10': + '@smithy/invalid-dependency@4.2.12': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 '@smithy/is-array-buffer@2.2.0': dependencies: tslib: 2.8.1 - '@smithy/is-array-buffer@4.2.1': + '@smithy/is-array-buffer@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/middleware-content-length@4.2.10': + '@smithy/middleware-content-length@4.2.12': dependencies: - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.20': + '@smithy/middleware-endpoint@4.4.25': dependencies: - '@smithy/core': 3.23.6 - '@smithy/middleware-serde': 4.2.11 - '@smithy/node-config-provider': 4.3.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 - '@smithy/url-parser': 4.2.10 - '@smithy/util-middleware': 4.2.10 + '@smithy/core': 3.23.11 + '@smithy/middleware-serde': 4.2.14 + '@smithy/node-config-provider': 4.3.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 + '@smithy/url-parser': 4.2.12 + '@smithy/util-middleware': 4.2.12 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.37': + '@smithy/middleware-retry@4.4.42': dependencies: - '@smithy/node-config-provider': 4.3.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/service-error-classification': 4.2.10 - '@smithy/smithy-client': 4.12.0 - '@smithy/types': 4.13.0 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-retry': 4.2.10 - '@smithy/uuid': 1.1.1 + '@smithy/node-config-provider': 4.3.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/service-error-classification': 4.2.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-retry': 4.2.12 + '@smithy/uuid': 1.1.2 tslib: 2.8.1 - '@smithy/middleware-serde@4.2.11': + '@smithy/middleware-serde@4.2.14': dependencies: - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 + '@smithy/core': 3.23.11 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/middleware-stack@4.2.10': + '@smithy/middleware-stack@4.2.12': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/node-config-provider@4.3.10': + '@smithy/node-config-provider@4.3.12': dependencies: - '@smithy/property-provider': 4.2.10 - '@smithy/shared-ini-file-loader': 4.4.5 - '@smithy/types': 4.13.0 + '@smithy/property-provider': 4.2.12 + '@smithy/shared-ini-file-loader': 4.4.7 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/node-http-handler@4.4.12': + '@smithy/node-http-handler@4.4.16': dependencies: - '@smithy/abort-controller': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/querystring-builder': 4.2.10 - '@smithy/types': 4.13.0 + '@smithy/abort-controller': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/querystring-builder': 4.2.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/property-provider@4.2.10': + '@smithy/property-provider@4.2.12': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/protocol-http@5.3.10': + '@smithy/protocol-http@5.3.12': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/querystring-builder@4.2.10': + '@smithy/querystring-builder@4.2.12': dependencies: - '@smithy/types': 4.13.0 - '@smithy/util-uri-escape': 4.2.1 + '@smithy/types': 4.13.1 + '@smithy/util-uri-escape': 4.2.2 tslib: 2.8.1 - '@smithy/querystring-parser@4.2.10': + '@smithy/querystring-parser@4.2.12': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/service-error-classification@4.2.10': + '@smithy/service-error-classification@4.2.12': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.13.1 - '@smithy/shared-ini-file-loader@4.4.5': + '@smithy/shared-ini-file-loader@4.4.7': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/signature-v4@5.3.10': + '@smithy/signature-v4@5.3.12': dependencies: - '@smithy/is-array-buffer': 4.2.1 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 - '@smithy/util-hex-encoding': 4.2.1 - '@smithy/util-middleware': 4.2.10 - '@smithy/util-uri-escape': 4.2.1 - '@smithy/util-utf8': 4.2.1 + '@smithy/is-array-buffer': 4.2.2 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-middleware': 4.2.12 + '@smithy/util-uri-escape': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/smithy-client@4.12.0': + '@smithy/smithy-client@4.12.5': dependencies: - '@smithy/core': 3.23.6 - '@smithy/middleware-endpoint': 4.4.20 - '@smithy/middleware-stack': 4.2.10 - '@smithy/protocol-http': 5.3.10 - '@smithy/types': 4.13.0 - '@smithy/util-stream': 4.5.15 + '@smithy/core': 3.23.11 + '@smithy/middleware-endpoint': 4.4.25 + '@smithy/middleware-stack': 4.2.12 + '@smithy/protocol-http': 5.3.12 + '@smithy/types': 4.13.1 + '@smithy/util-stream': 4.5.19 tslib: 2.8.1 - '@smithy/types@4.13.0': + '@smithy/types@4.13.1': dependencies: tslib: 2.8.1 - '@smithy/url-parser@4.2.10': + '@smithy/url-parser@4.2.12': dependencies: - '@smithy/querystring-parser': 4.2.10 - '@smithy/types': 4.13.0 + '@smithy/querystring-parser': 4.2.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-base64@4.3.1': + '@smithy/util-base64@4.3.2': dependencies: - '@smithy/util-buffer-from': 4.2.1 - '@smithy/util-utf8': 4.2.1 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/util-body-length-browser@4.2.1': + '@smithy/util-body-length-browser@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-body-length-node@4.2.2': + '@smithy/util-body-length-node@4.2.3': dependencies: tslib: 2.8.1 @@ -8572,65 +8749,65 @@ snapshots: '@smithy/is-array-buffer': 2.2.0 tslib: 2.8.1 - '@smithy/util-buffer-from@4.2.1': + '@smithy/util-buffer-from@4.2.2': dependencies: - '@smithy/is-array-buffer': 4.2.1 + '@smithy/is-array-buffer': 4.2.2 tslib: 2.8.1 - '@smithy/util-config-provider@4.2.1': + '@smithy/util-config-provider@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.36': + '@smithy/util-defaults-mode-browser@4.3.41': dependencies: - '@smithy/property-provider': 4.2.10 - '@smithy/smithy-client': 4.12.0 - '@smithy/types': 4.13.0 + '@smithy/property-provider': 4.2.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.39': + '@smithy/util-defaults-mode-node@4.2.44': dependencies: - '@smithy/config-resolver': 4.4.9 - '@smithy/credential-provider-imds': 4.2.10 - '@smithy/node-config-provider': 4.3.10 - '@smithy/property-provider': 4.2.10 - '@smithy/smithy-client': 4.12.0 - '@smithy/types': 4.13.0 + '@smithy/config-resolver': 4.4.11 + '@smithy/credential-provider-imds': 4.2.12 + '@smithy/node-config-provider': 4.3.12 + '@smithy/property-provider': 4.2.12 + '@smithy/smithy-client': 4.12.5 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-endpoints@3.3.1': + '@smithy/util-endpoints@3.3.3': dependencies: - '@smithy/node-config-provider': 4.3.10 - '@smithy/types': 4.13.0 + '@smithy/node-config-provider': 4.3.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-hex-encoding@4.2.1': + '@smithy/util-hex-encoding@4.2.2': dependencies: tslib: 2.8.1 - '@smithy/util-middleware@4.2.10': + '@smithy/util-middleware@4.2.12': dependencies: - '@smithy/types': 4.13.0 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-retry@4.2.10': + '@smithy/util-retry@4.2.12': dependencies: - '@smithy/service-error-classification': 4.2.10 - '@smithy/types': 4.13.0 + '@smithy/service-error-classification': 4.2.12 + '@smithy/types': 4.13.1 tslib: 2.8.1 - '@smithy/util-stream@4.5.15': + '@smithy/util-stream@4.5.19': dependencies: - '@smithy/fetch-http-handler': 5.3.11 - '@smithy/node-http-handler': 4.4.12 - '@smithy/types': 4.13.0 - '@smithy/util-base64': 4.3.1 - '@smithy/util-buffer-from': 4.2.1 - '@smithy/util-hex-encoding': 4.2.1 - '@smithy/util-utf8': 4.2.1 + '@smithy/fetch-http-handler': 5.3.15 + '@smithy/node-http-handler': 4.4.16 + '@smithy/types': 4.13.1 + '@smithy/util-base64': 4.3.2 + '@smithy/util-buffer-from': 4.2.2 + '@smithy/util-hex-encoding': 4.2.2 + '@smithy/util-utf8': 4.2.2 tslib: 2.8.1 - '@smithy/util-uri-escape@4.2.1': + '@smithy/util-uri-escape@4.2.2': dependencies: tslib: 2.8.1 @@ -8639,23 +8816,23 @@ snapshots: '@smithy/util-buffer-from': 2.2.0 tslib: 2.8.1 - '@smithy/util-utf8@4.2.1': + '@smithy/util-utf8@4.2.2': dependencies: - '@smithy/util-buffer-from': 4.2.1 + '@smithy/util-buffer-from': 4.2.2 tslib: 2.8.1 - '@smithy/uuid@1.1.1': + '@smithy/uuid@1.1.2': dependencies: tslib: 2.8.1 - '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.9.3)': + '@solana-mobile/mobile-wallet-adapter-protocol@2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4))(react@19.2.4)(typescript@5.9.3)': dependencies: '@solana/codecs-strings': 4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/wallet-standard': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.4) + '@solana/wallet-standard': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(bs58@5.0.0)(react@19.2.4) '@solana/wallet-standard-util': 1.1.2 '@wallet-standard/core': 1.1.1 js-base64: 3.7.8 - react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10) + react-native: 0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4) transitivePeerDependencies: - '@solana/wallet-adapter-base' - '@solana/web3.js' @@ -8664,9 +8841,9 @@ snapshots: - react - typescript - '@solana-mobile/wallet-standard-mobile@0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.9.3)': + '@solana-mobile/wallet-standard-mobile@0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4))(react@19.2.4)(typescript@5.9.3)': dependencies: - '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.9.3) + '@solana-mobile/mobile-wallet-adapter-protocol': 2.2.5(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(bs58@5.0.0)(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) '@solana/wallet-standard-chains': 1.1.1 '@solana/wallet-standard-features': 1.3.0 '@wallet-standard/base': 1.1.0 @@ -8682,26 +8859,45 @@ snapshots: - react-native - typescript - '@solana-program/compute-budget@0.11.0(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/compute-budget@0.10.0(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': dependencies: - '@solana/kit': 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/kit': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana-program/system@0.10.0(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/compute-budget@0.11.0(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': dependencies: - '@solana/kit': 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/kit': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana-program/system@0.7.0(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/program-metadata@0.4.1(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': dependencies: - '@solana/kit': 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@iarna/toml': 2.2.5 + '@solana-program/compute-budget': 0.10.0(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@solana-program/system': 0.9.1(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) + '@solana/kit': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + commander: 13.1.0 + pako: 2.1.0 + picocolors: 1.1.1 + yaml: 2.8.2 + + '@solana-program/system@0.10.0(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': + dependencies: + '@solana/kit': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + + '@solana-program/system@0.7.0(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6))': + dependencies: + '@solana/kit': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana-program/token-2022@0.6.1(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))(@solana/sysvars@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': + '@solana-program/system@0.9.1(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': dependencies: - '@solana/kit': 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/sysvars': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/kit': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) - '@solana-program/token@0.9.0(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana-program/token-2022@0.6.1(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/sysvars@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': dependencies: - '@solana/kit': 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/kit': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/sysvars': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + + '@solana-program/token@0.9.0(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': + dependencies: + '@solana/kit': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) '@solana/accounts@5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: @@ -8716,14 +8912,14 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/accounts@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/accounts@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-strings': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/rpc-spec': 6.1.0(typescript@5.9.3) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-strings': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/rpc-spec': 6.3.1(typescript@5.9.3) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -8741,13 +8937,13 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/addresses@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/addresses@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/assertions': 6.1.0(typescript@5.9.3) - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-strings': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/nominal-types': 6.1.0(typescript@5.9.3) + '@solana/assertions': 6.3.1(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-strings': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/nominal-types': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -8759,9 +8955,9 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/assertions@6.1.0(typescript@5.9.3)': + '@solana/assertions@6.3.1(typescript@5.9.3)': dependencies: - '@solana/errors': 6.1.0(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -8785,9 +8981,9 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/codecs-core@6.1.0(typescript@5.9.3)': + '@solana/codecs-core@6.3.1(typescript@5.9.3)': dependencies: - '@solana/errors': 6.1.0(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -8799,11 +8995,11 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/codecs-data-structures@6.1.0(typescript@5.9.3)': + '@solana/codecs-data-structures@6.3.1(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.1.0(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-numbers': 6.3.1(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -8826,10 +9022,10 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/codecs-numbers@6.1.0(typescript@5.9.3)': + '@solana/codecs-numbers@6.3.1(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -8850,11 +9046,11 @@ snapshots: fastestsmallesttextencoderdecoder: 1.0.22 typescript: 5.9.3 - '@solana/codecs-strings@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/codecs-strings@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.1.0(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-numbers': 6.3.1(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) optionalDependencies: fastestsmallesttextencoderdecoder: 1.0.22 typescript: 5.9.3 @@ -8871,28 +9067,28 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/codecs@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/codecs@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.1.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.1.0(typescript@5.9.3) - '@solana/codecs-strings': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/options': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-data-structures': 6.3.1(typescript@5.9.3) + '@solana/codecs-numbers': 6.3.1(typescript@5.9.3) + '@solana/codecs-strings': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/options': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/connector@0.2.4(@solana/keychain-aws-kms@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-fireblocks@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-privy@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-turnkey@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-vault@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(@walletconnect/universal-provider@2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/connector@0.2.4(@solana/keychain-aws-kms@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-fireblocks@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-privy@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-turnkey@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain-vault@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/keychain@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(@walletconnect/universal-provider@2.23.8(bufferutil@4.1.0)(typescript@5.9.3)(zod@4.3.6))(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(react@19.2.4)(typescript@5.9.3)': dependencies: - '@solana-mobile/wallet-standard-mobile': 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4)(typescript@5.9.3) + '@solana-mobile/wallet-standard-mobile': 0.4.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(fastestsmallesttextencoderdecoder@1.0.22)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/codecs': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/keychain-aws-kms': 0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/keychain-turnkey': 0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/keychain-vault': 0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/keys': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/signers': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/transaction-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/transactions': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -8900,14 +9096,14 @@ snapshots: '@wallet-standard/app': 1.1.0 '@wallet-standard/base': 1.1.0 '@wallet-standard/features': 1.1.0 - '@wallet-ui/core': 2.2.2(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@wallet-ui/core': 2.2.2(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)) zod: 4.3.6 optionalDependencies: '@solana/keychain': 0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/keychain-fireblocks': 0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/keychain-privy': 0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@walletconnect/universal-provider': 2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@walletconnect/universal-provider': 2.23.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) react: 19.2.4 transitivePeerDependencies: - '@solana/wallet-adapter-base' @@ -8936,7 +9132,7 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/errors@6.1.0(typescript@5.9.3)': + '@solana/errors@6.3.1(typescript@5.9.3)': dependencies: chalk: 5.6.2 commander: 14.0.3 @@ -8947,7 +9143,7 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/fast-stable-stringify@6.1.0(typescript@5.9.3)': + '@solana/fast-stable-stringify@6.3.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -8955,7 +9151,7 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/functional@6.1.0(typescript@5.9.3)': + '@solana/functional@6.3.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -8972,14 +9168,14 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/instruction-plans@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/instruction-plans@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/instructions': 6.1.0(typescript@5.9.3) - '@solana/keys': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/promises': 6.1.0(typescript@5.9.3) - '@solana/transaction-messages': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transactions': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/instructions': 6.3.1(typescript@5.9.3) + '@solana/keys': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/promises': 6.3.1(typescript@5.9.3) + '@solana/transaction-messages': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -8992,16 +9188,16 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/instructions@6.1.0(typescript@5.9.3)': + '@solana/instructions@6.3.1(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 '@solana/keychain-aws-kms@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@aws-sdk/client-kms': 3.1000.0 + '@aws-sdk/client-kms': 3.1009.0 '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/keychain-core': 0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -9033,7 +9229,7 @@ snapshots: '@solana/keys': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/signers': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/transactions': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - jose: 6.1.3 + jose: 6.2.1 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript @@ -9103,19 +9299,19 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/keys@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/keys@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/assertions': 6.1.0(typescript@5.9.3) - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-strings': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/nominal-types': 6.1.0(typescript@5.9.3) + '@solana/assertions': 6.3.1(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-strings': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/nominal-types': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: '@solana/accounts': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -9132,11 +9328,11 @@ snapshots: '@solana/rpc-api': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/rpc-parsed-types': 5.5.1(typescript@5.9.3) '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) - '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/signers': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/sysvars': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transaction-confirmation': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/transaction-confirmation': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/transaction-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/transactions': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: @@ -9146,32 +9342,32 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': - dependencies: - '@solana/accounts': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/functional': 6.1.0(typescript@5.9.3) - '@solana/instruction-plans': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/instructions': 6.1.0(typescript@5.9.3) - '@solana/keys': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/offchain-messages': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/plugin-core': 6.1.0(typescript@5.9.3) - '@solana/plugin-interfaces': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/program-client-core': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/programs': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-api': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-parsed-types': 6.1.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.1.0(typescript@5.9.3) - '@solana/rpc-subscriptions': 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/signers': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/sysvars': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transaction-confirmation': 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/transaction-messages': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transactions': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': + dependencies: + '@solana/accounts': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/functional': 6.3.1(typescript@5.9.3) + '@solana/instruction-plans': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/instructions': 6.3.1(typescript@5.9.3) + '@solana/keys': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/offchain-messages': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/plugin-core': 6.3.1(typescript@5.9.3) + '@solana/plugin-interfaces': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/program-client-core': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/programs': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-api': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-parsed-types': 6.3.1(typescript@5.9.3) + '@solana/rpc-spec-types': 6.3.1(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/sysvars': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-confirmation': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/transaction-messages': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9183,7 +9379,7 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/nominal-types@6.1.0(typescript@5.9.3)': + '@solana/nominal-types@6.3.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -9202,16 +9398,16 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/offchain-messages@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/offchain-messages@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.1.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.1.0(typescript@5.9.3) - '@solana/codecs-strings': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/keys': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/nominal-types': 6.1.0(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-data-structures': 6.3.1(typescript@5.9.3) + '@solana/codecs-numbers': 6.3.1(typescript@5.9.3) + '@solana/codecs-strings': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/keys': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9229,13 +9425,13 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/options@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/options@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.1.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.1.0(typescript@5.9.3) - '@solana/codecs-strings': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-data-structures': 6.3.1(typescript@5.9.3) + '@solana/codecs-numbers': 6.3.1(typescript@5.9.3) + '@solana/codecs-strings': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9245,19 +9441,19 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/plugin-core@6.1.0(typescript@5.9.3)': + '@solana/plugin-core@6.3.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 - '@solana/plugin-interfaces@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/plugin-interfaces@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/instruction-plans': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/keys': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-spec': 6.1.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.1.0(typescript@5.9.3) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/signers': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/instruction-plans': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/keys': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-spec': 6.3.1(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.3.1(typescript@5.9.3) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9267,17 +9463,17 @@ snapshots: dependencies: prettier: 3.8.1 - '@solana/program-client-core@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/program-client-core@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/accounts': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/instruction-plans': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/instructions': 6.1.0(typescript@5.9.3) - '@solana/plugin-interfaces': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-api': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/signers': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/accounts': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/instruction-plans': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/instructions': 6.3.1(typescript@5.9.3) + '@solana/plugin-interfaces': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-api': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9292,10 +9488,10 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/programs@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/programs@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9305,7 +9501,7 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/promises@6.1.0(typescript@5.9.3)': + '@solana/promises@6.3.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -9327,19 +9523,19 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-api@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/rpc-api@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-strings': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/keys': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-parsed-types': 6.1.0(typescript@5.9.3) - '@solana/rpc-spec': 6.1.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transaction-messages': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transactions': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-strings': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/keys': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-parsed-types': 6.3.1(typescript@5.9.3) + '@solana/rpc-spec': 6.3.1(typescript@5.9.3) + '@solana/rpc-transformers': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9349,7 +9545,7 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-parsed-types@6.1.0(typescript@5.9.3)': + '@solana/rpc-parsed-types@6.3.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -9357,7 +9553,7 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-spec-types@6.1.0(typescript@5.9.3)': + '@solana/rpc-spec-types@6.3.1(typescript@5.9.3)': optionalDependencies: typescript: 5.9.3 @@ -9368,10 +9564,10 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-spec@6.1.0(typescript@5.9.3)': + '@solana/rpc-spec@6.3.1(typescript@5.9.3)': dependencies: - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.1.0(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/rpc-spec-types': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -9389,40 +9585,40 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-subscriptions-api@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/rpc-subscriptions-api@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/keys': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.1.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transaction-messages': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transactions': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/keys': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.3.1(typescript@5.9.3) + '@solana/rpc-transformers': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-subscriptions-channel-websocket@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/rpc-subscriptions-channel-websocket@5.5.1(bufferutil@4.1.0)(typescript@5.9.3)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) '@solana/functional': 5.5.1(typescript@5.9.3) '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.9.3) '@solana/subscribable': 5.5.1(typescript@5.9.3) - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - bufferutil - utf-8-validate - '@solana/rpc-subscriptions-channel-websocket@6.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/rpc-subscriptions-channel-websocket@6.3.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/functional': 6.1.0(typescript@5.9.3) - '@solana/rpc-subscriptions-spec': 6.1.0(typescript@5.9.3) - '@solana/subscribable': 6.1.0(typescript@5.9.3) - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/functional': 6.3.1(typescript@5.9.3) + '@solana/rpc-subscriptions-spec': 6.3.1(typescript@5.9.3) + '@solana/subscribable': 6.3.1(typescript@5.9.3) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9438,16 +9634,16 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/rpc-subscriptions-spec@6.1.0(typescript@5.9.3)': + '@solana/rpc-subscriptions-spec@6.3.1(typescript@5.9.3)': dependencies: - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/promises': 6.1.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.1.0(typescript@5.9.3) - '@solana/subscribable': 6.1.0(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/promises': 6.3.1(typescript@5.9.3) + '@solana/rpc-spec-types': 6.3.1(typescript@5.9.3) + '@solana/subscribable': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 - '@solana/rpc-subscriptions@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/rpc-subscriptions@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: '@solana/errors': 5.5.1(typescript@5.9.3) '@solana/fast-stable-stringify': 5.5.1(typescript@5.9.3) @@ -9455,7 +9651,7 @@ snapshots: '@solana/promises': 5.5.1(typescript@5.9.3) '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) '@solana/rpc-subscriptions-api': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-subscriptions-channel-websocket': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions-channel-websocket': 5.5.1(bufferutil@4.1.0)(typescript@5.9.3) '@solana/rpc-subscriptions-spec': 5.5.1(typescript@5.9.3) '@solana/rpc-transformers': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -9467,19 +9663,19 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/rpc-subscriptions@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/rpc-subscriptions@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 6.1.0(typescript@5.9.3) - '@solana/functional': 6.1.0(typescript@5.9.3) - '@solana/promises': 6.1.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.1.0(typescript@5.9.3) - '@solana/rpc-subscriptions-api': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-subscriptions-channel-websocket': 6.1.0(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-subscriptions-spec': 6.1.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/subscribable': 6.1.0(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/fast-stable-stringify': 6.3.1(typescript@5.9.3) + '@solana/functional': 6.3.1(typescript@5.9.3) + '@solana/promises': 6.3.1(typescript@5.9.3) + '@solana/rpc-spec-types': 6.3.1(typescript@5.9.3) + '@solana/rpc-subscriptions-api': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions-channel-websocket': 6.3.1(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-subscriptions-spec': 6.3.1(typescript@5.9.3) + '@solana/rpc-transformers': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/subscribable': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9499,13 +9695,13 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-transformers@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/rpc-transformers@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/functional': 6.1.0(typescript@5.9.3) - '@solana/nominal-types': 6.1.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.1.0(typescript@5.9.3) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/functional': 6.3.1(typescript@5.9.3) + '@solana/nominal-types': 6.3.1(typescript@5.9.3) + '@solana/rpc-spec-types': 6.3.1(typescript@5.9.3) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9516,16 +9712,16 @@ snapshots: '@solana/errors': 5.5.1(typescript@5.9.3) '@solana/rpc-spec': 5.5.1(typescript@5.9.3) '@solana/rpc-spec-types': 5.5.1(typescript@5.9.3) - undici-types: 7.22.0 + undici-types: 7.24.3 optionalDependencies: typescript: 5.9.3 - '@solana/rpc-transport-http@6.1.0(typescript@5.9.3)': + '@solana/rpc-transport-http@6.3.1(typescript@5.9.3)': dependencies: - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/rpc-spec': 6.1.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.1.0(typescript@5.9.3) - undici-types: 7.22.0 + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/rpc-spec': 6.3.1(typescript@5.9.3) + '@solana/rpc-spec-types': 6.3.1(typescript@5.9.3) + undici-types: 7.24.3 optionalDependencies: typescript: 5.9.3 @@ -9542,14 +9738,14 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc-types@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/rpc-types@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.1.0(typescript@5.9.3) - '@solana/codecs-strings': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/nominal-types': 6.1.0(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-numbers': 6.3.1(typescript@5.9.3) + '@solana/codecs-strings': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/nominal-types': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9571,17 +9767,17 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/rpc@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/rpc@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/fast-stable-stringify': 6.1.0(typescript@5.9.3) - '@solana/functional': 6.1.0(typescript@5.9.3) - '@solana/rpc-api': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-spec': 6.1.0(typescript@5.9.3) - '@solana/rpc-spec-types': 6.1.0(typescript@5.9.3) - '@solana/rpc-transformers': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-transport-http': 6.1.0(typescript@5.9.3) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/fast-stable-stringify': 6.3.1(typescript@5.9.3) + '@solana/functional': 6.3.1(typescript@5.9.3) + '@solana/rpc-api': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-spec': 6.3.1(typescript@5.9.3) + '@solana/rpc-spec-types': 6.3.1(typescript@5.9.3) + '@solana/rpc-transformers': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-transport-http': 6.3.1(typescript@5.9.3) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9603,17 +9799,17 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/signers@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/signers@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/instructions': 6.1.0(typescript@5.9.3) - '@solana/keys': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/nominal-types': 6.1.0(typescript@5.9.3) - '@solana/offchain-messages': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transaction-messages': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transactions': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/instructions': 6.3.1(typescript@5.9.3) + '@solana/keys': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 6.3.1(typescript@5.9.3) + '@solana/offchain-messages': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9625,9 +9821,9 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@solana/subscribable@6.1.0(typescript@5.9.3)': + '@solana/subscribable@6.3.1(typescript@5.9.3)': dependencies: - '@solana/errors': 6.1.0(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -9642,18 +9838,20 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/sysvars@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/sysvars@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/accounts': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/accounts': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-data-structures': 6.3.1(typescript@5.9.3) + '@solana/codecs-numbers': 6.3.1(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transaction-confirmation@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/transaction-confirmation@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: '@solana/addresses': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/codecs-strings': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -9661,7 +9859,7 @@ snapshots: '@solana/keys': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/promises': 5.5.1(typescript@5.9.3) '@solana/rpc': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/rpc-subscriptions': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/rpc-types': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/transaction-messages': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/transactions': 5.5.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -9672,18 +9870,18 @@ snapshots: - fastestsmallesttextencoderdecoder - utf-8-validate - '@solana/transaction-confirmation@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/transaction-confirmation@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-strings': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/keys': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/promises': 6.1.0(typescript@5.9.3) - '@solana/rpc': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/rpc-subscriptions': 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transaction-messages': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transactions': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-strings': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/keys': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/promises': 6.3.1(typescript@5.9.3) + '@solana/rpc': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/rpc-subscriptions': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9707,17 +9905,17 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transaction-messages@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + '@solana/transaction-messages@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.1.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.1.0(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/functional': 6.1.0(typescript@5.9.3) - '@solana/instructions': 6.1.0(typescript@5.9.3) - '@solana/nominal-types': 6.1.0(typescript@5.9.3) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-data-structures': 6.3.1(typescript@5.9.3) + '@solana/codecs-numbers': 6.3.1(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/functional': 6.3.1(typescript@5.9.3) + '@solana/instructions': 6.3.1(typescript@5.9.3) + '@solana/nominal-types': 6.3.1(typescript@5.9.3) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -9742,29 +9940,29 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/transactions@6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': - dependencies: - '@solana/addresses': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-core': 6.1.0(typescript@5.9.3) - '@solana/codecs-data-structures': 6.1.0(typescript@5.9.3) - '@solana/codecs-numbers': 6.1.0(typescript@5.9.3) - '@solana/codecs-strings': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/errors': 6.1.0(typescript@5.9.3) - '@solana/functional': 6.1.0(typescript@5.9.3) - '@solana/instructions': 6.1.0(typescript@5.9.3) - '@solana/keys': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/nominal-types': 6.1.0(typescript@5.9.3) - '@solana/rpc-types': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transaction-messages': 6.1.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions@6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 6.3.1(typescript@5.9.3) + '@solana/codecs-data-structures': 6.3.1(typescript@5.9.3) + '@solana/codecs-numbers': 6.3.1(typescript@5.9.3) + '@solana/codecs-strings': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 6.3.1(typescript@5.9.3) + '@solana/functional': 6.3.1(typescript@5.9.3) + '@solana/instructions': 6.3.1(typescript@5.9.3) + '@solana/keys': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 6.3.1(typescript@5.9.3) + '@solana/rpc-types': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 6.3.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - fastestsmallesttextencoderdecoder - '@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))': dependencies: '@solana/wallet-standard-features': 1.3.0 - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) '@wallet-standard/base': 1.1.0 '@wallet-standard/features': 1.1.0 eventemitter3: 5.0.4 @@ -9790,23 +9988,23 @@ snapshots: '@solana/wallet-standard-chains': 1.1.1 '@solana/wallet-standard-features': 1.3.0 - '@solana/wallet-standard-wallet-adapter-base@1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@5.0.0)': + '@solana/wallet-standard-wallet-adapter-base@1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(bs58@5.0.0)': dependencies: - '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)) '@solana/wallet-standard-chains': 1.1.1 '@solana/wallet-standard-features': 1.3.0 '@solana/wallet-standard-util': 1.1.2 - '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/web3.js': 1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6) '@wallet-standard/app': 1.1.0 '@wallet-standard/base': 1.1.0 '@wallet-standard/features': 1.1.0 '@wallet-standard/wallet': 1.1.0 bs58: 5.0.0 - '@solana/wallet-standard-wallet-adapter-react@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.4)': + '@solana/wallet-standard-wallet-adapter-react@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(bs58@5.0.0)(react@19.2.4)': dependencies: - '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)) - '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@5.0.0) + '@solana/wallet-adapter-base': 0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)) + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(bs58@5.0.0) '@wallet-standard/app': 1.1.0 '@wallet-standard/base': 1.1.0 react: 19.2.4 @@ -9814,27 +10012,27 @@ snapshots: - '@solana/web3.js' - bs58 - '@solana/wallet-standard-wallet-adapter@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.4)': + '@solana/wallet-standard-wallet-adapter@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(bs58@5.0.0)(react@19.2.4)': dependencies: - '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@5.0.0) - '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.4) + '@solana/wallet-standard-wallet-adapter-base': 1.1.4(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(bs58@5.0.0) + '@solana/wallet-standard-wallet-adapter-react': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(bs58@5.0.0)(react@19.2.4) transitivePeerDependencies: - '@solana/wallet-adapter-base' - '@solana/web3.js' - bs58 - react - '@solana/wallet-standard@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.4)': + '@solana/wallet-standard@1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(bs58@5.0.0)(react@19.2.4)': dependencies: '@solana/wallet-standard-core': 1.1.2 - '@solana/wallet-standard-wallet-adapter': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10))(bs58@5.0.0)(react@19.2.4) + '@solana/wallet-standard-wallet-adapter': 1.1.4(@solana/wallet-adapter-base@0.9.27(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)))(@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3))(bs58@5.0.0)(react@19.2.4) transitivePeerDependencies: - '@solana/wallet-adapter-base' - '@solana/web3.js' - bs58 - react - '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)': + '@solana/web3.js@1.98.4(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)': dependencies: '@babel/runtime': 7.28.6 '@noble/curves': 1.9.7 @@ -9847,9 +10045,9 @@ snapshots: bs58: 4.0.1 buffer: 6.0.3 fast-stable-stringify: 1.0.0 - jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + jayson: 4.3.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) node-fetch: 2.7.0 - rpc-websockets: 9.3.3 + rpc-websockets: 9.3.5 superstruct: 2.0.2 transitivePeerDependencies: - bufferutil @@ -9873,7 +10071,7 @@ snapshots: '@tailwindcss/node@4.2.1': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.19.0 + enhanced-resolve: 5.20.0 jiti: 2.6.1 lightningcss: 1.31.1 magic-string: 0.30.21 @@ -9936,7 +10134,7 @@ snapshots: '@alloc/quick-lru': 5.2.0 '@tailwindcss/node': 4.2.1 '@tailwindcss/oxide': 4.2.1 - postcss: 8.5.6 + postcss: 8.5.8 tailwindcss: 4.2.1 '@tanstack/query-core@5.90.20': {} @@ -10015,7 +10213,7 @@ snapshots: '@types/connect@3.4.38': dependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 '@types/d3-path@3.1.1': {} @@ -10025,7 +10223,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 '@types/hast@2.3.10': dependencies: @@ -10049,13 +10247,13 @@ snapshots: '@types/node@12.20.55': {} - '@types/node@24.10.15': + '@types/node@24.12.0': dependencies: undici-types: 7.16.0 '@types/qrcode@1.5.6': dependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: @@ -10073,17 +10271,17 @@ snapshots: '@types/unist@2.0.11': {} - '@types/uuid@8.3.4': {} + '@types/uuid@10.0.0': {} '@types/whatwg-mimetype@3.0.2': {} '@types/ws@7.4.7': dependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 '@types/ws@8.18.1': dependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 '@types/yargs-parser@21.0.3': {} @@ -10091,15 +10289,15 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@typescript-eslint/eslint-plugin@8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/type-utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.56.1 - eslint: 9.39.3(jiti@2.6.1) + '@typescript-eslint/parser': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/type-utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.0 + eslint: 9.39.4(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.4.0(typescript@5.9.3) @@ -10107,56 +10305,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.57.0 debug: 4.4.3 - eslint: 9.39.3(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.56.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.57.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) + '@typescript-eslint/types': 8.57.0 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.56.1': + '@typescript-eslint/scope-manager@8.57.0': dependencies: - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/visitor-keys': 8.57.0 - '@typescript-eslint/tsconfig-utils@8.56.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.57.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 - eslint: 9.39.3(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.56.1': {} + '@typescript-eslint/types@8.57.0': {} - '@typescript-eslint/typescript-estree@8.56.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.56.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.56.1(typescript@5.9.3) - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/visitor-keys': 8.56.1 + '@typescript-eslint/project-service': 8.57.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/visitor-keys': 8.57.0 debug: 4.4.3 minimatch: 10.2.4 semver: 7.7.4 @@ -10166,20 +10364,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.56.1 - '@typescript-eslint/types': 8.56.1 - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - eslint: 9.39.3(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.57.0 + '@typescript-eslint/types': 8.57.0 + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + eslint: 9.39.4(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.56.1': + '@typescript-eslint/visitor-keys@8.57.0': dependencies: - '@typescript-eslint/types': 8.56.1 + '@typescript-eslint/types': 8.57.0 eslint-visitor-keys: 5.0.1 '@unrs/resolver-binding-android-arm-eabi@1.11.1': @@ -10256,7 +10454,7 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.10.15)(@vitest/ui@3.2.4)(happy-dom@20.7.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) + vitest: 3.2.4(@types/node@24.12.0)(@vitest/ui@3.2.4)(happy-dom@20.8.4(bufferutil@4.1.0))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -10268,13 +10466,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.10.15)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': + '@vitest/mocker@3.2.4(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@24.10.15)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) '@vitest/pretty-format@3.2.4': dependencies: @@ -10300,12 +10498,12 @@ snapshots: dependencies: '@vitest/utils': 3.2.4 fflate: 0.8.2 - flatted: 3.3.3 + flatted: 3.4.1 pathe: 2.0.3 sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.10.15)(@vitest/ui@3.2.4)(happy-dom@20.7.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) + vitest: 3.2.4(@types/node@24.12.0)(@vitest/ui@3.2.4)(happy-dom@20.8.4(bufferutil@4.1.0))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) '@vitest/utils@3.2.4': dependencies: @@ -10340,33 +10538,33 @@ snapshots: dependencies: '@wallet-standard/base': 1.1.0 - '@wallet-ui/core@2.2.2(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@wallet-ui/core@2.2.2(@solana/kit@5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': dependencies: '@nanostores/persistent': 1.1.0(nanostores@1.0.1) - '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/kit': 5.5.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) nanostores: 1.0.1 - '@wallet-ui/core@2.2.2(@solana/kit@6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10))': + '@wallet-ui/core@2.2.2(@solana/kit@6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3))': dependencies: '@nanostores/persistent': 1.1.0(nanostores@1.0.1) - '@solana/kit': 6.1.0(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@5.0.10) + '@solana/kit': 6.3.1(bufferutil@4.1.0)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(utf-8-validate@6.0.6) nanostores: 1.0.1 - '@walletconnect/core@2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)': + '@walletconnect/core@2.23.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': dependencies: '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-provider': 1.0.14 '@walletconnect/jsonrpc-types': 1.0.4 '@walletconnect/jsonrpc-utils': 1.0.8 - '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@walletconnect/jsonrpc-ws-connection': 1.0.16(bufferutil@4.1.0)(utf-8-validate@6.0.6) '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 3.0.2 '@walletconnect/relay-api': 1.0.11 '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.23.7 - '@walletconnect/utils': 2.23.7(typescript@5.9.3)(zod@4.3.6) + '@walletconnect/types': 2.23.8 + '@walletconnect/utils': 2.23.8(typescript@5.9.3)(zod@4.3.6) '@walletconnect/window-getters': 1.0.1 es-toolkit: 1.44.0 events: 3.3.0 @@ -10437,12 +10635,12 @@ snapshots: '@walletconnect/jsonrpc-types': 1.0.4 tslib: 1.14.1 - '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.1.0)(utf-8-validate@5.0.10)': + '@walletconnect/jsonrpc-ws-connection@1.0.16(bufferutil@4.1.0)(utf-8-validate@6.0.6)': dependencies: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/safe-json': 1.0.2 events: 3.3.0 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -10493,16 +10691,16 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/sign-client@2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)': + '@walletconnect/sign-client@2.23.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': dependencies: - '@walletconnect/core': 2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) + '@walletconnect/core': 2.23.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/logger': 3.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.23.7 - '@walletconnect/utils': 2.23.7(typescript@5.9.3)(zod@4.3.6) + '@walletconnect/types': 2.23.8 + '@walletconnect/utils': 2.23.8(typescript@5.9.3)(zod@4.3.6) events: 3.3.0 transitivePeerDependencies: - '@azure/app-configuration' @@ -10533,7 +10731,7 @@ snapshots: dependencies: tslib: 1.14.1 - '@walletconnect/types@2.23.7': + '@walletconnect/types@2.23.8': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/heartbeat': 1.2.2 @@ -10562,7 +10760,7 @@ snapshots: - ioredis - uploadthing - '@walletconnect/universal-provider@2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6)': + '@walletconnect/universal-provider@2.23.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6)': dependencies: '@walletconnect/events': 1.0.1 '@walletconnect/jsonrpc-http-connection': 1.0.8 @@ -10571,9 +10769,9 @@ snapshots: '@walletconnect/jsonrpc-utils': 1.0.8 '@walletconnect/keyvaluestorage': 1.1.1 '@walletconnect/logger': 3.0.2 - '@walletconnect/sign-client': 2.23.7(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@5.0.10)(zod@4.3.6) - '@walletconnect/types': 2.23.7 - '@walletconnect/utils': 2.23.7(typescript@5.9.3)(zod@4.3.6) + '@walletconnect/sign-client': 2.23.8(bufferutil@4.1.0)(typescript@5.9.3)(utf-8-validate@6.0.6)(zod@4.3.6) + '@walletconnect/types': 2.23.8 + '@walletconnect/utils': 2.23.8(typescript@5.9.3)(zod@4.3.6) es-toolkit: 1.44.0 events: 3.3.0 transitivePeerDependencies: @@ -10602,7 +10800,7 @@ snapshots: - utf-8-validate - zod - '@walletconnect/utils@2.23.7(typescript@5.9.3)(zod@4.3.6)': + '@walletconnect/utils@2.23.8(typescript@5.9.3)(zod@4.3.6)': dependencies: '@msgpack/msgpack': 3.1.3 '@noble/ciphers': 1.3.0 @@ -10616,7 +10814,7 @@ snapshots: '@walletconnect/relay-auth': 1.1.0 '@walletconnect/safe-json': 1.0.2 '@walletconnect/time': 1.0.2 - '@walletconnect/types': 2.23.7 + '@walletconnect/types': 2.23.8 '@walletconnect/window-getters': 1.0.1 '@walletconnect/window-metadata': 1.0.1 blakejs: 1.2.1 @@ -10891,7 +11089,7 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.0: {} + baseline-browser-mapping@2.10.8: {} better-path-resolve@1.0.0: dependencies: @@ -10928,10 +11126,10 @@ snapshots: browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.10.0 - caniuse-lite: 1.0.30001774 - electron-to-chromium: 1.5.302 - node-releases: 2.0.27 + baseline-browser-mapping: 2.10.8 + caniuse-lite: 1.0.30001779 + electron-to-chromium: 1.5.313 + node-releases: 2.0.36 update-browserslist-db: 1.2.3(browserslist@4.28.1) bs58@4.0.1: @@ -10948,6 +11146,8 @@ snapshots: buffer-from@1.1.2: {} + buffer-layout@1.2.2: {} + buffer@6.0.3: dependencies: base64-js: 1.5.1 @@ -10958,9 +11158,9 @@ snapshots: node-gyp-build: 4.8.4 optional: true - bundle-require@5.1.0(esbuild@0.27.3): + bundle-require@5.1.0(esbuild@0.27.4): dependencies: - esbuild: 0.27.3 + esbuild: 0.27.4 load-tsconfig: 0.2.5 cac@6.7.14: {} @@ -10988,7 +11188,7 @@ snapshots: camelcase@6.3.0: {} - caniuse-lite@1.0.30001774: {} + caniuse-lite@1.0.30001779: {} chai@5.3.3: dependencies: @@ -11025,7 +11225,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -11034,7 +11234,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -11222,7 +11422,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.302: {} + electron-to-chromium@1.5.313: {} emoji-regex@8.0.0: {} @@ -11232,7 +11432,7 @@ snapshots: encodeurl@2.0.0: {} - enhanced-resolve@5.19.0: + enhanced-resolve@5.20.0: dependencies: graceful-fs: 4.2.11 tapable: 2.3.0 @@ -11309,7 +11509,7 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.2.2: + es-iterator-helpers@1.3.1: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 @@ -11326,6 +11526,7 @@ snapshots: has-symbols: 1.1.0 internal-slot: 1.1.0 iterator.prototype: 1.1.5 + math-intrinsics: 1.1.0 safe-array-concat: 1.1.3 es-module-lexer@1.7.0: {} @@ -11359,34 +11560,34 @@ snapshots: dependencies: es6-promise: 4.2.8 - esbuild@0.27.3: - optionalDependencies: - '@esbuild/aix-ppc64': 0.27.3 - '@esbuild/android-arm': 0.27.3 - '@esbuild/android-arm64': 0.27.3 - '@esbuild/android-x64': 0.27.3 - '@esbuild/darwin-arm64': 0.27.3 - '@esbuild/darwin-x64': 0.27.3 - '@esbuild/freebsd-arm64': 0.27.3 - '@esbuild/freebsd-x64': 0.27.3 - '@esbuild/linux-arm': 0.27.3 - '@esbuild/linux-arm64': 0.27.3 - '@esbuild/linux-ia32': 0.27.3 - '@esbuild/linux-loong64': 0.27.3 - '@esbuild/linux-mips64el': 0.27.3 - '@esbuild/linux-ppc64': 0.27.3 - '@esbuild/linux-riscv64': 0.27.3 - '@esbuild/linux-s390x': 0.27.3 - '@esbuild/linux-x64': 0.27.3 - '@esbuild/netbsd-arm64': 0.27.3 - '@esbuild/netbsd-x64': 0.27.3 - '@esbuild/openbsd-arm64': 0.27.3 - '@esbuild/openbsd-x64': 0.27.3 - '@esbuild/openharmony-arm64': 0.27.3 - '@esbuild/sunos-x64': 0.27.3 - '@esbuild/win32-arm64': 0.27.3 - '@esbuild/win32-ia32': 0.27.3 - '@esbuild/win32-x64': 0.27.3 + esbuild@0.27.4: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.4 + '@esbuild/android-arm': 0.27.4 + '@esbuild/android-arm64': 0.27.4 + '@esbuild/android-x64': 0.27.4 + '@esbuild/darwin-arm64': 0.27.4 + '@esbuild/darwin-x64': 0.27.4 + '@esbuild/freebsd-arm64': 0.27.4 + '@esbuild/freebsd-x64': 0.27.4 + '@esbuild/linux-arm': 0.27.4 + '@esbuild/linux-arm64': 0.27.4 + '@esbuild/linux-ia32': 0.27.4 + '@esbuild/linux-loong64': 0.27.4 + '@esbuild/linux-mips64el': 0.27.4 + '@esbuild/linux-ppc64': 0.27.4 + '@esbuild/linux-riscv64': 0.27.4 + '@esbuild/linux-s390x': 0.27.4 + '@esbuild/linux-x64': 0.27.4 + '@esbuild/netbsd-arm64': 0.27.4 + '@esbuild/netbsd-x64': 0.27.4 + '@esbuild/openbsd-arm64': 0.27.4 + '@esbuild/openbsd-x64': 0.27.4 + '@esbuild/openharmony-arm64': 0.27.4 + '@esbuild/sunos-x64': 0.27.4 + '@esbuild/win32-arm64': 0.27.4 + '@esbuild/win32-ia32': 0.27.4 + '@esbuild/win32-x64': 0.27.4 escalade@3.2.0: {} @@ -11396,18 +11597,18 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-next@16.1.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3): + eslint-config-next@16.1.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): dependencies: '@next/eslint-plugin-next': 16.1.0 - eslint: 9.39.3(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.3(jiti@2.6.1)) - eslint-plugin-react: 7.37.5(eslint@9.39.3(jiti@2.6.1)) - eslint-plugin-react-hooks: 7.0.1(eslint@9.39.3(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.4(jiti@2.6.1)) + eslint-plugin-react: 7.37.5(eslint@9.39.4(jiti@2.6.1)) + eslint-plugin-react-hooks: 7.0.1(eslint@9.39.4(jiti@2.6.1)) globals: 16.4.0 - typescript-eslint: 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + typescript-eslint: 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -11424,33 +11625,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 9.39.3(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) get-tsconfig: 4.13.6 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.3(jiti@2.6.1) + '@typescript-eslint/parser': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.4(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -11459,9 +11660,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.39.3(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)))(eslint@9.39.3(jiti@2.6.1)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1)))(eslint@9.39.4(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -11473,13 +11674,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.3(jiti@2.6.1)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.39.4(jiti@2.6.1)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -11489,7 +11690,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.39.3(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -11498,26 +11699,26 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@7.0.1(eslint@9.39.3(jiti@2.6.1)): + eslint-plugin-react-hooks@7.0.1(eslint@9.39.4(jiti@2.6.1)): dependencies: '@babel/core': 7.29.0 '@babel/parser': 7.29.0 - eslint: 9.39.3(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) hermes-parser: 0.25.1 zod: 4.3.6 zod-validation-error: 4.0.2(zod@4.3.6) transitivePeerDependencies: - supports-color - eslint-plugin-react@7.37.5(eslint@9.39.3(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.4(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.2 - eslint: 9.39.3(jiti@2.6.1) + es-iterator-helpers: 1.3.1 + eslint: 9.39.4(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -11542,15 +11743,15 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.39.3(jiti@2.6.1): + eslint@9.39.4(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.3(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.21.1 + '@eslint/config-array': 0.21.2 '@eslint/config-helpers': 0.4.2 '@eslint/core': 0.17.0 - '@eslint/eslintrc': 3.3.4 - '@eslint/js': 9.39.3 + '@eslint/eslintrc': 3.3.5 + '@eslint/js': 9.39.4 '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 @@ -11611,6 +11812,8 @@ snapshots: event-target-shim@5.0.1: {} + eventemitter3@4.0.7: {} + eventemitter3@5.0.1: {} eventemitter3@5.0.4: {} @@ -11649,9 +11852,14 @@ snapshots: fast-stable-stringify@1.0.0: {} - fast-xml-parser@5.3.6: + fast-xml-builder@1.1.3: + dependencies: + path-expression-matcher: 1.1.3 + + fast-xml-parser@5.4.1: dependencies: - strnum: 2.1.2 + fast-xml-builder: 1.1.3 + strnum: 2.2.0 fastestsmallesttextencoderdecoder@1.0.22: {} @@ -11708,15 +11916,15 @@ snapshots: fix-dts-default-cjs-exports@1.0.1: dependencies: magic-string: 0.30.21 - mlly: 1.8.0 + mlly: 1.8.1 rollup: 4.59.0 flat-cache@4.0.1: dependencies: - flatted: 3.3.3 + flatted: 3.4.1 keyv: 4.5.4 - flatted@3.3.3: {} + flatted@3.4.1: {} flow-enums-runtime@0.0.6: {} @@ -11731,10 +11939,10 @@ snapshots: format@0.2.2: {} - framer-motion@12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + framer-motion@12.36.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - motion-dom: 12.34.3 - motion-utils: 12.29.2 + motion-dom: 12.36.0 + motion-utils: 12.36.0 tslib: 2.8.1 optionalDependencies: react: 19.2.4 @@ -11858,7 +12066,7 @@ snapshots: graceful-fs@4.2.11: {} - h3@1.15.5: + h3@1.15.6: dependencies: cookie-es: 1.2.2 crossws: 0.3.5 @@ -11870,14 +12078,14 @@ snapshots: ufo: 1.6.3 uncrypto: 0.1.3 - happy-dom@20.7.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + happy-dom@20.8.4(bufferutil@4.1.0): dependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 '@types/whatwg-mimetype': 3.0.2 '@types/ws': 8.18.1 entities: 7.0.1 whatwg-mimetype: 3.0.0 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -12146,9 +12354,9 @@ snapshots: isexe@2.0.0: {} - isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)): + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.1.0)): dependencies: - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6) istanbul-lib-coverage@3.2.2: {} @@ -12196,7 +12404,7 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + jayson@4.3.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@types/connect': 3.4.38 '@types/node': 12.20.55 @@ -12205,11 +12413,11 @@ snapshots: delay: 5.0.0 es6-promisify: 5.0.0 eyes: 0.1.8 - isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10)) + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.1.0)) json-stringify-safe: 5.0.1 stream-json: 1.9.1 uuid: 8.3.2 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -12219,7 +12427,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.10.15 + '@types/node': 24.12.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -12229,7 +12437,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 24.10.15 + '@types/node': 24.12.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -12256,7 +12464,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.10.15 + '@types/node': 24.12.0 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -12264,7 +12472,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.10.15 + '@types/node': 24.12.0 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -12281,14 +12489,14 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 jiti@2.6.1: {} - jose@6.1.3: {} + jose@6.2.1: {} joycon@3.1.1: {} @@ -12446,7 +12654,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.2.6: {} + lru-cache@11.2.7: {} lru-cache@5.1.1: dependencies: @@ -12486,7 +12694,7 @@ snapshots: merge2@1.4.1: {} - metro-babel-transformer@0.83.4: + metro-babel-transformer@0.83.5: dependencies: '@babel/core': 7.29.0 flow-enums-runtime: 0.0.6 @@ -12495,41 +12703,41 @@ snapshots: transitivePeerDependencies: - supports-color - metro-cache-key@0.83.4: + metro-cache-key@0.83.5: dependencies: flow-enums-runtime: 0.0.6 - metro-cache@0.83.4: + metro-cache@0.83.5: dependencies: exponential-backoff: 3.1.3 flow-enums-runtime: 0.0.6 https-proxy-agent: 7.0.6 - metro-core: 0.83.4 + metro-core: 0.83.5 transitivePeerDependencies: - supports-color - metro-config@0.83.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): + metro-config@0.83.5(bufferutil@4.1.0): dependencies: connect: 3.7.0 flow-enums-runtime: 0.0.6 jest-validate: 29.7.0 - metro: 0.83.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) - metro-cache: 0.83.4 - metro-core: 0.83.4 - metro-runtime: 0.83.4 + metro: 0.83.5(bufferutil@4.1.0) + metro-cache: 0.83.5 + metro-core: 0.83.5 + metro-runtime: 0.83.5 yaml: 2.8.2 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro-core@0.83.4: + metro-core@0.83.5: dependencies: flow-enums-runtime: 0.0.6 lodash.throttle: 4.1.1 - metro-resolver: 0.83.4 + metro-resolver: 0.83.5 - metro-file-map@0.83.4: + metro-file-map@0.83.5: dependencies: debug: 4.4.3 fb-watchman: 2.0.2 @@ -12543,46 +12751,46 @@ snapshots: transitivePeerDependencies: - supports-color - metro-minify-terser@0.83.4: + metro-minify-terser@0.83.5: dependencies: flow-enums-runtime: 0.0.6 terser: 5.46.0 - metro-resolver@0.83.4: + metro-resolver@0.83.5: dependencies: flow-enums-runtime: 0.0.6 - metro-runtime@0.83.4: + metro-runtime@0.83.5: dependencies: '@babel/runtime': 7.28.6 flow-enums-runtime: 0.0.6 - metro-source-map@0.83.4: + metro-source-map@0.83.5: dependencies: '@babel/traverse': 7.29.0 '@babel/types': 7.29.0 flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-symbolicate: 0.83.4 + metro-symbolicate: 0.83.5 nullthrows: 1.1.1 - ob1: 0.83.4 + ob1: 0.83.5 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-symbolicate@0.83.4: + metro-symbolicate@0.83.5: dependencies: flow-enums-runtime: 0.0.6 invariant: 2.2.4 - metro-source-map: 0.83.4 + metro-source-map: 0.83.5 nullthrows: 1.1.1 source-map: 0.5.7 vlq: 1.0.1 transitivePeerDependencies: - supports-color - metro-transform-plugins@0.83.4: + metro-transform-plugins@0.83.5: dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 @@ -12593,27 +12801,27 @@ snapshots: transitivePeerDependencies: - supports-color - metro-transform-worker@0.83.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): + metro-transform-worker@0.83.5(bufferutil@4.1.0): dependencies: '@babel/core': 7.29.0 '@babel/generator': 7.29.1 '@babel/parser': 7.29.0 '@babel/types': 7.29.0 flow-enums-runtime: 0.0.6 - metro: 0.83.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) - metro-babel-transformer: 0.83.4 - metro-cache: 0.83.4 - metro-cache-key: 0.83.4 - metro-minify-terser: 0.83.4 - metro-source-map: 0.83.4 - metro-transform-plugins: 0.83.4 + metro: 0.83.5(bufferutil@4.1.0) + metro-babel-transformer: 0.83.5 + metro-cache: 0.83.5 + metro-cache-key: 0.83.5 + metro-minify-terser: 0.83.5 + metro-source-map: 0.83.5 + metro-transform-plugins: 0.83.5 nullthrows: 1.1.1 transitivePeerDependencies: - bufferutil - supports-color - utf-8-validate - metro@0.83.4(bufferutil@4.1.0)(utf-8-validate@5.0.10): + metro@0.83.5(bufferutil@4.1.0): dependencies: '@babel/code-frame': 7.29.0 '@babel/core': 7.29.0 @@ -12636,24 +12844,24 @@ snapshots: jest-worker: 29.7.0 jsc-safe-url: 0.2.4 lodash.throttle: 4.1.1 - metro-babel-transformer: 0.83.4 - metro-cache: 0.83.4 - metro-cache-key: 0.83.4 - metro-config: 0.83.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) - metro-core: 0.83.4 - metro-file-map: 0.83.4 - metro-resolver: 0.83.4 - metro-runtime: 0.83.4 - metro-source-map: 0.83.4 - metro-symbolicate: 0.83.4 - metro-transform-plugins: 0.83.4 - metro-transform-worker: 0.83.4(bufferutil@4.1.0)(utf-8-validate@5.0.10) + metro-babel-transformer: 0.83.5 + metro-cache: 0.83.5 + metro-cache-key: 0.83.5 + metro-config: 0.83.5(bufferutil@4.1.0) + metro-core: 0.83.5 + metro-file-map: 0.83.5 + metro-resolver: 0.83.5 + metro-runtime: 0.83.5 + metro-source-map: 0.83.5 + metro-symbolicate: 0.83.5 + metro-transform-plugins: 0.83.5 + metro-transform-worker: 0.83.5(bufferutil@4.1.0) mime-types: 3.0.2 nullthrows: 1.1.1 serialize-error: 2.1.0 source-map: 0.5.7 throat: 5.0.0 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6) yargs: 17.7.2 transitivePeerDependencies: - bufferutil @@ -12693,22 +12901,22 @@ snapshots: mkdirp@1.0.4: {} - mlly@1.8.0: + mlly@1.8.1: dependencies: acorn: 8.16.0 pathe: 2.0.3 pkg-types: 1.3.1 ufo: 1.6.3 - motion-dom@12.34.3: + motion-dom@12.36.0: dependencies: - motion-utils: 12.29.2 + motion-utils: 12.36.0 - motion-utils@12.29.2: {} + motion-utils@12.36.0: {} - motion@12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + motion@12.36.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - framer-motion: 12.34.3(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + framer-motion: 12.36.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) tslib: 2.8.1 optionalDependencies: react: 19.2.4 @@ -12744,8 +12952,8 @@ snapshots: dependencies: '@next/env': 16.1.0 '@swc/helpers': 0.5.15 - baseline-browser-mapping: 2.10.0 - caniuse-lite: 1.0.30001774 + baseline-browser-mapping: 2.10.8 + caniuse-lite: 1.0.30001779 postcss: 8.4.31 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -12784,13 +12992,13 @@ snapshots: node-mock-http@1.0.4: {} - node-releases@2.0.27: {} + node-releases@2.0.36: {} normalize-path@3.0.0: {} nullthrows@1.1.1: {} - ob1@0.83.4: + ob1@0.83.5: dependencies: flow-enums-runtime: 0.0.6 @@ -12923,6 +13131,8 @@ snapshots: dependencies: quansync: 0.2.11 + pako@2.1.0: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -12940,6 +13150,8 @@ snapshots: path-exists@4.0.0: {} + path-expression-matcher@1.1.3: {} + path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -12990,19 +13202,19 @@ snapshots: pkg-types@1.3.1: dependencies: confbox: 0.1.8 - mlly: 1.8.0 + mlly: 1.8.1 pathe: 2.0.3 pngjs@5.0.0: {} possible-typed-array-names@1.1.0: {} - postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.2): + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(yaml@2.8.2): dependencies: lilconfig: 3.1.3 optionalDependencies: jiti: 2.6.1 - postcss: 8.5.6 + postcss: 8.5.8 yaml: 2.8.2 postcss@8.4.31: @@ -13011,7 +13223,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - postcss@8.5.6: + postcss@8.5.8: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 @@ -13077,10 +13289,10 @@ snapshots: range-parser@1.2.1: {} - react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@5.0.10): + react-devtools-core@6.1.5(bufferutil@4.1.0): dependencies: shell-quote: 1.8.3 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - utf-8-validate @@ -13096,16 +13308,16 @@ snapshots: react-is@18.3.1: {} - react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10): + react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.84.1 '@react-native/codegen': 0.84.1(@babel/core@7.29.0) - '@react-native/community-cli-plugin': 0.84.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) + '@react-native/community-cli-plugin': 0.84.1(bufferutil@4.1.0) '@react-native/gradle-plugin': 0.84.1 '@react-native/js-polyfills': 0.84.1 '@react-native/normalize-colors': 0.84.1 - '@react-native/virtualized-lists': 0.84.1(@types/react@19.2.14)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4)(utf-8-validate@5.0.10))(react@19.2.4) + '@react-native/virtualized-lists': 0.84.1(@types/react@19.2.14)(react-native@0.84.1(@babel/core@7.29.0)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.4))(react@19.2.4) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -13118,13 +13330,13 @@ snapshots: invariant: 2.2.4 jest-environment-node: 29.7.0 memoize-one: 5.2.1 - metro-runtime: 0.83.4 - metro-source-map: 0.83.4 + metro-runtime: 0.83.5 + metro-source-map: 0.83.5 nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 react: 19.2.4 - react-devtools-core: 6.1.5(bufferutil@4.1.0)(utf-8-validate@5.0.10) + react-devtools-core: 6.1.5(bufferutil@4.1.0) react-refresh: 0.14.2 regenerator-runtime: 0.13.11 scheduler: 0.27.0 @@ -13132,7 +13344,7 @@ snapshots: stacktrace-parser: 0.1.11 tinyglobby: 0.2.15 whatwg-fetch: 3.6.20 - ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10) + ws: 7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6) yargs: 17.7.2 optionalDependencies: '@types/react': 19.2.14 @@ -13295,18 +13507,18 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.59.0 fsevents: 2.3.3 - rpc-websockets@9.3.3: + rpc-websockets@9.3.5: dependencies: '@swc/helpers': 0.5.19 - '@types/uuid': 8.3.4 + '@types/uuid': 10.0.0 '@types/ws': 8.18.1 buffer: 6.0.3 eventemitter3: 5.0.4 - uuid: 8.3.2 - ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + uuid: 11.1.0 + ws: 8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) optionalDependencies: bufferutil: 4.1.0 - utf-8-validate: 5.0.10 + utf-8-validate: 6.0.6 run-parallel@1.2.0: dependencies: @@ -13400,7 +13612,7 @@ snapshots: sharp@0.34.5: dependencies: - '@img/colour': 1.0.0 + '@img/colour': 1.1.0 detect-libc: 2.1.2 semver: 7.7.4 optionalDependencies: @@ -13623,7 +13835,7 @@ snapshots: dependencies: js-tokens: 9.0.1 - strnum@2.1.2: {} + strnum@2.2.0: {} styled-jsx@5.1.6(@babel/core@7.29.0)(react@19.2.4): dependencies: @@ -13642,6 +13854,8 @@ snapshots: tinyglobby: 0.2.15 ts-interface-checker: 0.1.13 + superstruct@0.15.5: {} + superstruct@2.0.2: {} supports-color@7.2.0: @@ -13726,6 +13940,8 @@ snapshots: toidentifier@1.0.1: {} + toml@3.0.0: {} + totalist@3.0.1: {} tr46@0.0.3: {} @@ -13749,18 +13965,18 @@ snapshots: tslib@2.8.1: {} - tsup@8.5.1(jiti@2.6.1)(postcss@8.5.6)(typescript@5.9.3)(yaml@2.8.2): + tsup@8.5.1(jiti@2.6.1)(postcss@8.5.8)(typescript@5.9.3)(yaml@2.8.2): dependencies: - bundle-require: 5.1.0(esbuild@0.27.3) + bundle-require: 5.1.0(esbuild@0.27.4) cac: 6.7.14 chokidar: 4.0.3 consola: 3.4.2 debug: 4.4.3 - esbuild: 0.27.3 + esbuild: 0.27.4 fix-dts-default-cjs-exports: 1.0.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.2) + postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.8)(yaml@2.8.2) resolve-from: 5.0.0 rollup: 4.59.0 source-map: 0.7.6 @@ -13769,7 +13985,7 @@ snapshots: tinyglobby: 0.2.15 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.5.6 + postcss: 8.5.8 typescript: 5.9.3 transitivePeerDependencies: - jiti @@ -13777,32 +13993,32 @@ snapshots: - tsx - yaml - turbo-darwin-64@2.8.12: + turbo-darwin-64@2.8.17: optional: true - turbo-darwin-arm64@2.8.12: + turbo-darwin-arm64@2.8.17: optional: true - turbo-linux-64@2.8.12: + turbo-linux-64@2.8.17: optional: true - turbo-linux-arm64@2.8.12: + turbo-linux-arm64@2.8.17: optional: true - turbo-windows-64@2.8.12: + turbo-windows-64@2.8.17: optional: true - turbo-windows-arm64@2.8.12: + turbo-windows-arm64@2.8.17: optional: true - turbo@2.8.12: + turbo@2.8.17: optionalDependencies: - turbo-darwin-64: 2.8.12 - turbo-darwin-arm64: 2.8.12 - turbo-linux-64: 2.8.12 - turbo-linux-arm64: 2.8.12 - turbo-windows-64: 2.8.12 - turbo-windows-arm64: 2.8.12 + turbo-darwin-64: 2.8.17 + turbo-darwin-arm64: 2.8.17 + turbo-linux-64: 2.8.17 + turbo-linux-arm64: 2.8.17 + turbo-windows-64: 2.8.17 + turbo-windows-arm64: 2.8.17 tw-animate-css@1.4.0: {} @@ -13847,13 +14063,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.56.1(@typescript-eslint/parser@8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.56.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.56.1(eslint@9.39.3(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.3(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@9.39.4(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.4(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -13877,7 +14093,7 @@ snapshots: undici-types@7.16.0: {} - undici-types@7.22.0: {} + undici-types@7.24.3: {} universalify@0.1.2: {} @@ -13912,8 +14128,8 @@ snapshots: anymatch: 3.1.3 chokidar: 5.0.0 destr: 2.0.5 - h3: 1.15.5 - lru-cache: 11.2.6 + h3: 1.15.6 + lru-cache: 11.2.7 node-fetch-native: 1.6.7 ofetch: 1.5.1 ufo: 1.6.3 @@ -13949,22 +14165,24 @@ snapshots: dependencies: react: 19.2.4 - utf-8-validate@5.0.10: + utf-8-validate@6.0.6: dependencies: node-gyp-build: 4.8.4 optional: true utils-merge@1.0.1: {} + uuid@11.1.0: {} + uuid@8.3.2: {} - vite-node@3.2.4(@types/node@24.10.15)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2): + vite-node@3.2.4(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.3.1(@types/node@24.10.15)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) transitivePeerDependencies: - '@types/node' - jiti @@ -13979,27 +14197,27 @@ snapshots: - tsx - yaml - vite@7.3.1(@types/node@24.10.15)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2): + vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2): dependencies: - esbuild: 0.27.3 + esbuild: 0.27.4 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - postcss: 8.5.6 + postcss: 8.5.8 rollup: 4.59.0 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.31.1 terser: 5.46.0 yaml: 2.8.2 - vitest@3.2.4(@types/node@24.10.15)(@vitest/ui@3.2.4)(happy-dom@20.7.0(bufferutil@4.1.0)(utf-8-validate@5.0.10))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2): + vitest@3.2.4(@types/node@24.12.0)(@vitest/ui@3.2.4)(happy-dom@20.8.4(bufferutil@4.1.0))(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2): dependencies: '@types/chai': 5.2.3 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.10.15)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) + '@vitest/mocker': 3.2.4(vite@7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -14017,13 +14235,13 @@ snapshots: tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.3.1(@types/node@24.10.15)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) - vite-node: 3.2.4(@types/node@24.10.15)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) + vite: 7.3.1(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) + vite-node: 3.2.4(@types/node@24.12.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.46.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.10.15 + '@types/node': 24.12.0 '@vitest/ui': 3.2.4(vitest@3.2.4) - happy-dom: 20.7.0(bufferutil@4.1.0)(utf-8-validate@5.0.10) + happy-dom: 20.8.4(bufferutil@4.1.0) transitivePeerDependencies: - jiti - less @@ -14134,15 +14352,15 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 - ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): + ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: bufferutil: 4.1.0 - utf-8-validate: 5.0.10 + utf-8-validate: 6.0.6 - ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@5.0.10): + ws@8.19.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): optionalDependencies: bufferutil: 4.1.0 - utf-8-validate: 5.0.10 + utf-8-validate: 6.0.6 xtend@4.0.2: {}