@oasisprotocol/privana-sdk 0.4.3 → 0.4.4
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/dist/{chunk-EEAQ2NWF.cjs → chunk-NMRIKUDN.cjs} +14 -12
- package/dist/chunk-NMRIKUDN.cjs.map +1 -0
- package/dist/{chunk-2AHJHISR.js → chunk-WV6CGHEF.js} +14 -13
- package/dist/chunk-WV6CGHEF.js.map +1 -0
- package/dist/index.cjs +151 -147
- package/dist/index.d.cts +8 -6
- package/dist/index.d.ts +8 -6
- package/dist/index.js +2 -2
- package/dist/on-ramp.cjs +7 -7
- package/dist/on-ramp.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-2AHJHISR.js.map +0 -1
- package/dist/chunk-EEAQ2NWF.cjs.map +0 -1
|
@@ -211,6 +211,11 @@ function isHostedAuthRefreshActive(session, now = Date.now(), skewMs = HOSTED_AU
|
|
|
211
211
|
return session.refreshExpiresAt > now + skewMs;
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
+
// src/sdk/auth/siwe.ts
|
|
215
|
+
function buildSiweStatement(chainId) {
|
|
216
|
+
return `Sign in to Privana on chain ${chainId}`;
|
|
217
|
+
}
|
|
218
|
+
|
|
214
219
|
// src/sdk/client/errors.ts
|
|
215
220
|
var AccountingApiError = class _AccountingApiError extends Error {
|
|
216
221
|
constructor(message, statusCode, detail) {
|
|
@@ -665,15 +670,13 @@ function deleteCachedPrivateReadToken(scopeKey) {
|
|
|
665
670
|
cache.delete(scopeKey);
|
|
666
671
|
}
|
|
667
672
|
var DEFAULT_SIWE_VALIDITY_MS = 24 * 60 * 60 * 1e3;
|
|
668
|
-
var DEFAULT_STATEMENT = "Sign in to access your private account data.";
|
|
669
673
|
var AUTH_REFRESH_SKEW_MS = 3e4;
|
|
670
674
|
var SiweAuthContext = react.createContext(null);
|
|
671
675
|
function SiweAuthProvider({
|
|
672
676
|
children,
|
|
673
677
|
client,
|
|
674
678
|
networkConfig,
|
|
675
|
-
autoLogin = true
|
|
676
|
-
statement
|
|
679
|
+
autoLogin = true
|
|
677
680
|
}) {
|
|
678
681
|
const wagmiContext = react.useContext(wagmi.WagmiContext);
|
|
679
682
|
const { address, isConnected, status } = useSafeAccount();
|
|
@@ -732,7 +735,7 @@ function SiweAuthProvider({
|
|
|
732
735
|
uri,
|
|
733
736
|
version: "1",
|
|
734
737
|
nonce: nonceRes.nonce,
|
|
735
|
-
statement:
|
|
738
|
+
statement: buildSiweStatement(networkConfig.chainId),
|
|
736
739
|
issuedAt,
|
|
737
740
|
expirationTime
|
|
738
741
|
});
|
|
@@ -768,7 +771,7 @@ function SiweAuthProvider({
|
|
|
768
771
|
setIsLoading(false);
|
|
769
772
|
loginInFlight.current = false;
|
|
770
773
|
}
|
|
771
|
-
}, [wagmiContext, address, client, networkConfig.chainId, networkConfig.apiUrl
|
|
774
|
+
}, [wagmiContext, address, client, networkConfig.chainId, networkConfig.apiUrl]);
|
|
772
775
|
const refreshAccessToken = react.useCallback(async () => {
|
|
773
776
|
const data = refreshDataRef.current;
|
|
774
777
|
if (!data || refreshInFlight.current) return;
|
|
@@ -1127,8 +1130,7 @@ function PrivanaProvider({
|
|
|
1127
1130
|
{
|
|
1128
1131
|
client,
|
|
1129
1132
|
networkConfig,
|
|
1130
|
-
autoLogin: siweAuth.autoLogin,
|
|
1131
|
-
statement: siweAuth.statement,
|
|
1133
|
+
autoLogin: typeof siweAuth === "object" ? siweAuth.autoLogin : void 0,
|
|
1132
1134
|
children
|
|
1133
1135
|
}
|
|
1134
1136
|
) : children });
|
|
@@ -1146,7 +1148,6 @@ function useSafePrivanaContext() {
|
|
|
1146
1148
|
var INITIAL_AUTH_BACKOFF_MS = 5e3;
|
|
1147
1149
|
var MAX_AUTH_BACKOFF_MS = 6e4;
|
|
1148
1150
|
var DEFAULT_SIWE_AUTH_VALIDITY_MS = 24 * 60 * 60 * 1e3;
|
|
1149
|
-
var PRIVATE_READ_STATEMENT = "Sign in to Privana to access private account data.";
|
|
1150
1151
|
var privateReadFailureCache = /* @__PURE__ */ new Map();
|
|
1151
1152
|
var privateReadInflight = /* @__PURE__ */ new Map();
|
|
1152
1153
|
async function executeHostedAuthPrivateReadRequest({
|
|
@@ -1263,12 +1264,12 @@ function usePrivateReadRequest() {
|
|
|
1263
1264
|
const uri = typeof window !== "undefined" && window.location.origin ? window.location.origin : apiUrl;
|
|
1264
1265
|
const message = siwe.createSiweMessage({
|
|
1265
1266
|
address: walletAddress,
|
|
1266
|
-
chainId:
|
|
1267
|
+
chainId: networkConfig.chainId,
|
|
1267
1268
|
domain,
|
|
1268
1269
|
expirationTime,
|
|
1269
1270
|
issuedAt,
|
|
1270
1271
|
nonce: nonceResponse.nonce,
|
|
1271
|
-
statement:
|
|
1272
|
+
statement: buildSiweStatement(networkConfig.chainId),
|
|
1272
1273
|
uri,
|
|
1273
1274
|
version: "1"
|
|
1274
1275
|
});
|
|
@@ -1733,6 +1734,7 @@ exports.Skeleton = Skeleton;
|
|
|
1733
1734
|
exports.ValidationError = ValidationError;
|
|
1734
1735
|
exports.applyRefreshResponse = applyRefreshResponse;
|
|
1735
1736
|
exports.buildHostedAuthSession = buildHostedAuthSession;
|
|
1737
|
+
exports.buildSiweStatement = buildSiweStatement;
|
|
1736
1738
|
exports.buttonVariants = buttonVariants;
|
|
1737
1739
|
exports.clearHostedAuthPendingTransaction = clearHostedAuthPendingTransaction;
|
|
1738
1740
|
exports.cn = cn;
|
|
@@ -1769,5 +1771,5 @@ exports.useSafeAccount = useSafeAccount;
|
|
|
1769
1771
|
exports.useSafePrivanaContext = useSafePrivanaContext;
|
|
1770
1772
|
exports.useSiweAuth = useSiweAuth;
|
|
1771
1773
|
exports.waitForTransactionReceipt = waitForTransactionReceipt;
|
|
1772
|
-
//# sourceMappingURL=chunk-
|
|
1773
|
-
//# sourceMappingURL=chunk-
|
|
1774
|
+
//# sourceMappingURL=chunk-NMRIKUDN.cjs.map
|
|
1775
|
+
//# sourceMappingURL=chunk-NMRIKUDN.cjs.map
|
|
@@ -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/auth/siwe.ts","../src/sdk/client/errors.ts","../src/sdk/client/http-client.ts","../src/sdk/client/privana-client.ts","../src/sdk/hooks/use-safe-account.ts","../src/sdk/hooks/private-read-token-store.ts","../src/sdk/context/siwe-auth-provider.tsx","../src/sdk/context/privana-provider.tsx","../src/sdk/hooks/use-private-read-request.ts","../src/sdk/hooks/use-deposit-verification.ts","../src/lib/utils.ts","../src/components/ui/button.tsx","../src/components/ui/skeleton.tsx","../../../node_modules/@wagmi/core/src/utils/getAction.ts","../../../node_modules/@wagmi/core/src/actions/getTransactionReceipt.ts","../../../node_modules/@wagmi/core/src/actions/waitForTransactionReceipt.ts","../../../node_modules/@wagmi/core/src/actions/getChainId.ts"],"names":["useContext","WagmiContext","useRef","useCallback","watchAccount","getAccount","useSyncExternalStore","createContext","useState","getWalletClient","createSiweMessage","useEffect","useMemo","jsx","zeroAddress","getChainById","useQueryClient","twMerge","clsx","cva","Slot","viem_getTransactionReceipt","viem_waitForTransactionReceipt","getTransaction","call","hexToString","getChainId"],"mappings":"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","file":"chunk-NMRIKUDN.cjs","sourcesContent":["{\n \"chains\": [\n {\n \"id\": 84532,\n \"name\": \"Base Sepolia\",\n \"explorerUrl\": \"https://sepolia.basescan.org\"\n },\n {\n \"id\": 11155111,\n \"name\": \"Ethereum Sepolia\",\n \"explorerUrl\": \"https://sepolia.etherscan.io\"\n }\n ],\n \"networks\": {\n \"testnet\": {\n \"chainId\": 23295,\n \"name\": \"Sapphire Testnet\",\n \"accountingContract\": \"0xaF8e5de153A584528B57DD4B9B0195956BBDF571\",\n \"apiUrl\": \"https://api.testnet.privana.finance\"\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 function buildSiweStatement(chainId: number): string {\n return `Sign in to Privana on chain ${chainId}`\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 CreateOnRampIntentRequest,\n CreateOnRampIntentResponse,\n PendingOnRampsResponse,\n SignOnRampUrlRequest,\n SignOnRampUrlResponse,\n UpdateOnRampRequest,\n UpdateOnRampResponse,\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 async signOnRampUrl(request: SignOnRampUrlRequest): Promise<SignOnRampUrlResponse> {\n return this.http.post<SignOnRampUrlResponse>('/v1/accounting/onramp/sign-url', {\n url: request.url,\n })\n }\n\n async createOnRampIntent(\n request: CreateOnRampIntentRequest\n ): Promise<CreateOnRampIntentResponse> {\n return this.http.post<CreateOnRampIntentResponse>('/v1/accounting/onramp/intent', {\n wallet_address: request.wallet_address ? normalizeAddress(request.wallet_address) : undefined,\n token_id: normalizeHex(request.token_id),\n chain_id: request.chain_id,\n moonpay_currency_code: request.moonpay_currency_code,\n base_currency_code: request.base_currency_code,\n base_currency_amount: request.base_currency_amount,\n })\n }\n\n async updateOnRamp(\n transactionId: string,\n request: UpdateOnRampRequest\n ): Promise<UpdateOnRampResponse> {\n return this.http.post<UpdateOnRampResponse>(\n `/v1/accounting/onramp/${encodeURIComponent(transactionId)}`,\n {\n wallet_address: request.wallet_address\n ? normalizeAddress(request.wallet_address)\n : undefined,\n token_id: request.token_id ? normalizeHex(request.token_id) : undefined,\n chain_id: request.chain_id,\n moonpay_transaction_id: request.moonpay_transaction_id,\n base_currency_code: request.base_currency_code,\n base_currency_amount: request.base_currency_amount,\n quote_currency_amount: request.quote_currency_amount,\n on_chain_tx_hash: request.on_chain_tx_hash\n ? normalizeHex(request.on_chain_tx_hash)\n : undefined,\n deposit_tx_hash: request.deposit_tx_hash\n ? normalizeHex(request.deposit_tx_hash)\n : undefined,\n }\n )\n }\n\n async getPendingOnRamps(): Promise<PendingOnRampsResponse> {\n return this.http.get<PendingOnRampsResponse>('/v1/accounting/onramp/pending')\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","'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\ntype AccountStatus = 'connecting' | 'reconnecting' | 'connected' | 'disconnected'\n\ninterface SafeAccountResult {\n address: Address | undefined\n isConnected: boolean\n status: AccountStatus\n}\n\nconst defaultResult: SafeAccountResult = {\n address: undefined,\n isConnected: false,\n status: 'disconnected',\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 cacheRef.current.status !== account.status\n ) {\n cacheRef.current = {\n address: account.address,\n isConnected: account.isConnected,\n status: account.status,\n }\n }\n return cacheRef.current\n }, [context])\n\n const getServerSnapshot = useCallback(() => defaultResult, [])\n\n return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot)\n}\n","const AUTH_CLOCK_SKEW_MS = 30_000\n\ninterface PrivateReadTokenEntry {\n token: string\n expiresAt: number\n}\n\nconst cache = new Map<string, PrivateReadTokenEntry>()\n\nexport function createScopeKey(apiUrl: string, chainId: number, address: string): string {\n return `${apiUrl.replace(/\\/$/, '')}:${chainId}:${address.toLowerCase()}`\n}\n\nexport function getCachedPrivateReadToken(scopeKey: string): string | null {\n const cached = cache.get(scopeKey)\n if (!cached) return null\n if (cached.expiresAt <= Date.now() + AUTH_CLOCK_SKEW_MS) {\n cache.delete(scopeKey)\n return null\n }\n return cached.token\n}\n\nexport function setCachedPrivateReadToken(\n scopeKey: string,\n token: string,\n expiresAt: number\n): void {\n cache.set(scopeKey, { token, expiresAt })\n}\n\nexport function deleteCachedPrivateReadToken(scopeKey: string): void {\n cache.delete(scopeKey)\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 { createSiweMessage } from 'viem/siwe'\nimport { WagmiContext } from 'wagmi'\nimport { getWalletClient } from 'wagmi/actions'\nimport type { PrivanaClient } from '../client'\nimport type { Address, NetworkConfig, SiweLoginResponse } from '../types'\nimport { buildSiweStatement } from '../auth'\nimport { useSafeAccount } from '../hooks/use-safe-account'\nimport { createScopeKey, setCachedPrivateReadToken } from '../hooks/private-read-token-store'\n\nconst DEFAULT_SIWE_VALIDITY_MS = 24 * 60 * 60 * 1000\nconst AUTH_REFRESH_SKEW_MS = 30_000\n\nexport type SiweAuthSession = { address: Address }\n\n// Raw tokens exposed so apps with own backend can forward them\nexport type SiweAuthTokens = Pick<\n SiweLoginResponse,\n 'siwe_token' | 'jwt_access_token' | 'jwt_refresh_token' | 'address'\n>\n\nexport interface SiweAuthContextValue {\n isAuthenticated: boolean\n isLoading: boolean\n error: Error | null\n session: SiweAuthSession | null\n accessToken: string | undefined\n tokens: SiweAuthTokens | null\n login: () => Promise<void>\n logout: () => Promise<void>\n}\n\nconst SiweAuthContext = createContext<SiweAuthContextValue | null>(null)\n\nexport type SiweAuthConfig = boolean | { autoLogin?: boolean }\n\nexport interface SiweAuthProviderProps {\n children: ReactNode\n client: PrivanaClient\n networkConfig: NetworkConfig\n autoLogin?: boolean\n}\n\nexport function SiweAuthProvider({\n children,\n client,\n networkConfig,\n autoLogin = true,\n}: SiweAuthProviderProps) {\n const wagmiContext = useContext(WagmiContext)\n const { address, isConnected, status } = useSafeAccount()\n\n const [session, setSession] = useState<SiweAuthSession | null>(null)\n const [tokens, setTokens] = useState<SiweAuthTokens | null>(null)\n const [isLoading, setIsLoading] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [accessTokenExpiresAt, setAccessTokenExpiresAt] = useState<number | null>(null)\n const loginInFlight = useRef(false)\n const autoAttemptedAddress = useRef<string | null>(null)\n const refreshInFlight = useRef(false)\n const refreshDataRef = useRef<{ refreshToken: string; refreshExpiresAt: number } | null>(null)\n\n const clearSession = useCallback(() => {\n refreshDataRef.current = null\n setAccessTokenExpiresAt(null)\n client.clearPrivateReadToken()\n client.clearBearerToken()\n setSession(null)\n setTokens(null)\n setError(null)\n autoAttemptedAddress.current = null\n }, [client])\n\n const logout = useCallback(async () => {\n setError(null)\n const refreshToken = refreshDataRef.current?.refreshToken\n try {\n if (refreshToken) {\n await client.logoutJwtSession({ refresh_token: refreshToken })\n }\n } finally {\n clearSession()\n autoAttemptedAddress.current = address ?? null\n }\n }, [clearSession, client, address])\n\n const login = useCallback(async () => {\n if (!wagmiContext) throw new Error('WagmiProvider is required for SIWE auth')\n if (!address) throw new Error('No wallet connected')\n if (loginInFlight.current) return\n loginInFlight.current = true\n setIsLoading(true)\n setError(null)\n try {\n const walletClient = await getWalletClient(wagmiContext)\n if (!walletClient) throw new Error('No wallet client available')\n\n const [{ domain }, nonceRes] = await Promise.all([\n client.getSiweDomain(),\n client.getSiweNonce(address),\n ])\n const issuedAt = new Date()\n const expirationTime = new Date(issuedAt.getTime() + DEFAULT_SIWE_VALIDITY_MS)\n const uri =\n typeof window !== 'undefined' && window.location.origin\n ? window.location.origin\n : networkConfig.apiUrl\n const message = createSiweMessage({\n address,\n chainId: networkConfig.chainId,\n domain,\n uri,\n version: '1',\n nonce: nonceRes.nonce,\n statement: buildSiweStatement(networkConfig.chainId),\n issuedAt,\n expirationTime,\n })\n const signature = await walletClient.signMessage({\n account: walletClient.account ?? address,\n message,\n })\n const res = await client.loginWithSiwe({ siwe_message: message, signature })\n const loggedInAt = Date.now()\n client.setPrivateReadToken(res.siwe_token)\n client.setBearerToken(res.jwt_access_token)\n refreshDataRef.current = {\n refreshToken: res.jwt_refresh_token,\n refreshExpiresAt: loggedInAt + res.jwt_refresh_expires_in * 1000,\n }\n // Seed the shared private-read cache so reads reuse this token instead of triggering a second SIWE signature\n setCachedPrivateReadToken(\n createScopeKey(networkConfig.apiUrl, networkConfig.chainId, address),\n res.siwe_token,\n expirationTime.getTime()\n )\n setSession({ address: res.address })\n setTokens({\n siwe_token: res.siwe_token,\n jwt_access_token: res.jwt_access_token,\n jwt_refresh_token: res.jwt_refresh_token,\n address: res.address,\n })\n setAccessTokenExpiresAt(loggedInAt + res.jwt_expires_in * 1000)\n } catch (err) {\n setError(err instanceof Error ? err : new Error('Sign-in failed'))\n throw err\n } finally {\n setIsLoading(false)\n loginInFlight.current = false\n }\n }, [wagmiContext, address, client, networkConfig.chainId, networkConfig.apiUrl])\n\n const refreshAccessToken = useCallback(async () => {\n const data = refreshDataRef.current\n if (!data || refreshInFlight.current) return\n if (Date.now() >= data.refreshExpiresAt - AUTH_REFRESH_SKEW_MS) {\n clearSession()\n return\n }\n refreshInFlight.current = true\n try {\n const res = await client.refreshJwtSession({ refresh_token: data.refreshToken })\n const refreshedAt = Date.now()\n client.setBearerToken(res.token)\n refreshDataRef.current = {\n refreshToken: res.refresh_token,\n refreshExpiresAt: refreshedAt + res.refresh_expires_in * 1000,\n }\n setTokens((prev) =>\n prev ? { ...prev, jwt_access_token: res.token, jwt_refresh_token: res.refresh_token } : prev\n )\n setAccessTokenExpiresAt(refreshedAt + res.expires_in * 1000)\n } catch {\n clearSession()\n } finally {\n refreshInFlight.current = false\n }\n }, [client, clearSession])\n\n // Schedule the next refresh whenever the access-token expiry changes.\n useEffect(() => {\n if (accessTokenExpiresAt == null) return\n const delay = Math.max(accessTokenExpiresAt - AUTH_REFRESH_SKEW_MS - Date.now(), 0)\n const timer = setTimeout(() => {\n void refreshAccessToken()\n }, delay)\n return () => clearTimeout(timer)\n }, [accessTokenExpiresAt, refreshAccessToken])\n\n useEffect(() => {\n if (!autoLogin) return\n // Avoids transient logout/re-auth\n if (status === 'connecting' || status === 'reconnecting') return\n\n if (!isConnected && session) {\n clearSession()\n return\n }\n if (\n isConnected &&\n address &&\n session &&\n address.toLowerCase() !== session.address.toLowerCase()\n ) {\n clearSession()\n return\n }\n if (\n isConnected &&\n address &&\n !session &&\n !isLoading &&\n autoAttemptedAddress.current !== address\n ) {\n autoAttemptedAddress.current = address\n void login().catch(() => {})\n }\n }, [autoLogin, status, isConnected, address, session, isLoading, login, clearSession])\n\n const value = useMemo<SiweAuthContextValue>(\n () => ({\n isAuthenticated: !!session,\n isLoading,\n error,\n session,\n accessToken: tokens?.jwt_access_token,\n tokens,\n login,\n logout,\n }),\n [session, isLoading, error, tokens, login, logout]\n )\n\n return <SiweAuthContext.Provider value={value}>{children}</SiweAuthContext.Provider>\n}\n\nexport function useSiweAuth(): SiweAuthContextValue {\n const ctx = useContext(SiweAuthContext)\n if (!ctx) throw new Error('useSiweAuth must be used within SiweAuthProvider')\n return ctx\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'\nimport { SiweAuthProvider, type SiweAuthConfig } from './siwe-auth-provider'\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 * Optional direct (in-app) SIWE auth. When provided, the connected wallet\n * signs an EIP-4361 message in-app and `useSiweAuth()` becomes available.\n * Mutually exclusive with `hostedAuth`: providing both throws, because\n * `usePrivateReadRequest()` prefers `hostedAuthConfig` and would otherwise\n * ignore the SIWE login.\n */\n siweAuth?: SiweAuthConfig\n}\n\nexport function PrivanaProvider({\n children,\n networkConfig: networkConfigOverride,\n tokens,\n chains,\n pollingInterval = 10000,\n serviceAddress,\n hostedAuth,\n siweAuth,\n}: PrivanaProviderProps) {\n if (hostedAuth && siweAuth) {\n throw new Error(\n 'PrivanaProvider: `hostedAuth` and `siweAuth` are mutually exclusive - provide only one. ' +\n 'When both are set, private reads use hosted auth and the in-app SIWE login is ignored.'\n )\n }\n\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 (\n <PrivanaContext.Provider value={value}>\n {siweAuth ? (\n <SiweAuthProvider\n client={client}\n networkConfig={networkConfig}\n autoLogin={typeof siweAuth === 'object' ? siweAuth.autoLogin : undefined}\n >\n {children}\n </SiweAuthProvider>\n ) : (\n children\n )}\n </PrivanaContext.Provider>\n )\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 { useCallback, useContext, useMemo } from 'react'\nimport { createSiweMessage } from 'viem/siwe'\nimport { WagmiContext } from 'wagmi'\nimport { getWalletClient } from 'wagmi/actions'\nimport { buildSiweStatement, 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'\nimport {\n createScopeKey,\n deleteCachedPrivateReadToken,\n getCachedPrivateReadToken,\n setCachedPrivateReadToken,\n} from './private-read-token-store'\n\nconst INITIAL_AUTH_BACKOFF_MS = 5_000\nconst MAX_AUTH_BACKOFF_MS = 60_000\nconst DEFAULT_SIWE_AUTH_VALIDITY_MS = 24 * 60 * 60 * 1000\n\ninterface PrivateReadFailureEntry {\n backoffMs: number\n retryAt: number\n}\n\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 clearPrivateReadScope(scopeKey: string, client: PrivanaClient): void {\n deleteCachedPrivateReadToken(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: networkConfig.chainId,\n domain,\n expirationTime,\n issuedAt,\n nonce: nonceResponse.nonce,\n statement: buildSiweStatement(networkConfig.chainId),\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 setCachedPrivateReadToken(scopeKey, login.siwe_token, expirationTime.getTime())\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 { useCallback, useEffect, useRef, useState } from 'react'\nimport { useQueryClient } from '@tanstack/react-query'\nimport { AccountingApiError } from '../client/errors'\nimport { usePrivanaContext } from '../context/privana-provider'\nimport { usePrivateReadRequest } from './use-private-read-request'\nimport type { DepositCheckResponse } from '../types'\n\nexport interface VerificationContext {\n /** On-chain transfer that funded the user's Privana deposit address. */\n hash: `0x${string}`\n /** Chain the transfer was mined on. */\n chainId: number\n /** Transferred amount in base units (matches the deposit's token decimals). */\n amount: bigint\n}\n\nexport interface UseDepositVerificationOptions {\n /** Fired when the deposit is credited inside the Privana accounting module. */\n onCredited?: (txHash: string, response: DepositCheckResponse) => void\n /** Fired when polling exceeds `pollTimeout` (the deposit may still be processing). */\n onCheckTimeout?: (txHash: string) => void\n onError?: (error: Error) => void\n /**\n * Fired each time `checkDeposit` returns \"Insufficient finality\" and the hook\n * is about to sleep + retry. Non-terminal — does not stop the retry loop.\n * Use this to surface confirmation-progress messages (e.g. \"4/32 confirmations\")\n * to the user while phase 1 is still waiting on chain finality.\n */\n onCheckRetry?: (message: string) => void\n /** Polling interval in ms (default: 5000). */\n pollInterval?: number\n /** Retry interval in ms while the source-chain tx is waiting finality (default: pollInterval). */\n finalityRetryInterval?: number\n /** Max time to wait for credit confirmation in ms (default: 180000). */\n pollTimeout?: number\n}\n\nexport interface UseDepositVerificationResult {\n /** True while phase 1 (checkDeposit) or phase 2 (status polling) is in flight. */\n isVerifying: boolean\n /** True if polling timed out before a terminal status. */\n didTimeout: boolean\n /**\n * True when the on-chain transfer exists but the API verification step failed.\n * Funds are still at the deposit address; call `retryVerification()` to re-run\n * without re-sending the transfer.\n */\n verificationFailed: boolean\n error: Error | null\n /** Current transfer hash being verified, if any. */\n txHash: `0x${string}` | undefined\n /** Kick off Phase 1 (checkDeposit) + Phase 2 (poll getDepositStatus) for the given context. */\n verify: (ctx: VerificationContext) => Promise<void>\n /** Re-run verification against the existing context (after a transient API failure). */\n retryVerification: () => Promise<void>\n /** Discard local tracking (the deposit may still be credited in the background). */\n reset: () => void\n}\n\n/**\n * Phase 1 (POST /deposits/check) + Phase 2 (poll /deposits/status) of the\n * Privana deposit flow, decoupled from the wallet-signing half. Use this\n * directly when the on-chain transfer to the deposit address came from\n * somewhere other than the connected wallet — e.g. a fiat on-ramp that\n * delivers straight to the deposit address.\n *\n * For the full deposit flow (get address → wallet transfer → verify) use\n * `useDeposit`, which composes this hook internally.\n */\nexport function useDepositVerification(\n options: UseDepositVerificationOptions = {}\n): UseDepositVerificationResult {\n const { client } = usePrivanaContext()\n const queryClient = useQueryClient()\n const { executePrivateRead } = usePrivateReadRequest()\n\n const pollInterval = options.pollInterval ?? 5000\n const finalityRetryInterval = options.finalityRetryInterval ?? pollInterval\n const pollTimeout = options.pollTimeout ?? 180000\n\n const [isVerifying, setIsVerifying] = useState(false)\n const [didTimeout, setDidTimeout] = useState(false)\n const [verificationFailed, setVerificationFailed] = useState(false)\n const [error, setError] = useState<Error | null>(null)\n const [txHash, setTxHash] = useState<`0x${string}` | undefined>()\n\n const generationRef = useRef(0)\n const pollIntervalRef = useRef<NodeJS.Timeout | null>(null)\n const verificationContextRef = useRef<VerificationContext | null>(null)\n\n // Stable refs so callers can pass inline callbacks without re-triggering\n // the verify callback's useCallback identity.\n const onCreditedRef = useRef(options.onCredited)\n const onCheckTimeoutRef = useRef(options.onCheckTimeout)\n const onErrorRef = useRef(options.onError)\n const onCheckRetryRef = useRef(options.onCheckRetry)\n useEffect(() => {\n onCreditedRef.current = options.onCredited\n onCheckTimeoutRef.current = options.onCheckTimeout\n onErrorRef.current = options.onError\n onCheckRetryRef.current = options.onCheckRetry\n }, [options.onCredited, options.onCheckTimeout, options.onError, options.onCheckRetry])\n\n const stopPolling = useCallback(() => {\n if (pollIntervalRef.current) {\n clearTimeout(pollIntervalRef.current)\n pollIntervalRef.current = null\n }\n }, [])\n\n const invalidateGeneration = useCallback(() => {\n generationRef.current++\n }, [])\n\n useEffect(() => {\n return () => {\n invalidateGeneration()\n stopPolling()\n }\n }, [invalidateGeneration, stopPolling])\n\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 setError(null)\n setDidTimeout(false)\n setIsVerifying(true)\n\n const pollStartTime = Date.now()\n\n const markVerificationFailed = (err: Error) => {\n setIsVerifying(false)\n setError(err)\n setVerificationFailed(true)\n onErrorRef.current?.(err)\n }\n\n const markVerificationTimedOut = () => {\n stopPolling()\n setIsVerifying(false)\n setDidTimeout(true)\n onCheckTimeoutRef.current?.(hash)\n queryClient.invalidateQueries({ queryKey: ['accounting-balance'] })\n }\n\n try {\n // Phase 1: trigger sweep. The backend rejects with \"Insufficient finality\"\n // when the source-chain tx isn't deep enough yet; retry on a slower\n // cadence instead of failing, until pollTimeout.\n let triggerResult: DepositCheckResponse | undefined\n while (!triggerResult) {\n if (isStale()) return\n try {\n const result = await executePrivateRead(() =>\n client.checkDeposit({\n chain_id: chainId,\n tx_hash: hash,\n amount: amount.toString(),\n })\n )\n if (result.status === 'error' && isInsufficientFinalityMessage(result.detail)) {\n if (result.detail) onCheckRetryRef.current?.(result.detail)\n if (Date.now() - pollStartTime > pollTimeout) {\n markVerificationTimedOut()\n return\n }\n await sleep(finalityRetryInterval)\n if (isStale()) return\n continue\n }\n triggerResult = result\n } catch (err) {\n if (isStale()) return\n if (!isInsufficientFinalityError(err)) {\n throw err\n }\n const message =\n err instanceof AccountingApiError && err.detail\n ? err.detail\n : err instanceof Error\n ? err.message\n : String(err)\n onCheckRetryRef.current?.(message)\n if (Date.now() - pollStartTime > pollTimeout) {\n markVerificationTimedOut()\n return\n }\n await sleep(finalityRetryInterval)\n if (isStale()) return\n }\n }\n if (isStale()) return\n\n if (triggerResult.status === 'credited') {\n setIsVerifying(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 markVerificationTimedOut()\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 setIsVerifying(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 [\n client,\n executePrivateRead,\n finalityRetryInterval,\n pollInterval,\n pollTimeout,\n queryClient,\n stopPolling,\n ]\n )\n\n const verify = useCallback(\n async (ctx: VerificationContext): Promise<void> => {\n generationRef.current++\n stopPolling()\n verificationContextRef.current = ctx\n setTxHash(ctx.hash)\n const generation = generationRef.current\n await runVerification(ctx, generation)\n },\n [runVerification, stopPolling]\n )\n\n const retryVerification = useCallback(async (): Promise<void> => {\n const ctx = verificationContextRef.current\n if (!ctx) {\n throw new Error('No pending verification to retry')\n }\n generationRef.current++\n stopPolling()\n const generation = generationRef.current\n await runVerification(ctx, generation)\n }, [runVerification, stopPolling])\n\n const reset = useCallback(() => {\n generationRef.current++\n stopPolling()\n verificationContextRef.current = null\n setTxHash(undefined)\n setIsVerifying(false)\n setDidTimeout(false)\n setVerificationFailed(false)\n setError(null)\n }, [stopPolling])\n\n return {\n isVerifying,\n didTimeout,\n verificationFailed,\n error,\n txHash,\n verify,\n retryVerification,\n reset,\n }\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction isInsufficientFinalityError(error: unknown): boolean {\n if (error instanceof AccountingApiError) {\n return (\n isInsufficientFinalityMessage(error.detail) || isInsufficientFinalityMessage(error.message)\n )\n }\n return error instanceof Error && isInsufficientFinalityMessage(error.message)\n}\n\nfunction isInsufficientFinalityMessage(message: string | undefined): boolean {\n return message?.includes('Insufficient finality') ?? false\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","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","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","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 { Chain } from 'viem'\nimport {\n type GetTransactionReceiptErrorType as viem_GetTransactionReceiptErrorType,\n type GetTransactionReceiptParameters as viem_GetTransactionReceiptParameters,\n type GetTransactionReceiptReturnType as viem_GetTransactionReceiptReturnType,\n getTransactionReceipt as viem_getTransactionReceipt,\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 GetTransactionReceiptParameters<\n config extends Config = Config,\n chainId extends\n config['chains'][number]['id'] = config['chains'][number]['id'],\n> = Compute<\n viem_GetTransactionReceiptParameters & ChainIdParameter<config, chainId>\n>\n\nexport type GetTransactionReceiptReturnType<\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_GetTransactionReceiptReturnType<\n IsNarrowable<chains[key], Chain> extends true ? chains[key] : undefined\n > & { chainId: chains[key]['id'] }\n }[number]\n>\n\nexport type GetTransactionReceiptErrorType = viem_GetTransactionReceiptErrorType\n\n/** https://wagmi.sh/core/api/actions/getTransactionReceipt */\nexport async function getTransactionReceipt<\n config extends Config,\n chainId extends config['chains'][number]['id'],\n>(\n config: config,\n parameters: GetTransactionReceiptParameters<config>,\n): Promise<GetTransactionReceiptReturnType<config, chainId>> {\n const { chainId, ...rest } = parameters\n const client = config.getClient({ chainId })\n const action = getAction(\n client,\n viem_getTransactionReceipt,\n 'getTransactionReceipt',\n )\n return action(rest) as unknown as Promise<\n GetTransactionReceiptReturnType<config, chainId>\n >\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","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"]}
|
|
@@ -209,6 +209,11 @@ function isHostedAuthRefreshActive(session, now = Date.now(), skewMs = HOSTED_AU
|
|
|
209
209
|
return session.refreshExpiresAt > now + skewMs;
|
|
210
210
|
}
|
|
211
211
|
|
|
212
|
+
// src/sdk/auth/siwe.ts
|
|
213
|
+
function buildSiweStatement(chainId) {
|
|
214
|
+
return `Sign in to Privana on chain ${chainId}`;
|
|
215
|
+
}
|
|
216
|
+
|
|
212
217
|
// src/sdk/client/errors.ts
|
|
213
218
|
var AccountingApiError = class _AccountingApiError extends Error {
|
|
214
219
|
constructor(message, statusCode, detail) {
|
|
@@ -663,15 +668,13 @@ function deleteCachedPrivateReadToken(scopeKey) {
|
|
|
663
668
|
cache.delete(scopeKey);
|
|
664
669
|
}
|
|
665
670
|
var DEFAULT_SIWE_VALIDITY_MS = 24 * 60 * 60 * 1e3;
|
|
666
|
-
var DEFAULT_STATEMENT = "Sign in to access your private account data.";
|
|
667
671
|
var AUTH_REFRESH_SKEW_MS = 3e4;
|
|
668
672
|
var SiweAuthContext = createContext(null);
|
|
669
673
|
function SiweAuthProvider({
|
|
670
674
|
children,
|
|
671
675
|
client,
|
|
672
676
|
networkConfig,
|
|
673
|
-
autoLogin = true
|
|
674
|
-
statement
|
|
677
|
+
autoLogin = true
|
|
675
678
|
}) {
|
|
676
679
|
const wagmiContext = useContext(WagmiContext);
|
|
677
680
|
const { address, isConnected, status } = useSafeAccount();
|
|
@@ -730,7 +733,7 @@ function SiweAuthProvider({
|
|
|
730
733
|
uri,
|
|
731
734
|
version: "1",
|
|
732
735
|
nonce: nonceRes.nonce,
|
|
733
|
-
statement:
|
|
736
|
+
statement: buildSiweStatement(networkConfig.chainId),
|
|
734
737
|
issuedAt,
|
|
735
738
|
expirationTime
|
|
736
739
|
});
|
|
@@ -766,7 +769,7 @@ function SiweAuthProvider({
|
|
|
766
769
|
setIsLoading(false);
|
|
767
770
|
loginInFlight.current = false;
|
|
768
771
|
}
|
|
769
|
-
}, [wagmiContext, address, client, networkConfig.chainId, networkConfig.apiUrl
|
|
772
|
+
}, [wagmiContext, address, client, networkConfig.chainId, networkConfig.apiUrl]);
|
|
770
773
|
const refreshAccessToken = useCallback(async () => {
|
|
771
774
|
const data = refreshDataRef.current;
|
|
772
775
|
if (!data || refreshInFlight.current) return;
|
|
@@ -1125,8 +1128,7 @@ function PrivanaProvider({
|
|
|
1125
1128
|
{
|
|
1126
1129
|
client,
|
|
1127
1130
|
networkConfig,
|
|
1128
|
-
autoLogin: siweAuth.autoLogin,
|
|
1129
|
-
statement: siweAuth.statement,
|
|
1131
|
+
autoLogin: typeof siweAuth === "object" ? siweAuth.autoLogin : void 0,
|
|
1130
1132
|
children
|
|
1131
1133
|
}
|
|
1132
1134
|
) : children });
|
|
@@ -1144,7 +1146,6 @@ function useSafePrivanaContext() {
|
|
|
1144
1146
|
var INITIAL_AUTH_BACKOFF_MS = 5e3;
|
|
1145
1147
|
var MAX_AUTH_BACKOFF_MS = 6e4;
|
|
1146
1148
|
var DEFAULT_SIWE_AUTH_VALIDITY_MS = 24 * 60 * 60 * 1e3;
|
|
1147
|
-
var PRIVATE_READ_STATEMENT = "Sign in to Privana to access private account data.";
|
|
1148
1149
|
var privateReadFailureCache = /* @__PURE__ */ new Map();
|
|
1149
1150
|
var privateReadInflight = /* @__PURE__ */ new Map();
|
|
1150
1151
|
async function executeHostedAuthPrivateReadRequest({
|
|
@@ -1261,12 +1262,12 @@ function usePrivateReadRequest() {
|
|
|
1261
1262
|
const uri = typeof window !== "undefined" && window.location.origin ? window.location.origin : apiUrl;
|
|
1262
1263
|
const message = createSiweMessage({
|
|
1263
1264
|
address: walletAddress,
|
|
1264
|
-
chainId:
|
|
1265
|
+
chainId: networkConfig.chainId,
|
|
1265
1266
|
domain,
|
|
1266
1267
|
expirationTime,
|
|
1267
1268
|
issuedAt,
|
|
1268
1269
|
nonce: nonceResponse.nonce,
|
|
1269
|
-
statement:
|
|
1270
|
+
statement: buildSiweStatement(networkConfig.chainId),
|
|
1270
1271
|
uri,
|
|
1271
1272
|
version: "1"
|
|
1272
1273
|
});
|
|
@@ -1714,6 +1715,6 @@ function getChainId2(config) {
|
|
|
1714
1715
|
return config.state.chainId;
|
|
1715
1716
|
}
|
|
1716
1717
|
|
|
1717
|
-
export { AccountingApiError, Button, HOSTED_AUTH_CLOCK_SKEW_MS, HostedAuthError, HostedAuthRequiredError, HostedAuthStateMismatchError, HttpClient, NETWORK_CONFIG, NetworkError, PrivanaClient, PrivanaProvider, SUPPORTED_CHAINS, SiweAuthProvider, Skeleton, ValidationError, applyRefreshResponse, buildHostedAuthSession, buttonVariants, clearHostedAuthPendingTransaction, cn, createHostedAuthPendingStorageKey, createHostedAuthState, createHostedAuthStorageKey, createPkceChallenge, createPkceVerifier, formatTimeRemaining, formatTokenAmount, getAccountingContract, getApiUrl, getChainById, getChainId, getChainId2, getExplorerAddressUrl, getTransactionReceipt, isHostedAuthRefreshActive, isHostedAuthSessionActive, normalizeAddress, normalizeHex, parseHostedAuthCallback, parseTokenAmount, persistHostedAuthPendingTransaction, readHostedAuthPendingTransaction, readStoredHostedAuthSession, shortenAddress, stripHostedAuthCallbackParams, syncHostedAuthSessionToClient, useDepositVerification, usePrivanaContext, usePrivateReadRequest, useSafeAccount, useSafePrivanaContext, useSiweAuth, waitForTransactionReceipt };
|
|
1718
|
-
//# sourceMappingURL=chunk-
|
|
1719
|
-
//# sourceMappingURL=chunk-
|
|
1718
|
+
export { AccountingApiError, Button, HOSTED_AUTH_CLOCK_SKEW_MS, HostedAuthError, HostedAuthRequiredError, HostedAuthStateMismatchError, HttpClient, NETWORK_CONFIG, NetworkError, PrivanaClient, PrivanaProvider, SUPPORTED_CHAINS, SiweAuthProvider, Skeleton, ValidationError, applyRefreshResponse, buildHostedAuthSession, buildSiweStatement, buttonVariants, clearHostedAuthPendingTransaction, cn, createHostedAuthPendingStorageKey, createHostedAuthState, createHostedAuthStorageKey, createPkceChallenge, createPkceVerifier, formatTimeRemaining, formatTokenAmount, getAccountingContract, getApiUrl, getChainById, getChainId, getChainId2, getExplorerAddressUrl, getTransactionReceipt, isHostedAuthRefreshActive, isHostedAuthSessionActive, normalizeAddress, normalizeHex, parseHostedAuthCallback, parseTokenAmount, persistHostedAuthPendingTransaction, readHostedAuthPendingTransaction, readStoredHostedAuthSession, shortenAddress, stripHostedAuthCallbackParams, syncHostedAuthSessionToClient, useDepositVerification, usePrivanaContext, usePrivateReadRequest, useSafeAccount, useSafePrivanaContext, useSiweAuth, waitForTransactionReceipt };
|
|
1719
|
+
//# sourceMappingURL=chunk-WV6CGHEF.js.map
|
|
1720
|
+
//# sourceMappingURL=chunk-WV6CGHEF.js.map
|