@thru/wallet 0.2.27 → 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.
Files changed (47) hide show
  1. package/README.md +1 -0
  2. package/dist/{BrowserSDK-CpRFiJsW.d.ts → BrowserSDK-CRQTOT8S.d.ts} +178 -3
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.js +376 -12
  5. package/dist/index.js.map +1 -1
  6. package/dist/native/react/transparent.d.ts +104 -0
  7. package/dist/native/react/transparent.js +2210 -0
  8. package/dist/native/react/transparent.js.map +1 -0
  9. package/dist/native/react.d.ts +5 -90
  10. package/dist/native/react.js +765 -32
  11. package/dist/native/react.js.map +1 -1
  12. package/dist/native.d.ts +105 -1
  13. package/dist/native.js +521 -31
  14. package/dist/native.js.map +1 -1
  15. package/dist/react-ui.js +5 -0
  16. package/dist/react-ui.js.map +1 -1
  17. package/dist/react.d.ts +2 -2
  18. package/dist/react.js +376 -12
  19. package/dist/react.js.map +1 -1
  20. package/package.json +8 -2
  21. package/src/BrowserSDK.ts +32 -1
  22. package/src/encoding.ts +39 -0
  23. package/src/index.ts +5 -1
  24. package/src/interfaces/IThruChain.ts +50 -1
  25. package/src/interfaces/types.ts +52 -0
  26. package/src/native/NativeSDK.test.ts +200 -1
  27. package/src/native/NativeSDK.ts +124 -10
  28. package/src/native/index.ts +12 -0
  29. package/src/native/provider/NativeProvider.ts +106 -5
  30. package/src/native/provider/WebViewBridge.test.ts +22 -1
  31. package/src/native/provider/WebViewBridge.ts +17 -7
  32. package/src/native/provider/chains/ThruChain.ts +215 -5
  33. package/src/native/react/ThruContext.ts +3 -1
  34. package/src/native/react/ThruProvider.tsx +25 -0
  35. package/src/native/react/ThruTransparentWalletBridge.tsx +281 -0
  36. package/src/native/react/hooks/useWallet.ts +12 -1
  37. package/src/native/react/index.ts +11 -0
  38. package/src/native/react/transparent.ts +35 -0
  39. package/src/protocol/postMessage.ts +127 -2
  40. package/src/provider/EmbeddedProvider.ts +7 -1
  41. package/src/provider/IframeManager.test.ts +18 -0
  42. package/src/provider/IframeManager.ts +8 -1
  43. package/src/provider/chains/ThruChain.ts +210 -4
  44. package/src/provider/types/messages.ts +16 -0
  45. package/src/react/index.ts +6 -0
  46. package/src/signing-sessions.test.ts +182 -0
  47. package/src/signing-sessions.ts +204 -0
@@ -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"],"names":[],"mappings":"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","file":"native.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"]}
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"],"names":[],"mappings":"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","file":"native.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"]}
package/dist/react-ui.js CHANGED
@@ -3,6 +3,11 @@ import '@thru/sdk/client';
3
3
  import { createContext, useState, useRef, useMemo, useEffect, useCallback, useContext } from 'react';
4
4
  import { jsxs, jsx } from 'react/jsx-runtime';
5
5
 
6
+ // src/encoding.ts
7
+ var BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
8
+ new Map(
9
+ [...BASE64_ALPHABET].map((char, index) => [char, index])
10
+ );
6
11
  var defaultContextValue = {
7
12
  wallet: null,
8
13
  isConnected: false,