@thru/wallet 0.2.25 → 0.2.28
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/README.md +1 -0
- package/dist/{BrowserSDK-CpRFiJsW.d.ts → BrowserSDK-CRQTOT8S.d.ts} +178 -3
- package/dist/index.d.ts +2 -2
- package/dist/index.js +376 -12
- package/dist/index.js.map +1 -1
- package/dist/native/react/transparent.d.ts +104 -0
- package/dist/native/react/transparent.js +2210 -0
- package/dist/native/react/transparent.js.map +1 -0
- package/dist/native/react.d.ts +5 -90
- package/dist/native/react.js +765 -32
- package/dist/native/react.js.map +1 -1
- package/dist/native.d.ts +105 -1
- package/dist/native.js +521 -31
- package/dist/native.js.map +1 -1
- package/dist/react-ui.js +5 -0
- package/dist/react-ui.js.map +1 -1
- package/dist/react.d.ts +2 -2
- package/dist/react.js +376 -12
- package/dist/react.js.map +1 -1
- package/package.json +8 -2
- package/src/BrowserSDK.ts +32 -1
- package/src/encoding.ts +39 -0
- package/src/index.ts +5 -1
- package/src/interfaces/IThruChain.ts +50 -1
- package/src/interfaces/types.ts +52 -0
- package/src/native/NativeSDK.test.ts +200 -1
- package/src/native/NativeSDK.ts +124 -10
- package/src/native/index.ts +12 -0
- package/src/native/provider/NativeProvider.ts +106 -5
- package/src/native/provider/WebViewBridge.test.ts +22 -1
- package/src/native/provider/WebViewBridge.ts +17 -7
- package/src/native/provider/chains/ThruChain.ts +215 -5
- package/src/native/react/ThruContext.ts +3 -1
- package/src/native/react/ThruProvider.tsx +25 -0
- package/src/native/react/ThruTransparentWalletBridge.tsx +281 -0
- package/src/native/react/hooks/useWallet.ts +12 -1
- package/src/native/react/index.ts +11 -0
- package/src/native/react/transparent.ts +35 -0
- package/src/protocol/postMessage.ts +127 -2
- package/src/provider/EmbeddedProvider.ts +7 -1
- package/src/provider/IframeManager.test.ts +18 -0
- package/src/provider/IframeManager.ts +8 -1
- package/src/provider/chains/ThruChain.ts +210 -4
- package/src/provider/types/messages.ts +16 -0
- package/src/react/index.ts +6 -0
- package/src/signing-sessions.test.ts +182 -0
- package/src/signing-sessions.ts +204 -0
package/dist/native/react.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/interfaces/accounts.ts","../../src/interfaces/types.ts","../../src/protocol/postMessage.ts","../../src/protocol/walletState.ts","../../src/native/provider/chains/ThruChain.ts","../../src/native/provider/WebViewBridge.ts","../../src/native/provider/NativeProvider.ts","../../src/native/NativeSDK.ts","../../src/native/react/ThruContext.ts","../../src/native/react/ThruProvider.tsx","../../src/native/provider/shell.ts","../../src/native/react/hooks/useThru.ts","../../src/native/react/android-webauthn.ts","../../src/native/react/ThruWalletSheet.tsx","../../src/native/react/hooks/waitForWallet.ts","../../src/native/react/hooks/useWallet.ts","../../src/native/react/hooks/useWalletAvailability.ts","../../src/native/react/hooks/useAccounts.ts"],"names":["CHECKING_WALLET_AVAILABILITY","Platform","ThruWalletSheet","useState","useCallback","useEffect","ref","jsx","useRef"],"mappings":"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","file":"react.js","sourcesContent":["import type { WalletAccount } from \"./types\";\n\nexport interface ActiveWalletAccounts {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\nexport type WalletAccountResult<T> = Omit<T, \"accounts\" | \"selectedAccount\"> & {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n};\n\nexport function resolveSelectedWalletAccount(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): WalletAccount | null {\n if (selectedAccount) {\n return (\n accounts.find((account) => account.address === selectedAccount.address) ??\n selectedAccount\n );\n }\n\n return accounts[0] ?? null;\n}\n\nexport function resolveWalletAccountByAddress(\n accounts: WalletAccount[],\n address?: string | null,\n): WalletAccount | null {\n if (!address) return null;\n return accounts.find((account) => account.address === address) ?? null;\n}\n\nexport function normalizeActiveWalletAccounts(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): ActiveWalletAccounts {\n const activeAccount = resolveSelectedWalletAccount(accounts, selectedAccount);\n return {\n accounts: activeAccount ? [activeAccount] : [],\n selectedAccount: activeAccount,\n };\n}\n\nexport function normalizeWalletAccountResult<\n T extends { accounts: WalletAccount[]; selectedAccount?: WalletAccount | null },\n>(\n result: T,\n selectedAccount?: WalletAccount | null,\n): WalletAccountResult<T> {\n const active = normalizeActiveWalletAccounts(\n result.accounts,\n selectedAccount ?? result.selectedAccount ?? null,\n );\n return {\n ...result,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n };\n}\n","export const AddressType = {\n THRU: \"thru\",\n} as const;\n\nexport type AddressType = (typeof AddressType)[keyof typeof AddressType];\n\nexport interface WalletAccount {\n accountType: AddressType;\n address: string;\n label: string;\n}\n\nexport interface AppMetadata {\n appId: string;\n appName: string;\n appUrl: string;\n imageUrl?: string;\n}\n\nexport interface ConnectResult {\n walletId?: string;\n accounts: WalletAccount[];\n selectedAccount?: WalletAccount | null;\n status?: \"pending\" | \"completed\";\n metadata?: AppMetadata;\n}\n\nexport const ThruTransactionEncoding = {\n SIGNING_PAYLOAD_BASE64: \"signing_payload_base64\",\n RAW_TRANSACTION_BASE64: \"raw_transaction_base64\",\n} as const;\n\nexport type ThruTransactionEncoding =\n (typeof ThruTransactionEncoding)[keyof typeof ThruTransactionEncoding];\n\nexport interface ThruSigningContext {\n mode: \"managed_fee_payer\";\n selectedAccountPublicKey: string | null;\n feePayerPublicKey: string;\n signerPublicKey: string;\n acceptedInputEncodings: ThruTransactionEncoding[];\n outputEncoding: typeof ThruTransactionEncoding.RAW_TRANSACTION_BASE64;\n}\n\nexport interface ThruTransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface ThruTransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface ThruTransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: ThruTransactionReviewSimulation;\n abiReflection?: ThruTransactionReviewAbiReflection;\n}\n\nexport interface ThruTransactionIntent {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: ThruTransactionReviewPayload;\n}\n\nexport interface ConnectedApp {\n accountId: number;\n appId: string;\n origin: string;\n metadata: AppMetadata;\n connectedAt: number;\n updatedAt: number;\n}\n\nexport interface SignMessageParams {\n message: string | Uint8Array;\n networkId: string;\n}\n\nexport interface SignMessageResult {\n signature: Uint8Array;\n publicKey: string;\n}\n","import type {\n AppMetadata,\n ConnectResult,\n ThruSigningContext,\n WalletAccount,\n} from \"../interfaces\";\n\nexport const POST_MESSAGE_REQUEST_TYPES = {\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n SIGN_MESSAGE: \"signMessage\",\n SIGN_TRANSACTION: \"signTransaction\",\n GET_ACCOUNTS: \"getAccounts\",\n GET_CONNECTION_STATE: \"getConnectionState\",\n GET_SIGNING_CONTEXT: \"getSigningContext\",\n SELECT_ACCOUNT: \"selectAccount\",\n MANAGE_ACCOUNTS: \"manageAccounts\",\n} as const;\n\nexport type RequestType =\n (typeof POST_MESSAGE_REQUEST_TYPES)[keyof typeof POST_MESSAGE_REQUEST_TYPES];\n\nexport const EMBEDDED_PROVIDER_EVENTS = {\n CONNECT_START: \"connect_start\",\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n CONNECT_ERROR: \"connect_error\",\n ERROR: \"error\",\n LOCK: \"lock\",\n UI_SHOW: \"ui_show\",\n ACCOUNT_CHANGED: \"account_changed\",\n} as const;\n\nexport type EmbeddedProviderEvent =\n (typeof EMBEDDED_PROVIDER_EVENTS)[keyof typeof EMBEDDED_PROVIDER_EVENTS];\n\nexport const POST_MESSAGE_EVENT_TYPE = \"event\" as const;\n\nexport const IFRAME_READY_EVENT = \"iframe:ready\" as const;\n\nexport const DEFAULT_IFRAME_URL = \"http://localhost:3000/embedded\";\n\nconst REQUEST_ID_PREFIX = \"req\";\n\nexport const createRequestId = (prefix: string = REQUEST_ID_PREFIX): string => {\n const random = Math.random().toString(36).slice(2, 11);\n return `${prefix}_${Date.now()}_${random}`;\n};\n\ninterface BaseRequest {\n id: string;\n origin: string;\n}\n\nexport interface ConnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.CONNECT;\n payload: ConnectRequestPayload;\n}\n\nexport interface DisconnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.DISCONNECT;\n payload?: undefined;\n}\n\nexport interface SignMessageRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE;\n payload: SignMessagePayload;\n}\n\nexport interface SignTransactionRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION;\n payload: SignTransactionPayload;\n}\n\nexport interface GetAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS;\n payload?: undefined;\n}\n\nexport interface GetConnectionStateRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE;\n payload: ConnectRequestPayload;\n}\n\nexport interface GetSigningContextRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT;\n payload?: undefined;\n}\n\nexport interface SelectAccountRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT;\n payload: SelectAccountPayload;\n}\n\nexport interface ManageAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS;\n payload?: undefined;\n}\n\nexport type PostMessageRequest =\n | ConnectRequestMessage\n | DisconnectRequestMessage\n | SignMessageRequestMessage\n | SignTransactionRequestMessage\n | GetAccountsRequestMessage\n | GetConnectionStateRequestMessage\n | GetSigningContextRequestMessage\n | SelectAccountRequestMessage\n | ManageAccountsRequestMessage;\n\nexport interface DisconnectResult {\n // Empty object keeps compatibility with existing consumers expecting a success payload\n}\n\nexport interface GetAccountsResult {\n accounts: WalletAccount[];\n}\n\nexport interface GetConnectionStateResult {\n isAuthorized: boolean;\n isConnected: boolean;\n isUnlocked: boolean;\n hasPasskey: boolean;\n hasWalletAccount: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n metadata: AppMetadata | null;\n}\n\nexport interface SelectAccountPayload {\n publicKey: string;\n}\n\nexport interface SelectAccountResult {\n account: WalletAccount;\n}\n\nexport interface ManageAccountsResult {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\ntype RequestResultMap = {\n [POST_MESSAGE_REQUEST_TYPES.CONNECT]: ConnectResult;\n [POST_MESSAGE_REQUEST_TYPES.DISCONNECT]: DisconnectResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE]: SignMessageResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION]: SignTransactionResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS]: GetAccountsResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE]: GetConnectionStateResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT]: GetSigningContextResult;\n [POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT]: SelectAccountResult;\n [POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS]: ManageAccountsResult;\n};\n\ninterface ResponseErrorPayload {\n code: ErrorCode;\n message: string;\n data?: unknown;\n}\n\ntype SuccessResponse<TType extends RequestType> = {\n id: string;\n success: true;\n result: RequestResultMap[TType];\n};\n\ntype ErrorResponse = {\n id: string;\n success: false;\n error: ResponseErrorPayload;\n};\n\nexport type PostMessageResponse<TType extends RequestType = RequestType> =\n | SuccessResponse<TType>\n | ErrorResponse;\n\nexport type SuccessfulPostMessageResponse<\n TType extends RequestType = RequestType,\n> = Extract<PostMessageResponse<TType>, { success: true }>;\n\nexport type InferPostMessageResponse<TRequest extends PostMessageRequest> =\n PostMessageResponse<TRequest[\"type\"]>;\n\nexport type InferSuccessfulPostMessageResponse<\n TRequest extends PostMessageRequest,\n> = SuccessfulPostMessageResponse<TRequest[\"type\"]>;\n\nexport interface PostMessageEvent<\n TEvent extends EmbeddedProviderEvent = EmbeddedProviderEvent,\n TData = any,\n> {\n type: typeof POST_MESSAGE_EVENT_TYPE;\n event: TEvent;\n data?: TData;\n}\n\nexport const ErrorCode = {\n USER_REJECTED: \"USER_REJECTED\",\n WALLET_LOCKED: \"WALLET_LOCKED\",\n INVALID_PASSWORD: \"INVALID_PASSWORD\",\n ALREADY_CONNECTED: \"ALREADY_CONNECTED\",\n ACCOUNT_NOT_FOUND: \"ACCOUNT_NOT_FOUND\",\n ACCOUNT_CHANGED: \"ACCOUNT_CHANGED\",\n INVALID_TRANSACTION: \"INVALID_TRANSACTION\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INSUFFICIENT_FUNDS: \"INSUFFICIENT_FUNDS\",\n NETWORK_ERROR: \"NETWORK_ERROR\",\n TIMEOUT: \"TIMEOUT\",\n UNKNOWN_ERROR: \"UNKNOWN_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport type ConnectMetadataInput = Partial<AppMetadata>;\n\nexport type ConnectIntent = \"default\" | \"switch-account\";\n\nexport interface ConnectRequestPayload {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectIntent;\n}\n\nexport type { AppMetadata, ConnectResult };\n\nexport interface SignMessagePayload {\n message: string | number[];\n accountIndex?: number;\n}\n\nexport interface SignMessageResult {\n signature: number[];\n publicKey: string;\n}\n\n/**\n * Wallet-managed instruction signing intent.\n *\n * Dapps provide the instruction data and account context. The wallet owns\n * signing strategy details such as passkey validation, fee payer choice,\n * account ordering, headers, nonces, and final wire layout. Review metadata\n * is treated as untrusted display-only data.\n */\nexport interface SignTransactionPayload {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: TransactionReviewPayload;\n}\n\nexport interface SignTransactionResult {\n signedTransaction: string;\n}\n\nexport interface TransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface TransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface TransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: TransactionReviewSimulation;\n abiReflection?: TransactionReviewAbiReflection;\n}\n\nexport interface GetSigningContextResult {\n signingContext: ThruSigningContext;\n}\n","import { normalizeWalletAccountResult } from \"../interfaces\";\nimport type { GetConnectionStateResult } from \"./postMessage\";\n\nexport function normalizeConnectionStateResult(\n result: GetConnectionStateResult,\n): GetConnectionStateResult {\n if (!result.isAuthorized || !result.hasPasskey) {\n return { ...result, accounts: [], selectedAccount: null };\n }\n\n return normalizeWalletAccountResult(result);\n}\n","import {\n AddressType,\n type IThruChain,\n type ThruSigningContext,\n type ThruTransactionIntent,\n} from \"../../../interfaces\";\nimport { POST_MESSAGE_REQUEST_TYPES, createRequestId } from \"../../../protocol\";\nimport type { NativeProvider } from \"../NativeProvider\";\nimport type { WebViewBridge } from \"../WebViewBridge\";\n\n/**\n * NativeThruChain - mirror of EmbeddedThruChain over the WebView bridge.\n * Sign moments toggle the host bottom sheet via provider.requestShow /\n * requestHide instead of iframe.show / hide.\n */\nexport class NativeThruChain implements IThruChain {\n private readonly bridge: WebViewBridge;\n private readonly provider: NativeProvider;\n private readonly origin: string;\n\n constructor(bridge: WebViewBridge, provider: NativeProvider, origin: string) {\n this.bridge = bridge;\n this.provider = provider;\n this.origin = origin;\n }\n\n get connected(): boolean {\n return this.provider.isConnected();\n }\n\n async connect(): Promise<{ publicKey: string }> {\n const result = await this.provider.connect();\n const selectedAccount = result.selectedAccount;\n const thruAccount =\n selectedAccount?.accountType === AddressType.THRU\n ? selectedAccount\n : result.accounts.find((addr) => addr.accountType === AddressType.THRU);\n if (!thruAccount) {\n throw new Error(\"Thru address not found in connection result\");\n }\n return { publicKey: thruAccount.address };\n }\n\n async disconnect(): Promise<void> {\n await this.provider.disconnect();\n }\n\n async getSigningContext(): Promise<ThruSigningContext> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT,\n origin: this.origin,\n });\n return response.result.signingContext;\n }\n\n async signTransaction(transaction: ThruTransactionIntent): Promise<string> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n\n this.provider.requestShow();\n try {\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n payload: {\n walletAddress: transaction.walletAddress,\n programAddress: transaction.programAddress,\n instructionData: transaction.instructionData,\n readWriteAddresses: transaction.readWriteAddresses,\n readOnlyAddresses: transaction.readOnlyAddresses,\n review: transaction.review,\n },\n origin: this.origin,\n });\n return response.result.signedTransaction;\n } finally {\n this.provider.requestHide();\n }\n }\n}\n","import {\n ErrorCode,\n IFRAME_READY_EVENT,\n POST_MESSAGE_EVENT_TYPE,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n type InferSuccessfulPostMessageResponse,\n type PostMessageEvent,\n type PostMessageRequest,\n type PostMessageResponse,\n} from \"../../protocol\";\n\n/* RN-side analog of `web/packages/embedded-provider/src/IframeManager.ts`.\n The wallet ships unchanged. The shell HTML (src/shell.html) hosts an\n <iframe src=\"wallet.thru.org/embedded/native\"> and forwards\n iframe<->ReactNativeWebView postMessage traffic. This bridge only\n speaks the RN side: webView.injectJavaScript out, onMessage in. */\n\nconst PRODUCTION_WALLET_ORIGINS = ['https://wallet.thru.org'];\n\nfunction isDevelopmentBuild(): boolean {\n const runtime = globalThis as typeof globalThis & {\n __DEV__?: boolean;\n process?: { env?: { NODE_ENV?: string } };\n };\n\n const devFlag = runtime.__DEV__;\n if (typeof devFlag === 'boolean') return devFlag;\n\n return (\n runtime.process?.env?.NODE_ENV !== undefined &&\n runtime.process.env.NODE_ENV !== 'production'\n );\n}\n\nfunction isPrivateIpv4Host(hostname: string): boolean {\n const parts = hostname.split('.').map((part) => Number(part));\n if (\n parts.length !== 4 ||\n parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)\n ) {\n return false;\n }\n\n const [a, b] = parts;\n return (\n a === 10 ||\n a === 127 ||\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && b === 168) ||\n (a === 100 && b >= 64 && b <= 127)\n );\n}\n\nfunction isAllowedDevelopmentOrigin(url: URL): boolean {\n if (!isDevelopmentBuild()) return false;\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false;\n\n const hostname = url.hostname.toLowerCase();\n return (\n hostname === 'localhost' ||\n hostname === '::1' ||\n !hostname.includes('.') ||\n hostname.endsWith('.local') ||\n hostname.endsWith('.ts.net') ||\n isPrivateIpv4Host(hostname)\n );\n}\n\nfunction validateWalletOrigin(walletUrl: string): void {\n let url: URL;\n try {\n url = new URL(walletUrl);\n } catch {\n throw new Error(\n `Invalid wallet URL: ${walletUrl}. URL must be a valid absolute URL.`\n );\n }\n const origin = url.origin;\n const isAllowed =\n PRODUCTION_WALLET_ORIGINS.includes(origin) ||\n isAllowedDevelopmentOrigin(url);\n if (!isAllowed) {\n throw new Error(\n `Untrusted wallet origin: ${origin}. Only trusted origins are allowed: ${PRODUCTION_WALLET_ORIGINS.join(', ')}. ` +\n 'Development builds also allow localhost, LAN, and Tailscale wallet origins.'\n );\n }\n}\n\n/* Minimal contract for a react-native-webview ref. We accept both refs\n ({ current: WebView }) and direct WebView instances. */\nexport interface WebViewRefLike {\n injectJavaScript: (script: string) => void;\n}\n\nexport interface WebViewMessageEventLike {\n nativeEvent: { data: string };\n}\n\nconst READY_TIMEOUT_MS = 10_000;\nconst SLOW_REQUEST_TIMEOUT_MS = 5 * 60 * 1000;\nconst FAST_REQUEST_TIMEOUT_MS = 30 * 1000;\n\nconst SLOW_REQUEST_TYPES: ReadonlySet<string> = new Set([\n POST_MESSAGE_REQUEST_TYPES.CONNECT,\n POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE,\n POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n]);\n\nexport interface WebViewBridgeOptions {\n walletUrl: string;\n}\n\n/**\n * Bidirectional bridge between a host React Native app and the wallet\n * iframe running inside a `react-native-webview`. Mirrors the public\n * surface of `IframeManager` minus DOM-only concerns (visibility\n * styling lives with the host bottom sheet). All other invariants -\n * frameId correlation, IFRAME_READY handshake, request/response\n * routing, timeouts - match the iframe implementation exactly.\n */\nexport class WebViewBridge {\n readonly walletUrl: string;\n readonly walletOrigin: string;\n readonly frameId: string;\n\n private webView: WebViewRefLike | null = null;\n private ready = false;\n private readyPromise: Promise<void> | null = null;\n private resolveReady: (() => void) | null = null;\n private rejectReady: ((err: Error) => void) | null = null;\n private readyTimer: ReturnType<typeof setTimeout> | null = null;\n\n private messageHandlers = new Map<\n string,\n (response: PostMessageResponse) => void\n >();\n\n /* Event broadcasts from the iframe (type === 'event'). */\n public onEvent?: (eventType: string, payload: unknown) => void;\n\n constructor(options: WebViewBridgeOptions) {\n validateWalletOrigin(options.walletUrl);\n this.walletUrl = options.walletUrl;\n this.walletOrigin = new URL(options.walletUrl).origin;\n this.frameId = createRequestId('frame');\n }\n\n /**\n * Compose the URL to load inside the shell <iframe>. The host\n * (ThruWalletSheet) calls this when building the shell HTML.\n */\n getIframeSrc(): string {\n const url = new URL(this.walletUrl);\n if (!url.pathname.endsWith('/native')) {\n url.pathname = `${url.pathname.replace(/\\/$/, '')}/native`;\n }\n url.searchParams.set('tn_frame_id', this.frameId);\n return url.toString();\n }\n\n /**\n * Hand the bridge a WebView ref. Required before `awaitReady()` /\n * `sendMessage()` will resolve.\n */\n attachWebView(ref: WebViewRefLike): void {\n this.webView = ref;\n }\n\n /**\n * Mark the bridge ready when the native host loads the wallet as the\n * top-level WebView document instead of through the shell iframe.\n */\n markReady(): void {\n if (this.ready) return;\n this.ready = true;\n if (this.readyTimer) clearTimeout(this.readyTimer);\n this.readyTimer = null;\n const r = this.resolveReady;\n this.resolveReady = null;\n this.rejectReady = null;\n r?.();\n }\n\n /**\n * Returns a promise that resolves when the iframe sends\n * IFRAME_READY_EVENT. Idempotent: returns the same promise on\n * subsequent calls. Rejects after READY_TIMEOUT_MS.\n */\n awaitReady(): Promise<void> {\n if (this.ready) return Promise.resolve();\n if (this.readyPromise) return this.readyPromise;\n this.readyPromise = new Promise<void>((resolve, reject) => {\n this.resolveReady = resolve;\n this.rejectReady = reject;\n this.readyTimer = setTimeout(() => {\n this.readyTimer = null;\n if (this.rejectReady) {\n const r = this.rejectReady;\n this.rejectReady = null;\n this.resolveReady = null;\n r(new Error('WebView ready timeout - wallet failed to load'));\n }\n }, READY_TIMEOUT_MS);\n });\n return this.readyPromise;\n }\n\n /**\n * Send a request to the iframe (via injectJavaScript -> shell ->\n * iframe.postMessage) and resolve with the matching response.\n */\n async sendMessage<TRequest extends PostMessageRequest>(\n request: TRequest\n ): Promise<InferSuccessfulPostMessageResponse<TRequest>> {\n await this.awaitReady();\n if (!this.webView) {\n throw new Error('WebView not attached - call attachWebView() first');\n }\n\n const timeoutMs = SLOW_REQUEST_TYPES.has(request.type)\n ? SLOW_REQUEST_TIMEOUT_MS\n : FAST_REQUEST_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.messageHandlers.delete(request.id);\n reject(new Error('Request timeout - wallet did not respond'));\n }, timeoutMs);\n\n this.messageHandlers.set(request.id, (response) => {\n clearTimeout(timer);\n this.messageHandlers.delete(request.id);\n if (response.success) {\n resolve(\n response as InferSuccessfulPostMessageResponse<TRequest>\n );\n } else {\n const err = new Error(response.error?.message || 'Unknown error');\n (err as { code?: string; data?: unknown }).code = response.error?.code;\n (err as { code?: string; data?: unknown }).data = response.error?.data;\n reject(err);\n }\n });\n\n const script = `try {\n var msg = ${JSON.stringify(request)};\n if (window.__pushIn) {\n window.__pushIn(msg);\n } else {\n window.dispatchEvent(new MessageEvent('message', {\n data: msg,\n origin: msg.origin || ''\n }));\n }\n } catch (e) {} ; true;`;\n this.webView!.injectJavaScript(script);\n });\n }\n\n /**\n * Reject all in-flight wallet requests when the native host dismisses the\n * WebView without waiting for a wallet-side response.\n */\n rejectPendingRequests(message = 'User rejected the request'): void {\n for (const [id, handler] of Array.from(this.messageHandlers.entries())) {\n handler({\n id,\n success: false,\n error: {\n code: ErrorCode.USER_REJECTED,\n message,\n },\n });\n }\n }\n\n /**\n * Hook this into <WebView onMessage>. The shell forwards iframe\n * postMessage payloads to ReactNativeWebView; we route them here.\n */\n onMessage(event: WebViewMessageEventLike): void {\n let data: unknown;\n try {\n data = JSON.parse(event.nativeEvent.data);\n } catch {\n return;\n }\n if (!data || typeof data !== 'object') return;\n const msg = data as Record<string, unknown>;\n\n /* Frame-id check matches the iframe model: ignore traffic that\n isn't tagged for this bridge instance. */\n if (msg.frameId !== this.frameId) return;\n\n if (msg.type === IFRAME_READY_EVENT) {\n this.markReady();\n return;\n }\n\n /* Response to a specific request (has `id`). */\n if (typeof msg.id === 'string' && this.messageHandlers.has(msg.id)) {\n const handler = this.messageHandlers.get(msg.id)!;\n handler(msg as unknown as PostMessageResponse);\n return;\n }\n\n /* Event broadcast (no id). */\n if (msg.type === POST_MESSAGE_EVENT_TYPE) {\n const evt = msg as unknown as PostMessageEvent;\n this.onEvent?.(evt.event, evt.data);\n }\n }\n\n /**\n * Drop pending handlers and clear ready promise. Call when the host\n * unmounts the WebView.\n */\n destroy(): void {\n if (this.readyTimer) {\n clearTimeout(this.readyTimer);\n this.readyTimer = null;\n }\n if (this.rejectReady && this.readyPromise) {\n /* Attach a swallow handler so Node doesn't flag the rejection as\n unhandled if the host wasn't awaiting it at destroy time. */\n this.readyPromise.catch(() => {});\n this.rejectReady(new Error('Bridge destroyed'));\n }\n this.resolveReady = null;\n this.rejectReady = null;\n this.readyPromise = null;\n this.ready = false;\n this.messageHandlers.clear();\n this.webView = null;\n }\n}\n","import {\n AddressType,\n normalizeWalletAccountResult,\n resolveWalletAccountByAddress,\n type AddressType as AddressTypeValue,\n type ConnectResult,\n type IThruChain,\n type WalletAccount,\n} from \"../../interfaces\";\nimport {\n EMBEDDED_PROVIDER_EVENTS,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n type ConnectMetadataInput,\n type ConnectRequestPayload,\n type EmbeddedProviderEvent,\n type GetConnectionStateResult,\n type ManageAccountsResult,\n type SelectAccountPayload,\n normalizeConnectionStateResult,\n} from \"../../protocol\";\nimport { NativeThruChain } from \"./chains/ThruChain\";\nimport {\n WebViewBridge,\n type WebViewMessageEventLike,\n type WebViewRefLike,\n} from \"./WebViewBridge\";\n\nconst DEFAULT_WALLET_URL = \"https://wallet.thru.org/embedded/native\";\nconst DEFAULT_ORIGIN = \"thru-mobile://app\";\n\nexport interface NativeProviderConfig {\n /** wallet.thru.org/embedded/native URL to load. */\n walletUrl?: string;\n /** Caller-supplied dapp origin. Stamped on every postMessage so\n wallet's ConnectedAppsStorage can scope per-host. */\n origin?: string;\n addressTypes?: AddressTypeValue[];\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectRequestPayload[\"intent\"];\n}\n\nexport type NativeProviderEvent = EmbeddedProviderEvent;\nexport type NativeProviderEventCallback = (data?: unknown) => void;\n\n/**\n * RN-side analog of `web/packages/embedded-provider/src/EmbeddedProvider.ts`.\n * Same public surface (connect/disconnect/sign/getAccounts/etc.) over a\n * WebView+iframe bridge instead of a same-origin iframe. Visibility is\n * delegated to the host (ThruWalletSheet) via `requestShow` /\n * `requestHide` callbacks - bottom sheet logic stays in the React layer.\n */\nexport class NativeProvider {\n private readonly bridge: WebViewBridge;\n private readonly origin: string;\n private _thruChain?: IThruChain;\n private connected = false;\n private accounts: WalletAccount[] = [];\n private selectedAccount: WalletAccount | null = null;\n private readonly eventListeners = new Map<\n string,\n Set<NativeProviderEventCallback>\n >();\n\n /** Set by the host bottom sheet to react to UI_SHOW / completion. */\n public onShowRequested?: () => void;\n public onHideRequested?: () => void;\n\n constructor(config: NativeProviderConfig = {}) {\n const walletUrl = config.walletUrl ?? DEFAULT_WALLET_URL;\n this.origin = config.origin ?? DEFAULT_ORIGIN;\n this.bridge = new WebViewBridge({ walletUrl });\n\n this.bridge.onEvent = (eventType, payload) => {\n this.emit(eventType as NativeProviderEvent, payload);\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.UI_SHOW) {\n this.requestShow();\n return;\n }\n\n if (\n eventType === EMBEDDED_PROVIDER_EVENTS.DISCONNECT ||\n eventType === EMBEDDED_PROVIDER_EVENTS.LOCK\n ) {\n this.clearConnection();\n this.requestHide();\n return;\n }\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED) {\n const account =\n (payload as { account?: WalletAccount } | null | undefined)\n ?.account ?? null;\n this.refreshAccountCache(account);\n }\n };\n\n const addressTypes = config.addressTypes ?? [AddressType.THRU];\n if (addressTypes.includes(AddressType.THRU)) {\n this._thruChain = new NativeThruChain(this.bridge, this, this.origin);\n }\n }\n\n /** Hand the bridge a WebView ref. Required before connect/sign. */\n attachWebView(ref: WebViewRefLike): void {\n this.bridge.attachWebView(ref);\n }\n\n /** Mark a direct top-level WebView wallet document as ready. */\n markWebViewReady(): void {\n this.bridge.markReady();\n }\n\n /** Pass through the WebView's `onMessage` event handler. */\n onMessage = (event: WebViewMessageEventLike): void => {\n this.bridge.onMessage(event);\n };\n\n /** Build the URL to load inside the shell <iframe>. The host shell\n template should substitute this for WALLET_URL_PLACEHOLDER. */\n getIframeSrc(): string {\n return this.bridge.getIframeSrc();\n }\n\n /** Wallet origin (e.g. https://wallet.thru.org). The shell template\n should substitute this for WALLET_ORIGIN_PLACEHOLDER. */\n getWalletOrigin(): string {\n return this.bridge.walletOrigin;\n }\n\n /** Wait for the iframe's IFRAME_READY_EVENT handshake. */\n async initialize(): Promise<void> {\n await this.bridge.awaitReady();\n }\n\n /** Open the wallet UI (called internally; also exposed for host). */\n requestShow(): void {\n this.onShowRequested?.();\n }\n\n /** Close the wallet UI (called internally; also exposed for host). */\n requestHide(): void {\n this.onHideRequested?.();\n }\n\n /** Reject pending requests after a user-driven native sheet dismiss. */\n rejectPendingRequests(message?: string): void {\n this.bridge.rejectPendingRequests(message);\n }\n\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_START, {});\n try {\n this.requestShow();\n const payload: ConnectRequestPayload = {};\n if (options?.metadata) payload.metadata = options.metadata;\n if (options?.preferredAccountAddress) {\n payload.preferredAccountAddress = options.preferredAccountAddress;\n }\n if (options?.intent) payload.intent = options.intent;\n\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.CONNECT,\n payload,\n origin: this.origin,\n });\n\n const result = normalizeWalletAccountResult(response.result);\n this.connected = true;\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT, result);\n this.requestHide();\n return result;\n } catch (error) {\n this.requestHide();\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_ERROR, { error });\n throw error;\n }\n }\n\n async getConnectionState(\n options?: ConnectOptions,\n ): Promise<GetConnectionStateResult> {\n const payload: ConnectRequestPayload = {};\n if (options?.metadata) payload.metadata = options.metadata;\n if (options?.preferredAccountAddress) {\n payload.preferredAccountAddress = options.preferredAccountAddress;\n }\n\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE,\n payload,\n origin: this.origin,\n });\n\n const result = normalizeConnectionStateResult(response.result);\n\n if (\n result.isAuthorized &&\n result.hasPasskey &&\n result.accounts.length > 0\n ) {\n this.hydrateConnection(\n {\n accounts: result.accounts,\n status: \"completed\",\n metadata: result.metadata ?? undefined,\n selectedAccount: result.selectedAccount,\n },\n result.selectedAccount?.address ?? null,\n );\n } else {\n this.clearConnection();\n }\n\n return result;\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.DISCONNECT,\n origin: this.origin,\n });\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, {});\n } catch (error) {\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.ERROR, { error });\n throw error;\n } finally {\n this.requestHide();\n }\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n hydrateConnection(\n result: ConnectResult,\n selectedAccountAddress?: string | null,\n ): void {\n const selectedAccount =\n resolveWalletAccountByAddress(result.accounts, selectedAccountAddress) ??\n result.selectedAccount ??\n null;\n const normalized = normalizeWalletAccountResult(result, selectedAccount);\n this.connected = true;\n this.accounts = normalized.accounts;\n this.selectedAccount = normalized.selectedAccount;\n }\n\n clearConnection(): void {\n this.connected = false;\n this.accounts = [];\n this.selectedAccount = null;\n }\n\n getAccounts(): WalletAccount[] {\n return this.accounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.selectedAccount;\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n if (!this.connected) throw new Error(\"Wallet not connected\");\n const payload: SelectAccountPayload = { publicKey };\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT,\n payload,\n origin: this.origin,\n });\n const account = response.result.account;\n this.refreshAccountCache(account);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n if (!this.connected) throw new Error(\"Wallet not connected\");\n try {\n this.requestShow();\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n origin: this.origin,\n });\n\n const result = normalizeWalletAccountResult(response.result);\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n this.requestHide();\n return result;\n } catch (error) {\n this.requestHide();\n this.emit(EMBEDDED_PROVIDER_EVENTS.ERROR, { error });\n throw error;\n }\n }\n\n get thru(): IThruChain {\n if (!this._thruChain) {\n throw new Error(\"Thru chain not enabled in provider config\");\n }\n return this._thruChain;\n }\n\n on(event: NativeProviderEvent, cb: NativeProviderEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(cb);\n }\n\n off(event: NativeProviderEvent, cb: NativeProviderEventCallback): void {\n this.eventListeners.get(event)?.delete(cb);\n }\n\n /** Internal: used by NativeThruChain. */\n getBridge(): WebViewBridge {\n return this.bridge;\n }\n\n destroy(): void {\n this.bridge.destroy();\n this.eventListeners.clear();\n this.clearConnection();\n }\n\n private emit(event: NativeProviderEvent, data?: unknown): void {\n this.eventListeners.get(event)?.forEach((cb) => {\n try {\n cb(data);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[NativeProvider] listener error for ${event}:`, err);\n }\n });\n }\n\n private refreshAccountCache(account: WalletAccount | null): void {\n if (!account) {\n this.accounts = [];\n this.selectedAccount = null;\n return;\n }\n this.accounts = [account];\n this.selectedAccount = account;\n }\n}\n","import {\n AddressType,\n type AppMetadata,\n type AddressType as AddressTypeValue,\n type ConnectResult,\n type IThruChain,\n type WalletAccount,\n normalizeActiveWalletAccounts,\n normalizeWalletAccountResult,\n} from \"../interfaces\";\nimport {\n EMBEDDED_PROVIDER_EVENTS,\n ErrorCode,\n type ConnectMetadataInput,\n type ConnectRequestPayload,\n type GetConnectionStateResult,\n type ManageAccountsResult,\n normalizeConnectionStateResult,\n} from \"../protocol\";\nimport { NativeProvider } from \"./provider/NativeProvider\";\nimport type {\n WebViewMessageEventLike,\n WebViewRefLike,\n} from \"./provider/WebViewBridge\";\nimport { createThruClient, type Thru } from \"@thru/sdk/client\";\n\nexport type IosWebViewMode = \"direct\" | \"shell-iframe\";\n\nexport type WalletAvailability =\n | {\n status: \"checking\";\n isAuthorized: false;\n isConnected: false;\n isUnlocked: false;\n hasPasskey: false;\n hasWalletAccount: false;\n accounts: WalletAccount[];\n selectedAccount: null;\n metadata: null;\n error: null;\n }\n | {\n status: \"ready\";\n isAuthorized: boolean;\n isConnected: boolean;\n isUnlocked: boolean;\n hasPasskey: boolean;\n hasWalletAccount: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n metadata: AppMetadata | null;\n error: null;\n }\n | {\n status: \"error\";\n isAuthorized: false;\n isConnected: false;\n isUnlocked: false;\n hasPasskey: false;\n hasWalletAccount: false;\n accounts: WalletAccount[];\n selectedAccount: null;\n metadata: null;\n error: Error;\n };\n\nexport interface NativeSDKConfig {\n walletUrl?: string;\n /** Stamped on every postMessage so wallet's ConnectedAppsStorage can\n scope per-host. Default: 'thru-mobile://app'. */\n origin?: string;\n rpcUrl?: string;\n addressTypes?: AddressTypeValue[];\n /** iOS-only host mode. Shell iframe is the default; direct is kept\n as an escape hatch for real-device passkey/WebAuthn comparisons. */\n iosWebViewMode?: IosWebViewMode;\n /** Optional host-provided persistent storage (SecureStore,\n AsyncStorage, localStorage-compatible adapter, etc.). */\n storage?: NativeSDKStorage;\n /** Override the legacy connection snapshot key cleared from `storage`. */\n storageKey?: string;\n /** Override the key used to remember the app-local selected account. */\n selectedAccountStorageKey?: string;\n}\n\nexport interface SignInOptions {\n app_id: string;\n app_display_name: string;\n app_url?: string;\n image_url?: string;\n intent?: ConnectOptions[\"intent\"];\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectRequestPayload[\"intent\"];\n}\n\nexport interface RestoreConnectionOptions {\n hydrate?: boolean;\n}\n\nexport type SDKEvent =\n | \"connect\"\n | \"disconnect\"\n | \"lock\"\n | \"error\"\n | \"accountChanged\"\n | \"availabilityChanged\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type EventCallback = (...args: any[]) => void;\n\nexport interface NativeSDKStorage {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<void>;\n removeItem: (key: string) => void | Promise<void>;\n}\n\nexport interface NativeSDKUiHandlers {\n onShowRequested?: () => void;\n onHideRequested?: () => void;\n}\n\nconst DEFAULT_STORAGE_KEY = \"thru.native-sdk.connection.v1\";\nconst SELECTED_ACCOUNT_STORAGE_KEY_SUFFIX = \".selected-account.v1\";\n\nconst CHECKING_WALLET_AVAILABILITY: WalletAvailability = {\n status: \"checking\",\n isAuthorized: false,\n isConnected: false,\n isUnlocked: false,\n hasPasskey: false,\n hasWalletAccount: false,\n accounts: [],\n selectedAccount: null,\n metadata: null,\n error: null,\n};\n\ninterface PersistedSelectedAccountSnapshot {\n version: 1;\n origin: string;\n walletOrigin: string;\n savedAt: string;\n selectedAccountAddress: string;\n}\n\n/**\n * NativeSDK - mobile mirror of `@thru/wallet`'s `BrowserSDK`.\n * Public surface matches verbatim except `mountInline(HTMLElement)` is\n * replaced by `attachWebView(WebViewRefLike)` since the host bottom\n * sheet owns the WebView lifecycle.\n */\nexport class NativeSDK {\n private provider: NativeProvider;\n private eventListeners = new Map<SDKEvent, Set<EventCallback>>();\n private initialized = false;\n private thruClient: Thru | null = null;\n private rpcUrl: string | undefined;\n private connectInFlight: Promise<ConnectResult> | null = null;\n private lastConnectResult: ConnectResult | null = null;\n private walletAvailability: WalletAvailability = CHECKING_WALLET_AVAILABILITY;\n private readonly origin: string;\n private readonly storage?: NativeSDKStorage;\n private readonly storageKey: string;\n private readonly selectedAccountStorageKey: string;\n private readonly iosWebViewMode: IosWebViewMode;\n\n constructor(config: NativeSDKConfig = {}) {\n this.origin = config.origin ?? \"thru-mobile://app\";\n this.rpcUrl = config.rpcUrl;\n this.storage = config.storage;\n this.storageKey = config.storageKey ?? DEFAULT_STORAGE_KEY;\n this.selectedAccountStorageKey =\n config.selectedAccountStorageKey ??\n `${this.storageKey}${SELECTED_ACCOUNT_STORAGE_KEY_SUFFIX}`;\n this.iosWebViewMode = config.iosWebViewMode ?? \"shell-iframe\";\n this.provider = new NativeProvider({\n walletUrl: config.walletUrl,\n origin: this.origin,\n addressTypes: config.addressTypes ?? [AddressType.THRU],\n });\n this.setupEventForwarding();\n }\n\n /** Hand the WebView ref to the underlying provider/bridge. */\n attachWebView(ref: WebViewRefLike): void {\n this.provider.attachWebView(ref);\n }\n\n /** Mark a direct top-level WebView wallet document as ready. */\n markWebViewReady(): void {\n this.provider.markWebViewReady();\n }\n\n /** Bind to the WebView's `onMessage` handler. */\n onMessage = (event: WebViewMessageEventLike): void => {\n this.provider.onMessage(event);\n };\n\n /** Build the URL to load inside the shell <iframe>. */\n getIframeSrc(): string {\n return this.provider.getIframeSrc();\n }\n\n /** Wallet origin (e.g. https://wallet.thru.org). */\n getWalletOrigin(): string {\n return this.provider.getWalletOrigin();\n }\n\n /** Bind host UI lifecycle handlers used by custom WebView hosts. */\n setUiHandlers(handlers: NativeSDKUiHandlers): void {\n this.provider.onShowRequested = handlers.onShowRequested;\n this.provider.onHideRequested = handlers.onHideRequested;\n }\n\n clearUiHandlers(): void {\n this.provider.onShowRequested = undefined;\n this.provider.onHideRequested = undefined;\n }\n\n /** Reject in-flight wallet requests after a user-driven host dismiss. */\n rejectPendingRequests(message?: string): void {\n this.provider.rejectPendingRequests(message);\n }\n\n /** iOS WebView host mode. Non-iOS hosts should ignore this value. */\n getIosWebViewMode(): IosWebViewMode {\n return this.iosWebViewMode;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n await this.provider.initialize();\n this.initialized = true;\n }\n\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n const isAccountSwitch = options?.intent === \"switch-account\";\n if (this.connectInFlight) return this.connectInFlight;\n if (\n !isAccountSwitch &&\n this.lastConnectResult &&\n this.provider.isConnected()\n ) {\n return this.lastConnectResult;\n }\n\n this.emit(\"connect\", { status: \"connecting\" });\n\n const inFlight = (async () => {\n try {\n this.provider.requestShow();\n if (!this.initialized) await this.initialize();\n\n const metadata = this.resolveMetadata(options?.metadata);\n const preferredAccountAddress = isAccountSwitch\n ? null\n : await this.readSelectedAccountAddress();\n const providerOptions =\n metadata || preferredAccountAddress || options?.intent\n ? {\n ...(metadata ? { metadata } : {}),\n ...(preferredAccountAddress ? { preferredAccountAddress } : {}),\n ...(options?.intent ? { intent: options.intent } : {}),\n }\n : undefined;\n const result = await this.provider.connect(providerOptions);\n if (!isAccountSwitch) {\n await this.applyPreferredSelectedAccount(result.accounts);\n }\n const selectedAccount =\n this.provider.getSelectedAccount() ?? result.selectedAccount ?? null;\n const activeResult = normalizeWalletAccountResult(\n {\n ...result,\n accounts: this.provider.getAccounts(),\n selectedAccount,\n },\n selectedAccount,\n );\n this.lastConnectResult = activeResult;\n await this.persistSelectedAccountAddress(\n activeResult.selectedAccount?.address ?? null,\n );\n await this.clearPersistedConnection();\n this.setWalletAvailability(\n walletAvailabilityFromConnectResult(activeResult),\n );\n this.emit(\"connect\", activeResult);\n return activeResult;\n } catch (error) {\n this.provider.requestHide();\n if (isUserRejectedError(error) && !isAccountSwitch) {\n this.provider.clearConnection();\n this.lastConnectResult = null;\n await this.clearPersistedConnection();\n this.clearAuthorizedAvailability();\n this.emit(\"disconnect\", { reason: \"user_rejected\" });\n }\n this.emit(\"error\", error);\n throw error;\n } finally {\n this.connectInFlight = null;\n }\n })();\n\n this.connectInFlight = inFlight;\n return inFlight;\n }\n\n async signIn(options: SignInOptions): Promise<ConnectResult> {\n return this.connect({\n metadata: this.resolveSignInMetadata(options),\n ...(options.intent ? { intent: options.intent } : {}),\n });\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.provider.disconnect();\n this.emit(\"disconnect\", {});\n this.lastConnectResult = null;\n await this.clearPersistedConnection();\n this.clearAuthorizedAvailability();\n } catch (error) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n isConnected(): boolean {\n return this.provider.isConnected();\n }\n\n getWalletAvailability(): WalletAvailability {\n return this.walletAvailability;\n }\n\n async restoreConnection(\n options: RestoreConnectionOptions = {},\n ): Promise<ConnectResult | null> {\n void options;\n await this.clearPersistedConnection();\n return null;\n }\n\n async syncConnectionState(\n options?: ConnectOptions,\n ): Promise<GetConnectionStateResult | null> {\n try {\n const state = await this.requestConnectionState(options);\n this.setWalletAvailability(walletAvailabilityFromConnectionState(state));\n await this.applyConnectionState(state);\n return state;\n } catch (error) {\n this.setWalletAvailability(walletAvailabilityFromError(error));\n this.emit(\"error\", error);\n return null;\n }\n }\n\n async refreshWalletAvailability(\n options?: ConnectOptions,\n ): Promise<WalletAvailability> {\n try {\n const state = await this.requestConnectionState(options);\n const availability = walletAvailabilityFromConnectionState(state);\n this.setWalletAvailability(availability);\n await this.applyConnectionState(state);\n return availability;\n } catch (error) {\n const availability = walletAvailabilityFromError(error);\n this.setWalletAvailability(availability);\n this.emit(\"error\", error);\n return availability;\n }\n }\n\n getAccounts(): WalletAccount[] {\n const accounts = this.provider.getAccounts();\n const activeAccounts = this.refreshCachedAccounts(\n accounts,\n this.provider.getSelectedAccount(),\n );\n return activeAccounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.provider.getSelectedAccount();\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n const account = await this.provider.selectAccount(publicKey);\n this.refreshCachedAccounts(this.provider.getAccounts(), account);\n await this.persistSelectedAccountAddress(account.address);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n if (!this.initialized) await this.initialize();\n const result = await this.provider.manageAccounts();\n const activeResult = normalizeWalletAccountResult(result);\n const selectedAccount = activeResult.selectedAccount ?? null;\n this.refreshCachedAccounts(activeResult.accounts, selectedAccount);\n await this.persistSelectedAccountAddress(selectedAccount?.address ?? null);\n if (this.lastConnectResult) {\n this.setWalletAvailability(\n walletAvailabilityFromConnectResult(this.lastConnectResult),\n );\n }\n this.emit(\"accountChanged\", selectedAccount);\n return activeResult;\n }\n\n get thru(): IThruChain {\n return this.provider.thru;\n }\n\n on(event: SDKEvent, callback: EventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n off(event: SDKEvent, callback: EventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n\n once(event: SDKEvent, callback: EventCallback): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrapped = (...args: any[]) => {\n callback(...args);\n this.off(event, wrapped);\n };\n this.on(event, wrapped);\n }\n\n destroy(): void {\n this.provider.destroy();\n this.eventListeners.clear();\n this.initialized = false;\n this.connectInFlight = null;\n this.lastConnectResult = null;\n this.walletAvailability = CHECKING_WALLET_AVAILABILITY;\n }\n\n /** Lazily-instantiated Thru chain client. */\n public getThru(): Thru {\n if (!this.thruClient) {\n this.thruClient = createThruClient({ baseUrl: this.rpcUrl });\n }\n return this.thruClient;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private emit(event: SDKEvent, data?: any): void {\n this.eventListeners.get(event)?.forEach((cb) => {\n try {\n cb(data);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[NativeSDK] listener error for ${event}:`, err);\n }\n });\n }\n\n private setupEventForwarding(): void {\n /* CONNECT is emitted from connect() directly (with the resolved\n ConnectResult), so don't double-emit here. */\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, (data) => {\n this.lastConnectResult = null;\n this.clearAuthorizedAvailability();\n this.emit(\"disconnect\", data);\n });\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ERROR, (data) => {\n this.emit(\"error\", data);\n });\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.LOCK, (data) => {\n this.lastConnectResult = null;\n this.clearAuthorizedAvailability();\n this.emit(\"lock\", data);\n this.emit(\"disconnect\", { reason: \"locked\" });\n });\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, (data) => {\n const payload = data as { account?: WalletAccount } | undefined;\n const account = payload?.account ?? null;\n this.refreshCachedAccounts(this.provider.getAccounts(), account);\n if (account) void this.persistSelectedAccountAddress(account.address);\n this.emit(\"accountChanged\", account);\n });\n }\n\n private async requestConnectionState(\n options?: ConnectOptions,\n ): Promise<GetConnectionStateResult> {\n if (!this.initialized) await this.initialize();\n\n const metadata =\n options?.metadata ?? this.lastConnectResult?.metadata ?? undefined;\n const providerOptions = metadata\n ? { metadata: this.resolveMetadata(metadata) }\n : undefined;\n const preferredAccountAddress = await this.readSelectedAccountAddress();\n const nextProviderOptions =\n providerOptions || preferredAccountAddress\n ? {\n ...(providerOptions ?? {}),\n ...(preferredAccountAddress ? { preferredAccountAddress } : {}),\n }\n : undefined;\n const state = await this.provider.getConnectionState(nextProviderOptions);\n return normalizeConnectionStateResult(state);\n }\n\n private async applyConnectionState(\n state: GetConnectionStateResult,\n ): Promise<void> {\n if (state.isAuthorized && state.hasPasskey && state.accounts.length > 0) {\n const result: ConnectResult = {\n accounts: state.accounts,\n selectedAccount: state.selectedAccount,\n status: \"completed\",\n metadata: state.metadata ?? undefined,\n };\n const activeResult = normalizeWalletAccountResult(result);\n this.lastConnectResult = activeResult;\n await this.persistSelectedAccountAddress(\n this.provider.getSelectedAccount()?.address ??\n activeResult.selectedAccount?.address ??\n null,\n );\n await this.clearPersistedConnection();\n this.emit(\"connect\", activeResult);\n return;\n }\n\n const wasConnected =\n this.provider.isConnected() || !!this.lastConnectResult;\n this.provider.clearConnection();\n this.lastConnectResult = null;\n await this.clearPersistedConnection();\n if (wasConnected) {\n this.emit(\"disconnect\", { reason: \"state_unavailable\" });\n }\n }\n\n private setWalletAvailability(availability: WalletAvailability): void {\n this.walletAvailability = availability;\n this.emit(\"availabilityChanged\", availability);\n }\n\n private clearAuthorizedAvailability(): void {\n const previous =\n this.walletAvailability.status === \"ready\"\n ? this.walletAvailability\n : null;\n this.setWalletAvailability({\n status: \"ready\",\n isAuthorized: false,\n isConnected: false,\n isUnlocked: false,\n hasPasskey: previous?.hasPasskey ?? false,\n hasWalletAccount: previous?.hasWalletAccount ?? false,\n accounts: [],\n selectedAccount: null,\n metadata: null,\n error: null,\n });\n }\n\n private resolveMetadata(\n input?: ConnectMetadataInput,\n ): ConnectMetadataInput | undefined {\n if (!input) {\n /* On RN we have no window.location.origin; require explicit\n metadata, but stamp the configured origin as appId so the\n wallet can scope per-host. */\n return { appId: this.origin };\n }\n const metadata: ConnectMetadataInput = {\n appId: input.appId ?? this.origin,\n };\n if (input.appUrl) metadata.appUrl = input.appUrl;\n if (input.appName) metadata.appName = input.appName;\n if (input.imageUrl) metadata.imageUrl = input.imageUrl;\n return metadata;\n }\n\n private resolveSignInMetadata(options: SignInOptions): ConnectMetadataInput {\n const metadata: ConnectMetadataInput = {\n appId: options.app_id,\n appName: options.app_display_name,\n };\n if (options.app_url) metadata.appUrl = options.app_url;\n if (options.image_url) metadata.imageUrl = options.image_url;\n return metadata;\n }\n\n private refreshCachedAccounts(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n ): WalletAccount[] {\n const active = normalizeActiveWalletAccounts(accounts, selectedAccount);\n const nextAccounts = active.accounts;\n const nextSelectedAccount = active.selectedAccount;\n if (this.lastConnectResult && this.provider.isConnected()) {\n this.lastConnectResult = {\n ...this.lastConnectResult,\n accounts: nextAccounts,\n selectedAccount: nextSelectedAccount,\n };\n if (nextSelectedAccount) {\n void this.persistSelectedAccountAddress(nextSelectedAccount.address);\n }\n }\n return nextAccounts;\n }\n\n private async applyPreferredSelectedAccount(\n accounts: WalletAccount[],\n ): Promise<void> {\n const preferredAddress = await this.readSelectedAccountAddress();\n if (!preferredAddress) return;\n if (!accounts.some((account) => account.address === preferredAddress)) {\n return;\n }\n if (this.provider.getSelectedAccount()?.address === preferredAddress) {\n return;\n }\n\n try {\n await this.provider.selectAccount(preferredAddress);\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to restore selected account:\", error);\n }\n }\n\n private async persistSelectedAccountAddress(\n selectedAccountAddress: string | null,\n ): Promise<void> {\n if (!this.storage) return;\n try {\n if (!selectedAccountAddress) {\n await this.storage.removeItem(this.selectedAccountStorageKey);\n return;\n }\n\n const snapshot: PersistedSelectedAccountSnapshot = {\n version: 1,\n origin: this.origin,\n walletOrigin: this.provider.getWalletOrigin(),\n savedAt: new Date().toISOString(),\n selectedAccountAddress,\n };\n await this.storage.setItem(\n this.selectedAccountStorageKey,\n JSON.stringify(snapshot),\n );\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to persist selected account:\", error);\n }\n }\n\n private async clearPersistedConnection(): Promise<void> {\n if (!this.storage) return;\n try {\n await this.storage.removeItem(this.storageKey);\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to clear connection state:\", error);\n }\n }\n\n private async readSelectedAccountAddress(): Promise<string | null> {\n if (!this.storage) return null;\n\n try {\n const raw = await this.storage.getItem(this.selectedAccountStorageKey);\n if (!raw) return null;\n\n const parsed = JSON.parse(\n raw,\n ) as Partial<PersistedSelectedAccountSnapshot>;\n if (\n parsed.version !== 1 ||\n parsed.origin !== this.origin ||\n parsed.walletOrigin !== this.provider.getWalletOrigin() ||\n typeof parsed.selectedAccountAddress !== \"string\" ||\n parsed.selectedAccountAddress.length === 0\n ) {\n await this.storage.removeItem(this.selectedAccountStorageKey);\n return null;\n }\n\n return parsed.selectedAccountAddress;\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to restore selected account:\", error);\n try {\n await this.storage.removeItem(this.selectedAccountStorageKey);\n } catch {\n /* best effort */\n }\n return null;\n }\n }\n}\n\nfunction walletAvailabilityFromConnectResult(\n result: ConnectResult,\n selectedAccount?: WalletAccount | null,\n): WalletAvailability {\n const active = normalizeWalletAccountResult(result, selectedAccount ?? null);\n const hasActiveAccount = active.accounts.length > 0;\n return {\n status: \"ready\",\n isAuthorized: hasActiveAccount,\n isConnected: hasActiveAccount,\n isUnlocked: true,\n hasPasskey: hasActiveAccount,\n hasWalletAccount: hasActiveAccount,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n metadata: result.metadata ?? null,\n error: null,\n };\n}\n\nfunction walletAvailabilityFromConnectionState(\n state: GetConnectionStateResult,\n): WalletAvailability {\n const active = normalizeConnectionStateResult(state);\n const hasWalletAccount =\n (state as Partial<GetConnectionStateResult>).hasWalletAccount ??\n state.accounts.length > 0;\n return {\n status: \"ready\",\n isAuthorized: state.isAuthorized,\n isConnected: state.isAuthorized && state.isConnected,\n isUnlocked: state.isUnlocked,\n hasPasskey: state.hasPasskey,\n hasWalletAccount,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n metadata: state.isAuthorized ? state.metadata : null,\n error: null,\n };\n}\n\nfunction walletAvailabilityFromError(error: unknown): WalletAvailability {\n return {\n status: \"error\",\n isAuthorized: false,\n isConnected: false,\n isUnlocked: false,\n hasPasskey: false,\n hasWalletAccount: false,\n accounts: [],\n selectedAccount: null,\n metadata: null,\n error:\n error instanceof Error\n ? error\n : new Error(\"Wallet availability check failed\"),\n };\n}\n\nfunction isUserRejectedError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n return (error as { code?: unknown }).code === ErrorCode.USER_REJECTED;\n}\n","import { createContext } from 'react';\nimport type {\n NativeSDK,\n WalletAvailability,\n} from \"../NativeSDK\";\nimport type { WalletAccount } from \"../../interfaces\";\nimport type { ManageAccountsResult } from \"../../protocol\";\n\nexport const CHECKING_WALLET_AVAILABILITY: WalletAvailability = {\n status: 'checking',\n isAuthorized: false,\n isConnected: false,\n isUnlocked: false,\n hasPasskey: false,\n hasWalletAccount: false,\n accounts: [],\n selectedAccount: null,\n metadata: null,\n error: null,\n};\n\nexport interface ThruContextValue {\n /** Initialized NativeSDK instance, or null while still constructing. */\n wallet: NativeSDK | null;\n /** Lazily-instantiated Thru chain client (cast at the call site). */\n thru: unknown;\n isConnected: boolean;\n isConnecting: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n walletAvailability: WalletAvailability;\n error: Error | null;\n selectAccount: (account: WalletAccount) => Promise<void>;\n manageAccounts: () => Promise<ManageAccountsResult>;\n}\n\nexport const ThruContext = createContext<ThruContextValue | null>(null);\n","/* React Native mirror of `@thru/wallet/react`'s ThruProvider. Owns the\n NativeSDK instance, mirrors its events into context state. The\n bottom sheet is a separate component (<ThruWalletSheet>) the host\n composes alongside this provider. */\n\nimport { type ReactNode, useCallback, useEffect, useState } from \"react\";\nimport {\n NativeSDK,\n type NativeSDKConfig,\n type WalletAvailability,\n} from \"../NativeSDK\";\nimport type { WalletAccount } from \"../../interfaces\";\nimport { CHECKING_WALLET_AVAILABILITY, ThruContext } from \"./ThruContext\";\n\nexport interface ThruProviderProps {\n children: ReactNode;\n config: NativeSDKConfig;\n}\n\nexport function ThruProvider({ children, config }: ThruProviderProps) {\n const [sdk, setSdk] = useState<NativeSDK | null>(null);\n const [thru, setThru] = useState<unknown>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [accounts, setAccounts] = useState<WalletAccount[]>([]);\n const [isConnecting, setIsConnecting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [selectedAccount, setSelectedAccount] = useState<WalletAccount | null>(\n null,\n );\n const [walletAvailability, setWalletAvailability] =\n useState<WalletAvailability>(CHECKING_WALLET_AVAILABILITY);\n\n useEffect(() => {\n const sdkInstance = new NativeSDK(config);\n setSdk(sdkInstance);\n /* getThru() is lazy in NativeSDK; pull it eagerly so consumers see\n a stable reference. */\n setThru(sdkInstance.getThru());\n\n const updateAccountsFromSdk = () => setAccounts(sdkInstance.getAccounts());\n\n const updateSelectedAccount = (account?: WalletAccount | null) => {\n if (account) {\n setSelectedAccount(account);\n return;\n }\n const fallback =\n sdkInstance.getSelectedAccount() ??\n sdkInstance.getAccounts()[0] ??\n null;\n setSelectedAccount(fallback);\n };\n\n /* Initialization is lazy: NativeSDK.connect() will call initialize\n on demand. We don't pre-initialize because the bridge needs a\n WebView ref attached first by ThruWalletSheet. */\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleConnect = (result: any) => {\n if (result?.status === \"connecting\") {\n setIsConnecting(true);\n setError(null);\n return;\n }\n setIsConnected(true);\n updateAccountsFromSdk();\n setIsConnecting(false);\n setError(null);\n setWalletAvailability(sdkInstance.getWalletAvailability());\n updateSelectedAccount();\n };\n\n const resetData = () => {\n setIsConnected(false);\n setAccounts([]);\n setIsConnecting(false);\n setSelectedAccount(null);\n };\n\n const handleDisconnect = () => resetData();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleError = (err: any) => {\n setError(err?.error ?? err ?? new Error(\"Unknown error\"));\n setIsConnecting(false);\n setWalletAvailability(sdkInstance.getWalletAvailability());\n };\n const handleLock = () => resetData();\n const handleAccountChanged = (\n account: WalletAccount | null | undefined,\n ) => {\n updateAccountsFromSdk();\n updateSelectedAccount(account ?? undefined);\n };\n const handleAvailabilityChanged = (availability: WalletAvailability) => {\n setWalletAvailability(availability);\n };\n sdkInstance.on(\"connect\", handleConnect);\n sdkInstance.on(\"disconnect\", handleDisconnect);\n sdkInstance.on(\"error\", handleError);\n sdkInstance.on(\"lock\", handleLock);\n sdkInstance.on(\"accountChanged\", handleAccountChanged);\n sdkInstance.on(\"availabilityChanged\", handleAvailabilityChanged);\n\n void sdkInstance.restoreConnection({ hydrate: false }).catch(handleError);\n\n return () => {\n sdkInstance.off(\"connect\", handleConnect);\n sdkInstance.off(\"disconnect\", handleDisconnect);\n sdkInstance.off(\"error\", handleError);\n sdkInstance.off(\"lock\", handleLock);\n sdkInstance.off(\"accountChanged\", handleAccountChanged);\n sdkInstance.off(\"availabilityChanged\", handleAvailabilityChanged);\n sdkInstance.destroy();\n };\n /* Empty deps: SDK is constructed once; config changes after mount\n are intentionally ignored to mirror @thru/wallet/react semantics. */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const selectAccount = useCallback(\n async (account: WalletAccount) => {\n if (!sdk) throw new Error(\"NativeSDK not initialized\");\n try {\n const updated = await sdk.selectAccount(account.address);\n setSelectedAccount(updated);\n setAccounts([updated]);\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error(\"selectAccount failed\"),\n );\n throw err;\n }\n },\n [sdk],\n );\n\n const manageAccounts = useCallback(async () => {\n if (!sdk) throw new Error(\"NativeSDK not initialized\");\n try {\n const result = await sdk.manageAccounts();\n setSelectedAccount(result.selectedAccount);\n setAccounts(result.accounts);\n return result;\n } catch (err) {\n setError(err instanceof Error ? err : new Error(\"manageAccounts failed\"));\n throw err;\n }\n }, [sdk]);\n\n return (\n <ThruContext.Provider\n value={{\n thru,\n wallet: sdk,\n isConnected,\n accounts,\n isConnecting,\n error,\n selectedAccount,\n walletAvailability,\n selectAccount,\n manageAccounts,\n }}\n >\n {children}\n </ThruContext.Provider>\n );\n}\n","const SHELL_HTML_TEMPLATE = String.raw`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, viewport-fit=cover\" />\n <title>thru-shell</title>\n <style>\n html, body, iframe {\n margin: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n border: 0;\n background: transparent;\n }\n </style>\n</head>\n<body>\n <iframe\n id=\"w\"\n data-src=\"WALLET_URL_PLACEHOLDER\"\n allow=\"publickey-credentials-get *; publickey-credentials-create *\"\n ></iframe>\n <script>\n (function () {\n var f = document.getElementById('w');\n var ORIGIN = 'WALLET_ORIGIN_PLACEHOLDER';\n function frameId() {\n try {\n return new URL(f.dataset.src).searchParams.get('tn_frame_id');\n } catch (err) {\n return null;\n }\n }\n function postShell(type, data) {\n var rn = window.ReactNativeWebView;\n if (!rn || !rn.postMessage) return;\n try {\n rn.postMessage(JSON.stringify({\n type: type,\n frameId: frameId(),\n data: data || {}\n }));\n } catch (err) {\n /* drop unserializable messages */\n }\n }\n function postToWallet(msg) {\n if (!f.contentWindow) return;\n var outbound = msg;\n if (msg && typeof msg === 'object') {\n outbound = Object.assign({}, msg, { frameId: frameId() });\n }\n f.contentWindow.postMessage(outbound, ORIGIN);\n }\n window.addEventListener('message', function (e) {\n var fromFrame = e.source === f.contentWindow;\n var fromWalletOrigin = e.origin === ORIGIN;\n var hasFrameId = e.data && e.data.frameId === frameId();\n if (!fromWalletOrigin || (!fromFrame && !hasFrameId)) return;\n var rn = window.ReactNativeWebView;\n if (rn && rn.postMessage) {\n try {\n rn.postMessage(JSON.stringify(e.data));\n } catch (err) {\n /* drop unserializable messages */\n }\n }\n });\n window.__pushIn = postToWallet;\n window.addEventListener('thru:native-sheet-dismiss', function () {\n postToWallet({\n type: 'thru:native-sheet-dismiss',\n frameId: frameId()\n });\n });\n f.addEventListener('load', function () {\n postShell('shell:iframe-load', { src: f.src });\n });\n f.addEventListener('error', function () {\n postShell('shell:iframe-error', { src: f.src });\n });\n postShell('shell:loading', { src: f.dataset.src });\n f.src = f.dataset.src;\n })();\n </script>\n</body>\n</html>`;\nconst SHELL_PLACEHOLDER_PATTERN =\n /WALLET_URL_PLACEHOLDER|WALLET_ORIGIN_PLACEHOLDER/g;\n\nexport interface ShellOptions {\n walletUrl: string;\n walletOrigin: string;\n}\n\n/**\n * Returns the shell HTML for loading wallet.thru.org/embedded inside a\n * react-native-webview. The shell hosts an <iframe> pointing at the wallet\n * and bridges window.postMessage traffic between the iframe and the\n * react-native-webview's onMessage / injectJavaScript channels.\n *\n * Caller substitutes the placeholders with the runtime wallet URL + origin.\n */\nexport function getShellHtml(opts: ShellOptions): string {\n return SHELL_HTML_TEMPLATE.replace(SHELL_PLACEHOLDER_PATTERN, (placeholder) =>\n placeholder === 'WALLET_URL_PLACEHOLDER'\n ? opts.walletUrl\n : opts.walletOrigin\n );\n}\n","import { useContext } from 'react';\nimport { ThruContext, type ThruContextValue } from '../ThruContext';\n\n/** Returns the full ThruContextValue. Throws if used outside <ThruProvider>. */\nexport function useThru(): ThruContextValue {\n const ctx = useContext(ThruContext);\n if (!ctx) {\n throw new Error('useThru must be used inside <ThruProvider>');\n }\n return ctx;\n}\n","/* Thin TypeScript shim over the Android Expo Module that wires\n * react-native-webview to androidx.webkit's\n * `setWebAuthnSupport`. On non-Android platforms (iOS, web)\n * this is a no-op - WKWebView gets WebAuthn for free once the host\n * declares `WKAppBoundDomains` (handled by our Expo config plugin). */\n\nimport { Platform } from 'react-native';\nimport { requireOptionalNativeModule } from 'expo-modules-core';\n\n/* `requireOptionalNativeModule` returns null when the module isn't\n * linked (e.g. Expo Go without the dev client, or non-Android). */\ninterface ThruWebViewBridgeNativeModule {\n enableWebAuthnSupport: (viewTag?: number | null) => Promise<boolean>;\n}\n\nconst Native = requireOptionalNativeModule(\n 'ThruWebViewBridge'\n) as ThruWebViewBridgeNativeModule | null;\n\n/**\n * Tell the mounted WebView to route WebAuthn calls through Credential\n * Manager. Returns true if the call landed, false on\n * platforms where it isn't needed or supported.\n *\n * Idempotent; safe to call on every WebView mount.\n */\nexport async function enableWebAuthnSupport(viewTag?: number | null): Promise<boolean> {\n if (Platform.OS !== 'android') return false; /* iOS / web: no-op. */\n if (!Native) return false; /* Module not linked (Expo Go fallback). */\n try {\n return await Native.enableWebAuthnSupport(viewTag);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[@thru/wallet/native/react] enableWebAuthnSupport failed:', err);\n return false;\n }\n}\n","/* Bottom-sheet host for the wallet WebView. Auto-opens on UI_SHOW (or\n any provider lifecycle that calls requestShow), auto-closes on\n request resolution / DISCONNECT / LOCK. Mirrors how the iframe's\n IframeManager.show()/hide() couples to UI_SHOW today. */\n\nimport {\n Component,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from \"react\";\nimport {\n Image,\n Platform,\n StyleSheet,\n Text,\n View,\n type LayoutChangeEvent,\n useWindowDimensions,\n} from \"react-native\";\nimport BottomSheet, { BottomSheetBackdrop } from \"@gorhom/bottom-sheet\";\nimport type BottomSheetType from \"@gorhom/bottom-sheet\";\nimport type { BottomSheetBackdropProps } from \"@gorhom/bottom-sheet\";\nimport { useSharedValue } from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport {\n WebView,\n type WebViewMessageEvent,\n type WebView as WebViewType,\n} from \"react-native-webview\";\nimport { getShellHtml } from \"../provider/shell\";\nimport type { WebViewRefLike } from \"../provider/WebViewBridge\";\nimport QRCodeStyledImport from \"react-native-qrcode-styled\";\nimport { useThru } from \"./hooks/useThru\";\nimport { enableWebAuthnSupport } from \"./android-webauthn\";\n\nconst DEFAULT_SHEET_BACKGROUND_COLOR = \"#f9fbfb\";\nconst DEFAULT_SNAP_POINTS: (string | number)[] = [\"50%\", \"85%\"];\nconst DEFAULT_FIT_CONTENT_MAX_SHEET_RATIO = 0.75;\nconst DEFAULT_FIT_CONTENT_MIN_SHEET_RATIO = 0;\nconst SHEET_HANDLE_HEIGHT = 10;\nconst NATIVE_CONTENT_HEIGHT_MESSAGE = \"wallet:content-height\";\nconst NATIVE_SCREEN_BRIGHTNESS_MESSAGE = \"wallet:screen-brightness\";\nconst NATIVE_PAIR_DEVICE_QR_MESSAGE = \"wallet:pair-device-qr\";\nconst NATIVE_PAIR_DEVICE_QR_STATUS_MESSAGE = \"wallet:pair-device-qr-status\";\nconst NATIVE_BOTTOM_INSET_PARAM = \"tn_native_bottom_inset\";\nconst NATIVE_QR_IMPORT_UNAVAILABLE_REASON =\n \"react-native-qrcode-styled component unavailable\";\nconst NATIVE_QR_DARK_COLOR = \"#151b1e\";\nconst NATIVE_QR_ACCENT_COLOR = \"#239f97\";\nconst NATIVE_QR_ACCENT_DARK_COLOR = \"#0a766f\";\nconst NATIVE_QR_GRADIENT = {\n type: \"linear\" as const,\n options: {\n colors: [\n NATIVE_QR_DARK_COLOR,\n NATIVE_QR_ACCENT_DARK_COLOR,\n NATIVE_QR_ACCENT_COLOR,\n ],\n start: [0, 0] as [number, number],\n end: [1, 1] as [number, number],\n locations: [0, 0.55, 1],\n },\n};\nconst NATIVE_QR_OUTER_EYE_OPTIONS = {\n borderRadius: \"34%\",\n color: NATIVE_QR_DARK_COLOR,\n};\nconst NATIVE_QR_INNER_EYE_OPTIONS = {\n borderRadius: \"50%\",\n color: NATIVE_QR_ACCENT_COLOR,\n scale: 0.86,\n};\nconst NATIVE_QR_WARMUP_DATA = \"thru:qr-warmup\";\n\ntype BrightnessModule = typeof import(\"expo-brightness\");\ntype PreviousScreenBrightnessState = {\n brightness: number;\n didSetSystemBrightness: boolean;\n systemBrightness: number | null;\n systemBrightnessMode: Awaited<\n ReturnType<BrightnessModule[\"getSystemBrightnessModeAsync\"]>\n > | null;\n wasUsingSystemBrightness: boolean | null;\n};\ntype PairDeviceQrFrame = {\n top: number;\n left: number;\n width: number;\n height: number;\n};\ntype PairDeviceQrState = {\n approveUrl: string;\n frame: PairDeviceQrFrame;\n qrDataUrl?: string;\n};\ntype PairDeviceQrRenderStatus = \"rendering\" | \"ready\" | \"unavailable\";\ntype QRCodeStyledComponent = ComponentType<{\n data: string;\n size: number;\n padding?: number;\n color?: string;\n gradient?: object;\n pieceScale?: number;\n pieceCornerType?: \"rounded\" | \"cut\";\n pieceBorderRadius?: number | `${number}%`;\n pieceLiquidRadius?: number | `${number}%`;\n isPiecesGlued?: boolean;\n outerEyesOptions?: object;\n innerEyesOptions?: object;\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\";\n style?: object;\n}>;\n\nlet brightnessModulePromise: Promise<BrightnessModule | null> | null = null;\n\nfunction getBrightnessModule(): Promise<BrightnessModule | null> {\n brightnessModulePromise ??= import(\"expo-brightness\").catch((error) => {\n console.warn(\n \"[ThruWalletSheet] expo-brightness is unavailable in this native build:\",\n error,\n );\n return null;\n });\n return brightnessModulePromise;\n}\n\nasync function getPreviousScreenBrightnessState(\n brightness: BrightnessModule,\n): Promise<PreviousScreenBrightnessState> {\n const previousState: PreviousScreenBrightnessState = {\n brightness: await brightness.getBrightnessAsync(),\n didSetSystemBrightness: false,\n systemBrightness: null,\n systemBrightnessMode: null,\n wasUsingSystemBrightness: null,\n };\n\n if (Platform.OS !== \"android\") return previousState;\n\n const [systemBrightness, systemBrightnessMode, wasUsingSystemBrightness] =\n await Promise.all([\n brightness.getSystemBrightnessAsync().catch(() => null),\n brightness.getSystemBrightnessModeAsync().catch(() => null),\n brightness.isUsingSystemBrightnessAsync().catch(() => null),\n ]);\n previousState.systemBrightness = systemBrightness;\n previousState.systemBrightnessMode = systemBrightnessMode;\n previousState.wasUsingSystemBrightness = wasUsingSystemBrightness;\n\n return previousState;\n}\n\nfunction isReactComponentLike(input: unknown): input is ComponentType<unknown> {\n if (typeof input === \"function\") return true;\n if (typeof input !== \"object\" || input === null) return false;\n\n const reactType = (input as { $$typeof?: unknown }).$$typeof;\n return (\n reactType === Symbol.for(\"react.forward_ref\") ||\n reactType === Symbol.for(\"react.memo\") ||\n reactType === Symbol.for(\"react.lazy\")\n );\n}\n\nfunction resolveQRCodeComponent(\n module: unknown,\n namedExport: string,\n): ComponentType<unknown> | null {\n const seen = new Set<unknown>();\n const candidates = [module];\n\n for (let idx = 0; idx < candidates.length; idx++) {\n const candidate = candidates[idx];\n if (isReactComponentLike(candidate)) return candidate;\n if (\n typeof candidate !== \"object\" ||\n candidate === null ||\n seen.has(candidate)\n ) {\n continue;\n }\n\n seen.add(candidate);\n const record = candidate as Record<string, unknown>;\n candidates.push(record[namedExport], record.default);\n }\n\n return null;\n}\n\nconst RESOLVED_QR_CODE_STYLED = resolveQRCodeComponent(\n QRCodeStyledImport,\n \"QRCodeStyled\",\n) as QRCodeStyledComponent | null;\n\nfunction parsePairDeviceQrFrame(input: unknown): PairDeviceQrFrame | null {\n if (!input || typeof input !== \"object\") return null;\n const frame = input as Partial<PairDeviceQrFrame>;\n const { top, left, width, height } = frame;\n if (\n typeof top !== \"number\" ||\n typeof left !== \"number\" ||\n typeof width !== \"number\" ||\n typeof height !== \"number\" ||\n !Number.isFinite(top) ||\n !Number.isFinite(left) ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return null;\n }\n return { top, left, width, height };\n}\n\nfunction getPairDeviceQrStatusScript(\n status: PairDeviceQrRenderStatus,\n approveUrl: string,\n reason?: string,\n): string {\n const message = JSON.stringify({\n type: NATIVE_PAIR_DEVICE_QR_STATUS_MESSAGE,\n data: { status, approveUrl, reason },\n });\n\n return `\n (function () {\n var message = ${JSON.stringify(message)};\n try {\n var parsed = JSON.parse(message);\n if (typeof window.__pushIn === 'function') {\n window.__pushIn(parsed);\n } else {\n window.dispatchEvent(new MessageEvent('message', {\n data: parsed,\n origin: window.location.origin\n }));\n }\n } catch (error) {}\n })();\n true;\n `;\n}\n\nclass OptionalNativeQrBoundary extends Component<\n {\n children: ReactNode;\n onError: (error: unknown) => void;\n },\n { hasError: boolean }\n> {\n state = { hasError: false };\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: unknown) {\n this.props.onError(error);\n }\n\n render() {\n if (this.state.hasError) return null;\n return this.props.children;\n }\n}\n\nfunction appendNativeBottomInset(\n urlValue: string,\n bottomInset: number,\n): string {\n try {\n const url = new URL(urlValue);\n url.searchParams.set(\n NATIVE_BOTTOM_INSET_PARAM,\n String(Math.max(0, Math.ceil(bottomInset))),\n );\n return url.toString();\n } catch {\n return urlValue;\n }\n}\n\nexport interface ThruWalletSheetProps {\n /** Detents in @gorhom format. Default: ['50%', '85%']. */\n snapPoints?: (string | number)[];\n /** Initial detent index when opening. Default: first detent. */\n initialOpenIndex?: number;\n /** Optional override for the bottom sheet background colour. */\n backgroundColor?: string;\n}\n\nexport interface ThruWalletSheetHandle {\n /** Imperatively open to a specific snap index. */\n expand: (index?: number) => void;\n /** Imperatively close the sheet. */\n close: () => void;\n}\n\nexport const ThruWalletSheet = forwardRef<\n ThruWalletSheetHandle,\n ThruWalletSheetProps\n>(function ThruWalletSheet(\n {\n snapPoints,\n initialOpenIndex,\n backgroundColor = DEFAULT_SHEET_BACKGROUND_COLOR,\n },\n ref,\n) {\n const { wallet } = useThru();\n const { height } = useWindowDimensions();\n const insets = useSafeAreaInsets();\n const sheetRef = useRef<BottomSheetType>(null);\n const webViewRef = useRef<WebViewType | null>(null);\n const webViewNativeTagRef = useRef<number | null>(null);\n const brightnessQueueRef = useRef<Promise<void>>(Promise.resolve());\n const previousScreenBrightnessRef =\n useRef<PreviousScreenBrightnessState | null>(null);\n const didRefreshWalletAvailabilityRef = useRef(false);\n const isProviderClosingRef = useRef(false);\n const isSheetOpenRef = useRef(false);\n const containerLayoutState = useSharedValue({\n height,\n offset: { top: 0, bottom: 0, left: 0, right: 0 },\n });\n\n const [shellHtml, setShellHtml] = useState<string | null>(null);\n const [directWalletUrl, setDirectWalletUrl] = useState<string | null>(null);\n const [hasBridgeMessage, setHasBridgeMessage] = useState(false);\n const [walletLoadStatus, setWalletLoadStatus] = useState(\"Loading wallet...\");\n const [webViewError, setWebViewError] = useState<string | null>(null);\n const [webContentHeight, setWebContentHeight] = useState<number | null>(null);\n const [webContentMaxSheetRatio, setWebContentMaxSheetRatio] = useState(\n DEFAULT_FIT_CONTENT_MAX_SHEET_RATIO,\n );\n const [webContentMinSheetRatio, setWebContentMinSheetRatio] = useState(\n DEFAULT_FIT_CONTENT_MIN_SHEET_RATIO,\n );\n const [pairDeviceQr, setPairDeviceQr] = useState<PairDeviceQrState | null>(\n null,\n );\n const [QRCodeStyled, setQRCodeStyled] =\n useState<QRCodeStyledComponent | null>(() => RESOLVED_QR_CODE_STYLED);\n const [isNativeQrUnavailable, setIsNativeQrUnavailable] = useState(\n () => RESOLVED_QR_CODE_STYLED === null,\n );\n const [nativeQrUnavailableReason, setNativeQrUnavailableReason] = useState<\n string | null\n >(() =>\n RESOLVED_QR_CODE_STYLED ? null : NATIVE_QR_IMPORT_UNAVAILABLE_REASON,\n );\n const shouldFitContent = !snapPoints || snapPoints.length === 0;\n const configuredSnapPoints = useMemo(\n () =>\n snapPoints && snapPoints.length > 0 ? snapPoints : DEFAULT_SNAP_POINTS,\n [snapPoints],\n );\n const memoSnapPoints = useMemo(() => {\n if (!shouldFitContent || webContentHeight == null)\n return configuredSnapPoints;\n\n const maxSheetHeight = Math.floor(height * webContentMaxSheetRatio);\n const minSheetHeight = Math.floor(\n height * Math.min(webContentMinSheetRatio, webContentMaxSheetRatio),\n );\n const fittedSheetHeight = Math.min(\n Math.max(webContentHeight + SHEET_HANDLE_HEIGHT, minSheetHeight),\n maxSheetHeight,\n );\n\n if (fittedSheetHeight >= maxSheetHeight - 1) {\n return [maxSheetHeight];\n }\n\n return [fittedSheetHeight, maxSheetHeight];\n }, [\n configuredSnapPoints,\n height,\n shouldFitContent,\n webContentHeight,\n webContentMaxSheetRatio,\n webContentMinSheetRatio,\n ]);\n const openIndex = Math.max(\n 0,\n Math.min(initialOpenIndex ?? 0, memoSnapPoints.length - 1),\n );\n const snapToSheetIndex = useCallback(\n (index: number) => {\n const maxIndex = Math.max(0, memoSnapPoints.length - 1);\n sheetRef.current?.snapToIndex(Math.max(0, Math.min(index, maxIndex)));\n },\n [memoSnapPoints.length],\n );\n\n const enqueueBrightnessTask = useCallback((task: () => Promise<void>) => {\n const queuedTask = brightnessQueueRef.current.then(task, task);\n brightnessQueueRef.current = queuedTask.catch(() => {});\n }, []);\n\n const restoreScreenBrightness = useCallback(() => {\n enqueueBrightnessTask(async () => {\n const previousState = previousScreenBrightnessRef.current;\n previousScreenBrightnessRef.current = null;\n if (!previousState) return;\n\n try {\n const brightness = await getBrightnessModule();\n if (!brightness) return;\n if (Platform.OS === \"android\") {\n if (\n previousState.didSetSystemBrightness &&\n previousState.systemBrightness !== null\n ) {\n try {\n await brightness.setSystemBrightnessAsync(\n previousState.systemBrightness,\n );\n if (previousState.systemBrightnessMode !== null) {\n await brightness.setSystemBrightnessModeAsync(\n previousState.systemBrightnessMode,\n );\n }\n } catch {\n /* Fall back to restoring the current activity brightness. */\n }\n }\n if (previousState.wasUsingSystemBrightness) {\n try {\n await brightness.restoreSystemBrightnessAsync();\n return;\n } catch {\n /* Fall back to restoring the saved activity brightness. */\n }\n }\n }\n await brightness.setBrightnessAsync(previousState.brightness);\n } catch (error) {\n console.warn(\n \"[ThruWalletSheet] Failed to restore screen brightness:\",\n error,\n );\n }\n });\n }, [enqueueBrightnessTask]);\n\n const maximizeScreenBrightness = useCallback(() => {\n enqueueBrightnessTask(async () => {\n try {\n const brightness = await getBrightnessModule();\n if (!brightness) return;\n if (previousScreenBrightnessRef.current == null) {\n previousScreenBrightnessRef.current =\n await getPreviousScreenBrightnessState(brightness);\n }\n await brightness.setBrightnessAsync(1);\n if (Platform.OS === \"android\") {\n try {\n await brightness.setSystemBrightnessAsync(1);\n if (previousScreenBrightnessRef.current) {\n previousScreenBrightnessRef.current.didSetSystemBrightness = true;\n }\n } catch {\n /* Activity brightness above still maximizes the visible app. */\n }\n }\n } catch (error) {\n console.warn(\n \"[ThruWalletSheet] Failed to maximize screen brightness:\",\n error,\n );\n }\n });\n }, [enqueueBrightnessTask]);\n\n const sendPairDeviceQrStatus = useCallback(\n (\n status: PairDeviceQrRenderStatus,\n approveUrl: string,\n reason?: string | null,\n ) => {\n webViewRef.current?.injectJavaScript(\n getPairDeviceQrStatusScript(status, approveUrl, reason ?? undefined),\n );\n },\n [],\n );\n\n const handleNativeQrError = useCallback(\n (error: unknown) => {\n console.warn(\"[ThruWalletSheet] Failed to render native QR:\", error);\n const reason =\n error instanceof Error\n ? `react-native-qrcode-styled render failed: ${error.message}`\n : \"react-native-qrcode-styled render failed\";\n if (pairDeviceQr) {\n sendPairDeviceQrStatus(\"unavailable\", pairDeviceQr.approveUrl, reason);\n }\n setNativeQrUnavailableReason(reason);\n setIsNativeQrUnavailable(true);\n setPairDeviceQr(null);\n },\n [pairDeviceQr, sendPairDeviceQrStatus],\n );\n\n useEffect(() => {\n containerLayoutState.value = {\n height,\n offset: { top: 0, bottom: 0, left: 0, right: 0 },\n };\n }, [containerLayoutState, height]);\n\n useEffect(() => {\n return () => {\n restoreScreenBrightness();\n };\n }, [restoreScreenBrightness]);\n\n /* Build the wallet source once the SDK is available. Android and iOS\n default to the shell iframe so the native SDK reuses the same wallet\n postMessage protocol as web iframe consumers. */\n useEffect(() => {\n if (!wallet) return;\n const walletUrl = appendNativeBottomInset(\n wallet.getIframeSrc(),\n insets.bottom,\n );\n const useDirectWallet =\n Platform.OS === \"ios\" && wallet.getIosWebViewMode() === \"direct\";\n if (useDirectWallet) {\n setDirectWalletUrl(walletUrl);\n setShellHtml(null);\n } else {\n const html = getShellHtml({\n walletUrl,\n walletOrigin: wallet.getWalletOrigin(),\n });\n setShellHtml(html);\n setDirectWalletUrl(null);\n }\n setHasBridgeMessage(false);\n setWalletLoadStatus(\"Loading wallet...\");\n setWebViewError(null);\n setWebContentHeight(null);\n setWebContentMaxSheetRatio(DEFAULT_FIT_CONTENT_MAX_SHEET_RATIO);\n setWebContentMinSheetRatio(DEFAULT_FIT_CONTENT_MIN_SHEET_RATIO);\n setPairDeviceQr(null);\n setQRCodeStyled(() => RESOLVED_QR_CODE_STYLED);\n setNativeQrUnavailableReason(\n RESOLVED_QR_CODE_STYLED ? null : NATIVE_QR_IMPORT_UNAVAILABLE_REASON,\n );\n setIsNativeQrUnavailable(RESOLVED_QR_CODE_STYLED === null);\n didRefreshWalletAvailabilityRef.current = false;\n }, [insets.bottom, wallet]);\n\n useEffect(() => {\n if (!pairDeviceQr) return;\n if (pairDeviceQr.qrDataUrl || (QRCodeStyled && !isNativeQrUnavailable)) {\n sendPairDeviceQrStatus(\"ready\", pairDeviceQr.approveUrl);\n } else if (isNativeQrUnavailable) {\n sendPairDeviceQrStatus(\n \"unavailable\",\n pairDeviceQr.approveUrl,\n nativeQrUnavailableReason,\n );\n }\n }, [\n QRCodeStyled,\n isNativeQrUnavailable,\n nativeQrUnavailableReason,\n pairDeviceQr,\n sendPairDeviceQrStatus,\n ]);\n\n const isDirectWalletSource = directWalletUrl !== null;\n\n /* Hand the WebView ref to the SDK once both exist. We expose only\n the shape NativeProvider needs (injectJavaScript). Also flip the\n Android WebView's WebAuthn support on, since react-native-webview\n doesn't do it for us. iOS is a no-op (WKWebView WebAuthn is\n governed by WKAppBoundDomains, set by our Expo config plugin). */\n const attachIfReady = useCallback(() => {\n if (!wallet || !webViewRef.current) return;\n const ref: WebViewRefLike = {\n injectJavaScript: (script: string) => {\n webViewRef.current?.injectJavaScript(script);\n },\n };\n wallet.attachWebView(ref);\n }, [wallet]);\n\n const enableAndroidWebAuthnIfNeeded = useCallback(async () => {\n if (Platform.OS !== \"android\") return false;\n const enabled = await enableWebAuthnSupport(webViewNativeTagRef.current);\n webViewRef.current?.injectJavaScript(\n \"window.dispatchEvent(new Event('thru:native-webauthn-ready')); true;\",\n );\n return enabled;\n }, []);\n\n const handleWebViewLayout = useCallback(\n (event: LayoutChangeEvent) => {\n const target = (event.nativeEvent as { target?: unknown }).target;\n webViewNativeTagRef.current =\n typeof target === \"number\" ? target : webViewNativeTagRef.current;\n void enableAndroidWebAuthnIfNeeded();\n },\n [enableAndroidWebAuthnIfNeeded],\n );\n\n const refreshWalletAvailabilityIfReady = useCallback(() => {\n if (!wallet || didRefreshWalletAvailabilityRef.current) return;\n didRefreshWalletAvailabilityRef.current = true;\n void wallet.refreshWalletAvailability();\n }, [wallet]);\n\n const handleLoadEnd = useCallback(() => {\n attachIfReady();\n if (isDirectWalletSource) {\n wallet?.markWebViewReady();\n setHasBridgeMessage(true);\n setWebViewError(null);\n void enableAndroidWebAuthnIfNeeded().finally(\n refreshWalletAvailabilityIfReady,\n );\n }\n }, [\n attachIfReady,\n enableAndroidWebAuthnIfNeeded,\n isDirectWalletSource,\n refreshWalletAvailabilityIfReady,\n wallet,\n ]);\n\n /* Wire show/hide callbacks through the SDK's provider so UI_SHOW from\n the wallet expands the sheet and request resolution closes it. */\n useEffect(() => {\n if (!wallet) return;\n wallet.setUiHandlers({\n onShowRequested: () => {\n isProviderClosingRef.current = false;\n snapToSheetIndex(openIndex);\n },\n onHideRequested: () => {\n isProviderClosingRef.current = true;\n sheetRef.current?.close();\n },\n });\n return () => {\n wallet.clearUiHandlers();\n };\n }, [wallet, openIndex, snapToSheetIndex]);\n\n useEffect(() => {\n if (!isSheetOpenRef.current) return;\n const animationFrame = requestAnimationFrame(() => {\n snapToSheetIndex(openIndex);\n });\n return () => cancelAnimationFrame(animationFrame);\n }, [height, memoSnapPoints, openIndex, snapToSheetIndex]);\n\n const walletOrigin = wallet?.getWalletOrigin();\n const webViewSource = useMemo(() => {\n if (directWalletUrl) return { uri: directWalletUrl };\n if (shellHtml) {\n return { html: shellHtml, baseUrl: walletOrigin ?? \"about:blank\" };\n }\n return null;\n }, [directWalletUrl, shellHtml, walletOrigin]);\n\n useEffect(() => {\n if (!webViewSource) return;\n attachIfReady();\n void enableAndroidWebAuthnIfNeeded();\n }, [attachIfReady, enableAndroidWebAuthnIfNeeded, webViewSource]);\n\n const limitsNavigationsToAppBoundDomains =\n Platform.OS === \"ios\" && isDirectWalletSource;\n\n const handleMessage = useCallback(\n (event: WebViewMessageEvent) => {\n let shouldRefreshAfterBridgeReady = false;\n try {\n const data = JSON.parse(event.nativeEvent.data) as {\n type?: string;\n data?: {\n approveUrl?: string;\n fitContent?: boolean;\n frame?: unknown;\n height?: number;\n maxSheetRatio?: number;\n minSheetRatio?: number;\n mode?: string;\n qrDataUrl?: string;\n src?: string;\n visible?: boolean;\n };\n };\n if (data.type === NATIVE_CONTENT_HEIGHT_MESSAGE) {\n const nextMaxSheetRatio = data.data?.maxSheetRatio;\n const nextMinSheetRatio = data.data?.minSheetRatio;\n setWebContentMaxSheetRatio(\n typeof nextMaxSheetRatio === \"number\" &&\n Number.isFinite(nextMaxSheetRatio) &&\n nextMaxSheetRatio > 0 &&\n nextMaxSheetRatio <= 1\n ? nextMaxSheetRatio\n : DEFAULT_FIT_CONTENT_MAX_SHEET_RATIO,\n );\n setWebContentMinSheetRatio(\n typeof nextMinSheetRatio === \"number\" &&\n Number.isFinite(nextMinSheetRatio) &&\n nextMinSheetRatio >= 0 &&\n nextMinSheetRatio <= 1\n ? nextMinSheetRatio\n : DEFAULT_FIT_CONTENT_MIN_SHEET_RATIO,\n );\n if (data.data?.fitContent === false) {\n setWebContentHeight(null);\n return;\n }\n const nextHeight = data.data?.height;\n if (\n typeof nextHeight === \"number\" &&\n Number.isFinite(nextHeight) &&\n nextHeight > 0\n ) {\n setWebContentHeight(Math.ceil(nextHeight));\n }\n return;\n }\n if (data.type === NATIVE_PAIR_DEVICE_QR_MESSAGE) {\n if (data.data?.visible === false) {\n setPairDeviceQr(null);\n return;\n }\n const approveUrl = data.data?.approveUrl;\n const frame = parsePairDeviceQrFrame(data.data?.frame);\n if (typeof approveUrl === \"string\" && approveUrl && frame) {\n const qrDataUrl =\n typeof data.data?.qrDataUrl === \"string\" &&\n data.data.qrDataUrl.startsWith(\"data:image/\")\n ? data.data.qrDataUrl\n : undefined;\n if (isNativeQrUnavailable) {\n sendPairDeviceQrStatus(\n \"unavailable\",\n approveUrl,\n nativeQrUnavailableReason,\n );\n return;\n }\n setPairDeviceQr({ approveUrl, frame, qrDataUrl });\n sendPairDeviceQrStatus(\"rendering\", approveUrl);\n }\n return;\n }\n if (data.type === NATIVE_SCREEN_BRIGHTNESS_MESSAGE) {\n if (data.data?.mode === \"max\") {\n maximizeScreenBrightness();\n } else if (data.data?.mode === \"restore\") {\n restoreScreenBrightness();\n }\n return;\n }\n if (data.type === \"shell:loading\") {\n setWalletLoadStatus(\"Loading wallet iframe...\");\n return;\n }\n if (data.type === \"shell:iframe-load\") {\n setWebViewError(null);\n setWalletLoadStatus(\n \"Wallet iframe loaded. Waiting for wallet app...\",\n );\n return;\n }\n if (data.type === \"shell:iframe-error\") {\n if (hasBridgeMessage) {\n console.warn(\n \"[ThruWalletSheet] Ignoring post-ready wallet iframe error:\",\n data.data,\n );\n return;\n }\n setWebViewError(\n `Wallet iframe failed to load${data.data?.src ? `: ${data.data.src}` : \"\"}`,\n );\n return;\n }\n if (data.type === \"iframe:ready\") {\n setHasBridgeMessage(true);\n setWebViewError(null);\n shouldRefreshAfterBridgeReady = true;\n }\n } catch {\n /* Let the bridge ignore malformed messages. */\n }\n wallet?.onMessage({\n nativeEvent: { data: event.nativeEvent.data },\n });\n if (shouldRefreshAfterBridgeReady) {\n void enableAndroidWebAuthnIfNeeded().finally(\n refreshWalletAvailabilityIfReady,\n );\n }\n },\n [\n enableAndroidWebAuthnIfNeeded,\n hasBridgeMessage,\n isNativeQrUnavailable,\n nativeQrUnavailableReason,\n maximizeScreenBrightness,\n refreshWalletAvailabilityIfReady,\n restoreScreenBrightness,\n sendPairDeviceQrStatus,\n wallet,\n ],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n expand: (index?: number) => snapToSheetIndex(index ?? openIndex),\n close: () => sheetRef.current?.close(),\n }),\n [openIndex, snapToSheetIndex],\n );\n\n const handleSheetChange = useCallback(\n (index: number) => {\n isSheetOpenRef.current = index !== -1;\n if (index !== -1) return;\n restoreScreenBrightness();\n setPairDeviceQr(null);\n if (isProviderClosingRef.current) {\n isProviderClosingRef.current = false;\n return;\n }\n wallet?.rejectPendingRequests();\n webViewRef.current?.injectJavaScript(\n \"window.dispatchEvent(new Event('thru:native-sheet-dismiss')); true;\",\n );\n },\n [restoreScreenBrightness, wallet],\n );\n\n const pairDeviceQrSize = pairDeviceQr\n ? Math.max(\n 96,\n Math.floor(\n Math.min(pairDeviceQr.frame.width, pairDeviceQr.frame.height) - 32,\n ),\n )\n : 0;\n const pairDeviceQrBadgeFontSize = Math.max(16, pairDeviceQrSize * 0.1);\n const renderHandle = useCallback(\n () => (\n <View style={[styles.handleContainer, { backgroundColor }]}>\n <View style={styles.handleIndicator} />\n </View>\n ),\n [backgroundColor],\n );\n\n const renderBackdrop = useCallback(\n (props: BottomSheetBackdropProps) => (\n <BottomSheetBackdrop\n {...props}\n appearsOnIndex={0}\n disappearsOnIndex={-1}\n opacity={0.38}\n pressBehavior=\"close\"\n />\n ),\n [],\n );\n\n return (\n <BottomSheet\n ref={sheetRef}\n index={-1}\n snapPoints={memoSnapPoints}\n containerLayoutState={containerLayoutState}\n enableDynamicSizing={false}\n enableContentPanningGesture={false}\n handleComponent={renderHandle}\n backdropComponent={renderBackdrop}\n enablePanDownToClose\n onChange={handleSheetChange}\n backgroundStyle={{ backgroundColor }}\n >\n <View style={[styles.body, { backgroundColor }]}>\n {QRCodeStyled ? (\n <View\n collapsable={false}\n pointerEvents=\"none\"\n style={styles.nativeQrWarmup}\n >\n <QRCodeStyled\n data={NATIVE_QR_WARMUP_DATA}\n size={64}\n color={NATIVE_QR_DARK_COLOR}\n errorCorrectionLevel=\"L\"\n padding={0}\n pieceScale={1.025}\n />\n </View>\n ) : null}\n {webViewSource ? (\n <WebView\n ref={webViewRef}\n source={webViewSource}\n originWhitelist={[\"*\"]}\n javaScriptEnabled\n domStorageEnabled\n webviewDebuggingEnabled={__DEV__}\n nestedScrollEnabled\n sharedCookiesEnabled\n allowsInlineMediaPlayback\n mediaPlaybackRequiresUserAction={false}\n /* iOS WKWebView: direct wallet pages need app-bound\n navigation so WebAuthn and injected JS run in the\n WKAppBoundDomains context configured by the host app. */\n limitsNavigationsToAppBoundDomains={\n limitsNavigationsToAppBoundDomains\n }\n onLoadStart={() => {\n attachIfReady();\n void enableAndroidWebAuthnIfNeeded();\n }}\n onLoadEnd={handleLoadEnd}\n onLayout={handleWebViewLayout}\n onError={(event) => {\n const description =\n event.nativeEvent.description ||\n \"Wallet WebView failed to load\";\n if (hasBridgeMessage) {\n console.warn(\n \"[ThruWalletSheet] Ignoring post-ready WebView error:\",\n event.nativeEvent,\n );\n return;\n }\n setWebViewError(description);\n console.warn(\"[ThruWalletSheet] WebView error:\", description);\n }}\n onHttpError={(event) => {\n const status = event.nativeEvent.statusCode;\n const description = `Wallet returned HTTP ${status}`;\n if (hasBridgeMessage) {\n console.warn(\n \"[ThruWalletSheet] Ignoring post-ready WebView HTTP error:\",\n event.nativeEvent,\n );\n return;\n }\n setWebViewError(description);\n console.warn(\n \"[ThruWalletSheet] WebView HTTP error:\",\n description,\n );\n }}\n onMessage={handleMessage}\n style={[styles.webview, { backgroundColor }]}\n />\n ) : null}\n {webViewSource &&\n ((!isDirectWalletSource && !hasBridgeMessage) || webViewError) ? (\n <View\n pointerEvents=\"none\"\n style={[styles.loadingOverlay, { backgroundColor }]}\n >\n <Text style={styles.loadingTitle}>\n {webViewError ? \"Wallet failed to load\" : walletLoadStatus}\n </Text>\n {webViewError ? (\n <Text style={styles.loadingDetail}>{webViewError}</Text>\n ) : null}\n </View>\n ) : null}\n {pairDeviceQr && (pairDeviceQr.qrDataUrl || QRCodeStyled) ? (\n <View\n pointerEvents=\"none\"\n style={[\n styles.nativeQrOverlay,\n {\n height: pairDeviceQr.frame.height,\n left: pairDeviceQr.frame.left,\n top: pairDeviceQr.frame.top,\n width: pairDeviceQr.frame.width,\n },\n ]}\n >\n <OptionalNativeQrBoundary\n key={pairDeviceQr.approveUrl}\n onError={handleNativeQrError}\n >\n <View style={styles.nativeQrCard}>\n {pairDeviceQr.qrDataUrl ? (\n <Image\n resizeMode=\"contain\"\n source={{ uri: pairDeviceQr.qrDataUrl }}\n style={[\n styles.nativeQrImage,\n {\n height: pairDeviceQrSize,\n width: pairDeviceQrSize,\n },\n ]}\n />\n ) : QRCodeStyled ? (\n <View\n style={[\n styles.nativeQrStyledFallback,\n {\n height: pairDeviceQrSize,\n width: pairDeviceQrSize,\n },\n ]}\n >\n <QRCodeStyled\n data={pairDeviceQr.approveUrl}\n size={pairDeviceQrSize}\n color={NATIVE_QR_DARK_COLOR}\n gradient={NATIVE_QR_GRADIENT}\n errorCorrectionLevel=\"H\"\n innerEyesOptions={NATIVE_QR_INNER_EYE_OPTIONS}\n isPiecesGlued\n outerEyesOptions={NATIVE_QR_OUTER_EYE_OPTIONS}\n padding={0}\n pieceBorderRadius=\"42%\"\n pieceCornerType=\"rounded\"\n pieceLiquidRadius=\"30%\"\n pieceScale={1.02}\n style={styles.nativeQrSvg}\n />\n <View style={styles.nativeQrFallbackBadge}>\n <Text\n style={[\n styles.nativeQrFallbackBadgeText,\n {\n fontSize: pairDeviceQrBadgeFontSize,\n lineHeight: pairDeviceQrBadgeFontSize * 1.05,\n },\n ]}\n >\n J\n </Text>\n </View>\n </View>\n ) : null}\n </View>\n </OptionalNativeQrBoundary>\n </View>\n ) : null}\n </View>\n </BottomSheet>\n );\n});\n\nconst styles = StyleSheet.create({\n body: { flex: 1 },\n handleContainer: {\n alignItems: \"center\",\n height: SHEET_HANDLE_HEIGHT,\n justifyContent: \"flex-start\",\n paddingTop: 4,\n },\n handleIndicator: {\n backgroundColor: \"#cdd5db\",\n borderRadius: 999,\n height: 4,\n width: 42,\n },\n loadingDetail: {\n color: \"#4b635f\",\n fontSize: 13,\n lineHeight: 18,\n maxWidth: 280,\n textAlign: \"center\",\n },\n loadingOverlay: {\n alignItems: \"center\",\n bottom: 0,\n gap: 8,\n justifyContent: \"center\",\n left: 0,\n padding: 24,\n position: \"absolute\",\n right: 0,\n top: 0,\n },\n loadingTitle: {\n color: \"#172b29\",\n fontSize: 16,\n fontWeight: \"600\",\n textAlign: \"center\",\n },\n nativeQrCard: {\n alignItems: \"center\",\n backgroundColor: \"#ffffff\",\n borderColor: \"#dbe4e8\",\n borderRadius: 8,\n borderWidth: StyleSheet.hairlineWidth,\n flex: 1,\n justifyContent: \"center\",\n },\n nativeQrOverlay: {\n elevation: 16,\n position: \"absolute\",\n zIndex: 16,\n },\n nativeQrImage: {\n backgroundColor: \"#ffffff\",\n },\n nativeQrFallbackBadge: {\n alignItems: \"center\",\n aspectRatio: 1,\n backgroundColor: \"#ffffff\",\n borderColor: \"#d1e1e1\",\n borderRadius: 999,\n borderWidth: StyleSheet.hairlineWidth,\n justifyContent: \"center\",\n left: \"41.5%\",\n position: \"absolute\",\n top: \"41.5%\",\n width: \"17%\",\n },\n nativeQrFallbackBadgeText: {\n color: NATIVE_QR_ACCENT_DARK_COLOR,\n fontWeight: \"700\",\n includeFontPadding: false,\n textAlign: \"center\",\n },\n nativeQrStyledFallback: {\n alignItems: \"center\",\n backgroundColor: \"#ffffff\",\n justifyContent: \"center\",\n },\n nativeQrSvg: {\n backgroundColor: \"#ffffff\",\n },\n nativeQrWarmup: {\n height: 64,\n left: -128,\n opacity: 0,\n position: \"absolute\",\n top: -128,\n width: 64,\n zIndex: -1,\n },\n webview: { flex: 1, backgroundColor: \"transparent\" },\n});\n","import type { NativeSDK } from \"../../NativeSDK\";\n\n/** Spin until the SDK exists or `timeout` ms passes. */\nexport function waitForWallet(\n getWallet: () => NativeSDK | null,\n timeout = 5000,\n interval = 100\n): Promise<NativeSDK> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n const check = () => {\n const sdk = getWallet();\n if (sdk) return resolve(sdk);\n if (Date.now() - start > timeout) {\n return reject(new Error('NativeSDK not initialized in time'));\n }\n setTimeout(check, interval);\n };\n check();\n });\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { ConnectResult, IThruChain } from \"../../../interfaces\";\nimport type { ConnectOptions, SignInOptions } from \"../../NativeSDK\";\nimport { useThru } from './useThru';\nimport { waitForWallet } from './waitForWallet';\n\n/**\n * useWallet - mirror of @thru/wallet/react's useWallet. The `wallet` field\n * exposes the chain interface (`provider.thru`); `connect` /\n * `disconnect` proxy through the SDK.\n */\nexport function useWallet() {\n const {\n wallet,\n isConnected,\n isConnecting,\n accounts,\n selectedAccount,\n selectAccount,\n manageAccounts,\n walletAvailability,\n } = useThru();\n const walletRef = useRef(wallet);\n\n useEffect(() => {\n walletRef.current = wallet;\n }, [wallet]);\n\n const connect = useCallback(async (options?: ConnectOptions): Promise<ConnectResult> => {\n const ready =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n return ready.connect(options);\n }, []);\n\n const signIn = useCallback(async (options: SignInOptions): Promise<ConnectResult> => {\n const ready =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n return ready.signIn(options);\n }, []);\n\n const disconnect = useCallback(async (): Promise<void> => {\n const ready =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n await ready.disconnect();\n }, []);\n\n const refreshWalletAvailability = useCallback(async (options?: ConnectOptions) => {\n const ready =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n return ready.refreshWalletAvailability(options);\n }, []);\n\n return {\n /** Chain interface (`provider.thru`); undefined until connected. */\n wallet: wallet?.thru as IThruChain | undefined,\n accounts,\n connect,\n signIn,\n disconnect,\n isConnected: isConnected && !!wallet,\n isConnecting,\n selectedAccount,\n selectAccount,\n manageAccounts,\n walletAvailability,\n hasPasskey: walletAvailability.hasPasskey,\n hasWalletAccount: walletAvailability.hasWalletAccount,\n isWalletAvailabilityLoading: walletAvailability.status === 'checking',\n refreshWalletAvailability,\n };\n}\n","import { useEffect, useRef } from 'react';\nimport type { ConnectOptions } from \"../../NativeSDK\";\nimport { useThru } from './useThru';\nimport { waitForWallet } from './waitForWallet';\n\nexport function useWalletAvailability() {\n const { wallet, walletAvailability } = useThru();\n const walletRef = useRef(wallet);\n\n useEffect(() => {\n walletRef.current = wallet;\n }, [wallet]);\n\n const refreshWalletAvailability = async (options?: ConnectOptions) => {\n const ready =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n return ready.refreshWalletAvailability(options);\n };\n\n return {\n walletAvailability,\n refreshWalletAvailability,\n hasPasskey: walletAvailability.hasPasskey,\n hasWalletAccount: walletAvailability.hasWalletAccount,\n isAuthorized: walletAvailability.isAuthorized,\n isWalletAvailabilityLoading: walletAvailability.status === 'checking',\n accounts: walletAvailability.accounts,\n selectedAccount: walletAvailability.selectedAccount,\n error: walletAvailability.error,\n };\n}\n","import { useEffect, useRef } from 'react';\nimport type { WalletAccount } from \"../../../interfaces\";\nimport { useThru } from './useThru';\n\nexport interface UseAccountsOptions {\n /** Fired whenever the active account flips (initial pick or switch). */\n onAccountSelect?: (account: WalletAccount) => void;\n}\n\n/**\n * useAccounts - mirror of @thru/wallet/react's useAccounts. Subscribes to\n * `selectedAccount` flips and invokes the consumer's callback on real\n * changes (deduped against the previous address).\n */\nexport function useAccounts({ onAccountSelect }: UseAccountsOptions = {}) {\n const { accounts, selectedAccount, isConnected, isConnecting } = useThru();\n const lastSeen = useRef<string | null>(null);\n\n useEffect(() => {\n if (!selectedAccount) {\n lastSeen.current = null;\n return;\n }\n if (lastSeen.current === selectedAccount.address) return;\n lastSeen.current = selectedAccount.address;\n onAccountSelect?.(selectedAccount);\n }, [selectedAccount, onAccountSelect]);\n\n return {\n accounts,\n selectedAccount,\n isConnected,\n isConnecting,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/interfaces/accounts.ts","../../src/interfaces/types.ts","../../src/protocol/postMessage.ts","../../src/protocol/walletState.ts","../../src/encoding.ts","../../src/signing-sessions.ts","../../src/native/provider/chains/ThruChain.ts","../../src/native/provider/WebViewBridge.ts","../../src/native/provider/NativeProvider.ts","../../src/native/NativeSDK.ts","../../src/native/react/ThruContext.ts","../../src/native/react/ThruProvider.tsx","../../src/native/provider/shell.ts","../../src/native/react/hooks/useThru.ts","../../src/native/react/android-webauthn.ts","../../src/native/react/ThruWalletSheet.tsx","../../src/native/react/ThruTransparentWalletBridge.tsx","../../src/native/react/hooks/waitForWallet.ts","../../src/native/react/hooks/useWallet.ts","../../src/native/react/hooks/useWalletAvailability.ts","../../src/native/react/hooks/useAccounts.ts"],"names":["CHECKING_WALLET_AVAILABILITY","Platform","ThruWalletSheet","useState","useCallback","useEffect","ref","jsx","useContext","useRef","useMemo","View","styles","WebView","StyleSheet"],"mappings":"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","file":"react.js","sourcesContent":["import type { WalletAccount } from \"./types\";\n\nexport interface ActiveWalletAccounts {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\nexport type WalletAccountResult<T> = Omit<T, \"accounts\" | \"selectedAccount\"> & {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n};\n\nexport function resolveSelectedWalletAccount(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): WalletAccount | null {\n if (selectedAccount) {\n return (\n accounts.find((account) => account.address === selectedAccount.address) ??\n selectedAccount\n );\n }\n\n return accounts[0] ?? null;\n}\n\nexport function resolveWalletAccountByAddress(\n accounts: WalletAccount[],\n address?: string | null,\n): WalletAccount | null {\n if (!address) return null;\n return accounts.find((account) => account.address === address) ?? null;\n}\n\nexport function normalizeActiveWalletAccounts(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n): ActiveWalletAccounts {\n const activeAccount = resolveSelectedWalletAccount(accounts, selectedAccount);\n return {\n accounts: activeAccount ? [activeAccount] : [],\n selectedAccount: activeAccount,\n };\n}\n\nexport function normalizeWalletAccountResult<\n T extends { accounts: WalletAccount[]; selectedAccount?: WalletAccount | null },\n>(\n result: T,\n selectedAccount?: WalletAccount | null,\n): WalletAccountResult<T> {\n const active = normalizeActiveWalletAccounts(\n result.accounts,\n selectedAccount ?? result.selectedAccount ?? null,\n );\n return {\n ...result,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n };\n}\n","export const AddressType = {\n THRU: \"thru\",\n} as const;\n\nexport type AddressType = (typeof AddressType)[keyof typeof AddressType];\n\nexport interface WalletAccount {\n accountType: AddressType;\n address: string;\n label: string;\n}\n\nexport interface AppMetadata {\n appId: string;\n appName: string;\n appUrl: string;\n imageUrl?: string;\n}\n\nexport interface ConnectResult {\n walletId?: string;\n accounts: WalletAccount[];\n selectedAccount?: WalletAccount | null;\n status?: \"pending\" | \"completed\";\n metadata?: AppMetadata;\n}\n\nexport const ThruTransactionEncoding = {\n SIGNING_PAYLOAD_BASE64: \"signing_payload_base64\",\n RAW_TRANSACTION_BASE64: \"raw_transaction_base64\",\n} as const;\n\nexport type ThruTransactionEncoding =\n (typeof ThruTransactionEncoding)[keyof typeof ThruTransactionEncoding];\n\nexport interface ThruSigningContext {\n mode: \"managed_fee_payer\";\n selectedAccountPublicKey: string | null;\n feePayerPublicKey: string;\n signerPublicKey: string;\n acceptedInputEncodings: ThruTransactionEncoding[];\n outputEncoding: typeof ThruTransactionEncoding.RAW_TRANSACTION_BASE64;\n}\n\nexport interface ThruTransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface ThruTransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface ThruTransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: ThruTransactionReviewSimulation;\n abiReflection?: ThruTransactionReviewAbiReflection;\n}\n\nexport type ThruSigningSessionTimestamp = Date | number | bigint | string;\n\nexport interface ThruSigningSessionCreateOptions {\n walletAddress?: string;\n durationSeconds?: number;\n expiresAt?: ThruSigningSessionTimestamp;\n review?: ThruTransactionReviewPayload;\n}\n\nexport interface ThruSigningSessionInstructionCreateOptions extends Omit<\n ThruSigningSessionCreateOptions,\n \"review\"\n> {\n walletAccountIdx: number;\n}\n\nexport interface ThruSigningSessionDescriptor {\n id: string;\n walletAddress: string;\n publicKey: string;\n authIdx: number;\n expiresAt: number;\n createdAt: number;\n}\n\nexport interface ThruSigningSession extends ThruSigningSessionDescriptor {\n signTransaction(transaction: ThruTransactionIntent): Promise<string>;\n revoke(): Promise<void>;\n toJSON(): ThruSigningSessionDescriptor;\n}\n\nexport interface ThruSigningSessionInstruction {\n session: ThruSigningSession;\n programAddress: string;\n instructionData: Uint8Array;\n}\n\nexport interface ThruTransactionIntent {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: ThruTransactionReviewPayload;\n /** @internal Used by ThruSigningSession handles. */\n signingSessionId?: string;\n}\n\nexport interface ThruPasskeyChallengeIntent {\n /** base64url-encoded passkey-manager challenge bytes. */\n challenge: string;\n walletAddress?: string;\n}\n\nexport interface ThruPasskeyChallengeSignature {\n signatureR: string;\n signatureS: string;\n authenticatorData: string;\n clientDataJSON: string;\n}\n\nexport interface ConnectedApp {\n accountId: number;\n appId: string;\n origin: string;\n metadata: AppMetadata;\n connectedAt: number;\n updatedAt: number;\n}\n\nexport interface SignMessageParams {\n message: string | Uint8Array;\n networkId: string;\n}\n\nexport interface SignMessageResult {\n signature: Uint8Array;\n publicKey: string;\n}\n","import type {\n AppMetadata,\n ConnectResult,\n ThruSigningContext,\n WalletAccount,\n} from \"../interfaces\";\n\nexport const POST_MESSAGE_REQUEST_TYPES = {\n CONNECT: \"connect\",\n CREATE_ACCOUNT: \"createAccount\",\n DISCONNECT: \"disconnect\",\n SIGN_MESSAGE: \"signMessage\",\n SIGN_TRANSACTION: \"signTransaction\",\n SIGN_PASSKEY_CHALLENGE: \"signPasskeyChallenge\",\n GET_ACCOUNTS: \"getAccounts\",\n GET_CONNECTION_STATE: \"getConnectionState\",\n GET_SIGNING_CONTEXT: \"getSigningContext\",\n SELECT_ACCOUNT: \"selectAccount\",\n MANAGE_ACCOUNTS: \"manageAccounts\",\n CREATE_SIGNING_SESSION: \"createSigningSession\",\n CREATE_SIGNING_SESSION_INSTRUCTION: \"createSigningSessionInstruction\",\n CONFIRM_SIGNING_SESSION: \"confirmSigningSession\",\n REVOKE_SIGNING_SESSION: \"revokeSigningSession\",\n} as const;\n\nexport type RequestType =\n (typeof POST_MESSAGE_REQUEST_TYPES)[keyof typeof POST_MESSAGE_REQUEST_TYPES];\n\nexport const EMBEDDED_PROVIDER_EVENTS = {\n CONNECT_START: \"connect_start\",\n CONNECT: \"connect\",\n DISCONNECT: \"disconnect\",\n CONNECT_ERROR: \"connect_error\",\n ERROR: \"error\",\n LOCK: \"lock\",\n UI_SHOW: \"ui_show\",\n ACCOUNT_CHANGED: \"account_changed\",\n} as const;\n\nexport type EmbeddedProviderEvent =\n (typeof EMBEDDED_PROVIDER_EVENTS)[keyof typeof EMBEDDED_PROVIDER_EVENTS];\n\nexport const POST_MESSAGE_EVENT_TYPE = \"event\" as const;\n\nexport const IFRAME_READY_EVENT = \"iframe:ready\" as const;\n\nexport const DEFAULT_IFRAME_URL = \"http://localhost:3010/embedded\";\n\nconst REQUEST_ID_PREFIX = \"req\";\n\nexport const createRequestId = (prefix: string = REQUEST_ID_PREFIX): string => {\n const random = Math.random().toString(36).slice(2, 11);\n return `${prefix}_${Date.now()}_${random}`;\n};\n\ninterface BaseRequest {\n id: string;\n origin: string;\n}\n\nexport interface ConnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.CONNECT;\n payload: ConnectRequestPayload;\n}\n\nexport interface DisconnectRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.DISCONNECT;\n payload?: undefined;\n}\n\nexport interface CreateAccountRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.CREATE_ACCOUNT;\n payload: CreateAccountPayload;\n}\n\nexport interface SignMessageRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE;\n payload: SignMessagePayload;\n}\n\nexport interface SignTransactionRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION;\n payload: SignTransactionPayload;\n}\n\nexport interface SignPasskeyChallengeRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SIGN_PASSKEY_CHALLENGE;\n payload: SignPasskeyChallengePayload;\n}\n\nexport interface GetAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS;\n payload?: undefined;\n}\n\nexport interface GetConnectionStateRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE;\n payload: ConnectRequestPayload;\n}\n\nexport interface GetSigningContextRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT;\n payload?: undefined;\n}\n\nexport interface SelectAccountRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT;\n payload: SelectAccountPayload;\n}\n\nexport interface ManageAccountsRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS;\n payload?: undefined;\n}\n\nexport interface CreateSigningSessionRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.CREATE_SIGNING_SESSION;\n payload: CreateSigningSessionPayload;\n}\n\nexport interface CreateSigningSessionInstructionRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.CREATE_SIGNING_SESSION_INSTRUCTION;\n payload: CreateSigningSessionInstructionPayload;\n}\n\nexport interface ConfirmSigningSessionRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.CONFIRM_SIGNING_SESSION;\n payload: ConfirmSigningSessionPayload;\n}\n\nexport interface RevokeSigningSessionRequestMessage extends BaseRequest {\n type: typeof POST_MESSAGE_REQUEST_TYPES.REVOKE_SIGNING_SESSION;\n payload: RevokeSigningSessionPayload;\n}\n\nexport type PostMessageRequest =\n | ConnectRequestMessage\n | CreateAccountRequestMessage\n | DisconnectRequestMessage\n | SignMessageRequestMessage\n | SignTransactionRequestMessage\n | SignPasskeyChallengeRequestMessage\n | GetAccountsRequestMessage\n | GetConnectionStateRequestMessage\n | GetSigningContextRequestMessage\n | SelectAccountRequestMessage\n | ManageAccountsRequestMessage\n | CreateSigningSessionRequestMessage\n | CreateSigningSessionInstructionRequestMessage\n | ConfirmSigningSessionRequestMessage\n | RevokeSigningSessionRequestMessage;\n\nexport interface DisconnectResult {\n // Empty object keeps compatibility with existing consumers expecting a success payload\n}\n\nexport interface CreateAccountPayload {\n accountName?: string;\n metadata?: ConnectMetadataInput;\n}\n\nexport interface CreateAccountResult {\n account: WalletAccount;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount;\n signature: string | null;\n vmError: string | null;\n userErrorCode: string | null;\n executionResult: string | null;\n}\n\nexport interface GetAccountsResult {\n accounts: WalletAccount[];\n}\n\nexport interface GetConnectionStateResult {\n isAuthorized: boolean;\n isConnected: boolean;\n isUnlocked: boolean;\n hasPasskey: boolean;\n hasWalletAccount: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n metadata: AppMetadata | null;\n}\n\nexport interface SelectAccountPayload {\n publicKey: string;\n}\n\nexport interface SelectAccountResult {\n account: WalletAccount;\n}\n\nexport interface ManageAccountsResult {\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n}\n\ntype RequestResultMap = {\n [POST_MESSAGE_REQUEST_TYPES.CONNECT]: ConnectResult;\n [POST_MESSAGE_REQUEST_TYPES.CREATE_ACCOUNT]: CreateAccountResult;\n [POST_MESSAGE_REQUEST_TYPES.DISCONNECT]: DisconnectResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE]: SignMessageResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION]: SignTransactionResult;\n [POST_MESSAGE_REQUEST_TYPES.SIGN_PASSKEY_CHALLENGE]: SignPasskeyChallengeResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_ACCOUNTS]: GetAccountsResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE]: GetConnectionStateResult;\n [POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT]: GetSigningContextResult;\n [POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT]: SelectAccountResult;\n [POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS]: ManageAccountsResult;\n [POST_MESSAGE_REQUEST_TYPES.CREATE_SIGNING_SESSION]: CreateSigningSessionResult;\n [POST_MESSAGE_REQUEST_TYPES.CREATE_SIGNING_SESSION_INSTRUCTION]: CreateSigningSessionInstructionResult;\n [POST_MESSAGE_REQUEST_TYPES.CONFIRM_SIGNING_SESSION]: ConfirmSigningSessionResult;\n [POST_MESSAGE_REQUEST_TYPES.REVOKE_SIGNING_SESSION]: RevokeSigningSessionResult;\n};\n\ninterface ResponseErrorPayload {\n code: ErrorCode;\n message: string;\n data?: unknown;\n}\n\ntype SuccessResponse<TType extends RequestType> = {\n id: string;\n success: true;\n result: RequestResultMap[TType];\n};\n\ntype ErrorResponse = {\n id: string;\n success: false;\n error: ResponseErrorPayload;\n};\n\nexport type PostMessageResponse<TType extends RequestType = RequestType> =\n | SuccessResponse<TType>\n | ErrorResponse;\n\nexport type SuccessfulPostMessageResponse<\n TType extends RequestType = RequestType,\n> = Extract<PostMessageResponse<TType>, { success: true }>;\n\nexport type InferPostMessageResponse<TRequest extends PostMessageRequest> =\n PostMessageResponse<TRequest[\"type\"]>;\n\nexport type InferSuccessfulPostMessageResponse<\n TRequest extends PostMessageRequest,\n> = SuccessfulPostMessageResponse<TRequest[\"type\"]>;\n\nexport interface PostMessageEvent<\n TEvent extends EmbeddedProviderEvent = EmbeddedProviderEvent,\n TData = any,\n> {\n type: typeof POST_MESSAGE_EVENT_TYPE;\n event: TEvent;\n data?: TData;\n}\n\nexport const ErrorCode = {\n USER_REJECTED: \"USER_REJECTED\",\n WALLET_LOCKED: \"WALLET_LOCKED\",\n INVALID_PASSWORD: \"INVALID_PASSWORD\",\n ALREADY_CONNECTED: \"ALREADY_CONNECTED\",\n ACCOUNT_NOT_FOUND: \"ACCOUNT_NOT_FOUND\",\n ACCOUNT_CHANGED: \"ACCOUNT_CHANGED\",\n INVALID_TRANSACTION: \"INVALID_TRANSACTION\",\n TRANSACTION_FAILED: \"TRANSACTION_FAILED\",\n INSUFFICIENT_FUNDS: \"INSUFFICIENT_FUNDS\",\n NETWORK_ERROR: \"NETWORK_ERROR\",\n TIMEOUT: \"TIMEOUT\",\n UNKNOWN_ERROR: \"UNKNOWN_ERROR\",\n} as const;\n\nexport type ErrorCode = (typeof ErrorCode)[keyof typeof ErrorCode];\n\nexport type ConnectMetadataInput = Partial<AppMetadata>;\n\nexport type ConnectIntent = \"default\" | \"switch-account\";\n\nexport interface ConnectRequestPayload {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectIntent;\n}\n\nexport type { AppMetadata, ConnectResult };\n\nexport interface SignMessagePayload {\n message: string | number[];\n accountIndex?: number;\n}\n\nexport interface SignMessageResult {\n signature: number[];\n publicKey: string;\n}\n\n/**\n * Wallet-managed instruction signing intent.\n *\n * Dapps provide the instruction data and account context. The wallet owns\n * signing strategy details such as passkey validation, fee payer choice,\n * account ordering, headers, nonces, and final wire layout. Review metadata\n * is treated as untrusted display-only data.\n */\nexport interface SignTransactionPayload {\n walletAddress?: string;\n programAddress: string;\n instructionData: string;\n readWriteAddresses?: string[];\n readOnlyAddresses?: string[];\n review?: TransactionReviewPayload;\n signingSessionId?: string;\n}\n\nexport interface SignTransactionResult {\n signedTransaction: string;\n}\n\nexport interface SignPasskeyChallengePayload {\n /** base64url-encoded challenge bytes from a backend passkey-manager flow. */\n challenge: string;\n /** Optional expected wallet address for the selected transparent account. */\n walletAddress?: string;\n}\n\nexport interface SignPasskeyChallengeResult {\n signatureR: string;\n signatureS: string;\n authenticatorData: string;\n clientDataJSON: string;\n}\n\nexport interface CreateSigningSessionPayload {\n walletAddress?: string;\n expiresAt: string;\n review?: TransactionReviewPayload;\n}\n\nexport interface CreateSigningSessionInstructionPayload {\n walletAddress?: string;\n expiresAt: string;\n walletAccountIdx: number;\n}\n\nexport interface SigningSessionDescriptorPayload {\n id: string;\n walletAddress: string;\n publicKey: string;\n authIdx: number;\n expiresAt: string;\n createdAt: string;\n}\n\nexport interface CreateSigningSessionResult {\n session: SigningSessionDescriptorPayload;\n}\n\nexport interface CreateSigningSessionInstructionResult {\n session: SigningSessionDescriptorPayload;\n programAddress: string;\n instructionData: string;\n}\n\nexport interface ConfirmSigningSessionPayload {\n sessionId: string;\n}\n\nexport interface ConfirmSigningSessionResult {\n session: SigningSessionDescriptorPayload;\n}\n\nexport interface RevokeSigningSessionPayload {\n sessionId: string;\n}\n\nexport interface RevokeSigningSessionResult {\n // Empty object keeps compatibility with existing consumers expecting a success payload\n}\n\nexport interface TransactionReviewSimulation {\n before?: string;\n after?: string;\n}\n\nexport interface TransactionReviewAbiReflection {\n label?: string;\n kind?: string | null;\n typeName?: string;\n value?: unknown;\n rawHex?: string;\n source?: string;\n error?: string;\n}\n\nexport interface TransactionReviewPayload {\n appName?: string;\n programAddress?: string;\n abiName?: string;\n instruction?: string;\n simulation?: TransactionReviewSimulation;\n abiReflection?: TransactionReviewAbiReflection;\n}\n\nexport interface GetSigningContextResult {\n signingContext: ThruSigningContext;\n}\n","import { normalizeWalletAccountResult } from \"../interfaces\";\nimport type { GetConnectionStateResult } from \"./postMessage\";\n\nexport function normalizeConnectionStateResult(\n result: GetConnectionStateResult,\n): GetConnectionStateResult {\n if (!result.isAuthorized || !result.hasPasskey) {\n return { ...result, accounts: [], selectedAccount: null };\n }\n\n return normalizeWalletAccountResult(result);\n}\n","const BASE64_ALPHABET = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nconst BASE64_LOOKUP = new Map<string, number>(\n [...BASE64_ALPHABET].map((char, index) => [char, index]),\n);\n\nexport function base64ToBytes(value: string): Uint8Array {\n const normalized = value.replace(/\\s+/g, \"\");\n if (normalized.length === 0) return new Uint8Array();\n if (normalized.length % 4 === 1) {\n throw new Error(\"Invalid base64 data\");\n }\n\n const padded = normalized.padEnd(\n normalized.length + ((4 - (normalized.length % 4)) % 4),\n \"=\",\n );\n const padding = padded.endsWith(\"==\") ? 2 : padded.endsWith(\"=\") ? 1 : 0;\n const output = new Uint8Array((padded.length / 4) * 3 - padding);\n let outIdx = 0;\n\n for (let i = 0; i < padded.length; i += 4) {\n const chars = padded.slice(i, i + 4);\n const a = BASE64_LOOKUP.get(chars[0]);\n const b = BASE64_LOOKUP.get(chars[1]);\n const c = chars[2] === \"=\" ? 0 : BASE64_LOOKUP.get(chars[2]);\n const d = chars[3] === \"=\" ? 0 : BASE64_LOOKUP.get(chars[3]);\n if (a === undefined || b === undefined || c === undefined || d === undefined) {\n throw new Error(\"Invalid base64 data\");\n }\n\n const chunk = (a << 18) | (b << 12) | (c << 6) | d;\n if (outIdx < output.length) output[outIdx++] = (chunk >> 16) & 0xff;\n if (outIdx < output.length) output[outIdx++] = (chunk >> 8) & 0xff;\n if (outIdx < output.length) output[outIdx++] = chunk & 0xff;\n }\n\n return output;\n}\n","import type {\n ThruSigningSessionCreateOptions,\n ThruSigningSessionDescriptor,\n ThruSigningSessionTimestamp,\n} from \"./interfaces\";\n\nexport interface SigningSessionStorage {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<void>;\n removeItem: (key: string) => void | Promise<void>;\n}\n\ninterface SigningSessionStorePayload {\n version: 1;\n sessions: ThruSigningSessionDescriptor[];\n}\n\nconst STORAGE_VERSION = 1;\nconst KEY_PREFIX = \"thru.wallet.signing-sessions.v1\";\n\nfunction encodeKeyPart(input: string): string {\n return encodeURIComponent(input).replace(/[!'()*]/g, (char) =>\n `%${char.charCodeAt(0).toString(16).toUpperCase()}`,\n );\n}\n\nfunction nowSeconds(): number {\n return Math.floor(Date.now() / 1000);\n}\n\nexport function resolveSigningSessionStorageKey(params: {\n walletOrigin: string;\n appOrigin: string;\n storageKey?: string;\n}): string {\n if (params.storageKey) return params.storageKey;\n return `${KEY_PREFIX}:${encodeKeyPart(params.walletOrigin)}:${encodeKeyPart(params.appOrigin)}`;\n}\n\nexport function getDefaultBrowserSigningSessionStorage(): SigningSessionStorage | null {\n if (typeof window === \"undefined\") return null;\n try {\n return window.localStorage ?? null;\n } catch {\n return null;\n }\n}\n\nexport function normalizeExpiresAt(\n value: ThruSigningSessionTimestamp,\n label = \"expiresAt\",\n): number {\n if (value instanceof Date) {\n const millis = value.getTime();\n if (!Number.isFinite(millis)) throw new Error(`${label} must be a valid Date`);\n return Math.floor(millis / 1000);\n }\n\n if (typeof value === \"bigint\") {\n if (value < 0n || value > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new Error(`${label} must fit in a JavaScript safe integer`);\n }\n return Number(value);\n }\n\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!/^\\d+$/.test(trimmed)) {\n throw new Error(`${label} must be a Unix timestamp in seconds`);\n }\n return normalizeExpiresAt(BigInt(trimmed), label);\n }\n\n if (!Number.isFinite(value) || value < 0) {\n throw new Error(`${label} must be a finite positive Unix timestamp`);\n }\n return Math.floor(value);\n}\n\nexport function resolveSessionExpirySeconds(\n options: ThruSigningSessionCreateOptions,\n): number {\n const hasDuration = options.durationSeconds !== undefined;\n const hasExpiresAt = options.expiresAt !== undefined;\n if (hasDuration === hasExpiresAt) {\n throw new Error(\"Provide exactly one of durationSeconds or expiresAt\");\n }\n\n if (hasDuration) {\n const duration = options.durationSeconds;\n if (\n typeof duration !== \"number\" ||\n !Number.isFinite(duration) ||\n duration <= 0\n ) {\n throw new Error(\"durationSeconds must be a positive number\");\n }\n return nowSeconds() + Math.floor(duration);\n }\n\n return normalizeExpiresAt(options.expiresAt!, \"expiresAt\");\n}\n\nexport function assertSigningSessionWalletAccountIdx(walletAccountIdx: number): void {\n if (!Number.isInteger(walletAccountIdx) || walletAccountIdx < 2 || walletAccountIdx > 0xffff) {\n throw new Error(\"walletAccountIdx must be an account index between 2 and 65535\");\n }\n}\n\nfunction normalizeDescriptor(\n descriptor: ThruSigningSessionDescriptor,\n): ThruSigningSessionDescriptor {\n return {\n id: descriptor.id,\n walletAddress: descriptor.walletAddress,\n publicKey: descriptor.publicKey,\n authIdx: Number(descriptor.authIdx),\n expiresAt: normalizeExpiresAt(descriptor.expiresAt, \"descriptor.expiresAt\"),\n createdAt: normalizeExpiresAt(descriptor.createdAt, \"descriptor.createdAt\"),\n };\n}\n\nfunction isActive(descriptor: ThruSigningSessionDescriptor): boolean {\n return nowSeconds() < descriptor.expiresAt;\n}\n\nexport class SigningSessionDescriptorStore {\n private readonly storage: SigningSessionStorage;\n private readonly key: string;\n\n constructor(storage: SigningSessionStorage, key: string) {\n this.storage = storage;\n this.key = key;\n }\n\n async list(): Promise<ThruSigningSessionDescriptor[]> {\n const sessions = await this.read();\n const active = sessions.filter(isActive);\n if (active.length !== sessions.length) {\n await this.write(active);\n }\n return active;\n }\n\n async get(id: string): Promise<ThruSigningSessionDescriptor | null> {\n const sessions = await this.list();\n return sessions.find((session) => session.id === id) ?? null;\n }\n\n async save(descriptor: ThruSigningSessionDescriptor): Promise<void> {\n const normalized = normalizeDescriptor(descriptor);\n const sessions = (await this.list()).filter((session) => session.id !== normalized.id);\n sessions.push(normalized);\n await this.write(sessions);\n }\n\n async saveReplacingWalletSessions(\n descriptor: ThruSigningSessionDescriptor,\n ): Promise<void> {\n const normalized = normalizeDescriptor(descriptor);\n const sessions = (await this.list()).filter(\n (session) =>\n session.id === normalized.id ||\n session.walletAddress !== normalized.walletAddress,\n );\n const withoutCurrent = sessions.filter((session) => session.id !== normalized.id);\n withoutCurrent.push(normalized);\n await this.write(withoutCurrent);\n }\n\n async remove(id: string): Promise<void> {\n const sessions = (await this.list()).filter((session) => session.id !== id);\n if (sessions.length === 0) {\n await this.storage.removeItem(this.key);\n return;\n }\n await this.write(sessions);\n }\n\n private async read(): Promise<ThruSigningSessionDescriptor[]> {\n const raw = await this.storage.getItem(this.key);\n if (!raw) return [];\n\n try {\n const parsed = JSON.parse(raw) as Partial<SigningSessionStorePayload>;\n if (parsed.version !== STORAGE_VERSION || !Array.isArray(parsed.sessions)) {\n await this.storage.removeItem(this.key);\n return [];\n }\n return parsed.sessions.map(normalizeDescriptor);\n } catch {\n await this.storage.removeItem(this.key);\n return [];\n }\n }\n\n private async write(sessions: ThruSigningSessionDescriptor[]): Promise<void> {\n const payload: SigningSessionStorePayload = {\n version: STORAGE_VERSION,\n sessions: sessions.map(normalizeDescriptor),\n };\n await this.storage.setItem(this.key, JSON.stringify(payload));\n }\n}\n","import {\n AddressType,\n type IThruChain,\n type ThruSigningContext,\n type ThruSigningSession,\n type ThruSigningSessionCreateOptions,\n type ThruSigningSessionDescriptor,\n type ThruSigningSessionInstruction,\n type ThruSigningSessionInstructionCreateOptions,\n type ThruPasskeyChallengeIntent,\n type ThruPasskeyChallengeSignature,\n type ThruTransactionIntent,\n} from \"../../../interfaces\";\nimport { POST_MESSAGE_REQUEST_TYPES, createRequestId } from \"../../../protocol\";\nimport { base64ToBytes } from \"../../../encoding\";\nimport type { NativeProvider } from \"../NativeProvider\";\nimport type { WebViewBridge } from \"../WebViewBridge\";\nimport {\n SigningSessionDescriptorStore,\n assertSigningSessionWalletAccountIdx,\n resolveSessionExpirySeconds,\n} from \"../../../signing-sessions\";\n\nfunction descriptorFromWire(session: {\n id: string;\n walletAddress: string;\n publicKey: string;\n authIdx: number;\n expiresAt: string;\n createdAt: string;\n}): ThruSigningSessionDescriptor {\n return {\n id: session.id,\n walletAddress: session.walletAddress,\n publicKey: session.publicKey,\n authIdx: session.authIdx,\n expiresAt: Number(BigInt(session.expiresAt)),\n createdAt: Number(BigInt(session.createdAt)),\n };\n}\n\n/**\n * NativeThruChain - mirror of EmbeddedThruChain over the WebView bridge.\n * Sign moments toggle the host bottom sheet via provider.requestShow /\n * requestHide instead of iframe.show / hide.\n */\nexport class NativeThruChain implements IThruChain {\n private readonly bridge: WebViewBridge;\n private readonly provider: NativeProvider;\n private readonly origin: string;\n private readonly signingSessions?: SigningSessionDescriptorStore;\n\n constructor(\n bridge: WebViewBridge,\n provider: NativeProvider,\n origin: string,\n signingSessions?: SigningSessionDescriptorStore,\n ) {\n this.bridge = bridge;\n this.provider = provider;\n this.origin = origin;\n this.signingSessions = signingSessions;\n }\n\n get connected(): boolean {\n return this.provider.isConnected();\n }\n\n async connect(): Promise<{ publicKey: string }> {\n const result = await this.provider.connect();\n const selectedAccount = result.selectedAccount;\n const thruAccount =\n selectedAccount?.accountType === AddressType.THRU\n ? selectedAccount\n : result.accounts.find((addr) => addr.accountType === AddressType.THRU);\n if (!thruAccount) {\n throw new Error(\"Thru address not found in connection result\");\n }\n return { publicKey: thruAccount.address };\n }\n\n async disconnect(): Promise<void> {\n await this.provider.disconnect();\n }\n\n async getSigningContext(): Promise<ThruSigningContext> {\n if (!this.provider.isConnected() && !this.provider.isTransparent()) {\n throw new Error(\"Wallet not connected\");\n }\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.GET_SIGNING_CONTEXT,\n origin: this.origin,\n });\n return response.result.signingContext;\n }\n\n async signTransaction(transaction: ThruTransactionIntent): Promise<string> {\n const signingSessionId = transaction.signingSessionId;\n if (\n !signingSessionId &&\n !this.provider.isConnected() &&\n !this.provider.isTransparent()\n ) {\n throw new Error(\"Wallet not connected\");\n }\n\n const session = signingSessionId\n ? await this.requireSigningSession(signingSessionId)\n : null;\n const shouldShowWallet = !signingSessionId;\n if (shouldShowWallet) {\n await this.provider.requestShow();\n }\n try {\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n payload: {\n walletAddress: transaction.walletAddress ?? session?.walletAddress,\n programAddress: transaction.programAddress,\n instructionData: transaction.instructionData,\n readWriteAddresses: transaction.readWriteAddresses,\n readOnlyAddresses: transaction.readOnlyAddresses,\n review: transaction.review,\n signingSessionId,\n },\n origin: this.origin,\n });\n return response.result.signedTransaction;\n } finally {\n if (shouldShowWallet) {\n this.provider.requestHide();\n }\n }\n }\n\n async signPasskeyChallenge(\n challenge: ThruPasskeyChallengeIntent,\n ): Promise<ThruPasskeyChallengeSignature> {\n if (!this.provider.isConnected() && !this.provider.isTransparent()) {\n throw new Error(\"Wallet not connected\");\n }\n await this.provider.requestShow();\n try {\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SIGN_PASSKEY_CHALLENGE,\n payload: {\n challenge: challenge.challenge,\n walletAddress: challenge.walletAddress,\n },\n origin: this.origin,\n });\n return response.result;\n } finally {\n this.provider.requestHide();\n }\n }\n\n async createSigningSession(\n options: ThruSigningSessionCreateOptions,\n ): Promise<ThruSigningSession> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n if (!this.signingSessions) {\n throw new Error(\"NativeSDKStorage is required for signing sessions\");\n }\n\n const expiresAt = resolveSessionExpirySeconds(options);\n await this.provider.requestShow();\n try {\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.CREATE_SIGNING_SESSION,\n payload: {\n walletAddress: options.walletAddress,\n expiresAt: String(expiresAt),\n review: options.review,\n },\n origin: this.origin,\n });\n const descriptor = descriptorFromWire(response.result.session);\n await this.signingSessions.saveReplacingWalletSessions(descriptor);\n return this.toSigningSession(descriptor);\n } finally {\n this.provider.requestHide();\n }\n }\n\n async createSigningSessionInstruction(\n options: ThruSigningSessionInstructionCreateOptions,\n ): Promise<ThruSigningSessionInstruction> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n if (!this.signingSessions) {\n throw new Error(\"NativeSDKStorage is required for signing sessions\");\n }\n\n const expiresAt = resolveSessionExpirySeconds(options);\n assertSigningSessionWalletAccountIdx(options.walletAccountIdx);\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.CREATE_SIGNING_SESSION_INSTRUCTION,\n payload: {\n walletAddress: options.walletAddress,\n expiresAt: String(expiresAt),\n walletAccountIdx: options.walletAccountIdx,\n },\n origin: this.origin,\n });\n const descriptor = descriptorFromWire(response.result.session);\n return {\n session: this.toSigningSession(descriptor),\n programAddress: response.result.programAddress,\n instructionData: base64ToBytes(response.result.instructionData),\n };\n }\n\n async confirmSigningSession(id: string): Promise<ThruSigningSession> {\n if (!this.provider.isConnected()) {\n throw new Error(\"Wallet not connected\");\n }\n if (!this.signingSessions) {\n throw new Error(\"NativeSDKStorage is required for signing sessions\");\n }\n\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.CONFIRM_SIGNING_SESSION,\n payload: { sessionId: id },\n origin: this.origin,\n });\n const descriptor = descriptorFromWire(response.result.session);\n await this.signingSessions.saveReplacingWalletSessions(descriptor);\n return this.toSigningSession(descriptor);\n }\n\n async getSigningSession(id: string): Promise<ThruSigningSession | null> {\n if (!this.signingSessions) return null;\n const descriptor = await this.signingSessions.get(id);\n return descriptor ? this.toSigningSession(descriptor) : null;\n }\n\n async getSigningSessions(): Promise<ThruSigningSession[]> {\n if (!this.signingSessions) return [];\n return (await this.signingSessions.list()).map((descriptor) =>\n this.toSigningSession(descriptor),\n );\n }\n\n async revokeSigningSession(id: string): Promise<void> {\n try {\n await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.REVOKE_SIGNING_SESSION,\n payload: { sessionId: id },\n origin: this.origin,\n });\n } finally {\n await this.signingSessions?.remove(id);\n }\n }\n\n private async requireSigningSession(\n id: string,\n ): Promise<ThruSigningSessionDescriptor> {\n if (!this.signingSessions) {\n throw new Error(\"NativeSDKStorage is required for signing sessions\");\n }\n const session = await this.signingSessions.get(id);\n if (!session) {\n throw new Error(\"Signing session is not known to this app\");\n }\n return session;\n }\n\n private toSigningSession(\n descriptor: ThruSigningSessionDescriptor,\n ): ThruSigningSession {\n return {\n ...descriptor,\n signTransaction: (transaction) =>\n this.signTransaction({\n ...transaction,\n walletAddress: transaction.walletAddress ?? descriptor.walletAddress,\n signingSessionId: descriptor.id,\n }),\n revoke: () => this.revokeSigningSession(descriptor.id),\n toJSON: () => ({ ...descriptor }),\n };\n }\n}\n","import {\n ErrorCode,\n IFRAME_READY_EVENT,\n POST_MESSAGE_EVENT_TYPE,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n type InferSuccessfulPostMessageResponse,\n type PostMessageEvent,\n type PostMessageRequest,\n type PostMessageResponse,\n} from \"../../protocol\";\n\n/* RN-side analog of `web/packages/embedded-provider/src/IframeManager.ts`.\n The wallet ships unchanged. The shell HTML (src/shell.html) hosts an\n <iframe src=\"wallet.thru.org/embedded/native\"> and forwards\n iframe<->ReactNativeWebView postMessage traffic. This bridge only\n speaks the RN side: webView.injectJavaScript out, onMessage in. */\n\nconst PRODUCTION_WALLET_ORIGINS = [\n 'https://wallet.thru.org',\n 'https://wallet.tid.sh',\n];\n\nfunction isDevelopmentBuild(): boolean {\n const runtime = globalThis as typeof globalThis & {\n __DEV__?: boolean;\n process?: { env?: { NODE_ENV?: string } };\n };\n\n const devFlag = runtime.__DEV__;\n if (typeof devFlag === 'boolean') return devFlag;\n\n return (\n runtime.process?.env?.NODE_ENV !== undefined &&\n runtime.process.env.NODE_ENV !== 'production'\n );\n}\n\nfunction isPrivateIpv4Host(hostname: string): boolean {\n const parts = hostname.split('.').map((part) => Number(part));\n if (\n parts.length !== 4 ||\n parts.some((part) => !Number.isInteger(part) || part < 0 || part > 255)\n ) {\n return false;\n }\n\n const [a, b] = parts;\n return (\n a === 10 ||\n a === 127 ||\n (a === 172 && b >= 16 && b <= 31) ||\n (a === 192 && b === 168) ||\n (a === 100 && b >= 64 && b <= 127)\n );\n}\n\nfunction isAllowedDevelopmentOrigin(url: URL): boolean {\n if (!isDevelopmentBuild()) return false;\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false;\n\n const hostname = url.hostname.toLowerCase();\n return (\n hostname === 'localhost' ||\n hostname === '::1' ||\n !hostname.includes('.') ||\n hostname.endsWith('.local') ||\n hostname.endsWith('.ts.net') ||\n isPrivateIpv4Host(hostname)\n );\n}\n\nfunction validateWalletOrigin(walletUrl: string): void {\n let url: URL;\n try {\n url = new URL(walletUrl);\n } catch {\n throw new Error(\n `Invalid wallet URL: ${walletUrl}. URL must be a valid absolute URL.`\n );\n }\n const origin = url.origin;\n const isAllowed =\n PRODUCTION_WALLET_ORIGINS.includes(origin) ||\n isAllowedDevelopmentOrigin(url);\n if (!isAllowed) {\n throw new Error(\n `Untrusted wallet origin: ${origin}. Only trusted origins are allowed: ${PRODUCTION_WALLET_ORIGINS.join(', ')}. ` +\n 'Development builds also allow localhost, LAN, and Tailscale wallet origins.'\n );\n }\n}\n\nfunction isNativeEmbeddedWalletPath(pathname: string): boolean {\n const normalized = pathname.replace(/\\/+$/, '') || '/';\n return normalized === '/embedded/native' || normalized.startsWith('/embedded/native/');\n}\n\n/* Minimal contract for a react-native-webview ref. We accept both refs\n ({ current: WebView }) and direct WebView instances. */\nexport interface WebViewRefLike {\n injectJavaScript: (script: string) => void;\n}\n\nexport interface WebViewMessageEventLike {\n nativeEvent: { data: string };\n}\n\nconst READY_TIMEOUT_MS = 10_000;\nconst SLOW_REQUEST_TIMEOUT_MS = 5 * 60 * 1000;\nconst FAST_REQUEST_TIMEOUT_MS = 30 * 1000;\n\nconst SLOW_REQUEST_TYPES: ReadonlySet<string> = new Set([\n POST_MESSAGE_REQUEST_TYPES.CONNECT,\n POST_MESSAGE_REQUEST_TYPES.CREATE_ACCOUNT,\n POST_MESSAGE_REQUEST_TYPES.SIGN_MESSAGE,\n POST_MESSAGE_REQUEST_TYPES.SIGN_TRANSACTION,\n POST_MESSAGE_REQUEST_TYPES.SIGN_PASSKEY_CHALLENGE,\n POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n POST_MESSAGE_REQUEST_TYPES.CREATE_SIGNING_SESSION,\n POST_MESSAGE_REQUEST_TYPES.CREATE_SIGNING_SESSION_INSTRUCTION,\n POST_MESSAGE_REQUEST_TYPES.CONFIRM_SIGNING_SESSION,\n]);\n\nexport interface WebViewBridgeOptions {\n walletUrl: string;\n}\n\n/**\n * Bidirectional bridge between a host React Native app and the wallet\n * iframe running inside a `react-native-webview`. Mirrors the public\n * surface of `IframeManager` minus DOM-only concerns (visibility\n * styling lives with the host bottom sheet). All other invariants -\n * frameId correlation, IFRAME_READY handshake, request/response\n * routing, timeouts - match the iframe implementation exactly.\n */\nexport class WebViewBridge {\n readonly walletUrl: string;\n readonly walletOrigin: string;\n readonly frameId: string;\n\n private webView: WebViewRefLike | null = null;\n private ready = false;\n private readyPromise: Promise<void> | null = null;\n private resolveReady: (() => void) | null = null;\n private rejectReady: ((err: Error) => void) | null = null;\n private readyTimer: ReturnType<typeof setTimeout> | null = null;\n\n private messageHandlers = new Map<\n string,\n (response: PostMessageResponse) => void\n >();\n\n /* Event broadcasts from the iframe (type === 'event'). */\n public onEvent?: (eventType: string, payload: unknown) => void;\n\n constructor(options: WebViewBridgeOptions) {\n validateWalletOrigin(options.walletUrl);\n this.walletUrl = options.walletUrl;\n this.walletOrigin = new URL(options.walletUrl).origin;\n this.frameId = createRequestId('frame');\n }\n\n /**\n * Compose the URL to load inside the shell <iframe>. The host\n * (ThruWalletSheet) calls this when building the shell HTML.\n */\n getIframeSrc(): string {\n const url = new URL(this.walletUrl);\n if (!isNativeEmbeddedWalletPath(url.pathname)) {\n url.pathname = `${url.pathname.replace(/\\/$/, '')}/native`;\n }\n url.searchParams.set('tn_frame_id', this.frameId);\n return url.toString();\n }\n\n /**\n * Hand the bridge a WebView ref. Required before `awaitReady()` /\n * `sendMessage()` will resolve.\n */\n attachWebView(ref: WebViewRefLike): void {\n this.webView = ref;\n }\n\n /**\n * Mark the bridge ready when the native host loads the wallet as the\n * top-level WebView document instead of through the shell iframe.\n */\n markReady(): void {\n if (this.ready) return;\n this.ready = true;\n if (this.readyTimer) clearTimeout(this.readyTimer);\n this.readyTimer = null;\n const r = this.resolveReady;\n this.resolveReady = null;\n this.rejectReady = null;\n r?.();\n }\n\n /**\n * Returns a promise that resolves when the iframe sends\n * IFRAME_READY_EVENT. Idempotent: returns the same promise on\n * subsequent calls. Rejects after READY_TIMEOUT_MS.\n */\n awaitReady(): Promise<void> {\n if (this.ready) return Promise.resolve();\n if (this.readyPromise) return this.readyPromise;\n this.readyPromise = new Promise<void>((resolve, reject) => {\n this.resolveReady = resolve;\n this.rejectReady = reject;\n this.readyTimer = setTimeout(() => {\n this.readyTimer = null;\n if (this.rejectReady) {\n const r = this.rejectReady;\n this.rejectReady = null;\n this.resolveReady = null;\n r(new Error('WebView ready timeout - wallet failed to load'));\n }\n }, READY_TIMEOUT_MS);\n });\n return this.readyPromise;\n }\n\n /**\n * Send a request to the iframe (via injectJavaScript -> shell ->\n * iframe.postMessage) and resolve with the matching response.\n */\n async sendMessage<TRequest extends PostMessageRequest>(\n request: TRequest\n ): Promise<InferSuccessfulPostMessageResponse<TRequest>> {\n await this.awaitReady();\n if (!this.webView) {\n throw new Error('WebView not attached - call attachWebView() first');\n }\n\n const timeoutMs = SLOW_REQUEST_TYPES.has(request.type)\n ? SLOW_REQUEST_TIMEOUT_MS\n : FAST_REQUEST_TIMEOUT_MS;\n\n return new Promise((resolve, reject) => {\n const timer = setTimeout(() => {\n this.messageHandlers.delete(request.id);\n reject(new Error('Request timeout - wallet did not respond'));\n }, timeoutMs);\n\n this.messageHandlers.set(request.id, (response) => {\n clearTimeout(timer);\n this.messageHandlers.delete(request.id);\n if (response.success) {\n resolve(\n response as InferSuccessfulPostMessageResponse<TRequest>\n );\n } else {\n const err = new Error(response.error?.message || 'Unknown error');\n (err as { code?: string; data?: unknown }).code = response.error?.code;\n (err as { code?: string; data?: unknown }).data = response.error?.data;\n reject(err);\n }\n });\n\n const script = `try {\n var msg = ${JSON.stringify({ ...request, frameId: this.frameId })};\n if (window.__pushIn) {\n window.__pushIn(msg);\n } else {\n window.postMessage(msg, window.location.origin);\n }\n } catch (e) {} ; true;`;\n this.webView!.injectJavaScript(script);\n });\n }\n\n /**\n * Reject all in-flight wallet requests when the native host dismisses the\n * WebView without waiting for a wallet-side response.\n */\n rejectPendingRequests(message = 'User rejected the request'): void {\n for (const [id, handler] of Array.from(this.messageHandlers.entries())) {\n handler({\n id,\n success: false,\n error: {\n code: ErrorCode.USER_REJECTED,\n message,\n },\n });\n }\n }\n\n /**\n * Hook this into <WebView onMessage>. The shell forwards iframe\n * postMessage payloads to ReactNativeWebView; we route them here.\n */\n onMessage(event: WebViewMessageEventLike): void {\n let data: unknown;\n try {\n data = JSON.parse(event.nativeEvent.data);\n } catch {\n return;\n }\n if (!data || typeof data !== 'object') return;\n const msg = data as Record<string, unknown>;\n\n /* Frame-id check matches the iframe model: ignore traffic that\n isn't tagged for this bridge instance. */\n if (msg.frameId !== this.frameId) return;\n\n if (msg.type === IFRAME_READY_EVENT) {\n this.markReady();\n return;\n }\n\n /* Response to a specific request (has `id`). */\n if (typeof msg.id === 'string' && this.messageHandlers.has(msg.id)) {\n const handler = this.messageHandlers.get(msg.id)!;\n handler(msg as unknown as PostMessageResponse);\n return;\n }\n\n /* Event broadcast (no id). */\n if (msg.type === POST_MESSAGE_EVENT_TYPE) {\n const evt = msg as unknown as PostMessageEvent;\n this.onEvent?.(evt.event, evt.data);\n }\n }\n\n /**\n * Drop pending handlers and clear ready promise. Call when the host\n * unmounts the WebView.\n */\n destroy(): void {\n if (this.readyTimer) {\n clearTimeout(this.readyTimer);\n this.readyTimer = null;\n }\n if (this.rejectReady && this.readyPromise) {\n /* Attach a swallow handler so Node doesn't flag the rejection as\n unhandled if the host wasn't awaiting it at destroy time. */\n this.readyPromise.catch(() => {});\n this.rejectReady(new Error('Bridge destroyed'));\n }\n this.resolveReady = null;\n this.rejectReady = null;\n this.readyPromise = null;\n this.ready = false;\n this.messageHandlers.clear();\n this.webView = null;\n }\n}\n","import {\n AddressType,\n normalizeWalletAccountResult,\n resolveWalletAccountByAddress,\n type AddressType as AddressTypeValue,\n type ConnectResult,\n type IThruChain,\n type WalletAccount,\n} from \"../../interfaces\";\nimport {\n EMBEDDED_PROVIDER_EVENTS,\n POST_MESSAGE_REQUEST_TYPES,\n createRequestId,\n type ConnectMetadataInput,\n type ConnectRequestPayload,\n type CreateAccountPayload,\n type CreateAccountResult,\n type EmbeddedProviderEvent,\n type GetConnectionStateResult,\n type ManageAccountsResult,\n type SelectAccountPayload,\n normalizeConnectionStateResult,\n} from \"../../protocol\";\nimport { NativeThruChain } from \"./chains/ThruChain\";\nimport type { SigningSessionDescriptorStore } from \"../../signing-sessions\";\nimport {\n WebViewBridge,\n type WebViewMessageEventLike,\n type WebViewRefLike,\n} from \"./WebViewBridge\";\n\nconst DEFAULT_WALLET_URL = \"https://wallet.thru.org/embedded/native\";\nconst DEFAULT_ORIGIN = \"thru-mobile://app\";\nconst TRANSPARENT_FOCUS_SETTLE_MS = 500;\n\nexport interface NativeProviderConfig {\n /** wallet.thru.org/embedded/native URL to load. */\n walletUrl?: string;\n /** Standard bottom-sheet wallet or transparent auto-signing wallet. */\n walletExperience?: \"standard\" | \"transparent\";\n /** Caller-supplied dapp origin. Stamped on every postMessage so\n wallet's ConnectedAppsStorage can scope per-host. */\n origin?: string;\n /** Default app metadata used by trusted transparent requests. */\n metadata?: ConnectMetadataInput;\n addressTypes?: AddressTypeValue[];\n signingSessions?: SigningSessionDescriptorStore;\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectRequestPayload[\"intent\"];\n}\n\nexport interface CreateAccountOptions {\n accountName?: string;\n metadata?: ConnectMetadataInput;\n}\n\nexport type NativeProviderEvent = EmbeddedProviderEvent;\nexport type NativeProviderEventCallback = (data?: unknown) => void;\n\n/**\n * RN-side analog of `web/packages/embedded-provider/src/EmbeddedProvider.ts`.\n * Same public surface (connect/disconnect/sign/getAccounts/etc.) over a\n * WebView+iframe bridge instead of a same-origin iframe. Visibility is\n * delegated to the host (ThruWalletSheet) via `requestShow` /\n * `requestHide` callbacks - bottom sheet logic stays in the React layer.\n */\nexport class NativeProvider {\n private readonly bridge: WebViewBridge;\n private readonly origin: string;\n private readonly transparent: boolean;\n private _thruChain?: IThruChain;\n private connected = false;\n private accounts: WalletAccount[] = [];\n private selectedAccount: WalletAccount | null = null;\n private isSurfaceShown = false;\n private readonly eventListeners = new Map<\n string,\n Set<NativeProviderEventCallback>\n >();\n\n /** Set by the host bottom sheet to react to UI_SHOW / completion. */\n public onShowRequested?: () => void;\n public onHideRequested?: () => void;\n\n constructor(config: NativeProviderConfig = {}) {\n const walletUrl = config.walletUrl ?? DEFAULT_WALLET_URL;\n this.origin = config.origin ?? DEFAULT_ORIGIN;\n this.transparent = config.walletExperience === \"transparent\";\n this.bridge = new WebViewBridge({ walletUrl });\n\n this.bridge.onEvent = (eventType, payload) => {\n if (this.transparent && eventType === EMBEDDED_PROVIDER_EVENTS.UI_SHOW) {\n return;\n }\n\n this.emit(eventType as NativeProviderEvent, payload);\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.UI_SHOW) {\n this.requestShow();\n return;\n }\n\n if (\n eventType === EMBEDDED_PROVIDER_EVENTS.DISCONNECT ||\n eventType === EMBEDDED_PROVIDER_EVENTS.LOCK\n ) {\n this.clearConnection();\n this.requestHide();\n return;\n }\n\n if (eventType === EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED) {\n const account =\n (payload as { account?: WalletAccount } | null | undefined)\n ?.account ?? null;\n this.refreshAccountCache(account);\n }\n };\n\n const addressTypes = config.addressTypes ?? [AddressType.THRU];\n if (addressTypes.includes(AddressType.THRU)) {\n this._thruChain = new NativeThruChain(\n this.bridge,\n this,\n this.origin,\n config.signingSessions,\n );\n }\n }\n\n /** Hand the bridge a WebView ref. Required before connect/sign. */\n attachWebView(ref: WebViewRefLike): void {\n this.bridge.attachWebView(ref);\n }\n\n /** Mark a direct top-level WebView wallet document as ready. */\n markWebViewReady(): void {\n this.bridge.markReady();\n }\n\n /** Pass through the WebView's `onMessage` event handler. */\n onMessage = (event: WebViewMessageEventLike): void => {\n this.bridge.onMessage(event);\n };\n\n /** Build the URL to load inside the shell <iframe>. The host shell\n template should substitute this for WALLET_URL_PLACEHOLDER. */\n getIframeSrc(): string {\n return this.bridge.getIframeSrc();\n }\n\n /** Wallet origin (e.g. https://wallet.thru.org). The shell template\n should substitute this for WALLET_ORIGIN_PLACEHOLDER. */\n getWalletOrigin(): string {\n return this.bridge.walletOrigin;\n }\n\n /** Wait for the iframe's IFRAME_READY_EVENT handshake. */\n async initialize(): Promise<void> {\n await this.bridge.awaitReady();\n }\n\n /** Open or focus the wallet host surface. Transparent hosts use this\n to give WKWebView a focused document for WebAuthn without showing\n wallet UI. */\n async requestShow(): Promise<void> {\n if (this.transparent) {\n if (!this.isSurfaceShown) {\n this.isSurfaceShown = true;\n this.onShowRequested?.();\n }\n await new Promise((resolve) =>\n setTimeout(resolve, TRANSPARENT_FOCUS_SETTLE_MS),\n );\n return;\n }\n if (this.isSurfaceShown) return;\n this.isSurfaceShown = true;\n this.onShowRequested?.();\n }\n\n /** Close the wallet UI (called internally; also exposed for host). */\n requestHide(): void {\n this.isSurfaceShown = false;\n this.onHideRequested?.();\n }\n\n /** Reject pending requests after a user-driven native sheet dismiss. */\n rejectPendingRequests(message?: string): void {\n this.bridge.rejectPendingRequests(message);\n }\n\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_START, {});\n try {\n await this.requestShow();\n const payload: ConnectRequestPayload = {};\n if (options?.metadata) payload.metadata = options.metadata;\n if (options?.preferredAccountAddress) {\n payload.preferredAccountAddress = options.preferredAccountAddress;\n }\n if (options?.intent) payload.intent = options.intent;\n\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.CONNECT,\n payload,\n origin: this.origin,\n });\n\n const result = normalizeWalletAccountResult(response.result);\n if (!result.selectedAccount) {\n throw new Error(\"Wallet did not return an account\");\n }\n this.connected = true;\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT, result);\n this.requestHide();\n return result;\n } catch (error) {\n this.requestHide();\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT_ERROR, { error });\n throw error;\n }\n }\n\n async createAccount(\n options?: CreateAccountOptions,\n ): Promise<CreateAccountResult> {\n try {\n await this.requestShow();\n const payload: CreateAccountPayload = {};\n if (options?.accountName) payload.accountName = options.accountName;\n if (options?.metadata) payload.metadata = options.metadata;\n\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.CREATE_ACCOUNT,\n payload,\n origin: this.origin,\n });\n\n const normalized = normalizeWalletAccountResult(\n response.result,\n response.result.selectedAccount ?? response.result.account,\n );\n const selectedAccount =\n normalized.selectedAccount ?? response.result.account;\n if (!selectedAccount) {\n throw new Error(\"Wallet did not return a created account\");\n }\n const result: CreateAccountResult = {\n ...response.result,\n accounts: normalized.accounts,\n selectedAccount,\n account: selectedAccount,\n };\n this.connected = true;\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n\n this.emit(EMBEDDED_PROVIDER_EVENTS.CONNECT, {\n accounts: result.accounts,\n selectedAccount: result.selectedAccount,\n status: \"completed\",\n metadata: options?.metadata,\n });\n this.emit(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, {\n account: result.selectedAccount,\n });\n this.requestHide();\n return result;\n } catch (error) {\n this.requestHide();\n this.emit(EMBEDDED_PROVIDER_EVENTS.ERROR, { error });\n throw error;\n }\n }\n\n async getConnectionState(\n options?: ConnectOptions,\n ): Promise<GetConnectionStateResult> {\n const payload: ConnectRequestPayload = {};\n if (options?.metadata) payload.metadata = options.metadata;\n if (options?.preferredAccountAddress) {\n payload.preferredAccountAddress = options.preferredAccountAddress;\n }\n\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.GET_CONNECTION_STATE,\n payload,\n origin: this.origin,\n });\n\n const result = normalizeConnectionStateResult(response.result);\n\n if (\n result.isAuthorized &&\n result.hasPasskey &&\n result.accounts.length > 0\n ) {\n this.hydrateConnection(\n {\n accounts: result.accounts,\n status: \"completed\",\n metadata: result.metadata ?? undefined,\n selectedAccount: result.selectedAccount,\n },\n result.selectedAccount?.address ?? null,\n );\n } else {\n this.clearConnection();\n }\n\n return result;\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.DISCONNECT,\n origin: this.origin,\n });\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, {});\n } catch (error) {\n this.clearConnection();\n this.emit(EMBEDDED_PROVIDER_EVENTS.ERROR, { error });\n throw error;\n } finally {\n this.requestHide();\n }\n }\n\n isConnected(): boolean {\n return this.connected;\n }\n\n isTransparent(): boolean {\n return this.transparent;\n }\n\n hydrateConnection(\n result: ConnectResult,\n selectedAccountAddress?: string | null,\n ): void {\n const selectedAccount =\n resolveWalletAccountByAddress(result.accounts, selectedAccountAddress) ??\n result.selectedAccount ??\n null;\n const normalized = normalizeWalletAccountResult(result, selectedAccount);\n this.connected = true;\n this.accounts = normalized.accounts;\n this.selectedAccount = normalized.selectedAccount;\n }\n\n clearConnection(): void {\n this.connected = false;\n this.accounts = [];\n this.selectedAccount = null;\n }\n\n getAccounts(): WalletAccount[] {\n return this.accounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.selectedAccount;\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n if (!this.connected) throw new Error(\"Wallet not connected\");\n const payload: SelectAccountPayload = { publicKey };\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.SELECT_ACCOUNT,\n payload,\n origin: this.origin,\n });\n const account = response.result.account;\n this.refreshAccountCache(account);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n if (!this.connected) throw new Error(\"Wallet not connected\");\n try {\n await this.requestShow();\n const response = await this.bridge.sendMessage({\n id: createRequestId(),\n type: POST_MESSAGE_REQUEST_TYPES.MANAGE_ACCOUNTS,\n origin: this.origin,\n });\n\n const result = normalizeWalletAccountResult(response.result);\n this.accounts = result.accounts;\n this.selectedAccount = result.selectedAccount;\n this.requestHide();\n return result;\n } catch (error) {\n this.requestHide();\n this.emit(EMBEDDED_PROVIDER_EVENTS.ERROR, { error });\n throw error;\n }\n }\n\n get thru(): IThruChain {\n if (!this._thruChain) {\n throw new Error(\"Thru chain not enabled in provider config\");\n }\n return this._thruChain;\n }\n\n on(event: NativeProviderEvent, cb: NativeProviderEventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(cb);\n }\n\n off(event: NativeProviderEvent, cb: NativeProviderEventCallback): void {\n this.eventListeners.get(event)?.delete(cb);\n }\n\n /** Internal: used by NativeThruChain. */\n getBridge(): WebViewBridge {\n return this.bridge;\n }\n\n destroy(): void {\n this.bridge.destroy();\n this.eventListeners.clear();\n this.clearConnection();\n }\n\n private emit(event: NativeProviderEvent, data?: unknown): void {\n this.eventListeners.get(event)?.forEach((cb) => {\n try {\n cb(data);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[NativeProvider] listener error for ${event}:`, err);\n }\n });\n }\n\n private refreshAccountCache(account: WalletAccount | null): void {\n if (!account) {\n this.accounts = [];\n this.selectedAccount = null;\n return;\n }\n this.accounts = [account];\n this.selectedAccount = account;\n }\n}\n","import {\n AddressType,\n type AppMetadata,\n type AddressType as AddressTypeValue,\n type ConnectResult,\n type IThruChain,\n type WalletAccount,\n normalizeActiveWalletAccounts,\n normalizeWalletAccountResult,\n} from \"../interfaces\";\nimport {\n EMBEDDED_PROVIDER_EVENTS,\n ErrorCode,\n type ConnectMetadataInput,\n type ConnectRequestPayload,\n type CreateAccountResult,\n type GetConnectionStateResult,\n type ManageAccountsResult,\n normalizeConnectionStateResult,\n} from \"../protocol\";\nimport { NativeProvider } from \"./provider/NativeProvider\";\nimport type {\n WebViewMessageEventLike,\n WebViewRefLike,\n} from \"./provider/WebViewBridge\";\nimport { createThruClient, type Thru } from \"@thru/sdk/client\";\nimport {\n SigningSessionDescriptorStore,\n resolveSigningSessionStorageKey,\n} from \"../signing-sessions\";\n\nexport type IosWebViewMode = \"direct\" | \"shell-iframe\";\nexport type NativeWalletExperience = \"standard\" | \"transparent\";\n\nexport type WalletAvailability =\n | {\n status: \"checking\";\n isAuthorized: false;\n isConnected: false;\n isUnlocked: false;\n hasPasskey: false;\n hasWalletAccount: false;\n accounts: WalletAccount[];\n selectedAccount: null;\n metadata: null;\n error: null;\n }\n | {\n status: \"ready\";\n isAuthorized: boolean;\n isConnected: boolean;\n isUnlocked: boolean;\n hasPasskey: boolean;\n hasWalletAccount: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n metadata: AppMetadata | null;\n error: null;\n }\n | {\n status: \"error\";\n isAuthorized: false;\n isConnected: false;\n isUnlocked: false;\n hasPasskey: false;\n hasWalletAccount: false;\n accounts: WalletAccount[];\n selectedAccount: null;\n metadata: null;\n error: Error;\n };\n\nexport interface NativeSDKConfig {\n walletUrl?: string;\n /** Wallet presentation loaded in the native WebView. Transparent mode\n signs in without opening the native wallet sheet. */\n walletExperience?: NativeWalletExperience;\n /** Stamped on every postMessage so wallet's ConnectedAppsStorage can\n scope per-host. Default: 'thru-mobile://app'. */\n origin?: string;\n /** Default app metadata used for connection and transparent hydration. */\n metadata?: ConnectMetadataInput;\n rpcUrl?: string;\n addressTypes?: AddressTypeValue[];\n /** iOS-only host mode. Shell iframe is the default; direct is kept\n as an escape hatch for real-device passkey/WebAuthn comparisons. */\n iosWebViewMode?: IosWebViewMode;\n /** Optional host-provided persistent storage (SecureStore,\n AsyncStorage, localStorage-compatible adapter, etc.). */\n storage?: NativeSDKStorage;\n /** Override the legacy connection snapshot key cleared from `storage`. */\n storageKey?: string;\n /** Override the key used to remember the app-local selected account. */\n selectedAccountStorageKey?: string;\n /** Override the key used for app-local signing session descriptors. */\n signingSessionStorageKey?: string;\n}\n\nexport interface SignInOptions {\n app_id: string;\n app_display_name: string;\n app_url?: string;\n image_url?: string;\n intent?: ConnectOptions[\"intent\"];\n}\n\nexport interface ConnectOptions {\n metadata?: ConnectMetadataInput;\n preferredAccountAddress?: string;\n intent?: ConnectRequestPayload[\"intent\"];\n}\n\nexport interface CreateAccountOptions {\n accountName?: string;\n metadata?: ConnectMetadataInput;\n}\n\nexport interface RestoreConnectionOptions {\n hydrate?: boolean;\n}\n\nexport type SDKEvent =\n | \"connect\"\n | \"disconnect\"\n | \"lock\"\n | \"error\"\n | \"accountChanged\"\n | \"availabilityChanged\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type EventCallback = (...args: any[]) => void;\n\nexport interface NativeSDKStorage {\n getItem: (key: string) => string | null | Promise<string | null>;\n setItem: (key: string, value: string) => void | Promise<void>;\n removeItem: (key: string) => void | Promise<void>;\n}\n\nexport interface NativeSDKUiHandlers {\n onShowRequested?: () => void;\n onHideRequested?: () => void;\n}\n\nconst DEFAULT_STORAGE_KEY = \"thru.native-sdk.connection.v1\";\nconst SELECTED_ACCOUNT_STORAGE_KEY_SUFFIX = \".selected-account.v1\";\nconst SIGNING_SESSION_STORAGE_KEY_SUFFIX = \".signing-sessions.v1\";\nconst DEFAULT_NATIVE_WALLET_URL = \"https://wallet.thru.org/embedded/native\";\nconst DEFAULT_TRANSPARENT_WALLET_URL =\n \"https://wallet.thru.org/embedded/native/transparent\";\n\nconst CHECKING_WALLET_AVAILABILITY: WalletAvailability = {\n status: \"checking\",\n isAuthorized: false,\n isConnected: false,\n isUnlocked: false,\n hasPasskey: false,\n hasWalletAccount: false,\n accounts: [],\n selectedAccount: null,\n metadata: null,\n error: null,\n};\n\nfunction completeAppMetadata(\n metadata: ConnectMetadataInput | AppMetadata | null | undefined,\n): AppMetadata | undefined {\n if (!metadata?.appId || !metadata.appName || !metadata.appUrl) {\n return undefined;\n }\n return {\n appId: metadata.appId,\n appName: metadata.appName,\n appUrl: metadata.appUrl,\n ...(metadata.imageUrl ? { imageUrl: metadata.imageUrl } : {}),\n };\n}\n\ninterface PersistedSelectedAccountSnapshot {\n version: 1;\n origin: string;\n walletOrigin: string;\n savedAt: string;\n selectedAccountAddress: string;\n}\n\n/**\n * NativeSDK - mobile mirror of `@thru/wallet`'s `BrowserSDK`.\n * Public surface matches verbatim except `mountInline(HTMLElement)` is\n * replaced by `attachWebView(WebViewRefLike)` since the host bottom\n * sheet owns the WebView lifecycle.\n */\nexport class NativeSDK {\n private provider: NativeProvider;\n private eventListeners = new Map<SDKEvent, Set<EventCallback>>();\n private initialized = false;\n private thruClient: Thru | null = null;\n private rpcUrl: string | undefined;\n private connectInFlight: Promise<ConnectResult> | null = null;\n private lastConnectResult: ConnectResult | null = null;\n private walletAvailability: WalletAvailability = CHECKING_WALLET_AVAILABILITY;\n private readonly origin: string;\n private readonly storage?: NativeSDKStorage;\n private readonly storageKey: string;\n private readonly selectedAccountStorageKey: string;\n private readonly iosWebViewMode: IosWebViewMode;\n private readonly walletExperience: NativeWalletExperience;\n private readonly defaultMetadata?: ConnectMetadataInput;\n\n constructor(config: NativeSDKConfig = {}) {\n this.origin = config.origin ?? \"thru-mobile://app\";\n this.rpcUrl = config.rpcUrl;\n this.storage = config.storage;\n this.storageKey = config.storageKey ?? DEFAULT_STORAGE_KEY;\n this.selectedAccountStorageKey =\n config.selectedAccountStorageKey ??\n `${this.storageKey}${SELECTED_ACCOUNT_STORAGE_KEY_SUFFIX}`;\n this.iosWebViewMode = config.iosWebViewMode ?? \"shell-iframe\";\n this.walletExperience = config.walletExperience ?? \"standard\";\n this.defaultMetadata = config.metadata;\n const walletUrl =\n config.walletUrl ??\n (this.walletExperience === \"transparent\"\n ? DEFAULT_TRANSPARENT_WALLET_URL\n : DEFAULT_NATIVE_WALLET_URL);\n const walletOrigin = new URL(walletUrl).origin;\n const signingSessions = this.storage\n ? new SigningSessionDescriptorStore(\n this.storage,\n resolveSigningSessionStorageKey({\n walletOrigin,\n appOrigin: this.origin,\n storageKey:\n config.signingSessionStorageKey ??\n `${this.storageKey}${SIGNING_SESSION_STORAGE_KEY_SUFFIX}`,\n }),\n )\n : undefined;\n this.provider = new NativeProvider({\n walletUrl,\n origin: this.origin,\n metadata: this.defaultMetadata\n ? this.resolveMetadata(this.defaultMetadata)\n : undefined,\n addressTypes: config.addressTypes ?? [AddressType.THRU],\n signingSessions,\n walletExperience: this.walletExperience,\n });\n this.setupEventForwarding();\n }\n\n /** Hand the WebView ref to the underlying provider/bridge. */\n attachWebView(ref: WebViewRefLike): void {\n this.provider.attachWebView(ref);\n }\n\n /** Mark a direct top-level WebView wallet document as ready. */\n markWebViewReady(): void {\n this.provider.markWebViewReady();\n }\n\n /** Bind to the WebView's `onMessage` handler. */\n onMessage = (event: WebViewMessageEventLike): void => {\n this.provider.onMessage(event);\n };\n\n /** Build the URL to load inside the shell <iframe>. */\n getIframeSrc(): string {\n return this.provider.getIframeSrc();\n }\n\n /** Wallet origin (e.g. https://wallet.thru.org). */\n getWalletOrigin(): string {\n return this.provider.getWalletOrigin();\n }\n\n /** Bind host UI lifecycle handlers used by custom WebView hosts. */\n setUiHandlers(handlers: NativeSDKUiHandlers): void {\n this.provider.onShowRequested = handlers.onShowRequested;\n this.provider.onHideRequested = handlers.onHideRequested;\n }\n\n clearUiHandlers(): void {\n this.provider.onShowRequested = undefined;\n this.provider.onHideRequested = undefined;\n }\n\n /** Reject in-flight wallet requests after a user-driven host dismiss. */\n rejectPendingRequests(message?: string): void {\n this.provider.rejectPendingRequests(message);\n }\n\n /** iOS WebView host mode. Non-iOS hosts should ignore this value. */\n getIosWebViewMode(): IosWebViewMode {\n return this.iosWebViewMode;\n }\n\n async initialize(): Promise<void> {\n if (this.initialized) return;\n await this.provider.initialize();\n this.initialized = true;\n }\n\n async connect(options?: ConnectOptions): Promise<ConnectResult> {\n const isAccountSwitch = options?.intent === \"switch-account\";\n if (this.connectInFlight) return this.connectInFlight;\n if (\n !isAccountSwitch &&\n this.lastConnectResult &&\n this.provider.isConnected()\n ) {\n return this.lastConnectResult;\n }\n\n this.emit(\"connect\", { status: \"connecting\" });\n\n const inFlight = (async () => {\n try {\n await this.provider.requestShow();\n if (!this.initialized) await this.initialize();\n\n const metadata = this.resolveMetadata(options?.metadata);\n const preferredAccountAddress = isAccountSwitch\n ? null\n : options?.preferredAccountAddress ?? (await this.readSelectedAccountAddress());\n const providerOptions =\n metadata || preferredAccountAddress || options?.intent\n ? {\n ...(metadata ? { metadata } : {}),\n ...(preferredAccountAddress ? { preferredAccountAddress } : {}),\n ...(options?.intent ? { intent: options.intent } : {}),\n }\n : undefined;\n const result = await this.provider.connect(providerOptions);\n if (!isAccountSwitch) {\n await this.applyPreferredSelectedAccount(result.accounts);\n }\n const selectedAccount =\n this.provider.getSelectedAccount() ?? result.selectedAccount ?? null;\n const activeResult = normalizeWalletAccountResult(\n {\n ...result,\n accounts: this.provider.getAccounts(),\n selectedAccount,\n },\n selectedAccount,\n );\n this.lastConnectResult = activeResult;\n await this.persistSelectedAccountAddress(\n activeResult.selectedAccount?.address ?? null,\n );\n await this.clearPersistedConnection();\n this.setWalletAvailability(\n walletAvailabilityFromConnectResult(activeResult),\n );\n this.emit(\"connect\", activeResult);\n return activeResult;\n } catch (error) {\n this.provider.requestHide();\n if (isUserRejectedError(error) && !isAccountSwitch) {\n this.provider.clearConnection();\n this.lastConnectResult = null;\n await this.clearPersistedConnection();\n this.clearAuthorizedAvailability();\n this.emit(\"disconnect\", { reason: \"user_rejected\" });\n }\n this.emit(\"error\", error);\n throw error;\n } finally {\n this.connectInFlight = null;\n }\n })();\n\n this.connectInFlight = inFlight;\n return inFlight;\n }\n\n async signIn(options: SignInOptions): Promise<ConnectResult> {\n return this.connect({\n metadata: this.resolveSignInMetadata(options),\n ...(options.intent ? { intent: options.intent } : {}),\n });\n }\n\n async createAccount(\n options: CreateAccountOptions = {},\n ): Promise<CreateAccountResult> {\n this.emit(\"connect\", { status: \"connecting\" });\n\n try {\n await this.provider.requestShow();\n if (!this.initialized) await this.initialize();\n\n const metadata = this.resolveMetadata(options.metadata);\n const result = await this.provider.createAccount({\n ...(options.accountName ? { accountName: options.accountName } : {}),\n ...(metadata ? { metadata } : {}),\n });\n const selectedAccount = result.selectedAccount ?? result.account;\n const activeResult: CreateAccountResult = {\n ...result,\n accounts: this.provider.getAccounts(),\n selectedAccount,\n account: selectedAccount,\n };\n const completedResult: ConnectResult = {\n accounts: activeResult.accounts,\n selectedAccount: activeResult.selectedAccount,\n status: \"completed\",\n metadata: completeAppMetadata(metadata),\n };\n this.lastConnectResult = completedResult;\n await this.persistSelectedAccountAddress(\n activeResult.selectedAccount.address,\n );\n await this.clearPersistedConnection();\n this.setWalletAvailability(\n walletAvailabilityFromConnectResult(completedResult),\n );\n this.emit(\"connect\", completedResult);\n this.emit(\"accountChanged\", activeResult.selectedAccount);\n return activeResult;\n } catch (error) {\n this.provider.requestHide();\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n async disconnect(): Promise<void> {\n try {\n await this.provider.disconnect();\n this.emit(\"disconnect\", {});\n this.lastConnectResult = null;\n await this.persistSelectedAccountAddress(null);\n await this.clearPersistedConnection();\n this.clearAuthorizedAvailability();\n } catch (error) {\n this.emit(\"error\", error);\n throw error;\n }\n }\n\n isConnected(): boolean {\n return this.provider.isConnected();\n }\n\n getWalletAvailability(): WalletAvailability {\n return this.walletAvailability;\n }\n\n async restoreConnection(\n options: RestoreConnectionOptions = {},\n ): Promise<ConnectResult | null> {\n void options;\n await this.clearPersistedConnection();\n return null;\n }\n\n async syncConnectionState(\n options?: ConnectOptions,\n ): Promise<GetConnectionStateResult | null> {\n try {\n const state = await this.requestConnectionState(options);\n this.setWalletAvailability(walletAvailabilityFromConnectionState(state));\n await this.applyConnectionState(state);\n return state;\n } catch (error) {\n this.setWalletAvailability(walletAvailabilityFromError(error));\n this.emit(\"error\", error);\n return null;\n }\n }\n\n async refreshWalletAvailability(\n options?: ConnectOptions,\n ): Promise<WalletAvailability> {\n try {\n const state = await this.requestConnectionState(options);\n const availability = walletAvailabilityFromConnectionState(state);\n this.setWalletAvailability(availability);\n await this.applyConnectionState(state);\n return availability;\n } catch (error) {\n const availability = walletAvailabilityFromError(error);\n this.setWalletAvailability(availability);\n this.emit(\"error\", error);\n return availability;\n }\n }\n\n getAccounts(): WalletAccount[] {\n const accounts = this.provider.getAccounts();\n const activeAccounts = this.refreshCachedAccounts(\n accounts,\n this.provider.getSelectedAccount(),\n );\n return activeAccounts;\n }\n\n getSelectedAccount(): WalletAccount | null {\n return this.provider.getSelectedAccount();\n }\n\n async selectAccount(publicKey: string): Promise<WalletAccount> {\n const account = await this.provider.selectAccount(publicKey);\n this.refreshCachedAccounts(this.provider.getAccounts(), account);\n await this.persistSelectedAccountAddress(account.address);\n return account;\n }\n\n async manageAccounts(): Promise<ManageAccountsResult> {\n if (!this.initialized) await this.initialize();\n const result = await this.provider.manageAccounts();\n const activeResult = normalizeWalletAccountResult(result);\n const selectedAccount = activeResult.selectedAccount ?? null;\n this.refreshCachedAccounts(activeResult.accounts, selectedAccount);\n await this.persistSelectedAccountAddress(selectedAccount?.address ?? null);\n if (this.lastConnectResult) {\n this.setWalletAvailability(\n walletAvailabilityFromConnectResult(this.lastConnectResult),\n );\n }\n this.emit(\"accountChanged\", selectedAccount);\n return activeResult;\n }\n\n get thru(): IThruChain {\n return this.provider.thru;\n }\n\n on(event: SDKEvent, callback: EventCallback): void {\n if (!this.eventListeners.has(event)) {\n this.eventListeners.set(event, new Set());\n }\n this.eventListeners.get(event)!.add(callback);\n }\n\n off(event: SDKEvent, callback: EventCallback): void {\n this.eventListeners.get(event)?.delete(callback);\n }\n\n once(event: SDKEvent, callback: EventCallback): void {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const wrapped = (...args: any[]) => {\n callback(...args);\n this.off(event, wrapped);\n };\n this.on(event, wrapped);\n }\n\n destroy(): void {\n this.provider.destroy();\n this.eventListeners.clear();\n this.initialized = false;\n this.connectInFlight = null;\n this.lastConnectResult = null;\n this.walletAvailability = CHECKING_WALLET_AVAILABILITY;\n }\n\n /** Lazily-instantiated Thru chain client. */\n public getThru(): Thru {\n if (!this.thruClient) {\n this.thruClient = createThruClient({ baseUrl: this.rpcUrl });\n }\n return this.thruClient;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private emit(event: SDKEvent, data?: any): void {\n this.eventListeners.get(event)?.forEach((cb) => {\n try {\n cb(data);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error(`[NativeSDK] listener error for ${event}:`, err);\n }\n });\n }\n\n private setupEventForwarding(): void {\n /* CONNECT is emitted from connect() directly (with the resolved\n ConnectResult), so don't double-emit here. */\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.DISCONNECT, (data) => {\n this.lastConnectResult = null;\n this.clearAuthorizedAvailability();\n this.emit(\"disconnect\", data);\n });\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ERROR, (data) => {\n this.emit(\"error\", data);\n });\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.LOCK, (data) => {\n this.lastConnectResult = null;\n this.clearAuthorizedAvailability();\n this.emit(\"lock\", data);\n this.emit(\"disconnect\", { reason: \"locked\" });\n });\n this.provider.on(EMBEDDED_PROVIDER_EVENTS.ACCOUNT_CHANGED, (data) => {\n const payload = data as { account?: WalletAccount } | undefined;\n const account = payload?.account ?? null;\n this.refreshCachedAccounts(this.provider.getAccounts(), account);\n if (account) void this.persistSelectedAccountAddress(account.address);\n this.emit(\"accountChanged\", account);\n });\n }\n\n private async requestConnectionState(\n options?: ConnectOptions,\n ): Promise<GetConnectionStateResult> {\n if (!this.initialized) await this.initialize();\n\n const metadata =\n options?.metadata ??\n this.lastConnectResult?.metadata ??\n this.defaultMetadata ??\n undefined;\n const providerOptions = metadata\n ? { metadata: this.resolveMetadata(metadata) }\n : undefined;\n const preferredAccountAddress =\n options?.preferredAccountAddress ?? (await this.readSelectedAccountAddress());\n const nextProviderOptions =\n providerOptions || preferredAccountAddress\n ? {\n ...(providerOptions ?? {}),\n ...(preferredAccountAddress ? { preferredAccountAddress } : {}),\n }\n : undefined;\n const state = await this.provider.getConnectionState(nextProviderOptions);\n return normalizeConnectionStateResult(state);\n }\n\n private async applyConnectionState(\n state: GetConnectionStateResult,\n ): Promise<void> {\n if (state.isAuthorized && state.hasPasskey && state.accounts.length > 0) {\n const result: ConnectResult = {\n accounts: state.accounts,\n selectedAccount: state.selectedAccount,\n status: \"completed\",\n metadata: state.metadata ?? undefined,\n };\n const activeResult = normalizeWalletAccountResult(result);\n this.lastConnectResult = activeResult;\n await this.persistSelectedAccountAddress(\n this.provider.getSelectedAccount()?.address ??\n activeResult.selectedAccount?.address ??\n null,\n );\n await this.clearPersistedConnection();\n this.emit(\"connect\", activeResult);\n return;\n }\n\n const wasConnected =\n this.provider.isConnected() || !!this.lastConnectResult;\n this.provider.clearConnection();\n this.lastConnectResult = null;\n await this.clearPersistedConnection();\n if (wasConnected) {\n this.emit(\"disconnect\", { reason: \"state_unavailable\" });\n }\n }\n\n private setWalletAvailability(availability: WalletAvailability): void {\n this.walletAvailability = availability;\n this.emit(\"availabilityChanged\", availability);\n }\n\n private clearAuthorizedAvailability(): void {\n const previous =\n this.walletAvailability.status === \"ready\"\n ? this.walletAvailability\n : null;\n this.setWalletAvailability({\n status: \"ready\",\n isAuthorized: false,\n isConnected: false,\n isUnlocked: false,\n hasPasskey: previous?.hasPasskey ?? false,\n hasWalletAccount: previous?.hasWalletAccount ?? false,\n accounts: [],\n selectedAccount: null,\n metadata: null,\n error: null,\n });\n }\n\n private resolveMetadata(\n input?: ConnectMetadataInput,\n ): ConnectMetadataInput | undefined {\n const effectiveInput = input ?? this.defaultMetadata;\n if (!effectiveInput) {\n /* On RN we have no window.location.origin; require explicit\n metadata, but stamp the configured origin as appId so the\n wallet can scope per-host. */\n return { appId: this.origin };\n }\n const metadata: ConnectMetadataInput = {\n appId: effectiveInput.appId ?? this.origin,\n };\n if (effectiveInput.appUrl) metadata.appUrl = effectiveInput.appUrl;\n if (effectiveInput.appName) metadata.appName = effectiveInput.appName;\n if (effectiveInput.imageUrl) metadata.imageUrl = effectiveInput.imageUrl;\n return metadata;\n }\n\n private resolveSignInMetadata(options: SignInOptions): ConnectMetadataInput {\n const metadata: ConnectMetadataInput = {\n appId: options.app_id,\n appName: options.app_display_name,\n };\n if (options.app_url) metadata.appUrl = options.app_url;\n if (options.image_url) metadata.imageUrl = options.image_url;\n return metadata;\n }\n\n private refreshCachedAccounts(\n accounts: WalletAccount[],\n selectedAccount?: WalletAccount | null,\n ): WalletAccount[] {\n const active = normalizeActiveWalletAccounts(accounts, selectedAccount);\n const nextAccounts = active.accounts;\n const nextSelectedAccount = active.selectedAccount;\n if (this.lastConnectResult && this.provider.isConnected()) {\n this.lastConnectResult = {\n ...this.lastConnectResult,\n accounts: nextAccounts,\n selectedAccount: nextSelectedAccount,\n };\n if (nextSelectedAccount) {\n void this.persistSelectedAccountAddress(nextSelectedAccount.address);\n }\n }\n return nextAccounts;\n }\n\n private async applyPreferredSelectedAccount(\n accounts: WalletAccount[],\n ): Promise<void> {\n const preferredAddress = await this.readSelectedAccountAddress();\n if (!preferredAddress) return;\n if (!accounts.some((account) => account.address === preferredAddress)) {\n return;\n }\n if (this.provider.getSelectedAccount()?.address === preferredAddress) {\n return;\n }\n\n try {\n await this.provider.selectAccount(preferredAddress);\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to restore selected account:\", error);\n }\n }\n\n private async persistSelectedAccountAddress(\n selectedAccountAddress: string | null,\n ): Promise<void> {\n if (!this.storage) return;\n try {\n if (!selectedAccountAddress) {\n await this.storage.removeItem(this.selectedAccountStorageKey);\n return;\n }\n\n const snapshot: PersistedSelectedAccountSnapshot = {\n version: 1,\n origin: this.origin,\n walletOrigin: this.provider.getWalletOrigin(),\n savedAt: new Date().toISOString(),\n selectedAccountAddress,\n };\n await this.storage.setItem(\n this.selectedAccountStorageKey,\n JSON.stringify(snapshot),\n );\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to persist selected account:\", error);\n }\n }\n\n private async clearPersistedConnection(): Promise<void> {\n if (!this.storage) return;\n try {\n await this.storage.removeItem(this.storageKey);\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to clear connection state:\", error);\n }\n }\n\n private async readSelectedAccountAddress(): Promise<string | null> {\n if (!this.storage) return null;\n\n try {\n const raw = await this.storage.getItem(this.selectedAccountStorageKey);\n if (!raw) return null;\n\n const parsed = JSON.parse(\n raw,\n ) as Partial<PersistedSelectedAccountSnapshot>;\n if (\n parsed.version !== 1 ||\n parsed.origin !== this.origin ||\n parsed.walletOrigin !== this.provider.getWalletOrigin() ||\n typeof parsed.selectedAccountAddress !== \"string\" ||\n parsed.selectedAccountAddress.length === 0\n ) {\n await this.storage.removeItem(this.selectedAccountStorageKey);\n return null;\n }\n\n return parsed.selectedAccountAddress;\n } catch (error) {\n console.warn(\"[NativeSDK] Failed to restore selected account:\", error);\n try {\n await this.storage.removeItem(this.selectedAccountStorageKey);\n } catch {\n /* best effort */\n }\n return null;\n }\n }\n}\n\nfunction walletAvailabilityFromConnectResult(\n result: ConnectResult,\n selectedAccount?: WalletAccount | null,\n): WalletAvailability {\n const active = normalizeWalletAccountResult(result, selectedAccount ?? null);\n const hasActiveAccount = active.accounts.length > 0;\n return {\n status: \"ready\",\n isAuthorized: hasActiveAccount,\n isConnected: hasActiveAccount,\n isUnlocked: true,\n hasPasskey: hasActiveAccount,\n hasWalletAccount: hasActiveAccount,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n metadata: result.metadata ?? null,\n error: null,\n };\n}\n\nfunction walletAvailabilityFromConnectionState(\n state: GetConnectionStateResult,\n): WalletAvailability {\n const active = normalizeConnectionStateResult(state);\n const hasWalletAccount =\n (state as Partial<GetConnectionStateResult>).hasWalletAccount ??\n state.accounts.length > 0;\n return {\n status: \"ready\",\n isAuthorized: state.isAuthorized,\n isConnected: state.isAuthorized && state.isConnected,\n isUnlocked: state.isUnlocked,\n hasPasskey: state.hasPasskey,\n hasWalletAccount,\n accounts: active.accounts,\n selectedAccount: active.selectedAccount,\n metadata: state.isAuthorized ? state.metadata : null,\n error: null,\n };\n}\n\nfunction walletAvailabilityFromError(error: unknown): WalletAvailability {\n return {\n status: \"error\",\n isAuthorized: false,\n isConnected: false,\n isUnlocked: false,\n hasPasskey: false,\n hasWalletAccount: false,\n accounts: [],\n selectedAccount: null,\n metadata: null,\n error:\n error instanceof Error\n ? error\n : new Error(\"Wallet availability check failed\"),\n };\n}\n\nfunction isUserRejectedError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n return (error as { code?: unknown }).code === ErrorCode.USER_REJECTED;\n}\n","import { createContext } from 'react';\nimport type {\n CreateAccountOptions,\n NativeSDK,\n WalletAvailability,\n} from \"../NativeSDK\";\nimport type { WalletAccount } from \"../../interfaces\";\nimport type { CreateAccountResult, ManageAccountsResult } from \"../../protocol\";\n\nexport const CHECKING_WALLET_AVAILABILITY: WalletAvailability = {\n status: 'checking',\n isAuthorized: false,\n isConnected: false,\n isUnlocked: false,\n hasPasskey: false,\n hasWalletAccount: false,\n accounts: [],\n selectedAccount: null,\n metadata: null,\n error: null,\n};\n\nexport interface ThruContextValue {\n /** Initialized NativeSDK instance, or null while still constructing. */\n wallet: NativeSDK | null;\n /** Lazily-instantiated Thru chain client (cast at the call site). */\n thru: unknown;\n isConnected: boolean;\n isConnecting: boolean;\n accounts: WalletAccount[];\n selectedAccount: WalletAccount | null;\n walletAvailability: WalletAvailability;\n error: Error | null;\n selectAccount: (account: WalletAccount) => Promise<void>;\n createAccount: (options?: CreateAccountOptions) => Promise<CreateAccountResult>;\n manageAccounts: () => Promise<ManageAccountsResult>;\n}\n\nexport const ThruContext = createContext<ThruContextValue | null>(null);\n","/* React Native mirror of `@thru/wallet/react`'s ThruProvider. Owns the\n NativeSDK instance, mirrors its events into context state. The\n bottom sheet is a separate component (<ThruWalletSheet>) the host\n composes alongside this provider. */\n\nimport { type ReactNode, useCallback, useEffect, useState } from \"react\";\nimport {\n NativeSDK,\n type CreateAccountOptions,\n type NativeSDKConfig,\n type WalletAvailability,\n} from \"../NativeSDK\";\nimport type { WalletAccount } from \"../../interfaces\";\nimport type { CreateAccountResult } from \"../../protocol\";\nimport { CHECKING_WALLET_AVAILABILITY, ThruContext } from \"./ThruContext\";\n\nexport interface ThruProviderProps {\n children: ReactNode;\n config: NativeSDKConfig;\n}\n\nexport function ThruProvider({ children, config }: ThruProviderProps) {\n const [sdk, setSdk] = useState<NativeSDK | null>(null);\n const [thru, setThru] = useState<unknown>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [accounts, setAccounts] = useState<WalletAccount[]>([]);\n const [isConnecting, setIsConnecting] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [selectedAccount, setSelectedAccount] = useState<WalletAccount | null>(\n null,\n );\n const [walletAvailability, setWalletAvailability] =\n useState<WalletAvailability>(CHECKING_WALLET_AVAILABILITY);\n\n useEffect(() => {\n const sdkInstance = new NativeSDK(config);\n setSdk(sdkInstance);\n /* getThru() is lazy in NativeSDK; pull it eagerly so consumers see\n a stable reference. */\n setThru(sdkInstance.getThru());\n\n const updateAccountsFromSdk = () => setAccounts(sdkInstance.getAccounts());\n\n const updateSelectedAccount = (account?: WalletAccount | null) => {\n if (account) {\n setSelectedAccount(account);\n return;\n }\n const fallback =\n sdkInstance.getSelectedAccount() ??\n sdkInstance.getAccounts()[0] ??\n null;\n setSelectedAccount(fallback);\n };\n\n /* Initialization is lazy: NativeSDK.connect() will call initialize\n on demand. We don't pre-initialize because the bridge needs a\n WebView ref attached first by ThruWalletSheet. */\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleConnect = (result: any) => {\n if (result?.status === \"connecting\") {\n setIsConnecting(true);\n setError(null);\n return;\n }\n setIsConnected(true);\n updateAccountsFromSdk();\n setIsConnecting(false);\n setError(null);\n setWalletAvailability(sdkInstance.getWalletAvailability());\n updateSelectedAccount();\n };\n\n const resetData = () => {\n setIsConnected(false);\n setAccounts([]);\n setIsConnecting(false);\n setSelectedAccount(null);\n };\n\n const handleDisconnect = () => resetData();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handleError = (err: any) => {\n setError(err?.error ?? err ?? new Error(\"Unknown error\"));\n setIsConnecting(false);\n setWalletAvailability(sdkInstance.getWalletAvailability());\n };\n const handleLock = () => resetData();\n const handleAccountChanged = (\n account: WalletAccount | null | undefined,\n ) => {\n updateAccountsFromSdk();\n updateSelectedAccount(account ?? undefined);\n };\n const handleAvailabilityChanged = (availability: WalletAvailability) => {\n setWalletAvailability(availability);\n };\n sdkInstance.on(\"connect\", handleConnect);\n sdkInstance.on(\"disconnect\", handleDisconnect);\n sdkInstance.on(\"error\", handleError);\n sdkInstance.on(\"lock\", handleLock);\n sdkInstance.on(\"accountChanged\", handleAccountChanged);\n sdkInstance.on(\"availabilityChanged\", handleAvailabilityChanged);\n\n void sdkInstance.restoreConnection({ hydrate: false }).catch(handleError);\n\n return () => {\n sdkInstance.off(\"connect\", handleConnect);\n sdkInstance.off(\"disconnect\", handleDisconnect);\n sdkInstance.off(\"error\", handleError);\n sdkInstance.off(\"lock\", handleLock);\n sdkInstance.off(\"accountChanged\", handleAccountChanged);\n sdkInstance.off(\"availabilityChanged\", handleAvailabilityChanged);\n sdkInstance.destroy();\n };\n /* Empty deps: SDK is constructed once; config changes after mount\n are intentionally ignored to mirror @thru/wallet/react semantics. */\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const selectAccount = useCallback(\n async (account: WalletAccount) => {\n if (!sdk) throw new Error(\"NativeSDK not initialized\");\n try {\n const updated = await sdk.selectAccount(account.address);\n setSelectedAccount(updated);\n setAccounts([updated]);\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error(\"selectAccount failed\"),\n );\n throw err;\n }\n },\n [sdk],\n );\n\n const manageAccounts = useCallback(async () => {\n if (!sdk) throw new Error(\"NativeSDK not initialized\");\n try {\n const result = await sdk.manageAccounts();\n setSelectedAccount(result.selectedAccount);\n setAccounts(result.accounts);\n return result;\n } catch (err) {\n setError(err instanceof Error ? err : new Error(\"manageAccounts failed\"));\n throw err;\n }\n }, [sdk]);\n\n const createAccount = useCallback(\n async (options?: CreateAccountOptions): Promise<CreateAccountResult> => {\n if (!sdk) throw new Error(\"NativeSDK not initialized\");\n try {\n const result = await sdk.createAccount(options);\n setSelectedAccount(result.selectedAccount);\n setAccounts(result.accounts);\n setIsConnected(true);\n setIsConnecting(false);\n setWalletAvailability(sdk.getWalletAvailability());\n return result;\n } catch (err) {\n setError(\n err instanceof Error ? err : new Error(\"createAccount failed\"),\n );\n setIsConnecting(false);\n throw err;\n }\n },\n [sdk],\n );\n\n return (\n <ThruContext.Provider\n value={{\n thru,\n wallet: sdk,\n isConnected,\n accounts,\n isConnecting,\n error,\n selectedAccount,\n walletAvailability,\n selectAccount,\n createAccount,\n manageAccounts,\n }}\n >\n {children}\n </ThruContext.Provider>\n );\n}\n","const SHELL_HTML_TEMPLATE = String.raw`<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, viewport-fit=cover\" />\n <title>thru-shell</title>\n <style>\n html, body, iframe {\n margin: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n border: 0;\n background: transparent;\n }\n </style>\n</head>\n<body>\n <iframe\n id=\"w\"\n data-src=\"WALLET_URL_PLACEHOLDER\"\n allow=\"publickey-credentials-get *; publickey-credentials-create *\"\n ></iframe>\n <script>\n (function () {\n var f = document.getElementById('w');\n var ORIGIN = 'WALLET_ORIGIN_PLACEHOLDER';\n function frameId() {\n try {\n return new URL(f.dataset.src).searchParams.get('tn_frame_id');\n } catch (err) {\n return null;\n }\n }\n function postShell(type, data) {\n var rn = window.ReactNativeWebView;\n if (!rn || !rn.postMessage) return;\n try {\n rn.postMessage(JSON.stringify({\n type: type,\n frameId: frameId(),\n data: data || {}\n }));\n } catch (err) {\n /* drop unserializable messages */\n }\n }\n function postToWallet(msg) {\n if (!f.contentWindow) return;\n var outbound = msg;\n if (msg && typeof msg === 'object') {\n outbound = Object.assign({}, msg, { frameId: frameId() });\n }\n f.contentWindow.postMessage(outbound, ORIGIN);\n }\n window.addEventListener('message', function (e) {\n var fromFrame = e.source === f.contentWindow;\n var fromWalletOrigin = e.origin === ORIGIN;\n var hasFrameId = e.data && e.data.frameId === frameId();\n if (!fromWalletOrigin || (!fromFrame && !hasFrameId)) return;\n var rn = window.ReactNativeWebView;\n if (rn && rn.postMessage) {\n try {\n rn.postMessage(JSON.stringify(e.data));\n } catch (err) {\n /* drop unserializable messages */\n }\n }\n });\n window.__pushIn = postToWallet;\n window.addEventListener('thru:native-sheet-dismiss', function () {\n postToWallet({\n type: 'thru:native-sheet-dismiss',\n frameId: frameId()\n });\n });\n f.addEventListener('load', function () {\n postShell('shell:iframe-load', { src: f.src });\n });\n f.addEventListener('error', function () {\n postShell('shell:iframe-error', { src: f.src });\n });\n postShell('shell:loading', { src: f.dataset.src });\n f.src = f.dataset.src;\n })();\n </script>\n</body>\n</html>`;\nconst SHELL_PLACEHOLDER_PATTERN =\n /WALLET_URL_PLACEHOLDER|WALLET_ORIGIN_PLACEHOLDER/g;\n\nexport interface ShellOptions {\n walletUrl: string;\n walletOrigin: string;\n}\n\n/**\n * Returns the shell HTML for loading wallet.thru.org/embedded inside a\n * react-native-webview. The shell hosts an <iframe> pointing at the wallet\n * and bridges window.postMessage traffic between the iframe and the\n * react-native-webview's onMessage / injectJavaScript channels.\n *\n * Caller substitutes the placeholders with the runtime wallet URL + origin.\n */\nexport function getShellHtml(opts: ShellOptions): string {\n return SHELL_HTML_TEMPLATE.replace(SHELL_PLACEHOLDER_PATTERN, (placeholder) =>\n placeholder === 'WALLET_URL_PLACEHOLDER'\n ? opts.walletUrl\n : opts.walletOrigin\n );\n}\n","import { useContext } from 'react';\nimport { ThruContext, type ThruContextValue } from '../ThruContext';\n\n/** Returns the full ThruContextValue. Throws if used outside <ThruProvider>. */\nexport function useThru(): ThruContextValue {\n const ctx = useContext(ThruContext);\n if (!ctx) {\n throw new Error('useThru must be used inside <ThruProvider>');\n }\n return ctx;\n}\n","/* Thin TypeScript shim over the Android Expo Module that wires\n * react-native-webview to androidx.webkit's\n * `setWebAuthnSupport`. On non-Android platforms (iOS, web)\n * this is a no-op - WKWebView gets WebAuthn for free once the host\n * declares `WKAppBoundDomains` (handled by our Expo config plugin). */\n\nimport { Platform } from 'react-native';\nimport { requireOptionalNativeModule } from 'expo-modules-core';\n\n/* `requireOptionalNativeModule` returns null when the module isn't\n * linked (e.g. Expo Go without the dev client, or non-Android). */\ninterface ThruWebViewBridgeNativeModule {\n enableWebAuthnSupport: (viewTag?: number | null) => Promise<boolean>;\n}\n\nconst Native = requireOptionalNativeModule(\n 'ThruWebViewBridge'\n) as ThruWebViewBridgeNativeModule | null;\n\n/**\n * Tell the mounted WebView to route WebAuthn calls through Credential\n * Manager. Returns true if the call landed, false on\n * platforms where it isn't needed or supported.\n *\n * Idempotent; safe to call on every WebView mount.\n */\nexport async function enableWebAuthnSupport(viewTag?: number | null): Promise<boolean> {\n if (Platform.OS !== 'android') return false; /* iOS / web: no-op. */\n if (!Native) return false; /* Module not linked (Expo Go fallback). */\n try {\n return await Native.enableWebAuthnSupport(viewTag);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.warn('[@thru/wallet/native/react] enableWebAuthnSupport failed:', err);\n return false;\n }\n}\n","/* Bottom-sheet host for the wallet WebView. Auto-opens on UI_SHOW (or\n any provider lifecycle that calls requestShow), auto-closes on\n request resolution / DISCONNECT / LOCK. Mirrors how the iframe's\n IframeManager.show()/hide() couples to UI_SHOW today. */\n\nimport {\n Component,\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from \"react\";\nimport {\n Image,\n Platform,\n StyleSheet,\n Text,\n View,\n type LayoutChangeEvent,\n useWindowDimensions,\n} from \"react-native\";\nimport BottomSheet, { BottomSheetBackdrop } from \"@gorhom/bottom-sheet\";\nimport type BottomSheetType from \"@gorhom/bottom-sheet\";\nimport type { BottomSheetBackdropProps } from \"@gorhom/bottom-sheet\";\nimport { useSharedValue } from \"react-native-reanimated\";\nimport { useSafeAreaInsets } from \"react-native-safe-area-context\";\nimport {\n WebView,\n type WebViewMessageEvent,\n type WebView as WebViewType,\n} from \"react-native-webview\";\nimport { getShellHtml } from \"../provider/shell\";\nimport type { WebViewRefLike } from \"../provider/WebViewBridge\";\nimport QRCodeStyledImport from \"react-native-qrcode-styled\";\nimport { useThru } from \"./hooks/useThru\";\nimport { enableWebAuthnSupport } from \"./android-webauthn\";\n\nconst DEFAULT_SHEET_BACKGROUND_COLOR = \"#f9fbfb\";\nconst DEFAULT_SNAP_POINTS: (string | number)[] = [\"50%\", \"85%\"];\nconst DEFAULT_FIT_CONTENT_MAX_SHEET_RATIO = 0.75;\nconst DEFAULT_FIT_CONTENT_MIN_SHEET_RATIO = 0;\nconst SHEET_HANDLE_HEIGHT = 10;\nconst NATIVE_CONTENT_HEIGHT_MESSAGE = \"wallet:content-height\";\nconst NATIVE_SCREEN_BRIGHTNESS_MESSAGE = \"wallet:screen-brightness\";\nconst NATIVE_PAIR_DEVICE_QR_MESSAGE = \"wallet:pair-device-qr\";\nconst NATIVE_PAIR_DEVICE_QR_STATUS_MESSAGE = \"wallet:pair-device-qr-status\";\nconst NATIVE_BOTTOM_INSET_PARAM = \"tn_native_bottom_inset\";\nconst NATIVE_QR_IMPORT_UNAVAILABLE_REASON =\n \"react-native-qrcode-styled component unavailable\";\nconst NATIVE_QR_DARK_COLOR = \"#151b1e\";\nconst NATIVE_QR_ACCENT_COLOR = \"#239f97\";\nconst NATIVE_QR_ACCENT_DARK_COLOR = \"#0a766f\";\nconst NATIVE_QR_GRADIENT = {\n type: \"linear\" as const,\n options: {\n colors: [\n NATIVE_QR_DARK_COLOR,\n NATIVE_QR_ACCENT_DARK_COLOR,\n NATIVE_QR_ACCENT_COLOR,\n ],\n start: [0, 0] as [number, number],\n end: [1, 1] as [number, number],\n locations: [0, 0.55, 1],\n },\n};\nconst NATIVE_QR_OUTER_EYE_OPTIONS = {\n borderRadius: \"34%\",\n color: NATIVE_QR_DARK_COLOR,\n};\nconst NATIVE_QR_INNER_EYE_OPTIONS = {\n borderRadius: \"50%\",\n color: NATIVE_QR_ACCENT_COLOR,\n scale: 0.86,\n};\nconst NATIVE_QR_WARMUP_DATA = \"thru:qr-warmup\";\n\ntype BrightnessModule = typeof import(\"expo-brightness\");\ntype PreviousScreenBrightnessState = {\n brightness: number;\n didSetSystemBrightness: boolean;\n systemBrightness: number | null;\n systemBrightnessMode: Awaited<\n ReturnType<BrightnessModule[\"getSystemBrightnessModeAsync\"]>\n > | null;\n wasUsingSystemBrightness: boolean | null;\n};\ntype PairDeviceQrFrame = {\n top: number;\n left: number;\n width: number;\n height: number;\n};\ntype PairDeviceQrState = {\n approveUrl: string;\n frame: PairDeviceQrFrame;\n qrDataUrl?: string;\n};\ntype PairDeviceQrRenderStatus = \"rendering\" | \"ready\" | \"unavailable\";\ntype QRCodeStyledComponent = ComponentType<{\n data: string;\n size: number;\n padding?: number;\n color?: string;\n gradient?: object;\n pieceScale?: number;\n pieceCornerType?: \"rounded\" | \"cut\";\n pieceBorderRadius?: number | `${number}%`;\n pieceLiquidRadius?: number | `${number}%`;\n isPiecesGlued?: boolean;\n outerEyesOptions?: object;\n innerEyesOptions?: object;\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\";\n style?: object;\n}>;\n\nlet brightnessModulePromise: Promise<BrightnessModule | null> | null = null;\n\nfunction getBrightnessModule(): Promise<BrightnessModule | null> {\n brightnessModulePromise ??= import(\"expo-brightness\").catch((error) => {\n console.warn(\n \"[ThruWalletSheet] expo-brightness is unavailable in this native build:\",\n error,\n );\n return null;\n });\n return brightnessModulePromise;\n}\n\nasync function getPreviousScreenBrightnessState(\n brightness: BrightnessModule,\n): Promise<PreviousScreenBrightnessState> {\n const previousState: PreviousScreenBrightnessState = {\n brightness: await brightness.getBrightnessAsync(),\n didSetSystemBrightness: false,\n systemBrightness: null,\n systemBrightnessMode: null,\n wasUsingSystemBrightness: null,\n };\n\n if (Platform.OS !== \"android\") return previousState;\n\n const [systemBrightness, systemBrightnessMode, wasUsingSystemBrightness] =\n await Promise.all([\n brightness.getSystemBrightnessAsync().catch(() => null),\n brightness.getSystemBrightnessModeAsync().catch(() => null),\n brightness.isUsingSystemBrightnessAsync().catch(() => null),\n ]);\n previousState.systemBrightness = systemBrightness;\n previousState.systemBrightnessMode = systemBrightnessMode;\n previousState.wasUsingSystemBrightness = wasUsingSystemBrightness;\n\n return previousState;\n}\n\nfunction isReactComponentLike(input: unknown): input is ComponentType<unknown> {\n if (typeof input === \"function\") return true;\n if (typeof input !== \"object\" || input === null) return false;\n\n const reactType = (input as { $$typeof?: unknown }).$$typeof;\n return (\n reactType === Symbol.for(\"react.forward_ref\") ||\n reactType === Symbol.for(\"react.memo\") ||\n reactType === Symbol.for(\"react.lazy\")\n );\n}\n\nfunction resolveQRCodeComponent(\n module: unknown,\n namedExport: string,\n): ComponentType<unknown> | null {\n const seen = new Set<unknown>();\n const candidates = [module];\n\n for (let idx = 0; idx < candidates.length; idx++) {\n const candidate = candidates[idx];\n if (isReactComponentLike(candidate)) return candidate;\n if (\n typeof candidate !== \"object\" ||\n candidate === null ||\n seen.has(candidate)\n ) {\n continue;\n }\n\n seen.add(candidate);\n const record = candidate as Record<string, unknown>;\n candidates.push(record[namedExport], record.default);\n }\n\n return null;\n}\n\nconst RESOLVED_QR_CODE_STYLED = resolveQRCodeComponent(\n QRCodeStyledImport,\n \"QRCodeStyled\",\n) as QRCodeStyledComponent | null;\n\nfunction parsePairDeviceQrFrame(input: unknown): PairDeviceQrFrame | null {\n if (!input || typeof input !== \"object\") return null;\n const frame = input as Partial<PairDeviceQrFrame>;\n const { top, left, width, height } = frame;\n if (\n typeof top !== \"number\" ||\n typeof left !== \"number\" ||\n typeof width !== \"number\" ||\n typeof height !== \"number\" ||\n !Number.isFinite(top) ||\n !Number.isFinite(left) ||\n !Number.isFinite(width) ||\n !Number.isFinite(height) ||\n width <= 0 ||\n height <= 0\n ) {\n return null;\n }\n return { top, left, width, height };\n}\n\nfunction getPairDeviceQrStatusScript(\n status: PairDeviceQrRenderStatus,\n approveUrl: string,\n reason?: string,\n): string {\n const message = JSON.stringify({\n type: NATIVE_PAIR_DEVICE_QR_STATUS_MESSAGE,\n data: { status, approveUrl, reason },\n });\n\n return `\n (function () {\n var message = ${JSON.stringify(message)};\n try {\n var parsed = JSON.parse(message);\n if (typeof window.__pushIn === 'function') {\n window.__pushIn(parsed);\n } else {\n window.dispatchEvent(new MessageEvent('message', {\n data: parsed,\n origin: window.location.origin\n }));\n }\n } catch (error) {}\n })();\n true;\n `;\n}\n\nclass OptionalNativeQrBoundary extends Component<\n {\n children: ReactNode;\n onError: (error: unknown) => void;\n },\n { hasError: boolean }\n> {\n state = { hasError: false };\n\n static getDerivedStateFromError() {\n return { hasError: true };\n }\n\n componentDidCatch(error: unknown) {\n this.props.onError(error);\n }\n\n render() {\n if (this.state.hasError) return null;\n return this.props.children;\n }\n}\n\nfunction appendNativeBottomInset(\n urlValue: string,\n bottomInset: number,\n): string {\n try {\n const url = new URL(urlValue);\n url.searchParams.set(\n NATIVE_BOTTOM_INSET_PARAM,\n String(Math.max(0, Math.ceil(bottomInset))),\n );\n return url.toString();\n } catch {\n return urlValue;\n }\n}\n\nexport interface ThruWalletSheetProps {\n /** Detents in @gorhom format. Default: ['50%', '85%']. */\n snapPoints?: (string | number)[];\n /** Initial detent index when opening. Default: first detent. */\n initialOpenIndex?: number;\n /** Optional override for the bottom sheet background colour. */\n backgroundColor?: string;\n}\n\nexport interface ThruWalletSheetHandle {\n /** Imperatively open to a specific snap index. */\n expand: (index?: number) => void;\n /** Imperatively close the sheet. */\n close: () => void;\n}\n\nexport const ThruWalletSheet = forwardRef<\n ThruWalletSheetHandle,\n ThruWalletSheetProps\n>(function ThruWalletSheet(\n {\n snapPoints,\n initialOpenIndex,\n backgroundColor = DEFAULT_SHEET_BACKGROUND_COLOR,\n },\n ref,\n) {\n const { wallet } = useThru();\n const { height } = useWindowDimensions();\n const insets = useSafeAreaInsets();\n const sheetRef = useRef<BottomSheetType>(null);\n const webViewRef = useRef<WebViewType | null>(null);\n const webViewNativeTagRef = useRef<number | null>(null);\n const brightnessQueueRef = useRef<Promise<void>>(Promise.resolve());\n const previousScreenBrightnessRef =\n useRef<PreviousScreenBrightnessState | null>(null);\n const didRefreshWalletAvailabilityRef = useRef(false);\n const isProviderClosingRef = useRef(false);\n const isSheetOpenRef = useRef(false);\n const containerLayoutState = useSharedValue({\n height,\n offset: { top: 0, bottom: 0, left: 0, right: 0 },\n });\n\n const [shellHtml, setShellHtml] = useState<string | null>(null);\n const [directWalletUrl, setDirectWalletUrl] = useState<string | null>(null);\n const [hasBridgeMessage, setHasBridgeMessage] = useState(false);\n const [walletLoadStatus, setWalletLoadStatus] = useState(\"Loading wallet...\");\n const [webViewError, setWebViewError] = useState<string | null>(null);\n const [webContentHeight, setWebContentHeight] = useState<number | null>(null);\n const [webContentMaxSheetRatio, setWebContentMaxSheetRatio] = useState(\n DEFAULT_FIT_CONTENT_MAX_SHEET_RATIO,\n );\n const [webContentMinSheetRatio, setWebContentMinSheetRatio] = useState(\n DEFAULT_FIT_CONTENT_MIN_SHEET_RATIO,\n );\n const [pairDeviceQr, setPairDeviceQr] = useState<PairDeviceQrState | null>(\n null,\n );\n const [QRCodeStyled, setQRCodeStyled] =\n useState<QRCodeStyledComponent | null>(() => RESOLVED_QR_CODE_STYLED);\n const [isNativeQrUnavailable, setIsNativeQrUnavailable] = useState(\n () => RESOLVED_QR_CODE_STYLED === null,\n );\n const [nativeQrUnavailableReason, setNativeQrUnavailableReason] = useState<\n string | null\n >(() =>\n RESOLVED_QR_CODE_STYLED ? null : NATIVE_QR_IMPORT_UNAVAILABLE_REASON,\n );\n const shouldFitContent = !snapPoints || snapPoints.length === 0;\n const configuredSnapPoints = useMemo(\n () =>\n snapPoints && snapPoints.length > 0 ? snapPoints : DEFAULT_SNAP_POINTS,\n [snapPoints],\n );\n const memoSnapPoints = useMemo(() => {\n if (!shouldFitContent || webContentHeight == null)\n return configuredSnapPoints;\n\n const maxSheetHeight = Math.floor(height * webContentMaxSheetRatio);\n const minSheetHeight = Math.floor(\n height * Math.min(webContentMinSheetRatio, webContentMaxSheetRatio),\n );\n const fittedSheetHeight = Math.min(\n Math.max(webContentHeight + SHEET_HANDLE_HEIGHT, minSheetHeight),\n maxSheetHeight,\n );\n\n if (fittedSheetHeight >= maxSheetHeight - 1) {\n return [maxSheetHeight];\n }\n\n return [fittedSheetHeight, maxSheetHeight];\n }, [\n configuredSnapPoints,\n height,\n shouldFitContent,\n webContentHeight,\n webContentMaxSheetRatio,\n webContentMinSheetRatio,\n ]);\n const openIndex = Math.max(\n 0,\n Math.min(initialOpenIndex ?? 0, memoSnapPoints.length - 1),\n );\n const snapToSheetIndex = useCallback(\n (index: number) => {\n const maxIndex = Math.max(0, memoSnapPoints.length - 1);\n sheetRef.current?.snapToIndex(Math.max(0, Math.min(index, maxIndex)));\n },\n [memoSnapPoints.length],\n );\n\n const enqueueBrightnessTask = useCallback((task: () => Promise<void>) => {\n const queuedTask = brightnessQueueRef.current.then(task, task);\n brightnessQueueRef.current = queuedTask.catch(() => {});\n }, []);\n\n const restoreScreenBrightness = useCallback(() => {\n enqueueBrightnessTask(async () => {\n const previousState = previousScreenBrightnessRef.current;\n previousScreenBrightnessRef.current = null;\n if (!previousState) return;\n\n try {\n const brightness = await getBrightnessModule();\n if (!brightness) return;\n if (Platform.OS === \"android\") {\n if (\n previousState.didSetSystemBrightness &&\n previousState.systemBrightness !== null\n ) {\n try {\n await brightness.setSystemBrightnessAsync(\n previousState.systemBrightness,\n );\n if (previousState.systemBrightnessMode !== null) {\n await brightness.setSystemBrightnessModeAsync(\n previousState.systemBrightnessMode,\n );\n }\n } catch {\n /* Fall back to restoring the current activity brightness. */\n }\n }\n if (previousState.wasUsingSystemBrightness) {\n try {\n await brightness.restoreSystemBrightnessAsync();\n return;\n } catch {\n /* Fall back to restoring the saved activity brightness. */\n }\n }\n }\n await brightness.setBrightnessAsync(previousState.brightness);\n } catch (error) {\n console.warn(\n \"[ThruWalletSheet] Failed to restore screen brightness:\",\n error,\n );\n }\n });\n }, [enqueueBrightnessTask]);\n\n const maximizeScreenBrightness = useCallback(() => {\n enqueueBrightnessTask(async () => {\n try {\n const brightness = await getBrightnessModule();\n if (!brightness) return;\n if (previousScreenBrightnessRef.current == null) {\n previousScreenBrightnessRef.current =\n await getPreviousScreenBrightnessState(brightness);\n }\n await brightness.setBrightnessAsync(1);\n if (Platform.OS === \"android\") {\n try {\n await brightness.setSystemBrightnessAsync(1);\n if (previousScreenBrightnessRef.current) {\n previousScreenBrightnessRef.current.didSetSystemBrightness = true;\n }\n } catch {\n /* Activity brightness above still maximizes the visible app. */\n }\n }\n } catch (error) {\n console.warn(\n \"[ThruWalletSheet] Failed to maximize screen brightness:\",\n error,\n );\n }\n });\n }, [enqueueBrightnessTask]);\n\n const sendPairDeviceQrStatus = useCallback(\n (\n status: PairDeviceQrRenderStatus,\n approveUrl: string,\n reason?: string | null,\n ) => {\n webViewRef.current?.injectJavaScript(\n getPairDeviceQrStatusScript(status, approveUrl, reason ?? undefined),\n );\n },\n [],\n );\n\n const handleNativeQrError = useCallback(\n (error: unknown) => {\n console.warn(\"[ThruWalletSheet] Failed to render native QR:\", error);\n const reason =\n error instanceof Error\n ? `react-native-qrcode-styled render failed: ${error.message}`\n : \"react-native-qrcode-styled render failed\";\n if (pairDeviceQr) {\n sendPairDeviceQrStatus(\"unavailable\", pairDeviceQr.approveUrl, reason);\n }\n setNativeQrUnavailableReason(reason);\n setIsNativeQrUnavailable(true);\n setPairDeviceQr(null);\n },\n [pairDeviceQr, sendPairDeviceQrStatus],\n );\n\n useEffect(() => {\n containerLayoutState.value = {\n height,\n offset: { top: 0, bottom: 0, left: 0, right: 0 },\n };\n }, [containerLayoutState, height]);\n\n useEffect(() => {\n return () => {\n restoreScreenBrightness();\n };\n }, [restoreScreenBrightness]);\n\n /* Build the wallet source once the SDK is available. Android and iOS\n default to the shell iframe so the native SDK reuses the same wallet\n postMessage protocol as web iframe consumers. */\n useEffect(() => {\n if (!wallet) return;\n const walletUrl = appendNativeBottomInset(\n wallet.getIframeSrc(),\n insets.bottom,\n );\n const useDirectWallet =\n Platform.OS === \"ios\" && wallet.getIosWebViewMode() === \"direct\";\n if (useDirectWallet) {\n setDirectWalletUrl(walletUrl);\n setShellHtml(null);\n } else {\n const html = getShellHtml({\n walletUrl,\n walletOrigin: wallet.getWalletOrigin(),\n });\n setShellHtml(html);\n setDirectWalletUrl(null);\n }\n setHasBridgeMessage(false);\n setWalletLoadStatus(\"Loading wallet...\");\n setWebViewError(null);\n setWebContentHeight(null);\n setWebContentMaxSheetRatio(DEFAULT_FIT_CONTENT_MAX_SHEET_RATIO);\n setWebContentMinSheetRatio(DEFAULT_FIT_CONTENT_MIN_SHEET_RATIO);\n setPairDeviceQr(null);\n setQRCodeStyled(() => RESOLVED_QR_CODE_STYLED);\n setNativeQrUnavailableReason(\n RESOLVED_QR_CODE_STYLED ? null : NATIVE_QR_IMPORT_UNAVAILABLE_REASON,\n );\n setIsNativeQrUnavailable(RESOLVED_QR_CODE_STYLED === null);\n didRefreshWalletAvailabilityRef.current = false;\n }, [insets.bottom, wallet]);\n\n useEffect(() => {\n if (!pairDeviceQr) return;\n if (pairDeviceQr.qrDataUrl || (QRCodeStyled && !isNativeQrUnavailable)) {\n sendPairDeviceQrStatus(\"ready\", pairDeviceQr.approveUrl);\n } else if (isNativeQrUnavailable) {\n sendPairDeviceQrStatus(\n \"unavailable\",\n pairDeviceQr.approveUrl,\n nativeQrUnavailableReason,\n );\n }\n }, [\n QRCodeStyled,\n isNativeQrUnavailable,\n nativeQrUnavailableReason,\n pairDeviceQr,\n sendPairDeviceQrStatus,\n ]);\n\n const isDirectWalletSource = directWalletUrl !== null;\n\n /* Hand the WebView ref to the SDK once both exist. We expose only\n the shape NativeProvider needs (injectJavaScript). Also flip the\n Android WebView's WebAuthn support on, since react-native-webview\n doesn't do it for us. iOS is a no-op (WKWebView WebAuthn is\n governed by WKAppBoundDomains, set by our Expo config plugin). */\n const attachIfReady = useCallback(() => {\n if (!wallet || !webViewRef.current) return;\n const ref: WebViewRefLike = {\n injectJavaScript: (script: string) => {\n webViewRef.current?.injectJavaScript(script);\n },\n };\n wallet.attachWebView(ref);\n }, [wallet]);\n\n const enableAndroidWebAuthnIfNeeded = useCallback(async () => {\n if (Platform.OS !== \"android\") return false;\n const enabled = await enableWebAuthnSupport(webViewNativeTagRef.current);\n webViewRef.current?.injectJavaScript(\n \"window.dispatchEvent(new Event('thru:native-webauthn-ready')); true;\",\n );\n return enabled;\n }, []);\n\n const handleWebViewLayout = useCallback(\n (event: LayoutChangeEvent) => {\n const target = (event.nativeEvent as { target?: unknown }).target;\n webViewNativeTagRef.current =\n typeof target === \"number\" ? target : webViewNativeTagRef.current;\n void enableAndroidWebAuthnIfNeeded();\n },\n [enableAndroidWebAuthnIfNeeded],\n );\n\n const refreshWalletAvailabilityIfReady = useCallback(() => {\n if (!wallet || didRefreshWalletAvailabilityRef.current) return;\n didRefreshWalletAvailabilityRef.current = true;\n void wallet.refreshWalletAvailability();\n }, [wallet]);\n\n const handleLoadEnd = useCallback(() => {\n attachIfReady();\n if (isDirectWalletSource) {\n wallet?.markWebViewReady();\n setHasBridgeMessage(true);\n setWebViewError(null);\n void enableAndroidWebAuthnIfNeeded().finally(\n refreshWalletAvailabilityIfReady,\n );\n }\n }, [\n attachIfReady,\n enableAndroidWebAuthnIfNeeded,\n isDirectWalletSource,\n refreshWalletAvailabilityIfReady,\n wallet,\n ]);\n\n /* Wire show/hide callbacks through the SDK's provider so UI_SHOW from\n the wallet expands the sheet and request resolution closes it. */\n useEffect(() => {\n if (!wallet) return;\n wallet.setUiHandlers({\n onShowRequested: () => {\n isProviderClosingRef.current = false;\n snapToSheetIndex(openIndex);\n },\n onHideRequested: () => {\n isProviderClosingRef.current = true;\n sheetRef.current?.close();\n },\n });\n return () => {\n wallet.clearUiHandlers();\n };\n }, [wallet, openIndex, snapToSheetIndex]);\n\n useEffect(() => {\n if (!isSheetOpenRef.current) return;\n const animationFrame = requestAnimationFrame(() => {\n snapToSheetIndex(openIndex);\n });\n return () => cancelAnimationFrame(animationFrame);\n }, [height, memoSnapPoints, openIndex, snapToSheetIndex]);\n\n const walletOrigin = wallet?.getWalletOrigin();\n const webViewSource = useMemo(() => {\n if (directWalletUrl) return { uri: directWalletUrl };\n if (shellHtml) {\n return { html: shellHtml, baseUrl: walletOrigin ?? \"about:blank\" };\n }\n return null;\n }, [directWalletUrl, shellHtml, walletOrigin]);\n\n useEffect(() => {\n if (!webViewSource) return;\n attachIfReady();\n void enableAndroidWebAuthnIfNeeded();\n }, [attachIfReady, enableAndroidWebAuthnIfNeeded, webViewSource]);\n\n const limitsNavigationsToAppBoundDomains =\n Platform.OS === \"ios\" && isDirectWalletSource;\n\n const handleMessage = useCallback(\n (event: WebViewMessageEvent) => {\n let shouldRefreshAfterBridgeReady = false;\n try {\n const data = JSON.parse(event.nativeEvent.data) as {\n type?: string;\n data?: {\n approveUrl?: string;\n fitContent?: boolean;\n frame?: unknown;\n height?: number;\n maxSheetRatio?: number;\n minSheetRatio?: number;\n mode?: string;\n qrDataUrl?: string;\n src?: string;\n visible?: boolean;\n };\n };\n if (data.type === NATIVE_CONTENT_HEIGHT_MESSAGE) {\n const nextMaxSheetRatio = data.data?.maxSheetRatio;\n const nextMinSheetRatio = data.data?.minSheetRatio;\n setWebContentMaxSheetRatio(\n typeof nextMaxSheetRatio === \"number\" &&\n Number.isFinite(nextMaxSheetRatio) &&\n nextMaxSheetRatio > 0 &&\n nextMaxSheetRatio <= 1\n ? nextMaxSheetRatio\n : DEFAULT_FIT_CONTENT_MAX_SHEET_RATIO,\n );\n setWebContentMinSheetRatio(\n typeof nextMinSheetRatio === \"number\" &&\n Number.isFinite(nextMinSheetRatio) &&\n nextMinSheetRatio >= 0 &&\n nextMinSheetRatio <= 1\n ? nextMinSheetRatio\n : DEFAULT_FIT_CONTENT_MIN_SHEET_RATIO,\n );\n if (data.data?.fitContent === false) {\n setWebContentHeight(null);\n return;\n }\n const nextHeight = data.data?.height;\n if (\n typeof nextHeight === \"number\" &&\n Number.isFinite(nextHeight) &&\n nextHeight > 0\n ) {\n setWebContentHeight(Math.ceil(nextHeight));\n }\n return;\n }\n if (data.type === NATIVE_PAIR_DEVICE_QR_MESSAGE) {\n if (data.data?.visible === false) {\n setPairDeviceQr(null);\n return;\n }\n const approveUrl = data.data?.approveUrl;\n const frame = parsePairDeviceQrFrame(data.data?.frame);\n if (typeof approveUrl === \"string\" && approveUrl && frame) {\n const qrDataUrl =\n typeof data.data?.qrDataUrl === \"string\" &&\n data.data.qrDataUrl.startsWith(\"data:image/\")\n ? data.data.qrDataUrl\n : undefined;\n if (isNativeQrUnavailable) {\n sendPairDeviceQrStatus(\n \"unavailable\",\n approveUrl,\n nativeQrUnavailableReason,\n );\n return;\n }\n setPairDeviceQr({ approveUrl, frame, qrDataUrl });\n sendPairDeviceQrStatus(\"rendering\", approveUrl);\n }\n return;\n }\n if (data.type === NATIVE_SCREEN_BRIGHTNESS_MESSAGE) {\n if (data.data?.mode === \"max\") {\n maximizeScreenBrightness();\n } else if (data.data?.mode === \"restore\") {\n restoreScreenBrightness();\n }\n return;\n }\n if (data.type === \"shell:loading\") {\n setWalletLoadStatus(\"Loading wallet iframe...\");\n return;\n }\n if (data.type === \"shell:iframe-load\") {\n setWebViewError(null);\n setWalletLoadStatus(\n \"Wallet iframe loaded. Waiting for wallet app...\",\n );\n return;\n }\n if (data.type === \"shell:iframe-error\") {\n if (hasBridgeMessage) {\n console.warn(\n \"[ThruWalletSheet] Ignoring post-ready wallet iframe error:\",\n data.data,\n );\n return;\n }\n setWebViewError(\n `Wallet iframe failed to load${data.data?.src ? `: ${data.data.src}` : \"\"}`,\n );\n return;\n }\n if (data.type === \"iframe:ready\") {\n setHasBridgeMessage(true);\n setWebViewError(null);\n shouldRefreshAfterBridgeReady = true;\n }\n } catch {\n /* Let the bridge ignore malformed messages. */\n }\n wallet?.onMessage({\n nativeEvent: { data: event.nativeEvent.data },\n });\n if (shouldRefreshAfterBridgeReady) {\n void enableAndroidWebAuthnIfNeeded().finally(\n refreshWalletAvailabilityIfReady,\n );\n }\n },\n [\n enableAndroidWebAuthnIfNeeded,\n hasBridgeMessage,\n isNativeQrUnavailable,\n nativeQrUnavailableReason,\n maximizeScreenBrightness,\n refreshWalletAvailabilityIfReady,\n restoreScreenBrightness,\n sendPairDeviceQrStatus,\n wallet,\n ],\n );\n\n useImperativeHandle(\n ref,\n () => ({\n expand: (index?: number) => snapToSheetIndex(index ?? openIndex),\n close: () => sheetRef.current?.close(),\n }),\n [openIndex, snapToSheetIndex],\n );\n\n const handleSheetChange = useCallback(\n (index: number) => {\n isSheetOpenRef.current = index !== -1;\n if (index !== -1) return;\n restoreScreenBrightness();\n setPairDeviceQr(null);\n if (isProviderClosingRef.current) {\n isProviderClosingRef.current = false;\n return;\n }\n wallet?.rejectPendingRequests();\n webViewRef.current?.injectJavaScript(\n \"window.dispatchEvent(new Event('thru:native-sheet-dismiss')); true;\",\n );\n },\n [restoreScreenBrightness, wallet],\n );\n\n const pairDeviceQrSize = pairDeviceQr\n ? Math.max(\n 96,\n Math.floor(\n Math.min(pairDeviceQr.frame.width, pairDeviceQr.frame.height) - 32,\n ),\n )\n : 0;\n const pairDeviceQrBadgeFontSize = Math.max(16, pairDeviceQrSize * 0.1);\n const renderHandle = useCallback(\n () => (\n <View style={[styles.handleContainer, { backgroundColor }]}>\n <View style={styles.handleIndicator} />\n </View>\n ),\n [backgroundColor],\n );\n\n const renderBackdrop = useCallback(\n (props: BottomSheetBackdropProps) => (\n <BottomSheetBackdrop\n {...props}\n appearsOnIndex={0}\n disappearsOnIndex={-1}\n opacity={0.38}\n pressBehavior=\"close\"\n />\n ),\n [],\n );\n\n return (\n <BottomSheet\n ref={sheetRef}\n index={-1}\n snapPoints={memoSnapPoints}\n containerLayoutState={containerLayoutState}\n enableDynamicSizing={false}\n enableContentPanningGesture={false}\n handleComponent={renderHandle}\n backdropComponent={renderBackdrop}\n enablePanDownToClose\n onChange={handleSheetChange}\n backgroundStyle={{ backgroundColor }}\n >\n <View style={[styles.body, { backgroundColor }]}>\n {QRCodeStyled ? (\n <View\n collapsable={false}\n pointerEvents=\"none\"\n style={styles.nativeQrWarmup}\n >\n <QRCodeStyled\n data={NATIVE_QR_WARMUP_DATA}\n size={64}\n color={NATIVE_QR_DARK_COLOR}\n errorCorrectionLevel=\"L\"\n padding={0}\n pieceScale={1.025}\n />\n </View>\n ) : null}\n {webViewSource ? (\n <WebView\n ref={webViewRef}\n source={webViewSource}\n originWhitelist={[\"*\"]}\n javaScriptEnabled\n domStorageEnabled\n webviewDebuggingEnabled={__DEV__}\n nestedScrollEnabled\n sharedCookiesEnabled\n allowsInlineMediaPlayback\n mediaPlaybackRequiresUserAction={false}\n /* iOS WKWebView: direct wallet pages need app-bound\n navigation so WebAuthn and injected JS run in the\n WKAppBoundDomains context configured by the host app. */\n limitsNavigationsToAppBoundDomains={\n limitsNavigationsToAppBoundDomains\n }\n onLoadStart={() => {\n attachIfReady();\n void enableAndroidWebAuthnIfNeeded();\n }}\n onLoadEnd={handleLoadEnd}\n onLayout={handleWebViewLayout}\n onError={(event) => {\n const description =\n event.nativeEvent.description ||\n \"Wallet WebView failed to load\";\n if (hasBridgeMessage) {\n console.warn(\n \"[ThruWalletSheet] Ignoring post-ready WebView error:\",\n event.nativeEvent,\n );\n return;\n }\n setWebViewError(description);\n console.warn(\"[ThruWalletSheet] WebView error:\", description);\n }}\n onHttpError={(event) => {\n const status = event.nativeEvent.statusCode;\n const description = `Wallet returned HTTP ${status}`;\n if (hasBridgeMessage) {\n console.warn(\n \"[ThruWalletSheet] Ignoring post-ready WebView HTTP error:\",\n event.nativeEvent,\n );\n return;\n }\n setWebViewError(description);\n console.warn(\n \"[ThruWalletSheet] WebView HTTP error:\",\n description,\n );\n }}\n onMessage={handleMessage}\n style={[styles.webview, { backgroundColor }]}\n />\n ) : null}\n {webViewSource &&\n ((!isDirectWalletSource && !hasBridgeMessage) || webViewError) ? (\n <View\n pointerEvents=\"none\"\n style={[styles.loadingOverlay, { backgroundColor }]}\n >\n <Text style={styles.loadingTitle}>\n {webViewError ? \"Wallet failed to load\" : walletLoadStatus}\n </Text>\n {webViewError ? (\n <Text style={styles.loadingDetail}>{webViewError}</Text>\n ) : null}\n </View>\n ) : null}\n {pairDeviceQr && (pairDeviceQr.qrDataUrl || QRCodeStyled) ? (\n <View\n pointerEvents=\"none\"\n style={[\n styles.nativeQrOverlay,\n {\n height: pairDeviceQr.frame.height,\n left: pairDeviceQr.frame.left,\n top: pairDeviceQr.frame.top,\n width: pairDeviceQr.frame.width,\n },\n ]}\n >\n <OptionalNativeQrBoundary\n key={pairDeviceQr.approveUrl}\n onError={handleNativeQrError}\n >\n <View style={styles.nativeQrCard}>\n {pairDeviceQr.qrDataUrl ? (\n <Image\n resizeMode=\"contain\"\n source={{ uri: pairDeviceQr.qrDataUrl }}\n style={[\n styles.nativeQrImage,\n {\n height: pairDeviceQrSize,\n width: pairDeviceQrSize,\n },\n ]}\n />\n ) : QRCodeStyled ? (\n <View\n style={[\n styles.nativeQrStyledFallback,\n {\n height: pairDeviceQrSize,\n width: pairDeviceQrSize,\n },\n ]}\n >\n <QRCodeStyled\n data={pairDeviceQr.approveUrl}\n size={pairDeviceQrSize}\n color={NATIVE_QR_DARK_COLOR}\n gradient={NATIVE_QR_GRADIENT}\n errorCorrectionLevel=\"H\"\n innerEyesOptions={NATIVE_QR_INNER_EYE_OPTIONS}\n isPiecesGlued\n outerEyesOptions={NATIVE_QR_OUTER_EYE_OPTIONS}\n padding={0}\n pieceBorderRadius=\"42%\"\n pieceCornerType=\"rounded\"\n pieceLiquidRadius=\"30%\"\n pieceScale={1.02}\n style={styles.nativeQrSvg}\n />\n <View style={styles.nativeQrFallbackBadge}>\n <Text\n style={[\n styles.nativeQrFallbackBadgeText,\n {\n fontSize: pairDeviceQrBadgeFontSize,\n lineHeight: pairDeviceQrBadgeFontSize * 1.05,\n },\n ]}\n >\n J\n </Text>\n </View>\n </View>\n ) : null}\n </View>\n </OptionalNativeQrBoundary>\n </View>\n ) : null}\n </View>\n </BottomSheet>\n );\n});\n\nconst styles = StyleSheet.create({\n body: { flex: 1 },\n handleContainer: {\n alignItems: \"center\",\n height: SHEET_HANDLE_HEIGHT,\n justifyContent: \"flex-start\",\n paddingTop: 4,\n },\n handleIndicator: {\n backgroundColor: \"#cdd5db\",\n borderRadius: 999,\n height: 4,\n width: 42,\n },\n loadingDetail: {\n color: \"#4b635f\",\n fontSize: 13,\n lineHeight: 18,\n maxWidth: 280,\n textAlign: \"center\",\n },\n loadingOverlay: {\n alignItems: \"center\",\n bottom: 0,\n gap: 8,\n justifyContent: \"center\",\n left: 0,\n padding: 24,\n position: \"absolute\",\n right: 0,\n top: 0,\n },\n loadingTitle: {\n color: \"#172b29\",\n fontSize: 16,\n fontWeight: \"600\",\n textAlign: \"center\",\n },\n nativeQrCard: {\n alignItems: \"center\",\n backgroundColor: \"#ffffff\",\n borderColor: \"#dbe4e8\",\n borderRadius: 8,\n borderWidth: StyleSheet.hairlineWidth,\n flex: 1,\n justifyContent: \"center\",\n },\n nativeQrOverlay: {\n elevation: 16,\n position: \"absolute\",\n zIndex: 16,\n },\n nativeQrImage: {\n backgroundColor: \"#ffffff\",\n },\n nativeQrFallbackBadge: {\n alignItems: \"center\",\n aspectRatio: 1,\n backgroundColor: \"#ffffff\",\n borderColor: \"#d1e1e1\",\n borderRadius: 999,\n borderWidth: StyleSheet.hairlineWidth,\n justifyContent: \"center\",\n left: \"41.5%\",\n position: \"absolute\",\n top: \"41.5%\",\n width: \"17%\",\n },\n nativeQrFallbackBadgeText: {\n color: NATIVE_QR_ACCENT_DARK_COLOR,\n fontWeight: \"700\",\n includeFontPadding: false,\n textAlign: \"center\",\n },\n nativeQrStyledFallback: {\n alignItems: \"center\",\n backgroundColor: \"#ffffff\",\n justifyContent: \"center\",\n },\n nativeQrSvg: {\n backgroundColor: \"#ffffff\",\n },\n nativeQrWarmup: {\n height: 64,\n left: -128,\n opacity: 0,\n position: \"absolute\",\n top: -128,\n width: 64,\n zIndex: -1,\n },\n webview: { flex: 1, backgroundColor: \"transparent\" },\n});\n","/* Hidden native wallet WebView for transparent integrations. Hosts compose\n this alongside <ThruProvider config={{ walletExperience: \"transparent\" }}>\n so wallet requests can run without opening bottom-sheet UI. */\n\nimport {\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ComponentProps,\n} from \"react\";\nimport {\n Platform,\n StyleSheet,\n View,\n type LayoutChangeEvent,\n type StyleProp,\n type ViewStyle,\n} from \"react-native\";\nimport {\n WebView,\n type WebViewMessageEvent,\n type WebView as WebViewType,\n} from \"react-native-webview\";\nimport { getShellHtml } from \"../provider/shell\";\nimport type { NativeSDK } from \"../NativeSDK\";\nimport type { WebViewRefLike } from \"../provider/WebViewBridge\";\nimport { enableWebAuthnSupport } from \"./android-webauthn\";\nimport { ThruContext } from \"./ThruContext\";\n\ntype WebViewLoadEndEvent = Parameters<\n NonNullable<ComponentProps<typeof WebView>[\"onLoadEnd\"]>\n>[0];\n\nexport interface ThruTransparentWalletBridgeProps {\n wallet?: NativeSDK | null;\n style?: StyleProp<ViewStyle>;\n webViewProps?: Partial<ComponentProps<typeof WebView>>;\n}\n\nexport function ThruTransparentWalletBridge({\n wallet: walletProp,\n style,\n webViewProps,\n}: ThruTransparentWalletBridgeProps) {\n const thruContext = useContext(ThruContext);\n const wallet = walletProp ?? thruContext?.wallet ?? null;\n const webViewRef = useRef<WebViewType | null>(null);\n const webViewNativeTagRef = useRef<number | null>(null);\n const didRefreshWalletAvailabilityRef = useRef(false);\n const [isFocusSurfaceActive, setIsFocusSurfaceActive] = useState(false);\n\n const attachIfReady = useCallback(() => {\n if (!wallet || !webViewRef.current) return;\n const ref: WebViewRefLike = {\n injectJavaScript: (script: string) => {\n webViewRef.current?.injectJavaScript(script);\n },\n };\n wallet.attachWebView(ref);\n }, [wallet]);\n\n const enableAndroidWebAuthnIfNeeded = useCallback(async () => {\n if (Platform.OS !== \"android\") return false;\n const enabled = await enableWebAuthnSupport(webViewNativeTagRef.current);\n webViewRef.current?.injectJavaScript(\n \"window.dispatchEvent(new Event('thru:native-webauthn-ready')); true;\",\n );\n return enabled;\n }, []);\n\n const focusWebViewDocument = useCallback(() => {\n const webView = webViewRef.current as (WebViewType & {\n requestFocus?: () => void;\n }) | null;\n webView?.requestFocus?.();\n webViewRef.current?.injectJavaScript(\n \"try { window.focus(); document.body && document.body.focus && document.body.focus(); } catch (_) {} true;\",\n );\n }, []);\n\n const refreshWalletAvailabilityIfReady = useCallback(() => {\n if (!wallet || didRefreshWalletAvailabilityRef.current) return;\n didRefreshWalletAvailabilityRef.current = true;\n void wallet.refreshWalletAvailability();\n }, [wallet]);\n\n useEffect(() => {\n if (!wallet) return;\n wallet.setUiHandlers({\n onShowRequested: () => {\n setIsFocusSurfaceActive(true);\n },\n onHideRequested: () => {\n setIsFocusSurfaceActive(false);\n },\n });\n return () => {\n wallet.clearUiHandlers();\n };\n }, [focusWebViewDocument, wallet]);\n\n useEffect(() => {\n if (!isFocusSurfaceActive) return;\n const timers = [0, 50, 120, 250, 500].map((delay) =>\n setTimeout(focusWebViewDocument, delay),\n );\n return () => {\n timers.forEach(clearTimeout);\n };\n }, [focusWebViewDocument, isFocusSurfaceActive]);\n\n const webViewSource = useMemo(() => {\n if (!wallet) return null;\n if (Platform.OS === \"ios\" && wallet.getIosWebViewMode() === \"direct\") {\n return { uri: wallet.getIframeSrc() };\n }\n return {\n html: getShellHtml({\n walletUrl: wallet.getIframeSrc(),\n walletOrigin: wallet.getWalletOrigin(),\n }),\n baseUrl: wallet.getWalletOrigin(),\n };\n }, [wallet]);\n\n const isDirectWalletSource = Boolean(\n wallet &&\n Platform.OS === \"ios\" &&\n wallet.getIosWebViewMode() === \"direct\",\n );\n\n useEffect(() => {\n didRefreshWalletAvailabilityRef.current = false;\n }, [webViewSource]);\n\n const handleWebViewLayout = useCallback(\n (event: LayoutChangeEvent) => {\n const target = (event.nativeEvent as { target?: unknown }).target;\n webViewNativeTagRef.current =\n typeof target === \"number\" ? target : webViewNativeTagRef.current;\n void enableAndroidWebAuthnIfNeeded();\n webViewProps?.onLayout?.(event);\n },\n [enableAndroidWebAuthnIfNeeded, webViewProps],\n );\n\n const handleLoadEnd = useCallback(\n (event: WebViewLoadEndEvent) => {\n attachIfReady();\n if (isDirectWalletSource) {\n void enableAndroidWebAuthnIfNeeded().finally(\n refreshWalletAvailabilityIfReady,\n );\n } else {\n void enableAndroidWebAuthnIfNeeded();\n }\n webViewProps?.onLoadEnd?.(event);\n },\n [\n attachIfReady,\n enableAndroidWebAuthnIfNeeded,\n isDirectWalletSource,\n refreshWalletAvailabilityIfReady,\n webViewProps,\n ],\n );\n\n const handleMessage = useCallback(\n (event: WebViewMessageEvent) => {\n let shouldRefreshAfterBridgeReady = false;\n let shouldCollapseFocusSurface = false;\n try {\n const data = JSON.parse(event.nativeEvent.data) as {\n id?: unknown;\n success?: unknown;\n type?: string;\n };\n shouldRefreshAfterBridgeReady = data.type === \"iframe:ready\";\n shouldCollapseFocusSurface =\n typeof data.id === \"string\" && typeof data.success === \"boolean\";\n } catch {\n /* Let the bridge ignore malformed messages. */\n }\n\n if (shouldCollapseFocusSurface) {\n setIsFocusSurfaceActive(false);\n }\n\n wallet?.onMessage({\n nativeEvent: { data: event.nativeEvent.data },\n });\n webViewProps?.onMessage?.(event);\n\n if (shouldRefreshAfterBridgeReady) {\n void enableAndroidWebAuthnIfNeeded().finally(\n refreshWalletAvailabilityIfReady,\n );\n }\n },\n [\n enableAndroidWebAuthnIfNeeded,\n refreshWalletAvailabilityIfReady,\n wallet,\n webViewProps,\n ],\n );\n\n if (!webViewSource) return null;\n\n return (\n <View\n collapsable={false}\n pointerEvents={isFocusSurfaceActive ? \"auto\" : \"none\"}\n style={[\n styles.container,\n isFocusSurfaceActive ? styles.activeContainer : null,\n style,\n ]}\n >\n <WebView\n {...webViewProps}\n ref={webViewRef}\n source={webViewSource}\n originWhitelist={[\"*\"]}\n javaScriptEnabled\n domStorageEnabled\n webviewDebuggingEnabled={__DEV__}\n sharedCookiesEnabled\n allowsInlineMediaPlayback\n mediaPlaybackRequiresUserAction={false}\n limitsNavigationsToAppBoundDomains={isDirectWalletSource}\n onLoadStart={(event) => {\n attachIfReady();\n void enableAndroidWebAuthnIfNeeded();\n webViewProps?.onLoadStart?.(event);\n }}\n onLoadEnd={handleLoadEnd}\n onLayout={handleWebViewLayout}\n onMessage={handleMessage}\n style={[\n styles.webview,\n isFocusSurfaceActive ? styles.activeWebview : null,\n webViewProps?.style,\n ]}\n />\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n container: {\n height: 1,\n left: 0,\n opacity: 0,\n overflow: \"hidden\",\n position: \"absolute\",\n top: 0,\n width: 1,\n },\n activeContainer: {\n bottom: 0,\n height: \"100%\",\n opacity: 1,\n right: 0,\n width: \"100%\",\n zIndex: 2147483647,\n },\n webview: {\n backgroundColor: \"transparent\",\n height: 1,\n width: 1,\n },\n activeWebview: {\n flex: 1,\n height: \"100%\",\n width: \"100%\",\n },\n});\n","import type { NativeSDK } from \"../../NativeSDK\";\n\n/** Spin until the SDK exists or `timeout` ms passes. */\nexport function waitForWallet(\n getWallet: () => NativeSDK | null,\n timeout = 5000,\n interval = 100\n): Promise<NativeSDK> {\n return new Promise((resolve, reject) => {\n const start = Date.now();\n const check = () => {\n const sdk = getWallet();\n if (sdk) return resolve(sdk);\n if (Date.now() - start > timeout) {\n return reject(new Error('NativeSDK not initialized in time'));\n }\n setTimeout(check, interval);\n };\n check();\n });\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport type { ConnectResult, IThruChain } from \"../../../interfaces\";\nimport type { CreateAccountResult } from \"../../../protocol\";\nimport type { ConnectOptions, CreateAccountOptions, SignInOptions } from \"../../NativeSDK\";\nimport { useThru } from './useThru';\nimport { waitForWallet } from './waitForWallet';\n\n/**\n * useWallet - mirror of @thru/wallet/react's useWallet. The `wallet` field\n * exposes the chain interface (`provider.thru`); `connect` /\n * `disconnect` proxy through the SDK.\n */\nexport function useWallet() {\n const {\n wallet,\n isConnected,\n isConnecting,\n accounts,\n selectedAccount,\n selectAccount,\n manageAccounts,\n walletAvailability,\n } = useThru();\n const walletRef = useRef(wallet);\n\n useEffect(() => {\n walletRef.current = wallet;\n }, [wallet]);\n\n const connect = useCallback(async (options?: ConnectOptions): Promise<ConnectResult> => {\n const ready =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n return ready.connect(options);\n }, []);\n\n const signIn = useCallback(async (options: SignInOptions): Promise<ConnectResult> => {\n const ready =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n return ready.signIn(options);\n }, []);\n\n const createTransparentAccount = useCallback(\n async (options?: CreateAccountOptions): Promise<CreateAccountResult> => {\n const ready =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n return ready.createAccount(options);\n },\n [],\n );\n\n const disconnect = useCallback(async (): Promise<void> => {\n const ready =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n await ready.disconnect();\n }, []);\n\n const refreshWalletAvailability = useCallback(async (options?: ConnectOptions) => {\n const ready =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n return ready.refreshWalletAvailability(options);\n }, []);\n\n return {\n /** Chain interface (`provider.thru`); undefined until connected. */\n wallet: wallet?.thru as IThruChain | undefined,\n accounts,\n connect,\n signIn,\n createAccount: createTransparentAccount,\n disconnect,\n isConnected: isConnected && !!wallet,\n isConnecting,\n selectedAccount,\n selectAccount,\n manageAccounts,\n walletAvailability,\n hasPasskey: walletAvailability.hasPasskey,\n hasWalletAccount: walletAvailability.hasWalletAccount,\n isWalletAvailabilityLoading: walletAvailability.status === 'checking',\n refreshWalletAvailability,\n };\n}\n","import { useEffect, useRef } from 'react';\nimport type { ConnectOptions } from \"../../NativeSDK\";\nimport { useThru } from './useThru';\nimport { waitForWallet } from './waitForWallet';\n\nexport function useWalletAvailability() {\n const { wallet, walletAvailability } = useThru();\n const walletRef = useRef(wallet);\n\n useEffect(() => {\n walletRef.current = wallet;\n }, [wallet]);\n\n const refreshWalletAvailability = async (options?: ConnectOptions) => {\n const ready =\n walletRef.current ?? (await waitForWallet(() => walletRef.current));\n return ready.refreshWalletAvailability(options);\n };\n\n return {\n walletAvailability,\n refreshWalletAvailability,\n hasPasskey: walletAvailability.hasPasskey,\n hasWalletAccount: walletAvailability.hasWalletAccount,\n isAuthorized: walletAvailability.isAuthorized,\n isWalletAvailabilityLoading: walletAvailability.status === 'checking',\n accounts: walletAvailability.accounts,\n selectedAccount: walletAvailability.selectedAccount,\n error: walletAvailability.error,\n };\n}\n","import { useEffect, useRef } from 'react';\nimport type { WalletAccount } from \"../../../interfaces\";\nimport { useThru } from './useThru';\n\nexport interface UseAccountsOptions {\n /** Fired whenever the active account flips (initial pick or switch). */\n onAccountSelect?: (account: WalletAccount) => void;\n}\n\n/**\n * useAccounts - mirror of @thru/wallet/react's useAccounts. Subscribes to\n * `selectedAccount` flips and invokes the consumer's callback on real\n * changes (deduped against the previous address).\n */\nexport function useAccounts({ onAccountSelect }: UseAccountsOptions = {}) {\n const { accounts, selectedAccount, isConnected, isConnecting } = useThru();\n const lastSeen = useRef<string | null>(null);\n\n useEffect(() => {\n if (!selectedAccount) {\n lastSeen.current = null;\n return;\n }\n if (lastSeen.current === selectedAccount.address) return;\n lastSeen.current = selectedAccount.address;\n onAccountSelect?.(selectedAccount);\n }, [selectedAccount, onAccountSelect]);\n\n return {\n accounts,\n selectedAccount,\n isConnected,\n isConnecting,\n };\n}\n"]}
|