From 4637fdfbbde71bbd5f9f09f2b527e41b9c8301b1 Mon Sep 17 00:00:00 2001 From: Rytis Grincevicius Date: Thu, 6 Nov 2025 10:51:33 +0200 Subject: [PATCH 1/8] wip: tx dialog --- apps/web-app/package.json | 5 +- apps/web-app/src/@types/global.d.ts | 2 + .../components/AssetsTable/AssetsTable.tsx | 41 ++-- .../TransactionDialog/TransactionDialog.tsx | 204 ++++++++++++++++++ .../src/integrations/privy/connector.tsx | 20 +- .../src/integrations/privy/root-provider.tsx | 10 +- apps/web-app/src/integrations/wagmi/config.ts | 16 +- .../src/integrations/wagmi/root-provider.tsx | 14 +- apps/web-app/src/lib/transactions/index.ts | 25 +++ apps/web-app/src/lib/transactions/store.ts | 49 +++++ packages/sdk/src/lib/transaction.ts | 43 +++- .../sdk/src/managers/money-market.manager.ts | 51 +++-- packages/sdk/src/types.ts | 4 +- pnpm-lock.yaml | 120 +++++++---- 14 files changed, 497 insertions(+), 107 deletions(-) create mode 100644 apps/web-app/src/@types/global.d.ts create mode 100644 apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx create mode 100644 apps/web-app/src/lib/transactions/index.ts create mode 100644 apps/web-app/src/lib/transactions/store.ts diff --git a/apps/web-app/package.json b/apps/web-app/package.json index 73e5477..b0307fd 100644 --- a/apps/web-app/package.json +++ b/apps/web-app/package.json @@ -35,6 +35,7 @@ "i18next": "^25.5.2", "i18next-browser-languagedetector": "^8.2.0", "i18next-http-backend": "^3.0.2", + "immer": "^10.2.0", "lucide-react": "0.544.0", "next-themes": "^0.4.6", "react": "19.1.1", @@ -45,9 +46,11 @@ "tailwind-merge": "3.3.1", "tailwindcss": "4.1.13", "tw-animate-css": "1.3.8", + "use-sync-external-store": "^1.6.0", "viem": "2.37.8", "wagmi": "2.17.2", - "zod": "4.1.11" + "zod": "4.1.11", + "zustand": "^5.0.8" }, "devDependencies": { "@types/debug": "^4.1.12", diff --git a/apps/web-app/src/@types/global.d.ts b/apps/web-app/src/@types/global.d.ts new file mode 100644 index 0000000..5d7135e --- /dev/null +++ b/apps/web-app/src/@types/global.d.ts @@ -0,0 +1,2 @@ +// eslint-disable-next-line @typescript-eslint/no-explicit-any +declare type AnyValue = any; diff --git a/apps/web-app/src/components/MoneyMarket/components/BorrowAssetsList/components/AssetsTable/AssetsTable.tsx b/apps/web-app/src/components/MoneyMarket/components/BorrowAssetsList/components/AssetsTable/AssetsTable.tsx index 8227a86..d6caf2b 100644 --- a/apps/web-app/src/components/MoneyMarket/components/BorrowAssetsList/components/AssetsTable/AssetsTable.tsx +++ b/apps/web-app/src/components/MoneyMarket/components/BorrowAssetsList/components/AssetsTable/AssetsTable.tsx @@ -15,11 +15,8 @@ import { type OrderSorting, } from '@/components/ui/table/table.types'; import { sdk } from '@/lib/sdk'; -import { - BorrowRateMode, - type MoneyMarketPoolReserve, - type Token, -} from '@sovryn/slayer-sdk'; +import { useSlayerTx } from '@/lib/transactions'; +import { type MoneyMarketPoolReserve, type Token } from '@sovryn/slayer-sdk'; import { Decimal } from '@sovryn/slayer-shared'; import { useAccount, useWriteContract } from 'wagmi'; @@ -71,21 +68,31 @@ export const AssetsTable: FC = ({ assets }) => { const { writeContractAsync } = useWriteContract(); + const { begin } = useSlayerTx(); + const handleBorrow = async (token: Token) => { - const msg = await sdk.moneyMarket.borrow( - token, - Decimal.from(1), - BorrowRateMode.stable, - { + begin(async () => { + const s = await sdk.moneyMarket.borrow(token, Decimal.from(1), 1, { account: address!, - }, - ); - console.log('Transaction Request:', msg); + }); + console.log('Transaction Request:', s); + return s; + }); + + // const msg = await sdk.moneyMarket.borrow( + // token, + // Decimal.from(1), + // BorrowRateMode.stable, + // { + // account: address!, + // }, + // ); + // console.log('Transaction Request:', msg); - if (msg.length) { - const data = await writeContractAsync(msg[0]); - console.log('Transaction Response:', data); - } + // if (msg.length) { + // // const data = await writeContractAsync(msg[0]); + // // console.log('Transaction Response:', data); + // } // const d = await signMessageAsync(msg); // console.warn('Signature:', { data, d }); }; diff --git a/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx b/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx new file mode 100644 index 0000000..9d84802 --- /dev/null +++ b/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx @@ -0,0 +1,204 @@ +import { txStore } from '@/lib/transactions/store'; +import clsx from 'clsx'; +import { Loader2Icon } from 'lucide-react'; +import type { SdkTransactionRequest } from 'node_modules/@sovryn/slayer-sdk/src/lib/transaction'; +import { useState, type FC } from 'react'; +import { prepareTransactionRequest } from 'viem/actions'; +import { + useAccount, + useConfig, + useSendTransaction, + useSignMessage, + useSwitchChain, + useWaitForTransactionReceipt, +} from 'wagmi'; +import { useStoreWithEqualityFn } from 'zustand/traditional'; +import { Button } from '../ui/button'; +import { + Dialog, + DialogClose, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '../ui/dialog'; + +export const TransactionDialogProvider = () => { + const [isOpen, isReady] = useStoreWithEqualityFn( + txStore, + (state) => [state.isFetching || state.isReady, state.isReady] as const, + ); + + const onClose = (open: boolean) => { + if (!open) { + txStore.getState().reset(); + } + }; + + const handleEscapes = (e: Event) => { + if (!isReady) { + txStore.getState().reset(); + return; + } + e.preventDefault(); + }; + + return ( + + + {isReady ? ( + + ) : ( + <> + + Transaction in progress + + Please do not close this window. + + +
+ +

Preparing transaction...

+
+ + )} +
+
+ ); +}; + +const TxList = () => { + const [isPreparing, setIsPreparing] = useState(false); + const { switchChain } = useSwitchChain(); + const { isConnected, chainId, connector } = useAccount(); + + const items = useStoreWithEqualityFn(txStore, (state) => state.items); + + const nextTx = items.find((t) => !t.res); + + // const hasPending = items.some(tx => tx.res?.) + + const { + sendTransactionAsync, + data: pendingTxHash, + error, + isPending: isSending, + } = useSendTransaction(); + const { signMessageAsync } = useSignMessage(); + + const { + data: receipt, + isFetching, + isPending: isReceiptPending, + } = useWaitForTransactionReceipt({ + hash: pendingTxHash, + onReplaced: (tx) => { + console.log('Transaction replaced', tx); + }, + }); + + const config = useConfig(); + + const handleConfirm = async () => { + const tx = items.find((t) => !t.res); + if (!tx) return; + setIsPreparing(true); + try { + console.log('Confirming tx', tx); + setIsPreparing(true); + + const client = await connector?.getClient?.(); + const value = await prepareTransactionRequest(config.getClient(), { + to: '0x2bD2201BFE156A71EB0D02837172ffc237218505'.toLowerCase() as `0x${string}`, + value: 1n, + // chain: client?.chain, + }); + + console.log('Prepared transaction value:', value); + + const hash = await sendTransactionAsync(value, { + onSettled: (data, error) => { + console.log('Transaction settled', { data, error }); + }, + onError: (error) => { + console.error('Transaction error', error); + }, + onSuccess: (data) => { + console.log('Transaction success', data); + }, + }); + console.log('Transaction hash:', hash); + } catch (e) { + console.error('Error confirming transaction', e); + return; + } finally { + setIsPreparing(false); + } + }; + + const isPending = isPreparing || isSending || isReceiptPending; + + return ( + <> + + Transaction Dialog + + Confirm and submit your transactions + + + {items.map((tx) => ( + + ))} + +

chainId: {chainId}

+

next chainId: {nextTx?.req.chainId}

+ + {!isConnected &&

Please connect your wallet.

} + +

data: {pendingTxHash}

+

error: {error?.message}

+ +

receipt: {JSON.stringify(receipt)}

+ + + + + + + {chainId && nextTx?.req?.chainId && chainId !== nextTx?.req.chainId ? ( + + ) : ( + + )} + + + ); +}; + +const TransactionItem: FC<{ item: SdkTransactionRequest }> = ({ item }) => { + return ( +
+

{item.title}

+

{item.description}

+ {/*
{JSON.stringify(item.req)}
*/} + {/*
{JSON.stringify(item.res)}
*/} +
+ ); +}; diff --git a/apps/web-app/src/integrations/privy/connector.tsx b/apps/web-app/src/integrations/privy/connector.tsx index 5b51543..6a6528b 100644 --- a/apps/web-app/src/integrations/privy/connector.tsx +++ b/apps/web-app/src/integrations/privy/connector.tsx @@ -1,10 +1,12 @@ import { Button } from '@/components/ui/button'; import { usePrivy, useWallets } from '@privy-io/react-auth'; import { useSetActiveWallet } from '@privy-io/wagmi'; +import { bobSepolia, rootstockTestnet } from 'viem/chains'; import { parseEther } from 'viem/utils'; import { useAccount, useDisconnect, + usePrepareTransactionRequest, useSendTransaction, useSignMessage, useSwitchChain, @@ -26,7 +28,8 @@ export const PrivyConnector = () => { const { wallets, ready: walletsReady } = useWallets(); // WAGMI hooks - const { address, isConnected, isConnecting, isDisconnected } = useAccount(); + const { address, isConnected, isConnecting, isDisconnected, chainId } = + useAccount(); const { disconnect } = useDisconnect(); const { setActiveWallet } = useSetActiveWallet(); const { switchChain } = useSwitchChain(); @@ -55,7 +58,7 @@ export const PrivyConnector = () => { return (
{wallet.address}
+ +
)} @@ -152,12 +163,15 @@ const SendTransaction = () => { const transactionRequest: SendTransactionVariables = { to: '0x2bD2201BFE156A71EB0D02837172ffc237218505'.toLowerCase() as `0x${string}`, value: parseEther('0.001'), + data: '0x', // type: 'eip1559', // does not work for rootstock }; const { data, isPending, isSuccess, sendTransaction, error } = useSendTransaction(); + usePrepareTransactionRequest(); + return ( <>

useSendTransaction

diff --git a/apps/web-app/src/integrations/privy/root-provider.tsx b/apps/web-app/src/integrations/privy/root-provider.tsx index c95888d..e55608e 100644 --- a/apps/web-app/src/integrations/privy/root-provider.tsx +++ b/apps/web-app/src/integrations/privy/root-provider.tsx @@ -1,7 +1,13 @@ 'use client'; import { PrivyProvider, type PrivyClientConfig } from '@privy-io/react-auth'; -import { rootstockTestnet } from 'viem/chains'; +import { + bobSepolia, + mainnet, + rootstock, + rootstockTestnet, + sepolia, +} from 'viem/chains'; const privyConfig: PrivyClientConfig = { embeddedWallets: { @@ -13,7 +19,7 @@ const privyConfig: PrivyClientConfig = { appearance: { showWalletLoginFirst: true, }, - supportedChains: [rootstockTestnet], + supportedChains: [mainnet, bobSepolia, sepolia, rootstock, rootstockTestnet], }; export function Provider({ children }: { children: React.ReactNode }) { diff --git a/apps/web-app/src/integrations/wagmi/config.ts b/apps/web-app/src/integrations/wagmi/config.ts index ec6c9e6..5909633 100644 --- a/apps/web-app/src/integrations/wagmi/config.ts +++ b/apps/web-app/src/integrations/wagmi/config.ts @@ -1,13 +1,21 @@ import { createConfig } from '@privy-io/wagmi'; import { http } from 'viem'; -import { bobSepolia } from 'viem/chains'; +import { + bobSepolia, + mainnet, + rootstock, + rootstockTestnet, + sepolia, +} from 'viem/chains'; export const config = createConfig({ - chains: [bobSepolia], + chains: [mainnet, sepolia, bobSepolia, rootstock, rootstockTestnet], transports: { - // [rootstock.id]: slayer(), + [mainnet.id]: http(), + [sepolia.id]: http(), [bobSepolia.id]: http(), - // [rootstockTestnet.id]: slayer(), + [rootstock.id]: http(), + [rootstockTestnet.id]: http(), }, }); diff --git a/apps/web-app/src/integrations/wagmi/root-provider.tsx b/apps/web-app/src/integrations/wagmi/root-provider.tsx index d37eb4d..b7d5593 100644 --- a/apps/web-app/src/integrations/wagmi/root-provider.tsx +++ b/apps/web-app/src/integrations/wagmi/root-provider.tsx @@ -1,20 +1,10 @@ -import { Dialog } from '@/components/ui/dialog'; +import { TransactionDialogProvider } from '@/components/TransactionDialog/TransactionDialog'; import { WagmiProvider } from '@privy-io/wagmi'; import { config } from './config'; export const Provider = ({ children }: { children: React.ReactNode }) => ( {children} - + ); - -export const runTx = async (tx: any) => { - console.log('Running tx:', tx); - await new Promise((resolve) => setTimeout(resolve, 20_000)); - console.log('Tx done', tx); -}; - -const Tx = () => { - return Transaction; -}; diff --git a/apps/web-app/src/lib/transactions/index.ts b/apps/web-app/src/lib/transactions/index.ts new file mode 100644 index 0000000..6e44887 --- /dev/null +++ b/apps/web-app/src/lib/transactions/index.ts @@ -0,0 +1,25 @@ +import type { SdkTransactionRequest } from 'node_modules/@sovryn/slayer-sdk/src/lib/transaction'; +import type { Account, Chain } from 'viem'; +import { useStore } from 'zustand'; +import { txStore } from './store'; + +export const useSlayerTx = < + chain extends Chain = AnyValue, + account extends Account = AnyValue, +>() => { + const { setItems, setIsFetching, reset } = useStore(txStore); + + const begin = async ( + waitFor?: () => Promise[]>, + ) => { + setIsFetching(true); + if (waitFor) { + const txs = await waitFor(); + setItems(txs); + } + // const result = await send(); + // return result; + }; + + return { begin, abort: reset }; +}; diff --git a/apps/web-app/src/lib/transactions/store.ts b/apps/web-app/src/lib/transactions/store.ts new file mode 100644 index 0000000..d3e4161 --- /dev/null +++ b/apps/web-app/src/lib/transactions/store.ts @@ -0,0 +1,49 @@ +import type { SdkTransactionRequest } from 'node_modules/@sovryn/slayer-sdk/src/lib/transaction'; +import { createStore } from 'zustand'; +import { combine } from 'zustand/middleware'; + +export type SlayerTx = SdkTransactionRequest & { res: unknown }; + +type State = { + isFetching: boolean; + isReady: boolean; + items: SlayerTx[]; +}; + +type Actions = { + setIsFetching: (isFetching: boolean) => void; + setItems: (items: SdkTransactionRequest[]) => void; + reset: () => void; +}; + +type Store = State & Actions; + +export const txStore = createStore( + combine( + { + isFetching: false, + isReady: false, + items: [] as SlayerTx[], + }, + (set) => ({ + setIsFetching: (isFetching: boolean) => set({ isFetching }), + setItems: (items: SdkTransactionRequest[]) => + set({ + items: items.map(toTx), + isFetching: false, + isReady: true, + }), + reset: () => + set({ + isFetching: false, + isReady: false, + items: [], + }), + }), + ), +); + +const toTx = (item: SdkTransactionRequest): SlayerTx => ({ + ...item, + res: undefined, +}); diff --git a/packages/sdk/src/lib/transaction.ts b/packages/sdk/src/lib/transaction.ts index 7877ef5..efd440c 100644 --- a/packages/sdk/src/lib/transaction.ts +++ b/packages/sdk/src/lib/transaction.ts @@ -1,7 +1,38 @@ -export interface TransactionRequest { - from: string; - to: string; - value: string; - gasLimit: string; - data: string; +import type { + Account, + Chain, + SignMessageParameters, + SignTransactionParameters, + SignTypedDataParameters, +} from 'viem'; + +export interface SdkTransactionRequest< + chain extends Chain = Chain, + account extends Account = Account, +> { + // A unique identifier for the transaction request + id: string; + // A human-readable title for the transaction request + title: string; + // A detailed description of the transaction request + description: string; + // The actual request data, which can be a message, typed data, or transaction + request: SdkRequest; } + +export type SdkRequest< + chain extends Chain = Chain, + account extends Account = Account, +> = + | { + type: 'message'; + data: SignMessageParameters; + } + | { + type: 'typed_data'; + data: SignTypedDataParameters; + } + | { + type: 'transaction'; + data: SignTransactionParameters; + }; diff --git a/packages/sdk/src/managers/money-market.manager.ts b/packages/sdk/src/managers/money-market.manager.ts index 11853f1..2974626 100644 --- a/packages/sdk/src/managers/money-market.manager.ts +++ b/packages/sdk/src/managers/money-market.manager.ts @@ -1,7 +1,8 @@ import { Decimal } from '@sovryn/slayer-shared'; -import { zeroAddress, type Chain, type WriteContractParameters } from 'viem'; +import { Account, zeroAddress, type Chain } from 'viem'; import { BaseClient, type SdkRequestOptions } from '../lib/context.js'; import { buildQuery } from '../lib/helpers.js'; +import { SdkRequest, SdkTransactionRequest } from '../lib/transaction.js'; import { BorrowRateMode, MoneyMarketPool, @@ -57,12 +58,12 @@ export class MoneyMarketManager extends BaseClient { return this.#poolInfo; } - async borrow( + async borrow( asset: Token, amount: Decimal, rateMode: BorrowRateMode, - opts: TransactionOpts, - ): Promise { + opts: TransactionOpts, + ): Promise[]> { const pool = await this.getPoolInfo(); console.log('Borrowing from pool:', pool); @@ -75,20 +76,34 @@ export class MoneyMarketManager extends BaseClient { return [ { - account: opts.account, - abi: poolAbi, - address: pool.data.pool, - functionName: 'borrow', - value: 0n, - chain: this.ctx.publicClient.chain, - args: [ - asset.address, - amount.toBigInt(), - rateMode, - 0, // referralCode - String(opts.account).toLowerCase(), - ], + id: 'borrow', + title: 'Borrow Asset', + description: `Borrowing ${amount.toString()} ${asset.symbol} from Money Market`, + request: { + type: 'transaction', + data: { + to: pool.data.pool, + value: 0n, + chain: this.ctx.publicClient.chain, + chainId: this.ctx.publicClient.chain.id, + data: '0x', + }, + } as unknown as SdkRequest, + + // account: opts.account, + // abi: poolAbi, + // address: pool.data.pool, + // functionName: 'borrow', + // value: 0n, + // chain: this.ctx.publicClient.chain, + // args: [ + // asset.address, + // amount.toBigInt(), + // rateMode, + // 0, // referralCode + // String(opts.account).toLowerCase(), + // ], }, - ]; + ] satisfies SdkTransactionRequest[]; } } diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts index 667a30d..29f9de5 100644 --- a/packages/sdk/src/types.ts +++ b/packages/sdk/src/types.ts @@ -16,8 +16,8 @@ export interface SdkPaginatedQuery { search?: string; } -export type TransactionOpts = { - account: Account | Address; +export type TransactionOpts = { + account: account | Address; }; export interface Token { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c7e1bc7..caad892 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -242,10 +242,10 @@ importers: version: 0.0.18(vite@7.1.7(@types/node@20.19.9)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) '@privy-io/react-auth': specifier: 3.0.1 - version: 3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.1.3)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) + version: 3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) '@privy-io/wagmi': specifier: 2.0.0 - version: 2.0.0(@privy-io/react-auth@3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.1.3)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11))(react@19.1.1)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.1.3)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)) + version: 2.0.0(@privy-io/react-auth@3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11))(react@19.1.1)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)) '@radix-ui/react-checkbox': specifier: ^1.3.3 version: 1.3.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -333,6 +333,9 @@ importers: i18next-http-backend: specifier: ^3.0.2 version: 3.0.2(encoding@0.1.13) + immer: + specifier: ^10.2.0 + version: 10.2.0 lucide-react: specifier: 0.544.0 version: 0.544.0(react@19.1.1) @@ -363,15 +366,21 @@ importers: tw-animate-css: specifier: 1.3.8 version: 1.3.8 + use-sync-external-store: + specifier: ^1.6.0 + version: 1.6.0(react@19.1.1) viem: specifier: 2.37.8 version: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) wagmi: specifier: 2.17.2 - version: 2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.1.3)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) + version: 2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) zod: specifier: 4.1.11 version: 4.1.11 + zustand: + specifier: ^5.0.8 + version: 5.0.8(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)) devDependencies: '@types/debug': specifier: ^4.1.12 @@ -6983,8 +6992,8 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} - immer@10.1.3: - resolution: {integrity: sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==} + immer@10.2.0: + resolution: {integrity: sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==} import-cwd@3.0.0: resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} @@ -10050,8 +10059,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - use-sync-external-store@1.5.0: - resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==} + use-sync-external-store@1.6.0: + resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 @@ -11498,7 +11507,27 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@base-org/account@1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.1.3)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': + '@base-org/account@1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': + dependencies: + '@noble/hashes': 1.4.0 + clsx: 1.2.1 + eventemitter3: 5.0.1 + idb-keyval: 6.2.1 + ox: 0.6.9(typescript@5.9.2)(zod@4.1.11) + preact: 10.24.2 + viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + zustand: 5.0.3(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + transitivePeerDependencies: + - '@types/react' + - bufferutil + - immer + - react + - typescript + - use-sync-external-store + - utf-8-validate + - zod + + '@base-org/account@1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': dependencies: '@noble/hashes': 1.4.0 clsx: 1.2.1 @@ -11507,7 +11536,7 @@ snapshots: ox: 0.6.9(typescript@5.9.2)(zod@4.1.11) preact: 10.24.2 viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - zustand: 5.0.3(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + zustand: 5.0.3(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)) transitivePeerDependencies: - '@types/react' - bufferutil @@ -11562,7 +11591,7 @@ snapshots: eventemitter3: 5.0.1 preact: 10.27.2 - '@coinbase/wallet-sdk@4.3.6(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.1.3)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': + '@coinbase/wallet-sdk@4.3.6(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': dependencies: '@noble/hashes': 1.4.0 clsx: 1.2.1 @@ -11571,7 +11600,7 @@ snapshots: ox: 0.6.9(typescript@5.9.2)(zod@4.1.11) preact: 10.24.2 viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - zustand: 5.0.3(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + zustand: 5.0.3(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) transitivePeerDependencies: - '@types/react' - bufferutil @@ -12304,7 +12333,7 @@ snapshots: '@tanstack/react-virtual': 3.13.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - use-sync-external-store: 1.5.0(react@19.1.1) + use-sync-external-store: 1.6.0(react@19.1.1) '@heroicons/react@2.2.0(react@19.1.1)': dependencies: @@ -13735,9 +13764,9 @@ snapshots: - typescript - utf-8-validate - '@privy-io/react-auth@3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.1.3)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': + '@privy-io/react-auth@3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': dependencies: - '@base-org/account': 1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.1.3)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) + '@base-org/account': 1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) '@coinbase/wallet-sdk': 4.3.2 '@floating-ui/react': 0.26.28(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@headlessui/react': 2.2.8(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -13777,7 +13806,7 @@ snapshots: tinycolor2: 1.6.0 uuid: 9.0.1 viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - zustand: 5.0.8(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + zustand: 5.0.8(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13807,12 +13836,12 @@ snapshots: - utf-8-validate - zod - '@privy-io/wagmi@2.0.0(@privy-io/react-auth@3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.1.3)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11))(react@19.1.1)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.1.3)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11))': + '@privy-io/wagmi@2.0.0(@privy-io/react-auth@3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11))(react@19.1.1)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11))': dependencies: - '@privy-io/react-auth': 3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.1.3)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) + '@privy-io/react-auth': 3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) react: 19.1.1 viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - wagmi: 2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.1.3)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) + wagmi: 2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) '@radix-ui/number@1.1.1': {} @@ -14286,7 +14315,7 @@ snapshots: dependencies: '@standard-schema/spec': 1.0.0 '@standard-schema/utils': 0.3.0 - immer: 10.1.3 + immer: 10.2.0 redux: 5.0.1 redux-thunk: 3.1.0(redux@5.0.1) reselect: 5.1.1 @@ -15241,7 +15270,7 @@ snapshots: '@tanstack/store': 0.7.5 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - use-sync-external-store: 1.5.0(react@19.1.1) + use-sync-external-store: 1.6.0(react@19.1.1) '@tanstack/react-virtual@3.13.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: @@ -15770,15 +15799,15 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@wagmi/connectors@5.10.2(@types/react@19.1.13)(@wagmi/core@2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.1.3)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)': + '@wagmi/connectors@5.10.2(@types/react@19.1.13)(@wagmi/core@2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)': dependencies: - '@base-org/account': 1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.1.3)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) - '@coinbase/wallet-sdk': 4.3.6(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.1.3)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) + '@base-org/account': 1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) + '@coinbase/wallet-sdk': 4.3.6(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) '@gemini-wallet/core': 0.2.0(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - '@wagmi/core': 2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) '@walletconnect/ethereum-provider': 2.21.1(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) @@ -15814,12 +15843,12 @@ snapshots: - utf-8-validate - zod - '@wagmi/core@2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))': + '@wagmi/core@2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.9.2) viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - zustand: 5.0.0(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + zustand: 5.0.0(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)) optionalDependencies: '@tanstack/query-core': 5.90.2 typescript: 5.9.2 @@ -19362,7 +19391,7 @@ snapshots: ignore@7.0.5: {} - immer@10.1.3: {} + immer@10.2.0: {} import-cwd@3.0.0: dependencies: @@ -21496,7 +21525,7 @@ snapshots: dependencies: '@types/use-sync-external-store': 0.0.6 react: 19.1.1 - use-sync-external-store: 1.5.0(react@19.1.1) + use-sync-external-store: 1.6.0(react@19.1.1) optionalDependencies: '@types/react': 19.1.13 redux: 5.0.1 @@ -21585,14 +21614,14 @@ snapshots: decimal.js-light: 2.5.1 es-toolkit: 1.39.3 eventemitter3: 5.0.1 - immer: 10.1.3 + immer: 10.2.0 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) react-is: 18.3.1 react-redux: 9.2.0(@types/react@19.1.13)(react@19.1.1)(redux@5.0.1) reselect: 5.1.1 tiny-invariant: 1.3.3 - use-sync-external-store: 1.5.0(react@19.1.1) + use-sync-external-store: 1.6.0(react@19.1.1) victory-vendor: 37.3.6 transitivePeerDependencies: - '@types/react' @@ -22799,7 +22828,7 @@ snapshots: dependencies: react: 19.1.1 - use-sync-external-store@1.5.0(react@19.1.1): + use-sync-external-store@1.6.0(react@19.1.1): dependencies: react: 19.1.1 @@ -23192,11 +23221,11 @@ snapshots: dependencies: xml-name-validator: 5.0.0 - wagmi@2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.1.3)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11): + wagmi@2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11): dependencies: '@tanstack/react-query': 5.90.2(react@19.1.1) - '@wagmi/connectors': 5.10.2(@types/react@19.1.13)(@wagmi/core@2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.1.3)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) - '@wagmi/core': 2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/connectors': 5.10.2(@types/react@19.1.13)(@wagmi/core@2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) + '@wagmi/core': 2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) react: 19.1.1 use-sync-external-store: 1.4.0(react@19.1.1) viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) @@ -23482,23 +23511,30 @@ snapshots: zod@4.1.11: {} - zustand@5.0.0(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)): + zustand@5.0.0(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)): optionalDependencies: '@types/react': 19.1.13 - immer: 10.1.3 + immer: 10.2.0 react: 19.1.1 - use-sync-external-store: 1.4.0(react@19.1.1) + use-sync-external-store: 1.6.0(react@19.1.1) - zustand@5.0.3(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)): + zustand@5.0.3(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)): optionalDependencies: '@types/react': 19.1.13 - immer: 10.1.3 + immer: 10.2.0 react: 19.1.1 use-sync-external-store: 1.4.0(react@19.1.1) - zustand@5.0.8(@types/react@19.1.13)(immer@10.1.3)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)): + zustand@5.0.3(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)): optionalDependencies: '@types/react': 19.1.13 - immer: 10.1.3 + immer: 10.2.0 react: 19.1.1 - use-sync-external-store: 1.4.0(react@19.1.1) + use-sync-external-store: 1.6.0(react@19.1.1) + + zustand@5.0.8(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)): + optionalDependencies: + '@types/react': 19.1.13 + immer: 10.2.0 + react: 19.1.1 + use-sync-external-store: 1.6.0(react@19.1.1) From b363b355c8b08e57bdd4c06f5d27792eff6ce45a Mon Sep 17 00:00:00 2001 From: Rytis Grincevicius Date: Thu, 6 Nov 2025 10:51:33 +0200 Subject: [PATCH 2/8] wip: sign message and typed data --- .../TransactionDialog/TransactionDialog.tsx | 199 +++++++++++++----- apps/web-app/src/lib/transactions/store.ts | 41 +++- eslint.config.mjs | 1 + nx.json | 2 +- packages/sdk/src/index.ts | 1 + packages/sdk/src/lib/helpers.ts | 7 + packages/sdk/src/lib/transaction.ts | 80 ++++++- .../sdk/src/managers/money-market.manager.ts | 105 ++++++--- packages/sdk/src/types.ts | 11 +- 9 files changed, 360 insertions(+), 87 deletions(-) diff --git a/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx b/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx index 9d84802..f5e3551 100644 --- a/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx +++ b/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx @@ -1,17 +1,27 @@ -import { txStore } from '@/lib/transactions/store'; +import { txStates, txStore, type SlayerTx } from '@/lib/transactions/store'; +import { + isMessageRequest, + isTransactionRequest, + isTypedDataRequest, +} from '@sovryn/slayer-sdk'; import clsx from 'clsx'; -import { Loader2Icon } from 'lucide-react'; -import type { SdkTransactionRequest } from 'node_modules/@sovryn/slayer-sdk/src/lib/transaction'; -import { useState, type FC } from 'react'; -import { prepareTransactionRequest } from 'viem/actions'; +import { + CircleCheckBig, + CircleDashed, + CircleX, + Loader2Icon, +} from 'lucide-react'; +import { useMemo, useState, type FC } from 'react'; +import { toast } from 'sonner'; import { useAccount, - useConfig, useSendTransaction, useSignMessage, + useSignTypedData, useSwitchChain, useWaitForTransactionReceipt, } from 'wagmi'; +import { useStore } from 'zustand'; import { useStoreWithEqualityFn } from 'zustand/traditional'; import { Button } from '../ui/button'; import { @@ -78,10 +88,24 @@ const TxList = () => { const { isConnected, chainId, connector } = useAccount(); const items = useStoreWithEqualityFn(txStore, (state) => state.items); + const updateItem = useStore(txStore, (state) => state.updateItem); + const updateItemState = useStore(txStore, (state) => state.updateItemState); - const nextTx = items.find((t) => !t.res); + const currentTx = useMemo(() => items.find((t) => !t.res), [items]); - // const hasPending = items.some(tx => tx.res?.) + const requiredChainId = useMemo(() => { + if (currentTx && isTransactionRequest(currentTx)) { + return currentTx.request.data.chain?.id; + } + + if (currentTx && isTypedDataRequest(currentTx)) { + return currentTx.request.data.domain?.chainId + ? Number(currentTx.request.data.domain.chainId) + : undefined; + } + + return undefined; + }, [currentTx]); const { sendTransactionAsync, @@ -89,7 +113,40 @@ const TxList = () => { error, isPending: isSending, } = useSendTransaction(); - const { signMessageAsync } = useSignMessage(); + + const { signMessage, isPending: isSigning } = useSignMessage({ + mutation: { + onError(error) { + console.error('Message signing error', error); + updateItem(currentTx?.id || '', txStates.error, undefined); + toast.error(`Message signing failed: ${error.message}`); + }, + onSuccess(data) { + updateItem(currentTx?.id || '', txStates.success, { + transactionHash: data, + }); + console.log('Message signed successfully', data); + toast.success('Message signed successfully'); + }, + }, + }); + + const { signTypedData, isPending: isSigningTypedData } = useSignTypedData({ + mutation: { + onError(error) { + console.error('Typed Data signing error', error); + updateItem(currentTx?.id || '', txStates.error, undefined); + toast.error(`Typed Data signing failed: ${error.message}`); + }, + onSuccess(data) { + updateItem(currentTx?.id || '', txStates.success, { + transactionHash: data, + }); + console.log('Typed Data signed successfully', data); + toast.success('Typed Data signed successfully'); + }, + }, + }); const { data: receipt, @@ -102,37 +159,49 @@ const TxList = () => { }, }); - const config = useConfig(); - const handleConfirm = async () => { const tx = items.find((t) => !t.res); if (!tx) return; - setIsPreparing(true); try { console.log('Confirming tx', tx); setIsPreparing(true); + updateItemState(tx.id, txStates.pending); + + if (isMessageRequest(tx)) { + // Handle message request + console.log('Signing message', tx.request.data); + signMessage(tx.request.data); + } else if (isTypedDataRequest(tx)) { + // Handle typed data request + console.log('Signing typed data', tx.request.data); + signTypedData(tx.request.data); + } else if (isTransactionRequest(tx)) { + // Handle transaction request + console.log('Sending transaction', tx.request.data); + } else { + throw new Error('Unknown transaction request type'); + } - const client = await connector?.getClient?.(); - const value = await prepareTransactionRequest(config.getClient(), { - to: '0x2bD2201BFE156A71EB0D02837172ffc237218505'.toLowerCase() as `0x${string}`, - value: 1n, - // chain: client?.chain, - }); - - console.log('Prepared transaction value:', value); - - const hash = await sendTransactionAsync(value, { - onSettled: (data, error) => { - console.log('Transaction settled', { data, error }); - }, - onError: (error) => { - console.error('Transaction error', error); - }, - onSuccess: (data) => { - console.log('Transaction success', data); - }, - }); - console.log('Transaction hash:', hash); + // const value = await prepareTransactionRequest(config.getClient(), { + // to: '0x2bD2201BFE156A71EB0D02837172ffc237218505'.toLowerCase() as `0x${string}`, + // value: 1n, + // // chain: client?.chain, + // }); + + // console.log('Prepared transaction value:', value); + + // const hash = await sendTransactionAsync(value, { + // onSettled: (data, error) => { + // console.log('Transaction settled', { data, error }); + // }, + // onError: (error) => { + // console.error('Transaction error', error); + // }, + // onSuccess: (data) => { + // console.log('Transaction success', data); + // }, + // }); + // console.log('Transaction hash:', hash); } catch (e) { console.error('Error confirming transaction', e); return; @@ -141,22 +210,40 @@ const TxList = () => { } }; - const isPending = isPreparing || isSending || isReceiptPending; + const isPending = + isPreparing || + isSending || + isSigning || + isSigningTypedData || + (pendingTxHash && isReceiptPending) || + currentTx?.state === txStates.pending; + + const confirmLabel = useMemo(() => { + if (currentTx) { + if (isMessageRequest(currentTx!)) { + return 'Sign Message'; + } else if (isTransactionRequest(currentTx!)) { + return 'Send Transaction'; + } else if (isTypedDataRequest(currentTx!)) { + return 'Sign Typed Data'; + } + } + return 'Confirm'; + }, [currentTx]); return ( <> - Transaction Dialog + On-chain interaction required Confirm and submit your transactions - {items.map((tx) => ( - + {items.map((tx, index) => ( + ))}

chainId: {chainId}

-

next chainId: {nextTx?.req.chainId}

{!isConnected &&

Please connect your wallet.

} @@ -170,10 +257,14 @@ const TxList = () => { - {chainId && nextTx?.req?.chainId && chainId !== nextTx?.req.chainId ? ( + {chainId && + requiredChainId !== undefined && + chainId !== requiredChainId ? ( )} @@ -192,13 +283,27 @@ const TxList = () => { ); }; -const TransactionItem: FC<{ item: SdkTransactionRequest }> = ({ item }) => { +const TransactionItem: FC<{ item: SlayerTx; index: number }> = ({ + item, + index, +}) => { return ( -
-

{item.title}

-

{item.description}

- {/*
{JSON.stringify(item.req)}
*/} - {/*
{JSON.stringify(item.res)}
*/} +
+
+
+ {item.state === txStates.idle && } + {item.state === txStates.pending && ( + + )} + {item.state === txStates.success && } + {item.state === txStates.error && } +
#{index + 1}
+
+
+
+

{item.title}

+

{item.description}

+
); }; diff --git a/apps/web-app/src/lib/transactions/store.ts b/apps/web-app/src/lib/transactions/store.ts index d3e4161..507623f 100644 --- a/apps/web-app/src/lib/transactions/store.ts +++ b/apps/web-app/src/lib/transactions/store.ts @@ -1,8 +1,22 @@ import type { SdkTransactionRequest } from 'node_modules/@sovryn/slayer-sdk/src/lib/transaction'; +import type { TransactionReceipt } from 'viem'; import { createStore } from 'zustand'; import { combine } from 'zustand/middleware'; -export type SlayerTx = SdkTransactionRequest & { res: unknown }; +export const txStates = { + idle: 'idle', + pending: 'pending', + success: 'success', + error: 'error', +} as const; + +export type TxState = (typeof txStates)[keyof typeof txStates]; + +export type SlayerTx = SdkTransactionRequest & { + state: TxState; + res: Partial | undefined; + error?: Error; +}; type State = { isFetching: boolean; @@ -13,6 +27,12 @@ type State = { type Actions = { setIsFetching: (isFetching: boolean) => void; setItems: (items: SdkTransactionRequest[]) => void; + updateItemState: (id: string, state: TxState) => void; + updateItem: ( + id: string, + state: TxState, + res: Partial | undefined, + ) => void; reset: () => void; }; @@ -33,6 +53,24 @@ export const txStore = createStore( isFetching: false, isReady: true, }), + updateItemState: (id: string, state: TxState) => + set((store) => ({ + items: store.items.map((item) => + item.id === id ? { ...item, state } : item, + ), + })), + updateItem: ( + id: string, + status: TxState, + res: Partial | undefined, + ) => + set((state) => ({ + items: state.items.map((item) => + item.id === id + ? { ...item, state: status, res, error: undefined } + : item, + ), + })), reset: () => set({ isFetching: false, @@ -45,5 +83,6 @@ export const txStore = createStore( const toTx = (item: SdkTransactionRequest): SlayerTx => ({ ...item, + state: txStates.idle, res: undefined, }); diff --git a/eslint.config.mjs b/eslint.config.mjs index 7b3b32c..c5c8965 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -29,6 +29,7 @@ export default [ }, ], '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-explicit-any': 'off', 'no-constant-binary-expression': 'off', }, }, diff --git a/nx.json b/nx.json index 4c993a0..8d4164f 100644 --- a/nx.json +++ b/nx.json @@ -3,7 +3,7 @@ "targetDefaults": { "dev": { "continuous": true, - "dependsOn": ["^watch-deps", "^dev"] + "dependsOn": ["^watch-deps", "^build-deps", "^dev"] }, "serve": { "continuous": true, diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 34dfa27..9f0b8ca 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -1,4 +1,5 @@ export * from './constants.js'; export * from './lib/context.js'; export * from './lib/sdk.js'; +export * from './lib/transaction.js'; export * from './types.js'; diff --git a/packages/sdk/src/lib/helpers.ts b/packages/sdk/src/lib/helpers.ts index e965db9..a288502 100644 --- a/packages/sdk/src/lib/helpers.ts +++ b/packages/sdk/src/lib/helpers.ts @@ -1,3 +1,4 @@ +import { Account, Address } from 'viem'; import { DEFAULT_PAGE_LIMIT } from '../constants.js'; import { SdkPaginatedQuery } from '../types.js'; @@ -14,3 +15,9 @@ export const buildQuery = (params: QueryParams = {}) => { search: params.search ?? undefined, }; }; + +export const toAddress = (address: Address | Account): Address => + (typeof address === 'string' + ? address + : address.address + ).toLowerCase() as Address; diff --git a/packages/sdk/src/lib/transaction.ts b/packages/sdk/src/lib/transaction.ts index efd440c..8868f75 100644 --- a/packages/sdk/src/lib/transaction.ts +++ b/packages/sdk/src/lib/transaction.ts @@ -7,8 +7,8 @@ import type { } from 'viem'; export interface SdkTransactionRequest< - chain extends Chain = Chain, - account extends Account = Account, + chain extends Chain = any, + account extends Account = any, > { // A unique identifier for the transaction request id: string; @@ -21,8 +21,8 @@ export interface SdkTransactionRequest< } export type SdkRequest< - chain extends Chain = Chain, - account extends Account = Account, + chain extends Chain = any, + account extends Account = any, > = | { type: 'message'; @@ -36,3 +36,75 @@ export type SdkRequest< type: 'transaction'; data: SignTransactionParameters; }; + +export function isTransactionRequest< + chain extends Chain = any, + account extends Account = any, +>( + tx: SdkTransactionRequest, +): tx is SdkTransactionRequest & { + request: { + type: 'transaction'; + data: SignTransactionParameters; + }; +} { + return tx.request.type === 'transaction'; +} + +export function isMessageRequest< + chain extends Chain = any, + account extends Account = any, +>( + tx: SdkTransactionRequest, +): tx is SdkTransactionRequest & { + request: { + type: 'message'; + data: SignMessageParameters; + }; +} { + return tx.request.type === 'message'; +} + +export function isTypedDataRequest< + chain extends Chain = any, + account extends Account = any, +>( + tx: SdkTransactionRequest, +): tx is SdkTransactionRequest & { + request: { + type: 'typed_data'; + data: SignTypedDataParameters; + }; +} { + return tx.request.type === 'typed_data'; +} + +export function makeTransactionRequest< + chain extends Chain = any, + account extends Account = any, +>(tx: SignTransactionParameters): SdkRequest { + return { + type: 'transaction', + data: tx, + }; +} + +export function makeMessageRequest< + chain extends Chain = any, + account extends Account = any, +>(msg: SignMessageParameters): SdkRequest { + return { + type: 'message', + data: msg, + }; +} + +export function makeTypedDataRequest< + chain extends Chain = any, + account extends Account = any, +>(typedData: SignTypedDataParameters): SdkRequest { + return { + type: 'typed_data', + data: typedData, + }; +} diff --git a/packages/sdk/src/managers/money-market.manager.ts b/packages/sdk/src/managers/money-market.manager.ts index 2974626..ed142b5 100644 --- a/packages/sdk/src/managers/money-market.manager.ts +++ b/packages/sdk/src/managers/money-market.manager.ts @@ -1,8 +1,13 @@ import { Decimal } from '@sovryn/slayer-shared'; -import { Account, zeroAddress, type Chain } from 'viem'; +import { Account, encodeFunctionData, zeroAddress, type Chain } from 'viem'; import { BaseClient, type SdkRequestOptions } from '../lib/context.js'; -import { buildQuery } from '../lib/helpers.js'; -import { SdkRequest, SdkTransactionRequest } from '../lib/transaction.js'; +import { buildQuery, toAddress } from '../lib/helpers.js'; +import { + makeMessageRequest, + makeTransactionRequest, + makeTypedDataRequest, + SdkTransactionRequest, +} from '../lib/transaction.js'; import { BorrowRateMode, MoneyMarketPool, @@ -66,8 +71,6 @@ export class MoneyMarketManager extends BaseClient { ): Promise[]> { const pool = await this.getPoolInfo(); - console.log('Borrowing from pool:', pool); - if (asset.isNative || asset.address.toLowerCase() === zeroAddress) { return [ // @@ -75,35 +78,77 @@ export class MoneyMarketManager extends BaseClient { } return [ + // testing purpose signatures + { + id: 'sign-message', + title: 'Agree to Terms', + description: `Agree to the money market borrowing terms and conditions`, + request: makeMessageRequest({ + message: `I agree to borrow ${amount.toString()} ${asset.symbol} from the Money Market according to the terms and conditions.`, + account: opts.account, + }), + }, + // testing purpose signatures + { + id: 'sign-typed-data', + title: 'Accept Interest Rate', + description: `Accept the current interest rate for borrowing ${asset.symbol}`, + request: makeTypedDataRequest({ + domain: { + name: 'Ether Mail', + version: '1', + chainId: this.ctx.publicClient.chain.id, + verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC', + }, + types: { + Person: [ + { name: 'name', type: 'string' }, + { name: 'wallet', type: 'address' }, + ], + Mail: [ + { name: 'from', type: 'Person' }, + { name: 'to', type: 'Person' }, + { name: 'contents', type: 'string' }, + ], + }, + primaryType: 'Mail', + message: { + from: { + name: 'Cow', + wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826', + }, + to: { + name: 'Bob', + wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB', + }, + contents: 'Hello, Bob!', + }, + account: opts.account, + }), + }, + // todo: doesn't actually works { id: 'borrow', title: 'Borrow Asset', description: `Borrowing ${amount.toString()} ${asset.symbol} from Money Market`, - request: { - type: 'transaction', - data: { - to: pool.data.pool, - value: 0n, - chain: this.ctx.publicClient.chain, - chainId: this.ctx.publicClient.chain.id, - data: '0x', - }, - } as unknown as SdkRequest, - - // account: opts.account, - // abi: poolAbi, - // address: pool.data.pool, - // functionName: 'borrow', - // value: 0n, - // chain: this.ctx.publicClient.chain, - // args: [ - // asset.address, - // amount.toBigInt(), - // rateMode, - // 0, // referralCode - // String(opts.account).toLowerCase(), - // ], + request: makeTransactionRequest({ + to: pool.data.pool, + value: 0n, + chain: this.ctx.publicClient.chain, + account: opts.account, + data: encodeFunctionData({ + abi: poolAbi, + functionName: 'borrow', + args: [ + asset.address, + amount.toBigInt(), + rateMode, + 0, // referralCode + toAddress(opts.account), + ], + }), + }), }, - ] satisfies SdkTransactionRequest[]; + ]; } } diff --git a/packages/sdk/src/types.ts b/packages/sdk/src/types.ts index 29f9de5..ba972e9 100644 --- a/packages/sdk/src/types.ts +++ b/packages/sdk/src/types.ts @@ -43,7 +43,10 @@ export interface MoneyMarketPool { addressProvider: Address; } -export enum BorrowRateMode { - stable = 1, - variable = 2, -} +export const borrowRateModes = { + stable: 1n, + variable: 2n, +} as const; + +export type BorrowRateMode = + (typeof borrowRateModes)[keyof typeof borrowRateModes]; From eb69817702743ff8f7bc90b54e75099cb6738692 Mon Sep 17 00:00:00 2001 From: Rytis Grincevicius Date: Thu, 6 Nov 2025 10:51:33 +0200 Subject: [PATCH 3/8] chore: transaction confirmation flow --- apps/web-app/package.json | 32 +- apps/web-app/public/locales/en/common.json | 6 +- apps/web-app/public/locales/en/tx.json | 10 + apps/web-app/src/@types/i18next.d.ts | 2 + .../TransactionDialog/TransactionDialog.tsx | 301 ++-- apps/web-app/src/lib/transactions/store.ts | 9 +- .../sdk/src/managers/money-market.manager.ts | 99 +- pnpm-lock.yaml | 1207 +++++++++++++++-- 8 files changed, 1432 insertions(+), 234 deletions(-) create mode 100644 apps/web-app/public/locales/en/tx.json diff --git a/apps/web-app/package.json b/apps/web-app/package.json index b0307fd..53c9262 100644 --- a/apps/web-app/package.json +++ b/apps/web-app/package.json @@ -3,24 +3,24 @@ "private": true, "type": "module", "dependencies": { - "@i18next-selector/vite-plugin": "^0.0.18", + "@i18next-selector/vite-plugin": "0.0.18", "@privy-io/react-auth": "3.0.1", "@privy-io/wagmi": "2.0.0", - "@radix-ui/react-checkbox": "^1.3.3", - "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.16", + "@radix-ui/react-checkbox": "1.3.3", + "@radix-ui/react-collapsible": "1.1.12", + "@radix-ui/react-dialog": "1.1.15", + "@radix-ui/react-dropdown-menu": "2.1.16", "@radix-ui/react-label": "2.1.7", "@radix-ui/react-select": "2.2.6", "@radix-ui/react-slider": "1.3.6", "@radix-ui/react-slot": "1.2.3", "@radix-ui/react-switch": "1.2.6", - "@radix-ui/react-tabs": "^1.1.13", - "@radix-ui/react-tooltip": "^1.2.8", + "@radix-ui/react-tabs": "1.1.13", + "@radix-ui/react-tooltip": "1.2.8", "@sovryn/slayer-sdk": "workspace:*", "@sovryn/slayer-shared": "workspace:*", "@tailwindcss/vite": "4.1.13", - "@tanstack/devtools-vite": "^0.3.3", + "@tanstack/devtools-vite": "0.3.3", "@tanstack/react-devtools": "0.7.0", "@tanstack/react-form": "1.23.0", "@tanstack/react-query": "5.90.2", @@ -30,11 +30,11 @@ "@tanstack/router-plugin": "1.131.50", "class-variance-authority": "0.7.1", "clsx": "2.1.1", - "debug": "^4.4.3", + "debug": "4.4.3", "envalid": "8.1.0", - "i18next": "^25.5.2", - "i18next-browser-languagedetector": "^8.2.0", - "i18next-http-backend": "^3.0.2", + "i18next": "25.5.2", + "i18next-browser-languagedetector": "8.2.0", + "i18next-http-backend": "3.0.2", "immer": "^10.2.0", "lucide-react": "0.544.0", "next-themes": "^0.4.6", @@ -46,11 +46,11 @@ "tailwind-merge": "3.3.1", "tailwindcss": "4.1.13", "tw-animate-css": "1.3.8", - "use-sync-external-store": "^1.6.0", - "viem": "2.37.8", - "wagmi": "2.17.2", + "use-sync-external-store": "1.6.0", + "viem": "2.38.6", + "wagmi": "2.19.2", "zod": "4.1.11", - "zustand": "^5.0.8" + "zustand": "5.0.8" }, "devDependencies": { "@types/debug": "^4.1.12", diff --git a/apps/web-app/public/locales/en/common.json b/apps/web-app/public/locales/en/common.json index 4359588..ac7cf82 100644 --- a/apps/web-app/public/locales/en/common.json +++ b/apps/web-app/public/locales/en/common.json @@ -1,5 +1,9 @@ { "accept": "Accept", "cancel": "Cancel", - "close": "Close" + "close": "Close", + "confirm": "Confirm", + "continue": "Continue", + "abort": "Abort", + "loading": "Loading..." } diff --git a/apps/web-app/public/locales/en/tx.json b/apps/web-app/public/locales/en/tx.json new file mode 100644 index 0000000..5fb412a --- /dev/null +++ b/apps/web-app/public/locales/en/tx.json @@ -0,0 +1,10 @@ +{ + "title": "Transaction Confirmation", + "description": "Please review and confirm transactions in your wallet", + "preparing": "Preparing transaction...", + "connectWallet": "Connect your wallet to proceed.", + "switchNetwork": "Switch to {{name}} network", + "signMessage": "Sign Message", + "signTypedData": "Sign Typed Data", + "sendTransaction": "Send Transaction" +} diff --git a/apps/web-app/src/@types/i18next.d.ts b/apps/web-app/src/@types/i18next.d.ts index 41141d0..4d75bb1 100644 --- a/apps/web-app/src/@types/i18next.d.ts +++ b/apps/web-app/src/@types/i18next.d.ts @@ -1,5 +1,6 @@ import type { resources as common } from 'public/locales/en/common'; import type { resources as glossary } from 'public/locales/en/glossary'; +import type { resources as tx } from 'public/locales/en/tx'; import type { resources as validation } from 'public/locales/en/validation'; import { defaultNS } from '../i18n'; @@ -11,6 +12,7 @@ declare module 'i18next' { common: typeof common; glossary: typeof glossary; validation: typeof validation; + tx: typeof tx; }; } } diff --git a/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx b/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx index f5e3551..cb67db7 100644 --- a/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx +++ b/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx @@ -9,12 +9,17 @@ import { CircleCheckBig, CircleDashed, CircleX, + ExternalLink, Loader2Icon, } from 'lucide-react'; -import { useMemo, useState, type FC } from 'react'; +import { useEffect, useMemo, useState, type FC } from 'react'; +import { useTranslation } from 'react-i18next'; import { toast } from 'sonner'; +import { prepareTransactionRequest } from 'viem/actions'; import { useAccount, + useChains, + useConfig, useSendTransaction, useSignMessage, useSignTypedData, @@ -35,6 +40,8 @@ import { } from '../ui/dialog'; export const TransactionDialogProvider = () => { + const { t } = useTranslation('tx'); + const [isOpen, isReady] = useStoreWithEqualityFn( txStore, (state) => [state.isFetching || state.isReady, state.isReady] as const, @@ -66,14 +73,12 @@ export const TransactionDialogProvider = () => { ) : ( <> - Transaction in progress - - Please do not close this window. - + {t(($) => $.title)} + {t(($) => $.description)}
-

Preparing transaction...

+

{t(($) => $.preparing)}

)} @@ -83,49 +88,57 @@ export const TransactionDialogProvider = () => { }; const TxList = () => { + const { t } = useTranslation(['tx', 'common']); const [isPreparing, setIsPreparing] = useState(false); const { switchChain } = useSwitchChain(); - const { isConnected, chainId, connector } = useAccount(); + const config = useConfig(); + const { isConnected, chainId } = useAccount(); const items = useStoreWithEqualityFn(txStore, (state) => state.items); const updateItem = useStore(txStore, (state) => state.updateItem); const updateItemState = useStore(txStore, (state) => state.updateItemState); + const setItemError = useStore(txStore, (state) => state.setItemError); - const currentTx = useMemo(() => items.find((t) => !t.res), [items]); + const currentTx = useMemo( + () => items.find((t) => t.state !== txStates.success), + [items], + ); - const requiredChainId = useMemo(() => { + const currentChain = useMemo( + () => config.chains.find((c) => c.id === chainId), + [chainId, config.chains], + ); + const requiredChain = useMemo(() => { + let id: number | undefined = undefined; if (currentTx && isTransactionRequest(currentTx)) { - return currentTx.request.data.chain?.id; + id = currentTx.request.data.chain?.id; } if (currentTx && isTypedDataRequest(currentTx)) { - return currentTx.request.data.domain?.chainId + id = currentTx.request.data.domain?.chainId ? Number(currentTx.request.data.domain.chainId) : undefined; } - return undefined; + return id !== undefined + ? config.chains.find((c) => c.id === id) + : undefined; }, [currentTx]); - const { - sendTransactionAsync, - data: pendingTxHash, - error, - isPending: isSending, - } = useSendTransaction(); - const { signMessage, isPending: isSigning } = useSignMessage({ mutation: { onError(error) { + const msg = handleErrorMessage(error); + toast.error(msg); console.error('Message signing error', error); - updateItem(currentTx?.id || '', txStates.error, undefined); - toast.error(`Message signing failed: ${error.message}`); + if (!currentTx) return; + setItemError(currentTx.id, msg); }, onSuccess(data) { - updateItem(currentTx?.id || '', txStates.success, { + if (!currentTx) return; + updateItem(currentTx.id, txStates.success, { transactionHash: data, }); - console.log('Message signed successfully', data); toast.success('Message signed successfully'); }, }, @@ -134,77 +147,118 @@ const TxList = () => { const { signTypedData, isPending: isSigningTypedData } = useSignTypedData({ mutation: { onError(error) { + const msg = handleErrorMessage(error); console.error('Typed Data signing error', error); - updateItem(currentTx?.id || '', txStates.error, undefined); - toast.error(`Typed Data signing failed: ${error.message}`); + toast.error(msg); + if (!currentTx) return; + setItemError(currentTx?.id || '', msg); }, onSuccess(data) { + if (!currentTx) return; updateItem(currentTx?.id || '', txStates.success, { transactionHash: data, }); - console.log('Typed Data signed successfully', data); toast.success('Typed Data signed successfully'); }, }, }); + const { + sendTransaction, + data: pendingTxHash, + isPending: isSending, + } = useSendTransaction({ + mutation: { + onSettled(data, error) { + if (!currentTx) return; + if (data) { + updateItem(currentTx.id, txStates.pending, { + transactionHash: data, + }); + toast.success('Transaction is broadcasted'); + } else if (error) { + console.log({ + msg: error.message, + cause: error.cause, + name: error.name, + stack: error.stack, + }); + const msg = handleErrorMessage(error); + console.error('Transaction sending error', error); + setItemError(currentTx.id, msg); + toast.error(msg); + } + }, + }, + }); + const { data: receipt, - isFetching, - isPending: isReceiptPending, + status: receiptStatus, + isLoading: isReceiptPending, } = useWaitForTransactionReceipt({ - hash: pendingTxHash, + chainId: + currentTx && isTransactionRequest(currentTx) + ? (currentTx.request.data.chain?.id as any) + : undefined, + hash: + currentTx && isTransactionRequest(currentTx) + ? currentTx.res?.transactionHash + : undefined, onReplaced: (tx) => { - console.log('Transaction replaced', tx); + if (!currentTx) return; + if (tx.reason === 'cancelled') { + updateItemState(currentTx.id, txStates.idle); + toast.error('Transaction was cancelled'); + return; + } + updateItem( + currentTx.id, + tx.transactionReceipt.status === 'success' + ? txStates.success + : txStates.error, + tx.transactionReceipt, + ); }, }); + useEffect(() => { + if (!currentTx || !receipt) return; + if (receiptStatus === 'success') { + updateItem(currentTx.id, txStates.success, receipt); + } else if (receiptStatus === 'error') { + updateItem(currentTx.id, txStates.error, receipt); + setItemError( + currentTx.id, + `Transaction failed with status: ${receipt.status}`, + ); + } + }, [currentTx, receipt, receiptStatus]); + const handleConfirm = async () => { const tx = items.find((t) => !t.res); if (!tx) return; try { - console.log('Confirming tx', tx); setIsPreparing(true); updateItemState(tx.id, txStates.pending); if (isMessageRequest(tx)) { - // Handle message request - console.log('Signing message', tx.request.data); signMessage(tx.request.data); } else if (isTypedDataRequest(tx)) { - // Handle typed data request - console.log('Signing typed data', tx.request.data); signTypedData(tx.request.data); } else if (isTransactionRequest(tx)) { - // Handle transaction request - console.log('Sending transaction', tx.request.data); + const prepared = await prepareTransactionRequest( + config.getClient(), + tx.request.data, + ); + sendTransaction(prepared); } else { throw new Error('Unknown transaction request type'); } - - // const value = await prepareTransactionRequest(config.getClient(), { - // to: '0x2bD2201BFE156A71EB0D02837172ffc237218505'.toLowerCase() as `0x${string}`, - // value: 1n, - // // chain: client?.chain, - // }); - - // console.log('Prepared transaction value:', value); - - // const hash = await sendTransactionAsync(value, { - // onSettled: (data, error) => { - // console.log('Transaction settled', { data, error }); - // }, - // onError: (error) => { - // console.error('Transaction error', error); - // }, - // onSuccess: (data) => { - // console.log('Transaction success', data); - // }, - // }); - // console.log('Transaction hash:', hash); } catch (e) { + setItemError(tx.id, handleErrorMessage(e)); + toast.error(handleErrorMessage(e)); console.error('Error confirming transaction', e); - return; } finally { setIsPreparing(false); } @@ -221,62 +275,69 @@ const TxList = () => { const confirmLabel = useMemo(() => { if (currentTx) { if (isMessageRequest(currentTx!)) { - return 'Sign Message'; + return t(($) => $.signMessage, { ns: 'tx' }); } else if (isTransactionRequest(currentTx!)) { - return 'Send Transaction'; + return t(($) => $.sendTransaction, { ns: 'tx' }); } else if (isTypedDataRequest(currentTx!)) { - return 'Sign Typed Data'; + return t(($) => $.signTypedData, { ns: 'tx' }); } } - return 'Confirm'; + return t(($) => $.confirm, { ns: 'common' }); }, [currentTx]); return ( <> - On-chain interaction required + {t(($) => $.title, { ns: 'tx' })} - Confirm and submit your transactions + {t(($) => $.description, { ns: 'tx' })} {items.map((tx, index) => ( ))} -

chainId: {chainId}

- - {!isConnected &&

Please connect your wallet.

} - -

data: {pendingTxHash}

-

error: {error?.message}

- -

receipt: {JSON.stringify(receipt)}

+ {!isConnected &&

{t(($) => $.connectWallet)}

} - + - {chainId && - requiredChainId !== undefined && - chainId !== requiredChainId ? ( - - ) : ( - + {currentTx && ( + <> + {chainId && + requiredChain !== undefined && + currentChain?.id !== requiredChain?.id ? ( + + ) : ( + + )} + )} @@ -287,6 +348,16 @@ const TransactionItem: FC<{ item: SlayerTx; index: number }> = ({ item, index, }) => { + const isTx = isTransactionRequest(item); + const chains = useChains(); + const chain = useMemo(() => { + if (isTx) { + const chainId = item.request.data.chain?.id; + return chains.find((c) => c.id === chainId); + } + return undefined; + }, [chains, isTx, item.request.data]); + return (
@@ -295,15 +366,53 @@ const TransactionItem: FC<{ item: SlayerTx; index: number }> = ({ {item.state === txStates.pending && ( )} - {item.state === txStates.success && } - {item.state === txStates.error && } + {item.state === txStates.success && ( + + )} + {item.state === txStates.error && ( + + )}
#{index + 1}

{item.title}

{item.description}

+ {isTx && chain && item.res?.transactionHash && ( +

+ + {item.res.transactionHash.slice(0, 6)} + ...{item.res.transactionHash.slice(-4)} + +

+ )} + + {item.error && ( +

{item.error}

+ )}
); }; + +function handleErrorMessage(error: unknown): string { + if (error instanceof Error) { + if (error.cause) { + const cause: any = error.cause; + return ( + cause.details?.detail ?? + cause.details ?? + cause.shortMessage ?? + error.message ?? + 'An unknown error occurred' + ); + } + return error.message || 'An unknown error occurred'; + } + return 'An unknown error occurred'; +} diff --git a/apps/web-app/src/lib/transactions/store.ts b/apps/web-app/src/lib/transactions/store.ts index 507623f..90e6ece 100644 --- a/apps/web-app/src/lib/transactions/store.ts +++ b/apps/web-app/src/lib/transactions/store.ts @@ -15,7 +15,7 @@ export type TxState = (typeof txStates)[keyof typeof txStates]; export type SlayerTx = SdkTransactionRequest & { state: TxState; res: Partial | undefined; - error?: Error; + error?: string; }; type State = { @@ -33,6 +33,7 @@ type Actions = { state: TxState, res: Partial | undefined, ) => void; + setItemError: (id: string, error: string) => void; reset: () => void; }; @@ -71,6 +72,12 @@ export const txStore = createStore( : item, ), })), + setItemError: (id: string, error: string) => + set((state) => ({ + items: state.items.map((item) => + item.id === id ? { ...item, state: txStates.error, error } : item, + ), + })), reset: () => set({ isFetching: false, diff --git a/packages/sdk/src/managers/money-market.manager.ts b/packages/sdk/src/managers/money-market.manager.ts index ed142b5..af658a7 100644 --- a/packages/sdk/src/managers/money-market.manager.ts +++ b/packages/sdk/src/managers/money-market.manager.ts @@ -1,5 +1,5 @@ import { Decimal } from '@sovryn/slayer-shared'; -import { Account, encodeFunctionData, zeroAddress, type Chain } from 'viem'; +import { Account, zeroAddress, type Chain } from 'viem'; import { BaseClient, type SdkRequestOptions } from '../lib/context.js'; import { buildQuery, toAddress } from '../lib/helpers.js'; import { @@ -18,31 +18,31 @@ import { TransactionOpts, } from '../types.js'; -const poolAbi = [ - { - type: 'function', - name: 'borrow', - stateMutability: 'nonpayable', - inputs: [ - { type: 'address', name: 'asset' }, - { type: 'uint256', name: 'amount' }, - { type: 'uint256', name: 'interestRateMode' }, - { type: 'uint16', name: 'referralCode' }, - { type: 'address', name: 'onBehalfOf' }, - ], - outputs: [], - }, - { - type: 'function', - name: 'swapBorrowRateMode', - stateMutability: 'nonpayable', - inputs: [ - { type: 'address', name: 'asset' }, - { type: 'uint256', name: 'rateMode' }, - ], - outputs: [], - }, -] as const; +// const poolAbi = [ +// { +// type: 'function', +// name: 'borrow', +// stateMutability: 'nonpayable', +// inputs: [ +// { type: 'address', name: 'asset' }, +// { type: 'uint256', name: 'amount' }, +// { type: 'uint256', name: 'interestRateMode' }, +// { type: 'uint16', name: 'referralCode' }, +// { type: 'address', name: 'onBehalfOf' }, +// ], +// outputs: [], +// }, +// { +// type: 'function', +// name: 'swapBorrowRateMode', +// stateMutability: 'nonpayable', +// inputs: [ +// { type: 'address', name: 'asset' }, +// { type: 'uint256', name: 'rateMode' }, +// ], +// outputs: [], +// }, +// ] as const; export class MoneyMarketManager extends BaseClient { listReserves(opts: SdkRequestOptions = {}) { @@ -69,7 +69,7 @@ export class MoneyMarketManager extends BaseClient { rateMode: BorrowRateMode, opts: TransactionOpts, ): Promise[]> { - const pool = await this.getPoolInfo(); + // const pool = await this.getPoolInfo(); if (asset.isNative || asset.address.toLowerCase() === zeroAddress) { return [ @@ -126,29 +126,40 @@ export class MoneyMarketManager extends BaseClient { account: opts.account, }), }, - // todo: doesn't actually works + // todo: test tx { - id: 'borrow', - title: 'Borrow Asset', - description: `Borrowing ${amount.toString()} ${asset.symbol} from Money Market`, + id: 'borrow-1', + title: 'TEST: send 1 wei', + description: `Sending 1 wei to self as a test transaction`, request: makeTransactionRequest({ - to: pool.data.pool, - value: 0n, + to: toAddress(opts.account), + value: 1n, chain: this.ctx.publicClient.chain, account: opts.account, - data: encodeFunctionData({ - abi: poolAbi, - functionName: 'borrow', - args: [ - asset.address, - amount.toBigInt(), - rateMode, - 0, // referralCode - toAddress(opts.account), - ], - }), }), }, + // { + // id: 'borrow-2', + // title: 'Borrow Asset', + // description: `Borrowing ${amount.toString()} ${asset.symbol} from Money Market`, + // request: makeTransactionRequest({ + // to: pool.data.pool, + // value: 0n, + // chain: this.ctx.publicClient.chain, + // account: opts.account, + // data: encodeFunctionData({ + // abi: poolAbi, + // functionName: 'borrow', + // args: [ + // asset.address, + // amount.toBigInt(), + // rateMode, + // 0, // referralCode + // toAddress(opts.account), + // ], + // }), + // }), + // }, ]; } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index caad892..c39f7b5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -238,25 +238,25 @@ importers: apps/web-app: dependencies: '@i18next-selector/vite-plugin': - specifier: ^0.0.18 + specifier: 0.0.18 version: 0.0.18(vite@7.1.7(@types/node@20.19.9)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) '@privy-io/react-auth': specifier: 3.0.1 - version: 3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) + version: 3.0.1(@solana-program/system@0.8.1(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))))(@solana-program/token@0.6.0(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))))(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) '@privy-io/wagmi': specifier: 2.0.0 - version: 2.0.0(@privy-io/react-auth@3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11))(react@19.1.1)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)) + version: 2.0.0(aa00d93f89864799f5a8366bea17b807) '@radix-ui/react-checkbox': - specifier: ^1.3.3 + specifier: 1.3.3 version: 1.3.3(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-collapsible': - specifier: ^1.1.12 + specifier: 1.1.12 version: 1.1.12(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-dialog': - specifier: ^1.1.15 + specifier: 1.1.15 version: 1.1.15(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-dropdown-menu': - specifier: ^2.1.16 + specifier: 2.1.16 version: 2.1.16(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-label': specifier: 2.1.7 @@ -274,10 +274,10 @@ importers: specifier: 1.2.6 version: 1.2.6(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-tabs': - specifier: ^1.1.13 + specifier: 1.1.13 version: 1.1.13(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@radix-ui/react-tooltip': - specifier: ^1.2.8 + specifier: 1.2.8 version: 1.2.8(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@sovryn/slayer-sdk': specifier: workspace:* @@ -289,7 +289,7 @@ importers: specifier: 4.1.13 version: 4.1.13(vite@7.1.7(@types/node@20.19.9)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) '@tanstack/devtools-vite': - specifier: ^0.3.3 + specifier: 0.3.3 version: 0.3.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)(vite@7.1.7(@types/node@20.19.9)(jiti@2.5.1)(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1)) '@tanstack/react-devtools': specifier: 0.7.0 @@ -319,19 +319,19 @@ importers: specifier: 2.1.1 version: 2.1.1 debug: - specifier: ^4.4.3 + specifier: 4.4.3 version: 4.4.3 envalid: specifier: 8.1.0 version: 8.1.0 i18next: - specifier: ^25.5.2 + specifier: 25.5.2 version: 25.5.2(typescript@5.9.2) i18next-browser-languagedetector: - specifier: ^8.2.0 + specifier: 8.2.0 version: 8.2.0 i18next-http-backend: - specifier: ^3.0.2 + specifier: 3.0.2 version: 3.0.2(encoding@0.1.13) immer: specifier: ^10.2.0 @@ -367,19 +367,19 @@ importers: specifier: 1.3.8 version: 1.3.8 use-sync-external-store: - specifier: ^1.6.0 + specifier: 1.6.0 version: 1.6.0(react@19.1.1) viem: - specifier: 2.37.8 - version: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + specifier: 2.38.6 + version: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) wagmi: - specifier: 2.17.2 - version: 2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) + specifier: 2.19.2 + version: 2.19.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(debug@4.4.3)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11) zod: specifier: 4.1.11 version: 4.1.11 zustand: - specifier: ^5.0.8 + specifier: 5.0.8 version: 5.0.8(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)) devDependencies: '@types/debug': @@ -1109,6 +1109,9 @@ packages: '@base-org/account@1.1.1': resolution: {integrity: sha512-IfVJPrDPhHfqXRDb89472hXkpvJuQQR7FDI9isLPHEqSYt/45whIoBxSPgZ0ssTt379VhQo4+87PWI1DoLSfAQ==} + '@base-org/account@2.4.0': + resolution: {integrity: sha512-A4Umpi8B9/pqR78D1Yoze4xHyQaujioVRqqO3d6xuDFw9VRtjg6tK3bPlwE0aW+nVH/ntllCpPa2PbI8Rnjcug==} + '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -1130,6 +1133,9 @@ packages: '@bull-board/ui@6.13.0': resolution: {integrity: sha512-63I6b3nZnKWI5ok6mw/Tk2rIObuzMTY/tLGyO51p0GW4rAImdXxrK6mT7j4SgEuP2B+tt/8L1jU7sLu8MMcCNw==} + '@coinbase/cdp-sdk@1.38.5': + resolution: {integrity: sha512-j8mvx1wMox/q2SjB7C09HtdRXVOpGpfkP7nG4+OjdowPj8pmQ03rigzycd86L8mawl6TUPXdm41YSQVmtc8SzQ==} + '@coinbase/wallet-sdk@3.9.3': resolution: {integrity: sha512-N/A2DRIf0Y3PHc1XAMvbBUu4zisna6qAdqABMZwBMNEfWrXpAwx16pZGkYCLGE+Rvv1edbcB2LYDRnACNcmCiw==} @@ -1989,8 +1995,8 @@ packages: '@floating-ui/utils@0.2.10': resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} - '@gemini-wallet/core@0.2.0': - resolution: {integrity: sha512-vv9aozWnKrrPWQ3vIFcWk7yta4hQW1Ie0fsNNPeXnjAxkbXr2hqMagEptLuMxpEP2W3mnRu05VDNKzcvAuuZDw==} + '@gemini-wallet/core@0.3.1': + resolution: {integrity: sha512-XP+/NRAaRV7Adlt6aFxrF/3a0i3qpxFTSVm/dzG+mceXTSgIGOUUT65w69ttLQ/GWEcAEQL/hKoV6PFAJA/DmQ==} peerDependencies: viem: '>=2.0.0' @@ -3664,6 +3670,267 @@ packages: '@socket.io/component-emitter@3.1.2': resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@solana-program/system@0.8.1': + resolution: {integrity: sha512-71U9Mzdpw8HQtfgfJSL5xKZbLMRnza2Llsfk7gGnmg2waqK+o8MMH4YNma8xXS1UmOBptXIiNvoZ3p7cmOVktg==} + peerDependencies: + '@solana/kit': ^3.0 + + '@solana-program/token@0.6.0': + resolution: {integrity: sha512-omkZh4Tt9rre4wzWHNOhOEHyenXQku3xyc/UrKvShexA/Qlhza67q7uRwmwEDUs4QqoDBidSZPooOmepnA/jig==} + peerDependencies: + '@solana/kit': ^3.0 + + '@solana/accounts@3.0.3': + resolution: {integrity: sha512-KqlePrlZaHXfu8YQTCxN204ZuVm9o68CCcUr6l27MG2cuRUtEM1Ta0iR8JFkRUAEfZJC4Cu0ZDjK/v49loXjZQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/addresses@3.0.3': + resolution: {integrity: sha512-AuMwKhJI89ANqiuJ/fawcwxNKkSeHH9CApZd2xelQQLS7X8uxAOovpcmEgiObQuiVP944s9ScGUT62Bdul9qYg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/assertions@3.0.3': + resolution: {integrity: sha512-2qspxdbWp2y62dfCIlqeWQr4g+hE8FYSSwcaP6itwMwGRb8393yDGCJfI/znuzJh6m/XVWhMHIgFgsBwnevCmg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/buffer-layout@4.0.1': + resolution: {integrity: sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==} + engines: {node: '>=5.10'} + + '@solana/codecs-core@2.3.0': + resolution: {integrity: sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-core@3.0.3': + resolution: {integrity: sha512-emKykJ3h1DmnDOY29Uv9eJXP8E/FHzvlUBJ6te+5EbKdFjj7vdlKYPfDxOI6iGdXTY+YC/ELtbNBh6QwF2uEDQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-data-structures@3.0.3': + resolution: {integrity: sha512-R15cLp8riJvToXziW8lP6AMSwsztGhEnwgyGmll32Mo0Yjq+hduW2/fJrA/TJs6tA/OgTzMQjlxgk009EqZHCw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@2.3.0': + resolution: {integrity: sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-numbers@3.0.3': + resolution: {integrity: sha512-pfXkH9J0glrM8qj6389GAn30+cJOxzXLR2FsPOHCUMXrqLhGjMMZAWhsQkpOQ37SGc/7EiQsT/gmyGC7gxHqJQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/codecs-strings@3.0.3': + resolution: {integrity: sha512-VHBXnnTVtcQ1j+7Vrz+qSYo38no+jiHRdGnhFspRXEHNJbllzwKqgBE7YN3qoIXH+MKxgJUcwO5KHmdzf8Wn2A==} + engines: {node: '>=20.18.0'} + peerDependencies: + fastestsmallesttextencoderdecoder: ^1.0.22 + typescript: '>=5.3.3' + + '@solana/codecs@3.0.3': + resolution: {integrity: sha512-GOHwTlIQsCoJx9Ryr6cEf0FHKAQ7pY4aO4xgncAftrv0lveTQ1rPP2inQ1QT0gJllsIa8nwbfXAADs9nNJxQDA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/errors@2.3.0': + resolution: {integrity: sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/errors@3.0.3': + resolution: {integrity: sha512-1l84xJlHNva6io62PcYfUamwWlc0eM95nHgCrKX0g0cLoC6D6QHYPCEbEVkR+C5UtP9JDgyQM8MFiv+Ei5tO9Q==} + engines: {node: '>=20.18.0'} + hasBin: true + peerDependencies: + typescript: '>=5.3.3' + + '@solana/fast-stable-stringify@3.0.3': + resolution: {integrity: sha512-ED0pxB6lSEYvg+vOd5hcuQrgzEDnOrURFgp1ZOY+lQhJkQU6xo+P829NcJZQVP1rdU2/YQPAKJKEseyfe9VMIw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/functional@3.0.3': + resolution: {integrity: sha512-2qX1kKANn8995vOOh5S9AmF4ItGZcfbny0w28Eqy8AFh+GMnSDN4gqpmV2LvxBI9HibXZptGH3RVOMk82h1Mpw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/instruction-plans@3.0.3': + resolution: {integrity: sha512-eqoaPtWtmLTTpdvbt4BZF5H6FIlJtXi9H7qLOM1dLYonkOX2Ncezx5NDCZ9tMb2qxVMF4IocYsQnNSnMfjQF1w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/instructions@3.0.3': + resolution: {integrity: sha512-4csIi8YUDb5j/J+gDzmYtOvq7ZWLbCxj4t0xKn+fPrBk/FD2pK29KVT3Fu7j4Lh1/ojunQUP9X4NHwUexY3PnA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/keys@3.0.3': + resolution: {integrity: sha512-tp8oK9tMadtSIc4vF4aXXWkPd4oU5XPW8nf28NgrGDWGt25fUHIydKjkf2hPtMt9i1WfRyQZ33B5P3dnsNqcPQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/kit@3.0.3': + resolution: {integrity: sha512-CEEhCDmkvztd1zbgADsEQhmj9GyWOOGeW1hZD+gtwbBSF5YN1uofS/pex5MIh/VIqKRj+A2UnYWI1V+9+q/lyQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/nominal-types@3.0.3': + resolution: {integrity: sha512-aZavCiexeUAoMHRQg4s1AHkH3wscbOb70diyfjhwZVgFz1uUsFez7csPp9tNFkNolnadVb2gky7yBk3IImQJ6A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/options@3.0.3': + resolution: {integrity: sha512-jarsmnQ63RN0JPC5j9sgUat07NrL9PC71XU7pUItd6LOHtu4+wJMio3l5mT0DHVfkfbFLL6iI6+QmXSVhTNF3g==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/programs@3.0.3': + resolution: {integrity: sha512-JZlVE3/AeSNDuH3aEzCZoDu8GTXkMpGXxf93zXLzbxfxhiQ/kHrReN4XE/JWZ/uGWbaFZGR5B3UtdN2QsoZL7w==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/promises@3.0.3': + resolution: {integrity: sha512-K+UflGBVxj30XQMHTylHHZJdKH5QG3oj5k2s42GrZ/Wbu72oapVJySMBgpK45+p90t8/LEqV6rRPyTXlet9J+Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-api@3.0.3': + resolution: {integrity: sha512-Yym9/Ama62OY69rAZgbOCAy1QlqaWAyb0VlqFuwSaZV1pkFCCFSwWEJEsiN1n8pb2ZP+RtwNvmYixvWizx9yvA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-parsed-types@3.0.3': + resolution: {integrity: sha512-/koM05IM2fU91kYDQxXil3VBNlOfcP+gXE0js1sdGz8KonGuLsF61CiKB5xt6u1KEXhRyDdXYLjf63JarL4Ozg==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-spec-types@3.0.3': + resolution: {integrity: sha512-A6Jt8SRRetnN3CeGAvGJxigA9zYRslGgWcSjueAZGvPX+MesFxEUjSWZCfl+FogVFvwkqfkgQZQbPAGZQFJQ6Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-spec@3.0.3': + resolution: {integrity: sha512-MZn5/8BebB6MQ4Gstw6zyfWsFAZYAyLzMK+AUf/rSfT8tPmWiJ/mcxnxqOXvFup/l6D67U8pyGpIoFqwCeZqqA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-subscriptions-api@3.0.3': + resolution: {integrity: sha512-MGgVK3PUS15qsjuhimpzGZrKD/CTTvS0mAlQ0Jw84zsr1RJVdQJK/F0igu07BVd172eTZL8d90NoAQ3dahW5pA==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-subscriptions-channel-websocket@3.0.3': + resolution: {integrity: sha512-zUzUlb8Cwnw+SHlsLrSqyBRtOJKGc+FvSNJo/vWAkLShoV0wUDMPv7VvhTngJx3B/3ANfrOZ4i08i9QfYPAvpQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + ws: ^8.18.0 + + '@solana/rpc-subscriptions-spec@3.0.3': + resolution: {integrity: sha512-9KpQ32OBJWS85mn6q3gkM0AjQe1LKYlMU7gpJRrla/lvXxNLhI95tz5K6StctpUreVmRWTVkNamHE69uUQyY8A==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-subscriptions@3.0.3': + resolution: {integrity: sha512-LRvz6NaqvtsYFd32KwZ+rwYQ9XCs+DWjV8BvBLsJpt9/NWSuHf/7Sy/vvP6qtKxut692H/TMvHnC4iulg0WmiQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-transformers@3.0.3': + resolution: {integrity: sha512-lzdaZM/dG3s19Tsk4mkJA5JBoS1eX9DnD7z62gkDwrwJDkDBzkAJT9aLcsYFfTmwTfIp6uU2UPgGYc97i1wezw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-transport-http@3.0.3': + resolution: {integrity: sha512-bIXFwr2LR5A97Z46dI661MJPbHnPfcShBjFzOS/8Rnr8P4ho3j/9EUtjDrsqoxGJT3SLWj5OlyXAlaDAvVTOUQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc-types@3.0.3': + resolution: {integrity: sha512-petWQ5xSny9UfmC3Qp2owyhNU0w9SyBww4+v7tSVyXMcCC9v6j/XsqTeimH1S0qQUllnv0/FY83ohFaxofmZ6Q==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/rpc@3.0.3': + resolution: {integrity: sha512-3oukAaLK78GegkKcm6iNmRnO4mFeNz+BMvA8T56oizoBNKiRVEq/6DFzVX/LkmZ+wvD601pAB3uCdrTPcC0YKQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/signers@3.0.3': + resolution: {integrity: sha512-UwCd/uPYTZiwd283JKVyOWLLN5sIgMBqGDyUmNU3vo9hcmXKv5ZGm/9TvwMY2z35sXWuIOcj7etxJ8OoWc/ObQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/subscribable@3.0.3': + resolution: {integrity: sha512-FJ27LKGHLQ5GGttPvTOLQDLrrOZEgvaJhB7yYaHAhPk25+p+erBaQpjePhfkMyUbL1FQbxn1SUJmS6jUuaPjlQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/sysvars@3.0.3': + resolution: {integrity: sha512-GnHew+QeKCs2f9ow+20swEJMH4mDfJA/QhtPgOPTYQx/z69J4IieYJ7fZenSHnA//lJ45fVdNdmy1trypvPLBQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/transaction-confirmation@3.0.3': + resolution: {integrity: sha512-dXx0OLtR95LMuARgi2dDQlL1QYmk56DOou5q9wKymmeV3JTvfDExeWXnOgjRBBq/dEfj4ugN1aZuTaS18UirFw==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/transaction-messages@3.0.3': + resolution: {integrity: sha512-s+6NWRnBhnnjFWV4x2tzBzoWa6e5LiIxIvJlWwVQBFkc8fMGY04w7jkFh0PM08t/QFKeXBEWkyBDa/TFYdkWug==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/transactions@3.0.3': + resolution: {integrity: sha512-iMX+n9j4ON7H1nKlWEbMqMOpKYC6yVGxKKmWHT1KdLRG7v+03I4DnDeFoI+Zmw56FA+7Bbne8jwwX60Q1vk/MQ==} + engines: {node: '>=20.18.0'} + peerDependencies: + typescript: '>=5.3.3' + + '@solana/web3.js@1.98.4': + resolution: {integrity: sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw==} + '@solid-primitives/event-listener@2.4.3': resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} peerDependencies: @@ -4195,6 +4462,9 @@ packages: '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/d3-array@3.2.2': resolution: {integrity: sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==} @@ -4277,6 +4547,9 @@ packages: '@types/ms@2.1.0': resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + '@types/node@20.19.9': resolution: {integrity: sha512-cuVNgarYWZqxRJDQHEB58GEONhOK79QVR/qYx4S7kcUObQvUwvFnYxJuuHUKm2aieN9X3yZB4LZsuYNU1Qphsw==} @@ -4312,6 +4585,15 @@ packages: '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@types/uuid@8.3.4': + resolution: {integrity: sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==} + + '@types/ws@7.4.7': + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -4524,18 +4806,18 @@ packages: '@vitest/utils@3.2.4': resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} - '@wagmi/connectors@5.10.2': - resolution: {integrity: sha512-qyXO1poEeJtCIuJGDd5FlmqZ9JHXepDxKxoPAptqHampPLastWPnNZTAH616/ITmysRiNQ4AzeSUcbsNE46uyg==} + '@wagmi/connectors@6.1.3': + resolution: {integrity: sha512-Rx3/4Rug3SrBC/WSuNUC0XEpWC/yP71BhQzz3u064ueemIWtvrIxXZxH2byWd0dF3osarjuHBr904bm3L6eNHg==} peerDependencies: - '@wagmi/core': 2.21.1 + '@wagmi/core': 2.22.1 typescript: '>=5.0.4' viem: 2.x peerDependenciesMeta: typescript: optional: true - '@wagmi/core@2.21.1': - resolution: {integrity: sha512-uG0Cujm24acrFYqbi1RGw9MRMLTGVKvyv5OAJT+2pkcasM9PP8eJCzhlvUxK9IYVXXnbaAT8JX/rXEurOSM6mg==} + '@wagmi/core@2.22.1': + resolution: {integrity: sha512-cG/xwQWsBEcKgRTkQVhH29cbpbs/TdcUJVFXCyri3ZknxhMyGv0YEjTcrNpRgt2SaswL1KrvslSNYKKo+5YEAg==} peerDependencies: '@tanstack/query-core': '>=5.0.0' typescript: '>=5.0.4' @@ -4763,6 +5045,17 @@ packages: resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} hasBin: true + abitype@1.0.6: + resolution: {integrity: sha512-MMSqYh4+C/aVqI2RQaWqbvI4Kxo5cQV40WQ4QFtDnNzCkqChm8MuENhElmynZlO0qUy/ObkEUaXtKqYnx1Kp3A==} + peerDependencies: + typescript: '>=5.0.4' + zod: ^3 >=3.22.0 + peerDependenciesMeta: + typescript: + optional: true + zod: + optional: true + abitype@1.0.8: resolution: {integrity: sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg==} peerDependencies: @@ -4828,6 +5121,10 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + agentkeepalive@4.6.0: + resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} + engines: {node: '>= 8.0.0'} + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -5019,6 +5316,11 @@ packages: resolution: {integrity: sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==} engines: {node: '>=4'} + axios-retry@4.5.0: + resolution: {integrity: sha512-aR99oXhpEDGo0UuAlYcn2iGRds30k366Zfa05XWScR9QaQD4JYiP3/1Qt1u7YlefUOK+cn0CcwoL1oefavQUlQ==} + peerDependencies: + axios: 0.x || 1.x + axios@1.12.2: resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} @@ -5101,6 +5403,9 @@ packages: bare-events@2.7.0: resolution: {integrity: sha512-b3N5eTW1g7vXkw+0CXh/HazGTcO5KYuu/RCNaJbDMPI6LHDi+7qe8EmxKUVe1sUbY2KZOVZFyj62x0OEz9qyAA==} + base-x@3.0.11: + resolution: {integrity: sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA==} + base-x@4.0.1: resolution: {integrity: sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw==} @@ -5161,6 +5466,9 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + borsh@0.7.0: + resolution: {integrity: sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==} + bowser@2.12.1: resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} @@ -5205,6 +5513,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bs58@4.0.1: + resolution: {integrity: sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==} + bs58@5.0.0: resolution: {integrity: sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==} @@ -5424,6 +5735,14 @@ packages: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} + commander@14.0.0: + resolution: {integrity: sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==} + 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==} @@ -5843,6 +6162,10 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + delay@5.0.0: + resolution: {integrity: sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==} + engines: {node: '>=10'} + delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} @@ -6205,6 +6528,12 @@ packages: es-toolkit@1.39.3: resolution: {integrity: sha512-Qb/TCFCldgOy8lZ5uC7nLGdqJwSabkQiYQShmw4jyiPk1pZzaYWTwaYKYP7EgLccWYgZocMrtItrwh683voaww==} + es6-promise@4.2.8: + resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==} + + es6-promisify@5.0.0: + resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==} + esbuild-register@3.6.0: resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} peerDependencies: @@ -6456,6 +6785,10 @@ packages: resolution: {integrity: sha512-an2S5quJMiy5bnZKEf6AkfH/7r8CzHvhchU40gxN+OM6HPhe7Z9T1FUychcf2M9PpPOO0Hf7BAEfJkw2TDIBDw==} engines: {node: '>=12.0.0'} + eyes@0.1.8: + resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} + engines: {node: '> 0.1.90'} + fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} @@ -6494,9 +6827,15 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-stable-stringify@1.0.0: + resolution: {integrity: sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==} + fast-uri@3.1.0: resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastestsmallesttextencoderdecoder@1.0.22: + resolution: {integrity: sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==} + fastify-plugin@5.0.1: resolution: {integrity: sha512-HCxs+YnRaWzCl+cWRYFnHmeRFyR5GVnJTAaCJQiYzQSDwK9MgJdyAsuL3nh0EWRCYMgQ5MeziymvmAhUHYHDUQ==} @@ -6875,6 +7214,10 @@ packages: resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} engines: {node: '>=0.10.0'} + hono@4.10.4: + resolution: {integrity: sha512-YG/fo7zlU3KwrBL5vDpWKisLYiM+nVstBQqfr7gCPbSYURnNEP9BDxEMz8KfsDR9JX0lJWDRNc6nXX31v7ZEyg==} + engines: {node: '>=16.9.0'} + hosted-git-info@7.0.2: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} @@ -6940,6 +7283,9 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + i18next-browser-languagedetector@8.2.0: resolution: {integrity: sha512-P+3zEKLnOF0qmiesW383vsLdtQVyKtCNA9cjSoKCppTKPQVfKd2W8hbVo5ZhNJKDqeM7BOcvNoKJOjpHh4Js9g==} @@ -7179,6 +7525,10 @@ packages: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} + is-retry-allowed@2.2.0: + resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==} + engines: {node: '>=10'} + is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -7251,6 +7601,11 @@ packages: resolution: {integrity: sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==} engines: {node: '>=10'} + isomorphic-ws@4.0.1: + resolution: {integrity: sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==} + peerDependencies: + ws: '*' + isomorphic-ws@5.0.0: resolution: {integrity: sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==} peerDependencies: @@ -7302,6 +7657,11 @@ packages: engines: {node: '>=10'} hasBin: true + jayson@4.2.0: + resolution: {integrity: sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg==} + engines: {node: '>=8'} + hasBin: true + jest-circus@30.1.3: resolution: {integrity: sha512-Yf3dnhRON2GJT4RYzM89t/EXIWNxKTpWTL9BfF3+geFetWP4XSvJjiU1vrWplOiUkmq8cHLiwuhz+XuUp9DscA==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -7421,6 +7781,9 @@ packages: jose@4.15.9: resolution: {integrity: sha512-1vUQX+IdDMVPj4k8kOxgUqlcK518yluMuGZwqlr44FS1ppZB/5GWh4rZG89erpOBOJjU/OBsnCVFfapsRz6nEA==} + jose@6.1.0: + resolution: {integrity: sha512-TTQJyoEoKcC1lscpVDCSsVgYzUDg/0Bt3WE//WiTPK6uOCQC2KZS4MpugbMWt/zyjkopgZoXhZuCi00gLudfUA==} + joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} @@ -7494,6 +7857,9 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -8433,6 +8799,38 @@ packages: resolution: {integrity: sha512-rEwq/ZHlJIKw++XtLAO8PPuOQA/zaPJOZJ37BVuN97nLpMJeuDVLVGRwbFoBgLudgdTMP2hdRJP++H+8QOA3vg==} engines: {node: '>= 10.12'} + porto@0.2.35: + resolution: {integrity: sha512-gu9FfjjvvYBgQXUHWTp6n3wkTxVtEcqFotM7i3GEZeoQbvLGbssAicCz6hFZ8+xggrJWwi/RLmbwNra50SMmUQ==} + hasBin: true + peerDependencies: + '@tanstack/react-query': '>=5.59.0' + '@wagmi/core': '>=2.16.3' + expo-auth-session: '>=7.0.8' + expo-crypto: '>=15.0.7' + expo-web-browser: '>=15.0.8' + react: '>=18' + react-native: '>=0.81.4' + typescript: '>=5.4.0' + viem: '>=2.37.0' + wagmi: '>=2.0.0' + peerDependenciesMeta: + '@tanstack/react-query': + optional: true + expo-auth-session: + optional: true + expo-crypto: + optional: true + expo-web-browser: + optional: true + react: + optional: true + react-native: + optional: true + typescript: + optional: true + wagmi: + optional: true + possible-typed-array-names@1.1.0: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} @@ -9118,6 +9516,9 @@ packages: engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true + rpc-websockets@9.3.1: + resolution: {integrity: sha512-bY6a+i/lEtBJ/mUxwsCTgevoV1P0foXTVA7UoThzaIWbM+3NDqorf8NBWs5DmqKTFeA1IoNzgvkWjFCPgnzUiQ==} + rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} @@ -9421,9 +9822,15 @@ packages: stream-browserify@3.0.0: resolution: {integrity: sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==} + stream-chain@2.2.5: + resolution: {integrity: sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==} + stream-http@3.2.0: resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} + stream-json@1.9.1: + resolution: {integrity: sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==} + stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} @@ -9555,6 +9962,10 @@ packages: resolution: {integrity: sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==} engines: {node: '>=14.0.0'} + superstruct@2.0.2: + resolution: {integrity: sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==} + engines: {node: '>=14.0.0'} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -9651,6 +10062,9 @@ packages: text-decoder@1.2.3: resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + text-encoding-utf-8@1.0.2: + resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + thenify-all@1.6.0: resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} engines: {node: '>=0.8'} @@ -9908,6 +10322,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + undici-types@7.16.0: + resolution: {integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==} + unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} @@ -10148,6 +10565,14 @@ packages: typescript: optional: true + viem@2.38.6: + resolution: {integrity: sha512-aqO6P52LPXRjdnP6rl5Buab65sYa4cZ6Cpn+k4OLOzVJhGIK8onTVoKMFMT04YjDfyDICa/DZyV9HmvLDgcjkw==} + peerDependencies: + typescript: '>=5.0.4' + peerDependenciesMeta: + typescript: + optional: true + vite-node@3.2.4: resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -10325,8 +10750,8 @@ packages: resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} engines: {node: '>=18'} - wagmi@2.17.2: - resolution: {integrity: sha512-r5yf2Nwzs469aT066tsGAuRt38z4RpQ2YZ09Kaxhd8q0IhLvw0aWBBgzXXbPqcGNEAJHtHAkXzum3wkqoHLgmA==} + wagmi@2.19.2: + resolution: {integrity: sha512-UN8CQKNsUgQD2Lr2ybjAi07ZKq1SV4T/Pb9IN77t3oSXANr9C9tI3mijLNyINeA5ET4hJxIny3C2dWJ48zrFiA==} peerDependencies: '@tanstack/react-query': '>=5.0.0' react: '>=18' @@ -11507,7 +11932,7 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@base-org/account@1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': + '@base-org/account@1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': dependencies: '@noble/hashes': 1.4.0 clsx: 1.2.1 @@ -11515,8 +11940,8 @@ snapshots: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.2)(zod@4.1.11) preact: 10.24.2 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - zustand: 5.0.3(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + zustand: 5.0.3(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)) transitivePeerDependencies: - '@types/react' - bufferutil @@ -11527,24 +11952,29 @@ snapshots: - utf-8-validate - zod - '@base-org/account@1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': + '@base-org/account@2.4.0(@types/react@19.1.13)(bufferutil@4.0.9)(debug@4.4.3)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11)': dependencies: + '@coinbase/cdp-sdk': 1.38.5(bufferutil@4.0.9)(debug@4.4.3)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) '@noble/hashes': 1.4.0 clsx: 1.2.1 eventemitter3: 5.0.1 idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.2)(zod@4.1.11) preact: 10.24.2 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - zustand: 5.0.3(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + zustand: 5.0.3(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) transitivePeerDependencies: - '@types/react' - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder - immer - react - typescript - use-sync-external-store - utf-8-validate + - ws - zod '@bcoe/v8-coverage@0.2.3': {} @@ -11570,6 +12000,29 @@ snapshots: dependencies: '@bull-board/api': 6.13.0(@bull-board/ui@6.13.0) + '@coinbase/cdp-sdk@1.38.5(bufferutil@4.0.9)(debug@4.4.3)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana-program/system': 0.8.1(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana-program/token': 0.6.0(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana/kit': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/web3.js': 1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10) + abitype: 1.0.6(typescript@5.9.2)(zod@3.25.76) + axios: 1.12.2(debug@4.4.3) + axios-retry: 4.5.0(axios@1.12.2(debug@4.4.3)) + jose: 6.1.0 + md5: 2.3.0 + uncrypto: 0.1.3 + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + zod: 3.25.76 + transitivePeerDependencies: + - bufferutil + - debug + - encoding + - fastestsmallesttextencoderdecoder + - typescript + - utf-8-validate + - ws + '@coinbase/wallet-sdk@3.9.3': dependencies: bn.js: 5.2.2 @@ -11599,7 +12052,7 @@ snapshots: idb-keyval: 6.2.1 ox: 0.6.9(typescript@5.9.2)(zod@4.1.11) preact: 10.24.2 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) zustand: 5.0.3(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) transitivePeerDependencies: - '@types/react' @@ -12317,11 +12770,11 @@ snapshots: '@floating-ui/utils@0.2.10': {} - '@gemini-wallet/core@0.2.0(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))': + '@gemini-wallet/core@0.3.1(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))': dependencies: '@metamask/rpc-errors': 7.0.2 eventemitter3: 5.0.1 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) transitivePeerDependencies: - supports-color @@ -12867,7 +13320,7 @@ snapshots: '@module-federation/third-party-dts-extractor': 0.18.4 adm-zip: 0.5.16 ansi-colors: 4.1.3 - axios: 1.12.2 + axios: 1.12.2(debug@4.4.3) chalk: 3.0.0 fs-extra: 9.1.0 isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -12892,7 +13345,7 @@ snapshots: '@module-federation/third-party-dts-extractor': 0.19.1 adm-zip: 0.5.16 ansi-colors: 4.1.3 - axios: 1.12.2 + axios: 1.12.2(debug@4.4.3) chalk: 3.0.0 fs-extra: 9.1.0 isomorphic-ws: 5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)) @@ -13722,11 +14175,11 @@ snapshots: '@privy-io/chains@0.0.2': {} - '@privy-io/ethereum@0.0.2(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))': + '@privy-io/ethereum@0.0.2(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))': dependencies: - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - '@privy-io/js-sdk-core@0.55.2(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))': + '@privy-io/js-sdk-core@0.55.2(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))': dependencies: '@ethersproject/abstract-signer': 5.8.0 '@ethersproject/bignumber': 5.8.0 @@ -13746,7 +14199,7 @@ snapshots: set-cookie-parser: 2.7.1 uuid: 9.0.1 optionalDependencies: - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) transitivePeerDependencies: - bufferutil - typescript @@ -13757,14 +14210,14 @@ snapshots: '@privy-io/api-base': 1.7.0 bs58: 5.0.0 libphonenumber-js: 1.12.17 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76) zod: 3.25.76 transitivePeerDependencies: - bufferutil - typescript - utf-8-validate - '@privy-io/react-auth@3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': + '@privy-io/react-auth@3.0.1(@solana-program/system@0.8.1(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))))(@solana-program/token@0.6.0(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))))(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11)': dependencies: '@base-org/account': 1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) '@coinbase/wallet-sdk': 4.3.2 @@ -13775,8 +14228,8 @@ snapshots: '@metamask/eth-sig-util': 6.0.2 '@privy-io/api-base': 1.7.0 '@privy-io/chains': 0.0.2 - '@privy-io/ethereum': 0.0.2(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) - '@privy-io/js-sdk-core': 0.55.2(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@privy-io/ethereum': 0.0.2(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@privy-io/js-sdk-core': 0.55.2(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) '@privy-io/public-api': 2.45.2(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@scure/base': 1.2.6 '@simplewebauthn/browser': 9.0.1 @@ -13805,8 +14258,12 @@ snapshots: stylis: 4.3.6 tinycolor2: 1.6.0 uuid: 9.0.1 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) zustand: 5.0.8(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)) + optionalDependencies: + '@solana-program/system': 0.8.1(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana-program/token': 0.6.0(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))) + '@solana/kit': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -13836,12 +14293,12 @@ snapshots: - utf-8-validate - zod - '@privy-io/wagmi@2.0.0(@privy-io/react-auth@3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11))(react@19.1.1)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11))': + '@privy-io/wagmi@2.0.0(aa00d93f89864799f5a8366bea17b807)': dependencies: - '@privy-io/react-auth': 3.0.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) + '@privy-io/react-auth': 3.0.1(@solana-program/system@0.8.1(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))))(@solana-program/token@0.6.0(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))))(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(ioredis@5.8.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) react: 19.1.1 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - wagmi: 2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + wagmi: 2.19.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(debug@4.4.3)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11) '@radix-ui/number@1.1.1': {} @@ -14327,7 +14784,7 @@ snapshots: dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4) transitivePeerDependencies: - bufferutil - typescript @@ -14338,7 +14795,7 @@ snapshots: dependencies: big.js: 6.2.2 dayjs: 1.11.13 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) transitivePeerDependencies: - bufferutil - typescript @@ -14351,7 +14808,7 @@ snapshots: '@reown/appkit-wallet': 1.7.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10) '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(encoding@0.1.13)(ioredis@5.8.0)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) valtio: 1.13.2(@types/react@19.1.13)(react@19.1.1) - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -14501,7 +14958,7 @@ snapshots: '@walletconnect/logger': 2.1.2 '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(encoding@0.1.13)(ioredis@5.8.0)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) valtio: 1.13.2(@types/react@19.1.13)(react@19.1.1) - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -14555,7 +15012,7 @@ snapshots: '@walletconnect/universal-provider': 2.21.0(bufferutil@4.0.9)(encoding@0.1.13)(ioredis@5.8.0)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) bs58: 6.0.0 valtio: 1.13.2(@types/react@19.1.13)(react@19.1.1) - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -14792,7 +15249,7 @@ snapshots: '@safe-global/safe-apps-sdk@9.1.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)': dependencies: '@safe-global/safe-gateway-typescript-sdk': 3.23.1 - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) transitivePeerDependencies: - bufferutil - typescript @@ -14858,6 +15315,422 @@ snapshots: '@socket.io/component-emitter@3.1.2': {} + '@solana-program/system@0.8.1(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + dependencies: + '@solana/kit': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + + '@solana-program/token@0.6.0(@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)))': + dependencies: + '@solana/kit': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + + '@solana/accounts@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/rpc-spec': 3.0.3(typescript@5.9.2) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/addresses@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/assertions': 3.0.3(typescript@5.9.2) + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/nominal-types': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/assertions@3.0.3(typescript@5.9.2)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + + '@solana/buffer-layout@4.0.1': + dependencies: + buffer: 6.0.3 + + '@solana/codecs-core@2.3.0(typescript@5.9.2)': + dependencies: + '@solana/errors': 2.3.0(typescript@5.9.2) + typescript: 5.9.2 + + '@solana/codecs-core@3.0.3(typescript@5.9.2)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + + '@solana/codecs-data-structures@3.0.3(typescript@5.9.2)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/codecs-numbers': 3.0.3(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + + '@solana/codecs-numbers@2.3.0(typescript@5.9.2)': + dependencies: + '@solana/codecs-core': 2.3.0(typescript@5.9.2) + '@solana/errors': 2.3.0(typescript@5.9.2) + typescript: 5.9.2 + + '@solana/codecs-numbers@3.0.3(typescript@5.9.2)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + + '@solana/codecs-strings@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/codecs-numbers': 3.0.3(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + fastestsmallesttextencoderdecoder: 1.0.22 + typescript: 5.9.2 + + '@solana/codecs@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/codecs-data-structures': 3.0.3(typescript@5.9.2) + '@solana/codecs-numbers': 3.0.3(typescript@5.9.2) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/options': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/errors@2.3.0(typescript@5.9.2)': + dependencies: + chalk: 5.6.2 + commander: 14.0.2 + typescript: 5.9.2 + + '@solana/errors@3.0.3(typescript@5.9.2)': + dependencies: + chalk: 5.6.2 + commander: 14.0.0 + typescript: 5.9.2 + + '@solana/fast-stable-stringify@3.0.3(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@solana/functional@3.0.3(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@solana/instruction-plans@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/instructions': 3.0.3(typescript@5.9.2) + '@solana/promises': 3.0.3(typescript@5.9.2) + '@solana/transaction-messages': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/transactions': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/instructions@3.0.3(typescript@5.9.2)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + + '@solana/keys@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/assertions': 3.0.3(typescript@5.9.2) + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/nominal-types': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/kit@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/accounts': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/codecs': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/functional': 3.0.3(typescript@5.9.2) + '@solana/instruction-plans': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/instructions': 3.0.3(typescript@5.9.2) + '@solana/keys': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/programs': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/rpc': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/rpc-parsed-types': 3.0.3(typescript@5.9.2) + '@solana/rpc-spec-types': 3.0.3(typescript@5.9.2) + '@solana/rpc-subscriptions': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/signers': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/sysvars': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/transaction-confirmation': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/transaction-messages': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/transactions': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/nominal-types@3.0.3(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@solana/options@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/codecs-data-structures': 3.0.3(typescript@5.9.2) + '@solana/codecs-numbers': 3.0.3(typescript@5.9.2) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/programs@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/promises@3.0.3(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@solana/rpc-api@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/keys': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/rpc-parsed-types': 3.0.3(typescript@5.9.2) + '@solana/rpc-spec': 3.0.3(typescript@5.9.2) + '@solana/rpc-transformers': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/transaction-messages': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/transactions': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-parsed-types@3.0.3(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@solana/rpc-spec-types@3.0.3(typescript@5.9.2)': + dependencies: + typescript: 5.9.2 + + '@solana/rpc-spec@3.0.3(typescript@5.9.2)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/rpc-spec-types': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + + '@solana/rpc-subscriptions-api@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/keys': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/rpc-subscriptions-spec': 3.0.3(typescript@5.9.2) + '@solana/rpc-transformers': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/transaction-messages': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/transactions': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-subscriptions-channel-websocket@3.0.3(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/functional': 3.0.3(typescript@5.9.2) + '@solana/rpc-subscriptions-spec': 3.0.3(typescript@5.9.2) + '@solana/subscribable': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + + '@solana/rpc-subscriptions-spec@3.0.3(typescript@5.9.2)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/promises': 3.0.3(typescript@5.9.2) + '@solana/rpc-spec-types': 3.0.3(typescript@5.9.2) + '@solana/subscribable': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + + '@solana/rpc-subscriptions@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/fast-stable-stringify': 3.0.3(typescript@5.9.2) + '@solana/functional': 3.0.3(typescript@5.9.2) + '@solana/promises': 3.0.3(typescript@5.9.2) + '@solana/rpc-spec-types': 3.0.3(typescript@5.9.2) + '@solana/rpc-subscriptions-api': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/rpc-subscriptions-channel-websocket': 3.0.3(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/rpc-subscriptions-spec': 3.0.3(typescript@5.9.2) + '@solana/rpc-transformers': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/subscribable': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/rpc-transformers@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/functional': 3.0.3(typescript@5.9.2) + '@solana/nominal-types': 3.0.3(typescript@5.9.2) + '@solana/rpc-spec-types': 3.0.3(typescript@5.9.2) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc-transport-http@3.0.3(typescript@5.9.2)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/rpc-spec': 3.0.3(typescript@5.9.2) + '@solana/rpc-spec-types': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + undici-types: 7.16.0 + + '@solana/rpc-types@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/codecs-numbers': 3.0.3(typescript@5.9.2) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/nominal-types': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/rpc@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/fast-stable-stringify': 3.0.3(typescript@5.9.2) + '@solana/functional': 3.0.3(typescript@5.9.2) + '@solana/rpc-api': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/rpc-spec': 3.0.3(typescript@5.9.2) + '@solana/rpc-spec-types': 3.0.3(typescript@5.9.2) + '@solana/rpc-transformers': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/rpc-transport-http': 3.0.3(typescript@5.9.2) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/signers@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/instructions': 3.0.3(typescript@5.9.2) + '@solana/keys': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/nominal-types': 3.0.3(typescript@5.9.2) + '@solana/transaction-messages': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/transactions': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/subscribable@3.0.3(typescript@5.9.2)': + dependencies: + '@solana/errors': 3.0.3(typescript@5.9.2) + typescript: 5.9.2 + + '@solana/sysvars@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/accounts': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/codecs': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transaction-confirmation@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/keys': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/promises': 3.0.3(typescript@5.9.2) + '@solana/rpc': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/rpc-subscriptions': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/transaction-messages': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/transactions': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + - ws + + '@solana/transaction-messages@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/codecs-data-structures': 3.0.3(typescript@5.9.2) + '@solana/codecs-numbers': 3.0.3(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/functional': 3.0.3(typescript@5.9.2) + '@solana/instructions': 3.0.3(typescript@5.9.2) + '@solana/nominal-types': 3.0.3(typescript@5.9.2) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/transactions@3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2)': + dependencies: + '@solana/addresses': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/codecs-core': 3.0.3(typescript@5.9.2) + '@solana/codecs-data-structures': 3.0.3(typescript@5.9.2) + '@solana/codecs-numbers': 3.0.3(typescript@5.9.2) + '@solana/codecs-strings': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/errors': 3.0.3(typescript@5.9.2) + '@solana/functional': 3.0.3(typescript@5.9.2) + '@solana/instructions': 3.0.3(typescript@5.9.2) + '@solana/keys': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/nominal-types': 3.0.3(typescript@5.9.2) + '@solana/rpc-types': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + '@solana/transaction-messages': 3.0.3(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.9.2) + typescript: 5.9.2 + transitivePeerDependencies: + - fastestsmallesttextencoderdecoder + + '@solana/web3.js@1.98.4(bufferutil@4.0.9)(encoding@0.1.13)(typescript@5.9.2)(utf-8-validate@5.0.10)': + dependencies: + '@babel/runtime': 7.28.4 + '@noble/curves': 1.9.7 + '@noble/hashes': 1.8.0 + '@solana/buffer-layout': 4.0.1 + '@solana/codecs-numbers': 2.3.0(typescript@5.9.2) + agentkeepalive: 4.6.0 + bn.js: 5.2.2 + borsh: 0.7.0 + bs58: 4.0.1 + buffer: 6.0.3 + fast-stable-stringify: 1.0.0 + jayson: 4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) + node-fetch: 2.7.0(encoding@0.1.13) + rpc-websockets: 9.3.1 + superstruct: 2.0.2 + transitivePeerDependencies: + - bufferutil + - encoding + - typescript + - utf-8-validate + '@solid-primitives/event-listener@2.4.3(solid-js@1.9.9)': dependencies: '@solid-primitives/utils': 6.3.2(solid-js@1.9.9) @@ -15434,6 +16307,10 @@ snapshots: dependencies: '@types/deep-eql': 4.0.2 + '@types/connect@3.4.38': + dependencies: + '@types/node': 20.19.9 + '@types/d3-array@3.2.2': {} '@types/d3-color@3.1.3': {} @@ -15515,6 +16392,8 @@ snapshots: '@types/ms@2.1.0': {} + '@types/node@12.20.55': {} + '@types/node@20.19.9': dependencies: undici-types: 6.21.0 @@ -15547,6 +16426,16 @@ snapshots: '@types/use-sync-external-store@0.0.6': {} + '@types/uuid@8.3.4': {} + + '@types/ws@7.4.7': + dependencies: + '@types/node': 20.19.9 + + '@types/ws@8.18.1': + dependencies: + '@types/node': 20.19.9 + '@types/yargs-parser@21.0.3': {} '@types/yargs@17.0.33': @@ -15791,7 +16680,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.4.38)(utf-8-validate@5.0.10))(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.4)(jiti@2.5.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.4.38)(utf-8-validate@5.0.10))(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) '@vitest/utils@3.2.4': dependencies: @@ -15799,18 +16688,19 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - '@wagmi/connectors@5.10.2(@types/react@19.1.13)(@wagmi/core@2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11)': + '@wagmi/connectors@6.1.3(e2df5ec3edd1d01c0c5b6685ed869aa8)': dependencies: - '@base-org/account': 1.1.1(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) + '@base-org/account': 2.4.0(@types/react@19.1.13)(bufferutil@4.0.9)(debug@4.4.3)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11) '@coinbase/wallet-sdk': 4.3.6(@types/react@19.1.13)(bufferutil@4.0.9)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(zod@4.1.11) - '@gemini-wallet/core': 0.2.0(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@gemini-wallet/core': 0.3.1(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) '@metamask/sdk': 0.33.1(bufferutil@4.0.9)(encoding@0.1.13)(utf-8-validate@5.0.10) '@safe-global/safe-apps-provider': 0.18.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) '@safe-global/safe-apps-sdk': 9.1.0(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) - '@wagmi/core': 2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) '@walletconnect/ethereum-provider': 2.21.1(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) cbw-sdk: '@coinbase/wallet-sdk@3.9.3' - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + porto: 0.2.35(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.19.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(debug@4.4.3)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11)) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -15825,6 +16715,7 @@ snapshots: - '@netlify/blobs' - '@planetscale/database' - '@react-native-async-storage/async-storage' + - '@tanstack/react-query' - '@types/react' - '@upstash/redis' - '@vercel/blob' @@ -15833,21 +16724,29 @@ snapshots: - aws4fetch - bufferutil - db0 + - debug - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder - immer - ioredis - react + - react-native - supports-color - uploadthing - use-sync-external-store - utf-8-validate + - wagmi + - ws - zod - '@wagmi/core@2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))': + '@wagmi/core@2.22.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))': dependencies: eventemitter3: 5.0.1 mipd: 0.0.7(typescript@5.9.2) - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) zustand: 5.0.0(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)) optionalDependencies: '@tanstack/query-core': 5.90.2 @@ -16818,6 +17717,11 @@ snapshots: dependencies: argparse: 2.0.1 + abitype@1.0.6(typescript@5.9.2)(zod@3.25.76): + optionalDependencies: + typescript: 5.9.2 + zod: 3.25.76 + abitype@1.0.8(typescript@5.9.2)(zod@4.1.11): optionalDependencies: typescript: 5.9.2 @@ -16869,6 +17773,10 @@ snapshots: agent-base@7.1.4: {} + agentkeepalive@4.6.0: + dependencies: + humanize-ms: 1.2.1 + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -17073,7 +17981,12 @@ snapshots: axe-core@4.10.3: {} - axios@1.12.2: + axios-retry@4.5.0(axios@1.12.2(debug@4.4.3)): + dependencies: + axios: 1.12.2(debug@4.4.3) + is-retry-allowed: 2.2.0 + + axios@1.12.2(debug@4.4.3): dependencies: follow-redirects: 1.15.11(debug@4.4.3) form-data: 4.0.4 @@ -17199,6 +18112,10 @@ snapshots: bare-events@2.7.0: optional: true + base-x@3.0.11: + dependencies: + safe-buffer: 5.2.1 + base-x@4.0.1: {} base-x@5.0.1: {} @@ -17265,6 +18182,12 @@ snapshots: boolbase@1.0.0: {} + borsh@0.7.0: + dependencies: + bn.js: 5.2.2 + bs58: 4.0.1 + text-encoding-utf-8: 1.0.2 + bowser@2.12.1: {} brace-expansion@1.1.12: @@ -17339,6 +18262,10 @@ snapshots: node-releases: 2.0.21 update-browserslist-db: 1.1.3(browserslist@4.26.2) + bs58@4.0.1: + dependencies: + base-x: 3.0.11 + bs58@5.0.0: dependencies: base-x: 4.0.1 @@ -17553,6 +18480,10 @@ snapshots: commander@11.1.0: {} + commander@14.0.0: {} + + commander@14.0.2: {} + commander@2.20.3: {} commander@4.1.1: {} @@ -17973,6 +18904,8 @@ snapshots: defu@6.1.4: {} + delay@5.0.0: {} + delayed-stream@1.0.0: {} delegates@1.0.0: {} @@ -18310,6 +19243,12 @@ snapshots: es-toolkit@1.39.3: {} + es6-promise@4.2.8: {} + + es6-promisify@5.0.0: + dependencies: + es6-promise: 4.2.8 + esbuild-register@3.6.0(esbuild@0.25.0): dependencies: debug: 4.4.3 @@ -18763,6 +19702,8 @@ snapshots: readable-stream: 4.7.0 webextension-polyfill: 0.10.0 + eyes@0.1.8: {} + fast-copy@3.0.2: {} fast-decode-uri-component@1.0.1: {} @@ -18802,8 +19743,12 @@ snapshots: fast-safe-stringify@2.1.1: {} + fast-stable-stringify@1.0.0: {} + fast-uri@3.1.0: {} + fastestsmallesttextencoderdecoder@1.0.22: {} + fastify-plugin@5.0.1: {} fastify-type-provider-zod@6.0.0(@fastify/swagger@9.5.1)(fastify@5.6.1)(openapi-types@12.1.3)(zod@4.1.11): @@ -19245,6 +20190,8 @@ snapshots: dependencies: parse-passwd: 1.0.0 + hono@4.10.4: {} + hosted-git-info@7.0.2: dependencies: lru-cache: 10.4.3 @@ -19347,6 +20294,10 @@ snapshots: human-signals@2.1.0: {} + humanize-ms@1.2.1: + dependencies: + ms: 2.1.3 + i18next-browser-languagedetector@8.2.0: dependencies: '@babel/runtime': 7.28.4 @@ -19568,6 +20519,8 @@ snapshots: has-tostringtag: 1.0.2 hasown: 2.0.2 + is-retry-allowed@2.2.0: {} + is-set@2.0.3: {} is-shared-array-buffer@1.0.4: @@ -19628,6 +20581,10 @@ snapshots: isomorphic-timers-promises@1.0.1: {} + isomorphic-ws@4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)): + dependencies: + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + isomorphic-ws@5.0.0(ws@8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10)): dependencies: ws: 8.18.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) @@ -19700,6 +20657,24 @@ snapshots: filelist: 1.0.4 picocolors: 1.1.1 + jayson@4.2.0(bufferutil@4.0.9)(utf-8-validate@5.0.10): + dependencies: + '@types/connect': 3.4.38 + '@types/node': 12.20.55 + '@types/ws': 7.4.7 + commander: 2.20.3 + delay: 5.0.0 + es6-promisify: 5.0.0 + eyes: 0.1.8 + isomorphic-ws: 4.0.1(ws@7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + json-stringify-safe: 5.0.1 + stream-json: 1.9.1 + uuid: 8.3.2 + ws: 7.5.10(bufferutil@4.0.9)(utf-8-validate@5.0.10) + transitivePeerDependencies: + - bufferutil + - utf-8-validate + jest-circus@30.1.3(babel-plugin-macros@3.1.0): dependencies: '@jest/environment': 30.1.2 @@ -19982,6 +20957,8 @@ snapshots: jose@4.15.9: {} + jose@6.1.0: {} + joycon@3.1.1: {} js-cookie@3.0.5: {} @@ -20062,6 +21039,8 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} + json-stringify-safe@5.0.1: {} + json5@1.0.2: dependencies: minimist: 1.2.8 @@ -20600,7 +21579,7 @@ snapshots: '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.2 '@zkochan/js-yaml': 0.0.7 - axios: 1.12.2 + axios: 1.12.2(debug@4.4.3) chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -21109,6 +22088,26 @@ snapshots: transitivePeerDependencies: - supports-color + porto@0.2.35(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(@wagmi/core@2.22.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(wagmi@2.19.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(debug@4.4.3)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11)): + dependencies: + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + hono: 4.10.4 + idb-keyval: 6.2.2 + mipd: 0.0.7(typescript@5.9.2) + ox: 0.9.6(typescript@5.9.2)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + zod: 4.1.11 + zustand: 5.0.8(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)) + optionalDependencies: + '@tanstack/react-query': 5.90.2(react@19.1.1) + react: 19.1.1 + typescript: 5.9.2 + wagmi: 2.19.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(debug@4.4.3)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11) + transitivePeerDependencies: + - '@types/react' + - immer + - use-sync-external-store + possible-typed-array-names@1.1.0: {} postcss-calc@8.2.4(postcss@8.4.38): @@ -21820,6 +22819,19 @@ snapshots: '@rollup/rollup-win32-x64-msvc': 4.50.2 fsevents: 2.3.3 + rpc-websockets@9.3.1: + dependencies: + '@swc/helpers': 0.5.17 + '@types/uuid': 8.3.4 + '@types/ws': 8.18.1 + buffer: 6.0.3 + eventemitter3: 5.0.1 + uuid: 8.3.2 + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + bufferutil: 4.0.9 + utf-8-validate: 5.0.10 + rrweb-cssom@0.8.0: {} rslog@1.2.11: {} @@ -22142,6 +23154,8 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 + stream-chain@2.2.5: {} + stream-http@3.2.0: dependencies: builtin-status-codes: 3.0.0 @@ -22149,6 +23163,10 @@ snapshots: readable-stream: 3.6.2 xtend: 4.0.2 + stream-json@1.9.1: + dependencies: + stream-chain: 2.2.5 + stream-shift@1.0.3: {} streamroller@3.1.5: @@ -22320,6 +23338,8 @@ snapshots: superstruct@1.0.4: {} + superstruct@2.0.2: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -22462,6 +23482,8 @@ snapshots: transitivePeerDependencies: - react-native-b4a + text-encoding-utf-8@1.0.2: {} + thenify-all@1.6.0: dependencies: thenify: 3.3.1 @@ -22720,6 +23742,8 @@ snapshots: undici-types@6.21.0: {} + undici-types@7.16.0: {} + unicode-canonical-property-names-ecmascript@2.0.1: {} unicode-match-property-ecmascript@2.0.0: @@ -22928,7 +23952,24 @@ snapshots: - utf-8-validate - zod - viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4): + viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11): + dependencies: + '@noble/curves': 1.9.1 + '@noble/hashes': 1.8.0 + '@scure/bip32': 1.7.0 + '@scure/bip39': 1.6.0 + abitype: 1.1.0(typescript@5.9.2)(zod@4.1.11) + isows: 1.0.7(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10)) + ox: 0.9.6(typescript@5.9.2)(zod@4.1.11) + ws: 8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10) + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + - zod + + viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.22.4): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -22945,7 +23986,7 @@ snapshots: - utf-8-validate - zod - viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): + viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@3.25.76): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -22962,7 +24003,7 @@ snapshots: - utf-8-validate - zod - viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11): + viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 @@ -23221,14 +24262,14 @@ snapshots: dependencies: xml-name-validator: 5.0.0 - wagmi@2.17.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11): + wagmi@2.19.2(@tanstack/query-core@5.90.2)(@tanstack/react-query@5.90.2(react@19.1.1))(@types/react@19.1.13)(bufferutil@4.0.9)(debug@4.4.3)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(utf-8-validate@5.0.10)(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(ws@8.18.3(bufferutil@4.0.9)(utf-8-validate@5.0.10))(zod@4.1.11): dependencies: '@tanstack/react-query': 5.90.2(react@19.1.1) - '@wagmi/connectors': 5.10.2(@types/react@19.1.13)(@wagmi/core@2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)))(bufferutil@4.0.9)(encoding@0.1.13)(immer@10.2.0)(ioredis@5.8.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.4.0(react@19.1.1))(utf-8-validate@5.0.10)(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11))(zod@4.1.11) - '@wagmi/core': 2.21.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(viem@2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) + '@wagmi/connectors': 6.1.3(e2df5ec3edd1d01c0c5b6685ed869aa8) + '@wagmi/core': 2.22.1(@tanstack/query-core@5.90.2)(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.6.0(react@19.1.1))(viem@2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11)) react: 19.1.1 use-sync-external-store: 1.4.0(react@19.1.1) - viem: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + viem: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: @@ -23252,12 +24293,19 @@ snapshots: - aws4fetch - bufferutil - db0 + - debug - encoding + - expo-auth-session + - expo-crypto + - expo-web-browser + - fastestsmallesttextencoderdecoder - immer - ioredis + - react-native - supports-color - uploadthing - utf-8-validate + - ws - zod walker@1.0.8: @@ -23532,6 +24580,13 @@ snapshots: react: 19.1.1 use-sync-external-store: 1.6.0(react@19.1.1) + zustand@5.0.8(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.4.0(react@19.1.1)): + optionalDependencies: + '@types/react': 19.1.13 + immer: 10.2.0 + react: 19.1.1 + use-sync-external-store: 1.4.0(react@19.1.1) + zustand@5.0.8(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)): optionalDependencies: '@types/react': 19.1.13 From ae86c03a4703478592f29812106c35dddd0c5f6a Mon Sep 17 00:00:00 2001 From: Rytis Grincevicius Date: Thu, 6 Nov 2025 10:51:33 +0200 Subject: [PATCH 4/8] feat: add examples --- .../src/integrations/privy/connector.tsx | 117 ++++++++++-------- 1 file changed, 64 insertions(+), 53 deletions(-) diff --git a/apps/web-app/src/integrations/privy/connector.tsx b/apps/web-app/src/integrations/privy/connector.tsx index 6a6528b..4189ee1 100644 --- a/apps/web-app/src/integrations/privy/connector.tsx +++ b/apps/web-app/src/integrations/privy/connector.tsx @@ -1,18 +1,9 @@ import { Button } from '@/components/ui/button'; +import { useSlayerTx } from '@/lib/transactions'; import { usePrivy, useWallets } from '@privy-io/react-auth'; import { useSetActiveWallet } from '@privy-io/wagmi'; import { bobSepolia, rootstockTestnet } from 'viem/chains'; -import { parseEther } from 'viem/utils'; -import { - useAccount, - useDisconnect, - usePrepareTransactionRequest, - useSendTransaction, - useSignMessage, - useSwitchChain, - type Config, -} from 'wagmi'; -import type { SendTransactionVariables } from 'wagmi/query'; +import { useAccount, useDisconnect, useSwitchChain } from 'wagmi'; export const PrivyConnector = () => { // Privy hooks @@ -133,60 +124,80 @@ export const PrivyConnector = () => { const SignMessage = () => { const { address } = useAccount(); - const { data, isPending, isSuccess, isError, signMessage } = useSignMessage({ - mutation: { - onSuccess: () => { - alert('Sign Message Success'); - }, - }, - }); + + const { begin } = useSlayerTx(); + + const onClick = async () => { + begin(async () => { + return [ + { + id: 'sign-message-1', + title: 'Sign Message 1', + description: 'Please sign message 1', + request: { + type: 'message', + data: { + message: 'This is message 1', + account: address!, + }, + }, + }, + ]; + }); + }; + return ( <>

useSignMessage

- - {isSuccess &&
Signature: {data}
} - {isError &&
Error signing message
} + ); }; const SendTransaction = () => { - const transactionRequest: SendTransactionVariables = { - to: '0x2bD2201BFE156A71EB0D02837172ffc237218505'.toLowerCase() as `0x${string}`, - value: parseEther('0.001'), - data: '0x', - // type: 'eip1559', // does not work for rootstock - }; - - const { data, isPending, isSuccess, sendTransaction, error } = - useSendTransaction(); + const { address } = useAccount(); - usePrepareTransactionRequest(); + const { begin } = useSlayerTx(); + + const onClick = async () => { + begin(async () => { + return [ + { + id: 'tx1', + title: 'Send on rootstock testnet', + description: 'Send transaction to self on rootstock testnet', + request: { + type: 'transaction', + data: { + to: address!, + value: 1n, + chain: rootstockTestnet, + account: address!, + }, + }, + }, + { + id: 'tx2', + title: 'Send on bob sepolia testnet', + description: 'Send transaction to self on bob sepolia testnet', + request: { + type: 'transaction', + data: { + to: address!, + value: 1n, + chain: bobSepolia, + account: address!, + }, + }, + }, + ]; + }); + }; return ( <> -

useSendTransaction

-
- We recommend doing this on rootstock testnet (chainId 31). -
- - {isPending &&
Check wallet
} - {isSuccess &&
Transaction: {JSON.stringify(data)}
} - {error &&
Error: {error.message}
} +

Send Transactions

+ ); }; From 2cf51b13eeb22c2019dbd8457fca76c341410a96 Mon Sep 17 00:00:00 2001 From: Rytis Grincevicius Date: Thu, 6 Nov 2025 10:59:11 +0200 Subject: [PATCH 5/8] fix: imports --- .../src/components/TransactionDialog/TransactionDialog.tsx | 2 +- apps/web-app/src/lib/transactions/index.ts | 2 +- apps/web-app/src/lib/transactions/store.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx b/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx index cb67db7..80b4bad 100644 --- a/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx +++ b/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx @@ -64,7 +64,7 @@ export const TransactionDialogProvider = () => { return ( diff --git a/apps/web-app/src/lib/transactions/index.ts b/apps/web-app/src/lib/transactions/index.ts index 6e44887..45d5b74 100644 --- a/apps/web-app/src/lib/transactions/index.ts +++ b/apps/web-app/src/lib/transactions/index.ts @@ -1,4 +1,4 @@ -import type { SdkTransactionRequest } from 'node_modules/@sovryn/slayer-sdk/src/lib/transaction'; +import type { SdkTransactionRequest } from '@sovryn/slayer-sdk'; import type { Account, Chain } from 'viem'; import { useStore } from 'zustand'; import { txStore } from './store'; diff --git a/apps/web-app/src/lib/transactions/store.ts b/apps/web-app/src/lib/transactions/store.ts index 90e6ece..8dbee86 100644 --- a/apps/web-app/src/lib/transactions/store.ts +++ b/apps/web-app/src/lib/transactions/store.ts @@ -1,4 +1,4 @@ -import type { SdkTransactionRequest } from 'node_modules/@sovryn/slayer-sdk/src/lib/transaction'; +import type { SdkTransactionRequest } from '@sovryn/slayer-sdk'; import type { TransactionReceipt } from 'viem'; import { createStore } from 'zustand'; import { combine } from 'zustand/middleware'; From 91decc86484a15357a103a7ec07f0c1c9a2d8c20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rytis=20Grincevi=C4=8Dius?= Date: Fri, 7 Nov 2025 08:59:16 +0200 Subject: [PATCH 6/8] fix: review comments --- apps/web-app/src/@types/global.d.ts | 2 - .../LinkToExplorer/LinkToExplorer.tsx | 65 ++++++++++++ .../TransactionDialog/TransactionDialog.tsx | 100 +++++++++--------- apps/web-app/src/lib/transactions/index.ts | 5 +- apps/web-app/src/lib/transactions/store.ts | 17 +-- eslint.config.mjs | 10 +- packages/sdk/src/lib/transaction.ts | 4 +- 7 files changed, 140 insertions(+), 63 deletions(-) delete mode 100644 apps/web-app/src/@types/global.d.ts create mode 100644 apps/web-app/src/components/LinkToExplorer/LinkToExplorer.tsx diff --git a/apps/web-app/src/@types/global.d.ts b/apps/web-app/src/@types/global.d.ts deleted file mode 100644 index 5d7135e..0000000 --- a/apps/web-app/src/@types/global.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -declare type AnyValue = any; diff --git a/apps/web-app/src/components/LinkToExplorer/LinkToExplorer.tsx b/apps/web-app/src/components/LinkToExplorer/LinkToExplorer.tsx new file mode 100644 index 0000000..e2ffad3 --- /dev/null +++ b/apps/web-app/src/components/LinkToExplorer/LinkToExplorer.tsx @@ -0,0 +1,65 @@ +import { useMemo } from 'react'; +import type { Address, Chain, Hash } from 'viem'; +import { useChains } from 'wagmi'; + +type ChainProps = + | { + chainId: number; + } + | { + chain: Chain; + }; + +type ValueProps = + | { + address: Address; + } + | { + txHash: Hash; + }; + +type LinkToExplorerProps = ValueProps & + ChainProps & { + className?: string; + }; + +export const LinkToExplorer = (props: LinkToExplorerProps) => { + const chains = useChains(); + + const chain = useMemo(() => { + if ('chain' in props) { + return props.chain; + } + return chains.find((c) => c.id === props.chainId); + }, [props, chains]); + + const path = useMemo(() => { + if ('address' in props) { + return `/address/${props.address}`; + } + if ('txHash' in props) { + return `/tx/${props.txHash}`; + } + return '/'; + }, [props]); + + const title = useMemo(() => { + if ('address' in props) { + return props.address; + } + if ('txHash' in props) { + return props.txHash; + } + }, [props, chain]); + + return ( + + {title?.slice(0, 6)}...{title?.slice(-4)} + + ); +}; diff --git a/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx b/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx index 80b4bad..29c3992 100644 --- a/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx +++ b/apps/web-app/src/components/TransactionDialog/TransactionDialog.tsx @@ -1,4 +1,8 @@ -import { txStates, txStore, type SlayerTx } from '@/lib/transactions/store'; +import { + TRANSACTION_STATE, + txStore, + type SlayerTx, +} from '@/lib/transactions/store'; import { isMessageRequest, isTransactionRequest, @@ -12,7 +16,7 @@ import { ExternalLink, Loader2Icon, } from 'lucide-react'; -import { useEffect, useMemo, useState, type FC } from 'react'; +import { useCallback, useEffect, useMemo, useState, type FC } from 'react'; import { useTranslation } from 'react-i18next'; import { toast } from 'sonner'; import { prepareTransactionRequest } from 'viem/actions'; @@ -28,6 +32,7 @@ import { } from 'wagmi'; import { useStore } from 'zustand'; import { useStoreWithEqualityFn } from 'zustand/traditional'; +import { LinkToExplorer } from '../LinkToExplorer/LinkToExplorer'; import { Button } from '../ui/button'; import { Dialog, @@ -77,7 +82,7 @@ export const TransactionDialogProvider = () => { {t(($) => $.description)}
- +

{t(($) => $.preparing)}

@@ -100,7 +105,7 @@ const TxList = () => { const setItemError = useStore(txStore, (state) => state.setItemError); const currentTx = useMemo( - () => items.find((t) => t.state !== txStates.success), + () => items.find((t) => t.state !== TRANSACTION_STATE.success), [items], ); @@ -136,7 +141,7 @@ const TxList = () => { }, onSuccess(data) { if (!currentTx) return; - updateItem(currentTx.id, txStates.success, { + updateItem(currentTx.id, TRANSACTION_STATE.success, { transactionHash: data, }); toast.success('Message signed successfully'); @@ -155,7 +160,7 @@ const TxList = () => { }, onSuccess(data) { if (!currentTx) return; - updateItem(currentTx?.id || '', txStates.success, { + updateItem(currentTx?.id || '', TRANSACTION_STATE.success, { transactionHash: data, }); toast.success('Typed Data signed successfully'); @@ -172,7 +177,7 @@ const TxList = () => { onSettled(data, error) { if (!currentTx) return; if (data) { - updateItem(currentTx.id, txStates.pending, { + updateItem(currentTx.id, TRANSACTION_STATE.pending, { transactionHash: data, }); toast.success('Transaction is broadcasted'); @@ -199,7 +204,8 @@ const TxList = () => { } = useWaitForTransactionReceipt({ chainId: currentTx && isTransactionRequest(currentTx) - ? (currentTx.request.data.chain?.id as any) + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + (currentTx.request.data.chain?.id as any) : undefined, hash: currentTx && isTransactionRequest(currentTx) @@ -208,15 +214,15 @@ const TxList = () => { onReplaced: (tx) => { if (!currentTx) return; if (tx.reason === 'cancelled') { - updateItemState(currentTx.id, txStates.idle); + updateItemState(currentTx.id, TRANSACTION_STATE.idle); toast.error('Transaction was cancelled'); return; } updateItem( currentTx.id, tx.transactionReceipt.status === 'success' - ? txStates.success - : txStates.error, + ? TRANSACTION_STATE.success + : TRANSACTION_STATE.error, tx.transactionReceipt, ); }, @@ -225,9 +231,9 @@ const TxList = () => { useEffect(() => { if (!currentTx || !receipt) return; if (receiptStatus === 'success') { - updateItem(currentTx.id, txStates.success, receipt); + updateItem(currentTx.id, TRANSACTION_STATE.success, receipt); } else if (receiptStatus === 'error') { - updateItem(currentTx.id, txStates.error, receipt); + updateItem(currentTx.id, TRANSACTION_STATE.error, receipt); setItemError( currentTx.id, `Transaction failed with status: ${receipt.status}`, @@ -240,18 +246,21 @@ const TxList = () => { if (!tx) return; try { setIsPreparing(true); - updateItemState(tx.id, txStates.pending); + updateItemState(tx.id, TRANSACTION_STATE.pending); if (isMessageRequest(tx)) { - signMessage(tx.request.data); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + signMessage(tx.request.data as any); } else if (isTypedDataRequest(tx)) { - signTypedData(tx.request.data); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + signTypedData(tx.request.data as any); } else if (isTransactionRequest(tx)) { const prepared = await prepareTransactionRequest( config.getClient(), - tx.request.data, + // eslint-disable-next-line @typescript-eslint/no-explicit-any + tx.request.data as any, ); - sendTransaction(prepared); + sendTransaction(prepared); } else { throw new Error('Unknown transaction request type'); } @@ -270,21 +279,33 @@ const TxList = () => { isSigning || isSigningTypedData || (pendingTxHash && isReceiptPending) || - currentTx?.state === txStates.pending; + currentTx?.state === TRANSACTION_STATE.pending; const confirmLabel = useMemo(() => { if (currentTx) { - if (isMessageRequest(currentTx!)) { + if (isMessageRequest(currentTx)) { return t(($) => $.signMessage, { ns: 'tx' }); - } else if (isTransactionRequest(currentTx!)) { + } else if (isTransactionRequest(currentTx)) { return t(($) => $.sendTransaction, { ns: 'tx' }); - } else if (isTypedDataRequest(currentTx!)) { + } else if (isTypedDataRequest(currentTx)) { return t(($) => $.signTypedData, { ns: 'tx' }); } } return t(($) => $.confirm, { ns: 'common' }); }, [currentTx]); + const handleSwitchChain = useCallback(() => { + if (!requiredChain) return; + switchChain({ + chainId: requiredChain.id, + addEthereumChainParameter: { + nativeCurrency: requiredChain.nativeCurrency, + rpcUrls: requiredChain.rpcUrls.default.http, + chainName: requiredChain.name, + }, + }); + }, [requiredChain, switchChain]); + return ( <> @@ -311,18 +332,7 @@ const TxList = () => { {chainId && requiredChain !== undefined && currentChain?.id !== requiredChain?.id ? ( -
); }; - -const TxList = () => { - const { t } = useTranslation(['tx', 'common']); - const [isPreparing, setIsPreparing] = useState(false); - const { switchChain } = useSwitchChain(); - const config = useConfig(); - const { isConnected, chainId } = useAccount(); - - const items = useStoreWithEqualityFn(txStore, (state) => state.items); - const updateItem = useStore(txStore, (state) => state.updateItem); - const updateItemState = useStore(txStore, (state) => state.updateItemState); - const setItemError = useStore(txStore, (state) => state.setItemError); - - const currentTx = useMemo( - () => items.find((t) => t.state !== TRANSACTION_STATE.success), - [items], - ); - - const currentChain = useMemo( - () => config.chains.find((c) => c.id === chainId), - [chainId, config.chains], - ); - const requiredChain = useMemo(() => { - let id: number | undefined = undefined; - if (currentTx && isTransactionRequest(currentTx)) { - id = currentTx.request.data.chain?.id; - } - - if (currentTx && isTypedDataRequest(currentTx)) { - id = currentTx.request.data.domain?.chainId - ? Number(currentTx.request.data.domain.chainId) - : undefined; - } - - return id !== undefined - ? config.chains.find((c) => c.id === id) - : undefined; - }, [currentTx]); - - const { signMessage, isPending: isSigning } = useSignMessage({ - mutation: { - onError(error) { - const msg = handleErrorMessage(error); - toast.error(msg); - console.error('Message signing error', error); - if (!currentTx) return; - setItemError(currentTx.id, msg); - }, - onSuccess(data) { - if (!currentTx) return; - updateItem(currentTx.id, TRANSACTION_STATE.success, { - transactionHash: data, - }); - toast.success('Message signed successfully'); - }, - }, - }); - - const { signTypedData, isPending: isSigningTypedData } = useSignTypedData({ - mutation: { - onError(error) { - const msg = handleErrorMessage(error); - console.error('Typed Data signing error', error); - toast.error(msg); - if (!currentTx) return; - setItemError(currentTx?.id || '', msg); - }, - onSuccess(data) { - if (!currentTx) return; - updateItem(currentTx?.id || '', TRANSACTION_STATE.success, { - transactionHash: data, - }); - toast.success('Typed Data signed successfully'); - }, - }, - }); - - const { - sendTransaction, - data: pendingTxHash, - isPending: isSending, - } = useSendTransaction({ - mutation: { - onSettled(data, error) { - if (!currentTx) return; - if (data) { - updateItem(currentTx.id, TRANSACTION_STATE.pending, { - transactionHash: data, - }); - toast.success('Transaction is broadcasted'); - } else if (error) { - console.log({ - msg: error.message, - cause: error.cause, - name: error.name, - stack: error.stack, - }); - const msg = handleErrorMessage(error); - console.error('Transaction sending error', error); - setItemError(currentTx.id, msg); - toast.error(msg); - } - }, - }, - }); - - const { - data: receipt, - status: receiptStatus, - isLoading: isReceiptPending, - } = useWaitForTransactionReceipt({ - chainId: - currentTx && isTransactionRequest(currentTx) - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - (currentTx.request.data.chain?.id as any) - : undefined, - hash: - currentTx && isTransactionRequest(currentTx) - ? currentTx.res?.transactionHash - : undefined, - onReplaced: (tx) => { - if (!currentTx) return; - if (tx.reason === 'cancelled') { - updateItemState(currentTx.id, TRANSACTION_STATE.idle); - toast.error('Transaction was cancelled'); - return; - } - updateItem( - currentTx.id, - tx.transactionReceipt.status === 'success' - ? TRANSACTION_STATE.success - : TRANSACTION_STATE.error, - tx.transactionReceipt, - ); - }, - }); - - useEffect(() => { - if (!currentTx || !receipt) return; - if (receiptStatus === 'success') { - updateItem(currentTx.id, TRANSACTION_STATE.success, receipt); - } else if (receiptStatus === 'error') { - updateItem(currentTx.id, TRANSACTION_STATE.error, receipt); - setItemError( - currentTx.id, - `Transaction failed with status: ${receipt.status}`, - ); - } - }, [currentTx, receipt, receiptStatus]); - - const handleConfirm = async () => { - const tx = items.find((t) => !t.res); - if (!tx) return; - try { - setIsPreparing(true); - updateItemState(tx.id, TRANSACTION_STATE.pending); - - if (isMessageRequest(tx)) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - signMessage(tx.request.data as any); - } else if (isTypedDataRequest(tx)) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - signTypedData(tx.request.data as any); - } else if (isTransactionRequest(tx)) { - const prepared = await prepareTransactionRequest( - config.getClient(), - // eslint-disable-next-line @typescript-eslint/no-explicit-any - tx.request.data as any, - ); - sendTransaction(prepared); - } else { - throw new Error('Unknown transaction request type'); - } - } catch (e) { - setItemError(tx.id, handleErrorMessage(e)); - toast.error(handleErrorMessage(e)); - console.error('Error confirming transaction', e); - } finally { - setIsPreparing(false); - } - }; - - const isPending = - isPreparing || - isSending || - isSigning || - isSigningTypedData || - (pendingTxHash && isReceiptPending) || - currentTx?.state === TRANSACTION_STATE.pending; - - const confirmLabel = useMemo(() => { - if (currentTx) { - if (isMessageRequest(currentTx)) { - return t(($) => $.signMessage, { ns: 'tx' }); - } else if (isTransactionRequest(currentTx)) { - return t(($) => $.sendTransaction, { ns: 'tx' }); - } else if (isTypedDataRequest(currentTx)) { - return t(($) => $.signTypedData, { ns: 'tx' }); - } - } - return t(($) => $.confirm, { ns: 'common' }); - }, [currentTx]); - - const handleSwitchChain = useCallback(() => { - if (!requiredChain) return; - switchChain({ - chainId: requiredChain.id, - addEthereumChainParameter: { - nativeCurrency: requiredChain.nativeCurrency, - rpcUrls: requiredChain.rpcUrls.default.http, - chainName: requiredChain.name, - }, - }); - }, [requiredChain, switchChain]); - - return ( - <> - - {t(($) => $.title, { ns: 'tx' })} - - {t(($) => $.description, { ns: 'tx' })} - - - {items.map((tx, index) => ( - - ))} - - {!isConnected &&

{t(($) => $.connectWallet)}

} - - - - - - - {currentTx && ( - <> - {chainId && - requiredChain !== undefined && - currentChain?.id !== requiredChain?.id ? ( - - ) : ( - - )} - - )} - - - ); -}; - -const TransactionItem: FC<{ item: SlayerTx; index: number }> = ({ - item, - index, -}) => { - const isTx = isTransactionRequest(item); - const chains = useChains(); - const chain = useMemo(() => { - if (isTx) { - const chainId = item.request.data.chain?.id; - return chains.find((c) => c.id === chainId); - } - return undefined; - }, [chains, isTx, item.request.data]); - - return ( -
-
-
- {item.state === TRANSACTION_STATE.idle && } - {item.state === TRANSACTION_STATE.pending && ( - - )} - {item.state === TRANSACTION_STATE.success && ( - - )} - {item.state === TRANSACTION_STATE.error && ( - - )} -
#{index + 1}
-
-
-
-

{item.title}

-

{item.description}

- {isTx && chain && item.res?.transactionHash && ( -

- - -

- )} - - {item.error && ( -

{item.error}

- )} -
-
- ); -}; - -function handleErrorMessage(error: unknown): string { - if (error instanceof Error) { - if (error.cause) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const cause: any = error.cause; - return ( - cause.details?.detail ?? - cause.details ?? - cause.shortMessage ?? - error.message ?? - 'An unknown error occurred' - ); - } - return error.message || 'An unknown error occurred'; - } - return 'An unknown error occurred'; -} diff --git a/apps/web-app/src/components/TransactionDialog/TransactionItem.tsx b/apps/web-app/src/components/TransactionDialog/TransactionItem.tsx new file mode 100644 index 0000000..bc99b4d --- /dev/null +++ b/apps/web-app/src/components/TransactionDialog/TransactionItem.tsx @@ -0,0 +1,63 @@ +import { TRANSACTION_STATE, type SlayerTx } from '@/lib/transactions/store'; +import { isTransactionRequest } from '@sovryn/slayer-sdk'; +import { + CircleCheckBig, + CircleDashed, + CircleX, + ExternalLink, + Loader2Icon, +} from 'lucide-react'; +import { useMemo, type FC } from 'react'; +import { useChains } from 'wagmi'; +import { LinkToExplorer } from '../LinkToExplorer/LinkToExplorer'; + +type TransactionItemProps = { + index: number; + item: SlayerTx; +}; + +export const TransactionItem: FC = ({ item, index }) => { + const isTx = isTransactionRequest(item); + const chains = useChains(); + const chain = useMemo(() => { + if (isTx) { + const chainId = item.request.data.chain?.id; + return chains.find((c) => c.id === chainId); + } + return undefined; + }, [chains, isTx, item.request.data]); + + return ( +
+
+
+ {item.state === TRANSACTION_STATE.idle && } + {item.state === TRANSACTION_STATE.pending && ( + + )} + {item.state === TRANSACTION_STATE.success && ( + + )} + {item.state === TRANSACTION_STATE.error && ( + + )} +
#{index + 1}
+
+
+
+

{item.title}

+

{item.description}

+ {isTx && chain && item.res?.transactionHash && ( +

+ + +

+ )} + + {item.error && ( +

{item.error}

+ )} +
+
+ ); +}; diff --git a/apps/web-app/src/components/TransactionDialog/TxList.tsx b/apps/web-app/src/components/TransactionDialog/TxList.tsx new file mode 100644 index 0000000..1d5ad72 --- /dev/null +++ b/apps/web-app/src/components/TransactionDialog/TxList.tsx @@ -0,0 +1,146 @@ +import { txStore } from '@/lib/transactions/store'; +import { + isMessageRequest, + isTransactionRequest, + isTypedDataRequest, +} from '@sovryn/slayer-sdk'; +import clsx from 'clsx'; +import { Loader2Icon } from 'lucide-react'; +import { useCallback, useMemo } from 'react'; +import { useTranslation } from 'react-i18next'; +import { toast } from 'sonner'; +import { useAccount, useConfig, useSwitchChain } from 'wagmi'; +import { useStore } from 'zustand'; +import { useStoreWithEqualityFn } from 'zustand/traditional'; +import { Button } from '../ui/button'; +import { + DialogClose, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from '../ui/dialog'; +import { useInternalTxHandler } from './hooks/use-internal-tx-handler'; +import { TransactionItem } from './TransactionItem'; + +export const TxList = () => { + const { t } = useTranslation(['tx', 'common']); + const { switchChain } = useSwitchChain(); + const config = useConfig(); + const { isConnected, chainId } = useAccount(); + + const items = useStoreWithEqualityFn(txStore, (state) => state.items); + const handlers = useStore(txStore, (state) => state.handlers); + + const { confirm, currentTx, isPending } = useInternalTxHandler({ + // Default handlers with toasts + onError: (_, message) => { + if (!handlers.onError) { + toast.error(message); + } + }, + onCompleted: (count) => { + if (!handlers.onCompleted) { + toast.success( + count > 1 + ? `${count} transactions completed` + : `Transaction completed`, + ); + } + }, + }); + + const currentChain = useMemo( + () => config.chains.find((c) => c.id === chainId), + [chainId, config.chains], + ); + + const requiredChain = useMemo(() => { + let id: number | undefined = undefined; + if (currentTx && isTransactionRequest(currentTx)) { + id = currentTx.request.data.chain?.id; + } + + if (currentTx && isTypedDataRequest(currentTx)) { + id = currentTx.request.data.domain?.chainId + ? Number(currentTx.request.data.domain.chainId) + : undefined; + } + + return id !== undefined + ? config.chains.find((c) => c.id === id) + : undefined; + }, [currentTx, config.chains]); + + const confirmLabel = useMemo(() => { + if (currentTx) { + if (isMessageRequest(currentTx)) { + return t(($) => $.signMessage, { ns: 'tx' }); + } else if (isTransactionRequest(currentTx)) { + return t(($) => $.sendTransaction, { ns: 'tx' }); + } else if (isTypedDataRequest(currentTx)) { + return t(($) => $.signTypedData, { ns: 'tx' }); + } + } + return t(($) => $.confirm, { ns: 'common' }); + }, [currentTx]); + + const handleSwitchChain = useCallback(() => { + if (!requiredChain) return; + switchChain({ + chainId: requiredChain.id, + addEthereumChainParameter: { + nativeCurrency: requiredChain.nativeCurrency, + rpcUrls: requiredChain.rpcUrls.default.http, + chainName: requiredChain.name, + }, + }); + }, [requiredChain, switchChain]); + + return ( + <> + + {t(($) => $.title, { ns: 'tx' })} + + {t(($) => $.description, { ns: 'tx' })} + + + {items.map((tx, index) => ( + + ))} + + {!isConnected &&

{t(($) => $.connectWallet)}

} + + + + + + + {currentTx && ( + <> + {chainId && + requiredChain !== undefined && + currentChain?.id !== requiredChain?.id ? ( + + ) : ( + + )} + + )} + + + ); +}; diff --git a/apps/web-app/src/components/TransactionDialog/hooks/use-internal-tx-handler.ts b/apps/web-app/src/components/TransactionDialog/hooks/use-internal-tx-handler.ts new file mode 100644 index 0000000..02c0c9b --- /dev/null +++ b/apps/web-app/src/components/TransactionDialog/hooks/use-internal-tx-handler.ts @@ -0,0 +1,251 @@ +import { + TRANSACTION_STATE, + txStore, + type TxHandlers, +} from '@/lib/transactions/store'; +import { + isMessageRequest, + isTransactionRequest, + isTypedDataRequest, +} from '@sovryn/slayer-sdk'; +import { useCallback, useEffect, useState } from 'react'; +import { prepareTransactionRequest } from 'viem/actions'; +import { + useConfig, + useSendTransaction, + useSignMessage, + useSignTypedData, + useWaitForTransactionReceipt, +} from 'wagmi'; +import { useStore } from 'zustand'; +import { useStoreWithEqualityFn } from 'zustand/traditional'; +import { handleErrorMessage } from '../utils'; + +export function useInternalTxHandler(props: TxHandlers = {}) { + const [isPreparing, setIsPreparing] = useState(false); + + const currentTx = useStoreWithEqualityFn(txStore, (state) => + state.items.find((t) => t.state !== TRANSACTION_STATE.success), + ); + const pendingTxs = useStoreWithEqualityFn(txStore, (state) => + state.items.filter((t) => t.state !== TRANSACTION_STATE.success).slice(1), + ); + + const updateItem = useStore(txStore, (state) => state.updateItem); + const setItemError = useStore(txStore, (state) => state.setItemError); + const updateItemState = useStore(txStore, (state) => state.updateItemState); + const handlers = useStore(txStore, (state) => state.handlers); + + const config = useConfig(); + + const { signMessage, isPending: isSigning } = useSignMessage({ + mutation: { + onError(error) { + if (!currentTx) return; + const msg = handleErrorMessage(error); + setItemError(currentTx.id, msg); + props.onError?.(currentTx!, msg, error); + handlers.onError?.(currentTx!, msg, error); + }, + onSuccess(data) { + if (!currentTx) return; + updateItem(currentTx.id, TRANSACTION_STATE.success, { + transactionHash: data, + }); + props.onAfterSign?.(currentTx, { transactionHash: data }, pendingTxs); + handlers.onAfterSign?.( + currentTx, + { transactionHash: data }, + pendingTxs, + ); + props.onSuccess?.(currentTx, { transactionHash: data }); + handlers.onSuccess?.(currentTx, { transactionHash: data }); + }, + }, + }); + + const { signTypedData, isPending: isSigningTypedData } = useSignTypedData({ + mutation: { + onError(error) { + if (!currentTx) return; + const msg = handleErrorMessage(error); + setItemError(currentTx?.id || '', msg); + props.onError?.(currentTx!, msg, error); + handlers.onError?.(currentTx!, msg, error); + }, + onSuccess(data) { + if (!currentTx) return; + updateItem(currentTx?.id || '', TRANSACTION_STATE.success, { + transactionHash: data, + }); + props.onAfterSign?.(currentTx, { transactionHash: data }, pendingTxs); + handlers.onAfterSign?.( + currentTx, + { transactionHash: data }, + pendingTxs, + ); + props.onSuccess?.(currentTx, { transactionHash: data }); + handlers.onSuccess?.(currentTx, { transactionHash: data }); + }, + }, + }); + + const { + sendTransaction, + data: pendingTxHash, + isPending: isSending, + } = useSendTransaction({ + mutation: { + onSettled(data, error) { + if (!currentTx) return; + if (data) { + updateItem(currentTx.id, TRANSACTION_STATE.pending, { + transactionHash: data, + }); + props.onAfterSign?.(currentTx, { transactionHash: data }, pendingTxs); + handlers.onAfterSign?.( + currentTx, + { transactionHash: data }, + pendingTxs, + ); + } else if (error) { + const msg = handleErrorMessage(error); + setItemError(currentTx.id, msg); + props.onError?.(currentTx, msg, error); + handlers.onError?.(currentTx, msg, error); + } + }, + }, + }); + + const { + data: receipt, + status: receiptStatus, + isLoading: isReceiptPending, + error: receiptError, + } = useWaitForTransactionReceipt({ + chainId: + currentTx && isTransactionRequest(currentTx) + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + (currentTx.request.data.chain?.id as any) + : undefined, + hash: + currentTx && isTransactionRequest(currentTx) + ? currentTx.res?.transactionHash + : undefined, + onReplaced: (tx) => { + if (!currentTx) return; + if (tx.reason === 'cancelled') { + updateItemState(currentTx.id, TRANSACTION_STATE.idle); + props.onError?.( + currentTx, + 'Transaction was cancelled', + new Error('Transaction was cancelled'), + ); + handlers.onError?.( + currentTx, + 'Transaction was cancelled', + new Error('Transaction was cancelled'), + ); + return; + } + updateItem( + currentTx.id, + tx.transactionReceipt.status === 'success' + ? TRANSACTION_STATE.success + : TRANSACTION_STATE.error, + tx.transactionReceipt, + ); + }, + }); + + useEffect(() => { + if (!currentTx || !receipt) return; + if (receiptStatus === 'success') { + updateItem(currentTx.id, TRANSACTION_STATE.success, receipt); + props.onSuccess?.(currentTx, receipt); + handlers.onSuccess?.(currentTx, receipt); + } else if (receiptStatus === 'error') { + updateItem(currentTx.id, TRANSACTION_STATE.error, receipt); + setItemError( + currentTx.id, + `Transaction failed with status: ${receipt.status}`, + ); + props.onError?.( + currentTx, + `Transaction failed with status: ${receipt.status}`, + receiptError, + ); + handlers.onError?.( + currentTx, + `Transaction failed with status: ${receipt.status}`, + receiptError, + ); + } + }, [currentTx, receipt, receiptStatus, receiptError]); + + const handleConfirm = useCallback(async () => { + if (!currentTx) return; + try { + setIsPreparing(true); + updateItemState(currentTx.id, TRANSACTION_STATE.pending); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const modifiedData: any = + (await props.onBeforeSign?.(currentTx, txStore.getState().items)) ?? + currentTx.request.data; + + if (isMessageRequest(currentTx)) { + signMessage(modifiedData); + } else if (isTypedDataRequest(currentTx)) { + signTypedData(modifiedData); + } else if (isTransactionRequest(currentTx)) { + const prepared = await prepareTransactionRequest( + config.getClient(), + modifiedData, + ); + sendTransaction(prepared); + } else { + throw new Error('Unknown transaction request type'); + } + } catch (e) { + const msg = handleErrorMessage(e); + setItemError(currentTx.id, msg); + props.onError?.(currentTx, msg, e); + handlers.onError?.(currentTx, msg, e); + } finally { + setIsPreparing(false); + } + }, [ + currentTx, + config, + sendTransaction, + setItemError, + signMessage, + signTypedData, + updateItemState, + ]); + + const isPending = + isPreparing || + isSending || + isSigning || + isSigningTypedData || + (pendingTxHash && isReceiptPending) || + currentTx?.state === TRANSACTION_STATE.pending; + + useEffect(() => { + const count = txStore.getState().items.length; + if (!isPending && !currentTx && count > 0) { + props.onCompleted?.(count); + handlers.onCompleted?.(count); + } + }, [isPending, currentTx, props]); + + return { + currentTx, + pendingTxs, + isPending, + confirm: handleConfirm, + }; +} diff --git a/apps/web-app/src/components/TransactionDialog/utils.ts b/apps/web-app/src/components/TransactionDialog/utils.ts new file mode 100644 index 0000000..353948a --- /dev/null +++ b/apps/web-app/src/components/TransactionDialog/utils.ts @@ -0,0 +1,17 @@ +export function handleErrorMessage(error: unknown): string { + if (error instanceof Error) { + if (error.cause) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const cause: any = error.cause; + return ( + cause.details?.detail ?? + cause.details ?? + cause.shortMessage ?? + error.message ?? + 'An unknown error occurred' + ); + } + return error.message || 'An unknown error occurred'; + } + return 'An unknown error occurred'; +} diff --git a/apps/web-app/src/integrations/privy/connector.tsx b/apps/web-app/src/integrations/privy/connector.tsx index 4189ee1..7446b06 100644 --- a/apps/web-app/src/integrations/privy/connector.tsx +++ b/apps/web-app/src/integrations/privy/connector.tsx @@ -125,7 +125,24 @@ export const PrivyConnector = () => { const SignMessage = () => { const { address } = useAccount(); - const { begin } = useSlayerTx(); + const { begin } = useSlayerTx({ + async onBeforeSign(tx) { + console.log('onBeforeSign', tx); + return tx.request.data; + }, + onAfterSign(tx, res, next) { + console.log('onAfterSign', tx, res, next); + }, + onError(tx, error) { + console.error('onError', tx, error); + }, + onSuccess(tx, res) { + console.log('onSuccess', tx, res); + }, + onCompleted(count) { + console.log('onCompleted', count); + }, + }); const onClick = async () => { begin(async () => { diff --git a/apps/web-app/src/lib/sdk.ts b/apps/web-app/src/lib/sdk.ts index fd84d6c..8ec5e30 100644 --- a/apps/web-app/src/lib/sdk.ts +++ b/apps/web-app/src/lib/sdk.ts @@ -14,7 +14,7 @@ const sdks = new Map>(); export function makeSdkClient( client: PublicClient, ): SDK { - let sdk = sdks.get(client.chain.id) as SDK; + let sdk = sdks.get(client.chain.id) as unknown as SDK; if (sdk) { return sdk as SDK; } @@ -24,7 +24,7 @@ export function makeSdkClient( ENV.VITE_MODE === 'custom' ? ENV.VITE_INDEXER_BASE_URL : undefined, publicClient: client, }); - sdks.set(client.chain.id, sdk as SDK); + sdks.set(client.chain.id, sdk as unknown as SDK); return sdk as SDK; } diff --git a/apps/web-app/src/lib/transactions/index.ts b/apps/web-app/src/lib/transactions/index.ts index bd86347..02c9078 100644 --- a/apps/web-app/src/lib/transactions/index.ts +++ b/apps/web-app/src/lib/transactions/index.ts @@ -1,22 +1,33 @@ import type { SdkTransactionRequest } from '@sovryn/slayer-sdk'; +import { useCallback, useEffect } from 'react'; import type { Account, Chain } from 'viem'; import { useStore } from 'zustand'; -import { txStore } from './store'; +import { txStore, type TxHandlers } from './store'; -export const useSlayerTx = () => { - const { setItems, setIsFetching, reset } = useStore(txStore); +export const useSlayerTx = ( + handlers: TxHandlers = {}, +) => { + const { setItems, setIsFetching, reset, setHandlers } = useStore(txStore); - const begin = async ( - waitFor?: () => Promise[]>, - ) => { - setIsFetching(true); - if (waitFor) { - const txs = await waitFor(); - setItems(txs); - } - // const result = await send(); - // return result; - }; + const begin = useCallback( + async ( + waitFor?: () => Promise[]>, + ) => { + setIsFetching(true); + if (waitFor) { + const txs = await waitFor(); + setItems(txs); + setHandlers(handlers); + } + // const result = await send(); + // return result; + }, + [setIsFetching, setItems, setHandlers, handlers], + ); + + useEffect(() => { + return () => reset(); + }, [reset]); return { begin, abort: reset }; }; diff --git a/apps/web-app/src/lib/transactions/store.ts b/apps/web-app/src/lib/transactions/store.ts index f2a0be9..31bf19b 100644 --- a/apps/web-app/src/lib/transactions/store.ts +++ b/apps/web-app/src/lib/transactions/store.ts @@ -19,10 +19,28 @@ export type SlayerTx = SdkTransactionRequest & { error?: string; }; +export type TxHandlers = { + // can be used to modify the tx request before signing/sending + onBeforeSign?: ( + tx: SlayerTx, + /** All transactions in the queue */ + items: SlayerTx[], + ) => Promise; + // can be used to handle the response after signing/sending of the particular tx + onAfterSign?: (tx: SlayerTx, res: SlayerTx['res'], next: SlayerTx[]) => void; + // called when a transaction is successfully processed + onSuccess?: (tx: SlayerTx, res: SlayerTx['res']) => void; + // called when an error occurs during processing of a tx + onError?: (tx: SlayerTx, message: string, error: unknown) => void; + // called when all transactions are completed + onCompleted?: (count: number) => void; +}; + type State = { isFetching: boolean; isReady: boolean; items: SlayerTx[]; + handlers: TxHandlers; }; type Actions = { @@ -36,6 +54,7 @@ type Actions = { res: Partial | undefined, ) => void; setItemError: (id: string, error: string) => void; + setHandlers: (handlers: TxHandlers) => void; reset: () => void; }; @@ -47,6 +66,7 @@ export const txStore = createStore( isFetching: false, isReady: false, items: [] as SlayerTx[], + handlers: {}, }, (set) => ({ setIsFetching: (isFetching: boolean) => set({ isFetching }), @@ -77,6 +97,7 @@ export const txStore = createStore( })), setItemError: (id: string, error: string) => set((state) => ({ + ...state, items: state.items.map((item) => item.id === id ? { ...item, state: TRANSACTION_STATE.error, error } @@ -88,6 +109,11 @@ export const txStore = createStore( isFetching: false, isReady: false, items: [], + handlers: {}, + }), + setHandlers: (handlers: TxHandlers) => + set({ + handlers, }), }), ), diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 22aa344..7227008 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -17,9 +17,9 @@ }, "dependencies": { "@sovryn/slayer-shared": "workspace:*", - "debug": "^4.4.3", + "debug": "4.4.3", "tslib": "2.8.1", - "viem": "2.37.8" + "viem": "2.38.6" }, "devDependencies": { "@types/debug": "^4.1.12" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c39f7b5..f97eabe 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -333,14 +333,11 @@ importers: i18next-http-backend: specifier: 3.0.2 version: 3.0.2(encoding@0.1.13) - immer: - specifier: ^10.2.0 - version: 10.2.0 lucide-react: specifier: 0.544.0 version: 0.544.0(react@19.1.1) next-themes: - specifier: ^0.4.6 + specifier: 0.4.6 version: 0.4.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react: specifier: 19.1.1 @@ -349,13 +346,13 @@ importers: specifier: 19.1.1 version: 19.1.1(react@19.1.1) react-i18next: - specifier: ^15.7.3 + specifier: 15.7.3 version: 15.7.3(i18next@25.5.2(typescript@5.9.2))(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2) recharts: - specifier: ^3.2.1 + specifier: 3.2.1 version: 3.2.1(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react-is@18.3.1)(react@19.1.1)(redux@5.0.1) sonner: - specifier: ^2.0.7 + specifier: 2.0.7 version: 2.0.7(react-dom@19.1.1(react@19.1.1))(react@19.1.1) tailwind-merge: specifier: 3.3.1 @@ -383,7 +380,7 @@ importers: version: 5.0.8(@types/react@19.1.13)(immer@10.2.0)(react@19.1.1)(use-sync-external-store@1.6.0(react@19.1.1)) devDependencies: '@types/debug': - specifier: ^4.1.12 + specifier: 4.1.12 version: 4.1.12 vite: specifier: 7.1.7 @@ -401,14 +398,14 @@ importers: specifier: workspace:* version: link:../shared debug: - specifier: ^4.4.3 + specifier: 4.4.3 version: 4.4.3 tslib: specifier: 2.8.1 version: 2.8.1 viem: - specifier: 2.37.8 - version: 2.37.8(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) + specifier: 2.38.6 + version: 2.38.6(bufferutil@4.0.9)(typescript@5.9.2)(utf-8-validate@5.0.10)(zod@4.1.11) devDependencies: '@types/debug': specifier: ^4.1.12 @@ -16680,7 +16677,7 @@ snapshots: sirv: 3.0.2 tinyglobby: 0.2.15 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.4)(jiti@2.5.1)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.4.38)(utf-8-validate@5.0.10))(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@20.19.9)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@27.0.0(bufferutil@4.0.9)(postcss@8.4.38)(utf-8-validate@5.0.10))(lightningcss@1.30.1)(terser@5.44.0)(tsx@4.20.5)(yaml@2.8.1) '@vitest/utils@3.2.4': dependencies: From b6476f071a3ff6d7bb16509c09bd1667cd2858fd Mon Sep 17 00:00:00 2001 From: Rytis Grincevicius Date: Mon, 10 Nov 2025 13:57:40 +0200 Subject: [PATCH 8/8] fix: invalid handler --- .../hooks/use-internal-tx-handler.ts | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/apps/web-app/src/components/TransactionDialog/hooks/use-internal-tx-handler.ts b/apps/web-app/src/components/TransactionDialog/hooks/use-internal-tx-handler.ts index 02c0c9b..1b61753 100644 --- a/apps/web-app/src/components/TransactionDialog/hooks/use-internal-tx-handler.ts +++ b/apps/web-app/src/components/TransactionDialog/hooks/use-internal-tx-handler.ts @@ -21,7 +21,9 @@ import { useStore } from 'zustand'; import { useStoreWithEqualityFn } from 'zustand/traditional'; import { handleErrorMessage } from '../utils'; -export function useInternalTxHandler(props: TxHandlers = {}) { +export function useInternalTxHandler( + props: Pick = {}, +) { const [isPreparing, setIsPreparing] = useState(false); const currentTx = useStoreWithEqualityFn(txStore, (state) => @@ -52,13 +54,11 @@ export function useInternalTxHandler(props: TxHandlers = {}) { updateItem(currentTx.id, TRANSACTION_STATE.success, { transactionHash: data, }); - props.onAfterSign?.(currentTx, { transactionHash: data }, pendingTxs); handlers.onAfterSign?.( currentTx, { transactionHash: data }, pendingTxs, ); - props.onSuccess?.(currentTx, { transactionHash: data }); handlers.onSuccess?.(currentTx, { transactionHash: data }); }, }, @@ -78,13 +78,11 @@ export function useInternalTxHandler(props: TxHandlers = {}) { updateItem(currentTx?.id || '', TRANSACTION_STATE.success, { transactionHash: data, }); - props.onAfterSign?.(currentTx, { transactionHash: data }, pendingTxs); handlers.onAfterSign?.( currentTx, { transactionHash: data }, pendingTxs, ); - props.onSuccess?.(currentTx, { transactionHash: data }); handlers.onSuccess?.(currentTx, { transactionHash: data }); }, }, @@ -102,7 +100,6 @@ export function useInternalTxHandler(props: TxHandlers = {}) { updateItem(currentTx.id, TRANSACTION_STATE.pending, { transactionHash: data, }); - props.onAfterSign?.(currentTx, { transactionHash: data }, pendingTxs); handlers.onAfterSign?.( currentTx, { transactionHash: data }, @@ -163,7 +160,6 @@ export function useInternalTxHandler(props: TxHandlers = {}) { if (!currentTx || !receipt) return; if (receiptStatus === 'success') { updateItem(currentTx.id, TRANSACTION_STATE.success, receipt); - props.onSuccess?.(currentTx, receipt); handlers.onSuccess?.(currentTx, receipt); } else if (receiptStatus === 'error') { updateItem(currentTx.id, TRANSACTION_STATE.error, receipt); @@ -192,7 +188,7 @@ export function useInternalTxHandler(props: TxHandlers = {}) { // eslint-disable-next-line @typescript-eslint/no-explicit-any const modifiedData: any = - (await props.onBeforeSign?.(currentTx, txStore.getState().items)) ?? + (await handlers.onBeforeSign?.(currentTx, txStore.getState().items)) ?? currentTx.request.data; if (isMessageRequest(currentTx)) {