@human.tech/waap-sdk 1.2.1 → 1.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.modern.mjs +1 -1
- package/dist/index.modern.mjs.map +1 -1
- package/dist/index.module.js +1 -1
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +13 -13
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/lib/UIMessageManager.ts","../src/lib/provider/requests.ts","../src/lib/provider/utils.ts","../src/lib/WalletConnect.ts","../src/lib/WalletMessageManager.ts","../src/lib/provider/EthereumProvider.ts","../src/ui/WaapComponent.ts","../src/ui/index.ts","../src/lib/provider/EthereumProviderExtension.ts","../src/lib/sui/SuiWallet.ts","../src/lib/sui/init.ts","../src/lib/sui/register.ts","../src/hooks/useWaapTransaction.ts"],"sourcesContent":["/**\n * UIMessageManager emits events whose intended recipient is the UI\n * of the silk-wallet-sdk. It is used by EthereumProvider to\n * communicate with the UI.\n *\n * Note that the UI part of silk-wallet-sdk is not the Silk\n * website but rather the actual iframe tag that gets embedded\n * in the host site.\n */\nimport { EventEmitter } from \"events\";\n\nenum UI_EVENT_NAMES {\n show_modal = \"show_modal\",\n hide_modal = \"hide_modal\",\n}\n\nclass UIMessageManager extends EventEmitter {\n constructor() {\n super();\n }\n}\n\nexport { UI_EVENT_NAMES, UIMessageManager };\nexport default UIMessageManager;\n","import { EventEmitter } from 'events'\nimport { JSON_RPC_METHOD, SilkResponse } from '@human.tech/waap-interface-core'\nimport { rpcMethodRequiresUI } from '@human.tech/waap-constants'\nimport WalletMessageManager from '../WalletMessageManager.js'\nimport { RequestArguments } from './types.js'\n\n/**\n * Options passed to iframe for transaction behavior\n */\ninterface SilkOptions {\n async?: boolean\n withPT?: boolean\n}\n\n/**\n * Send request to wallet in iframe, and upon receiving the wallet's response\n * or error, hide modal and return wallet's response or throw wallet's error.\n */\nasync function handleWalletRequestAndResponse(\n args: RequestArguments,\n interactionRequired: boolean,\n walletMessageManager: WalletMessageManager,\n internalProviderEventEmitter: EventEmitter,\n silkOptions?: SilkOptions\n) {\n const method = args.method as JSON_RPC_METHOD\n const params = args.params as any[]\n\n // Send request to wallet in iframe\n const id = await walletMessageManager.postSilkRequest({\n method,\n params,\n interactionRequired,\n silkOptions\n })\n // Return wallet's response\n return new Promise((resolve, reject) => {\n // setTimeout(() => reject(\"Request timed out\"), 60 * 1000);\n internalProviderEventEmitter.once(id, (response: SilkResponse) => {\n // We check for error first because some RPC methods return null if they are successful\n if (response.error) reject(response.error)\n else resolve(response.data)\n })\n })\n}\n\nexport { rpcMethodRequiresUI, handleWalletRequestAndResponse }\n","import { CustomConfig } from '@human.tech/waap-interface-core'\n\nexport function isMetaMask(provider: any) {\n if (!provider?.isMetaMask) return false\n // Brave tries to make itself look like MetaMask\n // Could also try RPC `web3_clientVersion` if following is unreliable\n // if (provider.isBraveWallet && !provider._events && !provider._state) {\n // return false\n // }\n if (provider.isApexWallet) return false\n if (provider.isAvalanche) return false\n if (provider.isBitKeep) return false\n if (provider.isBlockWallet) return false\n if (provider.isMathWallet) return false\n if (provider.isOkxWallet || provider.isOKExWallet) return false\n if (provider.isOneInchIOSWallet || provider.isOneInchAndroidWallet) {\n return false\n }\n if (provider.isOpera) return false\n if (provider.isPortal) return false\n if (provider.isRabby) return false\n if (provider.isDefiant) return false\n if (provider.isTokenPocket) return false\n if (provider.isTokenary) return false\n if (provider.isZerion) return false\n return true\n}\n\nexport function isSafeTransaction(params?: unknown[] | object): boolean {\n try {\n if (!params || !Array.isArray(params)) return false\n\n // For eth_signTypedData_v4, params[1] contains the typed data\n const typedData = JSON.parse(\n typeof params[1] === 'string' ? params[1] : JSON.stringify(params[1])\n )\n\n // Check if it's a Safe transaction by verifying:\n // 1. Primary type is 'SafeTx'\n // 2. Has verifyingContract in domain (Safe address)\n // 3. Has required SafeTx fields in message\n return (\n typedData.primaryType === 'SafeTx' &&\n typedData.domain?.verifyingContract !== undefined &&\n typedData.message &&\n 'to' in typedData.message &&\n 'value' in typedData.message &&\n 'safeTxGas' in typedData.message &&\n 'baseGas' in typedData.message &&\n 'gasPrice' in typedData.message &&\n 'nonce' in typedData.message\n )\n } catch {\n return false\n }\n}\n\nexport const defaultConfig: CustomConfig = {\n styles: {\n darkMode: false\n }\n}\n","import { EthersAdapter } from '@reown/appkit-adapter-ethers'\n\nexport class SilkWalletConnect {\n private static instance: any = null\n private static projectId: string | undefined = undefined\n // Ethereum, Optimism, Gnosis, Polygon, Base, Avalanche, Arbitrum, Celo, Base Sepolia, Sepolia\n private static chains: number[] = [\n 1, 10, 100, 137, 8453, 43114, 42161, 42220, 84532, 11155111\n ]\n // private static optionalChains: AppKitNetwork[]\n\n /**\n * Set the WalletConnect project ID programmatically\n * Use this if environment variables aren't working in your setup\n *\n * @param id - The WalletConnect project ID to use\n */\n static setProjectId(id: string) {\n this.projectId = id\n }\n\n // /**\n // * Set the optional chains to use for WalletConnect\n // *\n // * @param chains - The optional chains to use (number[])\n // */\n // static setOptionalChains(chains: AppKitNetwork[]) {\n // SilkWalletConnect.optionalChains = chains\n // }\n\n static getProjectIdFromEnv() {\n try {\n // Check if process and process.env exist.\n if (typeof process !== 'undefined' && process.env) {\n // List of common env variable names to check\n return (\n process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID ||\n process.env.VITE_WALLET_CONNECT_PROJECT_ID ||\n process.env.REACT_APP_WALLET_CONNECT_PROJECT_ID ||\n process.env.WALLET_CONNECT_PROJECT_ID\n ) // Generic fallback\n }\n } catch (error) {\n // Silently fail if process is not defined.\n // This is expected in a pure browser environment.\n return undefined\n }\n return undefined\n }\n\n static async getInstance() {\n // Skip initialization if not in browser environment\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return null\n }\n // Dynamically import AppKit only in browser environment\n const { createAppKit } = await import('@reown/appkit')\n const {\n mainnet,\n sepolia,\n optimism,\n arbitrum,\n optimismGoerli,\n polygon,\n gnosis,\n avalanche,\n aurora,\n fantom,\n base,\n celo\n } = await import('@reown/appkit/networks')\n\n try {\n // // 2. Create your application's metadata object\n const metadata = {\n name: 'Human Wallet',\n description:\n 'Silk lets you create human keys for web3 wallets that are recoverable with private identity proofs and secured by zero trust protocols.',\n url: window.location.origin, // origin must match your domain & subdomain\n icons: [\n 'https://imagedelivery.net/_aTEfDRm7z3tKgu9JhfeKA/f11f5753-616a-4aa0-2aee-9b75befea700/sm'\n ]\n }\n\n // // Check for project ID in multiple places, in order of precedence\n const projectId = this.projectId || this.getProjectIdFromEnv()\n\n if (!projectId) {\n console.error(\n 'WalletConnect project ID not found. Please set it using one of these methods:\\n' +\n '1. Pass walletConnectProjectId when calling initSilk\\n' +\n '2. Call SilkWalletConnect.setProjectId(\"your-project-id\")\\n' +\n '3. Set WALLET_CONNECT_PROJECT_ID (NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID for Next projects) environment variable'\n )\n return null\n }\n\n // Set it again in case it comes from env\n this.projectId = projectId\n\n if (!this.instance) {\n this.instance = createAppKit({\n adapters: [new EthersAdapter()],\n projectId,\n metadata,\n networks: [\n // @ts-ignore\n mainnet,\n sepolia,\n arbitrum,\n optimism,\n polygon,\n gnosis,\n avalanche,\n aurora,\n fantom,\n base,\n celo\n ],\n features: {\n socials: false,\n email: false\n }\n })\n }\n\n return this.instance\n } catch (error) {\n console.error('Error importing or initializing WalletConnect:', error)\n return null\n }\n }\n\n static async listenToAccountChangeEvent() {\n await new Promise<void>((resolve) => {\n const unsubscribe = this.instance.subscribeAccount(\n (accountState: any) => {\n if (accountState?.isConnected) {\n resolve()\n }\n }\n )\n })\n }\n\n /**\n * Wait for WalletConnect to be properly initialized and connected\n * @returns Promise<boolean> - true if connected, false if timeout reached\n */\n static async waitForReadyAndCheckConnection(): Promise<boolean> {\n if (!this.instance) {\n return false\n }\n\n let isConnected = false\n let attempts = 0\n const maxAttempts = 15 // Maximum 15 attempts\n\n while (!isConnected && attempts < maxAttempts) {\n // Use shorter delays initially, then longer ones\n const delay = attempts < 5 ? 500 : 1000 // 500ms for first 5 attempts, then 1s\n await new Promise((resolve) => setTimeout(resolve, delay))\n\n isConnected = this.instance.getIsConnectedState()\n attempts++\n console.log(\n `WalletConnect connection check attempt ${attempts}: ${isConnected}`\n )\n }\n\n return isConnected\n }\n\n /**\n * Check if WalletConnect is currently connected (immediate check, no waiting)\n * @returns boolean - true if connected, false otherwise\n */\n static isConnected(): boolean {\n return this.instance?.getIsConnectedState() ?? false\n }\n\n /**\n * Get the wallet provider from the WalletConnect instance\n * @returns The wallet provider or null if not available\n */\n static getWalletProvider(): any {\n return this.instance?.getWalletProvider() ?? null\n }\n}\n","/**\n * WalletMessageManager handles messages between the wallet (in the Silk iframe)\n * and the wallet SDK (in the top frame). It is used by EthereumProvider\n * to communicate with the wallet.\n */\nimport {\n SilkRequest,\n SilkResponse,\n SILK_MESSAGE_TYPE,\n SILK_METHOD,\n SILK_NOTIFICATION,\n SilkNotificationData,\n generateMessageId\n} from '@human.tech/waap-interface-core'\n\nimport {\n silkWalletAppOrigin2,\n silkWalletAppOrigin2Staging\n} from '@human.tech/waap-constants'\n\ntype PostSilkRequestArgs = {\n method: keyof typeof SILK_METHOD\n params: any[]\n interactionRequired: boolean\n silkOptions?: {\n async?: boolean\n }\n}\n\n/**\n * Async transaction notification from iframe\n */\ninterface AsyncTxNotification {\n type: string\n payload: any\n}\n\n/**\n * Listener interface for WalletMessageManager\n */\ninterface MessageListenerConfig {\n handleResponse: (response: SilkResponse) => void\n handleRequest: (request: SilkRequest) => void\n onReceiveConnectNotif?: () => void\n onAccountChanged?: (newAccount: string) => void\n onAsyncTxNotification?: (notification: AsyncTxNotification) => void\n}\n\nclass WalletMessageManager {\n private iframeWindow: Window | null = null\n private walletOrigin: string\n\n constructor(iframeWindow: Window, useStaging: boolean) {\n this.iframeWindow = iframeWindow\n this.walletOrigin = useStaging\n ? silkWalletAppOrigin2Staging\n : silkWalletAppOrigin2\n }\n\n /**\n * Post a Silk notification to the given iframeWindow\n */\n postSilkNotification(data: SilkNotificationData) {\n this.iframeWindow!.postMessage(\n {\n target: 'silk' as const,\n messageType: SILK_MESSAGE_TYPE.notification,\n data\n },\n this.walletOrigin\n )\n }\n\n postReadyNotification() {\n this.postSilkNotification(SILK_NOTIFICATION.ready)\n }\n\n postConnectNotification() {\n this.postSilkNotification(SILK_NOTIFICATION.connect)\n }\n\n /**\n * Post a 'ready' notification to the iframe, and wait\n * for the iframe to respond with a 'ready' notification.\n */\n pingIframe() {\n return new Promise<void>((resolve, reject) => {\n setTimeout(() => reject('Wallet ping timed out.'), 10000)\n const eventHandler = (event: MessageEvent) => {\n if (\n event.data.target === 'silk' &&\n event.data.messageType === SILK_MESSAGE_TYPE.notification &&\n event.data.data === SILK_NOTIFICATION.ready\n ) {\n window.removeEventListener('message', eventHandler)\n resolve()\n }\n }\n window.addEventListener('message', eventHandler)\n this.postReadyNotification()\n })\n }\n\n /**\n * Post a SilkRequest to the iframeWindow. Don't wait for a response.\n */\n async postSilkRequest(req: PostSilkRequestArgs) {\n const { silkOptions, ...restReq } = req\n const baseRequest = {\n ...restReq,\n target: 'silk' as const,\n messageType: SILK_MESSAGE_TYPE.request as const,\n // Include silkOptions for transaction methods\n ...(silkOptions && { silkOptions })\n }\n const id = await generateMessageId(baseRequest)\n this.iframeWindow!.postMessage({ ...baseRequest, id }, this.walletOrigin)\n return id\n }\n\n /**\n * Add a message listener to the window in which this is called (which should be the top frame).\n * It handles all messages from the Silk iframe posted to the top frame.\n * @param config - Configuration that includes callbacks for handling specific messages.\n */\n addListener(config: MessageListenerConfig) {\n const {\n handleResponse,\n handleRequest,\n onReceiveConnectNotif,\n onAccountChanged,\n onAsyncTxNotification\n } = config\n\n window.addEventListener('message', (event) => {\n // Note: It is extremely important that NODE_ENV be set properly in production\n try {\n const origin =\n typeof process !== 'undefined' &&\n process.env &&\n process.env.NODE_ENV === 'test'\n ? 'http://127.0.0.1:3000'\n : event.origin\n\n if (origin !== this.walletOrigin) {\n return\n }\n } catch (error) {\n if (event.origin !== this.walletOrigin) {\n return\n }\n }\n\n if (event.data?.messageType === SILK_MESSAGE_TYPE.request) {\n handleRequest(event.data as SilkRequest)\n } else if (event.data?.messageType === SILK_MESSAGE_TYPE.response) {\n handleResponse(event.data as SilkResponse)\n } else if (event.data?.messageType === SILK_MESSAGE_TYPE.notification) {\n if (event.data?.data === SILK_NOTIFICATION.connect) {\n onReceiveConnectNotif?.()\n } else if (\n event.data?.data?.type === SILK_NOTIFICATION.account_changed &&\n onAccountChanged\n ) {\n onAccountChanged(event.data.data.account)\n } else if (\n (event.data?.data?.type?.startsWith('waap_sign_') ||\n event.data?.data?.type?.startsWith('waap_tx_')) &&\n onAsyncTxNotification\n ) {\n // Handle async transaction notifications\n onAsyncTxNotification({\n type: event.data.data.type,\n payload: event.data.data.payload\n })\n }\n }\n })\n }\n}\n\nexport { WalletMessageManager, PostSilkRequestArgs }\nexport default WalletMessageManager\n","/**\n * A Ethereum provder API (from EIP 1193) for Silk.\n * https://eips.ethereum.org/EIPS/eip-1193\n */\n\n/**\n * Resources:\n * - EIP-2255: Wallet Permissions System: https://eips.ethereum.org/EIPS/eip-2255\n */\nimport { EventEmitter } from 'events'\nimport {\n SILK_METHOD,\n JSON_RPC_METHOD,\n SilkRequest,\n SilkResponse,\n CustomConfig,\n CredentialType,\n ProjectConfig,\n RequestPermissionTokenParams\n} from '@human.tech/waap-interface-core'\nimport {\n EthereumProviderInterface,\n LoginResponse,\n RequestArguments,\n SilkEthereumProviderInterface\n} from './types.js'\nimport { UIMessageManager, UI_EVENT_NAMES } from '../UIMessageManager.js'\nimport {\n rpcMethodRequiresUI,\n handleWalletRequestAndResponse\n} from './requests.js'\nimport { defaultConfig, isMetaMask, isSafeTransaction } from './utils.js'\nimport { SilkWalletConnect } from '../WalletConnect.js'\nimport WalletMessageManager from '../WalletMessageManager.js'\n\nconst VALID_LOGIN_METHODS = [\n 'waap',\n 'human',\n 'injected',\n 'walletconnect'\n] as const\n\n/**\n * Normalizes the login response from the iframe.\n * Accepts both string format ('waap') and object format ({ loginMethod: 'waap', isComplete: true }).\n * Returns null for null/undefined (user closed modal).\n * Throws on unexpected formats.\n */\nfunction normalizeLoginResponse(response: unknown): LoginResponse {\n if (response === null || response === undefined) {\n return null\n }\n\n if (typeof response === 'string') {\n if ((VALID_LOGIN_METHODS as readonly string[]).includes(response)) {\n return response as LoginResponse\n }\n throw new Error(\n `[EthereumProvider] Unexpected login method: \"${response}\". ` +\n `Expected one of: ${VALID_LOGIN_METHODS.join(', ')}`\n )\n }\n\n // Object format ({ loginMethod: 'waap', isComplete: true }) — used by mobile SDK.\n // Normalize to string but warn, since the web SDK should receive strings.\n if (\n typeof response === 'object' &&\n 'loginMethod' in response &&\n typeof (response as any).loginMethod === 'string'\n ) {\n const method = (response as any).loginMethod\n console.warn(\n `[EthereumProvider] Received object login response. ` +\n `Normalizing \"${method}\" to string. This is unexpected for the web SDK.`\n )\n if ((VALID_LOGIN_METHODS as readonly string[]).includes(method)) {\n return method as LoginResponse\n }\n throw new Error(\n `[EthereumProvider] Unknown loginMethod in object: \"${method}\". ` +\n `Expected one of: ${VALID_LOGIN_METHODS.join(', ')}`\n )\n }\n\n throw new Error(\n `[EthereumProvider] Unexpected login response: ${JSON.stringify(\n response\n )} ` + `(type: ${typeof response})`\n )\n}\n\nclass EthereumProvider\n extends EventEmitter\n implements SilkEthereumProviderInterface\n{\n public readonly isSilk = true\n public readonly isWaaP = true\n public connected = false\n public walletMessageManager: WalletMessageManager\n public uiMessageManager: UIMessageManager\n public config: CustomConfig\n private currentAccount: string | null = null\n private walletConnectProvider: any = null\n /**\n * When true, eth_sendTransaction resolves with the pre-calculated tx hash\n * after signing. Broadcasting continues in the background with events.\n */\n private asyncTxs: boolean = false\n /**\n * When true, sends `asyncSigning: true` in silkOptions instead of `async: true`.\n * This mimics the v1 SDK protocol for backward compatibility testing.\n * @internal\n */\n private legacyAsyncSigning: boolean = false\n private persistedMethods: {\n login: () => Promise<LoginResponse>\n logout: () => Promise<unknown>\n getLoginMethod: () => LoginResponse\n walletMessageManager: WalletMessageManager\n uiMessageManager: UIMessageManager\n internalEventEmitter: EventEmitter\n silkRequest: (args: RequestArguments) => Promise<unknown>\n waaPRequest: (args: RequestArguments) => Promise<unknown>\n portal: (\n feature: 'gastank' | 'customization' | 'project',\n operation: 'get' | 'update' | 'topup' | 'init',\n payload?: any\n ) => Promise<unknown>\n requestEmail: () => Promise<unknown>\n requestSBT: (type: CredentialType) => Promise<unknown>\n requestPermissionToken: (\n params: RequestPermissionTokenParams\n ) => Promise<unknown>\n orcid: () => Promise<unknown>\n enable: () => Promise<unknown>\n isConnected: () => boolean\n toggleDarkMode: () => Promise<void>\n }\n\n /**\n * We use the internalEventEmitter to emit as events\n * Silk messages posted to the window.\n */\n public internalEventEmitter = new EventEmitter()\n\n /**\n * @param iframeWindow - The contentWindow of the iframe of the Silk website.\n * @param referralCode - Silk points referral code\n * @param customConfig - Silk custom UI configuration\n * @param project - Silk project configuration\n * @param useStaging - Whether to use the staging environment\n * @param asyncTxs - When true, eth_sendTransaction resolves with tx hash after signing\n * @param legacyAsyncSigning - When true, sends asyncSigning in silkOptions (v1 compat)\n */\n constructor(\n iframeWindow: Window,\n referralCode?: string,\n customConfig?: CustomConfig,\n project?: ProjectConfig,\n useStaging?: boolean,\n asyncTxs: boolean = false,\n legacyAsyncSigning: boolean = false\n ) {\n super()\n\n this.asyncTxs = asyncTxs\n this.legacyAsyncSigning = legacyAsyncSigning\n\n this.uiMessageManager = new UIMessageManager()\n this.walletMessageManager = new WalletMessageManager(\n iframeWindow!,\n !!useStaging\n )\n this.config = {\n ...defaultConfig,\n ...(customConfig || {}) // Override with customConfig if provided\n }\n\n // // Initialize WalletConnect provider if wallet authentication is enabled\n // if (this.config.authenticationMethods?.includes('wallet')) {\n // // Initialize asynchronously to avoid blocking the constructor\n // this.initializeWalletConnect().catch((error) => {\n // console.error('WalletConnect initialization failed:', error)\n // })\n // }\n\n this.persistedMethods = {\n login: this.login.bind(this),\n logout: this.logout.bind(this),\n getLoginMethod: this.getLoginMethod.bind(this),\n walletMessageManager: this.walletMessageManager,\n internalEventEmitter: this.internalEventEmitter,\n uiMessageManager: this.uiMessageManager,\n portal: this.portal.bind(this),\n requestEmail: this.requestEmail.bind(this),\n requestSBT: this.requestSBT.bind(this),\n requestPermissionToken: this.requestPermissionToken.bind(this),\n orcid: this.orcid.bind(this),\n enable: this.enable.bind(this),\n isConnected: this.isConnected.bind(this),\n toggleDarkMode: this.toggleDarkMode.bind(this),\n // We leave this silkRequest separate and never changing so that\n // we can still call the original request method if needed no matter\n // the current provider\n silkRequest: this.request.bind(this),\n waaPRequest: this.request.bind(this)\n }\n\n // Set up message listeners for the WalletMessageManager\n this.walletMessageManager.addListener({\n onReceiveConnectNotif: () => {\n console.log('onReceiveConnectNotif')\n this.connected = true\n this.emit('connect')\n },\n handleResponse: (response: SilkResponse) =>\n this.internalEventEmitter.emit(response.id, response),\n handleRequest: (request: SilkRequest) => {\n if (request.method === SILK_METHOD.show_modal) {\n this.uiMessageManager.emit(UI_EVENT_NAMES.show_modal)\n } else if (request.method === SILK_METHOD.hide_modal) {\n this.uiMessageManager.emit(UI_EVENT_NAMES.hide_modal)\n }\n },\n onAccountChanged: (newAccount: string) => {\n // Handle account change events\n if (this.currentAccount !== newAccount) {\n this.currentAccount = newAccount\n\n // Emit accountsChanged event with an array containing the new account\n // This follows the MetaMask standard (EIP-1193)\n this.emit('accountsChanged', newAccount ? [newAccount] : [])\n }\n },\n onAsyncTxNotification: (notification) => {\n // Emit async transaction events (waap_sign_complete, waap_tx_pending, waap_tx_confirmed, waap_tx_failed)\n // This allows consuming apps to listen for transaction lifecycle events\n this.emit(notification.type, notification.payload)\n }\n })\n\n // Tell the iframe to set the referral code\n if (referralCode) {\n // Wait for iframe to load (if it hasn't already)\n this.walletMessageManager\n .pingIframe()\n .then(() => {\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.set_points_referral_code,\n params: [referralCode]\n },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n .catch((error) => {\n console.error('Error setting referral code in Silk iframe:', error)\n })\n }\n\n // Tell the iframe to set the project config\n if (project) {\n console.log(' =========== project =========== ', project)\n this.walletMessageManager.pingIframe().then(() => {\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.set_project,\n params: [project, window.location.origin]\n },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n }\n\n // Tell the iframe to set the custom config\n if (customConfig) {\n this.walletMessageManager\n .pingIframe()\n .then(() => {\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.set_custom_config,\n params: [customConfig]\n },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n .catch((error) => {\n console.error('Error setting custom config in Silk iframe:', error)\n })\n }\n\n // if (forceIframe) {\n // this.walletMessageManager\n // .pingIframe()\n // .then(() => {\n // return handleWalletRequestAndResponse(\n // {\n // method: SILK_METHOD.force_iframe,\n // params: [true]\n // },\n // false,\n // this.walletMessageManager,\n // this.internalEventEmitter\n // )\n // })\n // .catch((error) => {\n // console.error('Error forcing iframe in Silk iframe:', error)\n // })\n // }\n }\n\n private async initializeWalletConnect(): Promise<void> {\n try {\n this.walletConnectProvider = await SilkWalletConnect.getInstance()\n console.log('WalletConnect provider initialized')\n } catch (error) {\n console.error('Failed to initialize WalletConnect provider:', error)\n this.walletConnectProvider = null\n }\n }\n\n public async enable(): Promise<unknown> {\n return this.request({ method: 'eth_requestAccounts' })\n }\n\n public isConnected(): boolean {\n return this.connected\n }\n\n public async request(args: RequestArguments): Promise<unknown> {\n if (\n !Object.keys(JSON_RPC_METHOD).includes(\n args.method as keyof typeof JSON_RPC_METHOD\n )\n ) {\n return Promise.reject({ error: `Not implemented (${args.method})` })\n }\n\n // Attempt auto-connect for account-related methods\n const autoConnectResult = await this.attemptAutoConnect(args.method)\n if (autoConnectResult !== null) {\n return autoConnectResult\n }\n\n // Initial check if this is a Safe transaction (other check happens on wallet internal and on the BE)\n const isSafeTx = isSafeTransaction(args.params)\n\n /**\n * Security: Safe transactions must use eth_signTypedData_v4\n * - Safe contract only accepts EIP-712 signatures or direct hash signatures\n * - Attempting to disguise Safe transactions as regular transactions or using\n * different signing methods would fail because:\n * 1. Safe contract requires specific signature format\n * 2. Transaction simulation validates proper Safe context\n * 3. Signatures are cryptographically bound to actual transaction parameters\n */\n if (isSafeTx) {\n // Safe transactions must use eth_signTypedData_v4\n if (args.method !== JSON_RPC_METHOD.eth_signTypedData_v4) {\n return Promise.reject({\n error: 'Safe transactions must be signed using eth_signTypedData_v4'\n })\n }\n }\n\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n // Determine if this is a transaction/signing method that should use silkOptions\n const isTxMethod =\n args.method === JSON_RPC_METHOD.eth_sendTransaction ||\n args.method === JSON_RPC_METHOD.eth_signTransaction ||\n args.method === JSON_RPC_METHOD.eth_signTypedData_v4 ||\n args.method === JSON_RPC_METHOD.personal_sign\n\n // Include silkOptions for transaction/signing methods when async txs is enabled or withPT is set\n const isAsync = (isTxMethod && this.asyncTxs) || args.async\n const silkOptions =\n isAsync || args.withPT\n ? this.legacyAsyncSigning\n ? {\n // v1 SDK protocol: send asyncSigning instead of async\n asyncSigning: isAsync || undefined,\n withPT: args.withPT\n }\n : {\n async: isAsync,\n withPT: args.withPT\n }\n : undefined\n\n const response = await handleWalletRequestAndResponse(\n args,\n rpcMethodRequiresUI(args.method as JSON_RPC_METHOD),\n this.walletMessageManager,\n this.internalEventEmitter,\n silkOptions\n )\n\n if (\n (args.method === JSON_RPC_METHOD.wallet_switchEthereumChain ||\n args.method === JSON_RPC_METHOD.wallet_addEthereumChain) &&\n response === null\n ) {\n this.emit(\n 'chainChanged',\n (args.params as { chainId: string }[])?.[0]?.chainId\n )\n\n // After switching chains, re-emit account info to ensure dApps (like Safe)\n // can re-establish the signer context on the new chain\n try {\n // Get current accounts to ensure we have the latest account info\n const accounts = (await this.request({\n method: 'eth_accounts'\n })) as string[]\n if (accounts && accounts.length > 0) {\n this.currentAccount = accounts[0]\n\n // Emit both accountsChanged and connect events to ensure dApps\n // (especially Safe protocol-kit) re-establish signer context\n this.emit('accountsChanged', accounts)\n this.emit('connect', {\n chainId: (args.params as { chainId: string }[])?.[0]?.chainId\n })\n\n console.log(\n '[EthereumProvider] Re-emitted accounts and connect after chain switch:',\n {\n accounts,\n chainId: (args.params as { chainId: string }[])?.[0]?.chainId\n }\n )\n }\n } catch (error) {\n console.warn(\n '[EthereumProvider] Failed to get accounts after chain switch:',\n error\n )\n // Fallback to current account if available\n if (this.currentAccount) {\n this.emit('accountsChanged', [this.currentAccount])\n // Also emit connect event for fallback\n this.emit('connect', {\n chainId: (args.params as { chainId: string }[])?.[0]?.chainId\n })\n }\n }\n }\n\n return response\n }\n\n public async login(\n customProvider?: EthereumProviderInterface\n ): Promise<LoginResponse> {\n // Skip if not in browser environment\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return null\n }\n\n // Use the class-level walletConnectProvider if available, otherwise initialize it\n if (\n this.config.authenticationMethods?.includes('wallet') &&\n !this.walletConnectProvider\n ) {\n await this.initializeWalletConnect()\n }\n\n const provider = customProvider || (window.ethereum as any)\n\n const providerWalletName =\n provider && isMetaMask(provider) ? 'MetaMask' : 'Browser Wallet'\n\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n const rawResponse = await handleWalletRequestAndResponse(\n { method: SILK_METHOD.login, params: [providerWalletName] },\n true,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n\n // Normalize response: handles both string ('waap') and object ({ loginMethod: 'waap' }) formats.\n // Throws on unexpected formats to catch bugs early.\n const loginMethod = normalizeLoginResponse(rawResponse)\n\n if (loginMethod === null) {\n return null\n }\n\n switch (loginMethod) {\n case 'waap':\n case 'human':\n localStorage.setItem(`${window.location.origin}-connected`, 'waap')\n this.setupWaaP()\n break\n\n case 'injected':\n if (provider) {\n localStorage.setItem(\n `${window.location.origin}-connected`,\n 'injected'\n )\n this.setupInjectedWallet(provider)\n }\n break\n\n case 'walletconnect': {\n localStorage.setItem(\n `${window.location.origin}-connected`,\n 'walletconnect'\n )\n\n if (!SilkWalletConnect.isConnected()) {\n await this.walletConnectProvider.open({ view: 'Connect' })\n await SilkWalletConnect.listenToAccountChangeEvent()\n }\n\n const wcProvider = SilkWalletConnect.getWalletProvider()\n this.setupWalletConnect(wcProvider)\n break\n }\n }\n\n return loginMethod\n }\n\n public async logout(): Promise<unknown> {\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n // Clear the stored login method\n this.cleanupInvalidLoginState()\n\n // Reset to Human Wallet state\n\n try {\n // Use the class-level walletConnectProvider if available\n if (this.walletConnectProvider) {\n await this.walletConnectProvider.disconnect()\n }\n } catch (error) {\n console.error('Error disconnecting from WalletConnect:', error)\n }\n\n return handleWalletRequestAndResponse(\n { method: SILK_METHOD.logout },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n }\n\n private cleanupInvalidLoginState(): void {\n try {\n localStorage.removeItem(`${window.location.origin}-connected`)\n } catch (error) {\n // Ignore cleanup errors in case localStorage is not available\n console.warn('Could not clean up login state:', error)\n }\n }\n\n /**\n * Helper method to set up window.waap for WaaP\n */\n private setupWaaP(): void {\n const provider = {\n ...this.persistedMethods,\n isWaaP: true,\n on: this.on.bind(this),\n removeListener: this.removeListener.bind(this),\n request: this.request.bind(this)\n }\n // @ts-ignore\n window.silk = provider\n // @ts-ignore - Add WaaP alias\n window.waap = provider\n }\n\n /**\n * Helper method to set up window.silk for injected wallets (e.g., MetaMask)\n */\n private setupInjectedWallet(provider: any): void {\n const injectedProvider = {\n ...this.persistedMethods,\n ...provider,\n isSilk: true,\n connected: provider.connected ?? false,\n on: provider.on?.bind(provider) ?? (() => {}),\n removeListener: provider.removeListener?.bind(provider) ?? (() => {}),\n request: provider.request.bind(provider)\n }\n window.silk = injectedProvider\n // @ts-ignore - Add WaaP alias\n window.waap = injectedProvider\n }\n\n /**\n * Helper method to set up window.silk for WalletConnect\n */\n private setupWalletConnect(provider: any): void {\n const walletConnectProvider = {\n ...this.persistedMethods,\n ...provider,\n isSilk: true,\n connected: true,\n on: provider.on?.bind(provider) ?? (() => {}),\n removeListener: provider.removeListener?.bind(provider) ?? (() => {}),\n request: provider.request.bind(provider)\n }\n window.silk = walletConnectProvider\n // @ts-ignore - Add WaaP alias\n window.waap = walletConnectProvider\n }\n\n /**\n * Helper method to set up window.silk for auto-connect with injected wallets\n */\n private setupAutoConnectInjected(provider: any): void {\n const injectedProvider = {\n ...this.persistedMethods,\n ...provider,\n isSilk: false,\n // @ts-ignore\n connected: provider.isConnected?.() ?? false,\n // @ts-ignore\n on: provider.on?.bind(provider) ?? (() => {}),\n removeListener:\n // @ts-ignore\n provider.removeListener?.bind(provider) ?? (() => {}),\n // @ts-ignore\n request: provider.request.bind(provider)\n }\n window.silk = injectedProvider\n // @ts-ignore - Add WaaP alias\n window.waap = injectedProvider\n }\n\n /**\n * Helper method to set up window.silk for auto-connect with WalletConnect\n */\n private setupAutoConnectWalletConnect(provider: any): void {\n const walletConnectProvider = {\n ...this.persistedMethods,\n ...provider,\n isSilk: false,\n connected: true,\n on: provider.on?.bind(provider) ?? (() => {}),\n removeListener: provider.removeListener?.bind(provider) ?? (() => {}),\n request: provider.request.bind(provider)\n }\n window.silk = walletConnectProvider\n // @ts-ignore - Add WaaP alias\n window.waap = walletConnectProvider\n }\n\n /**\n * Attempts to auto-connect using previously stored login method\n * @param method - The RPC method being called\n * @returns Promise<unknown> if auto-connect succeeds, null if it should fall through to normal flow\n */\n private async attemptAutoConnect(method: string): Promise<unknown | null> {\n // Only attempt auto-connect for account-related methods\n if (method !== 'eth_requestAccounts' && method !== 'eth_accounts') {\n return null\n }\n\n this.walletMessageManager.pingIframe().then(async () => {\n await handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.auto_conn,\n params: [window.location.origin]\n },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n\n // Use our robust getLoginMethod to check connection state\n const loginMethod = this.getLoginMethod()\n\n if (loginMethod === 'injected' && window.ethereum) {\n try {\n this.setupAutoConnectInjected(window.ethereum)\n\n // @ts-ignore\n return window.ethereum.request({\n method: 'eth_requestAccounts'\n })\n } catch (error) {\n // If injected wallet fails, clean up and fall through to normal flow\n console.warn('Injected wallet auto-connect failed:', error)\n this.cleanupInvalidLoginState()\n return null\n }\n } else if (loginMethod === 'walletconnect') {\n try {\n if (!this.walletConnectProvider) {\n this.walletConnectProvider = await SilkWalletConnect.getInstance()\n }\n\n // Wait for WalletConnect to be ready\n const isConnected =\n await SilkWalletConnect.waitForReadyAndCheckConnection()\n\n if (isConnected) {\n const provider = SilkWalletConnect.getWalletProvider()\n this.setupAutoConnectWalletConnect(provider)\n\n // Return the accounts from the active WalletConnect session\n return provider.request({\n method: 'eth_requestAccounts'\n })\n } else {\n console.log(\n 'WalletConnect not connected, cleaning up and falling through to normal flow'\n )\n // Clean up invalid WalletConnect state\n this.cleanupInvalidLoginState()\n return null\n }\n } catch (error) {\n // If WalletConnect fails, clean up and fall through to normal flow\n console.warn('WalletConnect auto-connect failed:', error)\n this.cleanupInvalidLoginState()\n return null\n }\n }\n\n // For 'human' login method or if auto-connect failed, fall through to normal Silk flow\n return null\n }\n\n public getLoginMethod(): LoginResponse {\n // Skip if not in browser environment\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return null\n }\n\n try {\n const stored = localStorage.getItem(`${window.location.origin}-connected`)\n\n if (!stored) {\n return null\n }\n\n // Validate that stored value is a valid LoginResponse\n if (!['waap', 'human', 'injected', 'walletconnect'].includes(stored)) {\n // Invalid value in localStorage, clean it up\n this.cleanupInvalidLoginState()\n return null\n }\n\n // Verify the connection is actually still valid\n switch (stored) {\n case 'injected':\n // Check if injected wallet (e.g., MetaMask) is still available\n if (!window.ethereum) {\n // Browser wallet is no longer available, clean up\n this.cleanupInvalidLoginState()\n return null\n }\n return 'injected'\n\n case 'walletconnect':\n // Check if WalletConnect session is still active\n try {\n if (!SilkWalletConnect.isConnected()) {\n // WalletConnect session is no longer active, clean up\n this.cleanupInvalidLoginState()\n return null\n }\n return 'walletconnect'\n } catch (error) {\n // Error checking WalletConnect status, assume disconnected\n this.cleanupInvalidLoginState()\n return null\n }\n\n case 'waap':\n // For WaaP, we trust the localStorage value since the connection\n // state is managed by the Silk iframe. The actual connection verification\n // happens when eth_requestAccounts is called.\n return 'waap'\n\n case 'human':\n return 'human'\n\n default:\n // This shouldn't happen due to the validation above, but just in case\n this.cleanupInvalidLoginState()\n return null\n }\n } catch (error) {\n // Any unexpected error (localStorage access issues, etc.)\n console.warn('Error checking login method:', error)\n this.cleanupInvalidLoginState()\n return null\n }\n }\n\n public async toggleDarkMode(): Promise<void> {\n this.config.styles!.darkMode = !this.config.styles!.darkMode\n\n this.walletMessageManager\n .pingIframe()\n .then(() => {\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.set_custom_config,\n params: [this.config]\n },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n .catch((error) => {\n console.error('Error setting custom config in Silk iframe:', error)\n })\n }\n\n public async safe(): Promise<void> {\n this.walletMessageManager.pingIframe().then(() => {\n return handleWalletRequestAndResponse(\n { method: SILK_METHOD.safe },\n true,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n }\n\n public async orcid(): Promise<void> {\n this.walletMessageManager.pingIframe().then(() => {\n return handleWalletRequestAndResponse(\n { method: SILK_METHOD.orcid },\n true,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n }\n\n /**\n * INTERNAL METHOD: Gas tank administration operations\n * This method is ONLY accessible from the Dev Portal domain\n * It's not included in the public typing to hide it from regular dApps\n */\n public async portal(\n feature: 'gastank' | 'customization' | 'project',\n operation: 'get' | 'update' | 'topup' | 'init',\n payload?: any\n ): Promise<unknown> {\n // Removed this for now due to devPortalHostname constant being set as localhost for staging environment on SDK\n // Second validation happens on silk-wallet-internal\n // const reqHostname = new URL(window.location.origin).hostname\n\n // const devPortalHostname = new URL(silkDevPortalOrigin).hostname\n\n // console.log('req hostname: ', reqHostname)\n\n // console.log('devPortalHostName: ', devPortalHostname)\n\n // if (devPortalHostname !== reqHostname) {\n // return Promise.reject({\n // error:\n // 'Unauthorized: Gas tank admin functions are only available from the Dev Portal'\n // })\n // }\n\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n let methodName: string\n switch (operation) {\n case 'get':\n methodName =\n feature === 'gastank'\n ? SILK_METHOD.gastank_get_settings\n : SILK_METHOD.customization_get\n break\n case 'update':\n methodName =\n feature === 'gastank'\n ? SILK_METHOD.gastank_update_settings\n : SILK_METHOD.customization_update\n break\n case 'topup':\n methodName = SILK_METHOD.gastank_topup\n break\n case 'init':\n methodName = SILK_METHOD.project_init\n break\n }\n\n // For update operations, mark as requiring user interaction for signing\n const interactionRequired =\n operation !== 'get' && feature !== 'customization'\n\n // Handle the request to the wallet\n return handleWalletRequestAndResponse(\n {\n method: methodName,\n params: [payload, window.location.origin]\n },\n interactionRequired, // Only open modal for update operations\n this.walletMessageManager,\n this.internalEventEmitter\n )\n }\n\n public async requestEmail(): Promise<unknown> {\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n return handleWalletRequestAndResponse(\n { method: SILK_METHOD.silk_requestEmail },\n true,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n }\n\n /**\n * Request a Permission Token from the user.\n * Allows pre-authorized transactions without individual confirmations.\n * @param params - Permission token parameters (allowed addresses, chain, limits, expiry)\n * @returns Promise<RequestPermissionTokenResult>\n */\n public async requestPermissionToken(\n params: RequestPermissionTokenParams\n ): Promise<unknown> {\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.waap_requestPermissionToken,\n params: [params]\n },\n true, // Requires UI for user approval\n this.walletMessageManager,\n this.internalEventEmitter\n )\n }\n\n /**\n * Prompt the user to mint a Zeronym SBT.\n * @returns string or null - The address of the owner of the SBT, or null\n * if the user already minted the SBT.\n */\n public async requestSBT(type: CredentialType): Promise<unknown> {\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.silk_requestSbt,\n params: [type]\n },\n true,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n }\n}\n\nexport { EthereumProvider }\n","/**\n * WaaP Component\n *\n * A custom HTML element that allows developers to control where the WaaP wallet\n * renders in their UI. When present, the wallet will render inside this component\n * instead of as a centered modal with backdrop.\n *\n * Usage in HTML:\n * ```html\n * <waap-wallet></waap-wallet>\n * ```\n *\n * Usage in React/JSX:\n * ```tsx\n * function App() {\n * return <waap-wallet style={{ width: '400px', height: '600px' }} />\n * }\n * ```\n */\n\n// Internal constants (not exported)\nconst WAAP_COMPONENT_TAG_NAME = 'waap-wallet'\nconst WAAP_COMPONENT_CONTAINER_ID = 'waap-component-container'\n\n/**\n * Check if we're in a browser environment\n */\nconst isBrowser =\n typeof window !== 'undefined' &&\n typeof document !== 'undefined' &&\n typeof HTMLElement !== 'undefined'\n\n/**\n * Custom HTML element for WaaP wallet\n * Only defined in browser environments to avoid SSR issues\n */\nlet WaapWalletElement: any\n\nif (isBrowser) {\n WaapWalletElement = class extends HTMLElement {\n constructor() {\n super()\n\n // Set default styles if not specified\n if (!this.style.display || this.style.display === '') {\n this.style.display = 'flex'\n this.style.alignItems = 'center'\n this.style.justifyContent = 'center'\n }\n\n if (!this.style.width || this.style.width === '') {\n this.style.width = '100%'\n }\n\n if (!this.style.height || this.style.height === '') {\n this.style.height = '100%'\n }\n\n // Add container ID for SDK to find it\n this.id = WAAP_COMPONENT_CONTAINER_ID\n }\n\n connectedCallback() {\n // Element has been added to the DOM\n this.setAttribute('data-waap-mounted', 'true')\n }\n\n disconnectedCallback() {\n // Element has been removed from the DOM\n this.removeAttribute('data-waap-mounted')\n }\n }\n\n // Auto-register the component when in browser\n if (\n typeof customElements !== 'undefined' &&\n !customElements.get(WAAP_COMPONENT_TAG_NAME)\n ) {\n customElements.define(WAAP_COMPONENT_TAG_NAME, WaapWalletElement)\n }\n} else {\n // Provide a dummy class for SSR environments\n WaapWalletElement = class {}\n}\n\n/**\n * Check if a WaaP component exists in the DOM (internal use)\n */\nexport function hasWaapComponent(): boolean {\n if (!isBrowser) return false\n\n return (\n !!document.getElementById(WAAP_COMPONENT_CONTAINER_ID) ||\n !!document.querySelector(WAAP_COMPONENT_TAG_NAME)\n )\n}\n\n/**\n * Get the WaaP component container element (internal use)\n */\nexport function getWaapComponentContainer(): HTMLElement | null {\n if (!isBrowser) return null\n\n return (\n document.getElementById(WAAP_COMPONENT_CONTAINER_ID) ||\n document.querySelector(WAAP_COMPONENT_TAG_NAME)\n )\n}\n\n/**\n * Export the custom element class for advanced use cases\n * Most users won't need this - just use <waap-wallet> in your HTML/JSX\n */\nexport { WaapWalletElement as WaaP }\n","import {\n silkWalletAppOrigin2,\n silkWalletAppOrigin2Staging\n} from '@human.tech/waap-constants'\nimport {\n InitSilkOptions,\n SilkEthereumProviderInterface\n} from '../lib/provider/types.js'\nimport { EthereumProvider } from '../lib/provider/EthereumProvider.js'\nimport { UI_EVENT_NAMES } from '../lib/UIMessageManager.js'\nimport { SilkWalletConnect } from 'lib/WalletConnect.js'\nimport { hasWaapComponent, getWaapComponentContainer } from './WaapComponent.js'\n\n// Container ID constants - supporting both old (silk-wallet) and new (waap-wallet) naming\nconst LEGACY_IFRAME_CONTAINER_ID = 'silk-wallet-iframe-container'\nconst LEGACY_IFRAME_WRAPPER_ID = 'silk-wallet-iframe-wrapper'\nconst LEGACY_IFRAME_ID = 'silk-wallet-iframe'\n\nconst NEW_IFRAME_CONTAINER_ID = 'waap-wallet-iframe-container'\nconst NEW_IFRAME_WRAPPER_ID = 'waap-wallet-iframe-wrapper'\nconst NEW_IFRAME_ID = 'waap-wallet-iframe'\n\n/**\n * Get the existing iframe container element, checking both old and new naming conventions\n * @returns HTMLElement | null\n */\nconst getIframeContainer = (): HTMLElement | null => {\n return (\n document.getElementById(NEW_IFRAME_CONTAINER_ID) ||\n document.getElementById(LEGACY_IFRAME_CONTAINER_ID)\n )\n}\n\n/**\n * Get the existing iframe wrapper element, checking both old and new naming conventions\n * @returns HTMLElement | null\n */\nconst getIframeWrapper = (): HTMLElement | null => {\n return (\n document.getElementById(NEW_IFRAME_WRAPPER_ID) ||\n document.getElementById(LEGACY_IFRAME_WRAPPER_ID)\n )\n}\n\n/**\n * Get the existing iframe element, checking both old and new naming conventions\n * @returns HTMLIFrameElement | null\n */\nconst getIframe = (): HTMLIFrameElement | null => {\n return (document.getElementById(NEW_IFRAME_ID) ||\n document.getElementById(LEGACY_IFRAME_ID)) as HTMLIFrameElement | null\n}\n\n// Default to new naming for new installations\nconst iframeContainerId = NEW_IFRAME_CONTAINER_ID\nconst iframeWrapperId = NEW_IFRAME_WRAPPER_ID\nconst iframeId = NEW_IFRAME_ID\n\n/**\n * Create iframe element with proper configuration\n */\nconst createIframeElement = (useStaging: boolean): HTMLIFrameElement => {\n const iframe = window.document.createElement('iframe')\n iframe.id = iframeId\n iframe.src = `${\n useStaging ? silkWalletAppOrigin2Staging : silkWalletAppOrigin2\n }/iframe`\n\n console.log('iframe.src: ', iframe.src)\n\n iframe.style.width = '100%'\n iframe.style.height = '100%'\n iframe.style.border = 'none'\n iframe.style.borderRadius = '24px'\n iframe.style.backgroundColor = 'transparent'\n iframe.style.background = 'transparent'\n iframe.style.padding = '0'\n iframe.style.margin = '0'\n\n return iframe\n}\n\n/**\n * Setup message listener for iframe size updates\n */\nconst setupIframeMessageListener = (\n useStaging: boolean,\n iframe: HTMLIFrameElement\n) => {\n const handleIframeMessage = (event: MessageEvent) => {\n const expectedOrigin = useStaging\n ? silkWalletAppOrigin2Staging\n : silkWalletAppOrigin2\n\n if (event.origin !== expectedOrigin) return\n if (!event.data || typeof event.data !== 'object') return\n if (event.data.type !== 'silk-iframe-size') return\n\n const contentHeight = event.data.height\n const contentWidth = event.data.width\n\n const maxDimension = 2000\n const minDimension = 50\n\n if (typeof contentHeight !== 'number' || typeof contentWidth !== 'number')\n return\n if (contentHeight < minDimension || contentHeight > maxDimension) return\n if (contentWidth < minDimension || contentWidth > maxDimension) return\n if (!Number.isFinite(contentHeight) || !Number.isFinite(contentWidth))\n return\n\n const iframeWrapper = getIframeWrapper()\n if (!iframeWrapper) return\n\n iframeWrapper.style.height = `${Math.floor(contentHeight)}px`\n iframeWrapper.style.width = `${Math.floor(contentWidth)}px`\n }\n\n window.addEventListener('message', handleIframeMessage)\n ;(iframe as any).__silkCleanup = () => {\n window.removeEventListener('message', handleIframeMessage)\n }\n}\n\n/**\n * Create iframe in custom component mode (no modal/backdrop)\n */\nconst createComponentModeIframe = (useStaging: boolean) => {\n const componentContainer = getWaapComponentContainer()\n if (!componentContainer) {\n throw new Error('WaaP component not found in DOM')\n }\n\n // Check if iframe already exists\n if (getIframe()) {\n return\n }\n\n // Create iframe wrapper\n const iframeWrapper = window.document.createElement('div')\n iframeWrapper.id = iframeWrapperId\n iframeWrapper.style.position = 'relative'\n iframeWrapper.style.display = 'flex'\n iframeWrapper.style.alignItems = 'center'\n iframeWrapper.style.justifyContent = 'center'\n iframeWrapper.style.padding = '0'\n iframeWrapper.style.margin = '0'\n iframeWrapper.style.height = '600px'\n iframeWrapper.style.width = '380px'\n\n // Create and configure iframe\n const iframe = createIframeElement(useStaging)\n setupIframeMessageListener(useStaging, iframe)\n\n // Set default dimensions\n setTimeout(() => {\n const wrapper = getIframeWrapper()\n if (wrapper) {\n wrapper.style.height = '600px'\n wrapper.style.width = '380px'\n }\n }, 100)\n\n iframeWrapper.appendChild(iframe)\n componentContainer.appendChild(iframeWrapper)\n}\n\n/**\n * Create iframe in modal mode (with backdrop) - default behavior\n */\nconst createModalModeIframe = (useStaging: boolean) => {\n // If iframe container is already on page, do nothing\n if (getIframeContainer()) {\n return\n }\n\n // Create modal container\n const container = window.document.createElement('div')\n container.id = iframeContainerId\n container.style.position = 'fixed'\n container.style.top = '0'\n container.style.left = '0'\n container.style.right = '0'\n container.style.bottom = '0'\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.alignItems = 'center'\n container.style.justifyContent = 'center'\n container.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'\n container.style.zIndex = '9999999999'\n container.style.display = 'none'\n\n // Create iframe wrapper\n const iframeWrapper = window.document.createElement('div')\n iframeWrapper.id = iframeWrapperId\n iframeWrapper.style.position = 'relative'\n iframeWrapper.style.display = 'flex'\n iframeWrapper.style.alignItems = 'center'\n iframeWrapper.style.justifyContent = 'center'\n iframeWrapper.style.padding = '0'\n iframeWrapper.style.margin = '0'\n iframeWrapper.style.height = '600px'\n iframeWrapper.style.width = '380px'\n\n container.appendChild(iframeWrapper)\n\n // Create and configure iframe\n const iframe = createIframeElement(useStaging)\n setupIframeMessageListener(useStaging, iframe)\n\n // Set default dimensions\n setTimeout(() => {\n const wrapper = getIframeWrapper()\n if (wrapper) {\n wrapper.style.height = '600px'\n wrapper.style.width = '380px'\n }\n }, 100)\n\n iframeWrapper.appendChild(iframe)\n window.document.body.appendChild(container)\n}\n\n/**\n * Main function to create the WaaP iframe in either modal or component mode\n */\nconst createSilkIframe = (useStaging: boolean) => {\n // Check if custom component exists\n if (hasWaapComponent()) {\n createComponentModeIframe(useStaging)\n } else {\n createModalModeIframe(useStaging)\n }\n}\n\n// function warnStagingInit(useStaging: boolean) {\n// if (useStaging) {\n// console.log(\n// 'WARNING: Silk has been initialized to use the Silk staging environment. ' +\n// 'Silk staging is subject to rapid, unannounced changes, and is not ' +\n// 'recommended for production use or for storing large amounts of funds.'\n// )\n// }\n// }\n\n/**\n * @param referralCode - WaaP points referral code\n * @param customConfig - WaaP custom UI configuration\n * @param project - WaaP project configuration\n * @param useStaging - Whether to use the staging environment\n * @param walletConnectProjectId - WalletConnect project ID (only required when passing `wallet` to `authenticationMethods`)\n * @param walletConnectOptionalChains - Optional chains to use for WalletConnect\n */\n\nconst initWaaP = (\n params: InitSilkOptions = {}\n): SilkEthereumProviderInterface => {\n // warnStagingInit(!!params.useStaging)\n createSilkIframe(!!params.useStaging)\n\n const iframe = getIframe()\n if (!iframe) {\n throw new Error('WaaP iframe does not exist on page')\n }\n\n // Check if we're in component mode or modal mode\n const isComponentMode = hasWaapComponent()\n\n // If walletConnectProjectId is provided, set it\n if (params.walletConnectProjectId) {\n SilkWalletConnect.setProjectId(params.walletConnectProjectId)\n }\n\n const { referralCode, config, project, asyncTxs, asyncSigning } = params\n\n if (asyncSigning && !asyncTxs) {\n console.warn(\n '[WaaP SDK] `asyncSigning` is deprecated. Use `asyncTxs` instead.'\n )\n }\n\n // Create ethereum provider and attach it to window\n const contentWindow = iframe.contentWindow as Window\n const silkEthereumProvider = new EthereumProvider(\n contentWindow,\n referralCode,\n config || {},\n project || {},\n params.useStaging,\n asyncTxs || asyncSigning || false\n )\n\n // Track the current mode to detect changes\n let currentMode: 'modal' | 'component' = isComponentMode\n ? 'component'\n : 'modal'\n\n // Setup visibility handlers - check component mode dynamically when showing\n silkEthereumProvider.uiMessageManager.on(UI_EVENT_NAMES.show_modal, () => {\n // Re-check component mode each time (component might be added after init)\n const nowComponentMode = hasWaapComponent()\n const newMode = nowComponentMode ? 'component' : 'modal'\n const iframeWrapper = getIframeWrapper()\n\n // If mode changed, move iframe wrapper to new location\n if (newMode !== currentMode && iframeWrapper) {\n currentMode = newMode\n\n if (nowComponentMode) {\n // Move to component\n const componentContainer = getWaapComponentContainer()\n if (componentContainer) {\n componentContainer.appendChild(iframeWrapper)\n }\n } else {\n // Move back to modal container\n let modalContainer = getIframeContainer()\n if (!modalContainer) {\n // Create modal container if it doesn't exist\n modalContainer = window.document.createElement('div')\n modalContainer.id = iframeContainerId\n modalContainer.style.position = 'fixed'\n modalContainer.style.top = '0'\n modalContainer.style.left = '0'\n modalContainer.style.right = '0'\n modalContainer.style.bottom = '0'\n modalContainer.style.width = '100%'\n modalContainer.style.height = '100%'\n modalContainer.style.display = 'flex'\n modalContainer.style.alignItems = 'center'\n modalContainer.style.justifyContent = 'center'\n modalContainer.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'\n modalContainer.style.zIndex = '9999999999'\n window.document.body.appendChild(modalContainer)\n }\n modalContainer.appendChild(iframeWrapper)\n }\n }\n\n const container = getIframeContainer()\n\n if (nowComponentMode && iframeWrapper) {\n // Component mode - show wrapper only\n iframeWrapper.style.display = 'flex'\n } else if (container) {\n // Modal mode - show container with backdrop\n container.style.display = 'flex'\n }\n })\n\n silkEthereumProvider.uiMessageManager.on(UI_EVENT_NAMES.hide_modal, () => {\n const isComponentMode = hasWaapComponent()\n const iframeWrapper = getIframeWrapper()\n const container = getIframeContainer()\n\n if (isComponentMode && iframeWrapper) {\n iframeWrapper.style.display = 'none'\n } else if (container) {\n container.style.display = 'none'\n }\n })\n\n // @ts-ignore\n window.silk = silkEthereumProvider\n // @ts-ignore - WaaP alias\n window.waap = silkEthereumProvider\n\n return silkEthereumProvider\n}\n\nexport { initWaaP }\n","/**\n * A Ethereum provder API (from EIP 1193) for Silk.\n * https://eips.ethereum.org/EIPS/eip-1193\n */\n\n/**\n * Resources:\n * - EIP-2255: Wallet Permissions System: https://eips.ethereum.org/EIPS/eip-2255\n */\nimport {\n CredentialType,\n CustomConfig,\n JSON_RPC_METHOD,\n SILK_METHOD\n} from '@human.tech/waap-interface-core'\nimport { EventEmitter } from 'events'\nimport { EthereumProviderInterface, RequestArguments } from './types.js'\nimport { defaultConfig } from './utils.js'\n\nclass EthereumProviderExtension\n extends EventEmitter\n implements EthereumProviderInterface\n{\n public readonly isSilk = true\n public connected = false\n public config: CustomConfig\n\n constructor(customConfig?: CustomConfig) {\n super()\n this.config = {\n ...defaultConfig,\n ...(customConfig || {})\n }\n }\n\n // Send a message to the background script via `chrome.runtime.sendMessage`\n sendToExtension(args: RequestArguments) {\n // Use window.postMessage to communicate with the content script\n return new Promise((resolve, reject) => {\n window.postMessage({ type: 'FROM_PAGE', request: args }, '*')\n window.addEventListener('message', (event) => {\n if (event.data.type === 'FROM_EXTENSION') {\n if (event.data.error) reject(event.data.error)\n else resolve(event.data.result)\n }\n })\n })\n }\n\n // EIP-1193 `request` method implementation\n public async request(args: RequestArguments): Promise<unknown> {\n if (!Object.keys(JSON_RPC_METHOD).includes(args.method)) {\n return Promise.reject({ error: `Not implemented (${args.method})` })\n }\n\n const response = await this.sendToExtension(args)\n\n if (\n (args.method === JSON_RPC_METHOD.wallet_switchEthereumChain ||\n args.method === JSON_RPC_METHOD.wallet_addEthereumChain) &&\n response === null\n ) {\n this.emit(\n 'chainChanged',\n (args.params as { chainId: string }[])?.[0]?.chainId\n )\n }\n\n return response\n }\n\n // Enable method that dApps use to request accounts\n public async enable(): Promise<unknown> {\n return this.request({ method: 'eth_requestAccounts' })\n }\n\n // Check if the provider is connected\n public isConnected(): boolean {\n return this.connected\n }\n\n // Example of a custom method to handle login requests\n public async login(): Promise<unknown> {\n return this.sendToExtension({ method: SILK_METHOD.login })\n }\n\n // Example of requesting an SBT (Soulbound Token)\n public async requestSBT(type: CredentialType): Promise<unknown> {\n return this.sendToExtension({\n method: SILK_METHOD.silk_requestSbt,\n params: [type]\n })\n }\n\n // Example of toggling dark mode as part of custom config\n public async toggleDarkMode(): Promise<void> {\n this.config.styles!.darkMode = !this.config.styles!.darkMode\n\n await this.sendToExtension({\n method: SILK_METHOD.set_custom_config,\n params: [this.config]\n })\n }\n\n public async safe(): Promise<unknown> {\n return this.sendToExtension({ method: SILK_METHOD.safe })\n }\n}\n\nexport { EthereumProviderExtension }\n","/**\n * WaaP Sui Wallet - Implements Sui Wallet Standard.\n *\n * This wallet adapter allows dApps using @mysten/dapp-kit to discover\n * and interact with WaaP wallet for Sui blockchain operations.\n *\n * @see https://docs.sui.io/standards/wallet-standard\n */\n\nimport { EventEmitter } from 'events'\nimport {\n SILK_METHOD,\n SilkResponse\n} from '@human.tech/waap-interface-core'\n\nimport WalletMessageManager from '../WalletMessageManager.js'\nimport { UIMessageManager, UI_EVENT_NAMES } from '../UIMessageManager.js'\nimport type {\n SuiAccount,\n SuiChain,\n SuiConnectInput,\n SuiConnectOutput,\n SuiSignPersonalMessageInput,\n SuiSignPersonalMessageOutput,\n SuiSignAndExecuteTransactionInput,\n SuiSignAndExecuteTransactionOutput,\n SuiSignTransactionBlockInput,\n SuiSignTransactionBlockOutput,\n SuiSignAndExecuteTransactionBlockInput,\n SuiSignAndExecuteTransactionBlockOutput,\n SuiWalletEventListener,\n WaaPSuiWalletInterface,\n WalletIcon,\n InitWaaPSuiOptions\n} from './types.js'\n\n// WaaP logo as base64 SVG\nconst WAAP_ICON: WalletIcon = 'data:image/webp;base64,UklGRpoDAABXRUJQVlA4WAoAAAAQAAAAYwAAYwAAQUxQSDMDAAABJyAQSOFmFxERA8TatqpGoimANbEAxlBAPhSgQP9FyXv3vkcFEf134EZS5DREhGvTM8z0ki8stMRvK4cm8bk5rIu3xNbvkgPk4K6ti5IHquRQnLi6KrdBb81hdyF1jTLM1CW425943iba38/djOcG+dg85p/KXGd/g7+xAzJ2VPWTS8R+q65uA1ZcwG3iZ4urjw9Lh4xn83n3gZmQQ3VMVGEO6D403jdr81Ml1OISAAf7RGImBHISwQ5zCJonTuEyOyP7Sga4cDcjMPgXuiK9cUpaGrIDJtH4iAB25utB8O0DDztOKTr8u9hpX0jrx6k8UM5eAlqsynNxlX9tPRLQEtySKwcDOIDnMqEcek1UnylVNac4r0mlypNvhmCNODlhUXuT4fxTQyrDKY0uyV+gi0iiLLpY76A08C/IX8GQoYb8PcVxK7HkZkT5IjAF4gZicOfJW1ovJjyAlYVPlM6BkkHGI0fniAIZIXC0CbAM92BB8SBznU0ITYLr9XkfnKlDgV8170HGMWwitY51+zxcgkftLD4RLh4HSTIa3QzRWKxlaHZTz21s6GLxnBmjogkVilW4kuaMMMGUfgkZ1JhrBSEANrEDMwucAXgbTqIExY3FYRMdtkQRDFjD6BKtJ2GWTopGRY4P9DBkdE4rp9LJHuYhju45oeVZVv3zNmVdZiIOffHDppOz0Q34p0e/+nXy7JmF1846lmF2ZombLt8pgZpbPNeqpJSVJ0bGd4cH8dUNflNPfdQVXUkC95UQS0ZGfDmOJgjs3IyVOExZBEsxONd080gYK/ftQ2nbYaqGW89Hu7M6avmzXEjhO4G8O8ae8gwWtwZsyp8v8j/ys5H7bM+unOfurO4bbbL4v865Nb8s98Ld2X9yg6tLBQanMP8fhplOMMN8fiNDzTvNOMXGuYzejo12vY7s3clhXwgDPuBIcxi9QZftbKVxAjLCcVQdRxGR1QknhCs3GuieMLzfrrC9RhfJgVpcXRn71nZfEjsiYy/Ca1J7ch0clK64ReH3G/s2cekpP+BIx2YteMvSoLy6G9FCgd1nvF/VoVRtJoNJNLQ0RM3BXY9WgPbcHF78swAAVlA4IEAAAACwBQCdASpkAGQAPpFIoUylpCMiIKgAsBIJaW7hc+AAY2upvcReWAa6m9xF5YBrqb3EXlgGngAA/v81aVcAAAAA'\n/**\n * WaaP Sui Wallet implementation.\n *\n * Implements the Sui Wallet Standard to allow dApps to:\n * - Connect/disconnect\n * - Sign personal messages\n * - (Future) Sign and execute transactions\n */\nexport class WaaPSuiWallet implements WaaPSuiWalletInterface {\n readonly name = 'WaaP'\n readonly version = '1.0.0'\n readonly icon: WalletIcon = WAAP_ICON\n\n private _accounts: SuiAccount[] = []\n private _chains: SuiChain[] = ['sui:mainnet', 'sui:testnet', 'sui:devnet']\n private walletMessageManager: WalletMessageManager\n private uiMessageManager: UIMessageManager\n private internalEventEmitter = new EventEmitter()\n private changeListeners: Set<SuiWalletEventListener> = new Set()\n\n /**\n * Creates a new WaaPSuiWallet instance.\n *\n * @param iframeWindow - The contentWindow of the WaaP iframe\n * @param options - Initialization options\n */\n constructor(iframeWindow: Window, options: InitWaaPSuiOptions = {}) {\n const useStaging = options.useStaging ?? false\n\n this.walletMessageManager = new WalletMessageManager(iframeWindow, useStaging)\n this.uiMessageManager = new UIMessageManager()\n\n // Tell the iframe to set the referral code\n if (options.referralCode) {\n this.walletMessageManager.pingIframe().then(() => {\n this.postRequestAndWait({\n method: SILK_METHOD.set_points_referral_code,\n params: [options.referralCode],\n interactionRequired: false\n }).catch(err => console.error('Error setting referral code:', err))\n })\n }\n\n // Tell the iframe to set the project config\n if (options.project) {\n this.walletMessageManager.pingIframe().then(() => {\n this.postRequestAndWait({\n method: SILK_METHOD.set_project,\n params: [options.project, window.location.origin],\n interactionRequired: false\n }).catch(err => console.error('Error setting project:', err))\n })\n }\n\n // Tell the iframe to set the custom config\n if (options.config) {\n this.walletMessageManager.pingIframe().then(() => {\n this.postRequestAndWait({\n method: SILK_METHOD.set_custom_config,\n params: [options.config],\n interactionRequired: false\n }).catch(err => console.error('Error setting custom config:', err))\n })\n }\n\n // Set up message listeners\n this.walletMessageManager.addListener({\n handleResponse: (response: SilkResponse) => {\n this.internalEventEmitter.emit(response.id, response)\n },\n handleRequest: (request) => {\n if (request.method === SILK_METHOD.show_modal) {\n this.uiMessageManager.emit(UI_EVENT_NAMES.show_modal)\n } else if (request.method === SILK_METHOD.hide_modal) {\n this.uiMessageManager.emit(UI_EVENT_NAMES.hide_modal)\n }\n },\n onAccountChanged: async (newAccount: string) => {\n // When EVM account changes, refresh Sui accounts\n // by making a silent connect request\n try {\n const result = await this.refreshAccounts()\n this.notifyChange({ accounts: result.accounts })\n } catch (error) {\n console.error('Failed to refresh Sui accounts:', error)\n // Clear accounts on error\n this._accounts = []\n this.notifyChange({ accounts: [] })\n }\n }\n })\n }\n\n /**\n * Refresh accounts by making a silent connect request.\n * Used internally when account changes are detected.\n */\n private async refreshAccounts(): Promise<{ accounts: readonly SuiAccount[] }> {\n try {\n await this.walletMessageManager.pingIframe()\n\n const response = await this.postRequestAndWait({\n method: 'sui_connect' as keyof typeof SILK_METHOD,\n params: [{ silent: true }],\n interactionRequired: false\n })\n\n if (response.error) {\n this._accounts = []\n return { accounts: [] }\n }\n\n const accounts = response.data?.accounts || []\n this._accounts = accounts\n\n return { accounts: this._accounts }\n } catch (error) {\n this._accounts = []\n return { accounts: [] }\n }\n }\n\n /**\n * Supported chains.\n */\n get chains(): readonly SuiChain[] {\n return this._chains\n }\n\n /**\n * Connected accounts.\n */\n get accounts(): readonly SuiAccount[] {\n return this._accounts\n }\n\n /**\n * UI message manager for showing/hiding modal.\n */\n get ui(): UIMessageManager {\n return this.uiMessageManager\n }\n\n /**\n * Connect to the wallet.\n */\n async connect(input?: SuiConnectInput): Promise<SuiConnectOutput> {\n await this.walletMessageManager.pingIframe()\n\n const response = await this.postRequestAndWait({\n method: 'sui_connect' as keyof typeof SILK_METHOD,\n params: [input || {}],\n interactionRequired: !input?.silent\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to connect')\n }\n\n // Update accounts from response\n const accounts = response.data?.accounts || []\n this._accounts = accounts\n\n this.notifyChange({ accounts: this._accounts })\n\n return { accounts: this._accounts }\n }\n\n /**\n * Disconnect from the wallet.\n */\n async disconnect(): Promise<void> {\n await this.walletMessageManager.pingIframe()\n\n await this.postRequestAndWait({\n method: 'sui_disconnect' as keyof typeof SILK_METHOD,\n params: [],\n interactionRequired: false\n })\n\n this._accounts = []\n this.notifyChange({ accounts: [] })\n }\n\n /**\n * Sign a personal message.\n *\n * @param input - Sign personal message input\n * @returns Signed message result with bytes and signature\n */\n async signPersonalMessage(\n input: SuiSignPersonalMessageInput\n ): Promise<SuiSignPersonalMessageOutput> {\n await this.walletMessageManager.pingIframe()\n\n // Validate account is connected\n const accountAddress = input.account.address\n const isConnected = this._accounts.some((a) => a.address === accountAddress)\n\n if (!isConnected) {\n throw new Error(`Account ${accountAddress} is not connected`)\n }\n\n const response = await this.postRequestAndWait({\n method: 'sui_signPersonalMessage' as keyof typeof SILK_METHOD,\n params: [{\n message: Array.from(input.message),\n account: accountAddress,\n chain: input.chain\n }],\n interactionRequired: true\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to sign message')\n }\n\n return {\n bytes: response.data.bytes,\n signature: response.data.signature\n }\n }\n\n /**\n * Helper to resolve transaction bytes from various input formats.\n * If the input is a Transaction/TransactionBlock object, it builds it.\n */\n private async resolveTransactionBytes(tx: any, chain: SuiChain = 'sui:mainnet'): Promise<Uint8Array> {\n if (tx instanceof Uint8Array) {\n return tx\n } else if (Array.isArray(tx)) {\n return new Uint8Array(tx)\n } else if (typeof tx === 'string') {\n try {\n return Uint8Array.from(atob(tx), c => c.charCodeAt(0))\n } catch {\n throw new Error('Transaction string must be base64 encoded bytes. If you have a serialized transaction JSON, please build it to bytes first.')\n }\n } else if (tx && typeof tx === 'object') {\n // 1. Try to build if it's a Transaction/TransactionBlock\n // We check for .build() method which exists on both Transaction and TransactionBlock\n if (typeof tx.build === 'function') {\n try {\n // specific import to avoid bundling the whole library if not needed, \n // but here we likely need it or at least needs to be passed in.\n // Since we added @mysten/sui as dependency, we can use it to build.\n \n // We need a client to build. \n // Construct a temporary client based on the chain.\n // Note: This run in the dApp context, so we use public RPCs.\n const { getFullnodeUrl, SuiClient } = await import('@mysten/sui/client')\n \n let network = 'mainnet'\n if (chain === 'sui:testnet') network = 'testnet'\n else if (chain === 'sui:devnet') network = 'devnet'\n else if (chain === 'sui:localnet') network = 'localnet'\n\n const url = getFullnodeUrl(network as any)\n const client = new SuiClient({ url })\n \n const builtBytes = await tx.build({ client })\n return builtBytes\n } catch (e) {\n console.warn('[SuiWallet] Failed to build transaction object:', e)\n throw new Error(`Failed to build transaction: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // 2. Try serialize() - older standard or some specific objects\n if (typeof tx.serialize === 'function') {\n try {\n const serialized = await tx.serialize()\n if (typeof serialized === 'string') {\n return Uint8Array.from(atob(serialized), c => c.charCodeAt(0))\n } else if (serialized instanceof Uint8Array) {\n return serialized\n }\n } catch (e) {\n console.warn('[SuiWallet] serialize() failed:', e)\n }\n }\n \n // 3. Try toJSON() - dapp-kit might pass this or generic objects\n if (typeof tx.toJSON === 'function') {\n try {\n const json = await tx.toJSON()\n \n if (typeof json === 'string') {\n // Is it base64?\n try {\n return Uint8Array.from(atob(json), c => c.charCodeAt(0))\n } catch {\n // Maybe JSON string?\n try {\n const parsed = JSON.parse(json)\n if (parsed.bytes && typeof parsed.bytes === 'string') {\n return Uint8Array.from(atob(parsed.bytes), c => c.charCodeAt(0))\n }\n } catch {}\n }\n }\n } catch (e) {\n console.warn('[SuiWallet] toJSON() failed:', e)\n }\n }\n\n // 4. Try getData() - older SDKs\n if (typeof tx.getData === 'function') {\n try {\n const data = tx.getData()\n if (data instanceof Uint8Array) return data\n } catch (e) { console.warn('[SuiWallet] getData() failed:', e) }\n }\n\n throw new Error(`Unsupported transaction format. Keys: ${Object.keys(tx).join(', ')}`)\n } else {\n throw new Error(`Unsupported transaction format: ${typeof tx}. Please pass Uint8Array bytes or a Transaction object.`)\n }\n }\n\n /**\n * Sign a transaction.\n *\n * @param input - Sign transaction input with transaction\n * @returns Signed transaction result with bytes and signature\n */\n async signTransaction(input: {\n transaction: unknown\n account: SuiAccount\n chain?: SuiChain\n }): Promise<{ bytes: string; signature: string }> {\n await this.walletMessageManager.pingIframe()\n\n // Validate account is connected\n const accountAddress = input.account.address\n const isConnected = this._accounts.some((a) => a.address === accountAddress)\n\n if (!isConnected) {\n throw new Error(`Account ${accountAddress} is not connected`)\n }\n\n // Resolve transaction bytes\n const txBytes = await this.resolveTransactionBytes(input.transaction, input.chain)\n\n const response = await this.postRequestAndWait({\n method: 'sui_signTransaction' as keyof typeof SILK_METHOD,\n params: [{\n transaction: Array.from(txBytes),\n account: accountAddress,\n chain: input.chain\n }],\n interactionRequired: true\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to sign transaction')\n }\n\n return {\n bytes: response.data.bytes,\n signature: response.data.signature\n }\n }\n\n /**\n * Sign and execute a transaction.\n *\n * @param input - Sign and execute transaction input\n */\n async signAndExecuteTransaction(input: SuiSignAndExecuteTransactionInput): Promise<SuiSignAndExecuteTransactionOutput> {\n await this.walletMessageManager.pingIframe()\n\n // Validate account is connected\n const accountAddress = input.account.address\n const isConnected = this._accounts.some((a) => a.address === accountAddress)\n\n if (!isConnected) {\n throw new Error(`Account ${accountAddress} is not connected`)\n }\n\n // Resolve transaction bytes\n const txBytes = await this.resolveTransactionBytes(input.transaction, input.chain)\n\n const response = await this.postRequestAndWait({\n method: 'sui_signAndExecuteTransaction' as keyof typeof SILK_METHOD,\n params: [{\n transaction: Array.from(txBytes),\n account: accountAddress,\n chain: input.chain,\n options: input.options,\n requestType: input.requestType\n }],\n interactionRequired: true\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to sign and execute transaction')\n }\n\n return response.data\n }\n\n /**\n * Switch the active chain.\n */\n async switchChain(input: { chain: SuiChain }): Promise<void> {\n await this.walletMessageManager.pingIframe()\n\n // Validate chain is supported\n if (!this._chains.includes(input.chain)) {\n throw new Error(`Chain ${input.chain} is not supported`)\n }\n\n const response = await this.postRequestAndWait({\n method: 'sui_switchChain' as keyof typeof SILK_METHOD,\n params: [input],\n interactionRequired: false\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to switch chain')\n }\n\n // Emit change event for chains (since the ordering or active status might conceptually change)\n // Note: The standard doesn't explicitly track \"active chain\" in the account object, \n // but dApps often expect an event or just use the new chain capability.\n // We emit a change event to be safe.\n this.notifyChange({ chains: this._chains, accounts: this._accounts })\n }\n\n /**\n * Subscribe to wallet change events.\n *\n * @param event - Event name (currently only 'change')\n * @param listener - Event listener callback\n * @returns Unsubscribe function\n */\n on(event: 'change', listener: SuiWalletEventListener): () => void {\n if (event === 'change') {\n this.changeListeners.add(listener)\n\n return () => {\n this.changeListeners.delete(listener)\n }\n }\n\n return () => {}\n }\n\n /**\n * Wallet Standard features property.\n * Required by @mysten/wallet-standard registerWallet.\n */\n get features() {\n return {\n 'standard:connect': {\n version: '1.0.0' as const,\n connect: this.connect.bind(this)\n },\n 'standard:disconnect': {\n version: '1.0.0' as const,\n disconnect: this.disconnect.bind(this)\n },\n 'standard:events': {\n version: '1.0.0' as const,\n on: this.on.bind(this)\n },\n 'sui:signPersonalMessage': {\n version: '1.1.0' as const,\n signPersonalMessage: this.signPersonalMessage.bind(this)\n },\n 'sui:signTransaction': {\n version: '2.0.0' as const,\n signTransaction: this.signTransaction.bind(this)\n },\n 'sui:signAndExecuteTransaction': {\n version: '1.0.0' as const,\n signAndExecuteTransaction: this.signAndExecuteTransaction.bind(this)\n },\n 'sui:signTransactionBlock': {\n version: '2.0.0' as const,\n signTransactionBlock: this.signTransactionBlock.bind(this)\n },\n 'sui:signAndExecuteTransactionBlock': {\n version: '1.0.0' as const,\n signAndExecuteTransactionBlock: this.signAndExecuteTransactionBlock.bind(this)\n },\n 'sui:switchChain': {\n version: '1.0.0' as const,\n switchChain: this.switchChain.bind(this)\n }\n } as const\n }\n\n /**\n * Legacy method for signing a transaction block.\n * Maps to signTransaction.\n */\n async signTransactionBlock(input: SuiSignTransactionBlockInput): Promise<SuiSignTransactionBlockOutput> {\n return this.signTransaction({\n transaction: input.transactionBlock,\n account: input.account,\n chain: input.chain\n })\n }\n\n /**\n * Legacy method for signing and executing a transaction block.\n * Maps to signAndExecuteTransaction.\n */\n async signAndExecuteTransactionBlock(input: SuiSignAndExecuteTransactionBlockInput): Promise<SuiSignAndExecuteTransactionBlockOutput> {\n return this.signAndExecuteTransaction({\n transaction: input.transactionBlock,\n account: input.account,\n chain: input.chain,\n options: input.options,\n requestType: input.requestType\n })\n }\n\n /**\n * Request the user's email address.\n *\n * @returns Promise resolving to the user's email address\n */\n async requestEmail(): Promise<string> {\n await this.walletMessageManager.pingIframe()\n\n const response = await this.postRequestAndWait({\n method: SILK_METHOD.silk_requestEmail as keyof typeof SILK_METHOD,\n params: [],\n interactionRequired: true\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to request email')\n }\n\n return response.data as string\n }\n\n /**\n * Post a request to the iframe and wait for response.\n */\n private async postRequestAndWait(args: {\n method: keyof typeof SILK_METHOD\n params: unknown[]\n interactionRequired: boolean\n }): Promise<SilkResponse> {\n const id = await this.walletMessageManager.postSilkRequest({\n method: args.method as keyof typeof SILK_METHOD,\n params: args.params as any[],\n interactionRequired: args.interactionRequired\n })\n\n return new Promise((resolve) => {\n this.internalEventEmitter.once(id, (response: SilkResponse) => {\n resolve(response)\n })\n })\n }\n\n /**\n * Notify all change listeners.\n */\n private notifyChange(properties: { accounts?: readonly SuiAccount[], chains?: readonly SuiChain[] }) {\n Array.from(this.changeListeners).forEach((listener) => {\n listener(properties)\n })\n }\n}\n","/**\n * Initialization function for WaaP Sui Wallet.\n */\n\nimport {\n silkWalletAppOrigin2,\n silkWalletAppOrigin2Staging\n} from '@human.tech/waap-constants'\n\nimport { WaaPSuiWallet } from './SuiWallet.js'\nimport { UI_EVENT_NAMES } from '../UIMessageManager.js'\nimport type { InitWaaPSuiOptions, WaaPSuiWalletInterface } from './types.js'\n\n// Iframe IDs (shared with EthereumProvider)\nconst IFRAME_CONTAINER_ID = 'waap-wallet-iframe-container'\nconst IFRAME_ID = 'waap-wallet-iframe'\nconst LEGACY_IFRAME_CONTAINER_ID = 'silk-wallet-iframe-container'\nconst LEGACY_IFRAME_ID = 'silk-wallet-iframe'\n\n/**\n * Get the existing iframe container element.\n */\nconst getIframeContainer = (): HTMLElement | null => {\n return (\n document.getElementById(IFRAME_CONTAINER_ID) ||\n document.getElementById(LEGACY_IFRAME_CONTAINER_ID)\n )\n}\n\n/**\n * Get the existing iframe element.\n */\nconst getIframe = (): HTMLIFrameElement | null => {\n return (document.getElementById(IFRAME_ID) ||\n document.getElementById(LEGACY_IFRAME_ID)) as HTMLIFrameElement | null\n}\n\n// Iframe wrapper ID\nconst IFRAME_WRAPPER_ID = 'waap-wallet-iframe-wrapper'\nconst LEGACY_IFRAME_WRAPPER_ID = 'silk-wallet-iframe-wrapper'\n\n/**\n * Get the existing iframe wrapper element.\n */\nconst getIframeWrapper = (): HTMLElement | null => {\n return (\n document.getElementById(IFRAME_WRAPPER_ID) ||\n document.getElementById(LEGACY_IFRAME_WRAPPER_ID)\n )\n}\n\n/**\n * Setup message listener for iframe size updates\n */\nconst setupIframeMessageListener = (useStaging: boolean) => {\n const handleIframeMessage = (event: MessageEvent) => {\n const expectedOrigin = useStaging\n ? silkWalletAppOrigin2Staging\n : silkWalletAppOrigin2\n\n if (event.origin !== expectedOrigin) return\n if (!event.data || typeof event.data !== 'object') return\n if (event.data.type !== 'silk-iframe-size') return\n\n const contentHeight = event.data.height\n const contentWidth = event.data.width\n\n const maxDimension = 2000\n const minDimension = 50\n\n if (typeof contentHeight !== 'number' || typeof contentWidth !== 'number')\n return\n if (contentHeight < minDimension || contentHeight > maxDimension) return\n if (contentWidth < minDimension || contentWidth > maxDimension) return\n if (!Number.isFinite(contentHeight) || !Number.isFinite(contentWidth))\n return\n\n const iframeWrapper = getIframeWrapper()\n if (!iframeWrapper) return\n\n iframeWrapper.style.height = `${Math.floor(contentHeight)}px`\n iframeWrapper.style.width = `${Math.floor(contentWidth)}px`\n }\n\n window.addEventListener('message', handleIframeMessage)\n}\n\n/**\n * Create the WaaP iframe if it doesn't exist.\n */\nconst createWaapIframe = (useStaging: boolean) => {\n if (getIframeContainer()) {\n return // Already exists\n }\n\n // Create iframe container\n const container = document.createElement('div')\n container.id = IFRAME_CONTAINER_ID\n container.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100%;\n height: 100%;\n display: none;\n align-items: center;\n justify-content: center;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 9999999999;\n `\n\n // Create iframe wrapper\n const wrapper = document.createElement('div')\n wrapper.id = IFRAME_WRAPPER_ID\n wrapper.style.cssText = `\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n margin: 0;\n height: 600px;\n width: 380px;\n `\n container.appendChild(wrapper)\n\n // Create iframe\n const iframe = document.createElement('iframe')\n iframe.id = IFRAME_ID\n iframe.src = `${useStaging ? silkWalletAppOrigin2Staging : silkWalletAppOrigin2}/iframe`\n iframe.style.cssText = `\n width: 100%;\n height: 100%;\n border: none;\n border-radius: 24px;\n background: transparent;\n `\n wrapper.appendChild(iframe)\n\n // Setup message listener for dynamic size updates\n setupIframeMessageListener(useStaging)\n\n document.body.appendChild(container)\n}\n\n/**\n * Initialize WaaP Sui Wallet.\n *\n * This creates the WaaP iframe (if needed) and returns a SuiWallet instance\n * that implements the Sui Wallet Standard.\n *\n * @param options - Initialization options\n * @returns WaaPSuiWallet instance\n *\n * @example\n * ```typescript\n * import { initWaaPSui } from '@silk-wallet/silk-wallet-sdk'\n *\n * const suiWallet = initWaaPSui()\n *\n * // Connect to get accounts\n * const { accounts } = await suiWallet.connect()\n *\n * // Sign a message\n * const result = await suiWallet.signPersonalMessage({\n * message: new TextEncoder().encode('Hello, Sui!'),\n * account: accounts[0]\n * })\n * ```\n */\nexport function initWaaPSui(options: InitWaaPSuiOptions = {}): WaaPSuiWalletInterface {\n const useStaging = options.useStaging ?? false\n\n // Create iframe if it doesn't exist\n createWaapIframe(useStaging)\n\n const container = getIframeContainer()\n const iframe = getIframe()\n\n if (!container || !iframe) {\n throw new Error('Failed to create WaaP iframe')\n }\n\n // Wait for iframe to load\n const contentWindow = iframe.contentWindow as Window\n\n // Create Sui wallet\n const suiWallet = new WaaPSuiWallet(contentWindow, options)\n\n // Set up modal show/hide\n suiWallet.ui.on(UI_EVENT_NAMES.show_modal, () => {\n container.style.display = 'flex'\n \n // Hide @mysten/dapp-kit connect modal overlay when WaaP modal shows\n // This provides better UX by preventing overlapping modals\n const dappKitOverlays = document.querySelectorAll<HTMLElement>('[data-dapp-kit][class*=\"overlay\"]')\n dappKitOverlays.forEach((overlay) => {\n overlay.style.display = 'none'\n })\n })\n\n suiWallet.ui.on(UI_EVENT_NAMES.hide_modal, () => {\n container.style.display = 'none'\n \n // Restore @mysten/dapp-kit connect modal visibility if it was hidden\n const dappKitOverlays = document.querySelectorAll<HTMLElement>('[data-dapp-kit][class*=\"overlay\"]')\n dappKitOverlays.forEach((overlay) => {\n overlay.style.display = ''\n })\n })\n\n return suiWallet\n}\n","/**\n * WaaP Sui Wallet Registration\n *\n * Registers the WaaP Sui wallet with the Wallet Standard registry,\n * making it discoverable by dApps using @mysten/dapp-kit.\n *\n * @see https://docs.sui.io/standards/wallet-standard\n */\n\nimport { registerWallet } from '@mysten/wallet-standard'\nimport { WaaPSuiWallet } from './SuiWallet.js'\nimport type { InitWaaPSuiOptions, WaaPSuiWalletInterface } from './types.js'\n\n/**\n * Register WaaP Sui Wallet with the Wallet Standard.\n *\n * This makes the wallet discoverable by dApps using @mysten/dapp-kit.\n * The wallet will appear in the wallet selection UI of any dApp\n * that uses the Sui Wallet Standard.\n *\n * @param iframeWindow - The contentWindow of the WaaP iframe\n * @param options - Initialization options\n * @returns The registered WaaPSuiWallet instance\n *\n * @example\n * ```typescript\n * import { registerWaaPSuiWallet } from '@silk-wallet/silk-wallet-sdk'\n *\n * // Get the iframe element\n * const iframe = document.getElementById('waap-wallet-iframe') as HTMLIFrameElement\n *\n * // Register the wallet (makes it discoverable by dApps)\n * const wallet = registerWaaPSuiWallet(iframe.contentWindow!, { useStaging: false })\n *\n * // The wallet is now available in dapp-kit's wallet list\n * ```\n */\nexport function registerWaaPSuiWallet(\n iframeWindow: Window,\n options: InitWaaPSuiOptions = {}\n): WaaPSuiWalletInterface {\n const wallet = new WaaPSuiWallet(iframeWindow, options)\n\n // Register with Wallet Standard\n // This adds the wallet to the global registry, making it discoverable\n registerWallet(wallet as any)\n\n return wallet\n}\n\n/**\n * Unregister callback type returned by registerWallet.\n * Can be called to remove the wallet from the registry.\n */\nexport type UnregisterWallet = () => void\n","import { useEffect, useState, useCallback, useRef } from 'react'\nimport type {\n AsyncSignCompleteEvent,\n AsyncTxPendingEvent,\n AsyncTxConfirmedEvent,\n AsyncTxFailedEvent\n} from '@human.tech/waap-interface-core'\nimport type { RequestArguments } from '../lib/provider/types.js'\n\n/**\n * Transaction state tracked by the hook.\n * Keyed by txHash (pre-calculated from keccak256(serializedSignedTx)).\n */\ninterface TxState {\n status: 'signed' | 'tx_pending' | 'confirmed' | 'failed'\n txHash: string\n /** @deprecated Use `txHash` instead. */\n pendingTxId?: string\n signature?: string\n serializedTx?: string\n receipt?: AsyncTxConfirmedEvent['receipt']\n error?: string\n stage?: AsyncTxFailedEvent['stage']\n}\n\n/**\n * Options for useWaapTransaction hook\n */\ninterface UseWaapTransactionOptions {\n onSigned?: (event: AsyncSignCompleteEvent) => void\n onTxPending?: (event: AsyncTxPendingEvent) => void\n onConfirmed?: (event: AsyncTxConfirmedEvent) => void\n onFailed?: (event: AsyncTxFailedEvent) => void\n /** @deprecated No longer emitted in v2. */\n onPending?: (event: any) => void\n /** @deprecated No longer emitted in v2. */\n on2faRequired?: (event: any) => void\n /** @deprecated Use `onFailed` instead. */\n onSignFailed?: (event: any) => void\n}\n\n/**\n * Return type for useWaapTransaction hook\n */\ninterface UseWaapTransactionReturn {\n /**\n * Send a transaction using eth_sendTransaction.\n * When asyncTxs is enabled, resolves with the pre-calculated txHash\n * after signing. Broadcasting continues in the background with events.\n */\n sendTransaction: (txRequest: RequestArguments['params']) => Promise<string>\n /**\n * Sign a transaction without broadcasting using eth_signTransaction.\n * Always resolves with the signature directly.\n */\n signTransaction: (txRequest: RequestArguments['params']) => Promise<string>\n /**\n * Map of transaction hashes to their current state\n */\n pendingTransactions: Map<string, TxState>\n /**\n * Whether there are any pending transactions\n */\n isAnyPending: boolean\n}\n\n/**\n * React hook for handling async transactions with WaaP SDK.\n *\n * When `asyncTxs` is enabled (via `initWaaP({ asyncTxs: true })` or per-request `{ async: true }`):\n * - `eth_sendTransaction` resolves with the pre-calculated tx hash after signing\n * - Broadcasting and confirmation happen in the background with events\n * - Use the callbacks to track transaction lifecycle\n *\n * Other signing methods (`personal_sign`, `eth_signTypedData_v4`, `eth_signTransaction`)\n * always resolve with the signature directly — no events needed.\n *\n * @example\n * ```tsx\n * const { sendTransaction, pendingTransactions, isAnyPending } = useWaapTransaction({\n * onSigned: ({ txHash }) => console.log('Signed:', txHash),\n * onTxPending: ({ txHash }) => console.log('Broadcasting:', txHash),\n * onConfirmed: ({ txHash, receipt }) => console.log('Confirmed:', txHash),\n * onFailed: ({ txHash, error }) => console.error('Failed:', txHash, error)\n * });\n *\n * const handleSend = async () => {\n * const txHash = await sendTransaction([{ to: '0x...', value: '0x...' }]);\n * console.log('Got tx hash:', txHash);\n * };\n * ```\n */\nexport function useWaapTransaction(\n options?: UseWaapTransactionOptions\n): UseWaapTransactionReturn {\n const [pendingTransactions, setPendingTransactions] = useState<\n Map<string, TxState>\n >(new Map())\n const optionsRef = useRef(options)\n\n // Keep options ref updated\n useEffect(() => {\n optionsRef.current = options\n }, [options])\n\n useEffect(() => {\n // Get the provider from window\n const provider = (window as any).waap || (window as any).silk\n if (!provider) {\n console.warn(\n '[useWaapTransaction] WaaP provider not found. Make sure initWaaP() was called.'\n )\n return\n }\n\n // Handle waap_sign_complete - signing finished, tx hash available\n const handleSignComplete = (event: AsyncSignCompleteEvent) => {\n setPendingTransactions((prev) => {\n const next = new Map(prev)\n next.set(event.txHash, {\n status: 'signed',\n txHash: event.txHash,\n pendingTxId: event.txHash,\n signature: event.signature,\n serializedTx: event.serializedTx\n })\n return next\n })\n optionsRef.current?.onSigned?.(event)\n }\n\n // Handle waap_tx_pending - transaction broadcast, waiting for confirmation\n const handleTxPending = (event: AsyncTxPendingEvent) => {\n setPendingTransactions((prev) => {\n const next = new Map(prev)\n const existing = next.get(event.txHash)\n if (existing) {\n next.set(event.txHash, {\n ...existing,\n status: 'tx_pending'\n })\n }\n return next\n })\n optionsRef.current?.onTxPending?.(event)\n }\n\n // Handle waap_tx_confirmed - transaction confirmed on-chain\n const handleConfirmed = (event: AsyncTxConfirmedEvent) => {\n setPendingTransactions((prev) => {\n const next = new Map(prev)\n const existing = next.get(event.txHash)\n if (existing) {\n next.set(event.txHash, {\n ...existing,\n status: 'confirmed',\n receipt: event.receipt\n })\n }\n return next\n })\n optionsRef.current?.onConfirmed?.(event)\n }\n\n // Handle waap_tx_failed - broadcast or confirmation failed\n const handleTxFailed = (event: AsyncTxFailedEvent) => {\n setPendingTransactions((prev) => {\n const next = new Map(prev)\n const existing = next.get(event.txHash)\n if (existing) {\n next.set(event.txHash, {\n ...existing,\n status: 'failed',\n error: event.error,\n stage: event.stage\n })\n }\n return next\n })\n optionsRef.current?.onFailed?.(event)\n }\n\n // Subscribe to events\n provider.on('waap_sign_complete', handleSignComplete)\n provider.on('waap_tx_pending', handleTxPending)\n provider.on('waap_tx_confirmed', handleConfirmed)\n provider.on('waap_tx_failed', handleTxFailed)\n\n return () => {\n // Cleanup listeners\n provider.removeListener?.('waap_sign_complete', handleSignComplete)\n provider.removeListener?.('waap_tx_pending', handleTxPending)\n provider.removeListener?.('waap_tx_confirmed', handleConfirmed)\n provider.removeListener?.('waap_tx_failed', handleTxFailed)\n }\n }, [])\n\n const sendTransaction = useCallback(\n async (txRequest: RequestArguments['params']): Promise<string> => {\n const provider = (window as any).waap || (window as any).silk\n if (!provider) {\n throw new Error('WaaP provider not found')\n }\n\n return provider.request({\n method: 'eth_sendTransaction',\n params: txRequest\n })\n },\n []\n )\n\n const signTransaction = useCallback(\n async (txRequest: RequestArguments['params']): Promise<string> => {\n const provider = (window as any).waap || (window as any).silk\n if (!provider) {\n throw new Error('WaaP provider not found')\n }\n\n return provider.request({\n method: 'eth_signTransaction',\n params: txRequest\n })\n },\n []\n )\n\n const isAnyPending = Array.from(pendingTransactions.values()).some(\n (tx) => tx.status === 'signed' || tx.status === 'tx_pending'\n )\n\n return {\n sendTransaction,\n signTransaction,\n pendingTransactions,\n isAnyPending\n }\n}\n\nexport type { TxState, UseWaapTransactionOptions, UseWaapTransactionReturn }\n"],"names":["UI_EVENT_NAMES","UIMessageManager","_EventEmitter","call","this","_inheritsLoose","EventEmitter","handleWalletRequestAndResponse","args","interactionRequired","walletMessageManager","internalProviderEventEmitter","silkOptions","Promise","resolve","postSilkRequest","method","params","then","id","reject","once","response","error","data","e","defaultConfig","styles","darkMode","pact","state","value","s","_Pact","o","_settle","bind","v","observer","prototype","onFulfilled","onRejected","result","callback","_this","thenable","SilkWalletConnect","setProjectId","projectId","getProjectIdFromEnv","process","env","NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID","VITE_WALLET_CONNECT_PROJECT_ID","REACT_APP_WALLET_CONNECT_PROJECT_ID","WALLET_CONNECT_PROJECT_ID","getInstance","window","document","_interopNamespace","require","_ref","createAppKit","_ref2","mainnet","sepolia","optimism","arbitrum","polygon","gnosis","avalanche","aurora","fantom","base","celo","metadata","name","description","url","location","origin","icons","instance","adapters","EthersAdapter","networks","features","socials","email","console","listenToAccountChangeEvent","_this2","subscribeAccount","accountState","isConnected","waitForReadyAndCheckConnection","_this3","attempts","_temp","_for","delay","setTimeout","getIsConnectedState","log","_this$instance$getIsC","_this$instance","getWalletProvider","_this$instance$getWal","_this$instance2","undefined","chains","_excluded","WalletMessageManager","iframeWindow","useStaging","walletOrigin","silkWalletAppOrigin2Staging","silkWalletAppOrigin2","_proto","postSilkNotification","postMessage","target","messageType","SILK_MESSAGE_TYPE","notification","postReadyNotification","SILK_NOTIFICATION","ready","postConnectNotification","connect","pingIframe","addEventListener","eventHandler","event","removeEventListener","req","baseRequest","_extends","_objectWithoutPropertiesLoose","request","generateMessageId","addListener","config","handleResponse","handleRequest","onReceiveConnectNotif","onAccountChanged","onAsyncTxNotification","_event$data","_event$data2","_event$data3","_event$data4","_event$data5","_event$data6","_event$data7","type","account_changed","account","startsWith","payload","_catch","body","recover","VALID_LOGIN_METHODS","EthereumProvider","referralCode","customConfig","project","asyncTxs","legacyAsyncSigning","isSilk","isWaaP","connected","uiMessageManager","currentAccount","walletConnectProvider","persistedMethods","internalEventEmitter","login","logout","getLoginMethod","portal","requestEmail","requestSBT","requestPermissionToken","orcid","enable","toggleDarkMode","silkRequest","waaPRequest","emit","SILK_METHOD","show_modal","hide_modal","newAccount","set_points_referral_code","set_project","set_custom_config","initializeWalletConnect","_SilkWalletConnect$ge","_this4","Object","keys","JSON_RPC_METHOD","includes","attemptAutoConnect","autoConnectResult","_typedData$domain","Array","isArray","typedData","JSON","parse","stringify","primaryType","domain","verifyingContract","message","_unused","isSafeTransaction","eth_signTypedData_v4","isAsync","eth_sendTransaction","eth_signTransaction","personal_sign","async","withPT","asyncSigning","rpcMethodRequiresUI","_temp3","wallet_switchEthereumChain","wallet_addEthereumChain","_args$params","chainId","_temp2","accounts","_args$params2","_args$params3","length","_args$params4","warn","customProvider","_temp8","provider","ethereum","providerWalletName","isMetaMask","isApexWallet","isAvalanche","isBitKeep","isBlockWallet","isMathWallet","isOkxWallet","isOKExWallet","isOneInchIOSWallet","isOneInchAndroidWallet","isOpera","isPortal","isRabby","isDefiant","isTokenPocket","isTokenary","isZerion","_this5","rawResponse","_interrupt","loginMethod","Error","join","normalizeLoginResponse","_temp6","discriminant","cases","dispatchIndex","outer","i","test","testValue","awaitBody","fallthroughCheck","_resumeAfterBody","_resumeAfterTest","_switch","localStorage","setItem","setupWaaP","setupInjectedWallet","_temp5","wcProvider","setupWalletConnect","_temp4","open","view","_temp7","_this5$config$authent","authenticationMethods","_this6","_temp1","cleanupInvalidLoginState","_temp0","_temp9","disconnect","removeItem","on","removeListener","silk","waap","_provider$connected","_provider$on$bind","_provider$on","_provider$removeListe","_provider$removeListe2","injectedProvider","_provider$on$bind2","_provider$on2","_provider$removeListe3","_provider$removeListe4","setupAutoConnectInjected","_provider$isConnected","_provider$on$bind3","_provider$on3","_provider$removeListe5","_provider$removeListe6","setupAutoConnectWalletConnect","_provider$on$bind4","_provider$on4","_provider$removeListe7","_provider$removeListe8","_exit","_this7","auto_conn","_temp15","_temp14","_provider$request","_temp11","_temp13","_SilkWalletConnect$ge2","_window$ethereum$requ","_result2","stored","getItem","_this8","safe","_this9","_this0","feature","operation","_this1","methodName","gastank_get_settings","customization_get","gastank_update_settings","customization_update","gastank_topup","project_init","_this10","silk_requestEmail","_this11","waap_requestPermissionToken","_this12","silk_requestSbt","WAAP_COMPONENT_TAG_NAME","WAAP_COMPONENT_CONTAINER_ID","isBrowser","HTMLElement","hasWaapComponent","getElementById","querySelector","getWaapComponentContainer","WaapWalletElement","_HTMLElement","style","display","alignItems","justifyContent","width","height","connectedCallback","setAttribute","disconnectedCallback","removeAttribute","_wrapNativeSuper","customElements","get","define","WaaP","NEW_IFRAME_CONTAINER_ID","NEW_IFRAME_WRAPPER_ID","NEW_IFRAME_ID","getIframeContainer","getIframeWrapper","getIframe","iframeContainerId","iframeWrapperId","iframeId","createIframeElement","iframe","createElement","src","border","borderRadius","backgroundColor","background","padding","margin","setupIframeMessageListener","handleIframeMessage","contentHeight","contentWidth","Number","isFinite","iframeWrapper","Math","floor","__silkCleanup","EthereumProviderExtension","sendToExtension","WaaPSuiWallet","options","_options$useStaging","version","icon","_accounts","_chains","changeListeners","Set","postRequestAndWait","err","refreshAccounts","notifyChange","_createClass","silent","_response$data","input","_response$data2","signPersonalMessage","accountAddress","address","some","a","from","chain","bytes","signature","resolveTransactionBytes","tx","Uint8Array","_result","_exit2","_result3","_exit3","_result5","getData","toJSON","json","_Uint8Array$from2","atob","c","charCodeAt","_unused2","parsed","_Uint8Array$from3","_unused3","serialize","serialized","_Uint8Array$from","build","network","client","SuiClient","getFullnodeUrl","builtBytes","String","signTransaction","transaction","txBytes","signAndExecuteTransaction","requestType","switchChain","listener","add","signTransactionBlock","transactionBlock","signAndExecuteTransactionBlock","properties","forEach","key","IFRAME_CONTAINER_ID","IFRAME_ID","IFRAME_WRAPPER_ID","componentContainer","position","wrapper","appendChild","createComponentModeIframe","container","top","left","right","bottom","zIndex","createModalModeIframe","isComponentMode","walletConnectProjectId","silkEthereumProvider","contentWindow","currentMode","nowComponentMode","newMode","modalContainer","cssText","createWaapIframe","suiWallet","ui","querySelectorAll","overlay","wallet","registerWallet","_useState","useState","Map","pendingTransactions","setPendingTransactions","optionsRef","useRef","useEffect","current","handleSignComplete","_optionsRef$current","prev","next","set","txHash","status","pendingTxId","serializedTx","onSigned","handleTxPending","_optionsRef$current2","existing","onTxPending","handleConfirmed","_optionsRef$current3","receipt","onConfirmed","handleTxFailed","_optionsRef$current4","stage","onFailed","sendTransaction","useCallback","txRequest","isAnyPending","values"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/lib/UIMessageManager.ts","../src/lib/provider/requests.ts","../src/lib/provider/utils.ts","../src/lib/WalletConnect.ts","../src/lib/WalletMessageManager.ts","../src/lib/provider/EthereumProvider.ts","../src/ui/WaapComponent.ts","../src/ui/index.ts","../src/lib/provider/EthereumProviderExtension.ts","../src/lib/sui/SuiWallet.ts","../src/lib/sui/init.ts","../src/lib/sui/register.ts","../src/hooks/useWaapTransaction.ts"],"sourcesContent":["/**\n * UIMessageManager emits events whose intended recipient is the UI\n * of the silk-wallet-sdk. It is used by EthereumProvider to\n * communicate with the UI.\n *\n * Note that the UI part of silk-wallet-sdk is not the Silk\n * website but rather the actual iframe tag that gets embedded\n * in the host site.\n */\nimport { EventEmitter } from \"events\";\n\nenum UI_EVENT_NAMES {\n show_modal = \"show_modal\",\n hide_modal = \"hide_modal\",\n}\n\nclass UIMessageManager extends EventEmitter {\n constructor() {\n super();\n }\n}\n\nexport { UI_EVENT_NAMES, UIMessageManager };\nexport default UIMessageManager;\n","import { EventEmitter } from 'events'\nimport { JSON_RPC_METHOD, SilkResponse } from '@human.tech/waap-interface-core'\nimport { rpcMethodRequiresUI } from '@human.tech/waap-constants'\nimport WalletMessageManager from '../WalletMessageManager.js'\nimport { RequestArguments } from './types.js'\n\n/**\n * Options passed to iframe for transaction behavior\n */\ninterface SilkOptions {\n async?: boolean\n withPT?: boolean\n}\n\n/**\n * Send request to wallet in iframe, and upon receiving the wallet's response\n * or error, hide modal and return wallet's response or throw wallet's error.\n */\nasync function handleWalletRequestAndResponse(\n args: RequestArguments,\n interactionRequired: boolean,\n walletMessageManager: WalletMessageManager,\n internalProviderEventEmitter: EventEmitter,\n silkOptions?: SilkOptions\n) {\n const method = args.method as JSON_RPC_METHOD\n const params = args.params as any[]\n\n // Send request to wallet in iframe\n const id = await walletMessageManager.postSilkRequest({\n method,\n params,\n interactionRequired,\n silkOptions\n })\n // Return wallet's response\n return new Promise((resolve, reject) => {\n // setTimeout(() => reject(\"Request timed out\"), 60 * 1000);\n internalProviderEventEmitter.once(id, (response: SilkResponse) => {\n // We check for error first because some RPC methods return null if they are successful\n if (response.error) reject(response.error)\n else resolve(response.data)\n })\n })\n}\n\nexport { rpcMethodRequiresUI, handleWalletRequestAndResponse }\n","import { CustomConfig } from '@human.tech/waap-interface-core'\n\nexport function isMetaMask(provider: any) {\n if (!provider?.isMetaMask) return false\n // Brave tries to make itself look like MetaMask\n // Could also try RPC `web3_clientVersion` if following is unreliable\n // if (provider.isBraveWallet && !provider._events && !provider._state) {\n // return false\n // }\n if (provider.isApexWallet) return false\n if (provider.isAvalanche) return false\n if (provider.isBitKeep) return false\n if (provider.isBlockWallet) return false\n if (provider.isMathWallet) return false\n if (provider.isOkxWallet || provider.isOKExWallet) return false\n if (provider.isOneInchIOSWallet || provider.isOneInchAndroidWallet) {\n return false\n }\n if (provider.isOpera) return false\n if (provider.isPortal) return false\n if (provider.isRabby) return false\n if (provider.isDefiant) return false\n if (provider.isTokenPocket) return false\n if (provider.isTokenary) return false\n if (provider.isZerion) return false\n return true\n}\n\nexport function isSafeTransaction(params?: unknown[] | object): boolean {\n try {\n if (!params || !Array.isArray(params)) return false\n\n // For eth_signTypedData_v4, params[1] contains the typed data\n const typedData = JSON.parse(\n typeof params[1] === 'string' ? params[1] : JSON.stringify(params[1])\n )\n\n // Check if it's a Safe transaction by verifying:\n // 1. Primary type is 'SafeTx'\n // 2. Has verifyingContract in domain (Safe address)\n // 3. Has required SafeTx fields in message\n return (\n typedData.primaryType === 'SafeTx' &&\n typedData.domain?.verifyingContract !== undefined &&\n typedData.message &&\n 'to' in typedData.message &&\n 'value' in typedData.message &&\n 'safeTxGas' in typedData.message &&\n 'baseGas' in typedData.message &&\n 'gasPrice' in typedData.message &&\n 'nonce' in typedData.message\n )\n } catch {\n return false\n }\n}\n\nexport const defaultConfig: CustomConfig = {\n styles: {\n darkMode: false\n }\n}\n","import { EthersAdapter } from '@reown/appkit-adapter-ethers'\n\nexport class SilkWalletConnect {\n private static instance: any = null\n private static projectId: string | undefined = undefined\n // Ethereum, Optimism, Gnosis, Polygon, Base, Avalanche, Arbitrum, Celo, Base Sepolia, Sepolia\n private static chains: number[] = [\n 1, 10, 100, 137, 8453, 43114, 42161, 42220, 84532, 11155111\n ]\n // private static optionalChains: AppKitNetwork[]\n\n /**\n * Set the WalletConnect project ID programmatically\n * Use this if environment variables aren't working in your setup\n *\n * @param id - The WalletConnect project ID to use\n */\n static setProjectId(id: string) {\n this.projectId = id\n }\n\n // /**\n // * Set the optional chains to use for WalletConnect\n // *\n // * @param chains - The optional chains to use (number[])\n // */\n // static setOptionalChains(chains: AppKitNetwork[]) {\n // SilkWalletConnect.optionalChains = chains\n // }\n\n static getProjectIdFromEnv() {\n try {\n // Check if process and process.env exist.\n if (typeof process !== 'undefined' && process.env) {\n // List of common env variable names to check\n return (\n process.env.NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID ||\n process.env.VITE_WALLET_CONNECT_PROJECT_ID ||\n process.env.REACT_APP_WALLET_CONNECT_PROJECT_ID ||\n process.env.WALLET_CONNECT_PROJECT_ID\n ) // Generic fallback\n }\n } catch (error) {\n // Silently fail if process is not defined.\n // This is expected in a pure browser environment.\n return undefined\n }\n return undefined\n }\n\n static async getInstance() {\n // Skip initialization if not in browser environment\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return null\n }\n // Dynamically import AppKit only in browser environment\n const { createAppKit } = await import('@reown/appkit')\n const {\n mainnet,\n sepolia,\n optimism,\n arbitrum,\n optimismGoerli,\n polygon,\n gnosis,\n avalanche,\n aurora,\n fantom,\n base,\n celo\n } = await import('@reown/appkit/networks')\n\n try {\n // // 2. Create your application's metadata object\n const metadata = {\n name: 'Human Wallet',\n description:\n 'Silk lets you create human keys for web3 wallets that are recoverable with private identity proofs and secured by zero trust protocols.',\n url: window.location.origin, // origin must match your domain & subdomain\n icons: [\n 'https://imagedelivery.net/_aTEfDRm7z3tKgu9JhfeKA/f11f5753-616a-4aa0-2aee-9b75befea700/sm'\n ]\n }\n\n // // Check for project ID in multiple places, in order of precedence\n const projectId = this.projectId || this.getProjectIdFromEnv()\n\n if (!projectId) {\n console.error(\n 'WalletConnect project ID not found. Please set it using one of these methods:\\n' +\n '1. Pass walletConnectProjectId when calling initSilk\\n' +\n '2. Call SilkWalletConnect.setProjectId(\"your-project-id\")\\n' +\n '3. Set WALLET_CONNECT_PROJECT_ID (NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID for Next projects) environment variable'\n )\n return null\n }\n\n // Set it again in case it comes from env\n this.projectId = projectId\n\n if (!this.instance) {\n this.instance = createAppKit({\n adapters: [new EthersAdapter()],\n projectId,\n metadata,\n networks: [\n // @ts-ignore\n mainnet,\n sepolia,\n arbitrum,\n optimism,\n polygon,\n gnosis,\n avalanche,\n aurora,\n fantom,\n base,\n celo\n ],\n features: {\n socials: false,\n email: false\n }\n })\n }\n\n return this.instance\n } catch (error) {\n console.error('Error importing or initializing WalletConnect:', error)\n return null\n }\n }\n\n static async listenToAccountChangeEvent() {\n await new Promise<void>((resolve) => {\n const unsubscribe = this.instance.subscribeAccount(\n (accountState: any) => {\n if (accountState?.isConnected) {\n resolve()\n }\n }\n )\n })\n }\n\n /**\n * Wait for WalletConnect to be properly initialized and connected\n * @returns Promise<boolean> - true if connected, false if timeout reached\n */\n static async waitForReadyAndCheckConnection(): Promise<boolean> {\n if (!this.instance) {\n return false\n }\n\n let isConnected = false\n let attempts = 0\n const maxAttempts = 15 // Maximum 15 attempts\n\n while (!isConnected && attempts < maxAttempts) {\n // Use shorter delays initially, then longer ones\n const delay = attempts < 5 ? 500 : 1000 // 500ms for first 5 attempts, then 1s\n await new Promise((resolve) => setTimeout(resolve, delay))\n\n isConnected = this.instance.getIsConnectedState()\n attempts++\n console.log(\n `WalletConnect connection check attempt ${attempts}: ${isConnected}`\n )\n }\n\n return isConnected\n }\n\n /**\n * Check if WalletConnect is currently connected (immediate check, no waiting)\n * @returns boolean - true if connected, false otherwise\n */\n static isConnected(): boolean {\n return this.instance?.getIsConnectedState() ?? false\n }\n\n /**\n * Get the wallet provider from the WalletConnect instance\n * @returns The wallet provider or null if not available\n */\n static getWalletProvider(): any {\n return this.instance?.getWalletProvider() ?? null\n }\n}\n","/**\n * WalletMessageManager handles messages between the wallet (in the Silk iframe)\n * and the wallet SDK (in the top frame). It is used by EthereumProvider\n * to communicate with the wallet.\n */\nimport {\n SilkRequest,\n SilkResponse,\n SILK_MESSAGE_TYPE,\n SILK_METHOD,\n SILK_NOTIFICATION,\n SilkNotificationData,\n generateMessageId\n} from '@human.tech/waap-interface-core'\n\nimport {\n silkWalletAppOrigin2,\n silkWalletAppOrigin2Staging\n} from '@human.tech/waap-constants'\n\ntype PostSilkRequestArgs = {\n method: keyof typeof SILK_METHOD\n params: any[]\n interactionRequired: boolean\n silkOptions?: {\n async?: boolean\n }\n}\n\n/**\n * Async transaction notification from iframe\n */\ninterface AsyncTxNotification {\n type: string\n payload: any\n}\n\n/**\n * Listener interface for WalletMessageManager\n */\ninterface MessageListenerConfig {\n handleResponse: (response: SilkResponse) => void\n handleRequest: (request: SilkRequest) => void\n onReceiveConnectNotif?: () => void\n onAccountChanged?: (newAccount: string) => void\n onAsyncTxNotification?: (notification: AsyncTxNotification) => void\n}\n\nclass WalletMessageManager {\n private iframeWindow: Window | null = null\n private walletOrigin: string\n\n constructor(iframeWindow: Window, useStaging: boolean) {\n this.iframeWindow = iframeWindow\n this.walletOrigin = useStaging\n ? silkWalletAppOrigin2Staging\n : silkWalletAppOrigin2\n }\n\n /**\n * Post a Silk notification to the given iframeWindow\n */\n postSilkNotification(data: SilkNotificationData) {\n this.iframeWindow!.postMessage(\n {\n target: 'silk' as const,\n messageType: SILK_MESSAGE_TYPE.notification,\n data\n },\n this.walletOrigin\n )\n }\n\n postReadyNotification() {\n this.postSilkNotification(SILK_NOTIFICATION.ready)\n }\n\n postConnectNotification() {\n this.postSilkNotification(SILK_NOTIFICATION.connect)\n }\n\n /**\n * Post a 'ready' notification to the iframe, and wait\n * for the iframe to respond with a 'ready' notification.\n */\n pingIframe() {\n return new Promise<void>((resolve, reject) => {\n setTimeout(() => reject('Wallet ping timed out.'), 10000)\n const eventHandler = (event: MessageEvent) => {\n if (\n event.data.target === 'silk' &&\n event.data.messageType === SILK_MESSAGE_TYPE.notification &&\n event.data.data === SILK_NOTIFICATION.ready\n ) {\n window.removeEventListener('message', eventHandler)\n resolve()\n }\n }\n window.addEventListener('message', eventHandler)\n this.postReadyNotification()\n })\n }\n\n /**\n * Post a SilkRequest to the iframeWindow. Don't wait for a response.\n */\n async postSilkRequest(req: PostSilkRequestArgs) {\n const { silkOptions, ...restReq } = req\n const baseRequest = {\n ...restReq,\n target: 'silk' as const,\n messageType: SILK_MESSAGE_TYPE.request as const,\n // Include silkOptions for transaction methods\n ...(silkOptions && { silkOptions })\n }\n const id = await generateMessageId(baseRequest)\n this.iframeWindow!.postMessage({ ...baseRequest, id }, this.walletOrigin)\n return id\n }\n\n /**\n * Add a message listener to the window in which this is called (which should be the top frame).\n * It handles all messages from the Silk iframe posted to the top frame.\n * @param config - Configuration that includes callbacks for handling specific messages.\n */\n addListener(config: MessageListenerConfig) {\n const {\n handleResponse,\n handleRequest,\n onReceiveConnectNotif,\n onAccountChanged,\n onAsyncTxNotification\n } = config\n\n window.addEventListener('message', (event) => {\n // Note: It is extremely important that NODE_ENV be set properly in production\n try {\n const origin =\n typeof process !== 'undefined' &&\n process.env &&\n process.env.NODE_ENV === 'test'\n ? 'http://127.0.0.1:3000'\n : event.origin\n\n if (origin !== this.walletOrigin) {\n return\n }\n } catch (error) {\n if (event.origin !== this.walletOrigin) {\n return\n }\n }\n\n if (event.data?.messageType === SILK_MESSAGE_TYPE.request) {\n handleRequest(event.data as SilkRequest)\n } else if (event.data?.messageType === SILK_MESSAGE_TYPE.response) {\n handleResponse(event.data as SilkResponse)\n } else if (event.data?.messageType === SILK_MESSAGE_TYPE.notification) {\n if (event.data?.data === SILK_NOTIFICATION.connect) {\n onReceiveConnectNotif?.()\n } else if (\n event.data?.data?.type === SILK_NOTIFICATION.account_changed &&\n onAccountChanged\n ) {\n onAccountChanged(event.data.data.account)\n } else if (\n (event.data?.data?.type?.startsWith('waap_sign_') ||\n event.data?.data?.type?.startsWith('waap_tx_')) &&\n onAsyncTxNotification\n ) {\n // Handle async transaction notifications\n onAsyncTxNotification({\n type: event.data.data.type,\n payload: event.data.data.payload\n })\n }\n }\n })\n }\n}\n\nexport { WalletMessageManager, PostSilkRequestArgs }\nexport default WalletMessageManager\n","/**\n * A Ethereum provder API (from EIP 1193) for Silk.\n * https://eips.ethereum.org/EIPS/eip-1193\n */\n\n/**\n * Resources:\n * - EIP-2255: Wallet Permissions System: https://eips.ethereum.org/EIPS/eip-2255\n */\nimport { EventEmitter } from 'events'\nimport {\n SILK_METHOD,\n JSON_RPC_METHOD,\n SilkRequest,\n SilkResponse,\n CustomConfig,\n CredentialType,\n ProjectConfig,\n RequestPermissionTokenParams\n} from '@human.tech/waap-interface-core'\nimport {\n EthereumProviderInterface,\n LoginResponse,\n RequestArguments,\n SilkEthereumProviderInterface\n} from './types.js'\nimport { UIMessageManager, UI_EVENT_NAMES } from '../UIMessageManager.js'\nimport {\n rpcMethodRequiresUI,\n handleWalletRequestAndResponse\n} from './requests.js'\nimport { defaultConfig, isMetaMask, isSafeTransaction } from './utils.js'\nimport { SilkWalletConnect } from '../WalletConnect.js'\nimport WalletMessageManager from '../WalletMessageManager.js'\n\nconst VALID_LOGIN_METHODS = [\n 'waap',\n 'human',\n 'injected',\n 'walletconnect'\n] as const\n\n/**\n * Normalizes the login response from the iframe.\n * Accepts both string format ('waap') and object format ({ loginMethod: 'waap', isComplete: true }).\n * Returns null for null/undefined (user closed modal).\n * Throws on unexpected formats.\n */\nfunction normalizeLoginResponse(response: unknown): LoginResponse {\n if (response === null || response === undefined) {\n return null\n }\n\n if (typeof response === 'string') {\n if ((VALID_LOGIN_METHODS as readonly string[]).includes(response)) {\n return response as LoginResponse\n }\n throw new Error(\n `[EthereumProvider] Unexpected login method: \"${response}\". ` +\n `Expected one of: ${VALID_LOGIN_METHODS.join(', ')}`\n )\n }\n\n // Object format ({ loginMethod: 'waap', isComplete: true }) — used by mobile SDK.\n // Normalize to string but warn, since the web SDK should receive strings.\n if (\n typeof response === 'object' &&\n 'loginMethod' in response &&\n typeof (response as any).loginMethod === 'string'\n ) {\n const method = (response as any).loginMethod\n console.warn(\n `[EthereumProvider] Received object login response. ` +\n `Normalizing \"${method}\" to string. This is unexpected for the web SDK.`\n )\n if ((VALID_LOGIN_METHODS as readonly string[]).includes(method)) {\n return method as LoginResponse\n }\n throw new Error(\n `[EthereumProvider] Unknown loginMethod in object: \"${method}\". ` +\n `Expected one of: ${VALID_LOGIN_METHODS.join(', ')}`\n )\n }\n\n throw new Error(\n `[EthereumProvider] Unexpected login response: ${JSON.stringify(\n response\n )} ` + `(type: ${typeof response})`\n )\n}\n\nclass EthereumProvider\n extends EventEmitter\n implements SilkEthereumProviderInterface\n{\n public readonly isSilk = true\n public readonly isWaaP = true\n public connected = false\n public walletMessageManager: WalletMessageManager\n public uiMessageManager: UIMessageManager\n public config: CustomConfig\n private currentAccount: string | null = null\n private walletConnectProvider: any = null\n /**\n * When true, eth_sendTransaction resolves with the pre-calculated tx hash\n * after signing. Broadcasting continues in the background with events.\n */\n private asyncTxs: boolean = false\n /**\n * When true, sends `asyncSigning: true` in silkOptions instead of `async: true`.\n * This mimics the v1 SDK protocol for backward compatibility testing.\n * @internal\n */\n private legacyAsyncSigning: boolean = false\n private persistedMethods: {\n login: () => Promise<LoginResponse>\n logout: () => Promise<unknown>\n getLoginMethod: () => LoginResponse\n walletMessageManager: WalletMessageManager\n uiMessageManager: UIMessageManager\n internalEventEmitter: EventEmitter\n silkRequest: (args: RequestArguments) => Promise<unknown>\n waaPRequest: (args: RequestArguments) => Promise<unknown>\n portal: (\n feature: 'gastank' | 'customization' | 'project',\n operation: 'get' | 'update' | 'topup' | 'init',\n payload?: any\n ) => Promise<unknown>\n requestEmail: () => Promise<unknown>\n requestSBT: (type: CredentialType) => Promise<unknown>\n requestPermissionToken: (\n params: RequestPermissionTokenParams\n ) => Promise<unknown>\n orcid: () => Promise<unknown>\n enable: () => Promise<unknown>\n isConnected: () => boolean\n toggleDarkMode: () => Promise<void>\n }\n\n /**\n * We use the internalEventEmitter to emit as events\n * Silk messages posted to the window.\n */\n public internalEventEmitter = new EventEmitter()\n\n /**\n * @param iframeWindow - The contentWindow of the iframe of the Silk website.\n * @param referralCode - Silk points referral code\n * @param customConfig - Silk custom UI configuration\n * @param project - Silk project configuration\n * @param useStaging - Whether to use the staging environment\n * @param asyncTxs - When true, eth_sendTransaction resolves with tx hash after signing\n * @param legacyAsyncSigning - When true, sends asyncSigning in silkOptions (v1 compat)\n */\n constructor(\n iframeWindow: Window,\n referralCode?: string,\n customConfig?: CustomConfig,\n project?: ProjectConfig,\n useStaging?: boolean,\n asyncTxs: boolean = false,\n legacyAsyncSigning: boolean = false\n ) {\n super()\n\n this.asyncTxs = asyncTxs\n this.legacyAsyncSigning = legacyAsyncSigning\n\n this.uiMessageManager = new UIMessageManager()\n this.walletMessageManager = new WalletMessageManager(\n iframeWindow!,\n !!useStaging\n )\n this.config = {\n ...defaultConfig,\n ...(customConfig || {}) // Override with customConfig if provided\n }\n\n // // Initialize WalletConnect provider if wallet authentication is enabled\n // if (this.config.authenticationMethods?.includes('wallet')) {\n // // Initialize asynchronously to avoid blocking the constructor\n // this.initializeWalletConnect().catch((error) => {\n // console.error('WalletConnect initialization failed:', error)\n // })\n // }\n\n this.persistedMethods = {\n login: this.login.bind(this),\n logout: this.logout.bind(this),\n getLoginMethod: this.getLoginMethod.bind(this),\n walletMessageManager: this.walletMessageManager,\n internalEventEmitter: this.internalEventEmitter,\n uiMessageManager: this.uiMessageManager,\n portal: this.portal.bind(this),\n requestEmail: this.requestEmail.bind(this),\n requestSBT: this.requestSBT.bind(this),\n requestPermissionToken: this.requestPermissionToken.bind(this),\n orcid: this.orcid.bind(this),\n enable: this.enable.bind(this),\n isConnected: this.isConnected.bind(this),\n toggleDarkMode: this.toggleDarkMode.bind(this),\n // We leave this silkRequest separate and never changing so that\n // we can still call the original request method if needed no matter\n // the current provider\n silkRequest: this.request.bind(this),\n waaPRequest: this.request.bind(this)\n }\n\n // Set up message listeners for the WalletMessageManager\n this.walletMessageManager.addListener({\n onReceiveConnectNotif: () => {\n console.log('onReceiveConnectNotif')\n this.connected = true\n this.emit('connect')\n },\n handleResponse: (response: SilkResponse) =>\n this.internalEventEmitter.emit(response.id, response),\n handleRequest: (request: SilkRequest) => {\n if (request.method === SILK_METHOD.show_modal) {\n this.uiMessageManager.emit(UI_EVENT_NAMES.show_modal)\n } else if (request.method === SILK_METHOD.hide_modal) {\n this.uiMessageManager.emit(UI_EVENT_NAMES.hide_modal)\n }\n },\n onAccountChanged: (newAccount: string) => {\n // Handle account change events\n if (this.currentAccount !== newAccount) {\n this.currentAccount = newAccount\n\n // Emit accountsChanged event with an array containing the new account\n // This follows the MetaMask standard (EIP-1193)\n this.emit('accountsChanged', newAccount ? [newAccount] : [])\n }\n },\n onAsyncTxNotification: (notification) => {\n // Emit async transaction events (waap_sign_complete, waap_tx_pending, waap_tx_confirmed, waap_tx_failed)\n // This allows consuming apps to listen for transaction lifecycle events\n this.emit(notification.type, notification.payload)\n }\n })\n\n // Tell the iframe to set the referral code\n if (referralCode) {\n // Wait for iframe to load (if it hasn't already)\n this.walletMessageManager\n .pingIframe()\n .then(() => {\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.set_points_referral_code,\n params: [referralCode]\n },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n .catch((error) => {\n console.error('Error setting referral code in Silk iframe:', error)\n })\n }\n\n // Tell the iframe to set the project config\n if (project) {\n console.log(' =========== project =========== ', project)\n this.walletMessageManager.pingIframe().then(() => {\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.set_project,\n params: [project, window.location.origin]\n },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n }\n\n // Tell the iframe to set the custom config\n if (customConfig) {\n this.walletMessageManager\n .pingIframe()\n .then(() => {\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.set_custom_config,\n params: [customConfig]\n },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n .catch((error) => {\n console.error('Error setting custom config in Silk iframe:', error)\n })\n }\n\n // if (forceIframe) {\n // this.walletMessageManager\n // .pingIframe()\n // .then(() => {\n // return handleWalletRequestAndResponse(\n // {\n // method: SILK_METHOD.force_iframe,\n // params: [true]\n // },\n // false,\n // this.walletMessageManager,\n // this.internalEventEmitter\n // )\n // })\n // .catch((error) => {\n // console.error('Error forcing iframe in Silk iframe:', error)\n // })\n // }\n }\n\n private async initializeWalletConnect(): Promise<void> {\n try {\n this.walletConnectProvider = await SilkWalletConnect.getInstance()\n console.log('WalletConnect provider initialized')\n } catch (error) {\n console.error('Failed to initialize WalletConnect provider:', error)\n this.walletConnectProvider = null\n }\n }\n\n public async enable(): Promise<unknown> {\n return this.request({ method: 'eth_requestAccounts' })\n }\n\n public isConnected(): boolean {\n return this.connected\n }\n\n public async request(args: RequestArguments): Promise<unknown> {\n if (\n !Object.keys(JSON_RPC_METHOD).includes(\n args.method as keyof typeof JSON_RPC_METHOD\n )\n ) {\n return Promise.reject({ error: `Not implemented (${args.method})` })\n }\n\n // Attempt auto-connect for account-related methods\n const autoConnectResult = await this.attemptAutoConnect(args.method)\n if (autoConnectResult !== null) {\n return autoConnectResult\n }\n\n // Initial check if this is a Safe transaction (other check happens on wallet internal and on the BE)\n const isSafeTx = isSafeTransaction(args.params)\n\n /**\n * Security: Safe transactions must use eth_signTypedData_v4\n * - Safe contract only accepts EIP-712 signatures or direct hash signatures\n * - Attempting to disguise Safe transactions as regular transactions or using\n * different signing methods would fail because:\n * 1. Safe contract requires specific signature format\n * 2. Transaction simulation validates proper Safe context\n * 3. Signatures are cryptographically bound to actual transaction parameters\n */\n if (isSafeTx) {\n // Safe transactions must use eth_signTypedData_v4\n if (args.method !== JSON_RPC_METHOD.eth_signTypedData_v4) {\n return Promise.reject({\n error: 'Safe transactions must be signed using eth_signTypedData_v4'\n })\n }\n }\n\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n // Determine if this is a transaction/signing method that should use silkOptions\n const isTxMethod =\n args.method === JSON_RPC_METHOD.eth_sendTransaction ||\n args.method === JSON_RPC_METHOD.eth_signTransaction ||\n args.method === JSON_RPC_METHOD.eth_signTypedData_v4 ||\n args.method === JSON_RPC_METHOD.personal_sign\n\n // Include silkOptions for transaction/signing methods when async txs is enabled or withPT is set\n const isAsync = (isTxMethod && this.asyncTxs) || args.async\n const silkOptions =\n isAsync || args.withPT\n ? this.legacyAsyncSigning\n ? {\n // v1 SDK protocol: send asyncSigning instead of async\n asyncSigning: isAsync || undefined,\n withPT: args.withPT\n }\n : {\n async: isAsync,\n withPT: args.withPT\n }\n : undefined\n\n const response = await handleWalletRequestAndResponse(\n args,\n rpcMethodRequiresUI(args.method as JSON_RPC_METHOD),\n this.walletMessageManager,\n this.internalEventEmitter,\n silkOptions\n )\n\n if (\n (args.method === JSON_RPC_METHOD.wallet_switchEthereumChain ||\n args.method === JSON_RPC_METHOD.wallet_addEthereumChain) &&\n response === null\n ) {\n this.emit(\n 'chainChanged',\n (args.params as { chainId: string }[])?.[0]?.chainId\n )\n\n // After switching chains, re-emit account info to ensure dApps (like Safe)\n // can re-establish the signer context on the new chain\n try {\n // Get current accounts to ensure we have the latest account info\n const accounts = (await this.request({\n method: 'eth_accounts'\n })) as string[]\n if (accounts && accounts.length > 0) {\n this.currentAccount = accounts[0]\n\n // Emit both accountsChanged and connect events to ensure dApps\n // (especially Safe protocol-kit) re-establish signer context\n this.emit('accountsChanged', accounts)\n this.emit('connect', {\n chainId: (args.params as { chainId: string }[])?.[0]?.chainId\n })\n\n console.log(\n '[EthereumProvider] Re-emitted accounts and connect after chain switch:',\n {\n accounts,\n chainId: (args.params as { chainId: string }[])?.[0]?.chainId\n }\n )\n }\n } catch (error) {\n console.warn(\n '[EthereumProvider] Failed to get accounts after chain switch:',\n error\n )\n // Fallback to current account if available\n if (this.currentAccount) {\n this.emit('accountsChanged', [this.currentAccount])\n // Also emit connect event for fallback\n this.emit('connect', {\n chainId: (args.params as { chainId: string }[])?.[0]?.chainId\n })\n }\n }\n }\n\n return response\n }\n\n public async login(\n customProvider?: EthereumProviderInterface\n ): Promise<LoginResponse> {\n // Skip if not in browser environment\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return null\n }\n\n // Use the class-level walletConnectProvider if available, otherwise initialize it\n if (\n this.config.authenticationMethods?.includes('wallet') &&\n !this.walletConnectProvider\n ) {\n await this.initializeWalletConnect()\n }\n\n const provider = customProvider || (window.ethereum as any)\n\n const providerWalletName =\n provider && isMetaMask(provider) ? 'MetaMask' : 'Browser Wallet'\n\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n const rawResponse = await handleWalletRequestAndResponse(\n { method: SILK_METHOD.login, params: [providerWalletName] },\n true,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n\n // Normalize response: handles both string ('waap') and object ({ loginMethod: 'waap' }) formats.\n // Throws on unexpected formats to catch bugs early.\n const loginMethod = normalizeLoginResponse(rawResponse)\n\n if (loginMethod === null) {\n return null\n }\n\n switch (loginMethod) {\n case 'waap':\n case 'human':\n localStorage.setItem(`${window.location.origin}-connected`, 'waap')\n this.setupWaaP()\n break\n\n case 'injected':\n if (provider) {\n localStorage.setItem(\n `${window.location.origin}-connected`,\n 'injected'\n )\n this.setupInjectedWallet(provider)\n }\n break\n\n case 'walletconnect': {\n localStorage.setItem(\n `${window.location.origin}-connected`,\n 'walletconnect'\n )\n\n if (!SilkWalletConnect.isConnected()) {\n await this.walletConnectProvider.open({ view: 'Connect' })\n await SilkWalletConnect.listenToAccountChangeEvent()\n }\n\n const wcProvider = SilkWalletConnect.getWalletProvider()\n this.setupWalletConnect(wcProvider)\n break\n }\n }\n\n return loginMethod\n }\n\n public async logout(): Promise<unknown> {\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n // Clear the stored login method\n this.cleanupInvalidLoginState()\n\n // Reset to Human Wallet state\n\n try {\n // Use the class-level walletConnectProvider if available\n if (this.walletConnectProvider) {\n await this.walletConnectProvider.disconnect()\n }\n } catch (error) {\n console.error('Error disconnecting from WalletConnect:', error)\n }\n\n return handleWalletRequestAndResponse(\n { method: SILK_METHOD.logout },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n }\n\n private cleanupInvalidLoginState(): void {\n try {\n localStorage.removeItem(`${window.location.origin}-connected`)\n } catch (error) {\n // Ignore cleanup errors in case localStorage is not available\n console.warn('Could not clean up login state:', error)\n }\n }\n\n /**\n * Helper method to set up window.waap for WaaP\n */\n private setupWaaP(): void {\n const provider = {\n ...this.persistedMethods,\n isWaaP: true,\n on: this.on.bind(this),\n removeListener: this.removeListener.bind(this),\n request: this.request.bind(this)\n }\n // @ts-ignore\n window.silk = provider\n // @ts-ignore - Add WaaP alias\n window.waap = provider\n }\n\n /**\n * Helper method to set up window.silk for injected wallets (e.g., MetaMask)\n */\n private setupInjectedWallet(provider: any): void {\n const injectedProvider = {\n ...this.persistedMethods,\n ...provider,\n isSilk: true,\n connected: provider.connected ?? false,\n on: provider.on?.bind(provider) ?? (() => {}),\n removeListener: provider.removeListener?.bind(provider) ?? (() => {}),\n request: provider.request.bind(provider)\n }\n window.silk = injectedProvider\n // @ts-ignore - Add WaaP alias\n window.waap = injectedProvider\n }\n\n /**\n * Helper method to set up window.silk for WalletConnect\n */\n private setupWalletConnect(provider: any): void {\n const walletConnectProvider = {\n ...this.persistedMethods,\n ...provider,\n isSilk: true,\n connected: true,\n on: provider.on?.bind(provider) ?? (() => {}),\n removeListener: provider.removeListener?.bind(provider) ?? (() => {}),\n request: provider.request.bind(provider)\n }\n window.silk = walletConnectProvider\n // @ts-ignore - Add WaaP alias\n window.waap = walletConnectProvider\n }\n\n /**\n * Helper method to set up window.silk for auto-connect with injected wallets\n */\n private setupAutoConnectInjected(provider: any): void {\n const injectedProvider = {\n ...this.persistedMethods,\n ...provider,\n isSilk: false,\n // @ts-ignore\n connected: provider.isConnected?.() ?? false,\n // @ts-ignore\n on: provider.on?.bind(provider) ?? (() => {}),\n removeListener:\n // @ts-ignore\n provider.removeListener?.bind(provider) ?? (() => {}),\n // @ts-ignore\n request: provider.request.bind(provider)\n }\n window.silk = injectedProvider\n // @ts-ignore - Add WaaP alias\n window.waap = injectedProvider\n }\n\n /**\n * Helper method to set up window.silk for auto-connect with WalletConnect\n */\n private setupAutoConnectWalletConnect(provider: any): void {\n const walletConnectProvider = {\n ...this.persistedMethods,\n ...provider,\n isSilk: false,\n connected: true,\n on: provider.on?.bind(provider) ?? (() => {}),\n removeListener: provider.removeListener?.bind(provider) ?? (() => {}),\n request: provider.request.bind(provider)\n }\n window.silk = walletConnectProvider\n // @ts-ignore - Add WaaP alias\n window.waap = walletConnectProvider\n }\n\n /**\n * Attempts to auto-connect using previously stored login method\n * @param method - The RPC method being called\n * @returns Promise<unknown> if auto-connect succeeds, null if it should fall through to normal flow\n */\n private async attemptAutoConnect(method: string): Promise<unknown | null> {\n // Only attempt auto-connect for account-related methods\n if (method !== 'eth_requestAccounts' && method !== 'eth_accounts') {\n return null\n }\n\n this.walletMessageManager.pingIframe().then(async () => {\n await handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.auto_conn,\n params: [window.location.origin]\n },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n\n // Use our robust getLoginMethod to check connection state\n const loginMethod = this.getLoginMethod()\n\n if (loginMethod === 'injected' && window.ethereum) {\n try {\n this.setupAutoConnectInjected(window.ethereum)\n\n // @ts-ignore\n return window.ethereum.request({\n method: 'eth_requestAccounts'\n })\n } catch (error) {\n // If injected wallet fails, clean up and fall through to normal flow\n console.warn('Injected wallet auto-connect failed:', error)\n this.cleanupInvalidLoginState()\n return null\n }\n } else if (loginMethod === 'walletconnect') {\n try {\n if (!this.walletConnectProvider) {\n this.walletConnectProvider = await SilkWalletConnect.getInstance()\n }\n\n // Wait for WalletConnect to be ready\n const isConnected =\n await SilkWalletConnect.waitForReadyAndCheckConnection()\n\n if (isConnected) {\n const provider = SilkWalletConnect.getWalletProvider()\n this.setupAutoConnectWalletConnect(provider)\n\n // Return the accounts from the active WalletConnect session\n return provider.request({\n method: 'eth_requestAccounts'\n })\n } else {\n console.log(\n 'WalletConnect not connected, cleaning up and falling through to normal flow'\n )\n // Clean up invalid WalletConnect state\n this.cleanupInvalidLoginState()\n return null\n }\n } catch (error) {\n // If WalletConnect fails, clean up and fall through to normal flow\n console.warn('WalletConnect auto-connect failed:', error)\n this.cleanupInvalidLoginState()\n return null\n }\n }\n\n // For 'human' login method or if auto-connect failed, fall through to normal Silk flow\n return null\n }\n\n public getLoginMethod(): LoginResponse {\n // Skip if not in browser environment\n if (typeof window === 'undefined' || typeof localStorage === 'undefined') {\n return null\n }\n\n try {\n const stored = localStorage.getItem(`${window.location.origin}-connected`)\n\n if (!stored) {\n return null\n }\n\n // Validate that stored value is a valid LoginResponse\n if (!['waap', 'human', 'injected', 'walletconnect'].includes(stored)) {\n // Invalid value in localStorage, clean it up\n this.cleanupInvalidLoginState()\n return null\n }\n\n // Verify the connection is actually still valid\n switch (stored) {\n case 'injected':\n // Check if injected wallet (e.g., MetaMask) is still available\n if (!window.ethereum) {\n // Browser wallet is no longer available, clean up\n this.cleanupInvalidLoginState()\n return null\n }\n return 'injected'\n\n case 'walletconnect':\n // Check if WalletConnect session is still active\n try {\n if (!SilkWalletConnect.isConnected()) {\n // WalletConnect session is no longer active, clean up\n this.cleanupInvalidLoginState()\n return null\n }\n return 'walletconnect'\n } catch (error) {\n // Error checking WalletConnect status, assume disconnected\n this.cleanupInvalidLoginState()\n return null\n }\n\n case 'waap':\n // For WaaP, we trust the localStorage value since the connection\n // state is managed by the Silk iframe. The actual connection verification\n // happens when eth_requestAccounts is called.\n return 'waap'\n\n case 'human':\n return 'human'\n\n default:\n // This shouldn't happen due to the validation above, but just in case\n this.cleanupInvalidLoginState()\n return null\n }\n } catch (error) {\n // Any unexpected error (localStorage access issues, etc.)\n console.warn('Error checking login method:', error)\n this.cleanupInvalidLoginState()\n return null\n }\n }\n\n public async toggleDarkMode(): Promise<void> {\n this.config.styles!.darkMode = !this.config.styles!.darkMode\n\n this.walletMessageManager\n .pingIframe()\n .then(() => {\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.set_custom_config,\n params: [this.config]\n },\n false,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n .catch((error) => {\n console.error('Error setting custom config in Silk iframe:', error)\n })\n }\n\n public async safe(): Promise<void> {\n this.walletMessageManager.pingIframe().then(() => {\n return handleWalletRequestAndResponse(\n { method: SILK_METHOD.safe },\n true,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n }\n\n public async orcid(): Promise<void> {\n this.walletMessageManager.pingIframe().then(() => {\n return handleWalletRequestAndResponse(\n { method: SILK_METHOD.orcid },\n true,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n })\n }\n\n /**\n * INTERNAL METHOD: Gas tank administration operations\n * This method is ONLY accessible from the Dev Portal domain\n * It's not included in the public typing to hide it from regular dApps\n */\n public async portal(\n feature: 'gastank' | 'customization' | 'project',\n operation: 'get' | 'update' | 'topup' | 'init',\n payload?: any\n ): Promise<unknown> {\n // Removed this for now due to devPortalHostname constant being set as localhost for staging environment on SDK\n // Second validation happens on silk-wallet-internal\n // const reqHostname = new URL(window.location.origin).hostname\n\n // const devPortalHostname = new URL(silkDevPortalOrigin).hostname\n\n // console.log('req hostname: ', reqHostname)\n\n // console.log('devPortalHostName: ', devPortalHostname)\n\n // if (devPortalHostname !== reqHostname) {\n // return Promise.reject({\n // error:\n // 'Unauthorized: Gas tank admin functions are only available from the Dev Portal'\n // })\n // }\n\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n let methodName: string\n switch (operation) {\n case 'get':\n methodName =\n feature === 'gastank'\n ? SILK_METHOD.gastank_get_settings\n : SILK_METHOD.customization_get\n break\n case 'update':\n methodName =\n feature === 'gastank'\n ? SILK_METHOD.gastank_update_settings\n : SILK_METHOD.customization_update\n break\n case 'topup':\n methodName = SILK_METHOD.gastank_topup\n break\n case 'init':\n methodName = SILK_METHOD.project_init\n break\n }\n\n // For update operations, mark as requiring user interaction for signing\n const interactionRequired =\n operation !== 'get' && feature !== 'customization'\n\n // Handle the request to the wallet\n return handleWalletRequestAndResponse(\n {\n method: methodName,\n params: [payload, window.location.origin]\n },\n interactionRequired, // Only open modal for update operations\n this.walletMessageManager,\n this.internalEventEmitter\n )\n }\n\n public async requestEmail(): Promise<unknown> {\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n return handleWalletRequestAndResponse(\n { method: SILK_METHOD.silk_requestEmail },\n true,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n }\n\n /**\n * Request a Permission Token from the user.\n * Allows pre-authorized transactions without individual confirmations.\n * @param params - Permission token parameters (allowed addresses, chain, limits, expiry)\n * @returns Promise<RequestPermissionTokenResult>\n */\n public async requestPermissionToken(\n params: RequestPermissionTokenParams\n ): Promise<unknown> {\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.waap_requestPermissionToken,\n params: [params]\n },\n true, // Requires UI for user approval\n this.walletMessageManager,\n this.internalEventEmitter\n )\n }\n\n /**\n * Prompt the user to mint a Zeronym SBT.\n * @returns string or null - The address of the owner of the SBT, or null\n * if the user already minted the SBT.\n */\n public async requestSBT(type: CredentialType): Promise<unknown> {\n // Wait for iframe to load (if it hasn't already)\n await this.walletMessageManager.pingIframe()\n\n return handleWalletRequestAndResponse(\n {\n method: SILK_METHOD.silk_requestSbt,\n params: [type]\n },\n true,\n this.walletMessageManager,\n this.internalEventEmitter\n )\n }\n}\n\nexport { EthereumProvider }\n","/**\n * WaaP Component\n *\n * A custom HTML element that allows developers to control where the WaaP wallet\n * renders in their UI. When present, the wallet will render inside this component\n * instead of as a centered modal with backdrop.\n *\n * Usage in HTML:\n * ```html\n * <waap-wallet></waap-wallet>\n * ```\n *\n * Usage in React/JSX:\n * ```tsx\n * function App() {\n * return <waap-wallet style={{ width: '400px', height: '600px' }} />\n * }\n * ```\n */\n\n// Internal constants (not exported)\nconst WAAP_COMPONENT_TAG_NAME = 'waap-wallet'\nconst WAAP_COMPONENT_CONTAINER_ID = 'waap-component-container'\n\n/**\n * Check if we're in a browser environment\n */\nconst isBrowser =\n typeof window !== 'undefined' &&\n typeof document !== 'undefined' &&\n typeof HTMLElement !== 'undefined'\n\n/**\n * Custom HTML element for WaaP wallet\n * Only defined in browser environments to avoid SSR issues\n */\nlet WaapWalletElement: any\n\nif (isBrowser) {\n WaapWalletElement = class extends HTMLElement {\n constructor() {\n super()\n\n // Set default styles if not specified\n if (!this.style.display || this.style.display === '') {\n this.style.display = 'flex'\n this.style.alignItems = 'center'\n this.style.justifyContent = 'center'\n }\n\n if (!this.style.width || this.style.width === '') {\n this.style.width = '100%'\n }\n\n if (!this.style.height || this.style.height === '') {\n this.style.height = '100%'\n }\n\n // Add container ID for SDK to find it\n this.id = WAAP_COMPONENT_CONTAINER_ID\n }\n\n connectedCallback() {\n // Element has been added to the DOM\n this.setAttribute('data-waap-mounted', 'true')\n }\n\n disconnectedCallback() {\n // Element has been removed from the DOM\n this.removeAttribute('data-waap-mounted')\n }\n }\n\n // Auto-register the component when in browser\n if (\n typeof customElements !== 'undefined' &&\n !customElements.get(WAAP_COMPONENT_TAG_NAME)\n ) {\n customElements.define(WAAP_COMPONENT_TAG_NAME, WaapWalletElement)\n }\n} else {\n // Provide a dummy class for SSR environments\n WaapWalletElement = class {}\n}\n\n/**\n * Check if a WaaP component exists in the DOM (internal use)\n */\nexport function hasWaapComponent(): boolean {\n if (!isBrowser) return false\n\n return (\n !!document.getElementById(WAAP_COMPONENT_CONTAINER_ID) ||\n !!document.querySelector(WAAP_COMPONENT_TAG_NAME)\n )\n}\n\n/**\n * Get the WaaP component container element (internal use)\n */\nexport function getWaapComponentContainer(): HTMLElement | null {\n if (!isBrowser) return null\n\n return (\n document.getElementById(WAAP_COMPONENT_CONTAINER_ID) ||\n document.querySelector(WAAP_COMPONENT_TAG_NAME)\n )\n}\n\n/**\n * Export the custom element class for advanced use cases\n * Most users won't need this - just use <waap-wallet> in your HTML/JSX\n */\nexport { WaapWalletElement as WaaP }\n","import {\n silkWalletAppOrigin2,\n silkWalletAppOrigin2Staging\n} from '@human.tech/waap-constants'\nimport {\n InitSilkOptions,\n SilkEthereumProviderInterface\n} from '../lib/provider/types.js'\nimport { EthereumProvider } from '../lib/provider/EthereumProvider.js'\nimport { UI_EVENT_NAMES } from '../lib/UIMessageManager.js'\nimport { SilkWalletConnect } from 'lib/WalletConnect.js'\nimport { hasWaapComponent, getWaapComponentContainer } from './WaapComponent.js'\n\n// Container ID constants - supporting both old (silk-wallet) and new (waap-wallet) naming\nconst LEGACY_IFRAME_CONTAINER_ID = 'silk-wallet-iframe-container'\nconst LEGACY_IFRAME_WRAPPER_ID = 'silk-wallet-iframe-wrapper'\nconst LEGACY_IFRAME_ID = 'silk-wallet-iframe'\n\nconst NEW_IFRAME_CONTAINER_ID = 'waap-wallet-iframe-container'\nconst NEW_IFRAME_WRAPPER_ID = 'waap-wallet-iframe-wrapper'\nconst NEW_IFRAME_ID = 'waap-wallet-iframe'\n\n/**\n * Get the existing iframe container element, checking both old and new naming conventions\n * @returns HTMLElement | null\n */\nconst getIframeContainer = (): HTMLElement | null => {\n return (\n document.getElementById(NEW_IFRAME_CONTAINER_ID) ||\n document.getElementById(LEGACY_IFRAME_CONTAINER_ID)\n )\n}\n\n/**\n * Get the existing iframe wrapper element, checking both old and new naming conventions\n * @returns HTMLElement | null\n */\nconst getIframeWrapper = (): HTMLElement | null => {\n return (\n document.getElementById(NEW_IFRAME_WRAPPER_ID) ||\n document.getElementById(LEGACY_IFRAME_WRAPPER_ID)\n )\n}\n\n/**\n * Get the existing iframe element, checking both old and new naming conventions\n * @returns HTMLIFrameElement | null\n */\nconst getIframe = (): HTMLIFrameElement | null => {\n return (document.getElementById(NEW_IFRAME_ID) ||\n document.getElementById(LEGACY_IFRAME_ID)) as HTMLIFrameElement | null\n}\n\n// Default to new naming for new installations\nconst iframeContainerId = NEW_IFRAME_CONTAINER_ID\nconst iframeWrapperId = NEW_IFRAME_WRAPPER_ID\nconst iframeId = NEW_IFRAME_ID\n\n/**\n * Create iframe element with proper configuration\n */\nconst createIframeElement = (useStaging: boolean): HTMLIFrameElement => {\n const iframe = window.document.createElement('iframe')\n iframe.id = iframeId\n iframe.src = `${\n useStaging ? silkWalletAppOrigin2Staging : silkWalletAppOrigin2\n }/iframe`\n\n console.log('iframe.src: ', iframe.src)\n\n iframe.style.width = '100%'\n iframe.style.height = '100%'\n iframe.style.border = 'none'\n iframe.style.borderRadius = '24px'\n iframe.style.backgroundColor = 'transparent'\n iframe.style.background = 'transparent'\n iframe.style.padding = '0'\n iframe.style.margin = '0'\n\n return iframe\n}\n\n/**\n * Setup message listener for iframe size updates\n */\nconst setupIframeMessageListener = (\n useStaging: boolean,\n iframe: HTMLIFrameElement\n) => {\n const handleIframeMessage = (event: MessageEvent) => {\n const expectedOrigin = useStaging\n ? silkWalletAppOrigin2Staging\n : silkWalletAppOrigin2\n\n if (event.origin !== expectedOrigin) return\n if (!event.data || typeof event.data !== 'object') return\n if (event.data.type !== 'silk-iframe-size') return\n\n const contentHeight = event.data.height\n const contentWidth = event.data.width\n\n const maxDimension = 2000\n const minDimension = 50\n\n if (typeof contentHeight !== 'number' || typeof contentWidth !== 'number')\n return\n if (contentHeight < minDimension || contentHeight > maxDimension) return\n if (contentWidth < minDimension || contentWidth > maxDimension) return\n if (!Number.isFinite(contentHeight) || !Number.isFinite(contentWidth))\n return\n\n const iframeWrapper = getIframeWrapper()\n if (!iframeWrapper) return\n\n iframeWrapper.style.height = `${Math.floor(contentHeight)}px`\n iframeWrapper.style.width = `${Math.floor(contentWidth)}px`\n }\n\n window.addEventListener('message', handleIframeMessage)\n ;(iframe as any).__silkCleanup = () => {\n window.removeEventListener('message', handleIframeMessage)\n }\n}\n\n/**\n * Create iframe in custom component mode (no modal/backdrop)\n */\nconst createComponentModeIframe = (useStaging: boolean) => {\n const componentContainer = getWaapComponentContainer()\n if (!componentContainer) {\n throw new Error('WaaP component not found in DOM')\n }\n\n // Check if iframe already exists\n if (getIframe()) {\n return\n }\n\n // Create iframe wrapper\n const iframeWrapper = window.document.createElement('div')\n iframeWrapper.id = iframeWrapperId\n iframeWrapper.style.position = 'relative'\n iframeWrapper.style.display = 'flex'\n iframeWrapper.style.alignItems = 'center'\n iframeWrapper.style.justifyContent = 'center'\n iframeWrapper.style.padding = '0'\n iframeWrapper.style.margin = '0'\n iframeWrapper.style.height = '600px'\n iframeWrapper.style.width = '380px'\n\n // Create and configure iframe\n const iframe = createIframeElement(useStaging)\n setupIframeMessageListener(useStaging, iframe)\n\n // Set default dimensions\n setTimeout(() => {\n const wrapper = getIframeWrapper()\n if (wrapper) {\n wrapper.style.height = '600px'\n wrapper.style.width = '380px'\n }\n }, 100)\n\n iframeWrapper.appendChild(iframe)\n componentContainer.appendChild(iframeWrapper)\n}\n\n/**\n * Create iframe in modal mode (with backdrop) - default behavior\n */\nconst createModalModeIframe = (useStaging: boolean) => {\n // If iframe container is already on page, do nothing\n if (getIframeContainer()) {\n return\n }\n\n // Create modal container\n const container = window.document.createElement('div')\n container.id = iframeContainerId\n container.style.position = 'fixed'\n container.style.top = '0'\n container.style.left = '0'\n container.style.right = '0'\n container.style.bottom = '0'\n container.style.width = '100%'\n container.style.height = '100%'\n container.style.display = 'flex'\n container.style.alignItems = 'center'\n container.style.justifyContent = 'center'\n container.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'\n container.style.zIndex = '9999999999'\n container.style.display = 'none'\n\n // Create iframe wrapper\n const iframeWrapper = window.document.createElement('div')\n iframeWrapper.id = iframeWrapperId\n iframeWrapper.style.position = 'relative'\n iframeWrapper.style.display = 'flex'\n iframeWrapper.style.alignItems = 'center'\n iframeWrapper.style.justifyContent = 'center'\n iframeWrapper.style.padding = '0'\n iframeWrapper.style.margin = '0'\n iframeWrapper.style.height = '600px'\n iframeWrapper.style.width = '380px'\n\n container.appendChild(iframeWrapper)\n\n // Create and configure iframe\n const iframe = createIframeElement(useStaging)\n setupIframeMessageListener(useStaging, iframe)\n\n // Set default dimensions\n setTimeout(() => {\n const wrapper = getIframeWrapper()\n if (wrapper) {\n wrapper.style.height = '600px'\n wrapper.style.width = '380px'\n }\n }, 100)\n\n iframeWrapper.appendChild(iframe)\n window.document.body.appendChild(container)\n}\n\n/**\n * Main function to create the WaaP iframe in either modal or component mode\n */\nconst createSilkIframe = (useStaging: boolean) => {\n // Check if custom component exists\n if (hasWaapComponent()) {\n createComponentModeIframe(useStaging)\n } else {\n createModalModeIframe(useStaging)\n }\n}\n\n// function warnStagingInit(useStaging: boolean) {\n// if (useStaging) {\n// console.log(\n// 'WARNING: Silk has been initialized to use the Silk staging environment. ' +\n// 'Silk staging is subject to rapid, unannounced changes, and is not ' +\n// 'recommended for production use or for storing large amounts of funds.'\n// )\n// }\n// }\n\n/**\n * @param referralCode - WaaP points referral code\n * @param customConfig - WaaP custom UI configuration\n * @param project - WaaP project configuration\n * @param useStaging - Whether to use the staging environment\n * @param walletConnectProjectId - WalletConnect project ID (only required when passing `wallet` to `authenticationMethods`)\n * @param walletConnectOptionalChains - Optional chains to use for WalletConnect\n */\n\nconst initWaaP = (\n params: InitSilkOptions = {}\n): SilkEthereumProviderInterface => {\n // warnStagingInit(!!params.useStaging)\n createSilkIframe(!!params.useStaging)\n\n const iframe = getIframe()\n if (!iframe) {\n throw new Error('WaaP iframe does not exist on page')\n }\n\n // Check if we're in component mode or modal mode\n const isComponentMode = hasWaapComponent()\n\n // If walletConnectProjectId is provided, set it\n if (params.walletConnectProjectId) {\n SilkWalletConnect.setProjectId(params.walletConnectProjectId)\n }\n\n const { referralCode, config, project, asyncTxs, asyncSigning } = params\n\n if (asyncSigning && !asyncTxs) {\n console.warn(\n '[WaaP SDK] `asyncSigning` is deprecated. Use `asyncTxs` instead.'\n )\n }\n\n // Create ethereum provider and attach it to window\n const contentWindow = iframe.contentWindow as Window\n const isLegacyAsyncSigning = !!asyncSigning && !asyncTxs\n const silkEthereumProvider = new EthereumProvider(\n contentWindow,\n referralCode,\n config || {},\n project || {},\n params.useStaging,\n asyncTxs || asyncSigning || false,\n isLegacyAsyncSigning\n )\n\n // Track the current mode to detect changes\n let currentMode: 'modal' | 'component' = isComponentMode\n ? 'component'\n : 'modal'\n\n // Setup visibility handlers - check component mode dynamically when showing\n silkEthereumProvider.uiMessageManager.on(UI_EVENT_NAMES.show_modal, () => {\n // Re-check component mode each time (component might be added after init)\n const nowComponentMode = hasWaapComponent()\n const newMode = nowComponentMode ? 'component' : 'modal'\n const iframeWrapper = getIframeWrapper()\n\n // If mode changed, move iframe wrapper to new location\n if (newMode !== currentMode && iframeWrapper) {\n currentMode = newMode\n\n if (nowComponentMode) {\n // Move to component\n const componentContainer = getWaapComponentContainer()\n if (componentContainer) {\n componentContainer.appendChild(iframeWrapper)\n }\n } else {\n // Move back to modal container\n let modalContainer = getIframeContainer()\n if (!modalContainer) {\n // Create modal container if it doesn't exist\n modalContainer = window.document.createElement('div')\n modalContainer.id = iframeContainerId\n modalContainer.style.position = 'fixed'\n modalContainer.style.top = '0'\n modalContainer.style.left = '0'\n modalContainer.style.right = '0'\n modalContainer.style.bottom = '0'\n modalContainer.style.width = '100%'\n modalContainer.style.height = '100%'\n modalContainer.style.display = 'flex'\n modalContainer.style.alignItems = 'center'\n modalContainer.style.justifyContent = 'center'\n modalContainer.style.backgroundColor = 'rgba(0, 0, 0, 0.5)'\n modalContainer.style.zIndex = '9999999999'\n window.document.body.appendChild(modalContainer)\n }\n modalContainer.appendChild(iframeWrapper)\n }\n }\n\n const container = getIframeContainer()\n\n if (nowComponentMode && iframeWrapper) {\n // Component mode - show wrapper only\n iframeWrapper.style.display = 'flex'\n } else if (container) {\n // Modal mode - show container with backdrop\n container.style.display = 'flex'\n }\n })\n\n silkEthereumProvider.uiMessageManager.on(UI_EVENT_NAMES.hide_modal, () => {\n const isComponentMode = hasWaapComponent()\n const iframeWrapper = getIframeWrapper()\n const container = getIframeContainer()\n\n if (isComponentMode && iframeWrapper) {\n iframeWrapper.style.display = 'none'\n } else if (container) {\n container.style.display = 'none'\n }\n })\n\n // @ts-ignore\n window.silk = silkEthereumProvider\n // @ts-ignore - WaaP alias\n window.waap = silkEthereumProvider\n\n return silkEthereumProvider\n}\n\nexport { initWaaP }\n","/**\n * A Ethereum provder API (from EIP 1193) for Silk.\n * https://eips.ethereum.org/EIPS/eip-1193\n */\n\n/**\n * Resources:\n * - EIP-2255: Wallet Permissions System: https://eips.ethereum.org/EIPS/eip-2255\n */\nimport {\n CredentialType,\n CustomConfig,\n JSON_RPC_METHOD,\n SILK_METHOD\n} from '@human.tech/waap-interface-core'\nimport { EventEmitter } from 'events'\nimport { EthereumProviderInterface, RequestArguments } from './types.js'\nimport { defaultConfig } from './utils.js'\n\nclass EthereumProviderExtension\n extends EventEmitter\n implements EthereumProviderInterface\n{\n public readonly isSilk = true\n public connected = false\n public config: CustomConfig\n\n constructor(customConfig?: CustomConfig) {\n super()\n this.config = {\n ...defaultConfig,\n ...(customConfig || {})\n }\n }\n\n // Send a message to the background script via `chrome.runtime.sendMessage`\n sendToExtension(args: RequestArguments) {\n // Use window.postMessage to communicate with the content script\n return new Promise((resolve, reject) => {\n window.postMessage({ type: 'FROM_PAGE', request: args }, '*')\n window.addEventListener('message', (event) => {\n if (event.data.type === 'FROM_EXTENSION') {\n if (event.data.error) reject(event.data.error)\n else resolve(event.data.result)\n }\n })\n })\n }\n\n // EIP-1193 `request` method implementation\n public async request(args: RequestArguments): Promise<unknown> {\n if (!Object.keys(JSON_RPC_METHOD).includes(args.method)) {\n return Promise.reject({ error: `Not implemented (${args.method})` })\n }\n\n const response = await this.sendToExtension(args)\n\n if (\n (args.method === JSON_RPC_METHOD.wallet_switchEthereumChain ||\n args.method === JSON_RPC_METHOD.wallet_addEthereumChain) &&\n response === null\n ) {\n this.emit(\n 'chainChanged',\n (args.params as { chainId: string }[])?.[0]?.chainId\n )\n }\n\n return response\n }\n\n // Enable method that dApps use to request accounts\n public async enable(): Promise<unknown> {\n return this.request({ method: 'eth_requestAccounts' })\n }\n\n // Check if the provider is connected\n public isConnected(): boolean {\n return this.connected\n }\n\n // Example of a custom method to handle login requests\n public async login(): Promise<unknown> {\n return this.sendToExtension({ method: SILK_METHOD.login })\n }\n\n // Example of requesting an SBT (Soulbound Token)\n public async requestSBT(type: CredentialType): Promise<unknown> {\n return this.sendToExtension({\n method: SILK_METHOD.silk_requestSbt,\n params: [type]\n })\n }\n\n // Example of toggling dark mode as part of custom config\n public async toggleDarkMode(): Promise<void> {\n this.config.styles!.darkMode = !this.config.styles!.darkMode\n\n await this.sendToExtension({\n method: SILK_METHOD.set_custom_config,\n params: [this.config]\n })\n }\n\n public async safe(): Promise<unknown> {\n return this.sendToExtension({ method: SILK_METHOD.safe })\n }\n}\n\nexport { EthereumProviderExtension }\n","/**\n * WaaP Sui Wallet - Implements Sui Wallet Standard.\n *\n * This wallet adapter allows dApps using @mysten/dapp-kit to discover\n * and interact with WaaP wallet for Sui blockchain operations.\n *\n * @see https://docs.sui.io/standards/wallet-standard\n */\n\nimport { EventEmitter } from 'events'\nimport {\n SILK_METHOD,\n SilkResponse\n} from '@human.tech/waap-interface-core'\n\nimport WalletMessageManager from '../WalletMessageManager.js'\nimport { UIMessageManager, UI_EVENT_NAMES } from '../UIMessageManager.js'\nimport type {\n SuiAccount,\n SuiChain,\n SuiConnectInput,\n SuiConnectOutput,\n SuiSignPersonalMessageInput,\n SuiSignPersonalMessageOutput,\n SuiSignAndExecuteTransactionInput,\n SuiSignAndExecuteTransactionOutput,\n SuiSignTransactionBlockInput,\n SuiSignTransactionBlockOutput,\n SuiSignAndExecuteTransactionBlockInput,\n SuiSignAndExecuteTransactionBlockOutput,\n SuiWalletEventListener,\n WaaPSuiWalletInterface,\n WalletIcon,\n InitWaaPSuiOptions\n} from './types.js'\n\n// WaaP logo as base64 SVG\nconst WAAP_ICON: WalletIcon = 'data:image/webp;base64,UklGRpoDAABXRUJQVlA4WAoAAAAQAAAAYwAAYwAAQUxQSDMDAAABJyAQSOFmFxERA8TatqpGoimANbEAxlBAPhSgQP9FyXv3vkcFEf134EZS5DREhGvTM8z0ki8stMRvK4cm8bk5rIu3xNbvkgPk4K6ti5IHquRQnLi6KrdBb81hdyF1jTLM1CW425943iba38/djOcG+dg85p/KXGd/g7+xAzJ2VPWTS8R+q65uA1ZcwG3iZ4urjw9Lh4xn83n3gZmQQ3VMVGEO6D403jdr81Ml1OISAAf7RGImBHISwQ5zCJonTuEyOyP7Sga4cDcjMPgXuiK9cUpaGrIDJtH4iAB25utB8O0DDztOKTr8u9hpX0jrx6k8UM5eAlqsynNxlX9tPRLQEtySKwcDOIDnMqEcek1UnylVNac4r0mlypNvhmCNODlhUXuT4fxTQyrDKY0uyV+gi0iiLLpY76A08C/IX8GQoYb8PcVxK7HkZkT5IjAF4gZicOfJW1ovJjyAlYVPlM6BkkHGI0fniAIZIXC0CbAM92BB8SBznU0ITYLr9XkfnKlDgV8170HGMWwitY51+zxcgkftLD4RLh4HSTIa3QzRWKxlaHZTz21s6GLxnBmjogkVilW4kuaMMMGUfgkZ1JhrBSEANrEDMwucAXgbTqIExY3FYRMdtkQRDFjD6BKtJ2GWTopGRY4P9DBkdE4rp9LJHuYhju45oeVZVv3zNmVdZiIOffHDppOz0Q34p0e/+nXy7JmF1846lmF2ZombLt8pgZpbPNeqpJSVJ0bGd4cH8dUNflNPfdQVXUkC95UQS0ZGfDmOJgjs3IyVOExZBEsxONd080gYK/ftQ2nbYaqGW89Hu7M6avmzXEjhO4G8O8ae8gwWtwZsyp8v8j/ys5H7bM+unOfurO4bbbL4v865Nb8s98Ld2X9yg6tLBQanMP8fhplOMMN8fiNDzTvNOMXGuYzejo12vY7s3clhXwgDPuBIcxi9QZftbKVxAjLCcVQdRxGR1QknhCs3GuieMLzfrrC9RhfJgVpcXRn71nZfEjsiYy/Ca1J7ch0clK64ReH3G/s2cekpP+BIx2YteMvSoLy6G9FCgd1nvF/VoVRtJoNJNLQ0RM3BXY9WgPbcHF78swAAVlA4IEAAAACwBQCdASpkAGQAPpFIoUylpCMiIKgAsBIJaW7hc+AAY2upvcReWAa6m9xF5YBrqb3EXlgGngAA/v81aVcAAAAA'\n/**\n * WaaP Sui Wallet implementation.\n *\n * Implements the Sui Wallet Standard to allow dApps to:\n * - Connect/disconnect\n * - Sign personal messages\n * - (Future) Sign and execute transactions\n */\nexport class WaaPSuiWallet implements WaaPSuiWalletInterface {\n readonly name = 'WaaP'\n readonly version = '1.0.0'\n readonly icon: WalletIcon = WAAP_ICON\n\n private _accounts: SuiAccount[] = []\n private _chains: SuiChain[] = ['sui:mainnet', 'sui:testnet', 'sui:devnet']\n private walletMessageManager: WalletMessageManager\n private uiMessageManager: UIMessageManager\n private internalEventEmitter = new EventEmitter()\n private changeListeners: Set<SuiWalletEventListener> = new Set()\n\n /**\n * Creates a new WaaPSuiWallet instance.\n *\n * @param iframeWindow - The contentWindow of the WaaP iframe\n * @param options - Initialization options\n */\n constructor(iframeWindow: Window, options: InitWaaPSuiOptions = {}) {\n const useStaging = options.useStaging ?? false\n\n this.walletMessageManager = new WalletMessageManager(iframeWindow, useStaging)\n this.uiMessageManager = new UIMessageManager()\n\n // Tell the iframe to set the referral code\n if (options.referralCode) {\n this.walletMessageManager.pingIframe().then(() => {\n this.postRequestAndWait({\n method: SILK_METHOD.set_points_referral_code,\n params: [options.referralCode],\n interactionRequired: false\n }).catch(err => console.error('Error setting referral code:', err))\n })\n }\n\n // Tell the iframe to set the project config\n if (options.project) {\n this.walletMessageManager.pingIframe().then(() => {\n this.postRequestAndWait({\n method: SILK_METHOD.set_project,\n params: [options.project, window.location.origin],\n interactionRequired: false\n }).catch(err => console.error('Error setting project:', err))\n })\n }\n\n // Tell the iframe to set the custom config\n if (options.config) {\n this.walletMessageManager.pingIframe().then(() => {\n this.postRequestAndWait({\n method: SILK_METHOD.set_custom_config,\n params: [options.config],\n interactionRequired: false\n }).catch(err => console.error('Error setting custom config:', err))\n })\n }\n\n // Set up message listeners\n this.walletMessageManager.addListener({\n handleResponse: (response: SilkResponse) => {\n this.internalEventEmitter.emit(response.id, response)\n },\n handleRequest: (request) => {\n if (request.method === SILK_METHOD.show_modal) {\n this.uiMessageManager.emit(UI_EVENT_NAMES.show_modal)\n } else if (request.method === SILK_METHOD.hide_modal) {\n this.uiMessageManager.emit(UI_EVENT_NAMES.hide_modal)\n }\n },\n onAccountChanged: async (newAccount: string) => {\n // When EVM account changes, refresh Sui accounts\n // by making a silent connect request\n try {\n const result = await this.refreshAccounts()\n this.notifyChange({ accounts: result.accounts })\n } catch (error) {\n console.error('Failed to refresh Sui accounts:', error)\n // Clear accounts on error\n this._accounts = []\n this.notifyChange({ accounts: [] })\n }\n }\n })\n }\n\n /**\n * Refresh accounts by making a silent connect request.\n * Used internally when account changes are detected.\n */\n private async refreshAccounts(): Promise<{ accounts: readonly SuiAccount[] }> {\n try {\n await this.walletMessageManager.pingIframe()\n\n const response = await this.postRequestAndWait({\n method: 'sui_connect' as keyof typeof SILK_METHOD,\n params: [{ silent: true }],\n interactionRequired: false\n })\n\n if (response.error) {\n this._accounts = []\n return { accounts: [] }\n }\n\n const accounts = response.data?.accounts || []\n this._accounts = accounts\n\n return { accounts: this._accounts }\n } catch (error) {\n this._accounts = []\n return { accounts: [] }\n }\n }\n\n /**\n * Supported chains.\n */\n get chains(): readonly SuiChain[] {\n return this._chains\n }\n\n /**\n * Connected accounts.\n */\n get accounts(): readonly SuiAccount[] {\n return this._accounts\n }\n\n /**\n * UI message manager for showing/hiding modal.\n */\n get ui(): UIMessageManager {\n return this.uiMessageManager\n }\n\n /**\n * Connect to the wallet.\n */\n async connect(input?: SuiConnectInput): Promise<SuiConnectOutput> {\n await this.walletMessageManager.pingIframe()\n\n const response = await this.postRequestAndWait({\n method: 'sui_connect' as keyof typeof SILK_METHOD,\n params: [input || {}],\n interactionRequired: !input?.silent\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to connect')\n }\n\n // Update accounts from response\n const accounts = response.data?.accounts || []\n this._accounts = accounts\n\n this.notifyChange({ accounts: this._accounts })\n\n return { accounts: this._accounts }\n }\n\n /**\n * Disconnect from the wallet.\n */\n async disconnect(): Promise<void> {\n await this.walletMessageManager.pingIframe()\n\n await this.postRequestAndWait({\n method: 'sui_disconnect' as keyof typeof SILK_METHOD,\n params: [],\n interactionRequired: false\n })\n\n this._accounts = []\n this.notifyChange({ accounts: [] })\n }\n\n /**\n * Sign a personal message.\n *\n * @param input - Sign personal message input\n * @returns Signed message result with bytes and signature\n */\n async signPersonalMessage(\n input: SuiSignPersonalMessageInput\n ): Promise<SuiSignPersonalMessageOutput> {\n await this.walletMessageManager.pingIframe()\n\n // Validate account is connected\n const accountAddress = input.account.address\n const isConnected = this._accounts.some((a) => a.address === accountAddress)\n\n if (!isConnected) {\n throw new Error(`Account ${accountAddress} is not connected`)\n }\n\n const response = await this.postRequestAndWait({\n method: 'sui_signPersonalMessage' as keyof typeof SILK_METHOD,\n params: [{\n message: Array.from(input.message),\n account: accountAddress,\n chain: input.chain\n }],\n interactionRequired: true\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to sign message')\n }\n\n return {\n bytes: response.data.bytes,\n signature: response.data.signature\n }\n }\n\n /**\n * Helper to resolve transaction bytes from various input formats.\n * If the input is a Transaction/TransactionBlock object, it builds it.\n */\n private async resolveTransactionBytes(tx: any, chain: SuiChain = 'sui:mainnet'): Promise<Uint8Array> {\n if (tx instanceof Uint8Array) {\n return tx\n } else if (Array.isArray(tx)) {\n return new Uint8Array(tx)\n } else if (typeof tx === 'string') {\n try {\n return Uint8Array.from(atob(tx), c => c.charCodeAt(0))\n } catch {\n throw new Error('Transaction string must be base64 encoded bytes. If you have a serialized transaction JSON, please build it to bytes first.')\n }\n } else if (tx && typeof tx === 'object') {\n // 1. Try to build if it's a Transaction/TransactionBlock\n // We check for .build() method which exists on both Transaction and TransactionBlock\n if (typeof tx.build === 'function') {\n try {\n // specific import to avoid bundling the whole library if not needed, \n // but here we likely need it or at least needs to be passed in.\n // Since we added @mysten/sui as dependency, we can use it to build.\n \n // We need a client to build. \n // Construct a temporary client based on the chain.\n // Note: This run in the dApp context, so we use public RPCs.\n const { getFullnodeUrl, SuiClient } = await import('@mysten/sui/client')\n \n let network = 'mainnet'\n if (chain === 'sui:testnet') network = 'testnet'\n else if (chain === 'sui:devnet') network = 'devnet'\n else if (chain === 'sui:localnet') network = 'localnet'\n\n const url = getFullnodeUrl(network as any)\n const client = new SuiClient({ url })\n \n const builtBytes = await tx.build({ client })\n return builtBytes\n } catch (e) {\n console.warn('[SuiWallet] Failed to build transaction object:', e)\n throw new Error(`Failed to build transaction: ${e instanceof Error ? e.message : String(e)}`)\n }\n }\n\n // 2. Try serialize() - older standard or some specific objects\n if (typeof tx.serialize === 'function') {\n try {\n const serialized = await tx.serialize()\n if (typeof serialized === 'string') {\n return Uint8Array.from(atob(serialized), c => c.charCodeAt(0))\n } else if (serialized instanceof Uint8Array) {\n return serialized\n }\n } catch (e) {\n console.warn('[SuiWallet] serialize() failed:', e)\n }\n }\n \n // 3. Try toJSON() - dapp-kit might pass this or generic objects\n if (typeof tx.toJSON === 'function') {\n try {\n const json = await tx.toJSON()\n \n if (typeof json === 'string') {\n // Is it base64?\n try {\n return Uint8Array.from(atob(json), c => c.charCodeAt(0))\n } catch {\n // Maybe JSON string?\n try {\n const parsed = JSON.parse(json)\n if (parsed.bytes && typeof parsed.bytes === 'string') {\n return Uint8Array.from(atob(parsed.bytes), c => c.charCodeAt(0))\n }\n } catch {}\n }\n }\n } catch (e) {\n console.warn('[SuiWallet] toJSON() failed:', e)\n }\n }\n\n // 4. Try getData() - older SDKs\n if (typeof tx.getData === 'function') {\n try {\n const data = tx.getData()\n if (data instanceof Uint8Array) return data\n } catch (e) { console.warn('[SuiWallet] getData() failed:', e) }\n }\n\n throw new Error(`Unsupported transaction format. Keys: ${Object.keys(tx).join(', ')}`)\n } else {\n throw new Error(`Unsupported transaction format: ${typeof tx}. Please pass Uint8Array bytes or a Transaction object.`)\n }\n }\n\n /**\n * Sign a transaction.\n *\n * @param input - Sign transaction input with transaction\n * @returns Signed transaction result with bytes and signature\n */\n async signTransaction(input: {\n transaction: unknown\n account: SuiAccount\n chain?: SuiChain\n }): Promise<{ bytes: string; signature: string }> {\n await this.walletMessageManager.pingIframe()\n\n // Validate account is connected\n const accountAddress = input.account.address\n const isConnected = this._accounts.some((a) => a.address === accountAddress)\n\n if (!isConnected) {\n throw new Error(`Account ${accountAddress} is not connected`)\n }\n\n // Resolve transaction bytes\n const txBytes = await this.resolveTransactionBytes(input.transaction, input.chain)\n\n const response = await this.postRequestAndWait({\n method: 'sui_signTransaction' as keyof typeof SILK_METHOD,\n params: [{\n transaction: Array.from(txBytes),\n account: accountAddress,\n chain: input.chain\n }],\n interactionRequired: true\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to sign transaction')\n }\n\n return {\n bytes: response.data.bytes,\n signature: response.data.signature\n }\n }\n\n /**\n * Sign and execute a transaction.\n *\n * @param input - Sign and execute transaction input\n */\n async signAndExecuteTransaction(input: SuiSignAndExecuteTransactionInput): Promise<SuiSignAndExecuteTransactionOutput> {\n await this.walletMessageManager.pingIframe()\n\n // Validate account is connected\n const accountAddress = input.account.address\n const isConnected = this._accounts.some((a) => a.address === accountAddress)\n\n if (!isConnected) {\n throw new Error(`Account ${accountAddress} is not connected`)\n }\n\n // Resolve transaction bytes\n const txBytes = await this.resolveTransactionBytes(input.transaction, input.chain)\n\n const response = await this.postRequestAndWait({\n method: 'sui_signAndExecuteTransaction' as keyof typeof SILK_METHOD,\n params: [{\n transaction: Array.from(txBytes),\n account: accountAddress,\n chain: input.chain,\n options: input.options,\n requestType: input.requestType\n }],\n interactionRequired: true\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to sign and execute transaction')\n }\n\n return response.data\n }\n\n /**\n * Switch the active chain.\n */\n async switchChain(input: { chain: SuiChain }): Promise<void> {\n await this.walletMessageManager.pingIframe()\n\n // Validate chain is supported\n if (!this._chains.includes(input.chain)) {\n throw new Error(`Chain ${input.chain} is not supported`)\n }\n\n const response = await this.postRequestAndWait({\n method: 'sui_switchChain' as keyof typeof SILK_METHOD,\n params: [input],\n interactionRequired: false\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to switch chain')\n }\n\n // Emit change event for chains (since the ordering or active status might conceptually change)\n // Note: The standard doesn't explicitly track \"active chain\" in the account object, \n // but dApps often expect an event or just use the new chain capability.\n // We emit a change event to be safe.\n this.notifyChange({ chains: this._chains, accounts: this._accounts })\n }\n\n /**\n * Subscribe to wallet change events.\n *\n * @param event - Event name (currently only 'change')\n * @param listener - Event listener callback\n * @returns Unsubscribe function\n */\n on(event: 'change', listener: SuiWalletEventListener): () => void {\n if (event === 'change') {\n this.changeListeners.add(listener)\n\n return () => {\n this.changeListeners.delete(listener)\n }\n }\n\n return () => {}\n }\n\n /**\n * Wallet Standard features property.\n * Required by @mysten/wallet-standard registerWallet.\n */\n get features() {\n return {\n 'standard:connect': {\n version: '1.0.0' as const,\n connect: this.connect.bind(this)\n },\n 'standard:disconnect': {\n version: '1.0.0' as const,\n disconnect: this.disconnect.bind(this)\n },\n 'standard:events': {\n version: '1.0.0' as const,\n on: this.on.bind(this)\n },\n 'sui:signPersonalMessage': {\n version: '1.1.0' as const,\n signPersonalMessage: this.signPersonalMessage.bind(this)\n },\n 'sui:signTransaction': {\n version: '2.0.0' as const,\n signTransaction: this.signTransaction.bind(this)\n },\n 'sui:signAndExecuteTransaction': {\n version: '1.0.0' as const,\n signAndExecuteTransaction: this.signAndExecuteTransaction.bind(this)\n },\n 'sui:signTransactionBlock': {\n version: '2.0.0' as const,\n signTransactionBlock: this.signTransactionBlock.bind(this)\n },\n 'sui:signAndExecuteTransactionBlock': {\n version: '1.0.0' as const,\n signAndExecuteTransactionBlock: this.signAndExecuteTransactionBlock.bind(this)\n },\n 'sui:switchChain': {\n version: '1.0.0' as const,\n switchChain: this.switchChain.bind(this)\n }\n } as const\n }\n\n /**\n * Legacy method for signing a transaction block.\n * Maps to signTransaction.\n */\n async signTransactionBlock(input: SuiSignTransactionBlockInput): Promise<SuiSignTransactionBlockOutput> {\n return this.signTransaction({\n transaction: input.transactionBlock,\n account: input.account,\n chain: input.chain\n })\n }\n\n /**\n * Legacy method for signing and executing a transaction block.\n * Maps to signAndExecuteTransaction.\n */\n async signAndExecuteTransactionBlock(input: SuiSignAndExecuteTransactionBlockInput): Promise<SuiSignAndExecuteTransactionBlockOutput> {\n return this.signAndExecuteTransaction({\n transaction: input.transactionBlock,\n account: input.account,\n chain: input.chain,\n options: input.options,\n requestType: input.requestType\n })\n }\n\n /**\n * Request the user's email address.\n *\n * @returns Promise resolving to the user's email address\n */\n async requestEmail(): Promise<string> {\n await this.walletMessageManager.pingIframe()\n\n const response = await this.postRequestAndWait({\n method: SILK_METHOD.silk_requestEmail as keyof typeof SILK_METHOD,\n params: [],\n interactionRequired: true\n })\n\n if (response.error) {\n throw new Error(response.error.message || 'Failed to request email')\n }\n\n return response.data as string\n }\n\n /**\n * Post a request to the iframe and wait for response.\n */\n private async postRequestAndWait(args: {\n method: keyof typeof SILK_METHOD\n params: unknown[]\n interactionRequired: boolean\n }): Promise<SilkResponse> {\n const id = await this.walletMessageManager.postSilkRequest({\n method: args.method as keyof typeof SILK_METHOD,\n params: args.params as any[],\n interactionRequired: args.interactionRequired\n })\n\n return new Promise((resolve) => {\n this.internalEventEmitter.once(id, (response: SilkResponse) => {\n resolve(response)\n })\n })\n }\n\n /**\n * Notify all change listeners.\n */\n private notifyChange(properties: { accounts?: readonly SuiAccount[], chains?: readonly SuiChain[] }) {\n Array.from(this.changeListeners).forEach((listener) => {\n listener(properties)\n })\n }\n}\n","/**\n * Initialization function for WaaP Sui Wallet.\n */\n\nimport {\n silkWalletAppOrigin2,\n silkWalletAppOrigin2Staging\n} from '@human.tech/waap-constants'\n\nimport { WaaPSuiWallet } from './SuiWallet.js'\nimport { UI_EVENT_NAMES } from '../UIMessageManager.js'\nimport type { InitWaaPSuiOptions, WaaPSuiWalletInterface } from './types.js'\n\n// Iframe IDs (shared with EthereumProvider)\nconst IFRAME_CONTAINER_ID = 'waap-wallet-iframe-container'\nconst IFRAME_ID = 'waap-wallet-iframe'\nconst LEGACY_IFRAME_CONTAINER_ID = 'silk-wallet-iframe-container'\nconst LEGACY_IFRAME_ID = 'silk-wallet-iframe'\n\n/**\n * Get the existing iframe container element.\n */\nconst getIframeContainer = (): HTMLElement | null => {\n return (\n document.getElementById(IFRAME_CONTAINER_ID) ||\n document.getElementById(LEGACY_IFRAME_CONTAINER_ID)\n )\n}\n\n/**\n * Get the existing iframe element.\n */\nconst getIframe = (): HTMLIFrameElement | null => {\n return (document.getElementById(IFRAME_ID) ||\n document.getElementById(LEGACY_IFRAME_ID)) as HTMLIFrameElement | null\n}\n\n// Iframe wrapper ID\nconst IFRAME_WRAPPER_ID = 'waap-wallet-iframe-wrapper'\nconst LEGACY_IFRAME_WRAPPER_ID = 'silk-wallet-iframe-wrapper'\n\n/**\n * Get the existing iframe wrapper element.\n */\nconst getIframeWrapper = (): HTMLElement | null => {\n return (\n document.getElementById(IFRAME_WRAPPER_ID) ||\n document.getElementById(LEGACY_IFRAME_WRAPPER_ID)\n )\n}\n\n/**\n * Setup message listener for iframe size updates\n */\nconst setupIframeMessageListener = (useStaging: boolean) => {\n const handleIframeMessage = (event: MessageEvent) => {\n const expectedOrigin = useStaging\n ? silkWalletAppOrigin2Staging\n : silkWalletAppOrigin2\n\n if (event.origin !== expectedOrigin) return\n if (!event.data || typeof event.data !== 'object') return\n if (event.data.type !== 'silk-iframe-size') return\n\n const contentHeight = event.data.height\n const contentWidth = event.data.width\n\n const maxDimension = 2000\n const minDimension = 50\n\n if (typeof contentHeight !== 'number' || typeof contentWidth !== 'number')\n return\n if (contentHeight < minDimension || contentHeight > maxDimension) return\n if (contentWidth < minDimension || contentWidth > maxDimension) return\n if (!Number.isFinite(contentHeight) || !Number.isFinite(contentWidth))\n return\n\n const iframeWrapper = getIframeWrapper()\n if (!iframeWrapper) return\n\n iframeWrapper.style.height = `${Math.floor(contentHeight)}px`\n iframeWrapper.style.width = `${Math.floor(contentWidth)}px`\n }\n\n window.addEventListener('message', handleIframeMessage)\n}\n\n/**\n * Create the WaaP iframe if it doesn't exist.\n */\nconst createWaapIframe = (useStaging: boolean) => {\n if (getIframeContainer()) {\n return // Already exists\n }\n\n // Create iframe container\n const container = document.createElement('div')\n container.id = IFRAME_CONTAINER_ID\n container.style.cssText = `\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n width: 100%;\n height: 100%;\n display: none;\n align-items: center;\n justify-content: center;\n background-color: rgba(0, 0, 0, 0.5);\n z-index: 9999999999;\n `\n\n // Create iframe wrapper\n const wrapper = document.createElement('div')\n wrapper.id = IFRAME_WRAPPER_ID\n wrapper.style.cssText = `\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n margin: 0;\n height: 600px;\n width: 380px;\n `\n container.appendChild(wrapper)\n\n // Create iframe\n const iframe = document.createElement('iframe')\n iframe.id = IFRAME_ID\n iframe.src = `${useStaging ? silkWalletAppOrigin2Staging : silkWalletAppOrigin2}/iframe`\n iframe.style.cssText = `\n width: 100%;\n height: 100%;\n border: none;\n border-radius: 24px;\n background: transparent;\n `\n wrapper.appendChild(iframe)\n\n // Setup message listener for dynamic size updates\n setupIframeMessageListener(useStaging)\n\n document.body.appendChild(container)\n}\n\n/**\n * Initialize WaaP Sui Wallet.\n *\n * This creates the WaaP iframe (if needed) and returns a SuiWallet instance\n * that implements the Sui Wallet Standard.\n *\n * @param options - Initialization options\n * @returns WaaPSuiWallet instance\n *\n * @example\n * ```typescript\n * import { initWaaPSui } from '@silk-wallet/silk-wallet-sdk'\n *\n * const suiWallet = initWaaPSui()\n *\n * // Connect to get accounts\n * const { accounts } = await suiWallet.connect()\n *\n * // Sign a message\n * const result = await suiWallet.signPersonalMessage({\n * message: new TextEncoder().encode('Hello, Sui!'),\n * account: accounts[0]\n * })\n * ```\n */\nexport function initWaaPSui(options: InitWaaPSuiOptions = {}): WaaPSuiWalletInterface {\n const useStaging = options.useStaging ?? false\n\n // Create iframe if it doesn't exist\n createWaapIframe(useStaging)\n\n const container = getIframeContainer()\n const iframe = getIframe()\n\n if (!container || !iframe) {\n throw new Error('Failed to create WaaP iframe')\n }\n\n // Wait for iframe to load\n const contentWindow = iframe.contentWindow as Window\n\n // Create Sui wallet\n const suiWallet = new WaaPSuiWallet(contentWindow, options)\n\n // Set up modal show/hide\n suiWallet.ui.on(UI_EVENT_NAMES.show_modal, () => {\n container.style.display = 'flex'\n \n // Hide @mysten/dapp-kit connect modal overlay when WaaP modal shows\n // This provides better UX by preventing overlapping modals\n const dappKitOverlays = document.querySelectorAll<HTMLElement>('[data-dapp-kit][class*=\"overlay\"]')\n dappKitOverlays.forEach((overlay) => {\n overlay.style.display = 'none'\n })\n })\n\n suiWallet.ui.on(UI_EVENT_NAMES.hide_modal, () => {\n container.style.display = 'none'\n \n // Restore @mysten/dapp-kit connect modal visibility if it was hidden\n const dappKitOverlays = document.querySelectorAll<HTMLElement>('[data-dapp-kit][class*=\"overlay\"]')\n dappKitOverlays.forEach((overlay) => {\n overlay.style.display = ''\n })\n })\n\n return suiWallet\n}\n","/**\n * WaaP Sui Wallet Registration\n *\n * Registers the WaaP Sui wallet with the Wallet Standard registry,\n * making it discoverable by dApps using @mysten/dapp-kit.\n *\n * @see https://docs.sui.io/standards/wallet-standard\n */\n\nimport { registerWallet } from '@mysten/wallet-standard'\nimport { WaaPSuiWallet } from './SuiWallet.js'\nimport type { InitWaaPSuiOptions, WaaPSuiWalletInterface } from './types.js'\n\n/**\n * Register WaaP Sui Wallet with the Wallet Standard.\n *\n * This makes the wallet discoverable by dApps using @mysten/dapp-kit.\n * The wallet will appear in the wallet selection UI of any dApp\n * that uses the Sui Wallet Standard.\n *\n * @param iframeWindow - The contentWindow of the WaaP iframe\n * @param options - Initialization options\n * @returns The registered WaaPSuiWallet instance\n *\n * @example\n * ```typescript\n * import { registerWaaPSuiWallet } from '@silk-wallet/silk-wallet-sdk'\n *\n * // Get the iframe element\n * const iframe = document.getElementById('waap-wallet-iframe') as HTMLIFrameElement\n *\n * // Register the wallet (makes it discoverable by dApps)\n * const wallet = registerWaaPSuiWallet(iframe.contentWindow!, { useStaging: false })\n *\n * // The wallet is now available in dapp-kit's wallet list\n * ```\n */\nexport function registerWaaPSuiWallet(\n iframeWindow: Window,\n options: InitWaaPSuiOptions = {}\n): WaaPSuiWalletInterface {\n const wallet = new WaaPSuiWallet(iframeWindow, options)\n\n // Register with Wallet Standard\n // This adds the wallet to the global registry, making it discoverable\n registerWallet(wallet as any)\n\n return wallet\n}\n\n/**\n * Unregister callback type returned by registerWallet.\n * Can be called to remove the wallet from the registry.\n */\nexport type UnregisterWallet = () => void\n","import { useEffect, useState, useCallback, useRef } from 'react'\nimport type {\n AsyncSignCompleteEvent,\n AsyncTxPendingEvent,\n AsyncTxConfirmedEvent,\n AsyncTxFailedEvent\n} from '@human.tech/waap-interface-core'\nimport type { RequestArguments } from '../lib/provider/types.js'\n\n/**\n * Transaction state tracked by the hook.\n * Keyed by txHash (pre-calculated from keccak256(serializedSignedTx)).\n */\ninterface TxState {\n status: 'signed' | 'tx_pending' | 'confirmed' | 'failed'\n txHash: string\n /** @deprecated Use `txHash` instead. */\n pendingTxId?: string\n signature?: string\n serializedTx?: string\n receipt?: AsyncTxConfirmedEvent['receipt']\n error?: string\n stage?: AsyncTxFailedEvent['stage']\n}\n\n/**\n * Options for useWaapTransaction hook\n */\ninterface UseWaapTransactionOptions {\n onSigned?: (event: AsyncSignCompleteEvent) => void\n onTxPending?: (event: AsyncTxPendingEvent) => void\n onConfirmed?: (event: AsyncTxConfirmedEvent) => void\n onFailed?: (event: AsyncTxFailedEvent) => void\n /** @deprecated No longer emitted in v2. */\n onPending?: (event: any) => void\n /** @deprecated No longer emitted in v2. */\n on2faRequired?: (event: any) => void\n /** @deprecated Use `onFailed` instead. */\n onSignFailed?: (event: any) => void\n}\n\n/**\n * Return type for useWaapTransaction hook\n */\ninterface UseWaapTransactionReturn {\n /**\n * Send a transaction using eth_sendTransaction.\n * When asyncTxs is enabled, resolves with the pre-calculated txHash\n * after signing. Broadcasting continues in the background with events.\n */\n sendTransaction: (txRequest: RequestArguments['params']) => Promise<string>\n /**\n * Sign a transaction without broadcasting using eth_signTransaction.\n * Always resolves with the signature directly.\n */\n signTransaction: (txRequest: RequestArguments['params']) => Promise<string>\n /**\n * Map of transaction hashes to their current state\n */\n pendingTransactions: Map<string, TxState>\n /**\n * Whether there are any pending transactions\n */\n isAnyPending: boolean\n}\n\n/**\n * React hook for handling async transactions with WaaP SDK.\n *\n * When `asyncTxs` is enabled (via `initWaaP({ asyncTxs: true })` or per-request `{ async: true }`):\n * - `eth_sendTransaction` resolves with the pre-calculated tx hash after signing\n * - Broadcasting and confirmation happen in the background with events\n * - Use the callbacks to track transaction lifecycle\n *\n * Other signing methods (`personal_sign`, `eth_signTypedData_v4`, `eth_signTransaction`)\n * always resolve with the signature directly — no events needed.\n *\n * @example\n * ```tsx\n * const { sendTransaction, pendingTransactions, isAnyPending } = useWaapTransaction({\n * onSigned: ({ txHash }) => console.log('Signed:', txHash),\n * onTxPending: ({ txHash }) => console.log('Broadcasting:', txHash),\n * onConfirmed: ({ txHash, receipt }) => console.log('Confirmed:', txHash),\n * onFailed: ({ txHash, error }) => console.error('Failed:', txHash, error)\n * });\n *\n * const handleSend = async () => {\n * const txHash = await sendTransaction([{ to: '0x...', value: '0x...' }]);\n * console.log('Got tx hash:', txHash);\n * };\n * ```\n */\nexport function useWaapTransaction(\n options?: UseWaapTransactionOptions\n): UseWaapTransactionReturn {\n const [pendingTransactions, setPendingTransactions] = useState<\n Map<string, TxState>\n >(new Map())\n const optionsRef = useRef(options)\n\n // Keep options ref updated\n useEffect(() => {\n optionsRef.current = options\n }, [options])\n\n useEffect(() => {\n // Get the provider from window\n const provider = (window as any).waap || (window as any).silk\n if (!provider) {\n console.warn(\n '[useWaapTransaction] WaaP provider not found. Make sure initWaaP() was called.'\n )\n return\n }\n\n // Handle waap_sign_complete - signing finished, tx hash available\n const handleSignComplete = (event: AsyncSignCompleteEvent) => {\n setPendingTransactions((prev) => {\n const next = new Map(prev)\n next.set(event.txHash, {\n status: 'signed',\n txHash: event.txHash,\n pendingTxId: event.txHash,\n signature: event.signature,\n serializedTx: event.serializedTx\n })\n return next\n })\n optionsRef.current?.onSigned?.(event)\n }\n\n // Handle waap_tx_pending - transaction broadcast, waiting for confirmation\n const handleTxPending = (event: AsyncTxPendingEvent) => {\n setPendingTransactions((prev) => {\n const next = new Map(prev)\n const existing = next.get(event.txHash)\n if (existing) {\n next.set(event.txHash, {\n ...existing,\n status: 'tx_pending'\n })\n }\n return next\n })\n optionsRef.current?.onTxPending?.(event)\n }\n\n // Handle waap_tx_confirmed - transaction confirmed on-chain\n const handleConfirmed = (event: AsyncTxConfirmedEvent) => {\n setPendingTransactions((prev) => {\n const next = new Map(prev)\n const existing = next.get(event.txHash)\n if (existing) {\n next.set(event.txHash, {\n ...existing,\n status: 'confirmed',\n receipt: event.receipt\n })\n }\n return next\n })\n optionsRef.current?.onConfirmed?.(event)\n }\n\n // Handle waap_tx_failed - broadcast or confirmation failed\n const handleTxFailed = (event: AsyncTxFailedEvent) => {\n setPendingTransactions((prev) => {\n const next = new Map(prev)\n const existing = next.get(event.txHash)\n if (existing) {\n next.set(event.txHash, {\n ...existing,\n status: 'failed',\n error: event.error,\n stage: event.stage\n })\n }\n return next\n })\n optionsRef.current?.onFailed?.(event)\n }\n\n // Subscribe to events\n provider.on('waap_sign_complete', handleSignComplete)\n provider.on('waap_tx_pending', handleTxPending)\n provider.on('waap_tx_confirmed', handleConfirmed)\n provider.on('waap_tx_failed', handleTxFailed)\n\n return () => {\n // Cleanup listeners\n provider.removeListener?.('waap_sign_complete', handleSignComplete)\n provider.removeListener?.('waap_tx_pending', handleTxPending)\n provider.removeListener?.('waap_tx_confirmed', handleConfirmed)\n provider.removeListener?.('waap_tx_failed', handleTxFailed)\n }\n }, [])\n\n const sendTransaction = useCallback(\n async (txRequest: RequestArguments['params']): Promise<string> => {\n const provider = (window as any).waap || (window as any).silk\n if (!provider) {\n throw new Error('WaaP provider not found')\n }\n\n return provider.request({\n method: 'eth_sendTransaction',\n params: txRequest\n })\n },\n []\n )\n\n const signTransaction = useCallback(\n async (txRequest: RequestArguments['params']): Promise<string> => {\n const provider = (window as any).waap || (window as any).silk\n if (!provider) {\n throw new Error('WaaP provider not found')\n }\n\n return provider.request({\n method: 'eth_signTransaction',\n params: txRequest\n })\n },\n []\n )\n\n const isAnyPending = Array.from(pendingTransactions.values()).some(\n (tx) => tx.status === 'signed' || tx.status === 'tx_pending'\n )\n\n return {\n sendTransaction,\n signTransaction,\n pendingTransactions,\n isAnyPending\n }\n}\n\nexport type { TxState, UseWaapTransactionOptions, UseWaapTransactionReturn }\n"],"names":["UI_EVENT_NAMES","UIMessageManager","_EventEmitter","call","this","_inheritsLoose","EventEmitter","handleWalletRequestAndResponse","args","interactionRequired","walletMessageManager","internalProviderEventEmitter","silkOptions","Promise","resolve","postSilkRequest","method","params","then","id","reject","once","response","error","data","e","defaultConfig","styles","darkMode","pact","state","value","s","_Pact","o","_settle","bind","v","observer","prototype","onFulfilled","onRejected","result","callback","_this","thenable","SilkWalletConnect","setProjectId","projectId","getProjectIdFromEnv","process","env","NEXT_PUBLIC_WALLET_CONNECT_PROJECT_ID","VITE_WALLET_CONNECT_PROJECT_ID","REACT_APP_WALLET_CONNECT_PROJECT_ID","WALLET_CONNECT_PROJECT_ID","getInstance","window","document","_interopNamespace","require","_ref","createAppKit","_ref2","mainnet","sepolia","optimism","arbitrum","polygon","gnosis","avalanche","aurora","fantom","base","celo","metadata","name","description","url","location","origin","icons","instance","adapters","EthersAdapter","networks","features","socials","email","console","listenToAccountChangeEvent","_this2","subscribeAccount","accountState","isConnected","waitForReadyAndCheckConnection","_this3","attempts","_temp","_for","delay","setTimeout","getIsConnectedState","log","_this$instance$getIsC","_this$instance","getWalletProvider","_this$instance$getWal","_this$instance2","undefined","chains","_excluded","WalletMessageManager","iframeWindow","useStaging","walletOrigin","silkWalletAppOrigin2Staging","silkWalletAppOrigin2","_proto","postSilkNotification","postMessage","target","messageType","SILK_MESSAGE_TYPE","notification","postReadyNotification","SILK_NOTIFICATION","ready","postConnectNotification","connect","pingIframe","addEventListener","eventHandler","event","removeEventListener","req","baseRequest","_extends","_objectWithoutPropertiesLoose","request","generateMessageId","addListener","config","handleResponse","handleRequest","onReceiveConnectNotif","onAccountChanged","onAsyncTxNotification","_event$data","_event$data2","_event$data3","_event$data4","_event$data5","_event$data6","_event$data7","type","account_changed","account","startsWith","payload","_catch","body","recover","VALID_LOGIN_METHODS","EthereumProvider","referralCode","customConfig","project","asyncTxs","legacyAsyncSigning","isSilk","isWaaP","connected","uiMessageManager","currentAccount","walletConnectProvider","persistedMethods","internalEventEmitter","login","_assertThisInitialized","logout","getLoginMethod","portal","requestEmail","requestSBT","requestPermissionToken","orcid","enable","toggleDarkMode","silkRequest","waaPRequest","emit","SILK_METHOD","show_modal","hide_modal","newAccount","set_points_referral_code","set_project","set_custom_config","initializeWalletConnect","_SilkWalletConnect$ge","_this4","Object","keys","JSON_RPC_METHOD","includes","attemptAutoConnect","autoConnectResult","_typedData$domain","Array","isArray","typedData","JSON","parse","stringify","primaryType","domain","verifyingContract","message","_unused","isSafeTransaction","eth_signTypedData_v4","isAsync","eth_sendTransaction","eth_signTransaction","personal_sign","async","withPT","asyncSigning","rpcMethodRequiresUI","_temp3","wallet_switchEthereumChain","wallet_addEthereumChain","_args$params","chainId","_temp2","accounts","_args$params2","_args$params3","length","_args$params4","warn","customProvider","_temp8","provider","ethereum","providerWalletName","isMetaMask","isApexWallet","isAvalanche","isBitKeep","isBlockWallet","isMathWallet","isOkxWallet","isOKExWallet","isOneInchIOSWallet","isOneInchAndroidWallet","isOpera","isPortal","isRabby","isDefiant","isTokenPocket","isTokenary","isZerion","_this5","rawResponse","loginMethod","Error","join","normalizeLoginResponse","_temp6","discriminant","cases","dispatchIndex","outer","i","test","testValue","awaitBody","fallthroughCheck","_resumeAfterBody","_resumeAfterTest","_switch","localStorage","setItem","setupWaaP","setupInjectedWallet","_temp5","wcProvider","setupWalletConnect","_temp4","open","view","_temp7","_this5$config$authent","authenticationMethods","_this6","_temp1","cleanupInvalidLoginState","_temp0","_temp9","disconnect","removeItem","on","removeListener","silk","waap","_provider$connected","_provider$on$bind","_provider$on","_provider$removeListe","_provider$removeListe2","injectedProvider","_provider$on$bind2","_provider$on2","_provider$removeListe3","_provider$removeListe4","setupAutoConnectInjected","_provider$isConnected","_provider$on$bind3","_provider$on3","_provider$removeListe5","_provider$removeListe6","setupAutoConnectWalletConnect","_provider$on$bind4","_provider$on4","_provider$removeListe7","_provider$removeListe8","_exit","_this7","auto_conn","_temp15","_temp14","_provider$request","_temp13","_SilkWalletConnect$ge2","_window$ethereum$requ","_result2","stored","getItem","_this8","safe","_this9","_this0","feature","operation","_this1","methodName","gastank_get_settings","customization_get","gastank_update_settings","customization_update","gastank_topup","project_init","_this10","silk_requestEmail","_this11","waap_requestPermissionToken","_this12","silk_requestSbt","WAAP_COMPONENT_TAG_NAME","WAAP_COMPONENT_CONTAINER_ID","isBrowser","HTMLElement","hasWaapComponent","getElementById","querySelector","getWaapComponentContainer","WaapWalletElement","_HTMLElement","style","display","alignItems","justifyContent","width","height","connectedCallback","setAttribute","disconnectedCallback","removeAttribute","_wrapNativeSuper","customElements","get","define","WaaP","NEW_IFRAME_CONTAINER_ID","NEW_IFRAME_WRAPPER_ID","NEW_IFRAME_ID","getIframeContainer","getIframeWrapper","getIframe","iframeContainerId","iframeWrapperId","iframeId","createIframeElement","iframe","createElement","src","border","borderRadius","backgroundColor","background","padding","margin","setupIframeMessageListener","handleIframeMessage","contentHeight","contentWidth","Number","isFinite","iframeWrapper","Math","floor","__silkCleanup","EthereumProviderExtension","sendToExtension","WaaPSuiWallet","options","_options$useStaging","version","icon","_accounts","_chains","changeListeners","Set","postRequestAndWait","err","refreshAccounts","notifyChange","silent","_response$data","input","_response$data2","signPersonalMessage","accountAddress","address","some","a","from","chain","bytes","signature","resolveTransactionBytes","tx","Uint8Array","_result","_exit2","_result3","_exit3","_result5","getData","toJSON","json","_Uint8Array$from2","atob","c","charCodeAt","_unused2","parsed","_Uint8Array$from3","_unused3","serialize","serialized","_Uint8Array$from","build","network","client","SuiClient","getFullnodeUrl","builtBytes","String","signTransaction","transaction","txBytes","signAndExecuteTransaction","requestType","switchChain","listener","add","signTransactionBlock","transactionBlock","signAndExecuteTransactionBlock","properties","forEach","key","IFRAME_CONTAINER_ID","IFRAME_ID","IFRAME_WRAPPER_ID","componentContainer","position","wrapper","appendChild","createComponentModeIframe","container","top","left","right","bottom","zIndex","createModalModeIframe","isComponentMode","walletConnectProjectId","silkEthereumProvider","contentWindow","currentMode","nowComponentMode","newMode","modalContainer","cssText","createWaapIframe","suiWallet","ui","querySelectorAll","overlay","wallet","registerWallet","_useState","useState","Map","pendingTransactions","setPendingTransactions","optionsRef","useRef","useEffect","current","handleSignComplete","_optionsRef$current","prev","next","set","txHash","status","pendingTxId","serializedTx","onSigned","handleTxPending","_optionsRef$current2","existing","onTxPending","handleConfirmed","_optionsRef$current3","receipt","onConfirmed","handleTxFailed","_optionsRef$current4","stage","onFailed","sendTransaction","useCallback","txRequest","isAnyPending","values"],"mappings":"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"}
|