{"version":3,"sources":["../src/assets.ts","../src/storage.ts","../src/util.ts","../src/client.ts","../src/adapter/extension-adapter.ts","../src/dapp-api/rpc-gen/index.ts","../src/error.ts","../src/sdk-controller.ts","../src/adapter/remote-adapter.ts","../src/adapter/walletconnect-adapter.ts","../src/gateways.json","../src/wallets.json","../src/announce-discovery.ts","../src/sdk.ts"],"names":["DiscoverResult","popup","WalletEvent","DappSyncProvider","WindowTransport","status","ErrorCode","DappAsyncProvider","SignClient","uuidv4","CANTON_ANNOUNCE_PROVIDER_EVENT","CANTON_REQUEST_PROVIDER_EVENT","pickWallet","DiscoveryClient","notifyWalletPickerConnected","notifyWalletPickerError","waitForWalletPickerRetrySelection"],"mappings":"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","file":"index.cjs","sourcesContent":["// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Base64-encoded icon assets for the dApp SDK.\n *\n * These icons are embedded as data URLs so they work immediately after npm install\n * without requiring consumers to host image files or configure asset paths.\n */\n\n/**\n * Canton logo (PNG) - used as the default icon for Wallet Gateway\n */\nexport const CANTON_LOGO_PNG =\n    'data:image/png;base64,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'\n\n/**\n * Alias for Wallet Gateway - same as Canton logo\n */\nexport const WALLET_GATEWAY_ICON = CANTON_LOGO_PNG\n\n/**\n * WalletConnect logo (SVG) - the bridge \"W\" mark in brand blue\n */\nexport const WALLETCONNECT_ICON =\n    'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjI0IC0yMCAxNjAgMTYwIj48cGF0aCBmaWxsPSIjM0I5OUZDIiBkPSJNNjEuNDQgMzYuMjZjMjMuNDktMjIuNjggNjEuMDQtMjIuNjggODQuNTMgMGwyLjgxIDIuNzFhMi44OSAyLjg5IDAgMCAxIDAgNC4xN2wtOS42MiA5LjI5YTEuNTIgMS41MiAwIDAgMS0yLjE0IDBsLTMuODctMy43M2MtMTYuMzgtMTUuODItNDIuOTQtMTUuODItNTkuMzIgMGwtNC4xNCA0YTEuNTIgMS41MiAwIDAgMS0yLjE0IDBsLTkuNjItOS4yOWEyLjg5IDIuODkgMCAwIDEgMC00LjE3em0xMDQuNDIgMTkuNDQgOC41NiA4LjI2YTIuODkgMi44OSAwIDAgMSAwIDQuMTdsLTM4LjU4IDM3LjI0YTMuMDQgMy4wNCAwIDAgMS00LjI4IDBsLTI3LjM4LTI2LjQyYS43Ni43NiAwIDAgMC0xLjA3IDBsLTI3LjM4IDI2LjQyYTMuMDQgMy4wNCAwIDAgMS00LjI4IDBMMzIuNjkgNjguMTNhMi44OSAyLjg5IDAgMCAxIDAtNC4xN2w4LjU2LTguMjZhMy4wNCAzLjA0IDAgMCAxIDQuMjggMGwyNy4zOCAyNi40MmEuNzYuNzYgMCAwIDAgMS4wNyAwbDI3LjM4LTI2LjQyYTMuMDQgMy4wNCAwIDAgMSA0LjI4IDBsMjcuMzggMjYuNDJhLjc2Ljc2IDAgMCAwIDEuMDcgMGwyNy4zOC0yNi40MmEzLjA0IDMuMDQgMCAwIDEgNC4yOCAweiIvPjwvc3ZnPgo='\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { DiscoverResult } from '@canton-network/core-types'\nimport * as dappAPI from '@canton-network/core-wallet-dapp-rpc-client'\n\nenum LOCAL_STORAGE {\n    KERNEL_DISCOVERY = 'splice_wallet_kernel_discovery',\n    KERNEL_SESSION = 'splice_wallet_kernel_session',\n}\n\nexport const getKernelDiscovery = (): DiscoverResult | undefined => {\n    const discovery = localStorage.getItem(LOCAL_STORAGE.KERNEL_DISCOVERY)\n    if (discovery) {\n        try {\n            return DiscoverResult.parse(JSON.parse(discovery))\n        } catch (e) {\n            console.error('Failed to parse stored kernel discovery:', e)\n        }\n    }\n    return undefined\n}\n\nexport const setKernelDiscovery = (discovery: DiscoverResult): void => {\n    localStorage.setItem(\n        LOCAL_STORAGE.KERNEL_DISCOVERY,\n        JSON.stringify(discovery)\n    )\n}\n\nexport const removeKernelDiscovery = (): void => {\n    localStorage.removeItem(LOCAL_STORAGE.KERNEL_DISCOVERY)\n}\n\nexport const getKernelSession = (): dappAPI.StatusEvent | undefined => {\n    const session = localStorage.getItem(LOCAL_STORAGE.KERNEL_SESSION)\n    if (session) {\n        try {\n            return JSON.parse(session) as dappAPI.StatusEvent\n        } catch (e) {\n            console.error('Failed to parse stored kernel session:', e)\n        }\n    }\n    return undefined\n}\n\nexport const setKernelSession = (session: dappAPI.StatusEvent): void => {\n    localStorage.setItem(LOCAL_STORAGE.KERNEL_SESSION, JSON.stringify(session))\n}\n\nexport const removeKernelSession = (): void => {\n    localStorage.removeItem(LOCAL_STORAGE.KERNEL_SESSION)\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { popup } from '@canton-network/core-wallet-ui-components'\nimport { removeKernelDiscovery, removeKernelSession } from './storage'\nimport { SIWXMessageParams } from './adapter/walletconnect-adapter'\n\nexport const clearAllLocalState = ({\n    closePopup,\n}: { closePopup?: boolean } = {}) => {\n    removeKernelSession()\n    removeKernelDiscovery()\n    if (closePopup) {\n        popup.close()\n    }\n}\n\ninterface ComposeSIWXMessageParams extends SIWXMessageParams {\n    chainId: string\n    accountAddress: string\n}\n\nexport const composeSIWXMessage = (\n    params: ComposeSIWXMessageParams\n): string => {\n    {\n        const networkName = 'Canton'\n\n        return [\n            `${params.domain} wants you to sign in with your ${networkName} account:`,\n            params.accountAddress,\n            params.statement ? `\\n${params.statement}\\n` : '',\n            `URI: ${params.uri}`,\n            `Version: ${params.version}`,\n            `Chain ID: ${params.chainId}`,\n            `Nonce: ${params.nonce}`,\n            params.issuedAt && `Issued At: ${params.issuedAt}`,\n            params.expirationTime &&\n                `Expiration Time: ${params.expirationTime}`,\n            params.notBefore && `Not Before: ${params.notBefore}`,\n            params.requestId && `Request ID: ${params.requestId}`,\n            params.resources?.length &&\n                params.resources.reduce(\n                    (acc: string, resource: string) => `${acc}\\n- ${resource}`,\n                    'Resources:'\n                ),\n        ]\n            .filter((line) => typeof line === 'string')\n            .join('\\n')\n            .trim()\n    }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n    Provider,\n    EventListener,\n} from '@canton-network/core-splice-provider'\nimport { WalletEvent, type SpliceMessage } from '@canton-network/core-types'\nimport type {\n    AccountsChangedEvent,\n    ConnectResult,\n    RpcTypes as DappRpcTypes,\n    LedgerApiParams,\n    LedgerApiResult,\n    ListAccountsResult,\n    MessageSignatureEvent,\n    PrepareExecuteAndWaitResult,\n    PrepareExecuteParams,\n    ProviderType,\n    SignMessageParams,\n    SignMessageResult,\n    StatusEvent,\n    TxChangedEvent,\n} from '@canton-network/core-wallet-dapp-rpc-client'\nimport { popup } from '@canton-network/core-wallet-ui-components'\nimport { clearAllLocalState } from './util'\n\nexport interface DappClientOptions {\n    /** Provider type hint — affects `open()` routing. Defaults to `'remote'`. */\n    providerType?: ProviderType | undefined\n    /** Optional routing key for extension open messages. */\n    target?: string | undefined\n}\n\n/**\n * DappClient is a thin convenience wrapper around a connected\n * `Provider<DappRpcTypes>`.\n *\n * It exposes typed RPC helpers, event subscription shortcuts,\n * and session-persistence listeners.\n *\n * How to obtain a provider is **not** this class's concern.\n * Use `DiscoveryClient` + the wallet picker, or construct any\n * `Provider<DappRpcTypes>` directly — then pass it here.\n */\nexport class DappClient {\n    private provider: Provider<DappRpcTypes>\n    private options: DappClientOptions\n\n    constructor(\n        provider: Provider<DappRpcTypes>,\n        options: DappClientOptions = {}\n    ) {\n        this.provider = provider\n        this.options = options\n    }\n\n    // ── Provider access ───────────────────────────────────\n\n    getProvider(): Provider<DappRpcTypes> {\n        return this.provider\n    }\n\n    // ── RPC convenience methods ────────────────────────────\n\n    async connect(): Promise<ConnectResult> {\n        return this.provider.request({ method: 'connect' })\n    }\n\n    async status(): Promise<StatusEvent> {\n        return this.provider.request({ method: 'status' })\n    }\n\n    async listAccounts(): Promise<ListAccountsResult> {\n        return this.provider.request({ method: 'listAccounts' })\n    }\n\n    async prepareExecute(params: PrepareExecuteParams): Promise<null> {\n        return this.provider.request({ method: 'prepareExecute', params })\n    }\n\n    async prepareExecuteAndWait(\n        params: PrepareExecuteParams\n    ): Promise<PrepareExecuteAndWaitResult> {\n        return this.provider.request({\n            method: 'prepareExecuteAndWait',\n            params,\n        })\n    }\n\n    async signMessage(params: SignMessageParams): Promise<SignMessageResult> {\n        return this.provider.request({ method: 'signMessage', params })\n    }\n\n    async ledgerApi(params: LedgerApiParams): Promise<LedgerApiResult> {\n        return this.provider.request({ method: 'ledgerApi', params })\n    }\n\n    // ── Event convenience methods ──────────────────────────\n\n    onStatusChanged(listener: EventListener<StatusEvent>): void {\n        this.provider.on<StatusEvent>('statusChanged', listener)\n    }\n\n    onAccountsChanged(listener: EventListener<AccountsChangedEvent>): void {\n        this.provider.on<AccountsChangedEvent>('accountsChanged', listener)\n    }\n\n    onConnected(listener: EventListener<StatusEvent>): void {\n        this.provider.on<StatusEvent>('connected', listener)\n    }\n\n    onTxChanged(listener: EventListener<TxChangedEvent>): void {\n        this.provider.on<TxChangedEvent>('txChanged', listener)\n    }\n\n    onMessageSignature(listener: EventListener<MessageSignatureEvent>): void {\n        this.provider.on<MessageSignatureEvent>('messageSignature', listener)\n    }\n\n    removeOnStatusChanged(listener: EventListener<StatusEvent>): void {\n        this.provider.removeListener<StatusEvent>('statusChanged', listener)\n    }\n\n    removeOnAccountsChanged(\n        listener: EventListener<AccountsChangedEvent>\n    ): void {\n        this.provider.removeListener<AccountsChangedEvent>(\n            'accountsChanged',\n            listener\n        )\n    }\n\n    removeOnConnected(listener: EventListener<StatusEvent>): void {\n        this.provider.removeListener<StatusEvent>('connected', listener)\n    }\n\n    removeOnTxChanged(listener: EventListener<TxChangedEvent>): void {\n        this.provider.removeListener<TxChangedEvent>('txChanged', listener)\n    }\n\n    removeOnMessageSignature(\n        listener: EventListener<MessageSignatureEvent>\n    ): void {\n        this.provider.removeListener<MessageSignatureEvent>(\n            'messageSignature',\n            listener\n        )\n    }\n\n    // ── Open wallet UI ─────────────────────────────────────\n\n    async open(): Promise<void> {\n        const statusResult = await this.status()\n        const userUrl = statusResult.provider.userUrl\n        if (!userUrl) throw new Error('User URL not found in status')\n\n        if (this.options.providerType === 'browser') {\n            window.postMessage(\n                {\n                    type: WalletEvent.SPLICE_WALLET_EXT_OPEN,\n                    url: userUrl,\n                    target: this.options.target,\n                } as SpliceMessage,\n                '*'\n            )\n        } else {\n            popup.open(userUrl)\n        }\n    }\n\n    // ── Disconnect ────────────────────────────────────────\n\n    async disconnect(): Promise<void> {\n        try {\n            await this.provider.request({ method: 'disconnect' })\n        } finally {\n            clearAllLocalState({ closePopup: true })\n        }\n    }\n\n    async isConnected(): Promise<ConnectResult> {\n        return this.provider.request({ method: 'isConnected' })\n    }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Provider } from '@canton-network/core-splice-provider'\nimport { DappSyncProvider } from '@canton-network/core-provider-dapp'\nimport type { RpcTypes as DappRpcTypes } from '@canton-network/core-wallet-dapp-rpc-client'\nimport { WalletEvent } from '@canton-network/core-types'\nimport { WindowTransport } from '@canton-network/core-rpc-transport'\nimport type {\n    ProviderAdapter,\n    WalletInfo,\n} from '@canton-network/core-wallet-discovery'\nimport type {\n    ProviderId,\n    ProviderType,\n} from '@canton-network/core-wallet-dapp-rpc-client'\nimport * as storage from '../storage'\n\nconst BROWSER_PROVIDER_ID: ProviderId = 'browser'\nconst EXTENSION_DETECT_TIMEOUT_MS = 2000\n\nexport type ExtensionAdapterConfig = {\n    providerId?: ProviderId | undefined\n    name?: string | undefined\n    icon?: string | undefined\n    description?: string | undefined\n    /** Optional routing key used for postMessage targeting. */\n    target?: string | undefined\n}\n\n/**\n * ProviderAdapter for any CIP-103 compliant wallet exposed as a browser extension.\n *\n * provider() returns a DappProvider which communicates via postMessage\n * and implements the full openrpc-dapp-api.json surface directly.\n */\nexport class ExtensionAdapter implements ProviderAdapter {\n    readonly providerId: ProviderId\n    readonly name: string\n    readonly type: ProviderType = 'browser'\n    readonly icon: string | undefined\n    private readonly description: string\n    readonly target?: string | undefined\n\n    constructor(config: ExtensionAdapterConfig = {}) {\n        this.providerId = config.providerId ?? BROWSER_PROVIDER_ID\n        this.name = config.name ?? 'Browser Extension'\n        this.icon = config.icon\n        this.description =\n            config.description ??\n            'Connect via the Splice Wallet browser extension'\n        this.target = config.target\n    }\n\n    getInfo(): WalletInfo {\n        return {\n            providerId: this.providerId,\n            name: this.name,\n            type: this.type,\n            description: this.description,\n            icon: this.icon,\n        }\n    }\n\n    async detect(): Promise<boolean> {\n        if (window.canton) return true\n\n        return new Promise<boolean>((resolve) => {\n            const timeout = setTimeout(() => {\n                window.removeEventListener('message', handler)\n                resolve(false)\n            }, EXTENSION_DETECT_TIMEOUT_MS)\n\n            const handler = (event: MessageEvent) => {\n                if (\n                    event.data?.type === WalletEvent.SPLICE_WALLET_EXT_ACK &&\n                    (!this.target || event.data?.target === this.target)\n                ) {\n                    clearTimeout(timeout)\n                    window.removeEventListener('message', handler)\n                    resolve(true)\n                }\n            }\n\n            window.addEventListener('message', handler)\n            window.postMessage(\n                {\n                    type: WalletEvent.SPLICE_WALLET_EXT_READY,\n                    target: this.target,\n                },\n                '*'\n            )\n        })\n    }\n\n    provider(): Provider<DappRpcTypes> {\n        if (this.target) {\n            return new DappSyncProvider(\n                new WindowTransport(window, { target: this.target })\n            ) as Provider<DappRpcTypes>\n        }\n        return new DappSyncProvider() as Provider<DappRpcTypes>\n    }\n\n    teardown(): void {\n        // No cleanup needed for extensions\n    }\n\n    async restore(): Promise<Provider<DappRpcTypes> | null> {\n        const kernel = storage.getKernelDiscovery()\n        const kernelMatches =\n            kernel?.walletType === 'extension' &&\n            (kernel.providerId === undefined ||\n                kernel.providerId === (this.providerId as string))\n\n        const provider = this.provider()\n        if (kernelMatches) {\n            try {\n                await provider.request({ method: 'connect' })\n            } catch {\n                // best-effort\n            }\n        }\n        try {\n            const status = await provider.request({ method: 'status' })\n            if (status.connection.isConnected) {\n                return provider as Provider<DappRpcTypes>\n            }\n        } catch {\n            if (kernelMatches) {\n                return provider as Provider<DappRpcTypes>\n            }\n        }\n        return null\n    }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Status } from './typings.js'\nimport { Connect } from './typings.js'\nimport { Disconnect } from './typings.js'\nimport { IsConnected } from './typings.js'\nimport { GetActiveNetwork } from './typings.js'\nimport { PrepareExecute } from './typings.js'\nimport { PrepareExecuteAndWait } from './typings.js'\nimport { SignMessage } from './typings.js'\nimport { LedgerApi } from './typings.js'\nimport { AccountsChanged } from './typings.js'\nimport { GetPrimaryAccount } from './typings.js'\nimport { ListAccounts } from './typings.js'\nimport { TxChanged } from './typings.js'\nimport { MessageSignature } from './typings.js'\n\nexport type Methods = {\n    status: Status\n    connect: Connect\n    disconnect: Disconnect\n    isConnected: IsConnected\n    getActiveNetwork: GetActiveNetwork\n    prepareExecute: PrepareExecute\n    prepareExecuteAndWait: PrepareExecuteAndWait\n    signMessage: SignMessage\n    ledgerApi: LedgerApi\n    accountsChanged: AccountsChanged\n    getPrimaryAccount: GetPrimaryAccount\n    listAccounts: ListAccounts\n    txChanged: TxChanged\n    messageSignature: MessageSignature\n}\n\nfunction buildController(methods: Methods) {\n    return {\n        status: methods.status,\n        connect: methods.connect,\n        disconnect: methods.disconnect,\n        isConnected: methods.isConnected,\n        getActiveNetwork: methods.getActiveNetwork,\n        prepareExecute: methods.prepareExecute,\n        prepareExecuteAndWait: methods.prepareExecuteAndWait,\n        signMessage: methods.signMessage,\n        ledgerApi: methods.ledgerApi,\n        accountsChanged: methods.accountsChanged,\n        getPrimaryAccount: methods.getPrimaryAccount,\n        listAccounts: methods.listAccounts,\n        txChanged: methods.txChanged,\n        messageSignature: methods.messageSignature,\n    }\n}\n\nexport default buildController\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nexport enum ErrorCode {\n    ProviderNotFound,\n    UserCancelled,\n    Timeout,\n    TransactionFailed,\n    Other,\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { DappAsyncProvider } from '@canton-network/core-provider-dapp'\nimport buildController from './dapp-api/rpc-gen'\nimport {\n    ConnectResult,\n    LedgerApiParams,\n    MessageSignatureEvent,\n    Network,\n    PrepareExecuteAndWaitResult,\n    PrepareExecuteParams,\n    SignMessageParams,\n    SignMessageResult,\n    Wallet,\n} from './dapp-api/rpc-gen/typings'\nimport { ErrorCode } from './error'\nimport { popup } from '@canton-network/core-wallet-ui-components'\nimport * as dappAsyncAPI from '@canton-network/core-wallet-dapp-remote-rpc-client'\n\nconst withTimeout = (\n    reject: (reason?: unknown) => void,\n    details: string,\n    timeoutMs: number = 5 * 60 * 1000 // default to 5 minutes\n) =>\n    setTimeout(() => {\n        console.warn(`SDK: ${details}`)\n        reject({\n            status: 'error',\n            error: ErrorCode.Timeout,\n            details,\n        })\n    }, timeoutMs)\n\nexport const dappSDKController = (provider: DappAsyncProvider) =>\n    buildController({\n        connect: async (): Promise<ConnectResult> => {\n            const response = await provider.request({\n                method: 'connect',\n            })\n\n            popup.open(response.userUrl ?? '')\n            const promise = new Promise<ConnectResult>((resolve, reject) => {\n                // 5 minutes timeout\n                const timeout = withTimeout(\n                    reject,\n                    'Timeout waiting for connection',\n                    5 * 60 * 1000\n                )\n                provider.on<dappAsyncAPI.StatusEvent>(\n                    'statusChanged',\n                    (event) => {\n                        if (event.connection.isConnected) {\n                            clearTimeout(timeout)\n                            resolve(event.connection)\n                        }\n                    }\n                )\n            })\n\n            return promise\n        },\n        disconnect: async () => {\n            return await provider.request({\n                method: 'disconnect',\n            })\n        },\n        isConnected: async () => {\n            return await provider.request({\n                method: 'isConnected',\n            })\n        },\n        ledgerApi: async (params: LedgerApiParams) =>\n            provider.request({\n                method: 'ledgerApi',\n                params,\n            }),\n        prepareExecute: async (params: PrepareExecuteParams) => {\n            const response = await provider.request({\n                method: 'prepareExecute',\n                params,\n            })\n\n            if (response.userUrl) popup.open(response.userUrl)\n\n            return null\n        },\n        prepareExecuteAndWait: async (\n            params: PrepareExecuteParams\n        ): Promise<PrepareExecuteAndWaitResult> => {\n            const commandId = params.commandId ?? crypto.randomUUID()\n            const response = await provider.request({\n                method: 'prepareExecute',\n                params: {\n                    ...params,\n                    commandId,\n                },\n            })\n\n            if (response.userUrl) popup.open(response.userUrl)\n\n            const promise = new Promise<PrepareExecuteAndWaitResult>(\n                (resolve, reject) => {\n                    const timeout = withTimeout(\n                        reject,\n                        'Timed out waiting for transaction approval'\n                    )\n\n                    const listener = (event: dappAsyncAPI.TxChangedEvent) => {\n                        if (event.commandId !== commandId) return\n                        if (event.status === 'failed') {\n                            provider.removeListener('txChanged', listener)\n                            clearTimeout(timeout)\n                            reject({\n                                status: 'error',\n                                error: ErrorCode.TransactionFailed,\n                                details: `Transaction with commandId ${event.commandId} failed to execute.`,\n                            })\n                        }\n                        if (event.status === 'executed') {\n                            provider.removeListener('txChanged', listener)\n                            clearTimeout(timeout)\n                            resolve({\n                                tx: event,\n                            })\n                        }\n                    }\n\n                    provider.on<dappAsyncAPI.TxChangedEvent>(\n                        'txChanged',\n                        listener\n                    )\n                }\n            )\n\n            return promise\n        },\n        status: async () => {\n            return provider.request({ method: 'status' })\n        },\n        listAccounts: async () =>\n            provider.request({\n                method: 'listAccounts',\n            }),\n        accountsChanged: async () => {\n            throw new Error('Only for events.')\n        },\n        txChanged: async () => {\n            throw new Error('Only for events.')\n        },\n        getActiveNetwork: async (): Promise<Network> =>\n            provider.request({\n                method: 'getActiveNetwork',\n            }),\n        signMessage: async (\n            params: SignMessageParams\n        ): Promise<SignMessageResult> => {\n            const response = await provider.request({\n                method: 'signMessage',\n                params,\n            })\n            const { userUrl } = response\n            popup.open(userUrl)\n\n            const messageId = new URL(userUrl).searchParams.get('messageId')\n            if (!messageId) {\n                throw new Error(\n                    'Remote signMessage userUrl is missing messageId query param'\n                )\n            }\n\n            return await new Promise<SignMessageResult>((resolve, reject) => {\n                const timeout = withTimeout(\n                    reject,\n                    'Timed out waiting for message signing approval'\n                )\n\n                const listener = (\n                    event: dappAsyncAPI.MessageSignatureEvent\n                ) => {\n                    if (event.messageId !== messageId) return\n\n                    // pending is informational; continue waiting\n                    if (event.status === 'pending') return\n\n                    provider.removeListener('messageSignature', listener)\n                    clearTimeout(timeout)\n\n                    if (event.status === 'failed') {\n                        reject({\n                            status: 'error',\n                            error: ErrorCode.TransactionFailed,\n                            details: `Message signing failed for messageId ${event.messageId}.`,\n                        })\n                        return\n                    }\n\n                    resolve({ signature: event.signature })\n                }\n\n                provider.on<dappAsyncAPI.MessageSignatureEvent>(\n                    'messageSignature',\n                    listener\n                )\n            })\n        },\n        getPrimaryAccount: async (): Promise<Wallet> =>\n            provider.request({\n                method: 'getPrimaryAccount',\n            }),\n        messageSignature: function (): Promise<MessageSignatureEvent> {\n            throw new Error('Only for events.')\n        },\n    })\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n    EventListener,\n    Provider,\n} from '@canton-network/core-splice-provider'\nimport type {\n    ProviderAdapterConfig,\n    RequestArgs,\n} from '@canton-network/core-types'\nimport type { RpcTypes as DappRpcTypes } from '@canton-network/core-wallet-dapp-rpc-client'\nimport { popup } from '@canton-network/core-wallet-ui-components'\nimport type {\n    ProviderAdapter,\n    WalletInfo,\n} from '@canton-network/core-wallet-discovery'\nimport type {\n    ProviderId,\n    ProviderType,\n} from '@canton-network/core-wallet-dapp-rpc-client'\nimport * as storage from '../storage'\nimport type { StatusEvent } from '@canton-network/core-wallet-dapp-remote-rpc-client'\nimport { clearAllLocalState } from '../util'\nimport { WalletEvent } from '@canton-network/core-types'\nimport { DappAsyncProvider } from '@canton-network/core-provider-dapp'\nimport { dappSDKController } from '../sdk-controller'\n\nexport interface RemoteAdapterConfig extends ProviderAdapterConfig {\n    providerId?: string | undefined\n    rpcUrl: string\n    icon?: string | undefined\n    description?: string | undefined\n}\n\n/**\n * ProviderAdapter for any CIP-103 compliant wallet reachable over HTTP/SSE.\n *\n * provider() returns a provider that maps the remote API\n * (openrpc-dapp-remote-api.json) to the dApp API\n * (openrpc-dapp-api.json) via dappSDKController.\n */\nexport class RemoteAdapter implements ProviderAdapter {\n    readonly providerId: ProviderId\n    readonly name: string\n    readonly type: ProviderType = 'remote'\n    readonly icon: string | undefined\n    readonly rpcUrl: string\n    private _provider: Provider<DappRpcTypes> | undefined\n    private description: string | undefined\n\n    constructor(config: RemoteAdapterConfig) {\n        this.providerId = config.providerId ?? `remote:${config.rpcUrl}`\n        this.name = config.name\n        this.rpcUrl = config.rpcUrl\n        this.icon = config.icon\n        this.description = config.description\n    }\n\n    getInfo(): WalletInfo {\n        return {\n            providerId: this.providerId,\n            name: this.name,\n            type: this.type,\n            description: this.description,\n            icon: this.icon,\n            url: this.rpcUrl,\n            reuseGlobalWalletPopup: true,\n        }\n    }\n\n    async detect(): Promise<boolean> {\n        return true\n    }\n\n    provider(): Provider<DappRpcTypes> {\n        const remoteProvider = new DappAsyncProvider(\n            new URL(this.rpcUrl),\n            storage.getKernelSession()?.session?.accessToken\n        )\n        this._provider = new RemoteMappedProvider(remoteProvider)\n        this.setupSessionListeners(this._provider)\n        return this._provider\n    }\n\n    teardown(): void {\n        popup.close()\n    }\n\n    async restore(): Promise<Provider<DappRpcTypes> | null> {\n        const discovery = storage.getKernelDiscovery()\n        if (!discovery || discovery.walletType !== 'remote') return null\n        if (discovery.url !== this.rpcUrl) return null\n\n        const session = storage.getKernelSession()\n        if (!session?.session) return null\n\n        try {\n            const provider = this.provider()\n            const statusResult = await provider.request({ method: 'status' })\n            if (statusResult.connection.isConnected) {\n                return provider\n            }\n        } catch {\n            // Session expired or invalid\n        }\n        return null\n    }\n\n    private setupSessionListeners(provider: Provider<DappRpcTypes>): void {\n        provider.on<StatusEvent>('statusChanged', (event) => {\n            console.log('statusChanged', event)\n            if (event.connection.isConnected && event.session) {\n                console.log('setting kernel session', event)\n                storage.setKernelSession(event)\n            }\n        })\n\n        provider.on<StatusEvent>('statusChanged', (event) => {\n            if (!event.connection.isConnected) {\n                clearAllLocalState({ closePopup: true })\n            }\n        })\n\n        window.addEventListener('message', (event: MessageEvent) => {\n            if (event.data?.type === WalletEvent.SPLICE_WALLET_LOGOUT) {\n                clearAllLocalState({ closePopup: true })\n                provider.emit<StatusEvent>('statusChanged', {\n                    provider: {\n                        id: this.providerId,\n                        providerType: this.type,\n                        url: this.rpcUrl,\n                    },\n                    connection: {\n                        isConnected: false,\n                        isNetworkConnected: false,\n                        reason: 'Logged out from wallet gateway',\n                    },\n                })\n            }\n        })\n    }\n}\n\nclass RemoteMappedProvider implements Provider<DappRpcTypes> {\n    constructor(private readonly remoteProvider: DappAsyncProvider) {}\n\n    request<M extends keyof DappRpcTypes>(\n        args: RequestArgs<DappRpcTypes, M>\n    ): Promise<DappRpcTypes[M]['result']> {\n        const controller = dappSDKController(this.remoteProvider)\n\n        switch (args.method) {\n            case 'status':\n                return controller.status() as Promise<DappRpcTypes[M]['result']>\n            case 'connect':\n                return controller.connect() as Promise<\n                    DappRpcTypes[M]['result']\n                >\n            case 'disconnect':\n                return controller.disconnect() as Promise<\n                    DappRpcTypes[M]['result']\n                >\n            case 'isConnected':\n                return controller.isConnected() as Promise<\n                    DappRpcTypes[M]['result']\n                >\n            case 'ledgerApi':\n                return controller.ledgerApi(args.params) as Promise<\n                    DappRpcTypes[M]['result']\n                >\n            case 'prepareExecute':\n                return controller.prepareExecute(args.params) as Promise<\n                    DappRpcTypes[M]['result']\n                >\n            case 'listAccounts':\n                return controller.listAccounts() as Promise<\n                    DappRpcTypes[M]['result']\n                >\n            case 'prepareExecuteAndWait':\n                return controller.prepareExecuteAndWait(args.params) as Promise<\n                    DappRpcTypes[M]['result']\n                >\n            case 'getPrimaryAccount':\n                return controller.getPrimaryAccount() as Promise<\n                    DappRpcTypes[M]['result']\n                >\n            case 'getActiveNetwork':\n                return controller.getActiveNetwork() as Promise<\n                    DappRpcTypes[M]['result']\n                >\n            case 'signMessage':\n                return controller.signMessage(args.params) as Promise<\n                    DappRpcTypes[M]['result']\n                >\n            default:\n                throw new Error('Unsupported method')\n        }\n    }\n\n    on<E>(event: string, listener: EventListener<E>): Provider<DappRpcTypes> {\n        this.remoteProvider.on(event, listener)\n        return this\n    }\n\n    emit<E>(event: string, ...args: E[]): boolean {\n        return this.remoteProvider.emit(event, ...args)\n    }\n\n    removeListener<E>(\n        event: string,\n        listenerToRemove: EventListener<E>\n    ): Provider<DappRpcTypes> {\n        this.remoteProvider.removeListener(event, listenerToRemove)\n        return this\n    }\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport SignClient from '@walletconnect/sign-client'\nimport type { SessionTypes } from '@walletconnect/types'\nimport type {\n    Provider,\n    EventListener,\n} from '@canton-network/core-splice-provider'\nimport type { RequestArgs } from '@canton-network/core-types'\nimport type {\n    RpcTypes as DappRpcTypes,\n    Provider as ProviderInfo,\n} from '@canton-network/core-wallet-dapp-rpc-client'\nimport type {\n    ProviderAdapter,\n    WalletInfo,\n} from '@canton-network/core-wallet-discovery'\nimport type {\n    ProviderId,\n    ProviderType,\n    StatusEvent,\n} from '@canton-network/core-wallet-dapp-rpc-client'\nimport { WALLETCONNECT_ICON } from '../assets'\nimport { composeSIWXMessage } from '../util'\nimport { v4 as uuidv4 } from 'uuid'\n\nconst CANTON_WC_METHODS = [\n    'canton_prepareSignExecute',\n    'canton_listAccounts',\n    'canton_getPrimaryAccount',\n    'canton_getActiveNetwork',\n    'canton_status',\n    'canton_ledgerApi',\n    'canton_signMessage',\n]\n\nconst CANTON_WC_EVENTS = ['accountsChanged', 'statusChanged']\n\nconst PROVIDER_INFO: ProviderInfo = {\n    id: 'walletconnect',\n    providerType: 'mobile',\n}\n\n/**\n * The timestamp is a UTC string representing the time in ISO 8601 format.\n */\nexport type Timestamp = string\n\n/**\n * This interface represents the SIWX message metadata.\n * Here must contain the main data related to the app.\n */\nexport interface Metadata {\n    requestId?: string\n    domain: string\n    uri: string\n    version: string\n    nonce?: string\n    notBefore?: Timestamp\n    statement?: string\n    resources?: string[]\n}\n\n/**\n * This interface represents the SIWX message identifier.\n * Here must contain the request id and the timestamps.\n */\nexport interface Identifier {\n    requestId?: string\n    issuedAt?: Timestamp\n    expirationTime?: Timestamp\n}\n\nexport interface SIWXMessageParams extends Metadata, Identifier {}\n\nexport interface RequestSIWXParams extends SIWXMessageParams {\n    account: string\n}\n\nexport interface SignInWithCantonResult {\n    requestId: string | undefined\n    nonce: string\n    account: string\n    chainId: string\n    message: string\n    publicKey: string\n    signature: string\n    error?: SignInWithCantonError\n}\n\nexport interface SignInWithCantonError {\n    message: string\n    code: number\n}\n\nexport interface WalletConnectAdapterConfig {\n    projectId: string\n    chainId?: string\n    metadata?: {\n        name: string\n        description: string\n        url: string\n        icons: string[]\n    }\n    /** Whether to trigger a canton_signMessage request after the session is established. */\n    signInWithCanton?: SIWXMessageParams\n    /** Called with the pairing URI so the dApp can display or forward it. */\n    onUri?: (uri: string) => void\n    onSignInWithCanton?: (result: SignInWithCantonResult) => void\n}\n\n/**\n * Single-class WalletConnect adapter that implements both ProviderAdapter\n * (for discovery/wallet-picker) and Provider<DappRpcTypes> (for RPC calls).\n *\n * Calls signClient.request() directly with `canton_` prefixed methods.\n * Events arriving via session_event are buffered until a listener attaches.\n */\nexport class WalletConnectAdapter\n    implements ProviderAdapter, Provider<DappRpcTypes>\n{\n    readonly providerId: ProviderId = 'walletconnect'\n    readonly name = 'WalletConnect'\n    readonly type: ProviderType = 'mobile'\n    readonly icon: string | undefined = WALLETCONNECT_ICON\n\n    private readonly projectId: string\n    private readonly chainId: string\n    private readonly metadata:\n        | WalletConnectAdapterConfig['metadata']\n        | undefined\n    private readonly onUri: ((uri: string) => void) | undefined\n    private readonly onSignInWithCanton:\n        | ((result: SignInWithCantonResult) => void)\n        | undefined\n    private readonly signInWithCanton: WalletConnectAdapterConfig['signInWithCanton']\n\n    private signClient: SignClient | null = null\n    private session: SessionTypes.Struct | null = null\n    private initPromise: Promise<SignClient> | null = null\n\n    // Event handling with buffering for events that arrive before listeners\n    private listeners: { [event: string]: EventListener<unknown>[] } = {}\n    private eventBuffer = new Map<string, unknown[][]>()\n\n    static create(config: WalletConnectAdapterConfig): WalletConnectAdapter {\n        return new WalletConnectAdapter(config)\n    }\n\n    constructor(config: WalletConnectAdapterConfig) {\n        this.projectId = config.projectId\n        this.signInWithCanton = config.signInWithCanton\n        this.chainId = config.chainId ?? 'canton:devnet'\n        this.metadata = config.metadata\n        this.onUri = config.onUri\n        this.onSignInWithCanton = config.onSignInWithCanton\n    }\n\n    // ── ProviderAdapter ─────────────────────────────────────────────\n\n    getInfo(): WalletInfo {\n        return {\n            providerId: this.providerId,\n            name: this.name,\n            type: this.type,\n            icon: this.icon,\n            description: 'Connect via WalletConnect',\n            reuseGlobalWalletPopup: true,\n        }\n    }\n\n    async detect(): Promise<boolean> {\n        return true\n    }\n\n    provider(): Provider<DappRpcTypes> {\n        return this\n    }\n\n    teardown(): void {\n        // Intentionally keep state alive — the SignClient must persist\n        // for reconnect. The session is cleaned up by walletConnectDisconnect().\n    }\n\n    async restore(): Promise<Provider<DappRpcTypes> | null> {\n        const client = await this.initSignClient()\n        const cantonSession = client.session\n            .getAll()\n            .find((s) => s.namespaces?.canton !== undefined)\n\n        if (cantonSession) {\n            this.session = cantonSession\n            this.setupSessionEvents()\n            return this\n        }\n        return null\n    }\n\n    // ── Provider<DappRpcTypes> ──────────────────────────────────────\n\n    async request<M extends keyof DappRpcTypes>(\n        args: RequestArgs<DappRpcTypes, M>\n    ): Promise<DappRpcTypes[M]['result']> {\n        if (args.method === 'connect') {\n            if (!this.session) {\n                await this.establishSession()\n            }\n\n            const status = this.emitConnected()\n            return status.connection as DappRpcTypes[M]['result']\n        }\n\n        if (args.method === 'disconnect') {\n            // Emit before clearing state so listeners receive it\n            this.emitDisconnected('User disconnected')\n            if (this.signClient && this.session) {\n                try {\n                    await this.signClient.disconnect({\n                        topic: this.session.topic,\n                        reason: { code: 6000, message: 'User disconnected' },\n                    })\n                } catch {\n                    // session may already be gone on the relay\n                }\n            }\n            this.session = null\n            return null as DappRpcTypes[M]['result']\n        }\n\n        // Return disconnected status locally when session isn't ready\n        if (args.method === 'status' && !this.session) {\n            return {\n                provider: PROVIDER_INFO,\n                connection: {\n                    isConnected: false,\n                    isNetworkConnected: false,\n                },\n            } as DappRpcTypes[M]['result']\n        }\n\n        if (!this.session) {\n            throw new Error('WalletConnect session not established')\n        }\n\n        // Both prepareExecute and prepareExecuteAndWait map to\n        // canton_prepareSignExecute — the wallet does the full\n        // prepare-sign-execute cycle and responds when complete.\n        if (\n            args.method === 'prepareExecute' ||\n            args.method === 'prepareExecuteAndWait'\n        ) {\n            const result = await this.walletConnectRequest(\n                'prepareSignExecute',\n                args.params\n            )\n            // Emit locally so useTransactions / onTxChanged picks it up\n            this.emit('txChanged', result)\n            return { tx: result } as DappRpcTypes[M]['result']\n        }\n\n        // Everything else is a direct pass-through\n        const params = 'params' in args ? args.params : undefined\n        return this.walletConnectRequest(\n            args.method as string,\n            params\n        ) as Promise<DappRpcTypes[M]['result']>\n    }\n\n    on<E>(event: string, listener: EventListener<E>): this {\n        if (!this.listeners[event]) {\n            this.listeners[event] = []\n        }\n        ;(this.listeners[event] as EventListener<E>[]).push(listener)\n\n        // Replay buffered events so the listener doesn't miss anything\n        const buffered = this.eventBuffer.get(event)\n        if (buffered) {\n            for (const args of buffered) {\n                listener(...(args as E[]))\n            }\n            this.eventBuffer.delete(event)\n        }\n        return this\n    }\n\n    emit<E>(event: string, ...args: E[]): boolean {\n        if (this.listeners[event]?.length > 0) {\n            this.listeners[event].forEach((listener) => listener(...args))\n            return true\n        }\n        // Buffer events that arrive before a listener is registered\n        if (!this.eventBuffer.has(event)) {\n            this.eventBuffer.set(event, [])\n        }\n        this.eventBuffer.get(event)!.push(args as unknown[])\n        return false\n    }\n\n    removeListener<E>(event: string, listenerToRemove: EventListener<E>): this {\n        if (this.listeners[event]) {\n            this.listeners[event] = this.listeners[event].filter(\n                (l) => l !== listenerToRemove\n            )\n        }\n        return this\n    }\n\n    // ── Private: WC request ─────────────────────────────────────────\n\n    /** Send a request through signClient, prefixing the method with `canton_`. */\n    private async walletConnectRequest<T>(\n        method: string,\n        params?: unknown\n    ): Promise<T> {\n        if (!this.signClient || !this.session) {\n            throw new Error('WalletConnect session not established')\n        }\n        try {\n            return (await this.signClient.request({\n                topic: this.session.topic,\n                chainId: this.chainId,\n                request: {\n                    method: `canton_${method}`,\n                    params: params ?? {},\n                },\n            })) as T\n        } catch (err: unknown) {\n            const errObj = typeof err === 'object' && err !== null ? err : {}\n            const message =\n                err instanceof Error\n                    ? err.message\n                    : 'message' in errObj &&\n                        typeof (errObj as { message: unknown }).message ===\n                            'string'\n                      ? (errObj as { message: string }).message\n                      : String(err)\n            const code =\n                'code' in errObj ? (errObj as { code: number }).code : -32603\n            throw new Error(`RPC error: ${code} - ${message}`, { cause: err })\n        }\n    }\n\n    // ── Private: session lifecycle ──────────────────────────────────\n\n    private emitConnected(): StatusEvent {\n        const connectStatus: StatusEvent = {\n            provider: PROVIDER_INFO,\n            connection: {\n                isConnected: true,\n                isNetworkConnected: true,\n            },\n        }\n        this.emit<StatusEvent>('statusChanged', connectStatus)\n        return connectStatus\n    }\n\n    private emitDisconnected(reason?: string) {\n        this.emit<StatusEvent>('statusChanged', {\n            provider: {\n                id: 'walletconnect',\n                providerType: 'mobile',\n            },\n            connection: {\n                isConnected: false,\n                isNetworkConnected: false,\n                ...(reason ? { reason: reason } : {}),\n            },\n        })\n    }\n\n    private async initSignClient(): Promise<SignClient> {\n        if (this.signClient) return this.signClient\n        if (this.initPromise) return this.initPromise\n\n        this.initPromise = SignClient.init({\n            projectId: this.projectId,\n            metadata: this.metadata ?? {\n                name: 'Canton dApp',\n                description: 'Canton Network dApp using WalletConnect',\n                url:\n                    typeof window !== 'undefined'\n                        ? window.location.origin\n                        : 'https://canton.network',\n                icons: [],\n            },\n        })\n\n        this.signClient = await this.initPromise\n\n        this.signClient.on('session_delete', () => {\n            // Emit BEFORE clearing state so listeners receive the event\n            this.emitDisconnected('Session deleted by wallet')\n            this.session = null\n        })\n\n        return this.signClient\n    }\n\n    /** Wire up session_event forwarding for the current session. */\n    private setupSessionEvents(): void {\n        if (!this.signClient) return\n        this.signClient.on('session_event', (event) => {\n            const { name, data } = event.params.event\n            this.emit(name, data)\n        })\n    }\n\n    private async establishSession(): Promise<void> {\n        const client = await this.initSignClient()\n\n        const { uri, approval } = await client.connect({\n            requiredNamespaces: {\n                canton: {\n                    chains: [this.chainId],\n                    methods: CANTON_WC_METHODS,\n                    events: CANTON_WC_EVENTS,\n                },\n            },\n        })\n\n        if (uri) {\n            this.onUri?.(uri)\n            await this.showUriInPopup(uri)\n        }\n\n        this.session = await approval()\n        this.setupSessionEvents()\n        if (this.signInWithCanton) {\n            const nonce = this.signInWithCanton.nonce || uuidv4()\n\n            try {\n                const account = this.session?.namespaces?.canton?.accounts?.[0]\n                const address = decodeURIComponent(account?.split(':')[2])\n                const chainId = account?.split(':')[1] ?? this.chainId\n                const message = composeSIWXMessage({\n                    ...this.signInWithCanton,\n                    accountAddress: address,\n                    chainId: chainId,\n                })\n\n                const result = await this.walletConnectRequest<{\n                    signature: string\n                    publicKey: string\n                }>('signMessage', {\n                    message: message,\n                })\n                this.onSignInWithCanton?.({\n                    requestId: this.signInWithCanton.requestId,\n                    nonce,\n                    account: account,\n                    chainId: chainId,\n                    message: message,\n                    signature: result.signature,\n                    publicKey: result.publicKey,\n                })\n            } catch (error) {\n                const err = error as Error\n                this.onSignInWithCanton?.({\n                    requestId: this.signInWithCanton.requestId,\n                    nonce,\n                    account: '',\n                    chainId: '',\n                    message: '',\n                    publicKey: '',\n                    signature: '',\n                    error: {\n                        message: err.message,\n                        code: -32603,\n                    },\n                })\n            }\n        }\n    }\n\n    private async showUriInPopup(uri: string): Promise<void> {\n        try {\n            const popupWin = window.open('', 'wallet-popup')\n            if (!popupWin || popupWin.closed) return\n\n            let qrDataUrl: string | undefined\n            try {\n                const QRCode = await import('qrcode')\n                qrDataUrl = await QRCode.toDataURL(uri, {\n                    width: 200,\n                    margin: 2,\n                    color: { dark: '#000000', light: '#ffffff' },\n                })\n            } catch {\n                // qrcode package not installed — skip QR generation\n            }\n\n            const targetOrigin =\n                typeof window !== 'undefined' ? window.location.origin : '*'\n\n            if (targetOrigin !== '*') {\n                popupWin.postMessage(\n                    { type: 'wc-uri', uri, qrDataUrl },\n                    targetOrigin\n                )\n            } else {\n                throw new Error(\n                    'Cannot securely send WalletConnect URI: Origin undefined'\n                )\n            }\n        } catch {\n            // Best-effort — onUri callback is the fallback.\n        }\n    }\n}\n","[\n    {\n        \"name\": \"Wallet Gateway (localhost, dev)\",\n        \"rpcUrl\": \"http://localhost:3030/api/v0/dapp\"\n    }\n]\n","[\n    {\n        \"name\": \"Send Connect\",\n        \"type\": \"browser\",\n        \"providerId\": \"browser:ext:ldmohiccoioolenadmogclhoklmanpgi\",\n        \"description\": \"Connect via a browser extension wallet\",\n        \"icon\": \"https://info.send.it/img/favicon.svg\",\n        \"installUrls\": [\n            {\n                \"platform\": \"chrome\",\n                \"url\": \"https://chromewebstore.google.com/detail/send-connect/ldmohiccoioolenadmogclhoklmanpgi\"\n            }\n        ]\n    }\n]\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n    CANTON_ANNOUNCE_PROVIDER_EVENT,\n    CANTON_REQUEST_PROVIDER_EVENT,\n} from '@canton-network/core-types'\n\nexport type AnnouncedProvider = {\n    /** Stable identifier for the wallet/extension (e.g. chrome.runtime.id). */\n    id: string\n    /** Display name for pickers. */\n    name: string\n    /** Optional icon (data URL or https URL) */\n    icon?: string | undefined\n    /**\n     * Optional routing key for postMessage-based transports.\n     * For extensions, this should typically equal `id`.\n     */\n    target?: string | undefined\n}\n\nexport async function requestAnnouncedProviders(options?: {\n    timeoutMs?: number | undefined\n}): Promise<AnnouncedProvider[]> {\n    if (typeof window === 'undefined') return []\n\n    const timeoutMs = options?.timeoutMs ?? 300\n    const discovered = new Map<string, AnnouncedProvider>()\n\n    const handler = (event: Event) => {\n        const ce = event as CustomEvent<unknown>\n        const detail = ce.detail as Partial<AnnouncedProvider> | undefined\n        if (!detail?.id || !detail.name) return\n        if (discovered.has(detail.id)) return\n        discovered.set(detail.id, {\n            id: detail.id,\n            name: detail.name,\n            icon: detail.icon,\n            target: detail.target,\n        })\n    }\n\n    window.addEventListener(CANTON_ANNOUNCE_PROVIDER_EVENT, handler)\n    try {\n        window.dispatchEvent(\n            new CustomEvent(CANTON_REQUEST_PROVIDER_EVENT, { detail: {} })\n        )\n        await new Promise((resolve) => setTimeout(resolve, timeoutMs))\n    } finally {\n        window.removeEventListener(CANTON_ANNOUNCE_PROVIDER_EVENT, handler)\n    }\n\n    return Array.from(discovered.values())\n}\n","// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * DappSDK ties together DiscoveryClient + DappClient and serves as the\n * primary SDK entrypoint for dApp developers.\n *\n * A default singleton instance is exported at the bottom of this file, and\n * module-level functions delegate to that singleton for backward compatibility\n * (e.g. `sdk.connect()`, `sdk.status()`).\n */\n\nimport {\n    DiscoveryClient,\n    type ProviderAdapter,\n    type WalletPickerEntry,\n    type WalletPickerFn,\n} from '@canton-network/core-wallet-discovery'\nimport {\n    notifyWalletPickerConnected,\n    notifyWalletPickerError,\n    pickWallet,\n    waitForWalletPickerRetrySelection,\n} from '@canton-network/core-wallet-ui-components'\nimport type {\n    EventListener,\n    Provider,\n} from '@canton-network/core-splice-provider'\nimport type {\n    StatusEvent,\n    ConnectResult,\n    PrepareExecuteParams,\n    PrepareExecuteAndWaitResult,\n    LedgerApiParams,\n    LedgerApiResult,\n    ListAccountsResult,\n    AccountsChangedEvent,\n    TxChangedEvent,\n    RpcTypes as DappRpcTypes,\n    MessageSignatureEvent,\n    SignMessageParams,\n    SignMessageResult,\n} from '@canton-network/core-wallet-dapp-rpc-client'\nimport { DappClient } from './client'\nimport { ExtensionAdapter } from './adapter/extension-adapter'\nimport {\n    RemoteAdapter,\n    type RemoteAdapterConfig,\n} from './adapter/remote-adapter'\nimport * as storage from './storage'\nimport { clearAllLocalState } from './util'\nimport defaultGatewayList from './gateways.json'\nimport defaultExtensionsList from './wallets.json'\nimport { CANTON_LOGO_PNG } from './assets'\nimport { requestAnnouncedProviders } from './announce-discovery'\n\nexport interface DappSDKConnectOptions<\n    TDefaultAdapter extends ProviderAdapter = ProviderAdapter,\n> {\n    defaultAdapters?: TDefaultAdapter[]\n    additionalAdapters?: ProviderAdapter[] | undefined\n    enableSuggestedWallets?: boolean\n}\n\nfunction defaultTrue(b: boolean | undefined): boolean {\n    return b === undefined ? true : b\n}\n\nfunction normalizeConnectOptions(\n    options: DappSDKConnectOptions\n): DappSDKConnectOptions {\n    return {\n        defaultAdapters:\n            options.defaultAdapters === undefined\n                ? createDefaultAdapters(defaultGatewayList)\n                : options.defaultAdapters,\n        additionalAdapters: options.additionalAdapters,\n        enableSuggestedWallets: defaultTrue(options.enableSuggestedWallets),\n    }\n}\n\nexport class DappSDK {\n    private readonly RECENT_GATEWAYS_KEY = 'splice_wallet_picker_recent'\n    private readonly walletPicker: WalletPickerFn\n    private discovery: DiscoveryClient | null = null\n    private client: DappClient | null = null\n    private initPromise: Promise<unknown> | null = null\n    private dynamicAdapterIds = new Set<string>()\n    private configuredAdapters: DappSDKConnectOptions | undefined\n\n    constructor(options?: { walletPicker?: WalletPickerFn | undefined }) {\n        this.walletPicker =\n            options?.walletPicker ?? (pickWallet as WalletPickerFn)\n    }\n\n    private async registerAdapters(\n        discovery: DiscoveryClient,\n        adapters?: ProviderAdapter[] | undefined\n    ): Promise<void> {\n        if (!adapters?.length) return\n\n        const existingIds = new Set(\n            discovery.listAdapters().map((a) => a.providerId as string)\n        )\n        for (const adapter of adapters) {\n            const id = adapter.providerId as string\n            if (existingIds.has(id)) continue\n            if (await adapter.detect()) {\n                discovery.registerAdapter(adapter)\n                existingIds.add(id)\n            }\n        }\n    }\n\n    private async registerAnnouncedAdapters(\n        discovery: DiscoveryClient\n    ): Promise<void> {\n        const existingIds = new Set(\n            discovery.listAdapters().map((a) => a.providerId as string)\n        )\n\n        const announced = await requestAnnouncedProviders()\n        for (const item of announced) {\n            const id = `browser:ext:${item.id}`\n            if (existingIds.has(id)) continue\n\n            const adapter = new ExtensionAdapter({\n                providerId: id as never,\n                name: item.name,\n                icon: item.icon,\n                description: 'Connect via a browser extension wallet',\n                target: item.target ?? item.id,\n            })\n            if (await adapter.detect()) {\n                discovery.registerAdapter(adapter)\n                existingIds.add(id)\n            }\n        }\n    }\n\n    private async ensureDiscovery(\n        config?: DappSDKConnectOptions\n    ): Promise<DiscoveryClient> {\n        const initAdapters = this.getInitAdapters(config)\n\n        if (!this.discovery) {\n            const detectedAdapters =\n                await this.collectDetectedAdapters(initAdapters)\n            this.discovery = await DiscoveryClient.create({\n                walletPicker: this.walletPicker,\n                adapters: detectedAdapters,\n            })\n        } else {\n            await this.registerAdapters(this.discovery, initAdapters)\n        }\n\n        // Extensions can announce after initial create().\n        await this.registerAnnouncedAdapters(this.discovery)\n\n        await this.discovery.restorePersistedSessionIfNeeded()\n\n        if (!this.client) {\n            const session = this.discovery.getActiveSession()\n            if (session) {\n                const providerType = session.adapter.getInfo().type\n                const target =\n                    session.adapter instanceof ExtensionAdapter\n                        ? session.adapter.target\n                        : undefined\n                this.client = new DappClient(session.provider, {\n                    providerType,\n                    target,\n                })\n            }\n        }\n\n        return this.discovery\n    }\n\n    private getInitAdapters(config?: DappSDKConnectOptions): ProviderAdapter[] {\n        if (config) {\n            const normalized = normalizeConnectOptions(config)\n            return [\n                ...(normalized.defaultAdapters ?? []),\n                ...(normalized.additionalAdapters ?? []),\n            ]\n        }\n\n        const kernelDiscovery = storage.getKernelDiscovery()\n        if (kernelDiscovery?.walletType === 'remote' && kernelDiscovery.url) {\n            return [\n                new RemoteAdapter({\n                    name: kernelDiscovery.url,\n                    rpcUrl: kernelDiscovery.url,\n                }),\n            ]\n        }\n\n        // No config + nothing to restore => default gateways.\n        return createDefaultAdapters(defaultGatewayList)\n    }\n\n    private async collectDetectedAdapters(\n        adapters: ProviderAdapter[]\n    ): Promise<ProviderAdapter[]> {\n        const detected: ProviderAdapter[] = []\n        for (const adapter of adapters) {\n            if (await adapter.detect()) {\n                detected.push(adapter)\n            }\n        }\n        return detected\n    }\n\n    private saveRecentGateway(name: string, rpcUrl: string): void {\n        try {\n            const raw = localStorage.getItem(this.RECENT_GATEWAYS_KEY)\n            const recent: { name: string; rpcUrl: string }[] = raw\n                ? JSON.parse(raw)\n                : []\n            const filtered = recent.filter((r) => r.rpcUrl !== rpcUrl)\n            filtered.unshift({ name, rpcUrl })\n            localStorage.setItem(\n                this.RECENT_GATEWAYS_KEY,\n                JSON.stringify(filtered.slice(0, 5))\n            )\n        } catch {\n            // best-effort\n        }\n    }\n\n    private getHttpStatusCode(error: unknown): number | undefined {\n        const asNumber = (value: unknown): number | undefined =>\n            typeof value === 'number' ? value : undefined\n\n        if (typeof error !== 'object' || error === null) return undefined\n\n        const obj = error as Record<string, unknown>\n        const response = obj.response as Record<string, unknown> | undefined\n        const cause = obj.cause as Record<string, unknown> | undefined\n\n        return (\n            asNumber(obj.status) ??\n            asNumber(obj.statusCode) ??\n            asNumber(response?.status) ??\n            asNumber(cause?.status) ??\n            asNumber(cause?.statusCode)\n        )\n    }\n\n    private formatConnectionErrorMessage(error: unknown): string {\n        const fallbackMessage = 'Failed to connect wallet'\n        const baseMessage =\n            error instanceof Error && error.message.trim().length > 0\n                ? error.message\n                : fallbackMessage\n\n        const statusCode = this.getHttpStatusCode(error)\n        if (!statusCode) return baseMessage\n\n        const lowerMessage = baseMessage.toLowerCase()\n        if (\n            lowerMessage.includes(`http ${statusCode}`) ||\n            lowerMessage.includes(`status ${statusCode}`)\n        ) {\n            return baseMessage\n        }\n\n        return `${baseMessage} (HTTP ${statusCode})`\n    }\n\n    private requireClient(): DappClient {\n        if (!this.client)\n            throw new Error('Not connected — call connect() first')\n        return this.client\n    }\n\n    /**\n     * Returns the raw connected provider instance (if any).\n     *\n     * This is useful for advanced integrations that need to call methods that\n     * are not wrapped by the higher-level SDK helpers.\n     */\n    getConnectedProvider(): Provider<DappRpcTypes> | null {\n        const session = this.discovery?.getActiveSession()\n        if (!session) return null\n        return session.provider\n    }\n\n    /**\n     * Cold-start the SDK: create (or update) the discovery client, register adapters,\n     * and attempt to restore a persisted wallet session without opening the picker.\n     *\n     * Call early on app mount with your adapter configuration. For the exported\n     * {@link sdk} singleton, the **first** `init()` call (with or without options)\n     * determines how {@link ensureDiscovery} builds the initial adapter list; pass\n     * `options` on that first call when you need custom gateways or extra adapters.\n     *\n     * Adapter selection when discovery is first created (see {@link getInitAdapters}):\n     * - If `options` is passed on this call, use those adapters (default gateways apply when\n     *   `defaultAdapters` is omitted).\n     * - Else if {@link configuredAdapters} was set by an earlier `init(options)`, use it.\n     * - Else use the last remote gateway URL from app-local hints (if any), otherwise\n     *   fall back to default gateways (`gateways.json`).\n     *\n     * Session restore itself is always performed by {@link DiscoveryClient} via\n     * `restorePersistedSessionIfNeeded()`; the SDK only ensures a compatible adapter set\n     * is registered first.\n     *\n     * Safe to call from multiple places: concurrent callers share the same in-flight\n     * promise; discovery creation itself still happens at most once per SDK instance.\n     */\n    async init(options?: DappSDKConnectOptions): Promise<void> {\n        // Register adapters and store them in the SDK instance.\n        if (options) {\n            this.configuredAdapters = normalizeConnectOptions(options)\n        }\n\n        const enableSuggestedWallets = defaultTrue(\n            this.configuredAdapters?.enableSuggestedWallets\n        )\n\n        if (enableSuggestedWallets) {\n            // Enable suggested wallets logic here\n            localStorage.setItem(\n                'splice_wallet_picker_suggested_entries',\n                JSON.stringify(defaultExtensionsList)\n            )\n        } else {\n            localStorage.removeItem('splice_wallet_picker_suggested_entries')\n        }\n\n        // Create discovery and attempt restore.\n        // If init() is called again *with options*, make sure those adapters\n        // are registered even if discovery was already created by an earlier call\n        // (e.g. status() on cold start). Serialize behind the existing initPromise\n        // to avoid concurrent discovery mutations.\n        this.initPromise = this.initPromise\n            ? this.initPromise.then(() =>\n                  this.ensureDiscovery(this.configuredAdapters)\n              )\n            : this.ensureDiscovery(this.configuredAdapters)\n        await this.initPromise\n    }\n\n    async connect(): Promise<ConnectResult>\n    /** @deprecated Pass options to `init()` instead. */\n    async connect(options: DappSDKConnectOptions): Promise<ConnectResult>\n    async connect(options?: DappSDKConnectOptions): Promise<ConnectResult> {\n        // Prefer init({ ... }) once at startup. Passing options here remains supported\n        // for older call sites; it is equivalent to init(options) then connect().\n        if (options) {\n            await this.init(options)\n        } else {\n            await this.init()\n        }\n\n        const discovery = this.discovery!\n        await this.registerAnnouncedAdapters(discovery)\n\n        clearAllLocalState()\n\n        // Build entries from registered (non-dynamic) adapters\n        const entries: WalletPickerEntry[] = discovery\n            .listAdapters()\n            .filter((a) => !this.dynamicAdapterIds.has(a.providerId as string))\n            .map((a) => {\n                const info = a.getInfo()\n                return {\n                    providerId: info.providerId as string,\n                    name: info.name,\n                    type: info.type,\n                    description: info.description,\n                    icon: info.icon,\n                    url: info.url,\n                    reuseGlobalWalletPopup: info.reuseGlobalWalletPopup,\n                }\n            })\n\n        const initialSelection = await this.walletPicker(entries)\n        const connectionAttempts = new EventTarget()\n\n        return new Promise<ConnectResult>((resolve, reject) => {\n            const cleanup = () => {\n                connectionAttempts.removeEventListener('attempt', onAttempt)\n            }\n\n            const onAttempt = async (event: Event): Promise<void> => {\n                const picked = (event as CustomEvent<WalletPickerEntry>).detail\n                let targetId = picked.providerId\n\n                // Register a dynamic adapter for custom gateway URLs\n                if (picked.type === 'remote' && picked.url) {\n                    const existing = discovery\n                        .listAdapters()\n                        .find((a) => a.providerId === targetId)\n                    if (!existing) {\n                        const adapter = new RemoteAdapter({\n                            name: picked.name,\n                            rpcUrl: picked.url,\n                        })\n                        discovery.registerAdapter(adapter)\n                        this.dynamicAdapterIds.add(adapter.providerId as string)\n                        targetId = adapter.providerId\n                    }\n                }\n\n                try {\n                    // creates provider based on the adapter\n                    // provider stores (and reads from storage) the session token and the access token\n                    await discovery.connect(targetId)\n\n                    const session = discovery.getActiveSession()\n                    if (!session) {\n                        throw new Error(\n                            'Connection succeeded but no active session'\n                        )\n                    }\n\n                    const info = session.adapter.getInfo()\n\n                    this.client = new DappClient(session.provider, {\n                        providerType: info.type,\n                        target:\n                            session.adapter instanceof ExtensionAdapter\n                                ? session.adapter.target\n                                : undefined,\n                    })\n                    const s = await this.client.status()\n\n                    if (s.connection.isConnected) {\n                        if (info.type === 'remote' && info.url) {\n                            storage.setKernelDiscovery({\n                                walletType: 'remote',\n                                url: info.url,\n                            })\n                            this.saveRecentGateway(info.name, info.url)\n                        } else if (info.type === 'browser') {\n                            storage.setKernelDiscovery({\n                                walletType: 'extension',\n                                providerId: info.providerId as string,\n                            })\n                        }\n                    }\n\n                    notifyWalletPickerConnected(info.reuseGlobalWalletPopup)\n                    cleanup()\n                    resolve(s.connection)\n                } catch (error) {\n                    const message = this.formatConnectionErrorMessage(error)\n                    notifyWalletPickerError(message)\n\n                    this.client = null\n\n                    try {\n                        const retrySelection =\n                            await waitForWalletPickerRetrySelection()\n                        connectionAttempts.dispatchEvent(\n                            new CustomEvent<WalletPickerEntry>('attempt', {\n                                detail: retrySelection,\n                            })\n                        )\n                    } catch (retryError) {\n                        cleanup()\n                        reject(retryError)\n                    }\n                }\n            }\n\n            connectionAttempts.addEventListener('attempt', onAttempt)\n            connectionAttempts.dispatchEvent(\n                new CustomEvent<WalletPickerEntry>('attempt', {\n                    detail: initialSelection,\n                })\n            )\n        })\n    }\n\n    async disconnect(): Promise<null> {\n        // This may result in double call to dapp-api with method `disconnect` and double event `statusChanged`\n        if (this.client) {\n            await this.client.disconnect()\n            this.client = null\n        }\n        if (this.discovery) {\n            try {\n                await this.discovery.disconnect()\n            } catch {\n                // already cleaned up via DappClient.disconnect()\n            }\n        }\n        return null\n    }\n\n    async isConnected(): Promise<ConnectResult> {\n        if (this.client) {\n            return this.client.isConnected()\n        }\n        return {\n            isConnected: false,\n            isNetworkConnected: false,\n            reason: 'Unauthenticated',\n            networkReason: 'Unauthenticated',\n        }\n    }\n\n    async status(): Promise<StatusEvent> {\n        // Same cold-start as connect: restore session (if any) so requireClient() works.\n        await this.init()\n        return this.requireClient().status()\n    }\n\n    async listAccounts(): Promise<ListAccountsResult> {\n        return this.requireClient().listAccounts()\n    }\n\n    async prepareExecute(params: PrepareExecuteParams): Promise<null> {\n        return this.requireClient().prepareExecute(params)\n    }\n\n    async prepareExecuteAndWait(\n        params: PrepareExecuteParams\n    ): Promise<PrepareExecuteAndWaitResult> {\n        return this.requireClient().prepareExecuteAndWait(params)\n    }\n\n    async signMessage(params: SignMessageParams): Promise<SignMessageResult> {\n        return this.requireClient().signMessage(params)\n    }\n\n    async ledgerApi(params: LedgerApiParams): Promise<LedgerApiResult> {\n        return this.requireClient().ledgerApi(params)\n    }\n\n    async open(): Promise<void> {\n        return this.requireClient().open()\n    }\n\n    async onStatusChanged(listener: EventListener<StatusEvent>): Promise<void> {\n        this.requireClient().onStatusChanged(listener)\n    }\n\n    async onAccountsChanged(\n        listener: EventListener<AccountsChangedEvent>\n    ): Promise<void> {\n        this.requireClient().onAccountsChanged(listener)\n    }\n\n    async onConnected(listener: EventListener<StatusEvent>): Promise<void> {\n        this.requireClient().onConnected(listener)\n    }\n\n    async onTxChanged(listener: EventListener<TxChangedEvent>): Promise<void> {\n        this.requireClient().onTxChanged(listener)\n    }\n\n    async onMessageSignature(\n        listener: EventListener<MessageSignatureEvent>\n    ): Promise<void> {\n        this.requireClient().onMessageSignature(listener)\n    }\n\n    async removeOnStatusChanged(\n        listener: EventListener<StatusEvent>\n    ): Promise<void> {\n        if (!this.client) return\n        this.client.removeOnStatusChanged(listener)\n    }\n\n    async removeOnAccountsChanged(\n        listener: EventListener<AccountsChangedEvent>\n    ): Promise<void> {\n        if (!this.client) return\n        this.client.removeOnAccountsChanged(listener)\n    }\n\n    async removeOnConnected(\n        listener: EventListener<StatusEvent>\n    ): Promise<void> {\n        if (!this.client) return\n        this.client.removeOnConnected(listener)\n    }\n\n    async removeOnTxChanged(\n        listener: EventListener<TxChangedEvent>\n    ): Promise<void> {\n        if (!this.client) return\n        this.client.removeOnTxChanged(listener)\n    }\n\n    async removeOnMessageSignature(\n        listener: EventListener<MessageSignatureEvent>\n    ): Promise<void> {\n        if (!this.client) return\n        this.client.removeOnMessageSignature(listener)\n    }\n}\n\nexport const sdk = new DappSDK()\n\n/**\n * Opens the wallet picker and connects. Prefer {@link init} with adapters at startup;\n * `options` here is a legacy convenience that forwards to {@link DappSDK.init}.\n */\nexport function connect(): Promise<ConnectResult>\n/** @deprecated Pass options to `init()` instead. */\nexport function connect(options: DappSDKConnectOptions): Promise<ConnectResult>\nexport function connect(\n    options?: DappSDKConnectOptions\n): Promise<ConnectResult> {\n    // TODO we probably shouldn't add logic in the convenience exported methods\n    //  that would not execute if called through sdk.connect\n    if (options) {\n        return sdk.init(options).then(() => sdk.connect())\n    }\n    return sdk.connect()\n}\n\nexport const init = (options?: DappSDKConnectOptions): Promise<void> =>\n    sdk.init(options)\n\nexport const disconnect = (): Promise<null> => sdk.disconnect()\n\nexport const isConnected = (): Promise<ConnectResult> => sdk.isConnected()\n\nexport const status = (): Promise<StatusEvent> => sdk.status()\n\nexport const listAccounts = (): Promise<ListAccountsResult> =>\n    sdk.listAccounts()\n\nexport const prepareExecute = (params: PrepareExecuteParams): Promise<null> =>\n    sdk.prepareExecute(params)\n\nexport const prepareExecuteAndWait = (\n    params: PrepareExecuteParams\n): Promise<PrepareExecuteAndWaitResult> => sdk.prepareExecuteAndWait(params)\n\nexport const ledgerApi = (params: LedgerApiParams): Promise<LedgerApiResult> =>\n    sdk.ledgerApi(params)\n\nexport const open = (): Promise<void> => sdk.open()\n\nexport const getConnectedProvider = (): ReturnType<\n    DappSDK['getConnectedProvider']\n> => sdk.getConnectedProvider()\n\nexport const onStatusChanged = (\n    listener: EventListener<StatusEvent>\n): Promise<void> => sdk.onStatusChanged(listener)\n\nexport const onAccountsChanged = (\n    listener: EventListener<AccountsChangedEvent>\n): Promise<void> => sdk.onAccountsChanged(listener)\n\nexport const onConnected = (\n    listener: EventListener<StatusEvent>\n): Promise<void> => sdk.onConnected(listener)\n\nexport const onTxChanged = (\n    listener: EventListener<TxChangedEvent>\n): Promise<void> => sdk.onTxChanged(listener)\n\nexport const onMessageSignature = (\n    listener: EventListener<MessageSignatureEvent>\n): Promise<void> => sdk.onMessageSignature(listener)\nexport const removeOnStatusChanged = (\n    listener: EventListener<StatusEvent>\n): Promise<void> => sdk.removeOnStatusChanged(listener)\n\nexport const removeOnAccountsChanged = (\n    listener: EventListener<AccountsChangedEvent>\n): Promise<void> => sdk.removeOnAccountsChanged(listener)\n\nexport const removeOnConnected = (\n    listener: EventListener<StatusEvent>\n): Promise<void> => sdk.removeOnConnected(listener)\n\nexport const removeOnTxChanged = (\n    listener: EventListener<TxChangedEvent>\n): Promise<void> => sdk.removeOnTxChanged(listener)\n\nexport const removeOnMessageSignature = (\n    listener: EventListener<MessageSignatureEvent>\n): Promise<void> => sdk.removeOnMessageSignature(listener)\n\nfunction createDefaultAdapters(\n    defaultGatewayConfigs: RemoteAdapterConfig[]\n): ProviderAdapter[] {\n    return defaultGatewayConfigs.map(\n        (config) =>\n            new RemoteAdapter({\n                ...config,\n                icon: config.icon ?? CANTON_LOGO_PNG,\n            } satisfies RemoteAdapterConfig)\n    )\n}\n"]}