diff --git a/.changeset/add-classified-transactions-hook.md b/.changeset/add-classified-transactions-hook.md new file mode 100644 index 0000000..743f2ff --- /dev/null +++ b/.changeset/add-classified-transactions-hook.md @@ -0,0 +1,5 @@ +--- +"@solana/react-hooks": minor +--- + +Add `useClassifiedTransactions` hook for fetching classified Solana transactions with automatic spam filtering, protocol detection, and transaction classification via tx-indexer SDK. The hook supports cursor-based pagination through `oldestSignature` and `hasMore` return values. diff --git a/apps/docs/content/docs/react-hooks.mdx b/apps/docs/content/docs/react-hooks.mdx index b871d51..e5d9d7a 100644 --- a/apps/docs/content/docs/react-hooks.mdx +++ b/apps/docs/content/docs/react-hooks.mdx @@ -221,6 +221,181 @@ function NonceInfo({ address }: { address: string }) { } ``` +### useClassifiedTransactions + +Fetch and classify transactions for a wallet address with automatic spam filtering, protocol detection, and token metadata enrichment: + +```tsx +import { useClassifiedTransactions } from "@solana/react-hooks"; + +function TransactionHistory({ address }: { address: string }) { + const { transactions, isLoading, isError, hasMore, oldestSignature } = + useClassifiedTransactions({ + address, + options: { limit: 10 }, + }); + + if (isLoading) return

Loading...

; + if (isError) return

Error loading transactions

; + + return ( +
+ {transactions.map((tx) => ( +
+

{tx.classification.primaryType}

+ {tx.classification.primaryAmount && ( +

+ {tx.classification.primaryAmount.amountUi}{" "} + {tx.classification.primaryAmount.token.symbol} +

+ )} + {tx.tx.protocol &&

via {tx.tx.protocol.name}

} +
+ ))} +
+ ); +} +``` + +**Pagination example:** + +```tsx +function PaginatedHistory({ address }: { address: string }) { + const [cursor, setCursor] = useState(); + + const { transactions, oldestSignature, hasMore, isLoading } = + useClassifiedTransactions({ + address, + options: { limit: 20, before: cursor }, + }); + + return ( +
+ {transactions.map((tx) => ( + + ))} + {hasMore && ( + + )} +
+ ); +} +``` + +**Rate-limited RPC configuration:** + +```tsx +// Conservative settings for public RPCs (e.g., devnet) +const { transactions } = useClassifiedTransactions({ + address, + options: { + limit: 5, + overfetchMultiplier: 1, + transactionConcurrency: 1, + }, + swr: { + revalidateOnFocus: false, + revalidateOnReconnect: false, + }, +}); +``` + +**Options:** + +| Option | Default | Description | +| --- | --- | --- | +| `limit` | `10` | Max transactions per request | +| `before` | — | Pagination cursor (oldest signature from previous request) | +| `until` | — | Stop fetching at this signature | +| `cluster` | auto | Override auto-detected cluster (`'mainnet-beta'` \| `'devnet'` \| `'testnet'`) | +| `filterSpam` | `true` | Filter out spam/dust transactions | +| `includeTokenAccounts` | `false` | Query ATAs for incoming token transfers | +| `maxTokenAccounts` | `5` | Max ATAs to query when `includeTokenAccounts` is enabled | +| `enrichTokenMetadata` | `true` | Add token symbols and names | +| `enrichNftMetadata` | `true` | Add NFT metadata (requires DAS RPC) | +| `overfetchMultiplier` | `1` | Signature overfetch multiplier (increase for high-spam wallets) | +| `minPageSize` | `20` | Min signatures per iteration | +| `transactionConcurrency` | `1` | Parallel transaction fetches | + +**Response Structure:** + +Each item in the `transactions` array is a `ClassifiedTransaction`: + +```ts +interface ClassifiedTransaction { + // Raw transaction data + tx: { + signature: string; + slot: number | bigint; + blockTime: number | bigint | null; + fee?: number; + err: any | null; + programIds: string[]; + protocol: { + id: string; + name: string; // e.g. "Jupiter", "Raydium" + iconUrl?: string; + } | null; + memo?: string | null; + }; + + // High-level classification + classification: { + primaryType: + | "transfer" | "swap" | "nft_purchase" | "nft_sale" + | "nft_mint" | "stake_deposit" | "stake_withdraw" + | "airdrop" | "bridge_in" | "bridge_out" + | "privacy_deposit" | "privacy_withdraw" // Privacy Cash + | "fee_only" | "other"; + primaryAmount: MoneyAmount | null; // Main amount + secondaryAmount?: MoneyAmount | null; // e.g., swap output + sender?: string | null; + receiver?: string | null; + counterparty: { + type: "person" | "merchant" | "exchange" | "protocol" | "own_wallet" | "unknown"; + address: string; + name?: string; + } | null; + confidence: number; // 0-1 + metadata?: Record; // e.g., nft_mint, nft_name + }; + + // Individual token/SOL movements + legs: Array<{ + accountId: string; + side: "debit" | "credit"; // debit = out, credit = in + amount: MoneyAmount; + role: "sent" | "received" | "fee" | "reward" | "protocol_deposit" | "protocol_withdraw" | "unknown"; + }>; +} + +interface MoneyAmount { + token: { + mint: string; + symbol: string; // e.g. "SOL", "USDC" + name?: string; + decimals: number; + logoURI?: string; + }; + amountRaw: string; // Raw amount (e.g., "1000000000") + amountUi: number; // Human-readable (e.g., 1.0) + fiat?: { + currency: "USD" | "EUR"; + amount: number; + pricePerUnit: number; + }; +} +``` + +**Understanding Legs:** + +Legs are the individual token movements within a transaction. A simple SOL transfer has 2 legs (sender debit, receiver credit), while a swap has 4+ legs (token out, token in, fees). Use `classification.primaryAmount` for high-level summaries, and `legs` for granular movement details. + ## Transfer Hooks ### useSolTransfer @@ -646,6 +821,7 @@ export function App() { | `useAccount` | Fetch and watch account | | `useLookupTable` | Fetch lookup table | | `useNonceAccount` | Fetch nonce account | +| `useClassifiedTransactions` | Fetch classified transaction history | | `useProgramAccounts` | Query program accounts | ### Transaction Hooks diff --git a/examples/vite-react/src/App.tsx b/examples/vite-react/src/App.tsx index 92d41fc..4f0a9f6 100644 --- a/examples/vite-react/src/App.tsx +++ b/examples/vite-react/src/App.tsx @@ -5,6 +5,7 @@ import { Suspense } from 'react'; import { AccountInspectorCard } from './components/AccountInspectorCard.tsx'; import { AirdropCard } from './components/AirdropCard.tsx'; import { BalanceCard } from './components/BalanceCard.tsx'; +import { ClassifiedTransactionsCard } from './components/ClassifiedTransactionsCard.tsx'; import { ClusterStatusCard } from './components/ClusterStatusCard.tsx'; import { LatestBlockhashCard } from './components/LatestBlockhashCard.tsx'; import { ProgramAccountsCard } from './components/ProgramAccountsCard.tsx'; @@ -95,6 +96,7 @@ function DemoApp() { fallback={
Loading queries…
} >
+ diff --git a/examples/vite-react/src/components/ClassifiedTransactionsCard.tsx b/examples/vite-react/src/components/ClassifiedTransactionsCard.tsx new file mode 100644 index 0000000..e9869db --- /dev/null +++ b/examples/vite-react/src/components/ClassifiedTransactionsCard.tsx @@ -0,0 +1,145 @@ +import { useClassifiedTransactions, useWallet } from '@solana/react-hooks'; +import { type ChangeEvent, useEffect, useMemo, useRef, useState } from 'react'; + +import { Button } from './ui/button'; +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from './ui/card'; +import { Input } from './ui/input'; + +function formatError(error: unknown): string { + if (error instanceof Error) { + return error.message; + } + if (typeof error === 'string') { + return error; + } + return JSON.stringify(error); +} + +export function ClassifiedTransactionsCard() { + const wallet = useWallet(); + const [address, setAddress] = useState(''); + const [selectedTxIndex, setSelectedTxIndex] = useState(null); + + // Track if we've auto-filled from wallet to avoid overwriting user input + const hasAutoFilled = useRef(false); + + useEffect(() => { + if (wallet.status === 'connected' && !hasAutoFilled.current && address === '') { + setAddress(wallet.session.account.address.toString()); + hasAutoFilled.current = true; + } + }, [wallet, address]); + + const trimmedAddress = address.trim(); + const { transactions, isLoading, isError, error } = useClassifiedTransactions({ + address: trimmedAddress === '' ? undefined : trimmedAddress, + options: { + limit: 5, + filterSpam: true, + }, + swr: { + revalidateOnFocus: false, + revalidateOnReconnect: false, + revalidateIfStale: false, + }, + }); + + const handleChange = (event: ChangeEvent) => { + setAddress(event.target.value); + setSelectedTxIndex(null); + }; + + const selectedTxJson = useMemo(() => { + if (selectedTxIndex === null || !transactions[selectedTxIndex]) { + return null; + } + return JSON.stringify(transactions[selectedTxIndex], (_, v) => (typeof v === 'bigint' ? v.toString() : v), 2); + }, [selectedTxIndex, transactions]); + + return ( + + +
+ Classified Transactions + + Test the useClassifiedTransactions hook. Fetches and classifies transactions with + spam filtering and protocol detection. + +
+
+ +
+ + +
+ +
+ Status: + + {isLoading ? 'Loading...' : isError ? 'Error' : `${transactions.length} transactions`} + +
+ + {isError && error ? ( + + {formatError(error)} + + ) : null} + + {transactions.length > 0 ? ( +
+ {transactions.map((tx, index) => ( + + ))} +
+ ) : null} + + {selectedTxJson !== null ? ( +
+
+ Transaction Structure + +
+
{selectedTxJson}
+
+ ) : null} +
+
+ ); +} diff --git a/packages/react-hooks/README.md b/packages/react-hooks/README.md index 2acb770..d72f020 100644 --- a/packages/react-hooks/README.md +++ b/packages/react-hooks/README.md @@ -248,6 +248,190 @@ function NonceInfo({ address }: { address: string }) { } ``` +### Fetch classified transactions + +Fetch and classify transactions for a wallet with automatic spam filtering, protocol detection, and token metadata: + +```tsx +import { useClassifiedTransactions } from "@solana/react-hooks"; + +function TransactionHistory({ address }: { address: string }) { + const { transactions, isLoading, isError, hasMore, oldestSignature } = + useClassifiedTransactions({ + address, + options: { limit: 10 }, + }); + + if (isLoading) return

Loading…

; + if (isError) return

Error loading transactions

; + + return ( +
    + {transactions.map((tx) => ( +
  • + {tx.classification.primaryType} + {tx.classification.primaryAmount && ( + <> + : {tx.classification.primaryAmount.amountUi}{" "} + {tx.classification.primaryAmount.token.symbol} + + )} + {tx.tx.protocol && via {tx.tx.protocol.name}} +
  • + ))} +
+ ); +} +``` + +**Pagination example:** + +```tsx +function PaginatedHistory({ address }: { address: string }) { + const [cursor, setCursor] = useState(); + + const { transactions, oldestSignature, hasMore, isLoading } = + useClassifiedTransactions({ + address, + options: { limit: 20, before: cursor }, + }); + + return ( +
+ {transactions.map((tx) => ( + + ))} + {hasMore && ( + + )} +
+ ); +} +``` + +**Rate-limited RPC configuration (e.g., public devnet):** + +```tsx +const { transactions } = useClassifiedTransactions({ + address, + options: { + limit: 5, + overfetchMultiplier: 1, + transactionConcurrency: 1, + }, + swr: { + revalidateOnFocus: false, + revalidateOnReconnect: false, + }, +}); +``` + +**Available options:** + +| Option | Default | Description | +| --- | --- | --- | +| `limit` | `10` | Max transactions per request | +| `before` | — | Pagination cursor (oldest signature from previous request) | +| `until` | — | Stop fetching at this signature | +| `cluster` | auto | Override auto-detected cluster (`'mainnet-beta'` \| `'devnet'` \| `'testnet'`) | +| `filterSpam` | `true` | Filter out spam/dust transactions | +| `includeTokenAccounts` | `false` | Query ATAs for incoming token transfers | +| `maxTokenAccounts` | `5` | Max ATAs to query when `includeTokenAccounts` is enabled | +| `enrichTokenMetadata` | `true` | Add token symbols and names | +| `enrichNftMetadata` | `true` | Add NFT metadata (requires DAS RPC) | +| `overfetchMultiplier` | `1` | Signature overfetch multiplier (increase for high-spam wallets) | +| `minPageSize` | `20` | Min signatures per iteration | +| `transactionConcurrency` | `1` | Parallel transaction fetches | + +**Response structure:** + +Each item in the `transactions` array is a `ClassifiedTransaction` with the following shape: + +```ts +interface ClassifiedTransaction { + // Raw transaction data + tx: { + signature: string; + slot: number | bigint; + blockTime: number | bigint | null; + fee?: number; + err: any | null; + programIds: string[]; + protocol: { + id: string; + name: string; // e.g. "Jupiter", "Raydium", "Marinade" + iconUrl?: string; + } | null; + memo?: string | null; + }; + + // High-level classification of what this transaction represents + classification: { + primaryType: + | "transfer" + | "swap" + | "nft_purchase" + | "nft_sale" + | "nft_mint" + | "stake_deposit" + | "stake_withdraw" + | "airdrop" + | "bridge_in" + | "bridge_out" + | "privacy_deposit" // Shielding funds into privacy pool + | "privacy_withdraw" // Unshielding funds from pool + | "fee_only" + | "other"; + primaryAmount: MoneyAmount | null; // Main amount (e.g., what you sent/received) + secondaryAmount?: MoneyAmount | null; // Secondary amount (e.g., in a swap, what you got back) + sender?: string | null; + receiver?: string | null; + counterparty: { + type: "person" | "merchant" | "exchange" | "protocol" | "own_wallet" | "unknown"; + address: string; + name?: string; + } | null; + confidence: number; // 0-1, how confident the classifier is + metadata?: Record; // Extra data (e.g., nft_mint, nft_name, nft_image) + }; + + // Individual token/SOL movements within the transaction + legs: Array<{ + accountId: string; // The account involved + side: "debit" | "credit"; // Debit = out, Credit = in + amount: MoneyAmount; + role: "sent" | "received" | "fee" | "reward" | "protocol_deposit" | "protocol_withdraw" | "unknown"; + }>; +} + +// Token amount with metadata +interface MoneyAmount { + token: { + mint: string; + symbol: string; // e.g. "SOL", "USDC", "JUP" + name?: string; // e.g. "Solana", "USD Coin" + decimals: number; + logoURI?: string; + }; + amountRaw: string; // Raw amount as string (e.g., "1000000000") + amountUi: number; // Human-readable amount (e.g., 1.0 for 1 SOL) + fiat?: { + currency: "USD" | "EUR"; + amount: number; + pricePerUnit: number; + }; +} +``` + +**Understanding legs:** + +Legs represent the individual token movements within a transaction. A simple transfer has 2 legs (sender debit, receiver credit), while a swap might have 4+ legs (token out, token in, fees, etc.). Use legs when you need granular detail about every movement, and use `classification.primaryAmount`/`secondaryAmount` for a high-level summary. + ### Build and send arbitrary transactions ```tsx diff --git a/packages/react-hooks/package.json b/packages/react-hooks/package.json index 48c9662..b437833 100644 --- a/packages/react-hooks/package.json +++ b/packages/react-hooks/package.json @@ -44,17 +44,18 @@ }, "license": "MIT", "dependencies": { - "@solana/client": "workspace:*", "@solana/addresses": "catalog:solana", + "@solana/client": "workspace:*", "@solana/codecs-core": "catalog:solana", "@solana/errors": "catalog:solana", "@solana/keys": "catalog:solana", + "@solana/kit": "catalog:solana", "@solana/promises": "catalog:solana", "@solana/signers": "catalog:solana", "@solana/transaction-messages": "catalog:solana", "@solana/transactions": "catalog:solana", - "@solana/kit": "catalog:solana", "swr": "^2.3.6", + "tx-indexer": "^1.4.0", "zustand": "catalog:utils" }, "devDependencies": { diff --git a/packages/react-hooks/src/index.ts b/packages/react-hooks/src/index.ts index b3274f4..6b07dbd 100644 --- a/packages/react-hooks/src/index.ts +++ b/packages/react-hooks/src/index.ts @@ -1,6 +1,15 @@ 'use client'; export type { StakeAccount } from '@solana/client'; +export type { ClassifiedTransaction, Cluster } from 'tx-indexer'; +export type { + MoneyAmount, + RawTransaction, + TokenInfo, + TransactionClassification, + TxLeg, + TxPrimaryType, +} from 'tx-indexer/types'; export type { SolanaClientProviderProps, UseSolanaClientParameters, @@ -96,6 +105,12 @@ export type { WalletModalState, } from './ui'; export { useWalletConnection, useWalletModalState, WalletConnectionManager } from './ui'; +export type { + UseClassifiedTransactionsOptions, + UseClassifiedTransactionsParameters, + UseClassifiedTransactionsReturnType, +} from './useClassifiedTransactions'; +export { useClassifiedTransactions } from './useClassifiedTransactions'; export type { UseClientStoreParameters, UseClientStoreReturnType, diff --git a/packages/react-hooks/src/useClassifiedTransactions.test.tsx b/packages/react-hooks/src/useClassifiedTransactions.test.tsx new file mode 100644 index 0000000..1c7394f --- /dev/null +++ b/packages/react-hooks/src/useClassifiedTransactions.test.tsx @@ -0,0 +1,195 @@ +// @vitest-environment jsdom + +import { describe, expect, it, vi } from 'vitest'; + +import { createAddress, createSignature } from '../test/fixtures'; +import { renderHookWithClient, waitFor } from '../test/utils'; + +import { useClassifiedTransactions } from './useClassifiedTransactions'; + +vi.mock('tx-indexer', () => ({ + createIndexer: vi.fn(() => ({ + getTransactions: vi.fn(), + })), +})); + +import { createIndexer } from 'tx-indexer'; + +function createMockClassifiedTransaction(index: number) { + return { + tx: { + signature: createSignature(index), + slot: BigInt(1000 + index), + blockTime: BigInt(Date.now()), + fee: 5000, + err: null, + programIds: ['11111111111111111111111111111111'], + protocol: null, + }, + classification: { + primaryType: 'transfer' as const, + primaryAmount: { + token: { mint: 'So11111111111111111111111111111111111111112', symbol: 'SOL', decimals: 9 }, + amountRaw: '1000000000', + amountUi: 1.0, + }, + secondaryAmount: null, + sender: createAddress(1).toString(), + receiver: createAddress(2).toString(), + counterparty: null, + confidence: 0.95, + }, + legs: [], + }; +} + +describe('useClassifiedTransactions', () => { + it('returns empty state when no address is provided', async () => { + const { result } = renderHookWithClient(() => useClassifiedTransactions()); + + expect(result.current.transactions).toEqual([]); + expect(result.current.oldestSignature).toBeNull(); + expect(result.current.hasMore).toBe(false); + }); + + it('fetches classified transactions for an address', async () => { + const walletAddress = createAddress(1); + const mockTransactions = [createMockClassifiedTransaction(1), createMockClassifiedTransaction(2)]; + + const mockGetTransactions = vi.fn().mockResolvedValue(mockTransactions); + vi.mocked(createIndexer).mockReturnValue({ + getTransactions: mockGetTransactions, + } as unknown as ReturnType); + + const { result } = renderHookWithClient( + () => + useClassifiedTransactions({ + address: walletAddress, + options: { limit: 10 }, + }), + {}, + ); + + await waitFor(() => { + expect(result.current.transactions).toHaveLength(2); + }); + + expect(result.current.oldestSignature).toBe(mockTransactions[1].tx.signature); + expect(result.current.hasMore).toBe(false); + }); + + it('returns hasMore true when result count equals limit', async () => { + const walletAddress = createAddress(1); + const mockTransactions = Array.from({ length: 10 }, (_, i) => createMockClassifiedTransaction(i)); + + const mockGetTransactions = vi.fn().mockResolvedValue(mockTransactions); + vi.mocked(createIndexer).mockReturnValue({ + getTransactions: mockGetTransactions, + } as unknown as ReturnType); + + const { result } = renderHookWithClient( + () => + useClassifiedTransactions({ + address: walletAddress, + options: { limit: 10 }, + }), + {}, + ); + + await waitFor(() => { + expect(result.current.transactions).toHaveLength(10); + }); + + expect(result.current.hasMore).toBe(true); + }); + + it('passes pagination cursor to getTransactions', async () => { + const walletAddress = createAddress(1); + const beforeSignature = createSignature(99).toString(); + const mockTransactions = [createMockClassifiedTransaction(100)]; + + const mockGetTransactions = vi.fn().mockResolvedValue(mockTransactions); + vi.mocked(createIndexer).mockReturnValue({ + getTransactions: mockGetTransactions, + } as unknown as ReturnType); + + const { result } = renderHookWithClient( + () => + useClassifiedTransactions({ + address: walletAddress, + options: { limit: 10, before: beforeSignature }, + }), + {}, + ); + + await waitFor(() => { + expect(result.current.transactions).toHaveLength(1); + }); + + expect(mockGetTransactions).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + before: beforeSignature, + limit: 10, + }), + ); + }); + + it('passes filter options to getTransactions', async () => { + const walletAddress = createAddress(1); + + const mockGetTransactions = vi.fn().mockResolvedValue([]); + vi.mocked(createIndexer).mockReturnValue({ + getTransactions: mockGetTransactions, + } as unknown as ReturnType); + + renderHookWithClient( + () => + useClassifiedTransactions({ + address: walletAddress, + options: { + filterSpam: false, + enrichNftMetadata: false, + enrichTokenMetadata: false, + }, + }), + {}, + ); + + await waitFor(() => { + expect(mockGetTransactions).toHaveBeenCalled(); + }); + + expect(mockGetTransactions).toHaveBeenCalledWith( + expect.anything(), + expect.objectContaining({ + filterSpam: false, + enrichNftMetadata: false, + enrichTokenMetadata: false, + }), + ); + }); + + it('is disabled when disabled option is true', async () => { + const walletAddress = createAddress(1); + + const mockGetTransactions = vi.fn().mockResolvedValue([]); + vi.mocked(createIndexer).mockReturnValue({ + getTransactions: mockGetTransactions, + } as unknown as ReturnType); + + const { result } = renderHookWithClient( + () => + useClassifiedTransactions({ + address: walletAddress, + disabled: true, + }), + {}, + ); + + await new Promise((resolve) => setTimeout(resolve, 50)); + + expect(mockGetTransactions).not.toHaveBeenCalled(); + expect(result.current.transactions).toEqual([]); + }); +}); diff --git a/packages/react-hooks/src/useClassifiedTransactions.ts b/packages/react-hooks/src/useClassifiedTransactions.ts new file mode 100644 index 0000000..ff57054 --- /dev/null +++ b/packages/react-hooks/src/useClassifiedTransactions.ts @@ -0,0 +1,298 @@ +import { type AddressLike, type SolanaClient, toAddress } from '@solana/client'; +import { useCallback, useMemo } from 'react'; +import { + type ClassifiedTransaction, + type Cluster, + createIndexer, + type GetTransactionsOptions, + type TxIndexer, +} from 'tx-indexer'; + +import { useSolanaClient } from './context'; +import { type SolanaQueryResult, type UseSolanaRpcQueryOptions, useSolanaRpcQuery } from './query'; +import { useClientStore } from './useClientStore'; + +function deriveClusterFromEndpoint(endpoint: string): Cluster { + const url = endpoint.toLowerCase(); + if (url.includes('devnet')) return 'devnet'; + if (url.includes('testnet')) return 'testnet'; + return 'mainnet-beta'; +} + +type ClassifiedTransactionsData = Readonly<{ + transactions: ClassifiedTransaction[]; + oldestSignature: string | null; + hasMore: boolean; +}>; + +export type UseClassifiedTransactionsOptions = Readonly<{ + /** Maximum transactions to fetch per request (default: 10) */ + limit?: number; + /** Pagination cursor - fetch transactions before this signature */ + before?: string; + /** Stop fetching at this signature */ + until?: string; + /** + * Solana cluster for token metadata resolution. + * Auto-detected from RPC endpoint URL by default (looks for 'devnet' or 'testnet' in URL). + * Override this if using a custom RPC URL that doesn't contain the cluster name. + * @default auto-detected from endpoint + */ + cluster?: Cluster; + /** Filter spam transactions (default: true) */ + filterSpam?: boolean; + /** Enrich with NFT metadata - requires DAS RPC (default: true) */ + enrichNftMetadata?: boolean; + /** Enrich with token metadata (default: true) */ + enrichTokenMetadata?: boolean; + /** + * Include signatures from token accounts (ATAs) to catch incoming transfers. + * This adds extra RPC calls but ensures complete transaction history. + * @default false + */ + includeTokenAccounts?: boolean; + /** + * Maximum token accounts to query when includeTokenAccounts is true (default: 5). + * Lower values reduce RPC calls. Set to 0 to skip token account queries. + */ + maxTokenAccounts?: number; + /** + * Multiplier for signature overfetch (default: 1). + * Higher values fetch more signatures to account for spam filtering. + * Set to 1 for rate-limited RPCs. + */ + overfetchMultiplier?: number; + /** + * Minimum signatures to fetch per iteration (default: 20). + * Set lower for rate-limited RPCs. + */ + minPageSize?: number; + /** + * Concurrency for fetching transactions (default: 1). + * Higher values are faster but use more RPC calls concurrently. + */ + transactionConcurrency?: number; +}>; + +/** + * Parameters for the useClassifiedTransactions hook. + */ +export type UseClassifiedTransactionsParameters = Readonly<{ + /** Wallet address to fetch transactions for. Can be a string or Address type. */ + address?: AddressLike; + /** Transaction fetching and classification options. */ + options?: UseClassifiedTransactionsOptions; + /** Disable fetching (useful for conditional queries). Defaults to true when address is undefined. */ + disabled?: boolean; + /** SWR configuration options (revalidation, caching, etc.). */ + swr?: UseSolanaRpcQueryOptions['swr']; +}>; + +/** + * Return type for the useClassifiedTransactions hook. + */ +export type UseClassifiedTransactionsReturnType = SolanaQueryResult & + Readonly<{ + /** Array of classified transactions, newest first. */ + transactions: ClassifiedTransaction[]; + /** Signature of the oldest transaction (use as `before` cursor for pagination). */ + oldestSignature: string | null; + /** Whether more transactions are available to fetch. */ + hasMore: boolean; + }>; + +/** + * Fetch and classify transactions for a wallet address. + * + * This hook integrates with the `tx-indexer` SDK to provide: + * - **Transaction classification** - Identifies transaction types (swap, transfer, stake, NFT, etc.) + * - **Protocol detection** - Recognizes interactions with known protocols (Jupiter, Raydium, etc.) + * - **Spam filtering** - Automatically filters out spam/dust transactions + * - **Token metadata** - Enriches transactions with token symbols and names + * - **Pagination** - Cursor-based pagination with `oldestSignature` and `hasMore` + * + * The hook automatically detects the cluster (mainnet-beta/devnet/testnet) from the RPC endpoint URL. + * + * @example Basic usage + * ```tsx + * function TransactionHistory({ address }: { address: string }) { + * const { transactions, isLoading, isError } = useClassifiedTransactions({ + * address, + * options: { limit: 10 }, + * }); + * + * if (isLoading) return
Loading...
; + * if (isError) return
Error loading transactions
; + * + * return ( + *
    + * {transactions.map((tx) => ( + *
  • + * {tx.classification.primaryType}: {tx.classification.primaryAmount?.amountUi} + * {tx.classification.primaryAmount?.token.symbol} + *
  • + * ))} + *
+ * ); + * } + * ``` + * + * @example Pagination with "Load More" + * ```tsx + * function PaginatedHistory({ address }: { address: string }) { + * const [cursor, setCursor] = useState(); + * + * const { transactions, oldestSignature, hasMore, isLoading } = useClassifiedTransactions({ + * address, + * options: { limit: 20, before: cursor }, + * }); + * + * return ( + *
+ * {transactions.map((tx) => ( + * + * ))} + * {hasMore && ( + * + * )} + *
+ * ); + * } + * ``` + * + * @example Rate-limited RPC configuration (e.g., public devnet) + * ```tsx + * // Conservative settings to avoid 429 errors on rate-limited RPCs + * const { transactions } = useClassifiedTransactions({ + * address, + * options: { + * limit: 5, + * overfetchMultiplier: 1, // Don't overfetch signatures + * transactionConcurrency: 1, // Fetch transactions sequentially + * minPageSize: 5, // Small page size + * }, + * swr: { + * revalidateOnFocus: false, // Disable auto-revalidation + * revalidateOnReconnect: false, + * }, + * }); + * ``` + * + * @example Include incoming token transfers + * ```tsx + * // By default, only the wallet's direct signatures are queried. + * // Enable includeTokenAccounts to also query token account (ATA) signatures, + * // which catches incoming token transfers that don't appear on the main wallet. + * const { transactions } = useClassifiedTransactions({ + * address, + * options: { + * includeTokenAccounts: true, // Query ATAs for incoming transfers + * maxTokenAccounts: 3, // Limit to 3 ATAs (reduces RPC calls) + * }, + * }); + * ``` + * + * @returns Object containing: + * - `transactions` - Array of classified transactions + * - `oldestSignature` - Cursor for pagination (pass as `before` to load more) + * - `hasMore` - Whether more transactions are available + * - `isLoading` - Loading state + * - `isError` - Error state + * - `error` - Error object if failed + * - `mutate` - SWR mutate function to refresh data + */ +export function useClassifiedTransactions( + params: UseClassifiedTransactionsParameters = {}, +): UseClassifiedTransactionsReturnType { + const { address, options = {}, disabled: disabledOption, swr } = params; + const client = useSolanaClient(); + const endpoint = useClientStore((state) => state.cluster.endpoint); + + const { + limit = 10, + before, + until, + cluster: clusterOverride, + filterSpam = true, + enrichNftMetadata = true, + enrichTokenMetadata = true, + includeTokenAccounts, + maxTokenAccounts, + overfetchMultiplier = 1, + minPageSize, + transactionConcurrency = 1, + } = options; + + const cluster = useMemo(() => clusterOverride ?? deriveClusterFromEndpoint(endpoint), [clusterOverride, endpoint]); + + const indexer = useMemo(() => { + return createIndexer({ + client: client.runtime, + cluster, + }); + }, [client.runtime, cluster]); + + const fetcher = useCallback( + async (_: SolanaClient): Promise => { + const resolvedAddress = address ? toAddress(address) : undefined; + if (!resolvedAddress) { + return { transactions: [], oldestSignature: null, hasMore: false }; + } + + const txOptions: GetTransactionsOptions = { + limit, + before, + until, + filterSpam, + enrichNftMetadata, + enrichTokenMetadata, + includeTokenAccounts, + maxTokenAccounts, + overfetchMultiplier, + minPageSize, + transactionConcurrency, + }; + + const transactions = await indexer.getTransactions(resolvedAddress, txOptions); + + const oldestSignature = + transactions.length > 0 ? String(transactions[transactions.length - 1].tx.signature) : null; + + const hasMore = transactions.length >= limit; + + return { transactions, oldestSignature, hasMore }; + }, + [ + address, + limit, + before, + until, + filterSpam, + enrichNftMetadata, + enrichTokenMetadata, + includeTokenAccounts, + maxTokenAccounts, + overfetchMultiplier, + minPageSize, + transactionConcurrency, + indexer, + ], + ); + + const disabled = disabledOption ?? !address; + const query = useSolanaRpcQuery( + 'classifiedTransactions', + [address, limit, before, until, filterSpam, enrichNftMetadata, enrichTokenMetadata, includeTokenAccounts], + fetcher, + { disabled, swr }, + ); + + return { + ...query, + transactions: query.data?.transactions ?? [], + oldestSignature: query.data?.oldestSignature ?? null, + hasMore: query.data?.hasMore ?? false, + }; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3535d5b..74aba4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -118,7 +118,7 @@ importers: version: 0.5.1 '@changesets/cli': specifier: ^2.29.7 - version: 2.29.7(@types/node@24.10.0) + version: 2.29.7(@types/node@25.0.9) '@size-limit/preset-small-lib': specifier: ^12.0.0 version: 12.0.0(size-limit@12.0.0(jiti@2.6.1)) @@ -136,7 +136,7 @@ importers: version: 14.6.1(@testing-library/dom@10.4.1) '@vitest/coverage-v8': specifier: ^4.0.7 - version: 4.0.7(vitest@4.0.7(@types/debug@4.1.12)(@types/node@24.10.0)(jiti@2.6.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.0.7(vitest@4.0.7(@types/debug@4.1.12)(@types/node@25.0.9)(jiti@2.6.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) bs58: specifier: ^6.0.0 version: 6.0.0 @@ -160,7 +160,7 @@ importers: version: 5.9.3 vitest: specifier: ^4.0.7 - version: 4.0.7(@types/debug@4.1.12)(@types/node@24.10.0)(jiti@2.6.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 4.0.7(@types/debug@4.1.12)(@types/node@25.0.9)(jiti@2.6.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) apps/docs: dependencies: @@ -187,7 +187,7 @@ importers: version: 16.4.4(@types/react@19.2.2)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5) fumadocs-mdx: specifier: ^14.2.4 - version: 14.2.4(@types/react@19.2.2)(fumadocs-core@16.4.4(@types/react@19.2.2)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@7.1.12(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 14.2.4(@types/react@19.2.2)(fumadocs-core@16.4.4(@types/react@19.2.2)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@7.1.12(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) fumadocs-ui: specifier: ^16.4.4 version: 16.4.4(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(tailwindcss@4.1.17)(zod@4.3.5) @@ -316,7 +316,7 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react-swc': specifier: ^4.2.0 - version: 4.2.0(@swc/helpers@0.5.17)(vite@7.1.12(@types/node@24.10.0)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 4.2.0(@swc/helpers@0.5.17)(vite@7.1.12(@types/node@25.0.9)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) autoprefixer: specifier: ^10.4.20 version: 10.4.21(postcss@8.5.6) @@ -334,7 +334,7 @@ importers: version: 5.9.3 vite: specifier: ^7.1.12 - version: 7.1.12(@types/node@24.10.0)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + version: 7.1.12(@types/node@25.0.9)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) packages/client: dependencies: @@ -441,6 +441,9 @@ importers: swr: specifier: ^2.3.6 version: 2.3.6(react@19.2.3) + tx-indexer: + specifier: ^1.4.0 + version: 1.4.0(@solana/kit@5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(typescript@5.9.3) zustand: specifier: catalog:utils version: 5.0.8(@types/react@19.2.2)(react@19.2.3)(use-sync-external-store@1.6.0(react@19.2.3)) @@ -549,95 +552,95 @@ packages: '@aws-crypto/util@5.2.0': resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} - '@aws-sdk/client-kms@3.968.0': - resolution: {integrity: sha512-p3MqkZ7DAkUpqo7YmTj1nl+ACyJrVfnW1gpyCoa7P1NLTkL2lda6VaqgiziAcFZsvTgHRQxKtZBa3edXZs7Ycg==} + '@aws-sdk/client-kms@3.972.0': + resolution: {integrity: sha512-bH4cN16Ipz0G3CJgSUmnYptqU6XlFg1iUNI+qmi4BlojLu77Z5EGXQHivDs4fYYR+AFYAg341JX3ivmVskwb0g==} engines: {node: '>=20.0.0'} - '@aws-sdk/client-sso@3.968.0': - resolution: {integrity: sha512-y+k23MvMzpn1WpeQ9sdEXg1Bbw7dfi0ZH2uwyBv78F/kz0mZOI+RJ1KJg8DgSD8XvdxB8gX5GQ8rzo0LnDothA==} + '@aws-sdk/client-sso@3.972.0': + resolution: {integrity: sha512-5qw6qLiRE4SUiz0hWy878dSR13tSVhbTWhsvFT8mGHe37NRRiaobm5MA2sWD0deRAuO98djSiV+dhWXa1xIFNw==} engines: {node: '>=20.0.0'} - '@aws-sdk/core@3.968.0': - resolution: {integrity: sha512-u4lIpvGqMMHZN523/RxW70xNoVXHBXucIWZsxFKc373E6TWYEb16ddFhXTELioS5TU93qkd/6yDQZzI6AAhbkw==} + '@aws-sdk/core@3.972.0': + resolution: {integrity: sha512-nEeUW2M9F+xdIaD98F5MBcQ4ITtykj3yKbgFZ6J0JtL3bq+Z90szQ6Yy8H/BLPYXTs3V4n9ifnBo8cprRDiE6A==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-env@3.968.0': - resolution: {integrity: sha512-G+zgXEniQxBHFtHo+0yImkYutvJZLvWqvkPUP8/cG+IaYg54OY7L/GPIAZJh0U3m0Uepao98NbL15zjM+uplqQ==} + '@aws-sdk/credential-provider-env@3.972.0': + resolution: {integrity: sha512-kKHoNv+maHlPQOAhYamhap0PObd16SAb3jwaY0KYgNTiSbeXlbGUZPLioo9oA3wU10zItJzx83ClU7d7h40luA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-http@3.968.0': - resolution: {integrity: sha512-79teHBx/EtsNRR3Bq8fQdmMHtUcYwvohm9EwXXFt2Jd3BEOBH872IjIlfKdAvdkM+jW1QeeWOZBAxXGPir7GcQ==} + '@aws-sdk/credential-provider-http@3.972.0': + resolution: {integrity: sha512-xzEi81L7I5jGUbpmqEHCe7zZr54hCABdj4H+3LzktHYuovV/oqnvoDdvZpGFR0e/KAw1+PL38NbGrpG30j6qlA==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-ini@3.968.0': - resolution: {integrity: sha512-9J9pcweoEN8yG7Qliux1zl9J3DT8X6OLcDN2RVXdTd5xzWBaYlupnUiJzoP6lvXdMnEmlDZaV7IMtoBdG7MY6g==} + '@aws-sdk/credential-provider-ini@3.972.0': + resolution: {integrity: sha512-ruhAMceUIq2aknFd3jhWxmO0P0Efab5efjyIXOkI9i80g+zDY5VekeSxfqRKStEEJSKSCHDLQuOu0BnAn4Rzew==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-login@3.968.0': - resolution: {integrity: sha512-YxBaR0IMuHPOVTG+73Ve0QfllweN+EdwBRnHFhUGnahMGAcTmcaRdotqwqWfiws+9ud44IFKjxXR3t8jaGpFnQ==} + '@aws-sdk/credential-provider-login@3.972.0': + resolution: {integrity: sha512-SsrsFJsEYAJHO4N/r2P0aK6o8si6f1lprR+Ej8J731XJqTckSGs/HFHcbxOyW/iKt+LNUvZa59/VlJmjhF4bEQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-node@3.968.0': - resolution: {integrity: sha512-wei6v0c9vDEam8pM5eWe9bt+5ixg8nL0q+DFPzI6iwdLUqmJsPoAzWPEyMkgp03iE02SS2fMqPWpmRjz/NVyUw==} + '@aws-sdk/credential-provider-node@3.972.0': + resolution: {integrity: sha512-wwJDpEGl6+sOygic8QKu0OHVB8SiodqF1fr5jvUlSFfS6tJss/E9vBc2aFjl7zI6KpAIYfIzIgM006lRrZtWCQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-process@3.968.0': - resolution: {integrity: sha512-my9M/ijRyEACoyeEWiC2sTVM3+eck5IWPGTPQrlYMKivy4LLlZchohtIopuqTom+JZzLZD508j1s9aDvl7BA0w==} + '@aws-sdk/credential-provider-process@3.972.0': + resolution: {integrity: sha512-nmzYhamLDJ8K+v3zWck79IaKMc350xZnWsf/GeaXO6E3MewSzd3lYkTiMi7lEp3/UwDm9NHfPguoPm+mhlSWQQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-sso@3.968.0': - resolution: {integrity: sha512-XPYPcxfWIt5jBbofoP2xhAHlFYos0dzwbHsoE18Cera/XnaCEbsUpdROo30t0Kjdbv0EWMYLMPDi9G+vPRDnhQ==} + '@aws-sdk/credential-provider-sso@3.972.0': + resolution: {integrity: sha512-6mYyfk1SrMZ15cH9T53yAF4YSnvq4yU1Xlgm3nqV1gZVQzmF5kr4t/F3BU3ygbvzi4uSwWxG3I3TYYS5eMlAyg==} engines: {node: '>=20.0.0'} - '@aws-sdk/credential-provider-web-identity@3.968.0': - resolution: {integrity: sha512-9HNAP6mx2jsBW4moWnRg5ycyZ0C1EbtMIegIHa93ga13B/8VZF9Y0iDnwW73yQYzCEt9UrDiFeRck/ChZup3rA==} + '@aws-sdk/credential-provider-web-identity@3.972.0': + resolution: {integrity: sha512-vsJXBGL8H54kz4T6do3p5elATj5d1izVGUXMluRJntm9/I0be/zUYtdd4oDTM2kSUmd4Zhyw3fMQ9lw7CVhd4A==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-host-header@3.968.0': - resolution: {integrity: sha512-ujlNT215VtE/2D2jEhFVcTuPPB36HJyLBM0ytnni/WPIjzq89iJrKR1tEhxpk8uct6A5NSQ6w9Y7g2Rw1rkSoQ==} + '@aws-sdk/middleware-host-header@3.972.0': + resolution: {integrity: sha512-3eztFI6F9/eHtkIaWKN3nT+PM+eQ6p1MALDuNshFk323ixuCZzOOVT8oUqtZa30Z6dycNXJwhlIq7NhUVFfimw==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-logger@3.968.0': - resolution: {integrity: sha512-zvhhEPZgvaRDxzf27m2WmgaXoN7upFt/gvG7ofBN5zCBlkh3JtFamMh5KWYVQwMhc4eQBK3NjH0oIUKZSVztag==} + '@aws-sdk/middleware-logger@3.972.0': + resolution: {integrity: sha512-ZvdyVRwzK+ra31v1pQrgbqR/KsLD+wwJjHgko6JfoKUBIcEfAwJzQKO6HspHxdHWTVUz6MgvwskheR/TTYZl2g==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-recursion-detection@3.968.0': - resolution: {integrity: sha512-KygPiwpSAPGobgodK/oLb7OLiwK29pNJeNtP+GZ9pxpceDRqhN0Ub8Eo84dBbWq+jbzAqBYHzy+B1VsbQ/hLWA==} + '@aws-sdk/middleware-recursion-detection@3.972.0': + resolution: {integrity: sha512-F2SmUeO+S6l1h6dydNet3BQIk173uAkcfU1HDkw/bUdRLAnh15D3HP9vCZ7oCPBNcdEICbXYDmx0BR9rRUHGlQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/middleware-user-agent@3.968.0': - resolution: {integrity: sha512-4h5/B8FyxMjLxtXd5jbM2R69aO57qQiHoAJQTtkpuxmM7vhvjSxEQtMM9L1kuMXoMVNE7xM4886h0+gbmmxplg==} + '@aws-sdk/middleware-user-agent@3.972.0': + resolution: {integrity: sha512-kFHQm2OCBJCzGWRafgdWHGFjitUXY/OxXngymcX4l8CiyiNDZB27HDDBg2yLj3OUJc4z4fexLMmP8r9vgag19g==} engines: {node: '>=20.0.0'} - '@aws-sdk/nested-clients@3.968.0': - resolution: {integrity: sha512-LLppm+8MzD3afD2IA/tYDp5AoVPOybK7MHQz5DVB4HsZ+fHvwYlvau2ZUK8nKwJSk5c1kWcxCZkyuJQjFu37ng==} + '@aws-sdk/nested-clients@3.972.0': + resolution: {integrity: sha512-QGlbnuGzSQJVG6bR9Qw6G0Blh6abFR4VxNa61ttMbzy9jt28xmk2iGtrYLrQPlCCPhY6enHqjTWm3n3LOb0wAw==} engines: {node: '>=20.0.0'} - '@aws-sdk/region-config-resolver@3.968.0': - resolution: {integrity: sha512-BzrCpxEsAHbi+yDGtgXJ+/5AvLPjfhcT6DlL+Fc4g13J5Z0VwiO95Wem+Q4KK7WDZH7/sZ/1WFvfitjLTKZbEw==} + '@aws-sdk/region-config-resolver@3.972.0': + resolution: {integrity: sha512-JyOf+R/6vJW8OEVFCAyzEOn2reri/Q+L0z9zx4JQSKWvTmJ1qeFO25sOm8VIfB8URKhfGRTQF30pfYaH2zxt/A==} engines: {node: '>=20.0.0'} - '@aws-sdk/token-providers@3.968.0': - resolution: {integrity: sha512-lXUZqB2qTFmZYNXPnVT0suSHGiuQAPrL2DhmhbjqOdR7+GKDHL5KbeKFvPisy7Y4neliJqT4Q1VPWa0nqYaiZg==} + '@aws-sdk/token-providers@3.972.0': + resolution: {integrity: sha512-kWlXG+y5nZhgXGEtb72Je+EvqepBPs8E3vZse//1PYLWs2speFqbGE/ywCXmzEJgHgVqSB/u/lqBvs5WlYmSqQ==} engines: {node: '>=20.0.0'} - '@aws-sdk/types@3.968.0': - resolution: {integrity: sha512-Wuumj/1cuiuXTMdHmvH88zbEl+5Pw++fOFQuMCF4yP0R+9k1lwX8rVst+oy99xaxtdluJZXrsccoZoA67ST1Ow==} + '@aws-sdk/types@3.972.0': + resolution: {integrity: sha512-U7xBIbLSetONxb2bNzHyDgND3oKGoIfmknrEVnoEU4GUSs+0augUOIn9DIWGUO2ETcRFdsRUnmx9KhPT9Ojbug==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-endpoints@3.968.0': - resolution: {integrity: sha512-9IdilgylS0crFSeI59vtr8qhDYMYYOvnvkl1dLp59+EmLH1IdXz7+4cR5oh5PkoqD7DRzc5Uzm2GnZhK6I0oVQ==} + '@aws-sdk/util-endpoints@3.972.0': + resolution: {integrity: sha512-6JHsl1V/a1ZW8D8AFfd4R52fwZPnZ5H4U6DS8m/bWT8qad72NvbOFAC7U2cDtFs2TShqUO3TEiX/EJibtY3ijg==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-locate-window@3.965.2': - resolution: {integrity: sha512-qKgO7wAYsXzhwCHhdbaKFyxd83Fgs8/1Ka+jjSPrv2Ll7mB55Wbwlo0kkfMLh993/yEc8aoDIAc1Fz9h4Spi4Q==} + '@aws-sdk/util-locate-window@3.965.3': + resolution: {integrity: sha512-FNUqAjlKAGA7GM05kywE99q8wiPHPZqrzhq3wXRga6PRD6A0kzT85Pb0AzYBVTBRpSrKyyr6M92Y6bnSBVp2BA==} engines: {node: '>=20.0.0'} - '@aws-sdk/util-user-agent-browser@3.968.0': - resolution: {integrity: sha512-nRxjs8Jpq8ZHFsa/0uiww2f4+40D6Dt6bQmepAJHIE/D+atwPINDKsfamCjFnxrjKU3WBWpGYEf/QDO0XZsFMw==} + '@aws-sdk/util-user-agent-browser@3.972.0': + resolution: {integrity: sha512-eOLdkQyoRbDgioTS3Orr7iVsVEutJyMZxvyZ6WAF95IrF0kfWx5Rd/KXnfbnG/VKa2CvjZiitWfouLzfVEyvJA==} - '@aws-sdk/util-user-agent-node@3.968.0': - resolution: {integrity: sha512-oaIkPGraGhZgkDmxVhTIlakaUNWKO9aMN+uB6I+eS26MWi/lpMK66HTZeXEnaTrmt5/kl99YC0N37zScz58Tdg==} + '@aws-sdk/util-user-agent-node@3.972.0': + resolution: {integrity: sha512-GOy+AiSrE9kGiojiwlZvVVSXwylu4+fmP0MJfvras/MwP09RB/YtQuOVR1E0fKQc6OMwaTNBjgAbOEhxuWFbAw==} engines: {node: '>=20.0.0'} peerDependencies: aws-crt: '>=1.0.0' @@ -645,8 +648,8 @@ packages: aws-crt: optional: true - '@aws-sdk/xml-builder@3.968.0': - resolution: {integrity: sha512-bZQKn41ebPh/uW9uWUE5oLuaBr44Gt78dkw2amu5zcwo1J/d8s6FdzZcRDmz0rHE2NHJWYkdQYeVQo7jhMziqA==} + '@aws-sdk/xml-builder@3.972.0': + resolution: {integrity: sha512-POaGMcXnozzqBUyJM3HLUZ9GR6OKJWPGJEmhtTnxZXt8B6JcJ/6K3xRJ5H/j8oovVLz8Wg6vFxAHv8lvuASxMg==} engines: {node: '>=20.0.0'} '@aws/lambda-invoke-store@0.2.3': @@ -800,6 +803,10 @@ packages: resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + '@babel/template@7.28.6': resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} engines: {node: '>=6.9.0'} @@ -2399,8 +2406,8 @@ packages: resolution: {integrity: sha512-qJpzYC64kaj3S0fueiu3kXm8xPrR3PcXDPEgnaNMRn0EjNSZFoFjvbUp0YUDsRhN1CB90EnHJtbxWKevnH99UQ==} engines: {node: '>=18.0.0'} - '@smithy/core@3.20.5': - resolution: {integrity: sha512-0Tz77Td8ynHaowXfOdrD0F1IH4tgWGUhwmLwmpFyTbr+U9WHXNNp9u/k2VjBXGnSe7BwjBERRpXsokGTXzNjhA==} + '@smithy/core@3.21.0': + resolution: {integrity: sha512-bg2TfzgsERyETAxc/Ims/eJX8eAnIeTi4r4LHpMpfF/2NyO6RsWis0rjKcCPaGksljmOb23BZRiCeT/3NvwkXw==} engines: {node: '>=18.0.0'} '@smithy/credential-provider-imds@4.2.8': @@ -2431,12 +2438,12 @@ packages: resolution: {integrity: sha512-RO0jeoaYAB1qBRhfVyq0pMgBoUK34YEJxVxyjOWYZiOKOq2yMZ4MnVXMZCUDenpozHue207+9P5ilTV1zeda0A==} engines: {node: '>=18.0.0'} - '@smithy/middleware-endpoint@4.4.6': - resolution: {integrity: sha512-dpq3bHqbEOBqGBjRVHVFP3eUSPpX0BYtg1D5d5Irgk6orGGAuZfY22rC4sErhg+ZfY/Y0kPqm1XpAmDZg7DeuA==} + '@smithy/middleware-endpoint@4.4.10': + resolution: {integrity: sha512-kwWpNltpxrvPabnjEFvwSmA+66l6s2ReCvgVSzW/z92LU4T28fTdgZ18IdYRYOrisu2NMQ0jUndRScbO65A/zg==} engines: {node: '>=18.0.0'} - '@smithy/middleware-retry@4.4.22': - resolution: {integrity: sha512-vwWDMaObSMjw6WCC/3Ae9G7uul5Sk95jr07CDk1gkIMpaDic0phPS1MpVAZ6+YkF7PAzRlpsDjxPwRlh/S11FQ==} + '@smithy/middleware-retry@4.4.26': + resolution: {integrity: sha512-ozZMoTAr+B2aVYfLYfkssFvc8ZV3p/vLpVQ7/k277xxUOA9ykSPe5obL2j6yHfbdrM/SZV7qj0uk/hSqavHrLw==} engines: {node: '>=18.0.0'} '@smithy/middleware-serde@4.2.9': @@ -2483,8 +2490,8 @@ packages: resolution: {integrity: sha512-6A4vdGj7qKNRF16UIcO8HhHjKW27thsxYci+5r/uVRkdcBEkOEiY8OMPuydLX4QHSrJqGHPJzPRwwVTqbLZJhg==} engines: {node: '>=18.0.0'} - '@smithy/smithy-client@4.10.7': - resolution: {integrity: sha512-Uznt0I9z3os3Z+8pbXrOSCTXCA6vrjyN7Ub+8l2pRDum44vLv8qw0qGVkJN0/tZBZotaEFHrDPKUoPNueTr5Vg==} + '@smithy/smithy-client@4.10.11': + resolution: {integrity: sha512-6o804SCyHGMXAb5mFJ+iTy9kVKv7F91a9szN0J+9X6p8A0NrdpUxdaC57aye2ipQkP2C4IAqETEpGZ0Zj77Haw==} engines: {node: '>=18.0.0'} '@smithy/types@4.12.0': @@ -2519,12 +2526,12 @@ packages: resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-browser@4.3.21': - resolution: {integrity: sha512-DtmVJarzqtjghtGjCw/PFJolcJkP7GkZgy+hWTAN3YLXNH+IC82uMoMhFoC3ZtIz5mOgCm5+hOGi1wfhVYgrxw==} + '@smithy/util-defaults-mode-browser@4.3.25': + resolution: {integrity: sha512-8ugoNMtss2dJHsXnqsibGPqoaafvWJPACmYKxJ4E6QWaDrixsAemmiMMAVbvwYadjR0H9G2+AlzsInSzRi8PSw==} engines: {node: '>=18.0.0'} - '@smithy/util-defaults-mode-node@4.2.24': - resolution: {integrity: sha512-JelBDKPAVswVY666rezBvY6b0nF/v9TXjUbNwDNAyme7qqKYEX687wJv0uze8lBIZVbg30wlWnlYfVSjjpKYFA==} + '@smithy/util-defaults-mode-node@4.2.28': + resolution: {integrity: sha512-mjUdcP8h3E0K/XvNMi9oBXRV3DMCzeRiYIieZ1LQ7jq5tu6GH/GTWym7a1xIIE0pKSoLcpGsaImuQhGPSIJzAA==} engines: {node: '>=18.0.0'} '@smithy/util-endpoints@3.2.8': @@ -2615,12 +2622,30 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/addresses@5.4.0': + resolution: {integrity: sha512-YRHiH30S8qDV4bZ+mtEk589PGfBuXHzD/fK2Z+YI5f/+s+yi/5le/fVw7PN6LxnnmVQKiRCDUiNF+WmFFKi6QQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/assertions@5.0.0': resolution: {integrity: sha512-2kIykk90kYciQW6bp+KaE6jRd1Y2CgHPeJxxlc5chQnjhoG6eiD8VXvocs6AvqPTht0p/SoEj9jH5tT4oG/bcg==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/assertions@5.4.0': + resolution: {integrity: sha512-8EP7mkdnrPc9y67FqWeAPzdWq2qAOkxsuo+ZBIXNWtIixDtXIdHrgjZ/wqbWxLgSTtXEfBCjpZU55Xw2Qfbwyg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/buffer-layout@4.0.1': resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} engines: {node: '>=5.10'} @@ -2643,12 +2668,30 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/codecs-core@5.4.0': + resolution: {integrity: sha512-rQ5jXgiDe2vIU+mYCHDjgwMd9WdzZfh4sc5H6JgYleAUjeTUX6mx8hTV2+pcXvvn27LPrgrt9jfxswbDb8O8ww==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/codecs-data-structures@5.0.0': resolution: {integrity: sha512-y503Pqmv0LHcfcf0vQJGaxDvydQJbyCo8nK3nxn56EhFj5lBQ1NWb3WvTd83epigwuZurW2MhJARrpikfhQglQ==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/codecs-data-structures@5.4.0': + resolution: {integrity: sha512-LVssbdQ1GfY6upnxW3mufYsNfvTWKnHNk5Hx2gHuOYJhm3HZlp+Y8zvuoY65G1d1xAXkPz5YVGxaSeVIRWLGWg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/codecs-numbers@2.3.0': resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} engines: {node: '>=20.18.0'} @@ -2667,6 +2710,15 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/codecs-numbers@5.4.0': + resolution: {integrity: sha512-z6LMkY+kXWx1alrvIDSAxexY5QLhsso638CjM7XI1u6dB7drTLWKhifyjnm1vOQc1VPVFmbYxTgKKpds8TY8tg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/codecs-strings@4.0.0': resolution: {integrity: sha512-XvyD+sQ1zyA0amfxbpoFZsucLoe+yASQtDiLUGMDg5TZ82IHE3B7n82jE8d8cTAqi0HgqQiwU13snPhvg1O0Ow==} engines: {node: '>=20.18.0'} @@ -2681,6 +2733,18 @@ packages: fastestsmallesttextencoderdecoder: ^1.0.22 typescript: '>=5.3.3' + '@solana/codecs-strings@5.4.0': + resolution: {integrity: sha512-w0trrjfQDhkCVz7O1GTmHBk9m+MkljKx2uNBbQAD3/yW2Qn9dYiTrZ1/jDVq0/+lPPAUkbT3s3Yo7HUZ2QFmHw==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: ^5.0.0 + peerDependenciesMeta: + fastestsmallesttextencoderdecoder: + optional: true + typescript: + optional: true + '@solana/codecs@5.0.0': resolution: {integrity: sha512-KOw0gFUSBxIMDWLJ3AkVFkEci91dw0Rpx3C6y83Our7fSW+SEP8vRZklCElieYR85LHVB1QIEhoeHR7rc+Ifkw==} engines: {node: '>=20.18.0'} @@ -2743,6 +2807,16 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/errors@5.4.0': + resolution: {integrity: sha512-hNoAOmlZAszaVBrAy1Jf7amHJ8wnUnTU0BqhNQXknbSvirvsYr81yEud2iq18YiCqhyJ9SuQ5kWrSAT0x7S0oA==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/fast-stable-stringify@5.0.0': resolution: {integrity: sha512-sGTbu7a4/olL+8EIOOJ7IZjzqOOpCJcK1UaVJ6015sRgo9vwGf4jg9KtXEYv5LVhLCTYmAb50L4BaIUcBph/Ig==} engines: {node: '>=20.18.0'} @@ -2755,6 +2829,15 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/functional@5.4.0': + resolution: {integrity: sha512-32ghHO0bg6GgX/7++0/7Lps6RgeXD2gKF1okiuyEGuVfKENIapgaQdcGhUwb3q6D6fv6MRAVn/Yve4jopGVNMQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/instruction-plans@5.0.0': resolution: {integrity: sha512-n9oFOMFUPYKEhsXzrXT97QBQ2WvOTar+5SFEj/IOtRuCn4gl2kh0369cjXZpFwUdE3tmKr1zfYFNwbtiNx5pvg==} engines: {node: '>=20.18.0'} @@ -2767,6 +2850,15 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/instructions@5.4.0': + resolution: {integrity: sha512-//a7jpHbNoAgTqy3YyqG1X6QhItJLKzJa6zuYJGCwaAAJye7BxS9pxJBgb2mUt7CGidhUksf+U8pmLlxCNWYyg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/keychain-aws-kms@0.2.1': resolution: {integrity: sha512-nKbpxRSE+zu+y8ZywJGAbwjxbjtLzbQR35Q5wQ1HWTvM4ZCfLzVqlkX8GYFT3eeWCi+JX4VXJdHfOFofl9D/GA==} @@ -2785,6 +2877,15 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/keys@5.4.0': + resolution: {integrity: sha512-zQVbAwdoXorgXjlhlVTZaymFG6N8n1zn2NT+xI6S8HtbrKIB/42xPdXFh+zIihGzRw+9k8jzU7Axki/IPm6qWQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/kit@5.0.0': resolution: {integrity: sha512-3ahtzmmMgU+1l2YMhQJSKKm14IdvCycOE/m4XNMu/4icBIptmBgZxrmgRpPHqBilBa+Krp/hBuTg4HWl9IAgWw==} engines: {node: '>=20.18.0'} @@ -2797,6 +2898,24 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/nominal-types@5.4.0': + resolution: {integrity: sha512-h4dTRQwTerzksE5B1WmObN6TvLo8dYUd7kpUUynGd8WJjK0zz3zkDhq0MkA3aF6A1C2C82BSGqSsN9EN0E6Exg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + '@solana/offchain-messages@5.4.0': + resolution: {integrity: sha512-DjdlYJCcKfgh4dkdk+owH1bP+Q4BRqCs55mgWWp9PTwm/HHy/a5vcMtCi1GyIQXfhtNNvKBLbXrUE0Fxej8qlg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/options@5.0.0': resolution: {integrity: sha512-ezHVBFb9FXVSn8LUVRD2tLb6fejU0x8KtGEYyCYh0J0pQuXSITV0IQCjcEopvu/ZxWdXOJyzjvmymnhz90on5A==} engines: {node: '>=20.18.0'} @@ -2882,6 +3001,15 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/rpc-types@5.4.0': + resolution: {integrity: sha512-+C4N4/5AYzBdt3Y2yzkScknScy/jTx6wfvuJIY9XjOXtdDyZ8TmrnMwdPMTZPGLdLuHplJwlwy1acu/4hqmrBQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/rpc@5.0.0': resolution: {integrity: sha512-Myx/ZBmMHkgh9Di3tLzc+vd30f+6YC1JXr9+YmIHKEeqN/+iTHkDJU2E/hGRLy8vTOBOU7+2466A+dLnSVuGkg==} engines: {node: '>=20.18.0'} @@ -2894,6 +3022,15 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/signers@5.4.0': + resolution: {integrity: sha512-s+fZxpi6UPr6XNk2pH/R84WjNRoSktrgG8AGNfsj/V8MJ++eKX7hhIf4JsHZtnnQXXrHmS3ozB2oHlc8yEJvCQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/subscribable@5.0.0': resolution: {integrity: sha512-C2TydIRRd5XUJ8asbARi67Sj/3DRLubWalnNoafBhDsrb88jsRVylntvwXgBw/+lwJdEPEsUnxvcdgdm+3lFlw==} engines: {node: '>=20.18.0'} @@ -2918,12 +3055,30 @@ packages: peerDependencies: typescript: '>=5.3.3' + '@solana/transaction-messages@5.4.0': + resolution: {integrity: sha512-qd/3kZDaPiHM0amhn3vXnupfcsFTVz6CYuHXvq9HFv/fq32+5Kp1FMLnmHwoSxQxdTMDghPdOhC4vhNhuWmuVQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/transactions@5.0.0': resolution: {integrity: sha512-4TcsqH7JtgRKGGBIRRGz0n+tXu4h5TPPC49kkV0ygIndQaHW7FOZUYTwQ0epq0A5h9KYi+ClNbzF9xiuDbAD5Q==} engines: {node: '>=20.18.0'} peerDependencies: typescript: '>=5.3.3' + '@solana/transactions@5.4.0': + resolution: {integrity: sha512-OuY4M4x/xna8KZQIrz8tSrI9EEul9Od97XejqFmGGkEjbRsUOfJW8705TveTW8jU3bd5RGecFYscPgS2F+m7jQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + '@solana/wallet-adapter-base@0.9.27': resolution: {integrity: sha512-kXjeNfNFVs/NE9GPmysBRKQ/nf+foSaq3kfVSeMcO/iVgigyRmB551OjU3WyAolLG/1jeEfKLqF9fKwMCRkUqg==} engines: {node: '>=20'} @@ -3250,6 +3405,9 @@ packages: '@types/node@24.10.0': resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} + '@types/node@25.0.9': + resolution: {integrity: sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw==} + '@types/react-dom@19.2.2': resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} peerDependencies: @@ -3544,6 +3702,10 @@ packages: resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} hasBin: true + baseline-browser-mapping@2.9.17: + resolution: {integrity: sha512-agD0MgJFUP/4nvjqzIB29zRPUuCF7Ge6mEv9s8dHrtYD7QWXRcx75rOADE/d5ah1NI+0vkDl0yorDd5U852IQQ==} + hasBin: true + better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} @@ -3576,6 +3738,11 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + browserslist@4.28.1: + resolution: {integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + bs58@4.0.1: resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} @@ -3637,6 +3804,9 @@ packages: caniuse-lite@1.0.30001759: resolution: {integrity: sha512-Pzfx9fOKoKvevQf8oCXoyNRQ5QyxJj+3O0Rqx2V5oxT61KGx8+n6hV/IUyJeifUci2clnmmKVpvtiqRzgiWjSw==} + caniuse-lite@1.0.30001765: + resolution: {integrity: sha512-LWcNtSyZrakjECqmpP4qdg0MMGdN368D7X8XvvAqOcqMv0RxnlqVKZl2V6/mBR68oYMxOZPLw/gO7DuisMHUvQ==} + ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} @@ -3740,6 +3910,10 @@ packages: resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} engines: {node: '>=20'} + commander@14.0.2: + resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} + engines: {node: '>=20'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3904,6 +4078,9 @@ packages: electron-to-chromium@1.5.245: resolution: {integrity: sha512-rdmGfW47ZhL/oWEJAY4qxRtdly2B98ooTJ0pdEI4jhVLZ6tNf8fPtov2wS1IRKwFJT92le3x4Knxiwzl7cPPpQ==} + electron-to-chromium@1.5.267: + resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} + emoji-regex-xs@2.0.1: resolution: {integrity: sha512-1QFuh8l7LqUcKe24LsPUNzjrzJQ7pgRwp1QMcZ5MX6mFplk2zQ08NVCM84++1cveaUUYtcCYHmeFEuNg16sU4g==} engines: {node: '>=10.0.0'} @@ -5841,8 +6018,8 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - terser@5.44.1: - resolution: {integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw==} + terser@5.46.0: + resolution: {integrity: sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==} engines: {node: '>=10'} hasBin: true @@ -5983,6 +6160,12 @@ packages: resolution: {integrity: sha512-kC5VJqOXo50k0/0jnJDDjibLAXalqT9j7PQ56so0pN+81VR4Fwb2QgIE9dTzT3phqOTQuEXkPh3sCpnv5Isz2g==} hasBin: true + tx-indexer@1.4.0: + resolution: {integrity: sha512-rcqrKexjb1miCnCFCsBzxt7rl6b9XfE5wFVtUMWuBlhrgheru7joWYnZfZz+9icKJohF0UyvBrsLOziC0teNAw==} + peerDependencies: + '@solana/kit': ^5.0.0 + typescript: ^5 + type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -6066,6 +6249,12 @@ packages: peerDependencies: browserslist: '>= 4.21.0' + update-browserslist-db@1.2.3: + resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -6367,15 +6556,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.968.0 - '@aws-sdk/util-locate-window': 3.965.2 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-locate-window': 3.965.3 '@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.968.0 + '@aws-sdk/types': 3.972.0 tslib: 2.8.1 '@aws-crypto/supports-web-crypto@5.2.0': @@ -6384,46 +6573,46 @@ snapshots: '@aws-crypto/util@5.2.0': dependencies: - '@aws-sdk/types': 3.968.0 + '@aws-sdk/types': 3.972.0 '@smithy/util-utf8': 2.3.0 tslib: 2.8.1 - '@aws-sdk/client-kms@3.968.0': + '@aws-sdk/client-kms@3.972.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.968.0 - '@aws-sdk/credential-provider-node': 3.968.0 - '@aws-sdk/middleware-host-header': 3.968.0 - '@aws-sdk/middleware-logger': 3.968.0 - '@aws-sdk/middleware-recursion-detection': 3.968.0 - '@aws-sdk/middleware-user-agent': 3.968.0 - '@aws-sdk/region-config-resolver': 3.968.0 - '@aws-sdk/types': 3.968.0 - '@aws-sdk/util-endpoints': 3.968.0 - '@aws-sdk/util-user-agent-browser': 3.968.0 - '@aws-sdk/util-user-agent-node': 3.968.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/credential-provider-node': 3.972.0 + '@aws-sdk/middleware-host-header': 3.972.0 + '@aws-sdk/middleware-logger': 3.972.0 + '@aws-sdk/middleware-recursion-detection': 3.972.0 + '@aws-sdk/middleware-user-agent': 3.972.0 + '@aws-sdk/region-config-resolver': 3.972.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-endpoints': 3.972.0 + '@aws-sdk/util-user-agent-browser': 3.972.0 + '@aws-sdk/util-user-agent-node': 3.972.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.20.5 + '@smithy/core': 3.21.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.6 - '@smithy/middleware-retry': 4.4.22 + '@smithy/middleware-endpoint': 4.4.10 + '@smithy/middleware-retry': 4.4.26 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.21 - '@smithy/util-defaults-mode-node': 4.2.24 + '@smithy/util-defaults-mode-browser': 4.3.25 + '@smithy/util-defaults-mode-node': 4.2.28 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -6432,41 +6621,41 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/client-sso@3.968.0': + '@aws-sdk/client-sso@3.972.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.968.0 - '@aws-sdk/middleware-host-header': 3.968.0 - '@aws-sdk/middleware-logger': 3.968.0 - '@aws-sdk/middleware-recursion-detection': 3.968.0 - '@aws-sdk/middleware-user-agent': 3.968.0 - '@aws-sdk/region-config-resolver': 3.968.0 - '@aws-sdk/types': 3.968.0 - '@aws-sdk/util-endpoints': 3.968.0 - '@aws-sdk/util-user-agent-browser': 3.968.0 - '@aws-sdk/util-user-agent-node': 3.968.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/middleware-host-header': 3.972.0 + '@aws-sdk/middleware-logger': 3.972.0 + '@aws-sdk/middleware-recursion-detection': 3.972.0 + '@aws-sdk/middleware-user-agent': 3.972.0 + '@aws-sdk/region-config-resolver': 3.972.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-endpoints': 3.972.0 + '@aws-sdk/util-user-agent-browser': 3.972.0 + '@aws-sdk/util-user-agent-node': 3.972.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.20.5 + '@smithy/core': 3.21.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.6 - '@smithy/middleware-retry': 4.4.22 + '@smithy/middleware-endpoint': 4.4.10 + '@smithy/middleware-retry': 4.4.26 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.21 - '@smithy/util-defaults-mode-node': 4.2.24 + '@smithy/util-defaults-mode-browser': 4.3.25 + '@smithy/util-defaults-mode-node': 4.2.28 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -6475,54 +6664,54 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/core@3.968.0': + '@aws-sdk/core@3.972.0': dependencies: - '@aws-sdk/types': 3.968.0 - '@aws-sdk/xml-builder': 3.968.0 - '@smithy/core': 3.20.5 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/xml-builder': 3.972.0 + '@smithy/core': 3.21.0 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/signature-v4': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/util-base64': 4.3.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-env@3.968.0': + '@aws-sdk/credential-provider-env@3.972.0': dependencies: - '@aws-sdk/core': 3.968.0 - '@aws-sdk/types': 3.968.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/property-provider': 4.2.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-http@3.968.0': + '@aws-sdk/credential-provider-http@3.972.0': dependencies: - '@aws-sdk/core': 3.968.0 - '@aws-sdk/types': 3.968.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/node-http-handler': 4.4.8 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/util-stream': 4.5.10 tslib: 2.8.1 - '@aws-sdk/credential-provider-ini@3.968.0': - dependencies: - '@aws-sdk/core': 3.968.0 - '@aws-sdk/credential-provider-env': 3.968.0 - '@aws-sdk/credential-provider-http': 3.968.0 - '@aws-sdk/credential-provider-login': 3.968.0 - '@aws-sdk/credential-provider-process': 3.968.0 - '@aws-sdk/credential-provider-sso': 3.968.0 - '@aws-sdk/credential-provider-web-identity': 3.968.0 - '@aws-sdk/nested-clients': 3.968.0 - '@aws-sdk/types': 3.968.0 + '@aws-sdk/credential-provider-ini@3.972.0': + dependencies: + '@aws-sdk/core': 3.972.0 + '@aws-sdk/credential-provider-env': 3.972.0 + '@aws-sdk/credential-provider-http': 3.972.0 + '@aws-sdk/credential-provider-login': 3.972.0 + '@aws-sdk/credential-provider-process': 3.972.0 + '@aws-sdk/credential-provider-sso': 3.972.0 + '@aws-sdk/credential-provider-web-identity': 3.972.0 + '@aws-sdk/nested-clients': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -6531,11 +6720,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-login@3.968.0': + '@aws-sdk/credential-provider-login@3.972.0': dependencies: - '@aws-sdk/core': 3.968.0 - '@aws-sdk/nested-clients': 3.968.0 - '@aws-sdk/types': 3.968.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/nested-clients': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/property-provider': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -6544,15 +6733,15 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-node@3.968.0': + '@aws-sdk/credential-provider-node@3.972.0': dependencies: - '@aws-sdk/credential-provider-env': 3.968.0 - '@aws-sdk/credential-provider-http': 3.968.0 - '@aws-sdk/credential-provider-ini': 3.968.0 - '@aws-sdk/credential-provider-process': 3.968.0 - '@aws-sdk/credential-provider-sso': 3.968.0 - '@aws-sdk/credential-provider-web-identity': 3.968.0 - '@aws-sdk/types': 3.968.0 + '@aws-sdk/credential-provider-env': 3.972.0 + '@aws-sdk/credential-provider-http': 3.972.0 + '@aws-sdk/credential-provider-ini': 3.972.0 + '@aws-sdk/credential-provider-process': 3.972.0 + '@aws-sdk/credential-provider-sso': 3.972.0 + '@aws-sdk/credential-provider-web-identity': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/credential-provider-imds': 4.2.8 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -6561,21 +6750,21 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-process@3.968.0': + '@aws-sdk/credential-provider-process@3.972.0': dependencies: - '@aws-sdk/core': 3.968.0 - '@aws-sdk/types': 3.968.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/credential-provider-sso@3.968.0': + '@aws-sdk/credential-provider-sso@3.972.0': dependencies: - '@aws-sdk/client-sso': 3.968.0 - '@aws-sdk/core': 3.968.0 - '@aws-sdk/token-providers': 3.968.0 - '@aws-sdk/types': 3.968.0 + '@aws-sdk/client-sso': 3.972.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/token-providers': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 @@ -6583,11 +6772,11 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/credential-provider-web-identity@3.968.0': + '@aws-sdk/credential-provider-web-identity@3.972.0': dependencies: - '@aws-sdk/core': 3.968.0 - '@aws-sdk/nested-clients': 3.968.0 - '@aws-sdk/types': 3.968.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/nested-clients': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 @@ -6595,72 +6784,72 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/middleware-host-header@3.968.0': + '@aws-sdk/middleware-host-header@3.972.0': dependencies: - '@aws-sdk/types': 3.968.0 + '@aws-sdk/types': 3.972.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-logger@3.968.0': + '@aws-sdk/middleware-logger@3.972.0': dependencies: - '@aws-sdk/types': 3.968.0 + '@aws-sdk/types': 3.972.0 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-recursion-detection@3.968.0': + '@aws-sdk/middleware-recursion-detection@3.972.0': dependencies: - '@aws-sdk/types': 3.968.0 + '@aws-sdk/types': 3.972.0 '@aws/lambda-invoke-store': 0.2.3 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/middleware-user-agent@3.968.0': + '@aws-sdk/middleware-user-agent@3.972.0': dependencies: - '@aws-sdk/core': 3.968.0 - '@aws-sdk/types': 3.968.0 - '@aws-sdk/util-endpoints': 3.968.0 - '@smithy/core': 3.20.5 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-endpoints': 3.972.0 + '@smithy/core': 3.21.0 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/nested-clients@3.968.0': + '@aws-sdk/nested-clients@3.972.0': dependencies: '@aws-crypto/sha256-browser': 5.2.0 '@aws-crypto/sha256-js': 5.2.0 - '@aws-sdk/core': 3.968.0 - '@aws-sdk/middleware-host-header': 3.968.0 - '@aws-sdk/middleware-logger': 3.968.0 - '@aws-sdk/middleware-recursion-detection': 3.968.0 - '@aws-sdk/middleware-user-agent': 3.968.0 - '@aws-sdk/region-config-resolver': 3.968.0 - '@aws-sdk/types': 3.968.0 - '@aws-sdk/util-endpoints': 3.968.0 - '@aws-sdk/util-user-agent-browser': 3.968.0 - '@aws-sdk/util-user-agent-node': 3.968.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/middleware-host-header': 3.972.0 + '@aws-sdk/middleware-logger': 3.972.0 + '@aws-sdk/middleware-recursion-detection': 3.972.0 + '@aws-sdk/middleware-user-agent': 3.972.0 + '@aws-sdk/region-config-resolver': 3.972.0 + '@aws-sdk/types': 3.972.0 + '@aws-sdk/util-endpoints': 3.972.0 + '@aws-sdk/util-user-agent-browser': 3.972.0 + '@aws-sdk/util-user-agent-node': 3.972.0 '@smithy/config-resolver': 4.4.6 - '@smithy/core': 3.20.5 + '@smithy/core': 3.21.0 '@smithy/fetch-http-handler': 5.3.9 '@smithy/hash-node': 4.2.8 '@smithy/invalid-dependency': 4.2.8 '@smithy/middleware-content-length': 4.2.8 - '@smithy/middleware-endpoint': 4.4.6 - '@smithy/middleware-retry': 4.4.22 + '@smithy/middleware-endpoint': 4.4.10 + '@smithy/middleware-retry': 4.4.26 '@smithy/middleware-serde': 4.2.9 '@smithy/middleware-stack': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/node-http-handler': 4.4.8 '@smithy/protocol-http': 5.3.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-base64': 4.3.0 '@smithy/util-body-length-browser': 4.2.0 '@smithy/util-body-length-node': 4.2.1 - '@smithy/util-defaults-mode-browser': 4.3.21 - '@smithy/util-defaults-mode-node': 4.2.24 + '@smithy/util-defaults-mode-browser': 4.3.25 + '@smithy/util-defaults-mode-node': 4.2.28 '@smithy/util-endpoints': 3.2.8 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -6669,19 +6858,19 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/region-config-resolver@3.968.0': + '@aws-sdk/region-config-resolver@3.972.0': dependencies: - '@aws-sdk/types': 3.968.0 + '@aws-sdk/types': 3.972.0 '@smithy/config-resolver': 4.4.6 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/token-providers@3.968.0': + '@aws-sdk/token-providers@3.972.0': dependencies: - '@aws-sdk/core': 3.968.0 - '@aws-sdk/nested-clients': 3.968.0 - '@aws-sdk/types': 3.968.0 + '@aws-sdk/core': 3.972.0 + '@aws-sdk/nested-clients': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/property-provider': 4.2.8 '@smithy/shared-ini-file-loader': 4.4.3 '@smithy/types': 4.12.0 @@ -6689,39 +6878,39 @@ snapshots: transitivePeerDependencies: - aws-crt - '@aws-sdk/types@3.968.0': + '@aws-sdk/types@3.972.0': dependencies: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/util-endpoints@3.968.0': + '@aws-sdk/util-endpoints@3.972.0': dependencies: - '@aws-sdk/types': 3.968.0 + '@aws-sdk/types': 3.972.0 '@smithy/types': 4.12.0 '@smithy/url-parser': 4.2.8 '@smithy/util-endpoints': 3.2.8 tslib: 2.8.1 - '@aws-sdk/util-locate-window@3.965.2': + '@aws-sdk/util-locate-window@3.965.3': dependencies: tslib: 2.8.1 - '@aws-sdk/util-user-agent-browser@3.968.0': + '@aws-sdk/util-user-agent-browser@3.972.0': dependencies: - '@aws-sdk/types': 3.968.0 + '@aws-sdk/types': 3.972.0 '@smithy/types': 4.12.0 bowser: 2.13.1 tslib: 2.8.1 - '@aws-sdk/util-user-agent-node@3.968.0': + '@aws-sdk/util-user-agent-node@3.972.0': dependencies: - '@aws-sdk/middleware-user-agent': 3.968.0 - '@aws-sdk/types': 3.968.0 + '@aws-sdk/middleware-user-agent': 3.972.0 + '@aws-sdk/types': 3.972.0 '@smithy/node-config-provider': 4.3.8 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@aws-sdk/xml-builder@3.968.0': + '@aws-sdk/xml-builder@3.972.0': dependencies: '@smithy/types': 4.12.0 fast-xml-parser: 5.2.5 @@ -6769,7 +6958,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.6 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.27.0 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 @@ -6889,6 +7078,8 @@ snapshots: '@babel/runtime@7.28.4': {} + '@babel/runtime@7.28.6': {} + '@babel/template@7.28.6': dependencies: '@babel/code-frame': 7.28.6 @@ -6991,7 +7182,7 @@ snapshots: transitivePeerDependencies: - encoding - '@changesets/cli@2.29.7(@types/node@24.10.0)': + '@changesets/cli@2.29.7(@types/node@25.0.9)': dependencies: '@changesets/apply-release-plan': 7.0.13 '@changesets/assemble-release-plan': 6.0.9 @@ -7007,7 +7198,7 @@ snapshots: '@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.0) + '@inquirer/external-editor': 1.0.3(@types/node@25.0.9) '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -7527,12 +7718,12 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true - '@inquirer/external-editor@1.0.3(@types/node@24.10.0)': + '@inquirer/external-editor@1.0.3(@types/node@25.0.9)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.0 optionalDependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.9 '@isaacs/balanced-match@4.0.1': {} @@ -7560,14 +7751,14 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.10.0 + '@types/node': 25.0.9 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.0 + '@types/node': 25.0.9 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -7601,7 +7792,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 24.10.0 + '@types/node': 25.0.9 '@types/yargs': 17.0.35 chalk: 4.1.2 @@ -8358,7 +8549,7 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/core@3.20.5': + '@smithy/core@3.21.0': dependencies: '@smithy/middleware-serde': 4.2.9 '@smithy/protocol-http': 5.3.8 @@ -8413,9 +8604,9 @@ snapshots: '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/middleware-endpoint@4.4.6': + '@smithy/middleware-endpoint@4.4.10': dependencies: - '@smithy/core': 3.20.5 + '@smithy/core': 3.21.0 '@smithy/middleware-serde': 4.2.9 '@smithy/node-config-provider': 4.3.8 '@smithy/shared-ini-file-loader': 4.4.3 @@ -8424,12 +8615,12 @@ snapshots: '@smithy/util-middleware': 4.2.8 tslib: 2.8.1 - '@smithy/middleware-retry@4.4.22': + '@smithy/middleware-retry@4.4.26': dependencies: '@smithy/node-config-provider': 4.3.8 '@smithy/protocol-http': 5.3.8 '@smithy/service-error-classification': 4.2.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 '@smithy/util-middleware': 4.2.8 '@smithy/util-retry': 4.2.8 @@ -8503,10 +8694,10 @@ snapshots: '@smithy/util-utf8': 4.2.0 tslib: 2.8.1 - '@smithy/smithy-client@4.10.7': + '@smithy/smithy-client@4.10.11': dependencies: - '@smithy/core': 3.20.5 - '@smithy/middleware-endpoint': 4.4.6 + '@smithy/core': 3.21.0 + '@smithy/middleware-endpoint': 4.4.10 '@smithy/middleware-stack': 4.2.8 '@smithy/protocol-http': 5.3.8 '@smithy/types': 4.12.0 @@ -8551,20 +8742,20 @@ snapshots: dependencies: tslib: 2.8.1 - '@smithy/util-defaults-mode-browser@4.3.21': + '@smithy/util-defaults-mode-browser@4.3.25': dependencies: '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 tslib: 2.8.1 - '@smithy/util-defaults-mode-node@4.2.24': + '@smithy/util-defaults-mode-node@4.2.28': dependencies: '@smithy/config-resolver': 4.4.6 '@smithy/credential-provider-imds': 4.2.8 '@smithy/node-config-provider': 4.3.8 '@smithy/property-provider': 4.2.8 - '@smithy/smithy-client': 4.10.7 + '@smithy/smithy-client': 4.10.11 '@smithy/types': 4.12.0 tslib: 2.8.1 @@ -8734,11 +8925,29 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/addresses@5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/assertions': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/assertions@5.0.0(typescript@5.9.3)': dependencies: '@solana/errors': 5.0.0(typescript@5.9.3) typescript: 5.9.3 + '@solana/assertions@5.4.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/buffer-layout@4.0.1': dependencies: buffer: 6.0.3 @@ -8758,6 +8967,12 @@ snapshots: '@solana/errors': 5.0.0(typescript@5.9.3) typescript: 5.9.3 + '@solana/codecs-core@5.4.0(typescript@5.9.3)': + dependencies: + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/codecs-data-structures@5.0.0(typescript@5.9.3)': dependencies: '@solana/codecs-core': 5.0.0(typescript@5.9.3) @@ -8765,6 +8980,14 @@ snapshots: '@solana/errors': 5.0.0(typescript@5.9.3) typescript: 5.9.3 + '@solana/codecs-data-structures@5.4.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/codecs-numbers@2.3.0(typescript@5.9.3)': dependencies: '@solana/codecs-core': 2.3.0(typescript@5.9.3) @@ -8783,6 +9006,13 @@ snapshots: '@solana/errors': 5.0.0(typescript@5.9.3) typescript: 5.9.3 + '@solana/codecs-numbers@5.4.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + '@solana/codecs-strings@4.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: '@solana/codecs-core': 4.0.0(typescript@5.9.3) @@ -8799,6 +9029,15 @@ snapshots: fastestsmallesttextencoderdecoder: 1.0.22 typescript: 5.9.3 + '@solana/codecs-strings@5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + optionalDependencies: + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.9.3 + '@solana/codecs@5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: '@solana/codecs-core': 5.0.0(typescript@5.9.3) @@ -8898,6 +9137,13 @@ snapshots: commander: 14.0.1 typescript: 5.9.3 + '@solana/errors@5.4.0(typescript@5.9.3)': + dependencies: + chalk: 5.6.2 + commander: 14.0.2 + optionalDependencies: + typescript: 5.9.3 + '@solana/fast-stable-stringify@5.0.0(typescript@5.9.3)': dependencies: typescript: 5.9.3 @@ -8906,6 +9152,10 @@ snapshots: dependencies: typescript: 5.9.3 + '@solana/functional@5.4.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + '@solana/instruction-plans@5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: '@solana/errors': 5.0.0(typescript@5.9.3) @@ -8923,15 +9173,22 @@ snapshots: '@solana/errors': 5.0.0(typescript@5.9.3) typescript: 5.9.3 + '@solana/instructions@5.4.0(typescript@5.9.3)': + dependencies: + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(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.968.0 - '@solana/addresses': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-strings': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@aws-sdk/client-kms': 3.972.0 + '@solana/addresses': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/keychain-core': 0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/keys': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/signers': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transactions': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/keys': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) transitivePeerDependencies: - aws-crt - fastestsmallesttextencoderdecoder @@ -8939,12 +9196,12 @@ snapshots: '@solana/keychain-core@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/addresses': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-core': 5.0.0(typescript@5.9.3) - '@solana/codecs-strings': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/keys': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/signers': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transactions': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/keys': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript @@ -8952,26 +9209,26 @@ snapshots: '@solana/keychain-turnkey@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: '@noble/curves': 2.0.1 - '@solana/addresses': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-core': 5.0.0(typescript@5.9.3) - '@solana/codecs-strings': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/keychain-core': 0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/keys': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/signers': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transactions': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/keys': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript '@solana/keychain-vault@0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: - '@solana/addresses': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/codecs-core': 5.0.0(typescript@5.9.3) - '@solana/codecs-strings': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/addresses': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) '@solana/keychain-core': 0.2.1(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/keys': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/signers': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) - '@solana/transactions': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/keys': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/signers': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) transitivePeerDependencies: - fastestsmallesttextencoderdecoder - typescript @@ -8987,6 +9244,18 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/keys@5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/assertions': 5.4.0(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/kit@5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': dependencies: '@solana/accounts': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -9017,6 +9286,25 @@ snapshots: dependencies: typescript: 5.9.3 + '@solana/nominal-types@5.4.0(typescript@5.9.3)': + optionalDependencies: + typescript: 5.9.3 + + '@solana/offchain-messages@5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/keys': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/options@5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: '@solana/codecs-core': 5.0.0(typescript@5.9.3) @@ -9150,6 +9438,19 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/rpc-types@5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/rpc@5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: '@solana/errors': 5.0.0(typescript@5.9.3) @@ -9179,6 +9480,22 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/signers@5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/instructions': 5.4.0(typescript@5.9.3) + '@solana/keys': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + '@solana/offchain-messages': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transactions': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/subscribable@5.0.0(typescript@5.9.3)': dependencies: '@solana/errors': 5.0.0(typescript@5.9.3) @@ -9226,6 +9543,22 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/transaction-messages@5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/functional': 5.4.0(typescript@5.9.3) + '@solana/instructions': 5.4.0(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + '@solana/rpc-types': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + optionalDependencies: + typescript: 5.9.3 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + '@solana/transactions@5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': dependencies: '@solana/addresses': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) @@ -9244,6 +9577,25 @@ snapshots: transitivePeerDependencies: - fastestsmallesttextencoderdecoder + '@solana/transactions@5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)': + dependencies: + '@solana/addresses': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/codecs-core': 5.4.0(typescript@5.9.3) + '@solana/codecs-data-structures': 5.4.0(typescript@5.9.3) + '@solana/codecs-numbers': 5.4.0(typescript@5.9.3) + '@solana/codecs-strings': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/errors': 5.4.0(typescript@5.9.3) + '@solana/functional': 5.4.0(typescript@5.9.3) + '@solana/instructions': 5.4.0(typescript@5.9.3) + '@solana/keys': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/nominal-types': 5.4.0(typescript@5.9.3) + '@solana/rpc-types': 5.4.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3) + '@solana/transaction-messages': 5.4.0(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.0.9)(typescript@5.9.3)(utf-8-validate@5.0.10))': dependencies: '@solana/wallet-standard-features': 1.3.0 @@ -9513,7 +9865,7 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.28.6 - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -9590,7 +9942,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.9 '@types/hast@3.0.4': dependencies: @@ -9628,6 +9980,10 @@ snapshots: dependencies: undici-types: 7.16.0 + '@types/node@25.0.9': + dependencies: + undici-types: 7.16.0 + '@types/react-dom@19.2.2(@types/react@19.2.2)': dependencies: '@types/react': 19.2.2 @@ -9670,15 +10026,15 @@ snapshots: '@resvg/resvg-wasm': 2.4.0 satori: 0.16.0 - '@vitejs/plugin-react-swc@4.2.0(@swc/helpers@0.5.17)(vite@7.1.12(@types/node@24.10.0)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitejs/plugin-react-swc@4.2.0(@swc/helpers@0.5.17)(vite@7.1.12(@types/node@25.0.9)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.43 '@swc/core': 1.15.0(@swc/helpers@0.5.17) - vite: 7.1.12(@types/node@24.10.0)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.1.12(@types/node@25.0.9)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - '@swc/helpers' - '@vitest/coverage-v8@4.0.7(vitest@4.0.7(@types/debug@4.1.12)(@types/node@24.10.0)(jiti@2.6.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/coverage-v8@4.0.7(vitest@4.0.7(@types/debug@4.1.12)(@types/node@25.0.9)(jiti@2.6.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.7 @@ -9691,7 +10047,7 @@ snapshots: magicast: 0.3.5 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.7(@types/debug@4.1.12)(@types/node@24.10.0)(jiti@2.6.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vitest: 4.0.7(@types/debug@4.1.12)(@types/node@25.0.9)(jiti@2.6.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -9704,13 +10060,13 @@ snapshots: chai: 6.2.0 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.7(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/mocker@4.0.7(vite@7.1.12(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@vitest/spy': 4.0.7 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.1.12(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) '@vitest/pretty-format@4.0.7': dependencies: @@ -9928,6 +10284,8 @@ snapshots: baseline-browser-mapping@2.8.25: {} + baseline-browser-mapping@2.9.17: {} + better-path-resolve@1.0.0: dependencies: is-windows: 1.0.2 @@ -9965,6 +10323,14 @@ snapshots: node-releases: 2.0.27 update-browserslist-db: 1.1.4(browserslist@4.27.0) + browserslist@4.28.1: + dependencies: + baseline-browser-mapping: 2.9.17 + caniuse-lite: 1.0.30001765 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) + bs58@4.0.1: dependencies: base-x: 3.0.11 @@ -10019,6 +10385,8 @@ snapshots: caniuse-lite@1.0.30001759: {} + caniuse-lite@1.0.30001765: {} + ccount@2.0.1: {} chai@6.2.0: {} @@ -10062,7 +10430,7 @@ snapshots: chrome-launcher@0.15.2: dependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.9 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -10071,7 +10439,7 @@ snapshots: chromium-edge-launcher@0.2.0: dependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.9 escape-string-regexp: 4.0.0 is-wsl: 2.2.0 lighthouse-logger: 1.4.2 @@ -10124,6 +10492,8 @@ snapshots: commander@14.0.1: {} + commander@14.0.2: {} + commander@2.20.3: {} commander@4.1.1: {} @@ -10247,6 +10617,8 @@ snapshots: electron-to-chromium@1.5.245: {} + electron-to-chromium@1.5.267: {} + emoji-regex-xs@2.0.1: {} emoji-regex@8.0.0: {} @@ -10594,7 +10966,7 @@ snapshots: transitivePeerDependencies: - supports-color - fumadocs-mdx@14.2.4(@types/react@19.2.2)(fumadocs-core@16.4.4(@types/react@19.2.2)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@7.1.12(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)): + fumadocs-mdx@14.2.4(@types/react@19.2.2)(fumadocs-core@16.4.4(@types/react@19.2.2)(lucide-react@0.562.0(react@19.2.3))(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(zod@4.3.5))(next@16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)(vite@7.1.12(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.1.0 @@ -10618,7 +10990,7 @@ snapshots: '@types/react': 19.2.2 next: 16.1.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react: 19.2.3 - vite: 7.1.12(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.1.12(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) transitivePeerDependencies: - supports-color @@ -10992,7 +11364,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 24.10.0 + '@types/node': 25.0.9 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -11002,7 +11374,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 24.10.0 + '@types/node': 25.0.9 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -11029,7 +11401,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.10.0 + '@types/node': 25.0.9 jest-util: 29.7.0 jest-regex-util@29.6.3: {} @@ -11037,7 +11409,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 24.10.0 + '@types/node': 25.0.9 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -11054,7 +11426,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.9 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -11491,7 +11863,7 @@ snapshots: metro-minify-terser@0.83.3: dependencies: flow-enums-runtime: 0.0.6 - terser: 5.44.1 + terser: 5.46.0 metro-resolver@0.83.3: dependencies: @@ -11499,7 +11871,7 @@ snapshots: metro-runtime@0.83.3: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 flow-enums-runtime: 0.0.6 metro-source-map@0.83.3: @@ -12887,7 +13259,7 @@ snapshots: term-size@2.2.1: {} - terser@5.44.1: + terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 @@ -13025,6 +13397,12 @@ snapshots: turbo-windows-64: 2.6.0 turbo-windows-arm64: 2.6.0 + tx-indexer@1.4.0(@solana/kit@5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(typescript@5.9.3): + dependencies: + '@solana/kit': 5.0.0(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.3)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + typescript: 5.9.3 + zod: 4.3.5 + type-detect@4.0.8: {} type-fest@0.7.1: {} @@ -13111,6 +13489,12 @@ snapshots: escalade: 3.2.0 picocolors: 1.1.1 + update-browserslist-db@1.2.3(browserslist@4.28.1): + dependencies: + browserslist: 4.28.1 + escalade: 3.2.0 + picocolors: 1.1.1 + url-parse@1.5.10: dependencies: querystringify: 2.2.0 @@ -13156,7 +13540,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@7.1.12(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.1.12(@types/node@20.19.27)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -13169,12 +13553,12 @@ snapshots: fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 - terser: 5.44.1 + terser: 5.46.0 tsx: 4.21.0 yaml: 2.8.2 optional: true - vite@7.1.12(@types/node@24.10.0)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.1.12(@types/node@25.0.9)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -13183,15 +13567,15 @@ snapshots: rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.9 fsevents: 2.3.3 jiti: 1.21.7 lightningcss: 1.30.2 - terser: 5.44.1 + terser: 5.46.0 tsx: 4.21.0 yaml: 2.8.2 - vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vite@7.1.12(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) @@ -13200,18 +13584,18 @@ snapshots: rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.10.0 + '@types/node': 25.0.9 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 - terser: 5.44.1 + terser: 5.46.0 tsx: 4.21.0 yaml: 2.8.2 - vitest@4.0.7(@types/debug@4.1.12)(@types/node@24.10.0)(jiti@2.6.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2): + vitest@4.0.7(@types/debug@4.1.12)(@types/node@25.0.9)(jiti@2.6.1)(jsdom@24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2): dependencies: '@vitest/expect': 4.0.7 - '@vitest/mocker': 4.0.7(vite@7.1.12(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@vitest/mocker': 4.0.7(vite@7.1.12(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2)) '@vitest/pretty-format': 4.0.7 '@vitest/runner': 4.0.7 '@vitest/snapshot': 4.0.7 @@ -13228,11 +13612,11 @@ snapshots: tinyexec: 0.3.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.1.12(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2) + vite: 7.1.12(@types/node@25.0.9)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.46.0)(tsx@4.21.0)(yaml@2.8.2) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 - '@types/node': 24.10.0 + '@types/node': 25.0.9 jsdom: 24.1.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) transitivePeerDependencies: - jiti