@oasisprotocol/privana-sdk 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +239 -0
- package/dist/index.cjs +4438 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +2 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +1059 -0
- package/dist/index.d.ts +1059 -0
- package/dist/index.js +4340 -0
- package/dist/index.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../shared/config.json","../src/sdk/types/common.ts","../src/sdk/types/chains.ts","../src/sdk/auth/hosted-auth.ts","../src/sdk/client/errors.ts","../src/sdk/client/http-client.ts","../src/sdk/client/privana-client.ts","../src/sdk/signatures/eip712-types.ts","../src/sdk/signatures/sign-lock.ts","../src/sdk/signatures/sign-modify-lock.ts","../src/sdk/signatures/sign-transfer.ts","../src/sdk/signatures/sign-transfer-locked.ts","../src/sdk/signatures/sign-withdraw.ts","../src/sdk/signatures/sign-withdraw-from-lock.ts","../src/sdk/context/privana-provider.tsx","../src/sdk/hooks/use-privana-client.ts","../src/sdk/hooks/use-hosted-redirect-auth.ts","../src/lib/utils.ts","../src/sdk/hooks/use-safe-account.ts","../src/sdk/hooks/use-private-read-request.ts","../src/sdk/hooks/use-balance.ts","../src/sdk/hooks/use-batch-balances.ts","../../../node_modules/@wagmi/core/src/utils/getAction.ts","../../../node_modules/@wagmi/core/src/actions/getChainId.ts","../../../node_modules/@wagmi/core/src/actions/waitForTransactionReceipt.ts","../src/sdk/hooks/use-ensure-correct-chain.ts","../src/sdk/hooks/use-deposit.ts","../src/sdk/hooks/use-withdraw.ts","../src/sdk/hooks/use-lock-funds.ts","../src/sdk/hooks/use-unlock-funds.ts","../src/sdk/hooks/use-transfer.ts","../src/sdk/hooks/use-locked-funds.ts","../src/sdk/hooks/use-total-locked-balance.ts","../src/sdk/hooks/use-expired-locks.ts","../src/sdk/hooks/use-pending-withdrawals.ts","../src/sdk/hooks/use-history.ts","../src/sdk/hooks/use-token-info.ts","../src/sdk/hooks/use-token-list.ts","../src/sdk/hooks/use-modify-lock.ts","../src/components/ui/button.tsx","../src/components/ui/dialog.tsx","../src/components/privana/token-icons.tsx","../src/components/privana/transaction-steps.tsx","../src/components/privana/deposit-form.tsx","../src/components/privana/withdraw-form.tsx","../src/components/privana/privana-modal.tsx","../src/components/privana/privana-button.tsx","../src/components/ui/skeleton.tsx"],"names":["getChainById","useState","useRef","useMemo","useCallback","useContext","WagmiContext","useQuery","getChainId","viem_waitForTransactionReceipt","useConfig","useEffect","error","zeroAddress","useAccount","useWalletClient","useQueryClient","useMutation","keepPreviousData","jsx","jsxs","useBalance","erc20Abi","toast","useWagmiBalance","useReadContract"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"chains\": [\n {\n \"id\": 84532,\n \"name\": \"Base Sepolia\",\n \"explorerUrl\": \"https://sepolia.basescan.org\"\n }\n ],\n \"networks\": {\n \"testnet\": {\n \"chainId\": 23295,\n \"name\": \"Sapphire Testnet\",\n \"accountingContract\": \"0xaF8e5de153A584528B57DD4B9B0195956BBDF571\",\n \"apiUrl\": \"https://flexvaults-staging.rofl.build\"\n },\n \"mainnet\": {\n \"chainId\": 23294,\n \"name\": \"Sapphire Mainnet\",\n \"accountingContract\": \"0x0000000000000000000000000000000000000000\",\n \"apiUrl\": \"\"\n }\n }\n}\n","import config from '@shared/config.json'\n\nexport type Address = `0x${string}`\nexport type Bytes32 = `0x${string}`\nexport type HexString = `0x${string}`\nexport type IntegerLike = string | number\n// Mirrors backend protocol support for authorize URL construction.\n// High-level hosted auth in the provider/hooks layer is intentionally redirect-only.\nexport type HostedAuthResponseMode = 'web_message' | 'redirect'\n\nexport type Network = keyof typeof config.networks\n\nexport interface NetworkConfig {\n chainId: number\n name: string\n accountingContract: Address\n apiUrl: string\n}\n\nexport const NETWORK_CONFIG = {\n testnet: {\n ...config.networks.testnet,\n accountingContract: config.networks.testnet.accountingContract as Address,\n },\n mainnet: {\n ...config.networks.mainnet,\n accountingContract: config.networks.mainnet.accountingContract as Address,\n },\n} as const satisfies Record<Network, NetworkConfig>\n\nexport function getChainId(network: Network): number {\n return NETWORK_CONFIG[network].chainId\n}\n\nexport function getAccountingContract(network: Network): Address {\n return NETWORK_CONFIG[network].accountingContract\n}\n\nexport function getApiUrl(network: Network): string {\n return NETWORK_CONFIG[network].apiUrl\n}\n\nexport function normalizeHex(value: string): HexString {\n const normalized = value.trim().toLowerCase()\n return (normalized.startsWith('0x') ? normalized : `0x${normalized}`) as HexString\n}\n\nexport function normalizeAddress(value: string): Address {\n return normalizeHex(value) as Address\n}\n","import config from '@shared/config.json'\n\nexport interface ChainConfig {\n id: number\n name: string\n explorerUrl: string\n}\n\nexport const SUPPORTED_CHAINS: ChainConfig[] = config.chains.map((chain) => ({\n id: chain.id,\n name: chain.name,\n explorerUrl: chain.explorerUrl,\n}))\n\nexport function getChainById(chainId: number): ChainConfig | undefined {\n return SUPPORTED_CHAINS.find((c) => c.id === chainId)\n}\n\nexport function getExplorerAddressUrl(chainId: number, address: string): string | undefined {\n const chain = getChainById(chainId)\n if (!chain) return undefined\n return `${chain.explorerUrl}/address/${address}#tokentxns`\n}\n","import type {\n HostedAuthCallback,\n HostedAuthConfig,\n HostedAuthPendingTransaction,\n HostedAuthSession,\n HostedAuthTokenExchangeResponse,\n JwtRefreshResponse,\n} from '../types'\n\nexport const HOSTED_AUTH_CLOCK_SKEW_MS = 30_000\n\nconst PKCE_CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~'\nconst DEFAULT_RANDOM_LENGTH = 64\nconst HOSTED_AUTH_CALLBACK_QUERY_KEYS = ['code', 'error', 'error_description', 'state'] as const\n\ntype StorageLike = Pick<Storage, 'getItem' | 'setItem' | 'removeItem'>\n\nfunction randomString(length: number): string {\n const values = new Uint8Array(length)\n crypto.getRandomValues(values)\n let output = ''\n for (const value of values) {\n output += PKCE_CHARSET[value % PKCE_CHARSET.length]\n }\n return output\n}\n\nfunction toBase64Url(bytes: Uint8Array): string {\n let binary = ''\n bytes.forEach((byte) => {\n binary += String.fromCharCode(byte)\n })\n\n return btoa(binary).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/g, '')\n}\n\nexport function createPkceVerifier(length = DEFAULT_RANDOM_LENGTH): string {\n return randomString(length)\n}\n\nexport async function createPkceChallenge(verifier: string): Promise<string> {\n const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(verifier))\n return toBase64Url(new Uint8Array(digest))\n}\n\nexport function createHostedAuthState(length = DEFAULT_RANDOM_LENGTH): string {\n return randomString(length)\n}\n\nexport function createHostedAuthStorageKey(apiUrl: string, config: HostedAuthConfig): string {\n const normalizedApiUrl = apiUrl.replace(/\\/$/, '')\n return [\n 'privana',\n 'hosted-auth',\n normalizedApiUrl,\n config.clientId.trim(),\n config.redirectUri.trim(),\n ].join(':')\n}\n\nexport function createHostedAuthPendingStorageKey(\n apiUrl: string,\n config: HostedAuthConfig\n): string {\n return `${createHostedAuthStorageKey(apiUrl, config)}:pending`\n}\n\nexport function persistHostedAuthPendingTransaction(\n storage: StorageLike,\n key: string,\n transaction: HostedAuthPendingTransaction\n): void {\n storage.setItem(key, JSON.stringify(transaction))\n}\n\nexport function readHostedAuthPendingTransaction(\n storage: StorageLike,\n key: string\n): HostedAuthPendingTransaction | null {\n const raw = storage.getItem(key)\n if (!raw) return null\n\n try {\n const parsed = JSON.parse(raw) as Partial<HostedAuthPendingTransaction>\n if (typeof parsed.codeVerifier !== 'string' || typeof parsed.state !== 'string') {\n return null\n }\n\n return {\n codeVerifier: parsed.codeVerifier,\n state: parsed.state,\n }\n } catch {\n return null\n }\n}\n\nexport function clearHostedAuthPendingTransaction(storage: StorageLike, key: string): void {\n storage.removeItem(key)\n}\n\nexport function parseHostedAuthCallback(url: URL, redirectUri: string): HostedAuthCallback | null {\n const expectedUrl = new URL(redirectUri)\n if (url.origin !== expectedUrl.origin || url.pathname !== expectedUrl.pathname) {\n return null\n }\n\n const code = url.searchParams.get('code')\n if (code) {\n return {\n code,\n state: url.searchParams.get('state'),\n }\n }\n\n const error = url.searchParams.get('error')\n if (error) {\n return {\n error,\n errorDescription: url.searchParams.get('error_description') ?? undefined,\n state: url.searchParams.get('state'),\n }\n }\n\n return null\n}\n\nexport function stripHostedAuthCallbackParams(url: URL): string {\n const nextUrl = new URL(url.toString())\n HOSTED_AUTH_CALLBACK_QUERY_KEYS.forEach((key) => {\n nextUrl.searchParams.delete(key)\n })\n\n return `${nextUrl.pathname}${nextUrl.search}${nextUrl.hash}`\n}\n\nexport function buildHostedAuthSession(\n response: HostedAuthTokenExchangeResponse,\n config: HostedAuthConfig,\n now = Date.now()\n): HostedAuthSession {\n return {\n accessToken: response.access_token,\n refreshToken: response.refresh_token,\n idToken: response.id_token,\n tokenType: response.token_type,\n address: response.address,\n clientId: config.clientId,\n redirectUri: config.redirectUri,\n expiresAt: now + response.expires_in * 1000,\n refreshExpiresAt: now + response.refresh_expires_in * 1000,\n }\n}\n\nexport function applyRefreshResponse(\n session: HostedAuthSession,\n response: JwtRefreshResponse,\n now = Date.now()\n): HostedAuthSession {\n return {\n ...session,\n accessToken: response.token,\n refreshToken: response.refresh_token,\n expiresAt: now + response.expires_in * 1000,\n refreshExpiresAt: now + response.refresh_expires_in * 1000,\n }\n}\n\nexport function isHostedAuthSessionActive(\n session: HostedAuthSession,\n now = Date.now(),\n skewMs = HOSTED_AUTH_CLOCK_SKEW_MS\n): boolean {\n return session.expiresAt > now + skewMs\n}\n\nexport function isHostedAuthRefreshActive(\n session: HostedAuthSession,\n now = Date.now(),\n skewMs = HOSTED_AUTH_CLOCK_SKEW_MS\n): boolean {\n return session.refreshExpiresAt > now + skewMs\n}\n","export class AccountingApiError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly detail?: string\n ) {\n super(message)\n this.name = 'AccountingApiError'\n Object.setPrototypeOf(this, AccountingApiError.prototype)\n }\n}\n\nexport class NetworkError extends Error {\n constructor(\n message: string,\n public readonly cause?: Error\n ) {\n super(message)\n this.name = 'NetworkError'\n Object.setPrototypeOf(this, NetworkError.prototype)\n }\n}\n\nexport class ValidationError extends Error {\n constructor(\n message: string,\n public readonly field?: string\n ) {\n super(message)\n this.name = 'ValidationError'\n Object.setPrototypeOf(this, ValidationError.prototype)\n }\n}\n\nexport class HostedAuthError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'HostedAuthError'\n Object.setPrototypeOf(this, HostedAuthError.prototype)\n }\n}\n\nexport class HostedAuthRequiredError extends HostedAuthError {\n constructor(\n message = 'Hosted redirect authentication is required. Start login with useHostedRedirectAuth().'\n ) {\n super(message)\n this.name = 'HostedAuthRequiredError'\n Object.setPrototypeOf(this, HostedAuthRequiredError.prototype)\n }\n}\n\nexport class HostedAuthStateMismatchError extends HostedAuthError {\n constructor(message = 'Hosted authentication returned an invalid state value.') {\n super(message)\n this.name = 'HostedAuthStateMismatchError'\n Object.setPrototypeOf(this, HostedAuthStateMismatchError.prototype)\n }\n}\n","import { AccountingApiError, NetworkError } from './errors'\n\nexport interface HttpClientConfig {\n baseUrl: string\n timeout?: number\n headers?: Record<string, string>\n}\n\nexport class HttpClient {\n private readonly baseUrl: string\n private readonly timeout: number\n private readonly headers: Record<string, string>\n\n constructor(config: HttpClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '')\n this.timeout = config.timeout ?? 30000\n this.headers = {\n 'Content-Type': 'application/json',\n ...config.headers,\n }\n }\n\n async get<T>(path: string): Promise<T> {\n return this.request<T>('GET', path)\n }\n\n async post<T>(path: string, body?: unknown): Promise<T> {\n return this.request<T>('POST', path, body)\n }\n\n getBaseUrl(): string {\n return this.baseUrl\n }\n\n setHeader(name: string, value: string): void {\n this.headers[name] = value\n }\n\n removeHeader(name: string): void {\n delete this.headers[name]\n }\n\n getHeader(name: string): string | undefined {\n return this.headers[name]\n }\n\n private async request<T>(method: 'GET' | 'POST', path: string, body?: unknown): Promise<T> {\n const url = `${this.baseUrl}${path}`\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), this.timeout)\n\n try {\n const response = await fetch(url, {\n method,\n headers: this.headers,\n body: body ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n let detail: string | undefined\n try {\n const errorBody = await response.json()\n detail = errorBody.detail || errorBody.error_description || errorBody.message\n } catch {\n detail = await response.text().catch(() => undefined)\n }\n\n throw new AccountingApiError(\n `API request failed: ${response.status} ${response.statusText}`,\n response.status,\n detail\n )\n }\n\n return response.json() as Promise<T>\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof AccountingApiError) {\n throw error\n }\n\n if (error instanceof Error) {\n if (error.name === 'AbortError') {\n throw new NetworkError(`Request timeout after ${this.timeout}ms`)\n }\n throw new NetworkError(`Network request failed: ${error.message}`, error)\n }\n\n throw new NetworkError('Unknown network error occurred')\n }\n }\n}\n","import { HttpClient, type HttpClientConfig } from './http-client'\nimport type {\n Address,\n Bytes32,\n DepositAddressRequest,\n DepositAddressResponse,\n DepositCheckRequest,\n DepositCheckResponse,\n HostedAuthAuthorizeUrlRequest,\n HostedAuthTokenExchangeRequest,\n HostedAuthTokenExchangeResponse,\n JwtLogoutRequest,\n JwtLogoutResponse,\n JwtRefreshRequest,\n JwtRefreshResponse,\n LockFundsRequest,\n ModifyLockRequest,\n HistoryRequest,\n UnlockFundsRequest,\n UnlockAllExpiredRequest,\n TransferFundsRequest,\n TransferLockedFundsRequest,\n WithdrawalRequest,\n WithdrawFromLockRequest,\n BatchBalancesRequest,\n TransactionSubmissionResponse,\n BalanceResponse,\n BatchBalancesResponse,\n HistoryResponse,\n TokenInfoResponse,\n LockedFundsResponse,\n ExpiredLocksResponse,\n TotalLockedBalanceResponse,\n PendingWithdrawalsResponse,\n WithdrawalInfoResponse,\n TransferNonceResponse,\n WithdrawalNonceResponse,\n LockNonceResponse,\n ModifyLockNonceResponse,\n TransferLockedNonceResponse,\n SiweDomainResponse,\n SiweNonceResponse,\n SiweLoginRequest,\n SiweLoginResponse,\n TokenListResponse,\n} from '../types'\nimport { normalizeAddress, normalizeHex } from '../types'\n\nexport type PrivanaClientConfig = HttpClientConfig\nconst PRIVATE_READ_TOKEN_HEADER = 'X-SIWE-Token'\nconst MAX_BATCH_BALANCE_TOKEN_IDS = 100\nconst MAX_HISTORY_PAGE_SIZE = 100\n\nexport class PrivanaClient {\n private readonly http: HttpClient\n\n constructor(config: PrivanaClientConfig) {\n this.http = new HttpClient(config)\n }\n\n getBaseUrl(): string {\n return this.http.getBaseUrl()\n }\n\n async getDepositAddress(request: DepositAddressRequest = {}): Promise<DepositAddressResponse> {\n return this.http.post<DepositAddressResponse>('/v1/accounting/deposits/address', {\n chain_type: request.chain_type ?? 'evm',\n version: request.version ?? 0,\n })\n }\n\n async checkDeposit(request: DepositCheckRequest): Promise<DepositCheckResponse> {\n return this.http.post<DepositCheckResponse>('/v1/accounting/deposits/check', {\n chain_type: request.chain_type ?? 'evm',\n chain_id: request.chain_id,\n tx_hash: normalizeHex(request.tx_hash),\n amount: String(request.amount),\n log_index: request.log_index ?? 0,\n version: request.version ?? 0,\n })\n }\n\n async getDepositStatus(depositId: string): Promise<DepositCheckResponse> {\n return this.http.get<DepositCheckResponse>(`/v1/accounting/deposits/status/${depositId}`)\n }\n\n async getBalance(tokenId: Bytes32 | string): Promise<BalanceResponse> {\n const token = normalizeHex(tokenId)\n return this.http.get<BalanceResponse>(`/v1/accounting/balances/${token}`)\n }\n\n async getBatchBalances(request: BatchBalancesRequest): Promise<BatchBalancesResponse> {\n if (request.token_ids.length > MAX_BATCH_BALANCE_TOKEN_IDS) {\n throw new Error(\n `Batch balance requests support at most ${MAX_BATCH_BALANCE_TOKEN_IDS} token IDs`\n )\n }\n\n return this.http.post<BatchBalancesResponse>('/v1/accounting/balances/batch', {\n token_ids: request.token_ids.map((id) => normalizeHex(id)),\n })\n }\n\n async getHistory(request: HistoryRequest = {}): Promise<HistoryResponse> {\n const offset = request.offset ?? -1\n const limit = request.limit ?? 50\n\n if (!Number.isSafeInteger(offset)) {\n throw new Error('History offset must be an integer')\n }\n if (!Number.isSafeInteger(limit)) {\n throw new Error('History limit must be an integer')\n }\n if (limit < 0 || limit > MAX_HISTORY_PAGE_SIZE) {\n throw new Error(`History requests support between 0 and ${MAX_HISTORY_PAGE_SIZE} entries`)\n }\n\n const params = new URLSearchParams({\n offset: String(offset),\n limit: String(limit),\n })\n return this.http.get<HistoryResponse>(`/v1/accounting/history?${params.toString()}`)\n }\n\n async listTokens(): Promise<TokenListResponse> {\n return this.http.get<TokenListResponse>('/v1/accounting/tokens')\n }\n\n async getTokenInfo(tokenId: Bytes32 | string): Promise<TokenInfoResponse> {\n const token = normalizeHex(tokenId)\n return this.http.get<TokenInfoResponse>(`/v1/accounting/tokens/${token}`)\n }\n\n async lockFunds(request: LockFundsRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/funds/lock', {\n service_address: normalizeAddress(request.service_address),\n token_id: normalizeHex(request.token_id),\n amount: String(request.amount),\n expiry: String(request.expiry),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n })\n }\n\n async modifyLock(request: ModifyLockRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/funds/modify-lock', {\n lock_id: request.lock_id,\n amount: String(request.amount),\n new_expiry: String(request.new_expiry),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n })\n }\n\n async unlockFunds(request: UnlockFundsRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/funds/unlock', {\n user_address: normalizeAddress(request.user_address),\n lock_id: request.lock_id,\n })\n }\n\n async unlockAllExpired(request: UnlockAllExpiredRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>(\n '/v1/accounting/funds/unlock-all-expired',\n {\n user_address: normalizeAddress(request.user_address),\n }\n )\n }\n\n async getLockedFunds(serviceAddress?: Address | string): Promise<LockedFundsResponse> {\n const queryParams = serviceAddress ? `?service_address=${normalizeAddress(serviceAddress)}` : ''\n return this.http.get<LockedFundsResponse>(`/v1/accounting/funds/locked${queryParams}`)\n }\n\n async getTotalLockedBalance(tokenId: Bytes32 | string): Promise<TotalLockedBalanceResponse> {\n const token = normalizeHex(tokenId)\n return this.http.get<TotalLockedBalanceResponse>(`/v1/accounting/funds/locked/total/${token}`)\n }\n\n async getExpiredLocks(): Promise<ExpiredLocksResponse> {\n return this.http.get<ExpiredLocksResponse>('/v1/accounting/funds/expired')\n }\n\n async transferFunds(request: TransferFundsRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/funds/transfer', {\n to_address: normalizeAddress(request.to_address),\n token_id: normalizeHex(request.token_id),\n amount: String(request.amount),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n })\n }\n\n async getTransferNonce(userAddress: Address | string): Promise<TransferNonceResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<TransferNonceResponse>(`/v1/accounting/funds/transfer/nonce/${user}`)\n }\n\n async getLockNonce(userAddress: Address | string): Promise<LockNonceResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<LockNonceResponse>(`/v1/accounting/funds/lock/nonce/${user}`)\n }\n\n async getModifyLockNonce(userAddress: Address | string): Promise<ModifyLockNonceResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<ModifyLockNonceResponse>(`/v1/accounting/funds/modify-lock/nonce/${user}`)\n }\n\n async transferLockedFunds(\n request: TransferLockedFundsRequest\n ): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/funds/transfer-locked', {\n user_address: normalizeAddress(request.user_address),\n lock_id: request.lock_id,\n to_address: normalizeAddress(request.to_address),\n amount: String(request.amount),\n service_address: normalizeAddress(request.service_address),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n })\n }\n\n async withdrawFromLock(request: WithdrawFromLockRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>(\n '/v1/accounting/funds/withdraw-from-lock',\n {\n to_address: normalizeAddress(request.to_address),\n lock_id: request.lock_id,\n amount: String(request.amount),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n }\n )\n }\n\n async requestWithdrawal(request: WithdrawalRequest): Promise<TransactionSubmissionResponse> {\n return this.http.post<TransactionSubmissionResponse>('/v1/accounting/withdraw', {\n token_id: normalizeHex(request.token_id),\n amount: String(request.amount),\n nonce: String(request.nonce),\n signature: normalizeHex(request.signature),\n })\n }\n\n async getWithdrawalNonce(userAddress: Address | string): Promise<WithdrawalNonceResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<WithdrawalNonceResponse>(`/v1/accounting/withdraw/nonce/${user}`)\n }\n\n async getTransferLockedNonce(\n serviceAddress: Address | string\n ): Promise<TransferLockedNonceResponse> {\n const service = normalizeAddress(serviceAddress)\n return this.http.get<TransferLockedNonceResponse>(\n `/v1/accounting/funds/transfer-locked/nonce/${service}`\n )\n }\n\n async getPendingWithdrawals(userAddress: Address | string): Promise<PendingWithdrawalsResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<PendingWithdrawalsResponse>(`/v1/accounting/withdraw/pending/${user}`)\n }\n\n async getWithdrawalInfo(index: number): Promise<WithdrawalInfoResponse> {\n return this.http.get<WithdrawalInfoResponse>(`/v1/accounting/withdraw/${index}`)\n }\n\n async getSiweDomain(): Promise<SiweDomainResponse> {\n return this.http.get<SiweDomainResponse>('/v1/accounting/auth/domain')\n }\n\n async getSiweNonce(userAddress: Address | string): Promise<SiweNonceResponse> {\n const user = normalizeAddress(userAddress)\n return this.http.get<SiweNonceResponse>(`/v1/accounting/auth/nonce?address=${user}`)\n }\n\n async loginWithSiwe(request: SiweLoginRequest): Promise<SiweLoginResponse> {\n return this.http.post<SiweLoginResponse>('/v1/accounting/auth/login', {\n siwe_message: request.siwe_message,\n signature: normalizeHex(request.signature),\n })\n }\n\n getHostedAuthAuthorizeUrl(request: HostedAuthAuthorizeUrlRequest): string {\n const url = new URL(\n 'v1/accounting/auth/authorize',\n `${this.http.getBaseUrl().replace(/\\/$/, '')}/`\n )\n url.searchParams.set('client_id', request.client_id)\n url.searchParams.set('redirect_uri', request.redirect_uri)\n url.searchParams.set('code_challenge', request.code_challenge)\n url.searchParams.set('state', request.state)\n url.searchParams.set('chain_id', String(request.chain_id))\n url.searchParams.set('response_mode', request.response_mode ?? 'redirect')\n url.searchParams.set('code_challenge_method', request.code_challenge_method ?? 'S256')\n return url.toString()\n }\n\n async exchangeHostedAuthCode(\n request: HostedAuthTokenExchangeRequest\n ): Promise<HostedAuthTokenExchangeResponse> {\n return this.http.post<HostedAuthTokenExchangeResponse>('/v1/accounting/auth/token', {\n grant_type: request.grant_type ?? 'authorization_code',\n code: request.code,\n code_verifier: request.code_verifier,\n client_id: request.client_id,\n redirect_uri: request.redirect_uri,\n })\n }\n\n async refreshJwtSession(request: JwtRefreshRequest): Promise<JwtRefreshResponse> {\n return this.http.post<JwtRefreshResponse>('/v1/accounting/auth/jwt/refresh', {\n refresh_token: request.refresh_token,\n })\n }\n\n async logoutJwtSession(request: JwtLogoutRequest = {}): Promise<JwtLogoutResponse> {\n return this.http.post<JwtLogoutResponse>('/v1/accounting/auth/jwt/logout', {\n refresh_token: request.refresh_token,\n revoke_all: request.revoke_all ?? false,\n })\n }\n\n setPrivateReadToken(token: string): void {\n this.http.removeHeader('Authorization')\n this.http.setHeader(PRIVATE_READ_TOKEN_HEADER, token)\n }\n\n getPrivateReadToken(): string | undefined {\n return this.http.getHeader(PRIVATE_READ_TOKEN_HEADER)\n }\n\n clearPrivateReadToken(): void {\n this.http.removeHeader(PRIVATE_READ_TOKEN_HEADER)\n }\n\n setBearerToken(token: string): void {\n this.http.removeHeader(PRIVATE_READ_TOKEN_HEADER)\n this.http.setHeader('Authorization', `Bearer ${token}`)\n }\n\n clearBearerToken(): void {\n this.http.removeHeader('Authorization')\n }\n}\n","import type { Address, Bytes32 } from '../types'\n\nexport interface EIP712Domain {\n name: string\n version: string\n chainId: number\n verifyingContract: Address\n}\n\nexport function createDomain(chainId: number, verifyingContract: Address): EIP712Domain {\n return {\n name: 'AccountingModule',\n version: '1',\n chainId,\n verifyingContract,\n }\n}\n\nexport const LOCK_TYPES = {\n Lock: [\n { name: 'serviceAddress', type: 'address' },\n { name: 'tokenId', type: 'bytes32' },\n { name: 'amount', type: 'uint256' },\n { name: 'expiry', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n ],\n} as const\n\nexport const TRANSFER_TYPES = {\n Transfer: [\n { name: 'toAddress', type: 'address' },\n { name: 'tokenId', type: 'bytes32' },\n { name: 'amount', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n ],\n} as const\n\nexport const TRANSFER_LOCKED_TYPES = {\n TransferLocked: [\n { name: 'userAddress', type: 'address' },\n { name: 'toAddress', type: 'address' },\n { name: 'lockId', type: 'uint256' },\n { name: 'amount', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n { name: 'serviceAddress', type: 'address' },\n ],\n} as const\n\nexport const WITHDRAW_TYPES = {\n Withdraw: [\n { name: 'tokenId', type: 'bytes32' },\n { name: 'amount', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n ],\n} as const\n\nexport const MODIFY_LOCK_TYPES = {\n ModifyLock: [\n { name: 'lockId', type: 'uint256' },\n { name: 'amount', type: 'uint256' },\n { name: 'newExpiry', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n ],\n} as const\n\nexport const WITHDRAW_FROM_LOCK_TYPES = {\n WithdrawFromLock: [\n { name: 'userAddress', type: 'address' },\n { name: 'toAddress', type: 'address' },\n { name: 'lockId', type: 'uint256' },\n { name: 'amount', type: 'uint256' },\n { name: 'nonce', type: 'uint256' },\n ],\n} as const\n\nexport interface LockMessage {\n serviceAddress: Address\n tokenId: Bytes32\n amount: bigint\n expiry: bigint\n nonce: bigint\n}\n\nexport interface TransferMessage {\n toAddress: Address\n tokenId: Bytes32\n amount: bigint\n nonce: bigint\n}\n\nexport interface TransferLockedMessage {\n userAddress: Address\n toAddress: Address\n lockId: bigint\n amount: bigint\n nonce: bigint\n serviceAddress: Address\n}\n\nexport interface WithdrawMessage {\n tokenId: Bytes32\n amount: bigint\n nonce: bigint\n}\n\nexport interface ModifyLockMessage {\n lockId: bigint\n amount: bigint\n newExpiry: bigint\n nonce: bigint\n}\n\nexport interface WithdrawFromLockMessage {\n userAddress: Address\n toAddress: Address\n lockId: bigint\n amount: bigint\n nonce: bigint\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport { createDomain, LOCK_TYPES, type LockMessage } from './eip712-types'\n\nexport interface SignLockParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: LockMessage\n}\n\nexport async function signLockMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignLockParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: LOCK_TYPES,\n primaryType: 'Lock',\n message,\n })\n\n return signature\n}\n\nexport function createLockExpiry(minutesFromNow: number = 60): bigint {\n return BigInt(Math.floor(Date.now() / 1000) + minutesFromNow * 60)\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport { createDomain, MODIFY_LOCK_TYPES, type ModifyLockMessage } from './eip712-types'\n\nexport interface SignModifyLockParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: ModifyLockMessage\n}\n\nexport async function signModifyLockMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignModifyLockParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: MODIFY_LOCK_TYPES,\n primaryType: 'ModifyLock',\n message,\n })\n\n return signature\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport { createDomain, TRANSFER_TYPES, type TransferMessage } from './eip712-types'\n\nexport interface SignTransferParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: TransferMessage\n}\n\nexport async function signTransferMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignTransferParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: TRANSFER_TYPES,\n primaryType: 'Transfer',\n message,\n })\n\n return signature\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport { createDomain, TRANSFER_LOCKED_TYPES, type TransferLockedMessage } from './eip712-types'\n\nexport interface SignTransferLockedParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: TransferLockedMessage\n}\n\nexport async function signTransferLockedMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignTransferLockedParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: TRANSFER_LOCKED_TYPES,\n primaryType: 'TransferLocked',\n message,\n })\n\n return signature\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport { createDomain, WITHDRAW_TYPES, type WithdrawMessage } from './eip712-types'\n\nexport interface SignWithdrawParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: WithdrawMessage\n}\n\nexport async function signWithdrawMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignWithdrawParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: WITHDRAW_TYPES,\n primaryType: 'Withdraw',\n message,\n })\n\n return signature\n}\n","import type { WalletClient } from 'viem'\nimport type { Address } from '../types'\nimport {\n createDomain,\n WITHDRAW_FROM_LOCK_TYPES,\n type WithdrawFromLockMessage,\n} from './eip712-types'\n\nexport interface SignWithdrawFromLockParams {\n walletClient: WalletClient\n chainId: number\n verifyingContract: Address\n message: WithdrawFromLockMessage\n}\n\nexport async function signWithdrawFromLockMessage({\n walletClient,\n chainId,\n verifyingContract,\n message,\n}: SignWithdrawFromLockParams): Promise<`0x${string}`> {\n const account = walletClient.account\n if (!account) {\n throw new Error('No account connected to wallet client')\n }\n\n const domain = createDomain(chainId, verifyingContract)\n\n const signature = await walletClient.signTypedData({\n account,\n domain,\n types: WITHDRAW_FROM_LOCK_TYPES,\n primaryType: 'WithdrawFromLock',\n message,\n })\n\n return signature\n}\n","'use client'\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ReactNode,\n} from 'react'\nimport { zeroAddress } from 'viem'\nimport { PrivanaClient } from '../client'\nimport {\n applyRefreshResponse,\n createHostedAuthStorageKey,\n isHostedAuthRefreshActive,\n isHostedAuthSessionActive,\n} from '../auth'\nimport { HostedAuthRequiredError } from '../client'\nimport type { Address, HostedAuthConfig, HostedAuthSession, NetworkConfig } from '../types'\nimport { NETWORK_CONFIG, type TokenConfig } from '../types'\nimport { SUPPORTED_CHAINS, type ChainConfig } from '../types/chains'\n\nexport type TokensStatus = 'loading' | 'ready' | 'error'\n\nexport interface PrivanaContextValue {\n client: PrivanaClient\n networkConfig: NetworkConfig\n enabledTokens: TokenConfig[]\n defaultToken: TokenConfig | undefined\n getTokenById: (id: string) => TokenConfig | undefined\n getChainById: (id: number) => ChainConfig | undefined\n chains: ChainConfig[]\n tokensStatus: TokensStatus\n tokensError?: Error\n pollingInterval: number\n serviceAddress?: Address\n hostedAuthConfig: HostedAuthConfig | null\n hostedAuthSession: HostedAuthSession | null\n setHostedAuthSession: (session: HostedAuthSession | null) => void\n clearHostedAuthSession: () => void\n refreshHostedAuthSession: () => Promise<HostedAuthSession>\n}\n\nconst PrivanaContext = createContext<PrivanaContextValue | null>(null)\n\nexport function readStoredHostedAuthSession(\n storage: Pick<Storage, 'getItem' | 'removeItem'>,\n hostedAuthStorageKey: string,\n now = Date.now()\n): HostedAuthSession | null {\n const raw = storage.getItem(hostedAuthStorageKey)\n if (!raw) {\n return null\n }\n\n try {\n const parsed = JSON.parse(raw) as HostedAuthSession\n if (!isHostedAuthRefreshActive(parsed, now, 0)) {\n storage.removeItem(hostedAuthStorageKey)\n return null\n }\n return parsed\n } catch {\n storage.removeItem(hostedAuthStorageKey)\n return null\n }\n}\n\nexport function syncHostedAuthSessionToClient(\n client: Pick<PrivanaClient, 'clearBearerToken' | 'clearPrivateReadToken' | 'setBearerToken'>,\n hostedAuthConfig: HostedAuthConfig | null,\n hostedAuthSession: HostedAuthSession | null\n): void {\n if (!hostedAuthConfig) {\n client.clearBearerToken()\n client.clearPrivateReadToken()\n return\n }\n\n if (hostedAuthSession && isHostedAuthSessionActive(hostedAuthSession)) {\n client.setBearerToken(hostedAuthSession.accessToken)\n client.clearPrivateReadToken()\n return\n }\n\n client.clearBearerToken()\n client.clearPrivateReadToken()\n}\n\n/**\n * Default network configuration (testnet).\n */\nconst DEFAULT_NETWORK_CONFIG = NETWORK_CONFIG.testnet\n\nexport interface PrivanaProviderProps {\n children: ReactNode\n /**\n * Network configuration including chainId, accountingContract, apiUrl, and name.\n * Defaults to testnet config. Partial overrides are merged with defaults.\n */\n networkConfig?: Partial<NetworkConfig>\n /**\n * Optional list of token IDs to filter from the API response.\n * When provided, only tokens whose ID matches this list are enabled.\n * When omitted, all tokens returned by the API are enabled.\n */\n tokens?: string[]\n /**\n * Chain configurations to use. Defaults to SDK built-in chains from config.json.\n * Pass custom ChainConfig[] for deployments targeting different chains.\n */\n chains?: ChainConfig[]\n pollingInterval?: number\n /**\n * The service address for lock operations.\n */\n serviceAddress?: Address\n /**\n * Optional hosted redirect auth configuration for cross-domain browser apps.\n */\n hostedAuth?: HostedAuthConfig\n}\n\nexport function PrivanaProvider({\n children,\n networkConfig: networkConfigOverride,\n tokens,\n chains,\n pollingInterval = 10000,\n serviceAddress,\n hostedAuth,\n}: PrivanaProviderProps) {\n const networkConfig = useMemo<NetworkConfig>(() => {\n const config: NetworkConfig = {\n ...DEFAULT_NETWORK_CONFIG,\n ...networkConfigOverride,\n }\n\n // Validate that critical fields are present and valid\n if (!config.chainId || config.chainId <= 0) {\n throw new Error('PrivanaProvider: networkConfig.chainId must be a positive number')\n }\n if (!config.accountingContract || !config.accountingContract.startsWith('0x')) {\n throw new Error('PrivanaProvider: networkConfig.accountingContract must be a valid address')\n }\n if (!config.apiUrl) {\n throw new Error('PrivanaProvider: networkConfig.apiUrl must be provided')\n }\n\n return config\n // eslint-disable-next-line react-hooks/exhaustive-deps -- Use individual properties for stable memoization\n }, [\n networkConfigOverride?.chainId,\n networkConfigOverride?.name,\n networkConfigOverride?.accountingContract,\n networkConfigOverride?.apiUrl,\n ])\n\n const resolvedChains = useMemo(() => {\n if (chains && chains.length > 0) return chains\n return SUPPORTED_CHAINS\n }, [chains])\n\n const client = useMemo(\n () => new PrivanaClient({ baseUrl: networkConfig.apiUrl }),\n [networkConfig.apiUrl]\n )\n\n const [allTokens, setAllTokens] = useState<TokenConfig[]>([])\n const [tokensStatus, setTokensStatus] = useState<TokensStatus>('loading')\n const [tokensError, setTokensError] = useState<Error | undefined>()\n\n useEffect(() => {\n setTokensStatus('loading')\n setTokensError(undefined)\n client\n .listTokens()\n .then(({ tokens: list }) => {\n setAllTokens(\n list.map((t) => ({\n id: t.token_id,\n symbol: t.symbol,\n decimals: t.decimals,\n contract: t.token_address ?? zeroAddress,\n name: t.name,\n chainId: t.chain_id,\n }))\n )\n setTokensStatus('ready')\n })\n .catch((err) => {\n setTokensError(err instanceof Error ? err : new Error(String(err)))\n setTokensStatus('error')\n })\n }, [client])\n\n const enabledTokens = useMemo(() => {\n if (tokens && tokens.length > 0) {\n const allowed = new Set(tokens.map((id) => id.toLowerCase()))\n return allTokens.filter((t) => allowed.has(t.id.toLowerCase()))\n }\n return allTokens\n }, [allTokens, tokens])\n\n const tokenById = useMemo(\n () => Object.fromEntries(enabledTokens.map((t) => [t.id.toLowerCase(), t])),\n [enabledTokens]\n )\n\n const getTokenById = useMemo(() => (id: string) => tokenById[id.toLowerCase()], [tokenById])\n\n const chainById = useMemo(\n () => Object.fromEntries(resolvedChains.map((c) => [c.id, c])),\n [resolvedChains]\n )\n\n const getChainById = useMemo(() => (id: number) => chainById[id], [chainById])\n\n const hostedAuthConfig = useMemo<HostedAuthConfig | null>(() => {\n if (!hostedAuth) return null\n\n const clientId = hostedAuth.clientId.trim()\n const redirectUri = hostedAuth.redirectUri.trim()\n if (!clientId) {\n throw new Error(\n 'PrivanaProvider: hostedAuth.clientId must be provided when hostedAuth is enabled'\n )\n }\n if (!redirectUri) {\n throw new Error(\n 'PrivanaProvider: hostedAuth.redirectUri must be provided when hostedAuth is enabled'\n )\n }\n\n return {\n clientId,\n redirectUri,\n }\n }, [hostedAuth])\n\n const hostedAuthStorageKey = useMemo(\n () =>\n hostedAuthConfig ? createHostedAuthStorageKey(networkConfig.apiUrl, hostedAuthConfig) : null,\n [hostedAuthConfig, networkConfig.apiUrl]\n )\n\n const [hostedAuthSession, setHostedAuthSessionState] = useState<HostedAuthSession | null>(null)\n const hostedAuthSessionRef = useRef<HostedAuthSession | null>(null)\n const hostedAuthStateVersionRef = useRef(0)\n const hostedAuthRefreshInflight = useRef<Promise<HostedAuthSession> | null>(null)\n\n const clearHostedAuthSession = useCallback(() => {\n hostedAuthStateVersionRef.current += 1\n hostedAuthSessionRef.current = null\n hostedAuthRefreshInflight.current = null\n setHostedAuthSessionState(null)\n client.clearBearerToken()\n client.clearPrivateReadToken()\n if (hostedAuthStorageKey && typeof window !== 'undefined') {\n window.sessionStorage.removeItem(hostedAuthStorageKey)\n }\n }, [client, hostedAuthStorageKey])\n\n const setHostedAuthSession = useCallback(\n (session: HostedAuthSession | null) => {\n if (!session) {\n clearHostedAuthSession()\n return\n }\n\n hostedAuthStateVersionRef.current += 1\n hostedAuthSessionRef.current = session\n setHostedAuthSessionState(session)\n if (isHostedAuthSessionActive(session)) {\n client.setBearerToken(session.accessToken)\n } else {\n client.clearBearerToken()\n }\n client.clearPrivateReadToken()\n\n if (hostedAuthStorageKey && typeof window !== 'undefined') {\n window.sessionStorage.setItem(hostedAuthStorageKey, JSON.stringify(session))\n }\n },\n [clearHostedAuthSession, client, hostedAuthStorageKey]\n )\n\n const refreshHostedAuthSession = useCallback(async (): Promise<HostedAuthSession> => {\n if (!hostedAuthConfig) {\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication is not configured for this provider.'\n )\n }\n const currentSession = hostedAuthSessionRef.current\n if (!currentSession) {\n throw new HostedAuthRequiredError()\n }\n if (!isHostedAuthRefreshActive(currentSession)) {\n clearHostedAuthSession()\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication has expired. Start login again.'\n )\n }\n\n if (hostedAuthRefreshInflight.current) {\n return hostedAuthRefreshInflight.current\n }\n\n const refreshPromise = (async () => {\n const refreshVersion = hostedAuthStateVersionRef.current\n\n try {\n const response = await client.refreshJwtSession({\n refresh_token: currentSession.refreshToken,\n })\n if (refreshVersion !== hostedAuthStateVersionRef.current) {\n const latestSession = hostedAuthSessionRef.current\n if (latestSession) {\n return latestSession\n }\n\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication has changed. Start login again.'\n )\n }\n\n const nextSession = applyRefreshResponse(currentSession, response)\n setHostedAuthSession(nextSession)\n return nextSession\n } catch (error) {\n if (refreshVersion === hostedAuthStateVersionRef.current) {\n clearHostedAuthSession()\n }\n throw error\n } finally {\n hostedAuthRefreshInflight.current = null\n }\n })()\n\n hostedAuthRefreshInflight.current = refreshPromise\n return refreshPromise\n }, [clearHostedAuthSession, client, hostedAuthConfig, setHostedAuthSession])\n\n useEffect(() => {\n hostedAuthSessionRef.current = hostedAuthSession\n }, [hostedAuthSession])\n\n useEffect(() => {\n if (!hostedAuthStorageKey || typeof window === 'undefined') {\n hostedAuthStateVersionRef.current += 1\n hostedAuthSessionRef.current = null\n hostedAuthRefreshInflight.current = null\n setHostedAuthSessionState(null)\n return\n }\n const restoredSession = readStoredHostedAuthSession(window.sessionStorage, hostedAuthStorageKey)\n hostedAuthStateVersionRef.current += 1\n hostedAuthSessionRef.current = restoredSession\n hostedAuthRefreshInflight.current = null\n setHostedAuthSessionState(restoredSession)\n }, [hostedAuthStorageKey])\n\n useEffect(() => {\n syncHostedAuthSessionToClient(client, hostedAuthConfig, hostedAuthSession)\n }, [client, hostedAuthConfig, hostedAuthSession])\n\n const value = useMemo<PrivanaContextValue>(\n () => ({\n client,\n networkConfig,\n enabledTokens,\n defaultToken: enabledTokens[0],\n getTokenById,\n getChainById,\n chains: resolvedChains,\n tokensStatus,\n tokensError,\n pollingInterval,\n serviceAddress,\n hostedAuthConfig,\n hostedAuthSession,\n setHostedAuthSession,\n clearHostedAuthSession,\n refreshHostedAuthSession,\n }),\n [\n client,\n networkConfig,\n enabledTokens,\n getTokenById,\n getChainById,\n resolvedChains,\n tokensStatus,\n tokensError,\n pollingInterval,\n serviceAddress,\n hostedAuthConfig,\n hostedAuthSession,\n setHostedAuthSession,\n clearHostedAuthSession,\n refreshHostedAuthSession,\n ]\n )\n\n return <PrivanaContext.Provider value={value}>{children}</PrivanaContext.Provider>\n}\n\nexport function usePrivanaContext(): PrivanaContextValue {\n const context = useContext(PrivanaContext)\n if (!context) {\n throw new Error('usePrivanaContext must be used within a PrivanaProvider')\n }\n return context\n}\n\nexport function useSafePrivanaContext(): PrivanaContextValue | null {\n return useContext(PrivanaContext)\n}\n","'use client'\n\nimport { usePrivanaContext } from '../context/privana-provider'\n\nexport function usePrivanaClient() {\n const { client } = usePrivanaContext()\n return client\n}\n","'use client'\n\nimport { useCallback, useMemo, useRef, useState } from 'react'\nimport {\n buildHostedAuthSession,\n clearHostedAuthPendingTransaction,\n createHostedAuthPendingStorageKey,\n createHostedAuthState,\n createPkceChallenge,\n createPkceVerifier,\n parseHostedAuthCallback,\n persistHostedAuthPendingTransaction,\n readHostedAuthPendingTransaction,\n stripHostedAuthCallbackParams,\n} from '../auth'\nimport {\n AccountingApiError,\n HostedAuthError,\n HostedAuthRequiredError,\n HostedAuthStateMismatchError,\n} from '../client'\nimport { usePrivanaContext } from '../context'\nimport type { HostedAuthSession } from '../types'\n\nconst hostedAuthExchangeInflight = new Map<string, Promise<HostedAuthSession>>()\n\nfunction normalizeHostedAuthError(error: unknown): HostedAuthError | Error {\n if (error instanceof AccountingApiError && error.detail) {\n return new HostedAuthError(error.detail)\n }\n if (error instanceof Error) {\n return error\n }\n return new HostedAuthError('Hosted authentication failed.')\n}\n\nexport interface UseHostedRedirectAuthResult {\n session: HostedAuthSession | null\n isAuthenticated: boolean\n isLoading: boolean\n error: Error | null\n login: () => Promise<void>\n completeLogin: () => Promise<HostedAuthSession | null>\n logout: () => Promise<void>\n refresh: () => Promise<HostedAuthSession>\n}\n\nexport function useHostedRedirectAuth(): UseHostedRedirectAuthResult {\n const {\n client,\n hostedAuthConfig,\n hostedAuthSession,\n networkConfig,\n setHostedAuthSession,\n clearHostedAuthSession,\n refreshHostedAuthSession,\n } = usePrivanaContext()\n const [error, setError] = useState<Error | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const loginInflight = useRef<Promise<void> | null>(null)\n const completionInflight = useRef<Promise<HostedAuthSession | null> | null>(null)\n const pendingStorageKey = useMemo(\n () =>\n hostedAuthConfig\n ? createHostedAuthPendingStorageKey(client.getBaseUrl(), hostedAuthConfig)\n : null,\n [client, hostedAuthConfig]\n )\n\n const clearPendingLogin = useCallback(() => {\n if (!pendingStorageKey || typeof window === 'undefined') return\n clearHostedAuthPendingTransaction(window.sessionStorage, pendingStorageKey)\n }, [pendingStorageKey])\n\n const login = useCallback(async (): Promise<void> => {\n if (!hostedAuthConfig) {\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication is not configured for this provider.'\n )\n }\n if (typeof window === 'undefined') {\n throw new HostedAuthError('Hosted redirect authentication requires a browser environment.')\n }\n if (!pendingStorageKey) {\n throw new HostedAuthError('Hosted redirect authentication storage is not configured.')\n }\n if (loginInflight.current) {\n return loginInflight.current\n }\n\n const loginPromise = (async () => {\n setIsLoading(true)\n setError(null)\n\n try {\n const verifier = createPkceVerifier()\n const codeChallenge = await createPkceChallenge(verifier)\n const state = createHostedAuthState()\n persistHostedAuthPendingTransaction(window.sessionStorage, pendingStorageKey, {\n codeVerifier: verifier,\n state,\n })\n const authorizeUrl = client.getHostedAuthAuthorizeUrl({\n client_id: hostedAuthConfig.clientId,\n redirect_uri: hostedAuthConfig.redirectUri,\n code_challenge: codeChallenge,\n chain_id: networkConfig.chainId,\n code_challenge_method: 'S256',\n response_mode: 'redirect',\n state,\n })\n\n window.location.assign(authorizeUrl)\n } catch (loginError) {\n clearPendingLogin()\n const normalizedError = normalizeHostedAuthError(loginError)\n setError(normalizedError)\n throw normalizedError\n } finally {\n loginInflight.current = null\n setIsLoading(false)\n }\n })()\n\n loginInflight.current = loginPromise\n return loginPromise\n }, [clearPendingLogin, client, hostedAuthConfig, networkConfig.chainId, pendingStorageKey])\n\n const completeLogin = useCallback(async (): Promise<HostedAuthSession | null> => {\n if (!hostedAuthConfig) {\n throw new HostedAuthRequiredError(\n 'Hosted redirect authentication is not configured for this provider.'\n )\n }\n if (typeof window === 'undefined') {\n throw new HostedAuthError('Hosted redirect authentication requires a browser environment.')\n }\n if (!pendingStorageKey) {\n throw new HostedAuthError('Hosted redirect authentication storage is not configured.')\n }\n if (completionInflight.current) {\n return completionInflight.current\n }\n\n const completionPromise = (async () => {\n setIsLoading(true)\n setError(null)\n\n const callbackUrl = new URL(window.location.href)\n const cleanupCallbackUrl = () => {\n window.history.replaceState(null, '', stripHostedAuthCallbackParams(callbackUrl))\n }\n\n try {\n const callback = parseHostedAuthCallback(callbackUrl, hostedAuthConfig.redirectUri)\n if (!callback) {\n return null\n }\n\n const pending = readHostedAuthPendingTransaction(window.sessionStorage, pendingStorageKey)\n if (!pending) {\n clearPendingLogin()\n cleanupCallbackUrl()\n throw new HostedAuthError(\n 'Hosted authentication response could not be matched to a pending login request.'\n )\n }\n if (!callback.state || callback.state !== pending.state) {\n clearPendingLogin()\n cleanupCallbackUrl()\n throw new HostedAuthStateMismatchError()\n }\n if ('error' in callback) {\n clearPendingLogin()\n cleanupCallbackUrl()\n throw new HostedAuthError(\n callback.errorDescription || callback.error || 'Hosted authentication failed.'\n )\n }\n\n const { codeVerifier } = pending\n const exchangeKey = `${pendingStorageKey}:${callback.code}:${pending.state}`\n let exchangePromise = hostedAuthExchangeInflight.get(exchangeKey)\n\n if (!exchangePromise) {\n exchangePromise = (async () => {\n const response = await client.exchangeHostedAuthCode({\n code: callback.code,\n code_verifier: codeVerifier,\n client_id: hostedAuthConfig.clientId,\n redirect_uri: hostedAuthConfig.redirectUri,\n })\n\n const session = buildHostedAuthSession(response, hostedAuthConfig)\n setHostedAuthSession(session)\n clearPendingLogin()\n cleanupCallbackUrl()\n return session\n })()\n\n hostedAuthExchangeInflight.set(exchangeKey, exchangePromise)\n }\n\n try {\n return await exchangePromise\n } finally {\n if (hostedAuthExchangeInflight.get(exchangeKey) === exchangePromise) {\n hostedAuthExchangeInflight.delete(exchangeKey)\n }\n }\n } catch (completionError) {\n const normalizedError = normalizeHostedAuthError(completionError)\n setError(normalizedError)\n throw normalizedError\n } finally {\n completionInflight.current = null\n setIsLoading(false)\n }\n })()\n\n completionInflight.current = completionPromise\n return completionPromise\n }, [clearPendingLogin, client, hostedAuthConfig, pendingStorageKey, setHostedAuthSession])\n\n const logout = useCallback(async (): Promise<void> => {\n setError(null)\n try {\n if (hostedAuthSession) {\n await client.logoutJwtSession({\n refresh_token: hostedAuthSession.refreshToken,\n })\n }\n } finally {\n clearHostedAuthSession()\n }\n }, [clearHostedAuthSession, client, hostedAuthSession])\n\n const refresh = useCallback(async (): Promise<HostedAuthSession> => {\n setIsLoading(true)\n setError(null)\n try {\n return await refreshHostedAuthSession()\n } catch (refreshError) {\n const normalizedError =\n refreshError instanceof Error\n ? refreshError\n : new HostedAuthError('Hosted authentication refresh failed.')\n setError(normalizedError)\n throw normalizedError\n } finally {\n setIsLoading(false)\n }\n }, [refreshHostedAuthSession])\n\n return {\n session: hostedAuthSession,\n isAuthenticated: !!hostedAuthSession,\n isLoading,\n error,\n login,\n completeLogin,\n logout,\n refresh,\n }\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n\nexport function formatTokenAmount(amount: string | bigint, decimals: number = 18): string {\n const value = typeof amount === 'string' ? BigInt(amount) : amount\n const divisor = BigInt(10 ** decimals)\n const integerPart = value / divisor\n const fractionalPart = value % divisor\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, '0')\n const twoDecimals = fractionalStr.slice(0, 2).padEnd(2, '0')\n\n const integerWithSpaces = integerPart.toString().replace(/\\B(?=(\\d{3})+(?!\\d))/g, '\\u2009')\n return `${integerWithSpaces}.${twoDecimals}`\n}\n\nexport function parseTokenAmount(amount: string, decimals: number = 18): bigint {\n const sanitized = amount.replace(/[\\s\\u2009]/g, '').replace(/,/g, '.')\n const lastDot = sanitized.lastIndexOf('.')\n const integerPart = lastDot === -1 ? sanitized : sanitized.slice(0, lastDot).replace(/\\./g, '')\n const fractionalPart = lastDot === -1 ? '' : sanitized.slice(lastDot + 1)\n const paddedFractional = fractionalPart.padEnd(decimals, '0').slice(0, decimals)\n return BigInt(integerPart + paddedFractional)\n}\n\nexport function shortenAddress(address: string, chars: number = 4): string {\n if (!address || address.length < chars * 2 + 2) return address\n return `${address.slice(0, chars + 2)}...${address.slice(-chars)}`\n}\n\nexport function formatTimestamp(timestamp: number): string {\n return new Date(timestamp * 1000).toLocaleString()\n}\n\nexport function isExpired(expiry: number): boolean {\n return Math.floor(Date.now() / 1000) > expiry\n}\n\nexport function formatTimeRemaining(expiryTimestamp: number): string {\n const now = Math.floor(Date.now() / 1000)\n const diff = expiryTimestamp - now\n\n if (diff <= 0) return 'Expired'\n\n const days = Math.floor(diff / 86400)\n const hours = Math.floor((diff % 86400) / 3600)\n const minutes = Math.floor((diff % 3600) / 60)\n\n if (days > 0) {\n return hours > 0 ? `${days}d ${hours}h left` : `${days}d left`\n }\n if (hours > 0) {\n return minutes > 0 ? `${hours}h ${minutes}m left` : `${hours}h left`\n }\n return `${minutes}m left`\n}\n\nexport function formatRelativeTime(timestamp: string | number): string {\n const date = typeof timestamp === 'string' ? new Date(timestamp) : new Date(timestamp * 1000)\n const now = new Date()\n const diff = Math.floor((now.getTime() - date.getTime()) / 1000)\n\n if (diff < 60) return 'Just now'\n if (diff < 3600) return `${Math.floor(diff / 60)}m ago`\n if (diff < 86400) return `${Math.floor(diff / 3600)}h ago`\n if (diff < 604800) return `${Math.floor(diff / 86400)}d ago`\n return date.toLocaleDateString()\n}\n","'use client'\n\nimport { useContext, useSyncExternalStore, useRef, useCallback } from 'react'\nimport { WagmiContext } from 'wagmi'\nimport { getAccount, watchAccount } from 'wagmi/actions'\nimport type { Address } from 'viem'\n\ninterface SafeAccountResult {\n address: Address | undefined\n isConnected: boolean\n}\n\nconst defaultResult: SafeAccountResult = {\n address: undefined,\n isConnected: false,\n}\n\nexport function useSafeAccount(): SafeAccountResult {\n const context = useContext(WagmiContext)\n const cacheRef = useRef<SafeAccountResult>(defaultResult)\n\n const subscribe = useCallback(\n (onChange: () => void) => {\n if (!context) return () => {}\n return watchAccount(context, { onChange })\n },\n [context]\n )\n\n const getSnapshot = useCallback(() => {\n if (!context) return defaultResult\n const account = getAccount(context)\n if (\n cacheRef.current.address !== account.address ||\n cacheRef.current.isConnected !== account.isConnected\n ) {\n cacheRef.current = { address: account.address, isConnected: account.isConnected }\n }\n return cacheRef.current\n }, [context])\n\n const getServerSnapshot = useCallback(() => defaultResult, [])\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n","'use client'\n\nimport { useCallback, useContext, useMemo } from 'react'\nimport { createSiweMessage } from 'viem/siwe'\nimport { WagmiContext } from 'wagmi'\nimport { getWalletClient } from 'wagmi/actions'\nimport { isHostedAuthSessionActive } from '../auth'\nimport { AccountingApiError, HostedAuthRequiredError } from '../client'\nimport type { PrivanaClient } from '../client'\nimport { usePrivanaContext } from '../context'\nimport type { Address, HostedAuthSession } from '../types'\nimport { useSafeAccount } from './use-safe-account'\n\nconst AUTH_CLOCK_SKEW_MS = 30_000\nconst INITIAL_AUTH_BACKOFF_MS = 5_000\nconst MAX_AUTH_BACKOFF_MS = 60_000\nconst DEFAULT_SIWE_AUTH_VALIDITY_MS = 24 * 60 * 60 * 1000\nconst PRIVATE_READ_STATEMENT = 'Sign in to Privana to access private account data.'\n\ninterface PrivateReadTokenEntry {\n expiresAt: number\n token: string\n}\n\ninterface PrivateReadFailureEntry {\n backoffMs: number\n retryAt: number\n}\n\nconst privateReadTokenCache = new Map<string, PrivateReadTokenEntry>()\nconst privateReadFailureCache = new Map<string, PrivateReadFailureEntry>()\nconst privateReadInflight = new Map<string, Promise<string>>()\n\nexport async function executeHostedAuthPrivateReadRequest<T>({\n client,\n hostedAuthSession,\n refreshHostedAuthSession,\n request,\n}: {\n client: Pick<PrivanaClient, 'clearPrivateReadToken' | 'setBearerToken'>\n hostedAuthSession: HostedAuthSession | null\n refreshHostedAuthSession: () => Promise<HostedAuthSession>\n request: () => Promise<T>\n}): Promise<T> {\n const ensureHostedAuth = async (forceRefresh: boolean): Promise<string> => {\n if (!hostedAuthSession) {\n throw new HostedAuthRequiredError()\n }\n\n if (!forceRefresh && isHostedAuthSessionActive(hostedAuthSession)) {\n client.clearPrivateReadToken()\n client.setBearerToken(hostedAuthSession.accessToken)\n return hostedAuthSession.accessToken\n }\n\n const refreshed = await refreshHostedAuthSession()\n client.clearPrivateReadToken()\n client.setBearerToken(refreshed.accessToken)\n return refreshed.accessToken\n }\n\n await ensureHostedAuth(false)\n\n try {\n return await request()\n } catch (error) {\n if (!(error instanceof AccountingApiError) || error.statusCode !== 401) {\n throw error\n }\n\n await ensureHostedAuth(true)\n return request()\n }\n}\n\nfunction createScopeKey(apiUrl: string, deploymentChainId: number, address: string): string {\n return `${apiUrl.replace(/\\/$/, '')}:${deploymentChainId}:${address.toLowerCase()}`\n}\n\nfunction getCachedPrivateReadToken(scopeKey: string): string | null {\n const cached = privateReadTokenCache.get(scopeKey)\n if (!cached) return null\n if (cached.expiresAt <= Date.now() + AUTH_CLOCK_SKEW_MS) {\n privateReadTokenCache.delete(scopeKey)\n return null\n }\n return cached.token\n}\n\nfunction clearPrivateReadScope(scopeKey: string, client: PrivanaClient): void {\n privateReadTokenCache.delete(scopeKey)\n privateReadFailureCache.delete(scopeKey)\n client.clearPrivateReadToken()\n}\n\nfunction recordPrivateReadFailure(scopeKey: string): void {\n const previous = privateReadFailureCache.get(scopeKey)\n const backoffMs = Math.min(\n previous ? previous.backoffMs * 2 : INITIAL_AUTH_BACKOFF_MS,\n MAX_AUTH_BACKOFF_MS\n )\n\n privateReadFailureCache.set(scopeKey, {\n backoffMs,\n retryAt: Date.now() + backoffMs,\n })\n}\n\nfunction ensureFailureBackoff(scopeKey: string): void {\n const failure = privateReadFailureCache.get(scopeKey)\n if (!failure) return\n if (failure.retryAt <= Date.now()) {\n privateReadFailureCache.delete(scopeKey)\n return\n }\n\n throw new Error(\n `Private-read authentication is temporarily paused after a recent failure. Retry in ${Math.ceil(\n (failure.retryAt - Date.now()) / 1000\n )}s.`\n )\n}\n\nexport function usePrivateReadRequest(): {\n executePrivateRead<T>(request: () => Promise<T>): Promise<T>\n privateReadAddress: Address | null\n privateReadReady: boolean\n privateReadQueryScope: readonly [string, number, Address | null]\n} {\n const wagmiContext = useContext(WagmiContext)\n const { client, networkConfig, hostedAuthConfig, hostedAuthSession, refreshHostedAuthSession } =\n usePrivanaContext()\n const { address: walletAddress } = useSafeAccount()\n const privateReadAddress = hostedAuthConfig\n ? (hostedAuthSession?.address ?? null)\n : (walletAddress ?? null)\n const privateReadReady = hostedAuthConfig ? !!hostedAuthSession : !!walletAddress\n\n const executePrivateRead = useCallback(\n async <T>(request: () => Promise<T>): Promise<T> => {\n if (hostedAuthConfig) {\n return executeHostedAuthPrivateReadRequest({\n client,\n hostedAuthSession,\n refreshHostedAuthSession,\n request,\n })\n }\n\n if (!wagmiContext) {\n throw new Error('WagmiProvider is required for authenticated private reads')\n }\n if (!walletAddress) {\n throw new Error('No wallet connected')\n }\n\n const walletClient = await getWalletClient(wagmiContext)\n if (!walletClient) {\n throw new Error('No wallet client available')\n }\n\n const apiUrl = networkConfig.apiUrl\n const scopeKey = createScopeKey(apiUrl, networkConfig.chainId, walletAddress)\n\n const getToken = async (forceRefresh: boolean): Promise<string> => {\n const inflight = privateReadInflight.get(scopeKey)\n if (inflight) {\n const token = await inflight\n client.setPrivateReadToken(token)\n return token\n }\n\n if (!forceRefresh) {\n const cached = getCachedPrivateReadToken(scopeKey)\n if (cached) {\n client.setPrivateReadToken(cached)\n return cached\n }\n }\n\n ensureFailureBackoff(scopeKey)\n\n const authPromise = (async () => {\n try {\n const [{ domain }, nonceResponse] = await Promise.all([\n client.getSiweDomain(),\n client.getSiweNonce(walletAddress),\n ])\n const issuedAt = new Date()\n // The nonce must be consumed within its short expiry window, but the backend\n // expects the signed SIWE session itself to be valid for the auth-token window.\n const expirationTime = new Date(issuedAt.getTime() + DEFAULT_SIWE_AUTH_VALIDITY_MS)\n const uri =\n typeof window !== 'undefined' && window.location.origin\n ? window.location.origin\n : apiUrl\n\n const message = createSiweMessage({\n address: walletAddress,\n chainId: walletClient.chain?.id ?? networkConfig.chainId,\n domain,\n expirationTime,\n issuedAt,\n nonce: nonceResponse.nonce,\n statement: PRIVATE_READ_STATEMENT,\n uri,\n version: '1',\n })\n\n const signature = await walletClient.signMessage({\n account: walletClient.account ?? walletAddress,\n message,\n })\n\n const login = await client.loginWithSiwe({\n siwe_message: message,\n signature,\n })\n\n privateReadTokenCache.set(scopeKey, {\n token: login.siwe_token,\n expiresAt: expirationTime.getTime(),\n })\n privateReadFailureCache.delete(scopeKey)\n client.setPrivateReadToken(login.siwe_token)\n return login.siwe_token\n } catch (error) {\n const authError =\n error instanceof Error ? error : new Error('Failed to authenticate private reads')\n clearPrivateReadScope(scopeKey, client)\n recordPrivateReadFailure(scopeKey)\n throw authError\n } finally {\n privateReadInflight.delete(scopeKey)\n }\n })()\n\n // Store the auth promise immediately so concurrent callers reuse it.\n privateReadInflight.set(scopeKey, authPromise)\n return authPromise\n }\n\n await getToken(false)\n\n try {\n return await request()\n } catch (error) {\n if (!(error instanceof AccountingApiError) || error.statusCode !== 401) {\n throw error\n }\n\n clearPrivateReadScope(scopeKey, client)\n await getToken(true)\n return request()\n }\n },\n [\n client,\n hostedAuthConfig,\n hostedAuthSession,\n networkConfig.apiUrl,\n networkConfig.chainId,\n refreshHostedAuthSession,\n walletAddress,\n wagmiContext,\n ]\n )\n\n const privateReadQueryScope = useMemo(\n () => [networkConfig.apiUrl, networkConfig.chainId, privateReadAddress] as const,\n [networkConfig.apiUrl, networkConfig.chainId, privateReadAddress]\n )\n\n return {\n executePrivateRead,\n privateReadAddress,\n privateReadReady,\n privateReadQueryScope,\n }\n}\n","'use client'\n\nimport { useContext } from 'react'\nimport { useQuery, QueryClientContext } from '@tanstack/react-query'\nimport { useSafePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, BalanceResponse } from '../types'\nimport { formatTokenAmount } from '@/lib/utils'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseBalanceOptions {\n tokenId?: Bytes32\n enabled?: boolean\n}\n\nexport interface UseBalanceResult {\n balance: string\n balanceWei: string\n balanceFormatted: string\n tokenSymbol: string\n chainId: string\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useBalance(options: UseBalanceOptions = {}): UseBalanceResult {\n const queryClient = useContext(QueryClientContext)\n const accountingContext = useSafePrivanaContext()\n\n const hasProviders = !!queryClient && !!accountingContext\n const client = accountingContext?.client\n const defaultToken = accountingContext?.defaultToken\n const pollingInterval = accountingContext?.pollingInterval ?? 10000\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const tokenId = options.tokenId ?? defaultToken?.id\n\n const query = useQuery<BalanceResponse, Error>({\n queryKey: ['accounting-balance', ...privateReadQueryScope, tokenId],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n if (!tokenId) throw new Error('No token ID provided')\n if (!client) throw new Error('No accounting client')\n return executePrivateRead(() => client.getBalance(tokenId))\n },\n enabled:\n hasProviders &&\n (options.enabled ?? true) &&\n privateReadReady &&\n !!privateReadAddress &&\n !!tokenId &&\n !!client,\n refetchInterval: pollingInterval,\n })\n\n const balanceWei = query.data?.balance ?? '0'\n\n return {\n balance: balanceWei,\n balanceWei,\n balanceFormatted: formatTokenAmount(balanceWei),\n tokenSymbol: query.data?.token_symbol ?? '',\n chainId: query.data?.chain_id ?? '',\n isLoading: query.isPending || query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, BatchBalancesResponse, TokenBalance } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseBatchBalancesOptions {\n tokenIds: Bytes32[]\n enabled?: boolean\n}\n\nexport interface UseBatchBalancesResult {\n balances: TokenBalance[]\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useBatchBalances(options: UseBatchBalancesOptions): UseBatchBalancesResult {\n const { client, pollingInterval } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const query = useQuery<BatchBalancesResponse, Error>({\n queryKey: ['accounting-batch-balances', ...privateReadQueryScope, options.tokenIds],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead(() => client.getBatchBalances({ token_ids: options.tokenIds }))\n },\n enabled:\n (options.enabled ?? true) &&\n privateReadReady &&\n !!privateReadAddress &&\n options.tokenIds.length > 0 &&\n !!client,\n refetchInterval: pollingInterval,\n })\n\n return {\n balances: query.data?.balances ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","import type {\n Account,\n Chain,\n Client,\n PublicActions,\n RpcSchema,\n Transport,\n WalletActions,\n} from 'viem'\n\n/**\n * Retrieves and returns an action from the client (if exists), and falls\n * back to the tree-shakable action.\n *\n * Useful for extracting overridden actions from a client (ie. if a consumer\n * wants to override the `sendTransaction` implementation).\n */\nexport function getAction<\n transport extends Transport,\n chain extends Chain | undefined,\n account extends Account | undefined,\n rpcSchema extends RpcSchema | undefined,\n extended extends { [key: string]: unknown },\n client extends Client<transport, chain, account, rpcSchema, extended>,\n parameters,\n returnType,\n>(\n client: client,\n actionFn: (_: any, parameters: parameters) => returnType,\n // Some minifiers drop `Function.prototype.name`, or replace it with short letters,\n // meaning that `actionFn.name` will not always work. For that case, the consumer\n // needs to pass the name explicitly.\n name: keyof PublicActions | keyof WalletActions,\n): (parameters: parameters) => returnType {\n const action_implicit = client[actionFn.name]\n if (typeof action_implicit === 'function')\n return action_implicit as (params: parameters) => returnType\n\n const action_explicit = client[name]\n if (typeof action_explicit === 'function')\n return action_explicit as (params: parameters) => returnType\n\n return (params) => actionFn(client, params)\n}\n","import type { Config } from '../createConfig.js'\n\nexport type GetChainIdReturnType<config extends Config = Config> =\n config['chains'][number]['id']\n\n/** https://wagmi.sh/core/api/actions/getChainId */\nexport function getChainId<config extends Config>(\n config: config,\n): GetChainIdReturnType<config> {\n return config.state.chainId\n}\n","import type { Chain } from 'viem'\nimport { hexToString } from 'viem'\nimport {\n call,\n getTransaction,\n type WaitForTransactionReceiptErrorType as viem_WaitForTransactionReceiptErrorType,\n type WaitForTransactionReceiptParameters as viem_WaitForTransactionReceiptParameters,\n type WaitForTransactionReceiptReturnType as viem_WaitForTransactionReceiptReturnType,\n waitForTransactionReceipt as viem_waitForTransactionReceipt,\n} from 'viem/actions'\n\nimport type { Config } from '../createConfig.js'\nimport type { SelectChains } from '../types/chain.js'\nimport type { ChainIdParameter } from '../types/properties.js'\nimport type { Compute, IsNarrowable } from '../types/utils.js'\nimport { getAction } from '../utils/getAction.js'\n\nexport type WaitForTransactionReceiptParameters<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n viem_WaitForTransactionReceiptParameters & ChainIdParameter<config, chainId>\n>\n\nexport type WaitForTransactionReceiptReturnType<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n ///\n chains extends readonly Chain[] = SelectChains<config, chainId>,\n> = Compute<\n {\n [key in keyof chains]: viem_WaitForTransactionReceiptReturnType<\n IsNarrowable<chains[key], Chain> extends true ? chains[key] : undefined\n > & { chainId: chains[key]['id'] }\n }[number]\n>\n\nexport type WaitForTransactionReceiptErrorType =\n viem_WaitForTransactionReceiptErrorType\n\nexport async function waitForTransactionReceipt<\n config extends Config,\n chainId extends config['chains'][number]['id'],\n>(\n config: config,\n parameters: WaitForTransactionReceiptParameters<config, chainId>,\n): Promise<WaitForTransactionReceiptReturnType<config, chainId>> {\n const { chainId, timeout = 0, ...rest } = parameters\n\n const client = config.getClient({ chainId })\n const action = getAction(\n client,\n viem_waitForTransactionReceipt,\n 'waitForTransactionReceipt',\n )\n const receipt = await action({ ...rest, timeout })\n\n if (receipt.status === 'reverted') {\n const action_getTransaction = getAction(\n client,\n getTransaction,\n 'getTransaction',\n )\n const { from: account, ...txn } = await action_getTransaction({\n hash: receipt.transactionHash,\n })\n const action_call = getAction(client, call, 'call')\n const code = await action_call({\n ...(txn as any),\n account,\n data: txn.input,\n gasPrice: txn.type !== 'eip1559' ? txn.gasPrice : undefined,\n maxFeePerGas: txn.type === 'eip1559' ? txn.maxFeePerGas : undefined,\n maxPriorityFeePerGas:\n txn.type === 'eip1559' ? txn.maxPriorityFeePerGas : undefined,\n })\n const reason = code?.data\n ? hexToString(`0x${code.data.substring(138)}`)\n : 'unknown reason'\n throw new Error(reason)\n }\n\n return {\n ...receipt,\n chainId: client.chain.id,\n } as WaitForTransactionReceiptReturnType<config, chainId>\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { getChainId } from '@wagmi/core'\nimport { useChainId, useConfig, useSwitchChain } from 'wagmi'\n\nexport function useEnsureCorrectChain() {\n const config = useConfig()\n const chainId = useChainId()\n const { switchChainAsync } = useSwitchChain()\n\n const waitUntilOnChain = useCallback(\n async (expectedChainId: number, timeoutMs: number, pollIntervalMs = 250) => {\n const startedAt = Date.now()\n while (Date.now() - startedAt < timeoutMs) {\n const currentChainId = getChainId(config)\n if (currentChainId === expectedChainId) return true\n await new Promise((resolve) => setTimeout(resolve, pollIntervalMs))\n }\n return false\n },\n [config]\n )\n\n const ensureCorrectChain = useCallback(\n async (targetChainId: number) => {\n const currentChainId = getChainId(config)\n if (currentChainId === targetChainId) return false\n\n let switchErrorMessage: string | undefined\n try {\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Chain switch timeout')), 3000)\n })\n await Promise.race([switchChainAsync({ chainId: targetChainId }), timeoutPromise])\n } catch (error) {\n if (error instanceof Error && error.message.includes('Unsupported Chain')) {\n console.warn(\"Got 'Unsupported Chain' error, chain may have switched anyway.\")\n } else {\n switchErrorMessage = error instanceof Error ? error.message : 'Unknown chain switch error'\n }\n }\n\n const settled = await waitUntilOnChain(targetChainId, 20_000)\n if (settled) return true\n\n if (switchErrorMessage) {\n throw new Error(\n `Failed to switch to chain (Chain ID: ${targetChainId}): ${switchErrorMessage}`\n )\n }\n\n throw new Error(`Chain switch did not settle in time (expected ${targetChainId}).`)\n },\n [config, switchChainAsync, waitUntilOnChain]\n )\n\n const isOnChain = useCallback((targetChainId: number) => chainId === targetChainId, [chainId])\n\n return {\n chainId,\n ensureCorrectChain,\n isOnChain,\n }\n}\n","'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient, useWriteContract, useSendTransaction, useConfig } from 'wagmi'\nimport { waitForTransactionReceipt } from '@wagmi/core'\nimport { erc20Abi, zeroAddress } from 'viem'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { useEnsureCorrectChain } from './use-ensure-correct-chain'\nimport { usePrivateReadRequest } from './use-private-read-request'\nimport type { Bytes32, DepositAddressResponse, DepositCheckResponse } from '../types'\n\nexport interface UseDepositOptions {\n onDepositAddressReceived?: (response: DepositAddressResponse) => void\n onDepositSuccess?: (txHash: string) => void\n onCredited?: (txHash: string, response: DepositCheckResponse) => void\n /** Called when deposit check polling times out - deposit may still be processing */\n onCheckTimeout?: (txHash: string) => void\n onError?: (error: Error) => void\n /** Polling interval in ms for checking deposit status (default: 5000) */\n pollInterval?: number\n /** Max time to wait for deposit to be credited in ms (default: 180000 = 3 minutes) */\n pollTimeout?: number\n /** Number of block confirmations to wait before checking deposit status (default: 15) */\n confirmations?: number\n}\n\nexport interface DepositParams {\n tokenId: Bytes32\n amount: bigint\n}\n\nexport interface UseDepositResult {\n depositAddress: DepositAddressResponse | null\n txHash: `0x${string}` | undefined\n isGettingAddress: boolean\n isSwitchingChain: boolean\n isSendingTransaction: boolean\n isWaitingForConfirmation: boolean\n isWaitingForProcessing: boolean\n /** True if processing timed out (deposit may still be processing in background) */\n didTimeout: boolean\n /**\n * True when an on-chain transfer succeeded but the API verification step\n * (checkDeposit or status polling) failed. The funds have already left the\n * wallet, so a fresh `deposit()` would cause a double spend. Call\n * `retryVerification()` to re-run verification against the existing txHash,\n * or `reset()` to discard local tracking (the deposit may still be credited\n * in the background).\n */\n verificationFailed: boolean\n isPending: boolean\n error: Error | null\n deposit: (params: DepositParams) => Promise<void>\n /** Re-run the API verification (sweep trigger + polling) for the existing txHash. */\n retryVerification: () => Promise<void>\n reset: () => void\n}\n\ninterface VerificationContext {\n hash: `0x${string}`\n chainId: number\n amount: bigint\n}\n\nexport function useDeposit(options: UseDepositOptions = {}): UseDepositResult {\n const { address } = useAccount()\n const { client, enabledTokens, getChainById } = usePrivanaContext()\n const { data: walletClient } = useWalletClient()\n const queryClient = useQueryClient()\n const config = useConfig()\n const { executePrivateRead } = usePrivateReadRequest()\n\n const pollInterval = options.pollInterval ?? 5000\n const pollTimeout = options.pollTimeout ?? 180000\n const confirmations = options.confirmations ?? 15\n\n const [depositAddress, setDepositAddress] = useState<DepositAddressResponse | null>(null)\n const [txHash, setTxHash] = useState<`0x${string}` | undefined>()\n const [isSwitchingChain, setIsSwitchingChain] = useState(false)\n const [isWaitingForConfirmation, setIsWaitingForConfirmation] = useState(false)\n const [isWaitingForProcessing, setIsWaitingForProcessing] = useState(false)\n const [didTimeout, setDidTimeout] = useState(false)\n const [verificationFailed, setVerificationFailed] = useState(false)\n const [depositError, setDepositError] = useState<Error | null>(null)\n\n const generationRef = useRef(0)\n const pollIntervalRef = useRef<NodeJS.Timeout | null>(null)\n // Populated once the on-chain transfer is sent. Presence of this context\n // means a new deposit() call would double-spend, so we guard against it.\n const verificationContextRef = useRef<VerificationContext | null>(null)\n\n // Use refs for callbacks to avoid stale closures in the long-running deposit flow\n const onDepositAddressReceivedRef = useRef(options.onDepositAddressReceived)\n const onDepositSuccessRef = useRef(options.onDepositSuccess)\n const onCreditedRef = useRef(options.onCredited)\n const onCheckTimeoutRef = useRef(options.onCheckTimeout)\n const onErrorRef = useRef(options.onError)\n useEffect(() => {\n onDepositAddressReceivedRef.current = options.onDepositAddressReceived\n onDepositSuccessRef.current = options.onDepositSuccess\n onCreditedRef.current = options.onCredited\n onCheckTimeoutRef.current = options.onCheckTimeout\n onErrorRef.current = options.onError\n }, [\n options.onDepositAddressReceived,\n options.onDepositSuccess,\n options.onCredited,\n options.onCheckTimeout,\n options.onError,\n ])\n\n const addressMutation = useMutation({\n mutationFn: async () => {\n if (!address) throw new Error('No wallet connected')\n return executePrivateRead(() => client.getDepositAddress())\n },\n onSuccess: (data) => {\n setDepositAddress(data)\n onDepositAddressReceivedRef.current?.(data)\n },\n onError: (error) => {\n onErrorRef.current?.(error as Error)\n },\n })\n\n const {\n writeContractAsync,\n isPending: isWritingContract,\n error: writeError,\n reset: resetWriteContract,\n } = useWriteContract()\n\n const {\n sendTransactionAsync,\n isPending: isSendingNative,\n error: sendNativeError,\n reset: resetSendTransaction,\n } = useSendTransaction()\n\n const isSendingTx = isWritingContract || isSendingNative\n const sendError = writeError ?? sendNativeError\n\n const { ensureCorrectChain } = useEnsureCorrectChain()\n\n // Cleanup polling on unmount\n useEffect(() => {\n return () => {\n if (pollIntervalRef.current) {\n clearTimeout(pollIntervalRef.current)\n }\n }\n }, [])\n\n const stopPolling = useCallback(() => {\n if (pollIntervalRef.current) {\n clearTimeout(pollIntervalRef.current)\n pollIntervalRef.current = null\n }\n }, [])\n\n const reset = useCallback(() => {\n generationRef.current++\n stopPolling()\n verificationContextRef.current = null\n setDepositAddress(null)\n setTxHash(undefined)\n setIsSwitchingChain(false)\n setIsWaitingForConfirmation(false)\n setIsWaitingForProcessing(false)\n setDidTimeout(false)\n setVerificationFailed(false)\n setDepositError(null)\n addressMutation.reset()\n resetWriteContract()\n resetSendTransaction()\n }, [addressMutation, resetWriteContract, resetSendTransaction, stopPolling])\n\n // Verification = Phase 1 (POST checkDeposit) + Phase 2 (poll getDepositStatus).\n // Shared by deposit() and retryVerification(). Callers must set the\n // verification context and a fresh generation before invoking.\n const runVerification = useCallback(\n async (ctx: VerificationContext, generation: number): Promise<void> => {\n const isStale = () => generation !== generationRef.current\n const { hash, chainId, amount } = ctx\n\n setVerificationFailed(false)\n setDepositError(null)\n setDidTimeout(false)\n setIsWaitingForProcessing(true)\n\n const pollStartTime = Date.now()\n\n const markVerificationFailed = (err: Error) => {\n setIsWaitingForProcessing(false)\n setDepositError(err)\n setVerificationFailed(true)\n onErrorRef.current?.(err)\n }\n\n try {\n // Phase 1: trigger sweep\n const triggerResult = await executePrivateRead(() =>\n client.checkDeposit({\n chain_id: chainId,\n tx_hash: hash,\n amount: amount.toString(),\n })\n )\n if (isStale()) return\n\n if (triggerResult.status === 'credited') {\n setIsWaitingForProcessing(false)\n verificationContextRef.current = null\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n onCreditedRef.current?.(hash, triggerResult)\n return\n }\n\n if (triggerResult.status === 'error') {\n markVerificationFailed(new Error(triggerResult.detail ?? 'Deposit verification failed'))\n return\n }\n\n const depositId = triggerResult.deposit_id\n if (!depositId) {\n markVerificationFailed(new Error('Deposit check did not return a deposit id'))\n return\n }\n\n // Phase 2: poll status\n let consecutiveFailures = 0\n\n const checkStatus = async (): Promise<boolean> => {\n if (isStale()) return true\n\n if (Date.now() - pollStartTime > pollTimeout) {\n stopPolling()\n setIsWaitingForProcessing(false)\n setDidTimeout(true)\n onCheckTimeoutRef.current?.(hash)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n return true\n }\n\n try {\n const result = await executePrivateRead(() => client.getDepositStatus(depositId))\n if (isStale()) return true\n consecutiveFailures = 0\n\n if (result.status === 'credited') {\n stopPolling()\n setIsWaitingForProcessing(false)\n verificationContextRef.current = null\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n onCreditedRef.current?.(hash, result)\n return true\n }\n\n if (result.status === 'error') {\n stopPolling()\n markVerificationFailed(new Error(result.detail ?? 'Deposit verification failed'))\n return true\n }\n } catch (err) {\n if (isStale()) return true\n consecutiveFailures++\n console.warn('Error polling deposit status:', err)\n if (consecutiveFailures >= 3) {\n stopPolling()\n markVerificationFailed(\n err instanceof Error ? err : new Error('Deposit status polling failed')\n )\n return true\n }\n }\n return false\n }\n\n const pollLoop = async () => {\n const done = await checkStatus()\n if (!done && !isStale() && pollIntervalRef.current !== null) {\n pollIntervalRef.current = setTimeout(pollLoop, pollInterval)\n }\n }\n pollIntervalRef.current = setTimeout(pollLoop, pollInterval)\n } catch (err) {\n if (isStale()) return\n stopPolling()\n markVerificationFailed(\n err instanceof Error ? err : new Error('Deposit verification failed')\n )\n }\n },\n [client, executePrivateRead, pollInterval, pollTimeout, queryClient, stopPolling]\n )\n\n const retryVerification = useCallback(async (): Promise<void> => {\n const ctx = verificationContextRef.current\n if (!ctx) {\n throw new Error('No pending deposit to verify')\n }\n // Bump generation so any residual polling work from the failed run no-ops,\n // then start a fresh verification against the same on-chain transfer.\n generationRef.current++\n stopPolling()\n const generation = generationRef.current\n await runVerification(ctx, generation)\n }, [runVerification, stopPolling])\n\n const deposit = useCallback(\n async (params: DepositParams) => {\n // Guard: a prior deposit already sent funds on-chain and is waiting on\n // verification. Starting a new flow here would issue a second transfer.\n if (verificationContextRef.current) {\n throw new Error(\n 'A deposit is pending verification. Call retryVerification() or reset() first.'\n )\n }\n\n // Clear state from any previous deposit attempt\n reset()\n const generation = generationRef.current\n const isStale = () => generation !== generationRef.current\n\n try {\n if (!address || !walletClient) throw new Error('No wallet connected')\n\n // Resolve token and source chain before anything else\n const token = enabledTokens.find((t) => t.id.toLowerCase() === params.tokenId.toLowerCase())\n if (!token) throw new Error(`Unknown token ID: ${params.tokenId}`)\n const sourceChain = getChainById(token.chainId)\n if (!sourceChain) throw new Error(`Chain ${token.chainId} not configured`)\n\n // 1. Get deposit address\n const addrResponse = await addressMutation.mutateAsync()\n if (isStale()) return\n\n // 2. Switch to source chain\n setIsSwitchingChain(true)\n try {\n await ensureCorrectChain(sourceChain.id)\n } finally {\n if (!isStale()) setIsSwitchingChain(false)\n }\n if (isStale()) return\n\n // 3. Validate deposit address\n const depositAddr = addrResponse.deposit_address\n if (!depositAddr || depositAddr === zeroAddress) {\n throw new Error('Invalid deposit address received from API')\n }\n\n // 3b. Validate amount against the backend minimum. Below this the\n // deposit processor refuses to credit and funds would be stranded\n // at the per-user deposit address.\n const isNative = token.contract === zeroAddress\n const minsForChain = addrResponse.min_deposit?.[String(sourceChain.id)]\n const minAmountStr = isNative ? minsForChain?.native : minsForChain?.erc20\n if (minAmountStr && params.amount < BigInt(minAmountStr)) {\n throw new Error(\n `Amount is below the minimum deposit (${minAmountStr}) for ${isNative ? 'native' : 'ERC-20'} on chain ${sourceChain.id}`\n )\n }\n\n // 4. Send transfer to the deposit address (native or ERC-20)\n const hash =\n token.contract === zeroAddress\n ? await sendTransactionAsync({\n to: depositAddr,\n value: params.amount,\n chainId: sourceChain.id,\n })\n : await writeContractAsync({\n address: token.contract,\n abi: erc20Abi,\n functionName: 'transfer',\n args: [depositAddr, params.amount],\n chainId: sourceChain.id,\n })\n if (isStale()) return\n setTxHash(hash)\n\n // Past this point the wallet has already dispatched the transfer, so any\n // subsequent failure must preserve the hash and route to a retry state\n // rather than appearing terminal.\n const ctx: VerificationContext = {\n hash,\n chainId: sourceChain.id,\n amount: params.amount,\n }\n verificationContextRef.current = ctx\n\n try {\n // 5. Wait for on-chain confirmation\n setIsWaitingForConfirmation(true)\n try {\n await waitForTransactionReceipt(config, { hash, confirmations })\n } finally {\n if (!isStale()) setIsWaitingForConfirmation(false)\n }\n if (isStale()) return\n\n onDepositSuccessRef.current?.(hash)\n\n // Invalidate wagmi wallet balance queries since tokens have left the wallet\n queryClient.invalidateQueries({ queryKey: ['readContract'] })\n\n // 6-7. Verification (phase 1 + phase 2)\n await runVerification(ctx, generation)\n } catch (err) {\n if (isStale()) return\n setIsWaitingForConfirmation(false)\n stopPolling()\n const error = err instanceof Error ? err : new Error('Deposit verification failed')\n setIsWaitingForProcessing(false)\n setDepositError(error)\n setVerificationFailed(true)\n onErrorRef.current?.(error)\n }\n } catch (err) {\n if (isStale()) return\n const error = err instanceof Error ? err : new Error('Deposit failed')\n // Pre-transfer failure: nothing left the wallet, safe to surface\n // as a terminal error. Post-transfer failures are handled in the\n // inner catch above and never reach here.\n setDepositError(error)\n onErrorRef.current?.(error)\n }\n },\n [\n address,\n walletClient,\n addressMutation,\n getChainById,\n config,\n confirmations,\n enabledTokens,\n ensureCorrectChain,\n queryClient,\n writeContractAsync,\n sendTransactionAsync,\n stopPolling,\n reset,\n runVerification,\n ]\n )\n\n const isPending =\n addressMutation.isPending ||\n isSwitchingChain ||\n isSendingTx ||\n isWaitingForConfirmation ||\n isWaitingForProcessing\n\n const error = addressMutation.error || sendError || depositError\n\n return {\n depositAddress,\n txHash,\n isGettingAddress: addressMutation.isPending,\n isSwitchingChain,\n isSendingTransaction: isSendingTx,\n isWaitingForConfirmation,\n isWaitingForProcessing,\n didTimeout,\n verificationFailed,\n isPending,\n error: error as Error | null,\n deposit,\n retryVerification,\n reset,\n }\n}\n","'use client'\n\nimport { useState, useCallback, useEffect, useRef } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { useEnsureCorrectChain } from './use-ensure-correct-chain'\nimport { signWithdrawMessage } from '../signatures'\nimport type { Bytes32, TransactionSubmissionResponse } from '../types'\n\nexport interface UseWithdrawOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n /** Called when withdrawal is submitted to the backend */\n onSubmitSuccess?: (response: TransactionSubmissionResponse) => void\n /** Called when withdrawal is fully processed (broadcast to destination chain) */\n onProcessingSuccess?: () => void\n /** Called when processing times out - withdrawal may still be processing */\n onProcessingTimeout?: () => void\n onError?: (error: Error) => void\n /** Polling interval in ms for checking withdrawal status (default: 3000) */\n pollInterval?: number\n /** Max time to wait for withdrawal to be processed in ms (default: 180000 = 3 minutes) */\n pollTimeout?: number\n}\n\nexport interface WithdrawParams {\n tokenId: Bytes32\n amount: bigint\n}\n\nexport type WithdrawStep = 'idle' | 'switching-chain' | 'signing' | 'submitting' | 'processing'\n\nexport interface UseWithdrawResult {\n withdraw: (params: WithdrawParams) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n currentStep: WithdrawStep\n /** True if processing timed out (withdrawal may still be processing in background) */\n didTimeout: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useWithdraw(options: UseWithdrawOptions = {}): UseWithdrawResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig } = usePrivanaContext()\n const queryClient = useQueryClient()\n const { chainId, ensureCorrectChain } = useEnsureCorrectChain()\n\n const pollInterval = options.pollInterval ?? 3000\n const pollTimeout = options.pollTimeout ?? 180000\n\n const [currentStep, setCurrentStep] = useState<WithdrawStep>('idle')\n const [didTimeout, setDidTimeout] = useState(false)\n const [isSuccess, setIsSuccess] = useState(false)\n const [withdrawError, setWithdrawError] = useState<Error | null>(null)\n\n const generationRef = useRef(0)\n const pollIntervalRef = useRef<NodeJS.Timeout | null>(null)\n\n // Use refs for callbacks to avoid stale closures in the long-running withdraw flow\n const onSubmitSuccessRef = useRef(options.onSubmitSuccess)\n const onProcessingSuccessRef = useRef(options.onProcessingSuccess)\n const onProcessingTimeoutRef = useRef(options.onProcessingTimeout)\n const onSuccessRef = useRef(options.onSuccess)\n const onErrorRef = useRef(options.onError)\n\n useEffect(() => {\n onSubmitSuccessRef.current = options.onSubmitSuccess\n onProcessingSuccessRef.current = options.onProcessingSuccess\n onProcessingTimeoutRef.current = options.onProcessingTimeout\n onSuccessRef.current = options.onSuccess\n onErrorRef.current = options.onError\n }, [\n options.onSubmitSuccess,\n options.onProcessingSuccess,\n options.onProcessingTimeout,\n options.onSuccess,\n options.onError,\n ])\n\n const { chainId: signingChainId } = networkConfig\n\n // Cleanup polling on unmount\n useEffect(() => {\n return () => {\n if (pollIntervalRef.current) {\n clearTimeout(pollIntervalRef.current)\n }\n }\n }, [])\n\n const stopPolling = useCallback(() => {\n if (pollIntervalRef.current) {\n clearTimeout(pollIntervalRef.current)\n pollIntervalRef.current = null\n }\n }, [])\n\n const reset = useCallback(() => {\n generationRef.current++\n stopPolling()\n setCurrentStep('idle')\n setDidTimeout(false)\n setIsSuccess(false)\n setWithdrawError(null)\n }, [stopPolling])\n\n const withdraw = useCallback(\n async (params: WithdrawParams): Promise<TransactionSubmissionResponse | undefined> => {\n reset()\n const generation = generationRef.current\n const isStale = () => generation !== generationRef.current\n\n try {\n if (!address || !walletClient) throw new Error('Wallet not connected')\n\n // Snapshot pending withdrawal indices so we can detect the new one after submission\n const pendingResponse = await client.getPendingWithdrawals(address)\n if (isStale()) return undefined\n const knownIndices = new Set(pendingResponse.pending_withdrawals.map((w) => w.index))\n\n // 1. Switch to signing chain\n if (chainId !== signingChainId) {\n setCurrentStep('switching-chain')\n }\n await ensureCorrectChain(signingChainId)\n if (isStale()) return undefined\n\n // 2. Fetch nonce from API (direct Sapphire contract reads revert without encrypted calldata)\n const nonceResponse = await client.getWithdrawalNonce(address)\n if (isStale()) return undefined\n const nonce = BigInt(nonceResponse.nonce)\n\n // 3. Sign EIP-712 message\n setCurrentStep('signing')\n const signature = await signWithdrawMessage({\n walletClient,\n chainId: signingChainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n tokenId: params.tokenId,\n amount: params.amount,\n nonce,\n },\n })\n if (isStale()) return undefined\n\n // 4. Submit to API\n setCurrentStep('submitting')\n const submissionResponse = await client.requestWithdrawal({\n token_id: params.tokenId,\n amount: params.amount.toString(),\n nonce: String(nonce),\n signature,\n })\n if (isStale()) return submissionResponse\n\n onSubmitSuccessRef.current?.(submissionResponse)\n onSuccessRef.current?.(submissionResponse)\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n\n // 5. Poll for withdrawal completion\n setCurrentStep('processing')\n const pollStartTime = Date.now()\n let withdrawalIndex: number | null = null\n let consecutiveFailures = 0\n\n const handleSuccess = () => {\n stopPolling()\n setCurrentStep('idle')\n setIsSuccess(true)\n onProcessingSuccessRef.current?.()\n queryClient.refetchQueries({ queryKey: ['accounting-balance'] })\n queryClient.refetchQueries({ queryKey: ['accounting-pending-withdrawals'] })\n }\n\n const handleTimeout = () => {\n stopPolling()\n setCurrentStep('idle')\n setDidTimeout(true)\n onProcessingTimeoutRef.current?.()\n queryClient.refetchQueries({ queryKey: ['accounting-balance'] })\n queryClient.refetchQueries({ queryKey: ['accounting-pending-withdrawals'] })\n }\n\n const checkWithdrawalStatus = async (): Promise<boolean> => {\n if (isStale()) return true\n\n if (Date.now() - pollStartTime > pollTimeout) {\n handleTimeout()\n return true\n }\n\n try {\n if (withdrawalIndex !== null) {\n const info = await client.getWithdrawalInfo(withdrawalIndex)\n if (isStale()) return true\n consecutiveFailures = 0\n if (info.resolved) {\n handleSuccess()\n return true\n }\n return false\n }\n\n // Find our new withdrawal in the pending list by matching against the\n // pre-submission snapshot. This avoids sequential index scanning.\n const pending = await client.getPendingWithdrawals(address)\n if (isStale()) return true\n consecutiveFailures = 0\n const match = pending.pending_withdrawals.find(\n (w) =>\n !knownIndices.has(w.index) &&\n w.user_address.toLowerCase() === address.toLowerCase() &&\n w.token_id.toLowerCase() === params.tokenId.toLowerCase() &&\n w.amount === String(params.amount)\n )\n\n if (match) {\n withdrawalIndex = match.index\n if (match.resolved) {\n handleSuccess()\n return true\n }\n }\n } catch (err) {\n if (isStale()) return true\n consecutiveFailures++\n console.warn('Error polling withdrawal status:', err)\n if (consecutiveFailures >= 3) {\n handleTimeout()\n return true\n }\n }\n return false\n }\n\n const pollLoop = async () => {\n const done = await checkWithdrawalStatus()\n if (!done && !isStale() && pollIntervalRef.current !== null) {\n pollIntervalRef.current = setTimeout(pollLoop, pollInterval)\n }\n }\n pollIntervalRef.current = setTimeout(pollLoop, 0)\n\n return submissionResponse\n } catch (err) {\n if (isStale()) return undefined\n const error = err instanceof Error ? err : new Error('Withdrawal failed')\n setCurrentStep('idle')\n setWithdrawError(error)\n onErrorRef.current?.(error)\n return undefined\n }\n },\n [\n address,\n walletClient,\n client,\n chainId,\n signingChainId,\n networkConfig.accountingContract,\n ensureCorrectChain,\n pollInterval,\n pollTimeout,\n queryClient,\n stopPolling,\n reset,\n ]\n )\n\n const isPending = currentStep !== 'idle'\n\n return {\n withdraw,\n isPending,\n isSuccess,\n currentStep,\n didTimeout,\n error: withdrawError,\n reset,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { signLockMessage } from '../signatures'\nimport type { Bytes32, TransactionSubmissionResponse } from '../types'\n\nexport interface UseLockFundsOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface LockFundsParams {\n tokenId: Bytes32\n amount: bigint\n expiry: bigint\n}\n\nexport interface UseLockFundsResult {\n lockFunds: (params: LockFundsParams) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useLockFunds(options: UseLockFundsOptions = {}): UseLockFundsResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig, serviceAddress } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: async (params: LockFundsParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n if (!serviceAddress) {\n throw new Error('Service address not configured')\n }\n\n const { nonce } = await client.getLockNonce(address)\n\n const signature = await signLockMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n serviceAddress,\n tokenId: params.tokenId,\n amount: params.amount,\n expiry: params.expiry,\n nonce: BigInt(nonce),\n },\n })\n\n return client.lockFunds({\n service_address: serviceAddress,\n token_id: params.tokenId,\n amount: params.amount.toString(),\n expiry: params.expiry.toString(),\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const lockFunds = useCallback(\n async (params: LockFundsParams) => {\n return mutation.mutateAsync(params)\n },\n [mutation]\n )\n\n return {\n lockFunds,\n isPending: mutation.isPending,\n isSuccess: mutation.isSuccess,\n error: mutation.error as Error | null,\n reset: mutation.reset,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { TransactionSubmissionResponse } from '../types'\n\nexport interface UseUnlockFundsOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface UnlockFundsParams {\n lockId: number\n}\n\nexport interface UseUnlockFundsResult {\n unlockFunds: (params: UnlockFundsParams) => Promise<TransactionSubmissionResponse | undefined>\n unlockAllExpired: () => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useUnlockFunds(options: UseUnlockFundsOptions = {}): UseUnlockFundsResult {\n const { address } = useAccount()\n const { client } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const unlockMutation = useMutation({\n mutationFn: async (params: UnlockFundsParams) => {\n if (!address) {\n throw new Error('Wallet not connected')\n }\n\n return client.unlockFunds({\n user_address: address,\n lock_id: params.lockId,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-expired-locks'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const unlockAllMutation = useMutation({\n mutationFn: async () => {\n if (!address) {\n throw new Error('Wallet not connected')\n }\n\n return client.unlockAllExpired({\n user_address: address,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-expired-locks'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const unlockFunds = useCallback(\n async (params: UnlockFundsParams) => {\n return unlockMutation.mutateAsync(params)\n },\n [unlockMutation]\n )\n\n const unlockAllExpired = useCallback(async () => {\n return unlockAllMutation.mutateAsync()\n }, [unlockAllMutation])\n\n const reset = useCallback(() => {\n unlockMutation.reset()\n unlockAllMutation.reset()\n }, [unlockMutation, unlockAllMutation])\n\n return {\n unlockFunds,\n unlockAllExpired,\n isPending: unlockMutation.isPending || unlockAllMutation.isPending,\n isSuccess: unlockMutation.isSuccess || unlockAllMutation.isSuccess,\n error: (unlockMutation.error || unlockAllMutation.error) as Error | null,\n reset,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { signTransferMessage, signTransferLockedMessage } from '../signatures'\nimport type { Bytes32, Address, TransactionSubmissionResponse } from '../types'\n\nexport interface UseTransferOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface TransferParams {\n toAddress: Address\n tokenId: Bytes32\n amount: bigint\n}\n\nexport interface TransferLockedParams {\n lockId: number\n toAddress: Address\n amount: bigint\n}\n\nexport interface UseTransferResult {\n transfer: (params: TransferParams) => Promise<TransactionSubmissionResponse | undefined>\n transferLocked: (\n params: TransferLockedParams\n ) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useTransfer(options: UseTransferOptions = {}): UseTransferResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig, serviceAddress } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const transferMutation = useMutation({\n mutationFn: async (params: TransferParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n\n const { nonce } = await client.getTransferNonce(address)\n\n const signature = await signTransferMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n toAddress: params.toAddress,\n tokenId: params.tokenId,\n amount: params.amount,\n nonce: BigInt(nonce),\n },\n })\n\n return client.transferFunds({\n to_address: params.toAddress,\n token_id: params.tokenId,\n amount: params.amount.toString(),\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const transferLockedMutation = useMutation({\n mutationFn: async (params: TransferLockedParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n if (!serviceAddress) {\n throw new Error('Service address not configured')\n }\n\n const { nonce } = await client.getTransferLockedNonce(serviceAddress)\n\n const signature = await signTransferLockedMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n userAddress: address,\n toAddress: params.toAddress,\n lockId: BigInt(params.lockId),\n amount: params.amount,\n nonce: BigInt(nonce),\n serviceAddress,\n },\n })\n\n return client.transferLockedFunds({\n user_address: address,\n lock_id: params.lockId,\n to_address: params.toAddress,\n amount: params.amount.toString(),\n service_address: serviceAddress,\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-history'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const transfer = useCallback(\n async (params: TransferParams) => {\n return transferMutation.mutateAsync(params)\n },\n [transferMutation]\n )\n\n const transferLocked = useCallback(\n async (params: TransferLockedParams) => {\n return transferLockedMutation.mutateAsync(params)\n },\n [transferLockedMutation]\n )\n\n const reset = useCallback(() => {\n transferMutation.reset()\n transferLockedMutation.reset()\n }, [transferMutation, transferLockedMutation])\n\n return {\n transfer,\n transferLocked,\n isPending: transferMutation.isPending || transferLockedMutation.isPending,\n isSuccess: transferMutation.isSuccess || transferLockedMutation.isSuccess,\n error: (transferMutation.error || transferLockedMutation.error) as Error | null,\n reset,\n }\n}\n","'use client'\n\nimport { useQuery, keepPreviousData } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { LockInfo, LockedFundsResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseLockedFundsOptions {\n enabled?: boolean\n}\n\nexport interface UseLockedFundsResult {\n locks: LockInfo[]\n totalLocked: string\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useLockedFunds(options: UseLockedFundsOptions = {}): UseLockedFundsResult {\n const { client, pollingInterval, serviceAddress } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const query = useQuery<LockedFundsResponse, Error>({\n queryKey: ['accounting-locked-funds', ...privateReadQueryScope, serviceAddress ?? null],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead(() => client.getLockedFunds(serviceAddress))\n },\n enabled: (options.enabled ?? true) && privateReadReady && !!privateReadAddress && !!client,\n refetchInterval: pollingInterval,\n placeholderData: keepPreviousData,\n staleTime: 5000,\n })\n\n return {\n locks: query.data?.locks ?? [],\n totalLocked: query.data?.total_locked ?? '0',\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, TotalLockedBalanceResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseTotalLockedBalanceOptions {\n tokenId?: Bytes32\n enabled?: boolean\n}\n\nexport interface UseTotalLockedBalanceResult {\n totalLocked: string\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useTotalLockedBalance(\n options: UseTotalLockedBalanceOptions = {}\n): UseTotalLockedBalanceResult {\n const { client, pollingInterval, defaultToken } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const tokenId = options.tokenId ?? defaultToken?.id\n\n const query = useQuery<TotalLockedBalanceResponse, Error>({\n queryKey: ['accounting-total-locked-balance', ...privateReadQueryScope, tokenId],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n if (!tokenId) throw new Error('No token ID provided')\n return executePrivateRead(() => client.getTotalLockedBalance(tokenId))\n },\n enabled:\n (options.enabled ?? true) &&\n privateReadReady &&\n !!privateReadAddress &&\n !!tokenId &&\n !!client,\n refetchInterval: pollingInterval,\n })\n\n return {\n totalLocked: query.data?.total_locked ?? '0',\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { LockInfo, ExpiredLocksResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseExpiredLocksOptions {\n enabled?: boolean\n}\n\nexport interface UseExpiredLocksResult {\n expiredLocks: LockInfo[]\n hasExpiredLocks: boolean\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useExpiredLocks(options: UseExpiredLocksOptions = {}): UseExpiredLocksResult {\n const { client, pollingInterval } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const query = useQuery<ExpiredLocksResponse, Error>({\n queryKey: ['accounting-expired-locks', ...privateReadQueryScope],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead(() => client.getExpiredLocks())\n },\n enabled: (options.enabled ?? true) && privateReadReady && !!privateReadAddress && !!client,\n refetchInterval: pollingInterval,\n })\n\n const expiredLocks = query.data?.expired_locks ?? []\n\n return {\n expiredLocks,\n hasExpiredLocks: expiredLocks.length > 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery, keepPreviousData } from '@tanstack/react-query'\nimport { useAccount } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { WithdrawalInfo, PendingWithdrawalsResponse } from '../types'\n\nexport interface UsePendingWithdrawalsOptions {\n enabled?: boolean\n}\n\nexport interface UsePendingWithdrawalsResult {\n withdrawals: WithdrawalInfo[]\n hasPendingWithdrawals: boolean\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function usePendingWithdrawals(\n options: UsePendingWithdrawalsOptions = {}\n): UsePendingWithdrawalsResult {\n const { address, isConnected } = useAccount()\n const { client, pollingInterval } = usePrivanaContext()\n\n const query = useQuery<PendingWithdrawalsResponse, Error>({\n queryKey: ['accounting-pending-withdrawals', address],\n queryFn: async (): Promise<PendingWithdrawalsResponse> => {\n if (!address) throw new Error('No wallet connected')\n try {\n return await client.getPendingWithdrawals(address)\n } catch (error: unknown) {\n if (\n error &&\n typeof error === 'object' &&\n 'statusCode' in error &&\n error.statusCode === 404\n ) {\n return { user_address: address, pending_withdrawals: [] }\n }\n throw error\n }\n },\n enabled: (options.enabled ?? true) && isConnected && !!address,\n refetchInterval: pollingInterval,\n placeholderData: keepPreviousData,\n staleTime: 5000,\n retry: (failureCount, error) => {\n if (error && typeof error === 'object' && 'statusCode' in error && error.statusCode === 404) {\n return false\n }\n return failureCount < 3\n },\n })\n\n const withdrawals = query.data?.pending_withdrawals ?? []\n\n return {\n withdrawals,\n hasPendingWithdrawals: withdrawals.length > 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery, keepPreviousData } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { HistoryEntry, HistoryResponse } from '../types'\nimport { usePrivateReadRequest } from './use-private-read-request'\n\nexport interface UseHistoryOptions {\n offset?: number\n limit?: number\n enabled?: boolean\n}\n\nexport interface UseHistoryResult {\n history: HistoryEntry[]\n total: number\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useHistory(options: UseHistoryOptions = {}): UseHistoryResult {\n const { client, pollingInterval } = usePrivanaContext()\n const { executePrivateRead, privateReadAddress, privateReadQueryScope, privateReadReady } =\n usePrivateReadRequest()\n\n const offset = options.offset ?? -1\n const limit = options.limit ?? 50\n\n const query = useQuery<HistoryResponse, Error>({\n queryKey: ['accounting-history', ...privateReadQueryScope, offset, limit],\n queryFn: async () => {\n if (!privateReadAddress) throw new Error('No authenticated account available')\n return executePrivateRead(() => client.getHistory({ offset, limit }))\n },\n enabled: (options.enabled ?? true) && privateReadReady && !!privateReadAddress && !!client,\n refetchInterval: pollingInterval,\n placeholderData: keepPreviousData,\n staleTime: 5000,\n })\n\n return {\n history: query.data?.history ?? [],\n total: query.data?.total ?? 0,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { Bytes32, TokenInfoResponse } from '../types'\n\nexport interface UseTokenInfoOptions {\n tokenId?: Bytes32 | string\n enabled?: boolean\n}\n\nexport interface UseTokenInfoResult {\n data: TokenInfoResponse | undefined\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useTokenInfo(options: UseTokenInfoOptions = {}): UseTokenInfoResult {\n const { client } = usePrivanaContext()\n const { tokenId } = options\n\n const query = useQuery<TokenInfoResponse, Error>({\n queryKey: ['accounting-token-info', tokenId],\n queryFn: () => {\n if (!tokenId) throw new Error('No token ID provided')\n return client.getTokenInfo(tokenId)\n },\n enabled: (options.enabled ?? true) && !!tokenId && !!client,\n staleTime: Infinity,\n })\n\n return {\n data: query.data,\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useQuery } from '@tanstack/react-query'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport type { TokenInfoResponse, TokenListResponse } from '../types'\n\nexport interface UseTokenListOptions {\n enabled?: boolean\n}\n\nexport interface UseTokenListResult {\n tokens: TokenInfoResponse[]\n isLoading: boolean\n isError: boolean\n error: Error | null\n refetch: () => void\n}\n\nexport function useTokenList(options: UseTokenListOptions = {}): UseTokenListResult {\n const { client } = usePrivanaContext()\n\n const query = useQuery<TokenListResponse, Error>({\n queryKey: ['accounting-token-list'],\n queryFn: () => client.listTokens(),\n enabled: (options.enabled ?? true) && !!client,\n staleTime: Infinity,\n })\n\n return {\n tokens: query.data?.tokens ?? [],\n isLoading: query.isLoading,\n isError: query.isError,\n error: query.error,\n refetch: query.refetch,\n }\n}\n","'use client'\n\nimport { useCallback } from 'react'\nimport { useMutation, useQueryClient } from '@tanstack/react-query'\nimport { useAccount, useWalletClient } from 'wagmi'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { signModifyLockMessage } from '../signatures'\nimport type { TransactionSubmissionResponse } from '../types'\n\nexport interface UseModifyLockOptions {\n onSuccess?: (response: TransactionSubmissionResponse) => void\n onError?: (error: Error) => void\n}\n\nexport interface ModifyLockParams {\n lockId: number\n amount: bigint\n newExpiry: bigint\n}\n\nexport interface UseModifyLockResult {\n modifyLock: (params: ModifyLockParams) => Promise<TransactionSubmissionResponse | undefined>\n isPending: boolean\n isSuccess: boolean\n error: Error | null\n reset: () => void\n}\n\nexport function useModifyLock(options: UseModifyLockOptions = {}): UseModifyLockResult {\n const { address } = useAccount()\n const { data: walletClient } = useWalletClient()\n const { client, networkConfig } = usePrivanaContext()\n const queryClient = useQueryClient()\n\n const mutation = useMutation({\n mutationFn: async (params: ModifyLockParams) => {\n if (!address || !walletClient) {\n throw new Error('Wallet not connected')\n }\n\n const { nonce } = await client.getModifyLockNonce(address)\n\n const signature = await signModifyLockMessage({\n walletClient,\n chainId: networkConfig.chainId,\n verifyingContract: networkConfig.accountingContract,\n message: {\n lockId: BigInt(params.lockId),\n amount: params.amount,\n newExpiry: params.newExpiry,\n nonce: BigInt(nonce),\n },\n })\n\n return client.modifyLock({\n lock_id: params.lockId,\n amount: params.amount.toString(),\n new_expiry: params.newExpiry.toString(),\n nonce: String(nonce),\n signature,\n })\n },\n onSuccess: (data) => {\n options.onSuccess?.(data)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-locked-funds'] })\n queryClient.invalidateQueries({ queryKey: ['accounting-total-locked-balance'] })\n },\n onError: (error) => {\n options.onError?.(error as Error)\n },\n })\n\n const modifyLock = useCallback(\n async (params: ModifyLockParams) => {\n return mutation.mutateAsync(params)\n },\n [mutation]\n )\n\n return {\n modifyLock,\n isPending: mutation.isPending,\n isSuccess: mutation.isSuccess,\n error: mutation.error as Error | null,\n reset: mutation.reset,\n }\n}\n","import * as React from 'react'\nimport { Slot } from '@radix-ui/react-slot'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '@/lib/utils'\n\nconst buttonVariants = cva(\n \"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive\",\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:bg-primary/90',\n destructive:\n 'bg-destructive text-white hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',\n outline:\n 'border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/80',\n ghost: 'hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50',\n link: 'text-primary underline-offset-4 hover:underline',\n },\n size: {\n default: 'h-9 px-4 py-2 has-[>svg]:px-3',\n sm: 'h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5',\n lg: 'h-10 rounded-md px-6 has-[>svg]:px-4',\n icon: 'size-9',\n 'icon-sm': 'size-8',\n 'icon-lg': 'size-10',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nfunction Button({\n className,\n variant = 'default',\n size = 'default',\n asChild = false,\n ...props\n}: React.ComponentProps<'button'> &\n VariantProps<typeof buttonVariants> & {\n asChild?: boolean\n }) {\n const Comp = asChild ? Slot : 'button'\n\n return (\n <Comp\n data-slot=\"button\"\n data-variant={variant}\n data-size={size}\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Button, buttonVariants }\n","'use client'\n\nimport * as React from 'react'\nimport * as DialogPrimitive from '@radix-ui/react-dialog'\nimport { XIcon } from 'lucide-react'\n\nimport { cn } from '@/lib/utils'\n\nfunction Dialog({ ...props }: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({ ...props }: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({ ...props }: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({ ...props }: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n data-privana\n className={cn(\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50',\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n overlayClassName,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n overlayClassName?: string\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay className={overlayClassName} />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n data-privana\n className={cn(\n 'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg',\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"text-muted-foreground hover:text-foreground absolute top-4 right-4 cursor-pointer rounded-xs transition-colors focus:outline-none disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn('flex flex-col gap-2 text-center sm:text-left', className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn('flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({ className, ...props }: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn('text-lg leading-none font-semibold', className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn('text-muted-foreground text-sm', className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","'use client'\n\ninterface IconProps {\n className?: string\n size?: number\n}\n\nexport function ChevronRightIcon() {\n return (\n <svg width=\"10\" height=\"5\" viewBox=\"0 0 12 6\" className=\"-rotate-90\">\n <path\n d=\"M0 0l6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n )\n}\n\nexport function USDCIcon({ className, size = 24 }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 2000 2000\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M1000 2000c554.17 0 1000-445.83 1000-1000S1554.17 0 1000 0 0 445.83 0 1000s445.83 1000 1000 1000z\"\n fill=\"#2775ca\"\n />\n <path\n d=\"M1275 1158.33c0-145.83-87.5-195.83-262.5-216.66-125-16.67-150-50-150-108.34s41.67-95.83 125-95.83c75 0 116.67 25 137.5 87.5 4.17 12.5 16.67 20.83 29.17 20.83h66.66c16.67 0 29.17-12.5 29.17-29.16v-4.17c-16.67-91.67-91.67-162.5-187.5-170.83v-100c0-16.67-12.5-29.17-33.33-33.34h-62.5c-16.67 0-29.17 12.5-33.34 33.34v95.83c-125 16.67-204.16 100-204.16 204.17 0 137.5 83.33 191.66 258.33 212.5 116.67 20.83 154.17 45.83 154.17 112.5s-58.34 112.5-137.5 112.5c-108.34 0-145.84-45.84-158.34-108.34-4.16-16.66-16.66-25-29.16-25h-70.84c-16.66 0-29.16 12.5-29.16 29.17v4.17c16.66 104.16 83.33 179.16 220.83 200v100c0 16.66 12.5 29.16 33.33 33.33h62.5c16.67 0 29.17-12.5 33.34-33.33v-100c125-20.84 208.33-108.34 208.33-220.84z\"\n fill=\"#fff\"\n />\n <path\n d=\"M787.5 1595.83c-325-116.66-491.67-479.16-370.83-800 62.5-175 200-308.33 370.83-370.83 16.67-8.33 25-20.83 25-41.67V325c0-16.67-8.33-29.17-25-33.33-4.17 0-12.5 0-16.67 4.16-395.83 125-612.5 545.84-487.5 941.67 75 233.33 254.17 412.5 487.5 487.5 16.67 8.33 33.34 0 37.5-16.67 4.17-4.16 4.17-8.33 4.17-16.66v-58.34c0-12.5-12.5-29.16-25-37.5zM1229.17 295.83c-16.67-8.33-33.34 0-37.5 16.67-4.17 4.17-4.17 8.33-4.17 16.67v58.33c0 16.67 12.5 33.33 25 41.67 325 116.66 491.67 479.16 370.83 800-62.5 175-200 308.33-370.83 370.83-16.67 8.33-25 20.83-25 41.67V1700c0 16.67 8.33 29.17 25 33.33 4.17 0 12.5 0 16.67-4.16 395.83-125 612.5-545.84 487.5-941.67-75-237.5-258.34-416.67-487.5-491.67z\"\n fill=\"#fff\"\n />\n </svg>\n )\n}\n\nexport function BaseIcon({ className, size = 24 }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 2500 2500\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <circle cx=\"1250\" cy=\"1250\" r=\"1250\" fill=\"#0052FF\" />\n <path\n d=\"M1247.8,2500c691.6,0,1252.2-559.6,1252.2-1250C2500,559.6,1939.4,0,1247.8,0C591.7,0,53.5,503.8,0,1144.9h1655.1v210.2H0C53.5,1996.2,591.7,2500,1247.8,2500z\"\n fill=\"white\"\n />\n </svg>\n )\n}\n\nexport function WETHIcon({ className, size = 24 }: IconProps) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 250 250\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={className}\n >\n <path\n d=\"M0 125C0 55.9644 55.9644 0 125 0C194.036 0 250 55.9644 250 125C250 194.036 194.036 250 125 250C55.9644 250 0 194.036 0 125Z\"\n fill=\"#627EEA\"\n />\n <path\n d=\"M125.047 30.5V100.351L184.086 126.732L125.047 30.5Z\"\n fill=\"white\"\n fillOpacity=\"0.602\"\n />\n <path d=\"M125.047 30.5L66 126.732L125.047 100.351V30.5Z\" fill=\"white\" />\n <path\n d=\"M125.047 172V219.462L184.125 137.728L125.047 172Z\"\n fill=\"white\"\n fillOpacity=\"0.602\"\n />\n <path d=\"M125.047 219.462V171.992L66 137.728L125.047 219.462Z\" fill=\"white\" />\n <path\n d=\"M125.047 161.013L184.086 126.733L125.047 100.368V161.013Z\"\n fill=\"white\"\n fillOpacity=\"0.2\"\n />\n <path d=\"M66 126.733L125.047 161.013V100.368L66 126.733Z\" fill=\"white\" fillOpacity=\"0.602\" />\n </svg>\n )\n}\n\nexport function getTokenIcon(symbol: string, size?: number) {\n const iconSize = size ?? 24\n switch (symbol.toUpperCase()) {\n case 'USDC':\n return <USDCIcon size={iconSize} />\n case 'WETH':\n return <WETHIcon size={iconSize} />\n default:\n return (\n <div\n className=\"bg-muted flex items-center justify-center rounded-full text-xs font-bold\"\n style={{ width: iconSize, height: iconSize }}\n >\n {symbol.slice(0, 2)}\n </div>\n )\n }\n}\n\nexport function getChainIcon(chainId: number, size?: number) {\n const iconSize = size ?? 24\n switch (chainId) {\n case 84532:\n return <BaseIcon size={iconSize} />\n default:\n return (\n <div\n className=\"bg-muted flex items-center justify-center rounded-full text-xs font-bold\"\n style={{ width: iconSize, height: iconSize }}\n >\n ?\n </div>\n )\n }\n}\n","'use client'\n\nexport interface Step {\n label: string\n status: 'pending' | 'active' | 'completed'\n}\n\nfunction CheckIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M2.5 6l2.5 2.5 4.5-4.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nfunction ExternalLinkIcon() {\n return (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M3.5 1.5h7v7M10.5 1.5L1.5 10.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nfunction Spinner({ size = 20 }: { size?: number }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 20 20\" fill=\"none\" className=\"animate-spin\">\n <circle cx=\"10\" cy=\"10\" r=\"8\" stroke=\"currentColor\" strokeWidth=\"2\" opacity=\"0.15\" />\n <path d=\"M10 2a8 8 0 016.93 4\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" />\n </svg>\n )\n}\n\ninterface TransactionProgressViewProps {\n title: string\n steps: Step[]\n onCancel?: () => void\n}\n\nexport function TransactionProgressView({ title, steps, onCancel }: TransactionProgressViewProps) {\n const completed = steps.filter((s) => s.status === 'completed').length\n const active = steps.find((s) => s.status === 'active')\n const total = steps.length\n const progress = ((completed + (active ? 0.5 : 0)) / total) * 100\n\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"text-primary\">\n <Spinner size={20} />\n </div>\n <span className=\"text-foreground text-sm font-medium\">{active?.label ?? title}</span>\n </div>\n\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"bg-secondary h-1.5 w-full overflow-hidden rounded-full\">\n <div\n className=\"bg-primary h-full rounded-full transition-all duration-500\"\n style={{ width: `${progress}%` }}\n />\n </div>\n <span className=\"text-muted-foreground text-xs\">\n Step {Math.max(1, completed + (active ? 1 : 0))} of {total}\n </span>\n </div>\n\n {onCancel && (\n <button\n onClick={onCancel}\n className=\"border-border text-foreground hover:bg-secondary flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] border px-3 py-2 text-sm font-medium transition-colors\"\n >\n Cancel\n </button>\n )}\n </div>\n )\n}\n\ninterface TransactionSuccessViewProps {\n title: string\n message: string\n explorerUrl?: string\n explorerLabel?: string\n onDone: () => void\n}\n\nexport function TransactionSuccessView({\n title,\n message,\n explorerUrl,\n explorerLabel,\n onDone,\n}: TransactionSuccessViewProps) {\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-400\">\n <CheckIcon />\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground text-sm font-medium\">{title}</span>\n <span className=\"text-muted-foreground text-xs\">{message}</span>\n </div>\n </div>\n\n <div className=\"flex gap-2\">\n {explorerUrl && (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"border-border text-foreground hover:bg-secondary flex h-10 flex-1 items-center justify-center gap-1.5 rounded-[10px] border text-sm transition-colors\"\n >\n {explorerLabel ?? 'View on Explorer'}\n <ExternalLinkIcon />\n </a>\n )}\n <button\n onClick={onDone}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors\"\n >\n Done\n </button>\n </div>\n </div>\n )\n}\n\nfunction WarningIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\">\n <path\n d=\"M7 5v2.5M7 10h.005M6.13 2.5h1.74L13 11.5H1L6.13 2.5z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\ninterface TransactionWarningViewProps {\n title: string\n message: string\n onDone: () => void\n}\n\nexport function TransactionWarningView({ title, message, onDone }: TransactionWarningViewProps) {\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-amber-500/10 text-amber-400\">\n <WarningIcon />\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground text-sm font-medium\">{title}</span>\n <span className=\"text-muted-foreground text-xs\">{message}</span>\n </div>\n </div>\n\n <button\n onClick={onDone}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors\"\n >\n Done\n </button>\n </div>\n )\n}\n\ninterface TransactionErrorViewProps {\n title: string\n message: string\n explorerUrl?: string\n explorerLabel?: string\n onRetry: () => void\n onDismiss: () => void\n isRetrying?: boolean\n}\n\nexport function TransactionErrorView({\n title,\n message,\n explorerUrl,\n explorerLabel,\n onRetry,\n onDismiss,\n isRetrying,\n}: TransactionErrorViewProps) {\n return (\n <div className=\"flex w-full flex-col gap-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex h-7 w-7 shrink-0 items-center justify-center rounded-full bg-amber-500/10 text-amber-400\">\n <WarningIcon />\n </div>\n <div className=\"flex flex-col gap-0.5\">\n <span className=\"text-foreground text-sm font-medium\">{title}</span>\n <span className=\"text-muted-foreground text-xs\">{message}</span>\n </div>\n </div>\n\n {explorerUrl && (\n <a\n href={explorerUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"border-border text-foreground hover:bg-secondary flex h-10 w-full items-center justify-center gap-1.5 rounded-[10px] border text-sm transition-colors\"\n >\n {explorerLabel ?? 'View on Explorer'}\n <ExternalLinkIcon />\n </a>\n )}\n\n <div className=\"flex gap-2\">\n <button\n onClick={onDismiss}\n disabled={isRetrying}\n className=\"border-border text-foreground hover:bg-secondary flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] border px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n Close\n </button>\n <button\n onClick={onRetry}\n disabled={isRetrying}\n className=\"bg-primary text-primary-foreground hover:bg-primary/90 flex h-10 flex-1 cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {isRetrying ? 'Retrying...' : 'Retry Verification'}\n </button>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useState, useEffect } from 'react'\nimport { toast } from 'sonner'\nimport { useAccount, useBalance, useReadContract } from 'wagmi'\nimport { useDeposit } from '@/sdk/hooks'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { parseTokenAmount, formatTokenAmount, cn } from '@/lib/utils'\nimport { getTokenIcon, ChevronRightIcon } from './token-icons'\nimport {\n TransactionProgressView,\n TransactionSuccessView,\n TransactionWarningView,\n TransactionErrorView,\n type Step,\n} from './transaction-steps'\nimport { erc20Abi, zeroAddress } from 'viem'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\n\ninterface DepositFormProps {\n selectedToken: TokenConfig\n onTokenSelect: () => void\n onPendingChange?: (isPending: boolean) => void\n onSuccess?: () => void\n}\n\nexport function DepositForm({\n selectedToken,\n onTokenSelect,\n onPendingChange,\n onSuccess,\n}: DepositFormProps) {\n const { isConnected, address } = useAccount()\n const { chains, getChainById } = usePrivanaContext()\n const [amount, setAmount] = useState('')\n const [showSuccess, setShowSuccess] = useState(false)\n const [showTimeout, setShowTimeout] = useState(false)\n const [cancelled, setCancelled] = useState(false)\n\n const targetChain = getChainById(selectedToken.chainId) ?? chains[0]\n\n // Read balance from the token's chain directly (uses app RPC, not wallet chain).\n // This lets the form display correct balance without forcing a wallet switch;\n // the wallet switch happens on-demand inside deposit() via ensureCorrectChain.\n // Native and ERC-20 need different wagmi hooks (wagmi v2 dropped `token` from\n // useBalance), so we call both unconditionally and gate via `query.enabled`.\n const isNative = selectedToken.contract === zeroAddress\n const { data: nativeBalanceData } = useBalance({\n address,\n chainId: targetChain?.id,\n query: {\n enabled: !!address && isNative,\n },\n })\n const { data: erc20Balance } = useReadContract({\n address: selectedToken.contract as `0x${string}`,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: address ? [address] : undefined,\n chainId: targetChain?.id,\n query: {\n enabled: !!address && !isNative,\n },\n })\n const walletBalance = isNative ? nativeBalanceData?.value : erc20Balance\n\n const formattedWalletBalance = walletBalance\n ? formatTokenAmount(walletBalance.toString(), selectedToken.decimals)\n : '0'\n\n const handleMaxClick = () => {\n if (formattedWalletBalance && parseFloat(formattedWalletBalance) > 0) {\n setAmount(formattedWalletBalance.replace(/[\\s\\u2009]/g, ''))\n }\n }\n\n const hasValidAmount = amount && parseFloat(amount) > 0\n const tooManyDecimals =\n hasValidAmount && amount.includes('.') && amount.split('.')[1].length > selectedToken.decimals\n const exceedsBalance =\n hasValidAmount &&\n !tooManyDecimals &&\n walletBalance != null &&\n parseTokenAmount(amount, selectedToken.decimals) > walletBalance\n\n const {\n txHash,\n isGettingAddress,\n isSwitchingChain,\n isSendingTransaction,\n isWaitingForConfirmation,\n isWaitingForProcessing,\n verificationFailed,\n isPending,\n error,\n deposit,\n retryVerification,\n reset,\n } = useDeposit({\n onCredited: () => {\n setAmount('')\n if (onSuccess) {\n reset()\n onSuccess()\n } else {\n setShowSuccess(true)\n }\n },\n onCheckTimeout: () => {\n setAmount('')\n setShowTimeout(true)\n },\n })\n\n const depositSteps: Step[] = [\n {\n label: 'Getting deposit address',\n status: isGettingAddress\n ? 'active'\n : isSwitchingChain ||\n isSendingTransaction ||\n isWaitingForConfirmation ||\n isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: `Switching to ${targetChain?.name ?? 'deposit chain'}`,\n status: isSwitchingChain\n ? 'active'\n : isSendingTransaction || isWaitingForConfirmation || isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Confirm in wallet',\n status: isSendingTransaction\n ? 'active'\n : isWaitingForConfirmation || isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Confirming transaction',\n status: isWaitingForConfirmation\n ? 'active'\n : isWaitingForProcessing\n ? 'completed'\n : 'pending',\n },\n {\n label: 'Verifying deposit — may take up to a few minutes',\n status: isWaitingForProcessing ? 'active' : 'pending',\n },\n ]\n\n useEffect(() => {\n // Post-transfer verification errors are surfaced via the dedicated\n // TransactionErrorView below, so skip the toast for those.\n if (error && !verificationFailed) {\n toast.error(error.message.length > 100 ? `${error.message.slice(0, 100)}...` : error.message)\n }\n }, [error, verificationFailed])\n\n useEffect(() => {\n onPendingChange?.(isPending && !cancelled)\n }, [isPending, cancelled, onPendingChange])\n\n const handleCancel = () => {\n setCancelled(true)\n reset()\n }\n\n const handleDone = () => {\n setShowSuccess(false)\n setShowTimeout(false)\n setCancelled(false)\n reset()\n }\n\n const handleDismissVerificationError = () => {\n setAmount('')\n setCancelled(false)\n reset()\n }\n\n const handleRetryVerification = () => {\n retryVerification().catch(() => {\n // Errors are already surfaced via the hook's error state and onError callback.\n })\n }\n\n const explorerTxUrl =\n txHash && targetChain?.explorerUrl ? `${targetChain.explorerUrl}/tx/${txHash}` : undefined\n\n const handleSubmit = async () => {\n if (!amount || !selectedToken || exceedsBalance) return\n setCancelled(false)\n const amountInWei = parseTokenAmount(amount, selectedToken.decimals)\n await deposit({\n tokenId: selectedToken.id,\n amount: amountInWei,\n })\n }\n\n const getButtonText = () => {\n if (!isConnected) return 'Connect Wallet'\n if (isSwitchingChain) return 'Switching...'\n return 'Deposit'\n }\n\n if (showSuccess) {\n return (\n <TransactionSuccessView\n title=\"Deposit Successful\"\n message={`Your ${selectedToken.symbol} deposit has been processed.`}\n onDone={handleDone}\n />\n )\n }\n\n if (showTimeout) {\n return (\n <TransactionWarningView\n title=\"Deposit Processing\"\n message={`Your transaction was confirmed but the deposit is still being processed. Please check your balance - it should update shortly.`}\n onDone={handleDone}\n />\n )\n }\n\n if (verificationFailed) {\n const baseMessage =\n 'Your transfer was sent on-chain but we could not verify the deposit. The funds are already at the deposit address — retry verification instead of starting a new deposit.'\n const detail = error?.message\n const message = detail ? `${baseMessage} (${detail})` : baseMessage\n return (\n <TransactionErrorView\n title=\"Verification failed\"\n message={message}\n explorerUrl={explorerTxUrl}\n explorerLabel=\"View transaction\"\n onRetry={handleRetryVerification}\n onDismiss={handleDismissVerificationError}\n />\n )\n }\n\n if (isPending && !cancelled) {\n // Only allow cancel before transaction is confirmed (during address fetch/wallet signing)\n const canCancel = isGettingAddress || isSendingTransaction\n return (\n <TransactionProgressView\n title=\"Depositing...\"\n steps={depositSteps}\n onCancel={canCancel ? handleCancel : undefined}\n />\n )\n }\n\n return (\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"flex w-full flex-col gap-3\">\n <label className=\"text-muted-foreground text-sm\">Token</label>\n <button\n onClick={onTokenSelect}\n className=\"border-border bg-input flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3\"\n >\n <div className=\"h-8 w-8 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(selectedToken.symbol, 32)}\n </div>\n <div className=\"flex flex-1 flex-col items-start gap-1\">\n <span className=\"text-foreground text-sm font-medium\">{selectedToken.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">\n on {targetChain?.name ?? 'Base Sepolia'}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n </div>\n\n <div className=\"flex w-full flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-muted-foreground text-sm\">Amount</label>\n <span className=\"text-muted-foreground text-sm\">\n {formattedWalletBalance} {selectedToken.symbol}\n </span>\n </div>\n <div className=\"border-border bg-input flex items-center gap-2 rounded-[10px] border py-1 pr-1 pl-3\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) {\n setAmount(value)\n }\n }}\n className={cn(\n 'text-foreground flex-1 bg-transparent text-sm outline-none',\n 'placeholder:text-muted-foreground/50'\n )}\n />\n <button\n onClick={handleMaxClick}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 cursor-pointer rounded px-3 py-2.5 text-xs font-semibold transition-colors\"\n >\n MAX\n </button>\n </div>\n {tooManyDecimals && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {selectedToken.decimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n </div>\n\n <button\n onClick={handleSubmit}\n disabled={\n !isConnected || !hasValidAmount || tooManyDecimals || !!exceedsBalance || isPending\n }\n className={cn(\n 'flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors',\n 'bg-primary text-primary-foreground hover:bg-primary/90',\n 'disabled:cursor-not-allowed disabled:opacity-50'\n )}\n >\n {getButtonText()}\n </button>\n </div>\n )\n}\n","'use client'\n\nimport { useState, useEffect } from 'react'\nimport { toast } from 'sonner'\nimport { useAccount } from 'wagmi'\nimport { useWithdraw, useBalance } from '@/sdk/hooks'\nimport type { WithdrawStep } from '@/sdk/hooks'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { parseTokenAmount, formatTokenAmount, cn } from '@/lib/utils'\nimport { getTokenIcon, ChevronRightIcon } from './token-icons'\nimport {\n TransactionProgressView,\n TransactionSuccessView,\n TransactionWarningView,\n type Step,\n} from './transaction-steps'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { getExplorerAddressUrl } from '@/sdk/types/chains'\n\ninterface WithdrawFormProps {\n selectedToken: TokenConfig\n onTokenSelect: () => void\n onPendingChange?: (isPending: boolean) => void\n}\n\nexport function WithdrawForm({ selectedToken, onTokenSelect, onPendingChange }: WithdrawFormProps) {\n const { isConnected, address } = useAccount()\n const { chains, getChainById } = usePrivanaContext()\n const [amount, setAmount] = useState('')\n const [showSuccess, setShowSuccess] = useState(false)\n const [showTimeout, setShowTimeout] = useState(false)\n const [cancelled, setCancelled] = useState(false)\n\n const targetChain = getChainById(selectedToken.chainId) ?? chains[0]\n\n const {\n balanceWei,\n isLoading: isBalanceLoading,\n isError: isBalanceError,\n } = useBalance({\n tokenId: selectedToken.id,\n })\n\n const formattedBalance = formatTokenAmount(balanceWei, selectedToken.decimals)\n\n const { withdraw, isPending, currentStep, error, reset } = useWithdraw({\n onProcessingSuccess: () => {\n setAmount('')\n setShowSuccess(true)\n },\n onProcessingTimeout: () => {\n setAmount('')\n setShowTimeout(true)\n },\n })\n\n const explorerUrl =\n address && targetChain ? getExplorerAddressUrl(targetChain.id, address) : undefined\n\n const getStepStatus = (step: WithdrawStep, after: WithdrawStep[]): Step['status'] => {\n if (currentStep === step) return 'active'\n if (after.includes(currentStep)) return 'completed'\n return 'pending'\n }\n\n const withdrawSteps: Step[] = [\n {\n label: 'Switching to signing chain',\n status: getStepStatus('switching-chain', ['signing', 'submitting', 'processing']),\n },\n { label: 'Sign in wallet', status: getStepStatus('signing', ['submitting', 'processing']) },\n {\n label: 'Submitting withdrawal',\n status: getStepStatus('submitting', ['processing']),\n },\n {\n label: 'Processing — may take a minute or two',\n status: getStepStatus('processing', []),\n },\n ]\n\n useEffect(() => {\n if (error) {\n toast.error(error.message.length > 100 ? `${error.message.slice(0, 100)}...` : error.message)\n }\n }, [error])\n\n useEffect(() => {\n onPendingChange?.(isPending && !cancelled)\n }, [isPending, cancelled, onPendingChange])\n\n const handleCancel = () => {\n setCancelled(true)\n reset()\n }\n\n const handleDone = () => {\n setShowSuccess(false)\n setShowTimeout(false)\n setCancelled(false)\n reset()\n }\n\n const handleWithdraw = async () => {\n if (!amount || !selectedToken || exceedsBalance) return\n setCancelled(false)\n const amountInWei = parseTokenAmount(amount, selectedToken.decimals)\n await withdraw({\n tokenId: selectedToken.id,\n amount: amountInWei,\n })\n }\n\n const handleMaxClick = () => {\n if (formattedBalance && parseFloat(formattedBalance) > 0) {\n setAmount(formattedBalance.replace(/[\\s\\u2009]/g, ''))\n }\n }\n\n const hasValidAmount = amount && parseFloat(amount) > 0\n const tooManyDecimals =\n hasValidAmount && amount.includes('.') && amount.split('.')[1].length > selectedToken.decimals\n const exceedsBalance =\n hasValidAmount &&\n !tooManyDecimals &&\n !isBalanceLoading &&\n !isBalanceError &&\n parseTokenAmount(amount, selectedToken.decimals) > BigInt(balanceWei)\n\n const getButtonText = () => {\n if (!isConnected) return 'Connect Wallet'\n return 'Withdraw'\n }\n\n if (showSuccess) {\n return (\n <TransactionSuccessView\n title=\"Withdrawal Complete\"\n message={`Your ${selectedToken.symbol} withdrawal has been processed. Funds should appear in your wallet shortly.`}\n explorerUrl={explorerUrl}\n explorerLabel=\"View on BaseScan\"\n onDone={handleDone}\n />\n )\n }\n\n if (showTimeout) {\n return (\n <TransactionWarningView\n title=\"Withdrawal Processing\"\n message={`Your withdrawal is still being processed. Please check your balance — it should update shortly.`}\n onDone={handleDone}\n />\n )\n }\n\n if (isPending && !cancelled) {\n // Only allow cancel before transaction is submitted (steps 1-2)\n const canCancel =\n currentStep === 'idle' || currentStep === 'switching-chain' || currentStep === 'signing'\n return (\n <TransactionProgressView\n title=\"Withdrawing...\"\n steps={withdrawSteps}\n onCancel={canCancel ? handleCancel : undefined}\n />\n )\n }\n\n return (\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"flex w-full flex-col gap-3\">\n <label className=\"text-muted-foreground text-sm\">Token</label>\n <button\n onClick={onTokenSelect}\n className=\"border-border bg-input flex w-full cursor-pointer items-center gap-3 rounded-lg border p-3\"\n >\n <div className=\"h-8 w-8 shrink-0 overflow-hidden rounded-full\">\n {getTokenIcon(selectedToken.symbol, 32)}\n </div>\n <div className=\"flex flex-1 flex-col items-start gap-1\">\n <span className=\"text-foreground text-sm font-medium\">{selectedToken.symbol}</span>\n <span className=\"text-muted-foreground text-xs\">\n on {targetChain?.name ?? 'Base Sepolia'}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-5 w-5 items-center justify-center\">\n <ChevronRightIcon />\n </div>\n </button>\n </div>\n\n <div className=\"flex w-full flex-col gap-3\">\n <div className=\"flex items-center justify-between\">\n <label className=\"text-muted-foreground text-sm\">Amount</label>\n <span className=\"text-muted-foreground text-sm\">\n {formattedBalance} {selectedToken.symbol}\n </span>\n </div>\n <div className=\"border-border bg-input flex items-center gap-2 rounded-[10px] border py-1 pr-1 pl-3\">\n <input\n type=\"text\"\n inputMode=\"decimal\"\n placeholder=\"Enter Amount\"\n value={amount}\n onChange={(e) => {\n const value = e.target.value.replace(/[^0-9.,]/g, '').replace(/,/g, '.')\n if (value.split('.').length <= 2) {\n setAmount(value)\n }\n }}\n className={cn(\n 'text-foreground flex-1 bg-transparent text-sm outline-none',\n 'placeholder:text-muted-foreground/50'\n )}\n />\n <button\n onClick={handleMaxClick}\n className=\"bg-secondary text-foreground hover:bg-secondary/80 cursor-pointer rounded px-3 py-2.5 text-xs font-semibold transition-colors\"\n >\n MAX\n </button>\n </div>\n {tooManyDecimals && (\n <p className=\"text-destructive text-sm\">\n Too many decimal places (max: {selectedToken.decimals})\n </p>\n )}\n {exceedsBalance && <p className=\"text-destructive text-sm\">Insufficient balance</p>}\n </div>\n\n <button\n onClick={handleWithdraw}\n disabled={\n !isConnected || !hasValidAmount || tooManyDecimals || !!exceedsBalance || isPending\n }\n className={cn(\n 'flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] px-3 py-2 text-sm font-medium transition-colors',\n 'bg-primary text-primary-foreground hover:bg-primary/90',\n 'disabled:cursor-not-allowed disabled:opacity-50'\n )}\n >\n {getButtonText()}\n </button>\n </div>\n )\n}\n","'use client'\n\nimport { useState, useMemo, useEffect, useId } from 'react'\nimport { useAccount, useBalance as useWagmiBalance, useReadContract } from 'wagmi'\nimport { erc20Abi, zeroAddress } from 'viem'\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogHeader,\n DialogTitle,\n} from '@/components/ui/dialog'\nimport { DepositForm } from './deposit-form'\nimport { WithdrawForm } from './withdraw-form'\nimport type { TokenConfig } from '@/sdk/types/tokens'\nimport { usePrivanaContext } from '@/sdk/context/privana-provider'\nimport { useBalance, useLockedFunds, useUnlockFunds } from '@/sdk/hooks'\nimport { formatTokenAmount, formatTimeRemaining, cn, shortenAddress } from '@/lib/utils'\nimport { getTokenIcon, getChainIcon } from './token-icons'\n\ntype ModalView = 'main' | 'locked-funds' | 'select-token' | 'balance-details'\n\nfunction CloseIcon() {\n return (\n <svg width=\"10\" height=\"10\" viewBox=\"0 0 12 12\" fill=\"none\">\n <path\n d=\"M11.99997 11.99997l-5.99995-5.99995-6.00002-6.00002m6.00002 6.00002l6.00001-6.00002m-12.00003 12.00003l6.00002-6.00001\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n )\n}\n\nfunction SearchIcon() {\n return <div className=\"h-3 w-3 rounded-full border-[1.5px] border-current\" />\n}\n\nfunction ChevronRight() {\n return (\n <svg width=\"10\" height=\"5\" viewBox=\"0 0 12 6\" className=\"-rotate-90\">\n <path\n d=\"M0 0l6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n )\n}\n\nfunction ChevronLeft() {\n return (\n <svg width=\"10\" height=\"5\" viewBox=\"0 0 12 6\" className=\"rotate-90\">\n <path\n d=\"M0 0l6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n )\n}\n\nfunction ChevronDown({ collapsed }: { collapsed?: boolean }) {\n return (\n <svg\n width=\"12\"\n height=\"6\"\n viewBox=\"0 0 12 6\"\n className={cn('transition-transform', collapsed && '-rotate-90')}\n >\n <path\n d=\"M0 0l6 6 6-6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n />\n </svg>\n )\n}\n\nfunction BalanceCards({\n selectedToken,\n onLockedFundsClick,\n onBalanceClick,\n showLockedFunds = true,\n disabled,\n}: {\n selectedToken: TokenConfig\n onLockedFundsClick: () => void\n onBalanceClick: () => void\n showLockedFunds?: boolean\n disabled?: boolean\n}) {\n const { balanceWei, isLoading: balanceLoading } = useBalance({\n tokenId: selectedToken.id,\n })\n const { totalLocked, isLoading: lockedLoading } = useLockedFunds({ enabled: showLockedFunds })\n\n const formattedBalance = formatTokenAmount(balanceWei, selectedToken.decimals)\n const formattedLocked = showLockedFunds\n ? formatTokenAmount(String(totalLocked), selectedToken.decimals)\n : '0'\n\n return (\n <div className={cn('flex gap-2', disabled && 'opacity-50')}>\n <button\n onClick={onBalanceClick}\n disabled={disabled}\n className={cn(\n 'bg-muted flex flex-1 flex-col gap-2 rounded-[10px] p-5 text-left transition-colors',\n disabled ? 'cursor-not-allowed' : 'hover:bg-muted/80 cursor-pointer'\n )}\n >\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-muted-foreground text-sm\">Balance</span>\n <span className=\"bg-secondary text-muted-foreground rounded-full px-2 py-[5px] text-[10px] font-bold\">\n {selectedToken.symbol}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-6 w-6 items-center justify-center\">\n <ChevronRight />\n </div>\n </div>\n <div className=\"text-foreground text-xl font-medium\">\n {balanceLoading ? (\n <span className=\"bg-secondary inline-block h-6 w-24 animate-pulse rounded\" />\n ) : (\n formattedBalance\n )}\n </div>\n </button>\n\n {showLockedFunds && (\n <button\n onClick={onLockedFundsClick}\n disabled={disabled}\n className={cn(\n 'bg-muted flex flex-1 flex-col gap-2 rounded-[10px] p-5 text-left transition-colors',\n disabled ? 'cursor-not-allowed' : 'hover:bg-muted/80 cursor-pointer'\n )}\n >\n <div className=\"flex w-full items-center justify-between\">\n <div className=\"flex items-center gap-1\">\n <span className=\"text-muted-foreground text-sm\">Locked Funds</span>\n <span className=\"bg-secondary text-muted-foreground rounded-full px-2 py-[5px] text-[10px] font-bold\">\n {selectedToken.symbol}\n </span>\n </div>\n <div className=\"text-muted-foreground flex h-6 w-6 items-center justify-center\">\n <ChevronRight />\n </div>\n </div>\n <div className=\"text-foreground text-xl font-medium\">\n {lockedLoading ? (\n <span className=\"bg-secondary inline-block h-6 w-20 animate-pulse rounded\" />\n ) : (\n formattedLocked\n )}\n </div>\n </button>\n )}\n </div>\n )\n}\n\nfunction Tabs({\n activeTab,\n onTabChange,\n disabled,\n}: {\n activeTab: 'deposit' | 'withdraw'\n onTabChange: (tab: 'deposit' | 'withdraw') => void\n disabled?: boolean\n}) {\n return (\n <div\n className={cn(\n 'bg-muted relative flex gap-2 overflow-hidden rounded-[10px] p-1',\n disabled && 'opacity-50'\n )}\n >\n <div\n className={cn(\n 'bg-input absolute top-1 bottom-1 left-1 w-[calc(50%-4px)] rounded-md transition-transform duration-200',\n activeTab === 'withdraw' && 'translate-x-[calc(100%+8px)]'\n )}\n />\n <button\n onClick={() => !disabled && onTabChange('deposit')}\n disabled={disabled}\n className={cn(\n 'relative z-10 flex-1 rounded-md px-3 py-[9px] text-sm transition-colors',\n activeTab === 'deposit' ? 'text-foreground' : 'text-muted-foreground',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n Deposit\n </button>\n <button\n onClick={() => !disabled && onTabChange('withdraw')}\n disabled={disabled}\n className={cn(\n 'relative z-10 flex-1 rounded-md px-3 py-[9px] text-sm transition-colors',\n activeTab === 'withdraw' ? 'text-foreground' : 'text-muted-foreground',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n )}\n >\n Withdraw\n </button>\n </div>\n )\n}\n\ninterface LockedFundsSection {\n title: string\n items: {\n lockId: number\n amount: string\n serviceAddress: string\n time: string\n isExpired: boolean\n }[]\n}\n\nfunction LockedFundsView({ onBack, onClose }: { onBack: () => void; onClose?: () => void }) {\n const { getTokenById } = usePrivanaContext()\n const { locks, isLoading } = useLockedFunds()\n const { unlockFunds, unlockAllExpired, isPending } = useUnlockFunds()\n const [collapsedSections, setCollapsedSections] = useState<Record<string, boolean>>({})\n\n const sections = useMemo(() => {\n const sectionMap: Record<string, LockedFundsSection> = {}\n\n locks.forEach((lock) => {\n const serviceName = shortenAddress(lock.service_address)\n if (!sectionMap[lock.service_address]) {\n sectionMap[lock.service_address] = {\n title: `Service ${serviceName}`,\n items: [],\n }\n }\n sectionMap[lock.service_address].items.push({\n lockId: lock.lock_id,\n amount: formatTokenAmount(String(lock.amount), getTokenById(lock.token_id)?.decimals ?? 18),\n serviceAddress: lock.service_address,\n time: lock.is_expired ? 'Click to unlock' : formatTimeRemaining(lock.expiry),\n isExpired: lock.is_expired,\n })\n })\n\n return Object.values(sectionMap)\n }, [getTokenById, locks])\n\n const toggleSection = (title: string) => {\n setCollapsedSections((prev) => ({\n ...prev,\n [title]: !prev[title],\n }))\n }\n\n const expiredCount = locks.filter((l) => l.is_expired).length\n\n return (\n <>\n <div className=\"flex items-center justify-between px-5 py-4\">\n <div className=\"flex items-center gap-2.5\">\n <button\n onClick={onBack}\n className=\"text-muted-foreground hover:text-foreground flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <ChevronLeft />\n </button>\n <span className=\"text-foreground text-xl leading-6 font-medium\">Locked Funds</span>\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className=\"text-muted-foreground hover:text-foreground flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <CloseIcon />\n </button>\n )}\n </div>\n\n <div className=\"bg-muted flex min-h-0 flex-1 flex-col rounded-[10px] p-2\">\n <div className=\"flex-1 overflow-y-auto\">\n {isLoading ? (\n <div className=\"flex flex-col gap-2 p-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"flex animate-pulse items-center gap-3 rounded-lg p-3\">\n <div className=\"bg-secondary h-10 w-10 rounded-full\" />\n <div className=\"flex-1\">\n <div className=\"bg-secondary mb-2 h-3.5 w-24 rounded\" />\n <div className=\"bg-secondary h-3 w-32 rounded\" />\n </div>\n </div>\n ))}\n </div>\n ) : sections.length === 0 ? (\n <div className=\"flex items-center justify-center p-8\">\n <span className=\"text-muted-foreground text-sm\">No locked funds</span>\n </div>\n ) : (\n sections.map((section) => (\n <div key={section.title}>\n <button\n onClick={() => toggleSection(section.title)}\n className=\"text-muted-foreground hover:bg-secondary flex w-full cursor-pointer items-center justify-between rounded-lg px-4 py-4 transition-colors\"\n >\n <span className=\"text-sm\">{section.title}</span>\n <ChevronDown collapsed={collapsedSections[section.title]} />\n </button>\n\n {!collapsedSections[section.title] &&\n section.items.map((item) => (\n <div\n key={`${item.serviceAddress}-${item.lockId}`}\n className={cn(\n 'flex items-center justify-between gap-3 rounded-lg p-3',\n item.isExpired && 'bg-secondary'\n )}\n >\n <div className=\"flex flex-1 items-center gap-3\">\n <div className=\"bg-secondary h-10 w-10 rounded-full\" />\n <div className=\"flex flex-col gap-2\">\n <span className=\"text-foreground text-sm font-medium\">\n {item.amount} USDC\n </span>\n <span className=\"text-muted-foreground text-xs\">\n Service: {shortenAddress(item.serviceAddress)}\n </span>\n </div>\n </div>\n <div className=\"flex flex-1 flex-col items-end gap-2\">\n {item.isExpired ? (\n <button\n onClick={() => unlockFunds({ lockId: Number(item.lockId) })}\n disabled={isPending}\n className=\"text-foreground hover:text-foreground/80 cursor-pointer text-sm transition-colors disabled:opacity-50\"\n >\n Click to unlock\n </button>\n ) : (\n <span className=\"text-sm text-amber-500\">{item.time}</span>\n )}\n <span className=\"text-muted-foreground text-xs\">on Base Sepolia</span>\n </div>\n </div>\n ))}\n </div>\n ))\n )}\n </div>\n\n {expiredCount > 0 && (\n <div className=\"p-3\">\n <button\n onClick={() => unlockAllExpired()}\n disabled={isPending}\n className=\"border-border text-foreground hover:bg-secondary flex h-10 w-full cursor-pointer items-center justify-center rounded-[10px] border px-3 py-2 text-sm font-medium transition-colors disabled:opacity-50\"\n >\n Unlock All ({expiredCount})\n </button>\n </div>\n )}\n </div>\n </>\n )\n}\n\nfunction BalanceTokenRow({ token }: { token: TokenConfig }) {\n const { balanceWei, isLoading } = useBalance({\n tokenId: token.id,\n })\n\n const formattedBalance = formatTokenAmount(balanceWei, token.decimals)\n\n return (\n <div className=\"flex w-full items-center gap-2 rounded-lg px-3 py-2.5\">\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getTokenIcon(token.symbol, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{token.symbol}</span>\n {isLoading ? (\n <span className=\"bg-secondary h-4 w-16 animate-pulse rounded\" />\n ) : (\n <span className=\"text-muted-foreground text-sm\">{formattedBalance}</span>\n )}\n </div>\n )\n}\n\nfunction BalanceDetailsView({ onBack, onClose }: { onBack: () => void; onClose?: () => void }) {\n const { enabledTokens, chains } = usePrivanaContext()\n const [selectedChainId, setSelectedChainId] = useState<number>(chains[0]?.id ?? 84532)\n\n const chainTokens = useMemo(() => {\n return enabledTokens.filter((t) => t.chainId === selectedChainId)\n }, [enabledTokens, selectedChainId])\n\n return (\n <>\n <div className=\"flex items-center justify-between px-5 py-4\">\n <div className=\"flex items-center gap-2.5\">\n <button\n onClick={onBack}\n className=\"text-muted-foreground hover:text-foreground flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <ChevronLeft />\n </button>\n <span className=\"text-foreground text-xl leading-6 font-medium\">Token Balances</span>\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className=\"text-muted-foreground hover:text-foreground flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <CloseIcon />\n </button>\n )}\n </div>\n\n <div className=\"flex min-h-0 flex-1 gap-2\">\n <div className=\"bg-muted flex flex-1 flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Network</span>\n </div>\n <div className=\"mt-1 flex-1 overflow-y-auto\">\n {chains.map((chain) => {\n const isSelected = selectedChainId === chain.id\n\n return (\n <button\n key={chain.id}\n onClick={() => setSelectedChainId(chain.id)}\n className={cn(\n 'hover:bg-secondary flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-left transition-colors',\n isSelected && 'bg-secondary'\n )}\n >\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getChainIcon(chain.id, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{chain.name}</span>\n </button>\n )\n })}\n </div>\n </div>\n\n <div className=\"bg-muted flex flex-[2] flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Token Balance</span>\n </div>\n <div className=\"mt-2 flex-1 overflow-y-auto\">\n {chainTokens.map((token) => (\n <BalanceTokenRow key={token.id} token={token} />\n ))}\n </div>\n </div>\n </div>\n </>\n )\n}\n\nfunction TokenRow({\n token,\n isSelected,\n onClick,\n}: {\n token: TokenConfig\n isSelected: boolean\n onClick: () => void\n}) {\n const { address } = useAccount()\n const isNative = token.contract === zeroAddress\n\n const { data: nativeBalanceData } = useWagmiBalance({\n address,\n chainId: token.chainId,\n query: { enabled: !!address && isNative },\n })\n const { data: erc20Balance } = useReadContract({\n address: token.contract as `0x${string}`,\n abi: erc20Abi,\n functionName: 'balanceOf',\n args: address ? [address] : undefined,\n chainId: token.chainId,\n query: { enabled: !!address && !isNative },\n })\n const walletBalance = isNative ? nativeBalanceData?.value : erc20Balance\n\n const formattedBalance = walletBalance\n ? formatTokenAmount(walletBalance.toString(), token.decimals)\n : '0.00'\n\n return (\n <button\n onClick={onClick}\n className={cn(\n 'hover:bg-secondary flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-left transition-colors',\n isSelected && 'bg-secondary'\n )}\n >\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getTokenIcon(token.symbol, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{token.symbol}</span>\n <span className=\"text-muted-foreground text-sm\">{formattedBalance}</span>\n </button>\n )\n}\n\nfunction TokenSelectorView({\n onBack,\n onClose,\n onSelect,\n selectedTokenId,\n}: {\n onBack: () => void\n onClose?: () => void\n onSelect: (token: TokenConfig) => void\n selectedTokenId?: string\n}) {\n const [tokenSearch, setTokenSearch] = useState('')\n const { enabledTokens, chains } = usePrivanaContext()\n const [selectedChainId, setSelectedChainId] = useState<number>(chains[0]?.id ?? 84532)\n\n const chainTokens = useMemo(() => {\n return enabledTokens.filter((t) => t.chainId === selectedChainId)\n }, [enabledTokens, selectedChainId])\n\n const filteredTokens = useMemo(() => {\n if (!tokenSearch) return chainTokens\n return chainTokens.filter(\n (t) =>\n t.symbol.toLowerCase().includes(tokenSearch.toLowerCase()) ||\n t.name.toLowerCase().includes(tokenSearch.toLowerCase())\n )\n }, [tokenSearch, chainTokens])\n\n const handleTokenSelect = (token: TokenConfig) => {\n onSelect(token)\n onBack()\n }\n\n return (\n <>\n <div className=\"flex items-center justify-between px-5 py-4\">\n <div className=\"flex items-center gap-2.5\">\n <button\n onClick={onBack}\n className=\"text-muted-foreground hover:text-foreground flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <ChevronLeft />\n </button>\n <span className=\"text-foreground text-xl leading-6 font-medium\">Select Token</span>\n </div>\n {onClose && (\n <button\n onClick={onClose}\n className=\"text-muted-foreground hover:text-foreground flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <CloseIcon />\n </button>\n )}\n </div>\n\n <div className=\"flex min-h-0 flex-1 gap-2\">\n <div className=\"bg-muted flex flex-1 flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Network</span>\n </div>\n <div className=\"mt-1 flex-1 overflow-y-auto\">\n {chains.map((chain) => {\n const isSelected = selectedChainId === chain.id\n\n return (\n <button\n key={chain.id}\n onClick={() => setSelectedChainId(chain.id)}\n className={cn(\n 'hover:bg-secondary flex w-full cursor-pointer items-center gap-2 rounded-lg px-3 py-2.5 text-left transition-colors',\n isSelected && 'bg-secondary'\n )}\n >\n <div className=\"h-[18px] w-[18px] overflow-hidden rounded-full\">\n {getChainIcon(chain.id, 18)}\n </div>\n <span className=\"text-foreground flex-1 text-sm\">{chain.name}</span>\n </button>\n )\n })}\n </div>\n </div>\n\n <div className=\"bg-muted flex flex-[2] flex-col overflow-hidden rounded-[10px] p-2\">\n <div className=\"flex flex-col gap-1\">\n <div className=\"px-4 pt-4 pb-2\">\n <span className=\"text-muted-foreground text-sm\">Token</span>\n </div>\n <div className=\"px-3\">\n <div className=\"border-border bg-input flex items-center gap-2.5 rounded-lg border px-3 py-2.5\">\n <span className=\"text-muted-foreground\">\n <SearchIcon />\n </span>\n <input\n type=\"text\"\n placeholder=\"Search\"\n value={tokenSearch}\n onChange={(e) => setTokenSearch(e.target.value)}\n className=\"text-foreground placeholder:text-muted-foreground flex-1 bg-transparent text-sm outline-none\"\n />\n </div>\n </div>\n </div>\n <div className=\"mt-2 flex-1 overflow-y-auto\">\n {filteredTokens.map((token) => (\n <TokenRow\n key={token.id}\n token={token}\n isSelected={selectedTokenId === token.id}\n onClick={() => handleTokenSelect(token)}\n />\n ))}\n </div>\n </div>\n </div>\n </>\n )\n}\n\ninterface ModalBodyProps {\n onClose?: () => void\n onViewChange?: (view: ModalView) => void\n onTransactionPendingChange?: (isPending: boolean) => void\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}\n\nfunction ModalBody({\n onClose,\n onViewChange,\n onTransactionPendingChange,\n showLockedFunds = true,\n defaultTab = 'deposit',\n onDepositSuccess,\n}: ModalBodyProps) {\n const { defaultToken, tokensStatus } = usePrivanaContext()\n const [selectedToken, setSelectedToken] = useState<TokenConfig | undefined>(defaultToken)\n const [activeTab, setActiveTab] = useState<'deposit' | 'withdraw'>(defaultTab)\n const [currentView, setCurrentView] = useState<ModalView>('main')\n const [isTransactionPending, setIsTransactionPending] = useState(false)\n\n // Sync selectedToken once tokens finish loading\n useEffect(() => {\n if (!selectedToken && defaultToken) {\n setSelectedToken(defaultToken)\n }\n }, [selectedToken, defaultToken])\n\n const handleTransactionPendingChange = (isPending: boolean) => {\n setIsTransactionPending(isPending)\n onTransactionPendingChange?.(isPending)\n }\n\n const handleViewChange = (view: ModalView) => {\n setCurrentView(view)\n onViewChange?.(view)\n }\n\n const handleTokenSelect = (token: TokenConfig) => {\n setSelectedToken(token)\n }\n\n if (tokensStatus === 'loading' || !selectedToken) {\n return (\n <div className=\"flex flex-col gap-2 pb-4\">\n <div className=\"bg-secondary h-25 animate-pulse rounded-[10px]\" />\n <div className=\"bg-secondary h-11 animate-pulse rounded-[10px]\" />\n <div className=\"bg-secondary h-50 animate-pulse rounded-[10px]\" />\n </div>\n )\n }\n\n if (currentView === 'locked-funds') {\n return <LockedFundsView onBack={() => handleViewChange('main')} onClose={onClose} />\n }\n\n if (currentView === 'balance-details') {\n return <BalanceDetailsView onBack={() => handleViewChange('main')} onClose={onClose} />\n }\n\n if (currentView === 'select-token') {\n return (\n <TokenSelectorView\n onBack={() => handleViewChange('main')}\n onClose={onClose}\n onSelect={handleTokenSelect}\n selectedTokenId={selectedToken.id}\n />\n )\n }\n\n return (\n <>\n <div className=\"flex flex-col gap-2 pb-4\">\n <div className={cn(isTransactionPending && 'pointer-events-none')}>\n <BalanceCards\n selectedToken={selectedToken}\n onLockedFundsClick={() => handleViewChange('locked-funds')}\n onBalanceClick={() => handleViewChange('balance-details')}\n showLockedFunds={showLockedFunds}\n disabled={isTransactionPending}\n />\n </div>\n\n <div className={cn(isTransactionPending && 'pointer-events-none')}>\n <Tabs activeTab={activeTab} onTabChange={setActiveTab} disabled={isTransactionPending} />\n </div>\n\n <div className=\"bg-muted rounded-[10px] p-5\">\n {activeTab === 'deposit' ? (\n <DepositForm\n selectedToken={selectedToken}\n onTokenSelect={() => handleViewChange('select-token')}\n onPendingChange={handleTransactionPendingChange}\n onSuccess={onDepositSuccess}\n />\n ) : (\n <WithdrawForm\n selectedToken={selectedToken}\n onTokenSelect={() => handleViewChange('select-token')}\n onPendingChange={handleTransactionPendingChange}\n />\n )}\n </div>\n </div>\n </>\n )\n}\n\ninterface PrivanaModalProps {\n open: boolean\n onClose: () => void\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}\n\nexport function PrivanaModal({\n open,\n onClose,\n showLockedFunds,\n defaultTab,\n onDepositSuccess,\n}: PrivanaModalProps) {\n const [isTransactionPending, setIsTransactionPending] = useState(false)\n const titleId = useId()\n const descId = useId()\n\n const handleOpenChange = (isOpen: boolean) => {\n // Block closing if a transaction is pending\n if (!isOpen && isTransactionPending) {\n return\n }\n if (!isOpen) {\n onClose()\n }\n }\n\n return (\n <Dialog open={open} onOpenChange={handleOpenChange}>\n <DialogContent\n data-privana\n showCloseButton={false}\n className=\"bg-card flex w-[560px] max-w-[95vw] flex-col gap-2 overflow-hidden rounded-2xl border-0 p-2\"\n overlayClassName={isTransactionPending ? 'cursor-not-allowed' : undefined}\n aria-labelledby={titleId}\n aria-describedby={descId}\n >\n <DialogHeader>\n <DialogTitle id={titleId} className=\"sr-only\">\n Privana\n </DialogTitle>\n <DialogDescription id={descId} className=\"sr-only\">\n Deposit or withdraw tokens from your Flexvault\n </DialogDescription>\n <div className=\"flex items-center justify-between px-5 py-4\">\n <span className=\"text-foreground text-xl leading-6 font-medium\">Privana</span>\n {onClose && (\n <button\n onClick={onClose}\n className=\"text-muted-foreground hover:text-foreground flex h-6 w-6 cursor-pointer items-center justify-center transition-colors\"\n >\n <CloseIcon />\n </button>\n )}\n </div>\n </DialogHeader>\n <ModalBody\n onClose={isTransactionPending ? undefined : onClose}\n onTransactionPendingChange={setIsTransactionPending}\n showLockedFunds={showLockedFunds}\n defaultTab={defaultTab}\n onDepositSuccess={onDepositSuccess}\n />\n </DialogContent>\n </Dialog>\n )\n}\n\nexport function PrivanaInlineModal({\n className,\n showLockedFunds,\n defaultTab,\n onDepositSuccess,\n}: {\n className?: string\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}) {\n return (\n <div\n data-privana\n className={cn(\n 'bg-card flex w-[560px] max-w-full flex-col gap-2 overflow-hidden rounded-2xl p-2 shadow-lg',\n className\n )}\n >\n <ModalBody\n showLockedFunds={showLockedFunds}\n defaultTab={defaultTab}\n onDepositSuccess={onDepositSuccess}\n />\n </div>\n )\n}\n","'use client'\n\nimport { useState, type ReactNode, type ComponentProps, type ReactElement } from 'react'\nimport { useAccount } from 'wagmi'\nimport { Button, type buttonVariants } from '@/components/ui/button'\nimport { PrivanaModal } from './privana-modal'\nimport { cn } from '@/lib/utils'\nimport type { VariantProps } from 'class-variance-authority'\n\ntype ButtonVariantProps = VariantProps<typeof buttonVariants>\n\nexport interface PrivanaButtonProps extends Omit<ComponentProps<'button'>, 'children'> {\n children?: ReactNode\n variant?: ButtonVariantProps['variant']\n size?: ButtonVariantProps['size']\n asChild?: boolean\n renderButton?: (props: { onClick: () => void; isOpen: boolean }) => ReactElement\n hideWhenDisconnected?: boolean\n showLockedFunds?: boolean\n defaultTab?: 'deposit' | 'withdraw'\n onDepositSuccess?: () => void\n}\n\nexport function PrivanaButton({\n children,\n className,\n variant = 'outline',\n size = 'default',\n asChild = false,\n renderButton,\n hideWhenDisconnected = true,\n showLockedFunds = true,\n defaultTab,\n onDepositSuccess,\n ...buttonProps\n}: PrivanaButtonProps) {\n const [modalOpen, setModalOpen] = useState(false)\n const { isConnected } = useAccount()\n\n if (hideWhenDisconnected && !isConnected) {\n return null\n }\n\n const handleClick = () => setModalOpen(true)\n\n const buttonElement = renderButton ? (\n renderButton({ onClick: handleClick, isOpen: modalOpen })\n ) : (\n <Button\n variant={variant}\n size={size}\n asChild={asChild}\n className={cn(className)}\n onClick={handleClick}\n disabled={!isConnected}\n {...buttonProps}\n >\n {children ?? 'Privana'}\n </Button>\n )\n\n return (\n <span data-privana className=\"contents\">\n {buttonElement}\n <PrivanaModal\n open={modalOpen}\n onClose={() => setModalOpen(false)}\n showLockedFunds={showLockedFunds}\n defaultTab={defaultTab}\n onDepositSuccess={onDepositSuccess}\n />\n </span>\n )\n}\n","import { cn } from '@/lib/utils'\n\nfunction Skeleton({ className, ...props }: React.ComponentProps<'div'>) {\n return (\n <div\n data-slot=\"skeleton\"\n className={cn('bg-accent animate-pulse rounded-md', className)}\n {...props}\n />\n )\n}\n\nexport { Skeleton }\n"]}
|