@partylayer/adapter-send 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/dist/index.d.mts +68 -39
- package/dist/index.d.ts +68 -39
- package/dist/index.js +97 -78
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +98 -79
- package/dist/index.mjs.map +1 -1
- package/package.json +11 -10
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/send-provider.ts","../src/send-adapter.ts"],"names":["WalletNotInstalledError","PartyLayerError","UserRejectedError","CapabilityNotSupportedError","TransportError","mapUnknownErrorToPartyLayerError","matchesProviderDetection","WALLET_ID","toWalletId","toPartyId","toSignature","toTransactionHash"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProviderDetection } from '@partylayer/core';\n\n/**\n * Send Canton Wallet extension IDs.\n *\n * Send's runtime-injected CIP-103 provider reports its identity at\n * `window.canton.request({ method: 'status' }).provider.id`. The value\n * observed in production differs from the public Chrome Web Store\n * listing ID, so both are listed here. New IDs (e.g., from rebrands or\n * separate distribution channels) can be appended to this list without\n * code changes elsewhere.\n */\nexport const SEND_PRODUCTION_EXTENSION_ID = 'lpnfhpbpmlobjlgkdmnjieeihjmihhjd';\nexport const SEND_LEGACY_EXTENSION_ID = 'ldmohiccoioolenadmogclhoklmanpgi';\n\nexport const SEND_KNOWN_EXTENSION_IDS = [\n SEND_PRODUCTION_EXTENSION_ID,\n SEND_LEGACY_EXTENSION_ID,\n] as const;\n\n/**\n * @deprecated Use SEND_PRODUCTION_EXTENSION_ID or SEND_KNOWN_EXTENSION_IDS.\n * Retained for backward source-compatibility with consumers that import\n * the old name. Will be removed in a future major.\n */\nexport const SEND_KERNEL_ID = SEND_LEGACY_EXTENSION_ID;\n\n/**\n * Built-in fallback detection patterns, mirroring the canonical Send\n * registry entry's `providerDetection`. Used when no registry entry is\n * injected at adapter construction time so adapter-only installs (no\n * registry fetch yet, or registry fetch failed) still recognise Send.\n *\n * Matchers are ordered: `provider.id` first (current production injection\n * shape — Send's status response has `{ connection, provider }`, not a\n * `kernel` field), then `kernel.*` fields (defensive — supports future\n * Send releases that may add a kernel field, and any non-Send wallet\n * that exposes kernel-shaped provider metadata at cantonwallet.com).\n *\n * If Send's identity signals change in the future, update both this\n * constant AND the registry entry — the registry is canonical, this is\n * the defensive mirror. The parity is verified by a test in\n * `send-adapter.test.ts`.\n */\nexport const SEND_BUILTIN_DETECTION: ProviderDetection = {\n transport: 'window.canton',\n matchers: [\n { field: 'provider.id', match: 'exact', values: [...SEND_KNOWN_EXTENSION_IDS] },\n { field: 'kernel.url', match: 'domain', value: 'cantonwallet.com' },\n { field: 'kernel.userUrl', match: 'domain', value: 'cantonwallet.com' },\n { field: 'kernel.id', match: 'exact', values: [...SEND_KNOWN_EXTENSION_IDS] },\n ],\n};\n\n/**\n * Network IDs Send currently supports. Send is mainnet-only as of v0.2.0.\n * Listed in Canton long-form so it stays distinguishable from PartyLayer's\n * generic 'mainnet' alias.\n */\nexport const SEND_SUPPORTED_NETWORKS = ['canton:mainnet'] as const;\n\nexport const SEND_INSTALL_URL = 'https://sigilry.org';\n\nexport const SEND_HOMEPAGE = 'https://cantonwallet.com';\n\nexport const SEND_DOCS_URL = 'https://sigilry.org';\n\n/**\n * Send signs every transaction via the WebAuthn PRF extension (passkey).\n * Surfaced through session metadata so dApps can adapt copy (\"approve in\n * Touch ID / Face ID prompt\") rather than show a generic \"open extension\"\n * hint.\n */\nexport const SEND_SIGNING_METHOD = 'webauthn-prf' as const;\n","/**\n * Send-specific error helpers.\n *\n * PartyLayer's `ErrorCode` union (in `@partylayer/core/errors.ts`) is the\n * canonical taxonomy. We do NOT introduce new codes here — instead, the\n * Send-specific error classes subclass the closest existing PartyLayer\n * error and carry the diagnostic detail (kernel id, RPC code) in\n * `details`. That way existing telemetry pipelines and `code`-based\n * branches in dApp code continue to work without modification.\n */\n\nimport {\n CapabilityNotSupportedError,\n PartyLayerError,\n TransportError,\n UserRejectedError,\n WalletNotInstalledError,\n mapUnknownErrorToPartyLayerError,\n type ErrorMappingContext,\n} from '@partylayer/core';\n\nimport { SEND_INSTALL_URL, SEND_KERNEL_ID } from './constants';\n\n/** JSON-RPC 2.0 + EIP-1193 error codes Sigilry surfaces. */\nexport const SendRpcErrorCode = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n USER_REJECTED: 4001,\n UNAUTHORIZED: 4100,\n UNSUPPORTED_METHOD: 4200,\n DISCONNECTED: 4900,\n CHAIN_DISCONNECTED: 4901,\n INVALID_INPUT: -32000,\n RESOURCE_NOT_FOUND: -32001,\n RESOURCE_UNAVAILABLE: -32002,\n TRANSACTION_REJECTED: -32003,\n METHOD_NOT_SUPPORTED: -32004,\n LIMIT_EXCEEDED: -32005,\n} as const;\n\nconst WALLET_ID = 'send';\n\n/**\n * Send isn't installed — `window.canton` is unavailable entirely.\n *\n * Subclasses `WalletNotInstalledError` so existing capability gates and\n * UI (\"install Send\") light up automatically. Carries the install URL in\n * `details` for one-click prompts.\n */\nexport class SendNotInstalledError extends WalletNotInstalledError {\n constructor(reason?: string) {\n super(\n WALLET_ID,\n reason ?? `Send Canton Wallet is not detected. Visit ${SEND_INSTALL_URL} for installation instructions`,\n );\n this.name = 'SendNotInstalledError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n installUrl: SEND_INSTALL_URL,\n };\n }\n}\n\n/**\n * `window.canton` is present but `kernel.id` does not match Send.\n *\n * Treated as \"Send not installed\" from the SDK's perspective so that\n * other adapters get a chance to claim the active provider — but the\n * runtime kernel id is preserved in `details` for diagnostics.\n *\n * The wording avoids the keywords \"rejected\"/\"denied\"/\"cancelled\" so\n * `mapUnknownErrorToPartyLayerError` won't silently rewrite this as a\n * `UserRejectedError` when re-thrown through error mapping.\n */\nexport class SendKernelMismatchError extends WalletNotInstalledError {\n constructor(actualKernelId: string) {\n super(\n WALLET_ID,\n `Another Canton wallet is active at window.canton (kernel.id=\"${actualKernelId}\", expected \"${SEND_KERNEL_ID}\"). The Send adapter will yield to the matching adapter.`,\n );\n this.name = 'SendKernelMismatchError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n actualKernelId,\n expectedKernelId: SEND_KERNEL_ID,\n };\n }\n}\n\n/**\n * Send's authentication backend (auth.cantonwallet.com) timed out or was\n * otherwise unreachable. This is an external, intermittent issue on\n * Send's side — not a PartyLayer issue, not a wallet-not-installed\n * issue, and not a user rejection. Surfaced as a typed error so the UI\n * can offer a \"Try again\" affordance + link to Send's status page.\n *\n * Subclasses `WalletNotInstalledError` to reuse the existing core error\n * code (`'WALLET_NOT_INSTALLED'`) without expanding the canonical\n * `ErrorCode` union — but the class identity (`name`) plus\n * `details.cause = 'send-auth-timeout'` give consumers enough signal to\n * route the retry UX without a code-level change.\n */\nexport class SendAuthTimeoutError extends WalletNotInstalledError {\n constructor(originalMessage?: string) {\n super(\n WALLET_ID,\n originalMessage ??\n 'Send authentication timed out. Please try again. ' +\n 'If the problem persists, see https://cantonwallet.com',\n );\n this.name = 'SendAuthTimeoutError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n cause: 'send-auth-timeout',\n retry: true,\n helpUrl: 'https://cantonwallet.com',\n ...(originalMessage ? { originalMessage } : {}),\n };\n }\n}\n\n/**\n * Recognise Send-side authentication-timeout signatures in arbitrary\n * error payloads. Covers the wording variants the Send wallet surfaces\n * today (the wallet UI itself uses both \"Authentication timed out\" and\n * \"Cannot reach authentication server\"; the underlying domain\n * `auth.cantonwallet.com` shows up in stack traces / fetch errors when\n * the network is at fault).\n */\nexport function detectSendAuthTimeout(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const raw = (err as { message?: unknown }).message;\n if (typeof raw !== 'string' || raw.length === 0) return false;\n const msg = raw.toLowerCase();\n return (\n msg.includes('authentication timed out') ||\n msg.includes('cannot reach authentication server') ||\n msg.includes('auth.cantonwallet.com')\n );\n}\n\ninterface SendRpcErrorLike {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport function isSendRpcError(err: unknown): err is SendRpcErrorLike {\n if (!err || typeof err !== 'object') return false;\n const candidate = err as { code?: unknown; message?: unknown };\n return typeof candidate.code === 'number' && typeof candidate.message === 'string';\n}\n\n/**\n * Translate a Sigilry RPC error to the closest PartyLayer error class.\n *\n * Falls back to `mapUnknownErrorToPartyLayerError` when the error doesn't\n * carry a recognisable JSON-RPC `code`. Note that `mapUnknownErrorToPartyLayerError`\n * itself rewrites messages containing \"rejected\"/\"denied\"/\"cancelled\" into\n * `UserRejectedError`, so we explicitly route the 4001 code first to make\n * the user-rejection path stable across wording changes in the wallet.\n */\nexport function mapSigilryError(\n err: unknown,\n context: ErrorMappingContext,\n): PartyLayerError {\n if (err instanceof PartyLayerError) return err;\n\n // Send-side auth-timeout takes priority over the generic RPC-code path\n // because the wallet sometimes wraps the timeout into a generic message\n // without a structured error code. Surfacing it as a typed error lets\n // the modal render a retry affordance.\n if (detectSendAuthTimeout(err)) {\n const original = err instanceof Error ? err.message : undefined;\n return new SendAuthTimeoutError(original);\n }\n\n if (isSendRpcError(err)) {\n const code = err.code;\n const message = err.message;\n\n if (code === SendRpcErrorCode.USER_REJECTED) {\n return new UserRejectedError(context.phase, {\n walletId: context.walletId,\n transport: context.transport,\n rpcCode: code,\n originalMessage: message,\n });\n }\n\n if (\n code === SendRpcErrorCode.UNSUPPORTED_METHOD ||\n code === SendRpcErrorCode.METHOD_NOT_FOUND ||\n code === SendRpcErrorCode.METHOD_NOT_SUPPORTED\n ) {\n return new CapabilityNotSupportedError(WALLET_ID, context.phase);\n }\n\n if (\n code === SendRpcErrorCode.DISCONNECTED ||\n code === SendRpcErrorCode.CHAIN_DISCONNECTED ||\n code === SendRpcErrorCode.UNAUTHORIZED\n ) {\n return new TransportError(message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n rpcCode: code,\n });\n }\n\n return new TransportError(message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n rpcCode: code,\n });\n }\n\n return mapUnknownErrorToPartyLayerError(err, context);\n}\n\n/**\n * Build a hint string when the developer passes a short-form Canton\n * template ID OR the legacy pre-Token-Standard `Amulet_Transfer` choice.\n *\n * Mirrors `loop-adapter.templateIdHint` so Send produces the same\n * actionable error text for the same payload bug class. Returns an empty\n * string when no problem is detected — callers can append this to a base\n * error message unconditionally.\n */\nexport function templateIdHint(payload: unknown): string {\n if (!payload || typeof payload !== 'object') return '';\n const commands = (payload as { commands?: unknown }).commands;\n if (!Array.isArray(commands)) return '';\n\n try {\n for (const cmd of commands as Array<Record<string, unknown>>) {\n const exercise = (cmd?.ExerciseCommand ?? cmd?.exerciseCommand ?? cmd?.exercise) as\n | Record<string, unknown>\n | undefined;\n const create = (cmd?.CreateCommand ?? cmd?.createCommand ?? cmd?.create) as\n | Record<string, unknown>\n | undefined;\n const raw = (exercise?.templateId ?? create?.templateId) as string | undefined;\n const choice = exercise?.choice as string | undefined;\n\n if (\n choice === 'Amulet_Transfer' &&\n typeof raw === 'string' &&\n raw.includes('Splice.Amulet:Amulet')\n ) {\n return (\n \" The command exercises 'Amulet_Transfer' directly on the Amulet template — that's the \" +\n 'legacy (pre-CIP-56) path Canton no longer accepts. Use the Token Standard flow: exercise ' +\n \"'TransferFactory_Transfer' by interface on a TransferFactory contract \" +\n \"(interfaceId '#splice-api-token-transfer-instruction-v1:Splice.Api.Token.TransferInstructionV1:TransferFactory'). \" +\n 'See https://partylayer.xyz/docs/token-transfers for the canonical flow.'\n );\n }\n\n if (typeof raw === 'string' && raw.length > 0 && !raw.startsWith('#')) {\n return (\n ` The command uses templateId=\"${raw}\" which is the short Canton form; Send requires ` +\n \"the fully-qualified Daml form (e.g. '#splice-amulet:Splice.Amulet:Amulet').\"\n );\n }\n }\n } catch {\n // best-effort; never throw from a hint helper\n }\n return '';\n}\n\n/**\n * Bound preview of an arbitrary value for inclusion in error messages.\n * Keeps logs small when a payload is large or contains binary blobs.\n */\nexport function safePreview(value: unknown, maxLen = 200): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n try {\n const s = JSON.stringify(value);\n if (typeof s !== 'string') return String(value);\n return s.length > maxLen ? s.slice(0, maxLen) + '...' : s;\n } catch {\n return String(value);\n }\n}\n","/**\n * Typed wrapper around the `window.canton` provider exposed by Send.\n *\n * Detection is **registry-driven** via `matchesProviderDetection`. The\n * adapter accepts an optional `ProviderDetection` rule set at construction\n * (sourced from the registry's `providerDetection` field for the Send\n * entry); when omitted, it falls back to `SEND_BUILTIN_DETECTION` which\n * mirrors the canonical registry rule. Every public RPC method goes\n * through `guardedRequest`, which checks the live `status` response\n * against those rules before forwarding the call. The result: if a\n * non-Send wallet is sitting at `window.canton`, every Send call resolves\n * to a `SendKernelMismatchError` (treated by the SDK as \"Send is not\n * installed\"), and Send only ever acts on its own provider.\n */\n\nimport { matchesProviderDetection, type ProviderDetection } from '@partylayer/core';\n\nimport { SEND_BUILTIN_DETECTION } from './constants';\nimport { SendKernelMismatchError, SendNotInstalledError } from './errors';\nimport type {\n SendAccount,\n SendCantonProvider,\n SendEventListener,\n SendEventName,\n SendLedgerApiRequest,\n SendLedgerApiResult,\n SendNetwork,\n SendPrepareExecuteAndWaitResult,\n SendPrepareSubmissionRequest,\n SendRpcMethod,\n SendRpcRequest,\n SendRpcResult,\n SendStatusResponse,\n} from './types';\n\nexport class SendProvider {\n private readonly detection: ProviderDetection;\n private cachedStatus: SendStatusResponse | null = null;\n\n /**\n * @param detection Optional. Used to match the running `window.canton`\n * provider against Send's identity. When omitted, falls back to\n * `SEND_BUILTIN_DETECTION` (canonical registry rule mirror).\n */\n constructor(detection?: ProviderDetection) {\n this.detection = detection ?? SEND_BUILTIN_DETECTION;\n }\n\n /**\n * True when `window.canton` is present AND its self-reported status\n * matches Send's detection rules. Performs an actual `status` round-trip\n * on first call and caches the response for subsequent ones.\n */\n async isInstalled(): Promise<boolean> {\n if (typeof window === 'undefined' || !window.canton) return false;\n try {\n const status = await this.fetchStatus();\n return matchesProviderDetection(status, this.detection);\n } catch {\n return false;\n }\n }\n\n /**\n * Synchronous best-effort presence check. Used for fast picker rendering\n * before any async status introspection. May report `true` for a\n * non-Send provider — callers must follow up with `isInstalled()` (or\n * any guarded request) before assuming Send is wired in.\n */\n isPotentiallyAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.canton;\n }\n\n /**\n * Read the cached `kernel.id` from the running provider, fetching status\n * on demand. Diagnostic helper kept public for back-compat — detection\n * itself no longer hinges on this single field.\n */\n async getKernelId(): Promise<string> {\n const status = await this.fetchStatus();\n const id = status?.kernel?.id;\n if (typeof id !== 'string' || id.length === 0) {\n throw new SendNotInstalledError(\n 'window.canton.status() did not return a kernel.id — provider is malformed.',\n );\n }\n return id;\n }\n\n /**\n * Read the latest cached status object. Resolves the underlying RPC on\n * demand if no cached value is present.\n */\n async getStatus(): Promise<SendStatusResponse> {\n return this.fetchStatus();\n }\n\n /**\n * Reset the cached status (e.g. after the user uninstalls and reinstalls\n * the extension, or you suspect kernel identity changed mid-session).\n * Kept under both names to avoid breaking existing test imports.\n */\n resetKernelCache(): void {\n this.cachedStatus = null;\n }\n resetStatusCache(): void {\n this.cachedStatus = null;\n }\n\n private async fetchStatus(): Promise<SendStatusResponse> {\n if (this.cachedStatus) return this.cachedStatus;\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n const provider = window.canton as SendCantonProvider;\n const status = (await provider.request({ method: 'status' })) as SendStatusResponse;\n this.cachedStatus = status;\n return status;\n }\n\n /** Internal — bypasses the detection guard. */\n private async rawRequest(args: { method: SendRpcMethod; params?: unknown }): Promise<unknown> {\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n const provider = window.canton as SendCantonProvider;\n return provider.request(args as SendRpcRequest<SendRpcMethod>);\n }\n\n /** Public dispatch — guards every call with a registry-driven detection check. */\n private async guardedRequest<M extends SendRpcMethod>(\n args: SendRpcRequest<M>,\n ): Promise<SendRpcResult<M>> {\n const status = await this.fetchStatus();\n if (!matchesProviderDetection(status, this.detection)) {\n const observedId = status?.kernel?.id ?? '<unknown>';\n throw new SendKernelMismatchError(observedId);\n }\n return this.rawRequest(args) as Promise<SendRpcResult<M>>;\n }\n\n // ── Sigilry RPC methods (every one is guarded) ─────────────────────────\n\n status(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'status' });\n }\n\n connect(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'connect' });\n }\n\n disconnect(): Promise<null> {\n return this.guardedRequest({ method: 'disconnect' });\n }\n\n isConnected(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'isConnected' });\n }\n\n getActiveNetwork(): Promise<SendNetwork> {\n return this.guardedRequest({ method: 'getActiveNetwork' });\n }\n\n listAccounts(): Promise<SendAccount[]> {\n return this.guardedRequest({ method: 'listAccounts' });\n }\n\n getPrimaryAccount(): Promise<SendAccount> {\n return this.guardedRequest({ method: 'getPrimaryAccount' });\n }\n\n signMessage(message: string): Promise<{ signature: string }> {\n return this.guardedRequest({ method: 'signMessage', params: { message } });\n }\n\n prepareExecute(params: SendPrepareSubmissionRequest): Promise<null> {\n return this.guardedRequest({ method: 'prepareExecute', params });\n }\n\n prepareExecuteAndWait(\n params: SendPrepareSubmissionRequest,\n ): Promise<SendPrepareExecuteAndWaitResult> {\n return this.guardedRequest({ method: 'prepareExecuteAndWait', params });\n }\n\n ledgerApi(req: SendLedgerApiRequest): Promise<SendLedgerApiResult> {\n return this.guardedRequest({ method: 'ledgerApi', params: req });\n }\n\n // ── Events ─────────────────────────────────────────────────────────────\n // No kernel guard here on purpose — by the time the dApp wires up an\n // event listener it has already gone through `connect()` (which IS\n // guarded), so we trust the binding.\n\n on(event: SendEventName, listener: SendEventListener): void {\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n window.canton.on(event, listener);\n }\n\n off(event: SendEventName, listener: SendEventListener): void {\n if (typeof window === 'undefined' || !window.canton) return;\n if (typeof window.canton.off === 'function') {\n window.canton.off(event, listener);\n return;\n }\n if (typeof window.canton.removeListener === 'function') {\n window.canton.removeListener(event, listener);\n }\n }\n}\n","/**\n * Send Canton Wallet adapter.\n *\n * Send is a passkey-based Canton wallet that exposes the splice-wallet-kernel\n * OpenRPC protocol at `window.canton`. Because the bare `window.canton` slot is shared with\n * other splice-spec wallets (e.g. Console-class), the adapter funnels\n * every request through `SendProvider.guardedRequest`, which verifies\n * the running provider's `kernel.id` matches Send's Chrome extension\n * ID before forwarding the call.\n *\n * Capability summary: connect / disconnect / restore / signMessage /\n * submitTransaction / ledgerApi / events / injected. `signTransaction`\n * is intentionally NOT declared — Send (like Loop and Nightly) fuses\n * sign-and-submit through `prepareExecute*`, so a standalone sign step\n * would only mislead callers.\n */\n\nimport {\n CapabilityNotSupportedError,\n TransportError,\n toPartyId,\n toSignature,\n toTransactionHash,\n toWalletId,\n type ProviderDetection,\n type AdapterConnectResult,\n type AdapterContext,\n type AdapterDetectResult,\n type AdapterEventName,\n type CapabilityKey,\n type LedgerApiParams,\n type LedgerApiResult,\n type PartyId,\n type PersistedSession,\n type Session,\n type SignMessageParams,\n type SignTransactionParams,\n type SignedMessage,\n type SignedTransaction,\n type SubmitTransactionParams,\n type TxReceipt,\n type WalletAdapter,\n} from '@partylayer/core';\n\nimport {\n SEND_INSTALL_URL,\n SEND_SIGNING_METHOD,\n} from './constants';\nimport {\n SendNotInstalledError,\n isSendRpcError,\n mapSigilryError,\n safePreview,\n templateIdHint,\n} from './errors';\nimport { SendProvider } from './send-provider';\nimport type {\n SendAccount,\n SendEventListener,\n SendPrepareSubmissionRequest,\n SendStatusResponse,\n SendTxChangedEvent,\n} from './types';\n\nconst WALLET_ID = 'send';\n\nconst SEND_CAPABILITIES: CapabilityKey[] = [\n 'connect',\n 'disconnect',\n 'restore',\n 'signMessage',\n 'submitTransaction',\n 'ledgerApi',\n 'events',\n 'injected',\n];\n\nexport class SendAdapter implements WalletAdapter {\n readonly walletId = toWalletId(WALLET_ID);\n readonly name = 'Send';\n\n private readonly provider: SendProvider;\n\n /**\n * @param options.detection Optional. When supplied, the adapter uses\n * these matcher rules to decide whether the running `window.canton`\n * belongs to Send. Inject this from the registry entry's\n * `providerDetection` field for canonical behaviour. Omitting it\n * falls back to the built-in pattern that mirrors the canonical\n * registry rule (parity is verified by tests).\n * @param options.provider Optional. Pre-built provider instance, used\n * primarily by tests; takes precedence over `options.detection`.\n */\n constructor(options?: { detection?: ProviderDetection; provider?: SendProvider }) {\n this.provider = options?.provider ?? new SendProvider(options?.detection);\n }\n\n getCapabilities(): CapabilityKey[] {\n return SEND_CAPABILITIES;\n }\n\n async detectInstalled(): Promise<AdapterDetectResult> {\n if (typeof window === 'undefined') {\n return { installed: false, reason: 'Browser environment required' };\n }\n if (!this.provider.isPotentiallyAvailable()) {\n return {\n installed: false,\n reason: `Send Canton Wallet not detected. Visit ${SEND_INSTALL_URL} for installation instructions`,\n };\n }\n const installed = await this.provider.isInstalled();\n if (installed) {\n return { installed: true, reason: 'Send Canton Wallet detected' };\n }\n return {\n installed: false,\n reason:\n 'window.canton is present but its kernel.id does not match Send. Another Canton wallet is active.',\n };\n }\n\n async connect(\n ctx: AdapterContext,\n _opts?: { timeoutMs?: number; partyId?: PartyId; preferInstalled?: boolean },\n ): Promise<AdapterConnectResult> {\n try {\n if (!this.provider.isPotentiallyAvailable()) {\n throw new SendNotInstalledError();\n }\n\n ctx.logger.debug('Connecting to Send Canton Wallet', {\n appName: ctx.appName,\n network: ctx.network,\n });\n\n const status = await this.provider.connect();\n const account = await this.provider.getPrimaryAccount();\n const partyId = toPartyId(account.partyId);\n\n ctx.logger.info('Connected to Send Canton Wallet', {\n partyId: account.partyId,\n signingProviderId: account.signingProviderId,\n kernelId: status.kernel?.id,\n });\n\n return {\n partyId,\n session: {\n walletId: this.walletId,\n network: ctx.network,\n createdAt: Date.now(),\n metadata: buildSessionMetadata(status, account),\n },\n capabilities: this.getCapabilities(),\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'connect',\n transport: 'injected',\n details: { origin: ctx.origin, network: ctx.network },\n });\n }\n }\n\n async disconnect(ctx: AdapterContext, _session: Session): Promise<void> {\n try {\n await this.provider.disconnect();\n } catch (err) {\n ctx.logger.warn('Error during Send wallet disconnect', err);\n }\n }\n\n async restore(ctx: AdapterContext, persisted: PersistedSession): Promise<Session | null> {\n try {\n if (typeof window === 'undefined') return null;\n if (!this.provider.isPotentiallyAvailable()) return null;\n if (persisted.expiresAt && Date.now() >= persisted.expiresAt) return null;\n\n // status() is a silent introspection call — no popup, no passkey\n // prompt — so we can use it as a \"still authorised?\" probe on page\n // reload. If the kernel.id has shifted (user installed another\n // wallet) the guarded request will throw `SendKernelMismatchError`\n // and we'll return null below.\n const status = await this.provider.status();\n if (!status.isConnected) return null;\n\n const account = await this.provider.getPrimaryAccount();\n if (account.partyId !== persisted.partyId) {\n ctx.logger.debug(\n 'Send primary account changed since session was persisted; treating as expired',\n {\n persistedPartyId: persisted.partyId,\n currentPartyId: account.partyId,\n },\n );\n return null;\n }\n\n ctx.logger.debug('Restored Send Canton Wallet session', {\n partyId: account.partyId,\n kernelId: status.kernel?.id,\n });\n\n return {\n ...persisted,\n walletId: this.walletId,\n metadata: {\n ...(persisted.metadata ?? {}),\n ...buildSessionMetadata(status, account),\n },\n };\n } catch (err) {\n ctx.logger.warn('Failed to restore Send wallet session', err);\n return null;\n }\n }\n\n async signMessage(\n ctx: AdapterContext,\n session: Session,\n params: SignMessageParams,\n ): Promise<SignedMessage> {\n try {\n if (typeof params.message !== 'string' || params.message.length === 0) {\n throw new Error('signMessage requires a non-empty string `message`');\n }\n\n ctx.logger.debug('Signing message with Send Canton Wallet', {\n sessionId: session.sessionId,\n messageLength: params.message.length,\n });\n\n const { signature } = await this.provider.signMessage(params.message);\n return {\n signature: toSignature(signature),\n partyId: session.partyId,\n message: params.message,\n nonce: params.nonce,\n domain: params.domain,\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'signMessage',\n transport: 'injected',\n details: { sessionId: session.sessionId },\n });\n }\n }\n\n async signTransaction(\n _ctx: AdapterContext,\n _session: Session,\n _params: SignTransactionParams,\n ): Promise<SignedTransaction> {\n throw new CapabilityNotSupportedError(\n this.walletId,\n 'signTransaction — Send fuses sign-and-submit through prepareExecuteAndWait. Use submitTransaction instead.',\n );\n }\n\n async submitTransaction(\n ctx: AdapterContext,\n session: Session,\n params: SubmitTransactionParams,\n ): Promise<TxReceipt> {\n const payload = params.signedTx as SendPrepareSubmissionRequest;\n try {\n if (!payload || typeof payload !== 'object') {\n throw new Error(\n 'submitTransaction requires a SendPrepareSubmissionRequest as `signedTx` ' +\n `(received ${safePreview(payload)})`,\n );\n }\n if (!payload.commands || typeof payload.commands !== 'object') {\n throw new Error(\n \"submitTransaction signedTx is missing the required 'commands' field \" +\n `(received ${safePreview(payload)})`,\n );\n }\n\n ctx.logger.debug('Submitting transaction via Send Canton Wallet', {\n sessionId: session.sessionId,\n commandId: payload.commandId,\n });\n\n const { tx } = await this.provider.prepareExecuteAndWait(payload);\n\n if (!tx || typeof tx !== 'object' || !tx.payload?.updateId) {\n throw new Error(\n 'Send returned an unexpected shape from prepareExecuteAndWait. ' +\n `Expected { tx: { commandId, status:'executed', payload: { updateId, completionOffset } } } ` +\n `but received ${safePreview(tx)}.`,\n );\n }\n\n return {\n transactionHash: toTransactionHash(tx.payload.updateId),\n submittedAt: Date.now(),\n commandId: tx.commandId,\n updateId: tx.payload.updateId,\n };\n } catch (err) {\n const baseHint = templateIdHint(payload);\n // For structured Sigilry RPC errors (e.g. user pressed cancel in\n // the passkey popup → code 4001) we want the canonical mapping\n // (`UserRejectedError`). For everything else, if we have a payload\n // hint, attach it directly via TransportError so the keyword-based\n // fallback in `mapUnknownErrorToPartyLayerError` doesn't replace\n // the message with a generic `User rejected …` string and lose\n // the actionable text.\n if (baseHint && !isSendRpcError(err)) {\n const baseMessage = err instanceof Error ? err.message : String(err);\n throw new TransportError(\n baseMessage + baseHint,\n err instanceof Error ? err : undefined,\n {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n sessionId: session.sessionId,\n commandId: payload?.commandId,\n },\n );\n }\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n details: { sessionId: session.sessionId, commandId: payload?.commandId },\n });\n }\n }\n\n async ledgerApi(\n ctx: AdapterContext,\n session: Session,\n params: LedgerApiParams,\n ): Promise<LedgerApiResult> {\n try {\n ctx.logger.debug('Proxying ledger API request via Send Canton Wallet', {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n });\n\n const result = await this.provider.ledgerApi({\n requestMethod: params.requestMethod,\n resource: params.resource,\n body: params.body,\n });\n\n // Send's contract is `{ response: string }` — preserve raw to match\n // PartyLayer's `LedgerApiResult` exactly. Defensive fallback if a\n // future wallet build returns a parsed object.\n if (result && typeof result.response === 'string') {\n return { response: result.response };\n }\n return { response: JSON.stringify(result ?? null) };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'ledgerApi',\n transport: 'injected',\n details: {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n },\n });\n }\n }\n\n /**\n * Subscribe to PartyLayer adapter events. Currently bridges only\n * `txStatus` from Send's native `txChanged` event. Other PartyLayer\n * adapter events (`connect` / `disconnect` / `sessionExpired` / `error`)\n * are emitted by the SDK itself, not the wallet, so we no-op them.\n */\n on(event: AdapterEventName, handler: (payload: unknown) => void): () => void {\n if (event !== 'txStatus') {\n return () => {\n /* nothing to unsubscribe */\n };\n }\n const listener: SendEventListener = (...args) => {\n const tx = args[0] as SendTxChangedEvent | undefined;\n if (!tx) return;\n handler({\n status: mapTxStatus(tx.status),\n commandId: tx.commandId,\n raw: tx,\n });\n };\n try {\n this.provider.on('txChanged', listener);\n } catch {\n return () => {\n /* provider unavailable — nothing to unsubscribe */\n };\n }\n return () => this.provider.off('txChanged', listener);\n }\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Translate Sigilry `txChanged` statuses into PartyLayer's\n * `TransactionStatus` taxonomy. Kept separate so tests can pin the mapping.\n */\nfunction mapTxStatus(\n status: SendTxChangedEvent['status'],\n): 'pending' | 'submitted' | 'committed' | 'failed' {\n switch (status) {\n case 'pending':\n return 'pending';\n case 'signed':\n return 'submitted';\n case 'executed':\n return 'committed';\n case 'failed':\n default:\n return 'failed';\n }\n}\n\n/**\n * Pack diagnostic + restore-relevant fields into the Session metadata\n * record. PartyLayer types `Session.metadata` as `Record<string, string>`,\n * so every value must be a string — we omit anything that's missing\n * rather than writing the literal string `\"undefined\"`.\n */\nfunction buildSessionMetadata(\n status: SendStatusResponse,\n account: SendAccount,\n): Record<string, string> {\n const meta: Record<string, string> = {\n kernelId: status.kernel?.id ?? '',\n signingProviderId: account.signingProviderId,\n signingMethod: SEND_SIGNING_METHOD,\n publicKey: account.publicKey,\n namespace: account.namespace,\n networkId: account.networkId,\n hint: account.hint,\n };\n if (status.network?.ledgerApi?.baseUrl) {\n meta.ledgerApiBaseUrl = status.network.ledgerApi.baseUrl;\n }\n if (status.session?.userId) {\n meta.userId = status.session.userId;\n }\n // accessToken is intentionally omitted — the SDK's encrypted-storage\n // layer is for it; adapter-level metadata is plain Record<string,string>.\n return meta;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/send-provider.ts","../src/send-adapter.ts"],"names":["WalletNotInstalledError","PartyLayerError","UserRejectedError","CapabilityNotSupportedError","TransportError","mapUnknownErrorToPartyLayerError","discoverAnnouncedProviders","WALLET_ID","toWalletId","toPartyId","toSignature","toTransactionHash"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProviderDetection } from '@partylayer/core';\n\n/**\n * Send Canton Wallet extension IDs.\n *\n * Send's runtime-injected CIP-103 provider reports its identity at\n * `window.canton.request({ method: 'status' }).provider.id`. The value\n * observed in production differs from the public Chrome Web Store\n * listing ID, so both are listed here. New IDs (e.g., from rebrands or\n * separate distribution channels) can be appended to this list without\n * code changes elsewhere.\n */\nexport const SEND_PRODUCTION_EXTENSION_ID = 'lpnfhpbpmlobjlgkdmnjieeihjmihhjd';\nexport const SEND_LEGACY_EXTENSION_ID = 'ldmohiccoioolenadmogclhoklmanpgi';\n\nexport const SEND_KNOWN_EXTENSION_IDS = [\n SEND_PRODUCTION_EXTENSION_ID,\n SEND_LEGACY_EXTENSION_ID,\n] as const;\n\n/**\n * @deprecated Use SEND_PRODUCTION_EXTENSION_ID or SEND_KNOWN_EXTENSION_IDS.\n * Retained for backward source-compatibility with consumers that import\n * the old name. Will be removed in a future major.\n */\nexport const SEND_KERNEL_ID = SEND_LEGACY_EXTENSION_ID;\n\n/**\n * Built-in fallback detection patterns, mirroring the canonical Send\n * registry entry's `providerDetection`. Used when no registry entry is\n * injected at adapter construction time so adapter-only installs (no\n * registry fetch yet, or registry fetch failed) still recognise Send.\n *\n * Matchers are ordered: `provider.id` first (current production injection\n * shape — Send's status response has `{ connection, provider }`, not a\n * `kernel` field), then `kernel.*` fields (defensive — supports future\n * Send releases that may add a kernel field, and any non-Send wallet\n * that exposes kernel-shaped provider metadata at cantonwallet.com).\n *\n * If Send's identity signals change in the future, update both this\n * constant AND the registry entry — the registry is canonical, this is\n * the defensive mirror. The parity is verified by a test in\n * `send-adapter.test.ts`.\n */\nexport const SEND_BUILTIN_DETECTION: ProviderDetection = {\n transport: 'window.canton',\n matchers: [\n { field: 'provider.id', match: 'exact', values: [...SEND_KNOWN_EXTENSION_IDS] },\n { field: 'kernel.url', match: 'domain', value: 'cantonwallet.com' },\n { field: 'kernel.userUrl', match: 'domain', value: 'cantonwallet.com' },\n { field: 'kernel.id', match: 'exact', values: [...SEND_KNOWN_EXTENSION_IDS] },\n ],\n};\n\n/**\n * Network IDs Send currently supports. Send is mainnet-only as of v0.2.0.\n * Listed in Canton long-form so it stays distinguishable from PartyLayer's\n * generic 'mainnet' alias.\n */\nexport const SEND_SUPPORTED_NETWORKS = ['canton:mainnet'] as const;\n\nexport const SEND_INSTALL_URL = 'https://sigilry.org';\n\nexport const SEND_HOMEPAGE = 'https://cantonwallet.com';\n\nexport const SEND_DOCS_URL = 'https://sigilry.org';\n\n/**\n * Send signs every transaction via the WebAuthn PRF extension (passkey).\n * Surfaced through session metadata so dApps can adapt copy (\"approve in\n * Touch ID / Face ID prompt\") rather than show a generic \"open extension\"\n * hint.\n */\nexport const SEND_SIGNING_METHOD = 'webauthn-prf' as const;\n","/**\n * Send-specific error helpers.\n *\n * PartyLayer's `ErrorCode` union (in `@partylayer/core/errors.ts`) is the\n * canonical taxonomy. We do NOT introduce new codes here — instead, the\n * Send-specific error classes subclass the closest existing PartyLayer\n * error and carry the diagnostic detail (kernel id, RPC code) in\n * `details`. That way existing telemetry pipelines and `code`-based\n * branches in dApp code continue to work without modification.\n */\n\nimport {\n CapabilityNotSupportedError,\n PartyLayerError,\n TransportError,\n UserRejectedError,\n WalletNotInstalledError,\n mapUnknownErrorToPartyLayerError,\n type ErrorMappingContext,\n} from '@partylayer/core';\n\nimport { SEND_INSTALL_URL, SEND_KERNEL_ID } from './constants';\n\n/** JSON-RPC 2.0 + EIP-1193 error codes Sigilry surfaces. */\nexport const SendRpcErrorCode = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n USER_REJECTED: 4001,\n UNAUTHORIZED: 4100,\n UNSUPPORTED_METHOD: 4200,\n DISCONNECTED: 4900,\n CHAIN_DISCONNECTED: 4901,\n INVALID_INPUT: -32000,\n RESOURCE_NOT_FOUND: -32001,\n RESOURCE_UNAVAILABLE: -32002,\n TRANSACTION_REJECTED: -32003,\n METHOD_NOT_SUPPORTED: -32004,\n LIMIT_EXCEEDED: -32005,\n} as const;\n\nconst WALLET_ID = 'send';\n\n/**\n * Send isn't installed — `window.canton` is unavailable entirely.\n *\n * Subclasses `WalletNotInstalledError` so existing capability gates and\n * UI (\"install Send\") light up automatically. Carries the install URL in\n * `details` for one-click prompts.\n */\nexport class SendNotInstalledError extends WalletNotInstalledError {\n constructor(reason?: string) {\n super(\n WALLET_ID,\n reason ?? `Send Canton Wallet is not detected. Visit ${SEND_INSTALL_URL} for installation instructions`,\n );\n this.name = 'SendNotInstalledError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n installUrl: SEND_INSTALL_URL,\n };\n }\n}\n\n/**\n * `window.canton` is present but `kernel.id` does not match Send.\n *\n * Treated as \"Send not installed\" from the SDK's perspective so that\n * other adapters get a chance to claim the active provider — but the\n * runtime kernel id is preserved in `details` for diagnostics.\n *\n * The wording avoids the keywords \"rejected\"/\"denied\"/\"cancelled\" so\n * `mapUnknownErrorToPartyLayerError` won't silently rewrite this as a\n * `UserRejectedError` when re-thrown through error mapping.\n */\nexport class SendKernelMismatchError extends WalletNotInstalledError {\n constructor(actualKernelId: string) {\n super(\n WALLET_ID,\n `Another Canton wallet is active at window.canton (kernel.id=\"${actualKernelId}\", expected \"${SEND_KERNEL_ID}\"). The Send adapter will yield to the matching adapter.`,\n );\n this.name = 'SendKernelMismatchError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n actualKernelId,\n expectedKernelId: SEND_KERNEL_ID,\n };\n }\n}\n\n/**\n * Send's authentication backend (auth.cantonwallet.com) timed out or was\n * otherwise unreachable. This is an external, intermittent issue on\n * Send's side — not a PartyLayer issue, not a wallet-not-installed\n * issue, and not a user rejection. Surfaced as a typed error so the UI\n * can offer a \"Try again\" affordance + link to Send's status page.\n *\n * Subclasses `WalletNotInstalledError` to reuse the existing core error\n * code (`'WALLET_NOT_INSTALLED'`) without expanding the canonical\n * `ErrorCode` union — but the class identity (`name`) plus\n * `details.cause = 'send-auth-timeout'` give consumers enough signal to\n * route the retry UX without a code-level change.\n */\nexport class SendAuthTimeoutError extends WalletNotInstalledError {\n constructor(originalMessage?: string) {\n super(\n WALLET_ID,\n originalMessage ??\n 'Send authentication timed out. Please try again. ' +\n 'If the problem persists, see https://cantonwallet.com',\n );\n this.name = 'SendAuthTimeoutError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n cause: 'send-auth-timeout',\n retry: true,\n helpUrl: 'https://cantonwallet.com',\n ...(originalMessage ? { originalMessage } : {}),\n };\n }\n}\n\n/**\n * Recognise Send-side authentication-timeout signatures in arbitrary\n * error payloads. Covers the wording variants the Send wallet surfaces\n * today (the wallet UI itself uses both \"Authentication timed out\" and\n * \"Cannot reach authentication server\"; the underlying domain\n * `auth.cantonwallet.com` shows up in stack traces / fetch errors when\n * the network is at fault).\n */\nexport function detectSendAuthTimeout(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const raw = (err as { message?: unknown }).message;\n if (typeof raw !== 'string' || raw.length === 0) return false;\n const msg = raw.toLowerCase();\n return (\n msg.includes('authentication timed out') ||\n msg.includes('cannot reach authentication server') ||\n msg.includes('auth.cantonwallet.com')\n );\n}\n\ninterface SendRpcErrorLike {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport function isSendRpcError(err: unknown): err is SendRpcErrorLike {\n if (!err || typeof err !== 'object') return false;\n const candidate = err as { code?: unknown; message?: unknown };\n return typeof candidate.code === 'number' && typeof candidate.message === 'string';\n}\n\n/**\n * Translate a Sigilry RPC error to the closest PartyLayer error class.\n *\n * Falls back to `mapUnknownErrorToPartyLayerError` when the error doesn't\n * carry a recognisable JSON-RPC `code`. Note that `mapUnknownErrorToPartyLayerError`\n * itself rewrites messages containing \"rejected\"/\"denied\"/\"cancelled\" into\n * `UserRejectedError`, so we explicitly route the 4001 code first to make\n * the user-rejection path stable across wording changes in the wallet.\n */\nexport function mapSigilryError(\n err: unknown,\n context: ErrorMappingContext,\n): PartyLayerError {\n if (err instanceof PartyLayerError) return err;\n\n // Send-side auth-timeout takes priority over the generic RPC-code path\n // because the wallet sometimes wraps the timeout into a generic message\n // without a structured error code. Surfacing it as a typed error lets\n // the modal render a retry affordance.\n if (detectSendAuthTimeout(err)) {\n const original = err instanceof Error ? err.message : undefined;\n return new SendAuthTimeoutError(original);\n }\n\n if (isSendRpcError(err)) {\n const code = err.code;\n const message = err.message;\n\n if (code === SendRpcErrorCode.USER_REJECTED) {\n return new UserRejectedError(context.phase, {\n walletId: context.walletId,\n transport: context.transport,\n rpcCode: code,\n originalMessage: message,\n });\n }\n\n if (\n code === SendRpcErrorCode.UNSUPPORTED_METHOD ||\n code === SendRpcErrorCode.METHOD_NOT_FOUND ||\n code === SendRpcErrorCode.METHOD_NOT_SUPPORTED\n ) {\n return new CapabilityNotSupportedError(WALLET_ID, context.phase);\n }\n\n if (\n code === SendRpcErrorCode.DISCONNECTED ||\n code === SendRpcErrorCode.CHAIN_DISCONNECTED ||\n code === SendRpcErrorCode.UNAUTHORIZED\n ) {\n return new TransportError(message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n rpcCode: code,\n });\n }\n\n return new TransportError(message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n rpcCode: code,\n });\n }\n\n return mapUnknownErrorToPartyLayerError(err, context);\n}\n\n/**\n * Build a hint string when the developer passes a short-form Canton\n * template ID OR the legacy pre-Token-Standard `Amulet_Transfer` choice.\n *\n * Mirrors `loop-adapter.templateIdHint` so Send produces the same\n * actionable error text for the same payload bug class. Returns an empty\n * string when no problem is detected — callers can append this to a base\n * error message unconditionally.\n */\nexport function templateIdHint(payload: unknown): string {\n if (!payload || typeof payload !== 'object') return '';\n const commands = (payload as { commands?: unknown }).commands;\n if (!Array.isArray(commands)) return '';\n\n try {\n for (const cmd of commands as Array<Record<string, unknown>>) {\n const exercise = (cmd?.ExerciseCommand ?? cmd?.exerciseCommand ?? cmd?.exercise) as\n | Record<string, unknown>\n | undefined;\n const create = (cmd?.CreateCommand ?? cmd?.createCommand ?? cmd?.create) as\n | Record<string, unknown>\n | undefined;\n const raw = (exercise?.templateId ?? create?.templateId) as string | undefined;\n const choice = exercise?.choice as string | undefined;\n\n if (\n choice === 'Amulet_Transfer' &&\n typeof raw === 'string' &&\n raw.includes('Splice.Amulet:Amulet')\n ) {\n return (\n \" The command exercises 'Amulet_Transfer' directly on the Amulet template — that's the \" +\n 'legacy (pre-CIP-56) path Canton no longer accepts. Use the Token Standard flow: exercise ' +\n \"'TransferFactory_Transfer' by interface on a TransferFactory contract \" +\n \"(interfaceId '#splice-api-token-transfer-instruction-v1:Splice.Api.Token.TransferInstructionV1:TransferFactory'). \" +\n 'See https://partylayer.xyz/docs/token-transfers for the canonical flow.'\n );\n }\n\n if (typeof raw === 'string' && raw.length > 0 && !raw.startsWith('#')) {\n return (\n ` The command uses templateId=\"${raw}\" which is the short Canton form; Send requires ` +\n \"the fully-qualified Daml form (e.g. '#splice-amulet:Splice.Amulet:Amulet').\"\n );\n }\n }\n } catch {\n // best-effort; never throw from a hint helper\n }\n return '';\n}\n\n/**\n * Bound preview of an arbitrary value for inclusion in error messages.\n * Keeps logs small when a payload is large or contains binary blobs.\n */\nexport function safePreview(value: unknown, maxLen = 200): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n try {\n const s = JSON.stringify(value);\n if (typeof s !== 'string') return String(value);\n return s.length > maxLen ? s.slice(0, maxLen) + '...' : s;\n } catch {\n return String(value);\n }\n}\n","/**\n * Typed wrapper around the Send Canton wallet, reached via the\n * `canton:announceProvider` + extension postMessage `target` channel.\n *\n * WHY NOT `window.canton`: Send is announce-only. When another wallet (e.g.\n * Console) owns the single shared `window.canton` slot, the old transport\n * (bind `window.canton`, guard by `kernel.id`) returned a kernel mismatch and\n * Send was unconnectable. Send instead fires `canton:announceProvider` with\n * `{ id, name, icon, target }` (id == target == its extension id) and does NOT\n * inject `window.canton`. So detection + every RPC now go through the announce\n * handshake and the splice postMessage `target` channel, regardless of who\n * owns `window.canton`.\n *\n * Transport is reused from `@partylayer/provider`: `discoverAnnouncedProviders`\n * finds Send's announce entry (a ready `createExtensionChannelProvider` over\n * its `target`), and every call is forwarded through that channel provider's\n * request/response. Detection is registry-driven: the announce `id` is matched\n * against Send's accepted extension ids (the `provider.id` matchers of the\n * supplied `ProviderDetection`, plus `SEND_KNOWN_EXTENSION_IDS`).\n *\n * INBOUND EVENTS: the official splice extension (sync) provider does not push\n * events over `postMessage` — the wire protocol has no inbound-event message\n * type, and event push exists only on the remote/SSE path. Send's tx result\n * comes from `prepareExecuteAndWait`'s response, not from `txChanged`. So\n * `on`/`off` simply delegate to the channel provider's local event bus (kept so\n * the `events` capability and API are preserved); they never throw.\n */\n\nimport type {\n CIP0103EventListener,\n CIP0103Provider,\n CIP0103RequestPayload,\n ProviderDetection,\n} from '@partylayer/core';\nimport {\n discoverAnnouncedProviders,\n type AnnounceDiscoveryOptions,\n type DiscoveredProvider,\n} from '@partylayer/provider';\n\nimport { SEND_BUILTIN_DETECTION, SEND_KNOWN_EXTENSION_IDS } from './constants';\nimport { SendNotInstalledError } from './errors';\nimport type {\n SendAccount,\n SendEventListener,\n SendEventName,\n SendLedgerApiRequest,\n SendLedgerApiResult,\n SendNetwork,\n SendPrepareExecuteAndWaitResult,\n SendPrepareSubmissionRequest,\n SendRpcMethod,\n SendStatusResponse,\n} from './types';\n\n/** How long to wait for the `canton:announceProvider` reply. */\nconst DEFAULT_ANNOUNCE_TIMEOUT_MS = 500;\n\nexport interface SendProviderOptions {\n /**\n * Pre-resolved channel provider (used by tests). When set, the announce\n * handshake is skipped and every call routes through this provider.\n */\n provider?: CIP0103Provider;\n /** Override the announce-collection window (ms). Default 500. */\n announceTimeoutMs?: number;\n /** Override announce discovery (used by tests). Defaults to the real handshake. */\n discover?: (options?: AnnounceDiscoveryOptions) => Promise<DiscoveredProvider[]>;\n}\n\nexport class SendProvider {\n private readonly detection: ProviderDetection;\n private readonly announceTimeoutMs: number;\n private readonly discover: (\n options?: AnnounceDiscoveryOptions,\n ) => Promise<DiscoveredProvider[]>;\n private readonly injectedProvider?: CIP0103Provider;\n\n private cachedChannel: { target: string; provider: CIP0103Provider } | null = null;\n private channelPromise: Promise<{ target: string; provider: CIP0103Provider } | null> | null =\n null;\n private cachedStatus: SendStatusResponse | null = null;\n\n /**\n * @param detection Optional registry `ProviderDetection`. Its `provider.id`\n * exact-match values define which announced extension ids are treated as\n * Send. Defaults to `SEND_BUILTIN_DETECTION`.\n * @param options Optional test/advanced hooks (see {@link SendProviderOptions}).\n */\n constructor(detection?: ProviderDetection, options?: SendProviderOptions) {\n this.detection = detection ?? SEND_BUILTIN_DETECTION;\n this.announceTimeoutMs = options?.announceTimeoutMs ?? DEFAULT_ANNOUNCE_TIMEOUT_MS;\n this.discover = options?.discover ?? ((o) => discoverAnnouncedProviders(o));\n this.injectedProvider = options?.provider;\n }\n\n /** Extension ids accepted as Send: registry `provider.id` matchers ∪ known ids. */\n private acceptedIds(): string[] {\n const fromDetection = this.detection.matchers\n .filter((m) => m.field === 'provider.id' && m.match === 'exact')\n .flatMap((m) => (m as { values: string[] }).values);\n return Array.from(new Set([...fromDetection, ...SEND_KNOWN_EXTENSION_IDS]));\n }\n\n /**\n * Resolve (and cache) Send's announce channel. Returns null if Send did not\n * announce. Concurrent callers share a single in-flight announce (dedup), so\n * a burst of requests triggers exactly one handshake.\n */\n private resolveChannel(): Promise<{\n target: string;\n provider: CIP0103Provider;\n } | null> {\n if (this.cachedChannel) return Promise.resolve(this.cachedChannel);\n if (this.channelPromise) return this.channelPromise;\n\n this.channelPromise = this.doResolveChannel()\n .then((channel) => {\n if (channel) this.cachedChannel = channel;\n return channel;\n })\n .finally(() => {\n this.channelPromise = null;\n });\n return this.channelPromise;\n }\n\n private async doResolveChannel(): Promise<{\n target: string;\n provider: CIP0103Provider;\n } | null> {\n if (this.injectedProvider) {\n return { target: 'injected', provider: this.injectedProvider };\n }\n if (typeof window === 'undefined') return null;\n\n const accepted = this.acceptedIds();\n const entries = await this.discover({ timeoutMs: this.announceTimeoutMs });\n const match = entries.find((e) => accepted.includes(e.id));\n if (!match) return null;\n return { target: match.id, provider: match.provider };\n }\n\n private async channelRequest<T>(\n method: SendRpcMethod,\n params?: unknown,\n ): Promise<T> {\n const channel = await this.resolveChannel();\n if (!channel) throw new SendNotInstalledError();\n const payload = (\n params === undefined ? { method } : { method, params }\n ) as CIP0103RequestPayload;\n return channel.provider.request<T>(payload);\n }\n\n // ── Detection ────────────────────────────────────────────────────────────\n\n /**\n * True iff Send announces via `canton:announceProvider` — independent of who\n * owns `window.canton`. Caches the resolved channel.\n */\n async isInstalled(): Promise<boolean> {\n try {\n return (await this.resolveChannel()) !== null;\n } catch {\n return false;\n }\n }\n\n /**\n * Synchronous best-effort presence check: only that we are in a browser where\n * announce discovery can run. The authoritative check is `isInstalled()` /\n * any request (which performs the announce handshake). No longer depends on\n * the shared `window.canton` slot.\n */\n isPotentiallyAvailable(): boolean {\n return typeof window !== 'undefined';\n }\n\n /**\n * Read `status().kernel.id`. Diagnostic helper kept for back-compat. Live\n * Send no longer reports a kernel; this throws `SendNotInstalledError` when\n * absent (callers that need the stable id should use the announce target).\n */\n async getKernelId(): Promise<string> {\n const status = await this.fetchStatus();\n const id = status?.kernel?.id;\n if (typeof id !== 'string' || id.length === 0) {\n throw new SendNotInstalledError(\n 'Send status() did not return a kernel.id.',\n );\n }\n return id;\n }\n\n /** Latest status (cached after first fetch). */\n async getStatus(): Promise<SendStatusResponse> {\n return this.fetchStatus();\n }\n\n /** Reset cached status AND the resolved announce channel (forces re-announce). */\n resetKernelCache(): void {\n this.cachedStatus = null;\n this.cachedChannel = null;\n this.channelPromise = null;\n }\n resetStatusCache(): void {\n this.cachedStatus = null;\n this.cachedChannel = null;\n this.channelPromise = null;\n }\n\n private async fetchStatus(): Promise<SendStatusResponse> {\n if (this.cachedStatus) return this.cachedStatus;\n const status = await this.channelRequest<SendStatusResponse>('status');\n this.cachedStatus = status;\n return status;\n }\n\n // ── Sigilry RPC methods (all over the announce target channel) ────────────\n\n status(): Promise<SendStatusResponse> {\n return this.channelRequest('status');\n }\n\n connect(): Promise<SendStatusResponse> {\n return this.channelRequest('connect');\n }\n\n disconnect(): Promise<null> {\n return this.channelRequest('disconnect');\n }\n\n isConnected(): Promise<SendStatusResponse> {\n return this.channelRequest('isConnected');\n }\n\n getActiveNetwork(): Promise<SendNetwork> {\n return this.channelRequest('getActiveNetwork');\n }\n\n listAccounts(): Promise<SendAccount[]> {\n return this.channelRequest('listAccounts');\n }\n\n getPrimaryAccount(): Promise<SendAccount> {\n return this.channelRequest('getPrimaryAccount');\n }\n\n signMessage(message: string): Promise<{ signature: string }> {\n return this.channelRequest('signMessage', { message });\n }\n\n prepareExecute(params: SendPrepareSubmissionRequest): Promise<null> {\n return this.channelRequest('prepareExecute', params);\n }\n\n prepareExecuteAndWait(\n params: SendPrepareSubmissionRequest,\n ): Promise<SendPrepareExecuteAndWaitResult> {\n return this.channelRequest('prepareExecuteAndWait', params);\n }\n\n ledgerApi(req: SendLedgerApiRequest): Promise<SendLedgerApiResult> {\n return this.channelRequest('ledgerApi', req);\n }\n\n // ── Events ─────────────────────────────────────────────────────────────\n // Delegated to the channel provider's local event bus. By the time a dApp\n // wires up a listener it has already gone through connect(), so the channel\n // is cached. The official extension (sync) provider has no postMessage event\n // push either, so this preserves the API/`events` capability without\n // inventing a non-existent wire shape; it never throws.\n\n on(event: SendEventName, listener: SendEventListener): void {\n const channel = this.cachedChannel;\n if (!channel) return;\n channel.provider.on(event, listener as CIP0103EventListener);\n }\n\n off(event: SendEventName, listener: SendEventListener): void {\n const channel = this.cachedChannel;\n if (!channel) return;\n channel.provider.removeListener(event, listener as CIP0103EventListener);\n }\n}\n","/**\n * Send Canton Wallet adapter.\n *\n * Send is a passkey-based Canton wallet that exposes the splice-wallet-kernel\n * OpenRPC protocol at `window.canton`. Because the bare `window.canton` slot is shared with\n * other splice-spec wallets (e.g. Console-class), the adapter funnels\n * every request through `SendProvider.guardedRequest`, which verifies\n * the running provider's `kernel.id` matches Send's Chrome extension\n * ID before forwarding the call.\n *\n * Capability summary: connect / disconnect / restore / signMessage /\n * submitTransaction / ledgerApi / events / injected. `signTransaction`\n * is intentionally NOT declared — Send (like Loop and Nightly) fuses\n * sign-and-submit through `prepareExecute*`, so a standalone sign step\n * would only mislead callers.\n */\n\nimport {\n CapabilityNotSupportedError,\n TransportError,\n toPartyId,\n toSignature,\n toTransactionHash,\n toWalletId,\n type ProviderDetection,\n type AdapterConnectResult,\n type AdapterContext,\n type AdapterDetectResult,\n type AdapterEventName,\n type CapabilityKey,\n type LedgerApiParams,\n type LedgerApiResult,\n type PartyId,\n type PersistedSession,\n type Session,\n type SignMessageParams,\n type SignTransactionParams,\n type SignedMessage,\n type SignedTransaction,\n type SubmitTransactionParams,\n type TxReceipt,\n type WalletAdapter,\n} from '@partylayer/core';\n\nimport {\n SEND_INSTALL_URL,\n SEND_SIGNING_METHOD,\n} from './constants';\nimport {\n SendNotInstalledError,\n isSendRpcError,\n mapSigilryError,\n safePreview,\n templateIdHint,\n} from './errors';\nimport { SendProvider } from './send-provider';\nimport type {\n SendAccount,\n SendEventListener,\n SendPrepareSubmissionRequest,\n SendStatusResponse,\n SendTxChangedEvent,\n} from './types';\n\nconst WALLET_ID = 'send';\n\nconst SEND_CAPABILITIES: CapabilityKey[] = [\n 'connect',\n 'disconnect',\n 'restore',\n 'signMessage',\n 'submitTransaction',\n 'ledgerApi',\n 'events',\n 'injected',\n];\n\nexport class SendAdapter implements WalletAdapter {\n readonly walletId = toWalletId(WALLET_ID);\n readonly name = 'Send';\n\n private readonly provider: SendProvider;\n\n /**\n * @param options.detection Optional. When supplied, the adapter uses\n * these matcher rules to decide whether the running `window.canton`\n * belongs to Send. Inject this from the registry entry's\n * `providerDetection` field for canonical behaviour. Omitting it\n * falls back to the built-in pattern that mirrors the canonical\n * registry rule (parity is verified by tests).\n * @param options.provider Optional. Pre-built provider instance, used\n * primarily by tests; takes precedence over `options.detection`.\n */\n constructor(options?: { detection?: ProviderDetection; provider?: SendProvider }) {\n this.provider = options?.provider ?? new SendProvider(options?.detection);\n }\n\n getCapabilities(): CapabilityKey[] {\n return SEND_CAPABILITIES;\n }\n\n async detectInstalled(): Promise<AdapterDetectResult> {\n if (typeof window === 'undefined') {\n return { installed: false, reason: 'Browser environment required' };\n }\n if (!this.provider.isPotentiallyAvailable()) {\n return {\n installed: false,\n reason: `Send Canton Wallet not detected. Visit ${SEND_INSTALL_URL} for installation instructions`,\n };\n }\n // Installed iff Send advertises via canton:announceProvider — independent\n // of who owns the shared window.canton slot (e.g. Console).\n const installed = await this.provider.isInstalled();\n if (installed) {\n return { installed: true, reason: 'Send Canton Wallet detected' };\n }\n return {\n installed: false,\n reason: `Send Canton Wallet did not announce (canton:announceProvider). Visit ${SEND_INSTALL_URL} for installation instructions`,\n };\n }\n\n async connect(\n ctx: AdapterContext,\n _opts?: { timeoutMs?: number; partyId?: PartyId; preferInstalled?: boolean },\n ): Promise<AdapterConnectResult> {\n try {\n if (!this.provider.isPotentiallyAvailable()) {\n throw new SendNotInstalledError();\n }\n\n ctx.logger.debug('Connecting to Send Canton Wallet', {\n appName: ctx.appName,\n network: ctx.network,\n });\n\n const status = await this.provider.connect();\n const account = await this.provider.getPrimaryAccount();\n const partyId = toPartyId(account.partyId);\n\n ctx.logger.info('Connected to Send Canton Wallet', {\n partyId: account.partyId,\n signingProviderId: account.signingProviderId,\n kernelId: status.kernel?.id,\n });\n\n return {\n partyId,\n session: {\n walletId: this.walletId,\n network: ctx.network,\n createdAt: Date.now(),\n metadata: buildSessionMetadata(status, account),\n },\n capabilities: this.getCapabilities(),\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'connect',\n transport: 'injected',\n details: { origin: ctx.origin, network: ctx.network },\n });\n }\n }\n\n async disconnect(ctx: AdapterContext, _session: Session): Promise<void> {\n try {\n await this.provider.disconnect();\n } catch (err) {\n ctx.logger.warn('Error during Send wallet disconnect', err);\n }\n }\n\n async restore(ctx: AdapterContext, persisted: PersistedSession): Promise<Session | null> {\n try {\n if (typeof window === 'undefined') return null;\n if (!this.provider.isPotentiallyAvailable()) return null;\n if (persisted.expiresAt && Date.now() >= persisted.expiresAt) return null;\n\n // status() is a silent introspection call — no popup, no passkey\n // prompt — so we can use it as a \"still authorised?\" probe on page\n // reload. If the kernel.id has shifted (user installed another\n // wallet) the guarded request will throw `SendKernelMismatchError`\n // and we'll return null below.\n const status = await this.provider.status();\n if (!status.isConnected) return null;\n\n const account = await this.provider.getPrimaryAccount();\n if (account.partyId !== persisted.partyId) {\n ctx.logger.debug(\n 'Send primary account changed since session was persisted; treating as expired',\n {\n persistedPartyId: persisted.partyId,\n currentPartyId: account.partyId,\n },\n );\n return null;\n }\n\n ctx.logger.debug('Restored Send Canton Wallet session', {\n partyId: account.partyId,\n kernelId: status.kernel?.id,\n });\n\n return {\n ...persisted,\n walletId: this.walletId,\n metadata: {\n ...(persisted.metadata ?? {}),\n ...buildSessionMetadata(status, account),\n },\n };\n } catch (err) {\n ctx.logger.warn('Failed to restore Send wallet session', err);\n return null;\n }\n }\n\n async signMessage(\n ctx: AdapterContext,\n session: Session,\n params: SignMessageParams,\n ): Promise<SignedMessage> {\n try {\n if (typeof params.message !== 'string' || params.message.length === 0) {\n throw new Error('signMessage requires a non-empty string `message`');\n }\n\n ctx.logger.debug('Signing message with Send Canton Wallet', {\n sessionId: session.sessionId,\n messageLength: params.message.length,\n });\n\n const { signature } = await this.provider.signMessage(params.message);\n return {\n signature: toSignature(signature),\n partyId: session.partyId,\n message: params.message,\n nonce: params.nonce,\n domain: params.domain,\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'signMessage',\n transport: 'injected',\n details: { sessionId: session.sessionId },\n });\n }\n }\n\n async signTransaction(\n _ctx: AdapterContext,\n _session: Session,\n _params: SignTransactionParams,\n ): Promise<SignedTransaction> {\n throw new CapabilityNotSupportedError(\n this.walletId,\n 'signTransaction — Send fuses sign-and-submit through prepareExecuteAndWait. Use submitTransaction instead.',\n );\n }\n\n async submitTransaction(\n ctx: AdapterContext,\n session: Session,\n params: SubmitTransactionParams,\n ): Promise<TxReceipt> {\n const payload = params.signedTx as SendPrepareSubmissionRequest;\n try {\n if (!payload || typeof payload !== 'object') {\n throw new Error(\n 'submitTransaction requires a SendPrepareSubmissionRequest as `signedTx` ' +\n `(received ${safePreview(payload)})`,\n );\n }\n if (!payload.commands || typeof payload.commands !== 'object') {\n throw new Error(\n \"submitTransaction signedTx is missing the required 'commands' field \" +\n `(received ${safePreview(payload)})`,\n );\n }\n\n ctx.logger.debug('Submitting transaction via Send Canton Wallet', {\n sessionId: session.sessionId,\n commandId: payload.commandId,\n });\n\n const { tx } = await this.provider.prepareExecuteAndWait(payload);\n\n if (!tx || typeof tx !== 'object' || !tx.payload?.updateId) {\n throw new Error(\n 'Send returned an unexpected shape from prepareExecuteAndWait. ' +\n `Expected { tx: { commandId, status:'executed', payload: { updateId, completionOffset } } } ` +\n `but received ${safePreview(tx)}.`,\n );\n }\n\n return {\n transactionHash: toTransactionHash(tx.payload.updateId),\n submittedAt: Date.now(),\n commandId: tx.commandId,\n updateId: tx.payload.updateId,\n };\n } catch (err) {\n const baseHint = templateIdHint(payload);\n // For structured Sigilry RPC errors (e.g. user pressed cancel in\n // the passkey popup → code 4001) we want the canonical mapping\n // (`UserRejectedError`). For everything else, if we have a payload\n // hint, attach it directly via TransportError so the keyword-based\n // fallback in `mapUnknownErrorToPartyLayerError` doesn't replace\n // the message with a generic `User rejected …` string and lose\n // the actionable text.\n if (baseHint && !isSendRpcError(err)) {\n const baseMessage = err instanceof Error ? err.message : String(err);\n throw new TransportError(\n baseMessage + baseHint,\n err instanceof Error ? err : undefined,\n {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n sessionId: session.sessionId,\n commandId: payload?.commandId,\n },\n );\n }\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n details: { sessionId: session.sessionId, commandId: payload?.commandId },\n });\n }\n }\n\n async ledgerApi(\n ctx: AdapterContext,\n session: Session,\n params: LedgerApiParams,\n ): Promise<LedgerApiResult> {\n try {\n ctx.logger.debug('Proxying ledger API request via Send Canton Wallet', {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n });\n\n const result = await this.provider.ledgerApi({\n requestMethod: params.requestMethod,\n resource: params.resource,\n body: params.body,\n });\n\n // Send's contract is `{ response: string }` — preserve raw to match\n // PartyLayer's `LedgerApiResult` exactly. Defensive fallback if a\n // future wallet build returns a parsed object.\n if (result && typeof result.response === 'string') {\n return { response: result.response };\n }\n return { response: JSON.stringify(result ?? null) };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'ledgerApi',\n transport: 'injected',\n details: {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n },\n });\n }\n }\n\n /**\n * Subscribe to PartyLayer adapter events. Currently bridges only\n * `txStatus` from Send's native `txChanged` event. Other PartyLayer\n * adapter events (`connect` / `disconnect` / `sessionExpired` / `error`)\n * are emitted by the SDK itself, not the wallet, so we no-op them.\n */\n on(event: AdapterEventName, handler: (payload: unknown) => void): () => void {\n if (event !== 'txStatus') {\n return () => {\n /* nothing to unsubscribe */\n };\n }\n const listener: SendEventListener = (...args) => {\n const tx = args[0] as SendTxChangedEvent | undefined;\n if (!tx) return;\n handler({\n status: mapTxStatus(tx.status),\n commandId: tx.commandId,\n raw: tx,\n });\n };\n try {\n this.provider.on('txChanged', listener);\n } catch {\n return () => {\n /* provider unavailable — nothing to unsubscribe */\n };\n }\n return () => this.provider.off('txChanged', listener);\n }\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Translate Sigilry `txChanged` statuses into PartyLayer's\n * `TransactionStatus` taxonomy. Kept separate so tests can pin the mapping.\n */\nfunction mapTxStatus(\n status: SendTxChangedEvent['status'],\n): 'pending' | 'submitted' | 'committed' | 'failed' {\n switch (status) {\n case 'pending':\n return 'pending';\n case 'signed':\n return 'submitted';\n case 'executed':\n return 'committed';\n case 'failed':\n default:\n return 'failed';\n }\n}\n\n/**\n * Pack diagnostic + restore-relevant fields into the Session metadata\n * record. PartyLayer types `Session.metadata` as `Record<string, string>`,\n * so every value must be a string — we omit anything that's missing\n * rather than writing the literal string `\"undefined\"`.\n */\nfunction buildSessionMetadata(\n status: SendStatusResponse,\n account: SendAccount,\n): Record<string, string> {\n const meta: Record<string, string> = {\n kernelId: status.kernel?.id ?? '',\n signingProviderId: account.signingProviderId,\n signingMethod: SEND_SIGNING_METHOD,\n publicKey: account.publicKey,\n namespace: account.namespace,\n networkId: account.networkId,\n hint: account.hint,\n };\n if (status.network?.ledgerApi?.baseUrl) {\n meta.ledgerApiBaseUrl = status.network.ledgerApi.baseUrl;\n }\n if (status.session?.userId) {\n meta.userId = status.session.userId;\n }\n // accessToken is intentionally omitted — the SDK's encrypted-storage\n // layer is for it; adapter-level metadata is plain Record<string,string>.\n return meta;\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { WalletNotInstalledError, PartyLayerError, UserRejectedError, CapabilityNotSupportedError, TransportError, mapUnknownErrorToPartyLayerError,
|
|
1
|
+
import { WalletNotInstalledError, PartyLayerError, UserRejectedError, CapabilityNotSupportedError, TransportError, mapUnknownErrorToPartyLayerError, toWalletId, toPartyId, toSignature, toTransactionHash } from '@partylayer/core';
|
|
2
|
+
import { discoverAnnouncedProviders } from '@partylayer/provider';
|
|
2
3
|
|
|
3
4
|
// src/send-adapter.ts
|
|
4
5
|
|
|
@@ -167,153 +168,171 @@ function safePreview(value, maxLen = 200) {
|
|
|
167
168
|
return String(value);
|
|
168
169
|
}
|
|
169
170
|
}
|
|
171
|
+
var DEFAULT_ANNOUNCE_TIMEOUT_MS = 500;
|
|
170
172
|
var SendProvider = class {
|
|
171
173
|
detection;
|
|
174
|
+
announceTimeoutMs;
|
|
175
|
+
discover;
|
|
176
|
+
injectedProvider;
|
|
177
|
+
cachedChannel = null;
|
|
178
|
+
channelPromise = null;
|
|
172
179
|
cachedStatus = null;
|
|
173
180
|
/**
|
|
174
|
-
* @param detection Optional
|
|
175
|
-
*
|
|
176
|
-
*
|
|
181
|
+
* @param detection Optional registry `ProviderDetection`. Its `provider.id`
|
|
182
|
+
* exact-match values define which announced extension ids are treated as
|
|
183
|
+
* Send. Defaults to `SEND_BUILTIN_DETECTION`.
|
|
184
|
+
* @param options Optional test/advanced hooks (see {@link SendProviderOptions}).
|
|
177
185
|
*/
|
|
178
|
-
constructor(detection) {
|
|
186
|
+
constructor(detection, options) {
|
|
179
187
|
this.detection = detection ?? SEND_BUILTIN_DETECTION;
|
|
188
|
+
this.announceTimeoutMs = options?.announceTimeoutMs ?? DEFAULT_ANNOUNCE_TIMEOUT_MS;
|
|
189
|
+
this.discover = options?.discover ?? ((o) => discoverAnnouncedProviders(o));
|
|
190
|
+
this.injectedProvider = options?.provider;
|
|
180
191
|
}
|
|
192
|
+
/** Extension ids accepted as Send: registry `provider.id` matchers ∪ known ids. */
|
|
193
|
+
acceptedIds() {
|
|
194
|
+
const fromDetection = this.detection.matchers.filter((m) => m.field === "provider.id" && m.match === "exact").flatMap((m) => m.values);
|
|
195
|
+
return Array.from(/* @__PURE__ */ new Set([...fromDetection, ...SEND_KNOWN_EXTENSION_IDS]));
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Resolve (and cache) Send's announce channel. Returns null if Send did not
|
|
199
|
+
* announce. Concurrent callers share a single in-flight announce (dedup), so
|
|
200
|
+
* a burst of requests triggers exactly one handshake.
|
|
201
|
+
*/
|
|
202
|
+
resolveChannel() {
|
|
203
|
+
if (this.cachedChannel) return Promise.resolve(this.cachedChannel);
|
|
204
|
+
if (this.channelPromise) return this.channelPromise;
|
|
205
|
+
this.channelPromise = this.doResolveChannel().then((channel) => {
|
|
206
|
+
if (channel) this.cachedChannel = channel;
|
|
207
|
+
return channel;
|
|
208
|
+
}).finally(() => {
|
|
209
|
+
this.channelPromise = null;
|
|
210
|
+
});
|
|
211
|
+
return this.channelPromise;
|
|
212
|
+
}
|
|
213
|
+
async doResolveChannel() {
|
|
214
|
+
if (this.injectedProvider) {
|
|
215
|
+
return { target: "injected", provider: this.injectedProvider };
|
|
216
|
+
}
|
|
217
|
+
if (typeof window === "undefined") return null;
|
|
218
|
+
const accepted = this.acceptedIds();
|
|
219
|
+
const entries = await this.discover({ timeoutMs: this.announceTimeoutMs });
|
|
220
|
+
const match = entries.find((e) => accepted.includes(e.id));
|
|
221
|
+
if (!match) return null;
|
|
222
|
+
return { target: match.id, provider: match.provider };
|
|
223
|
+
}
|
|
224
|
+
async channelRequest(method, params) {
|
|
225
|
+
const channel = await this.resolveChannel();
|
|
226
|
+
if (!channel) throw new SendNotInstalledError();
|
|
227
|
+
const payload = params === void 0 ? { method } : { method, params };
|
|
228
|
+
return channel.provider.request(payload);
|
|
229
|
+
}
|
|
230
|
+
// ── Detection ────────────────────────────────────────────────────────────
|
|
181
231
|
/**
|
|
182
|
-
* True
|
|
183
|
-
*
|
|
184
|
-
* on first call and caches the response for subsequent ones.
|
|
232
|
+
* True iff Send announces via `canton:announceProvider` — independent of who
|
|
233
|
+
* owns `window.canton`. Caches the resolved channel.
|
|
185
234
|
*/
|
|
186
235
|
async isInstalled() {
|
|
187
|
-
if (typeof window === "undefined" || !window.canton) return false;
|
|
188
236
|
try {
|
|
189
|
-
|
|
190
|
-
return matchesProviderDetection(status, this.detection);
|
|
237
|
+
return await this.resolveChannel() !== null;
|
|
191
238
|
} catch {
|
|
192
239
|
return false;
|
|
193
240
|
}
|
|
194
241
|
}
|
|
195
242
|
/**
|
|
196
|
-
* Synchronous best-effort presence check
|
|
197
|
-
*
|
|
198
|
-
*
|
|
199
|
-
*
|
|
243
|
+
* Synchronous best-effort presence check: only that we are in a browser where
|
|
244
|
+
* announce discovery can run. The authoritative check is `isInstalled()` /
|
|
245
|
+
* any request (which performs the announce handshake). No longer depends on
|
|
246
|
+
* the shared `window.canton` slot.
|
|
200
247
|
*/
|
|
201
248
|
isPotentiallyAvailable() {
|
|
202
|
-
return typeof window !== "undefined"
|
|
249
|
+
return typeof window !== "undefined";
|
|
203
250
|
}
|
|
204
251
|
/**
|
|
205
|
-
* Read
|
|
206
|
-
*
|
|
207
|
-
*
|
|
252
|
+
* Read `status().kernel.id`. Diagnostic helper kept for back-compat. Live
|
|
253
|
+
* Send no longer reports a kernel; this throws `SendNotInstalledError` when
|
|
254
|
+
* absent (callers that need the stable id should use the announce target).
|
|
208
255
|
*/
|
|
209
256
|
async getKernelId() {
|
|
210
257
|
const status = await this.fetchStatus();
|
|
211
258
|
const id = status?.kernel?.id;
|
|
212
259
|
if (typeof id !== "string" || id.length === 0) {
|
|
213
260
|
throw new SendNotInstalledError(
|
|
214
|
-
"
|
|
261
|
+
"Send status() did not return a kernel.id."
|
|
215
262
|
);
|
|
216
263
|
}
|
|
217
264
|
return id;
|
|
218
265
|
}
|
|
219
|
-
/**
|
|
220
|
-
* Read the latest cached status object. Resolves the underlying RPC on
|
|
221
|
-
* demand if no cached value is present.
|
|
222
|
-
*/
|
|
266
|
+
/** Latest status (cached after first fetch). */
|
|
223
267
|
async getStatus() {
|
|
224
268
|
return this.fetchStatus();
|
|
225
269
|
}
|
|
226
|
-
/**
|
|
227
|
-
* Reset the cached status (e.g. after the user uninstalls and reinstalls
|
|
228
|
-
* the extension, or you suspect kernel identity changed mid-session).
|
|
229
|
-
* Kept under both names to avoid breaking existing test imports.
|
|
230
|
-
*/
|
|
270
|
+
/** Reset cached status AND the resolved announce channel (forces re-announce). */
|
|
231
271
|
resetKernelCache() {
|
|
232
272
|
this.cachedStatus = null;
|
|
273
|
+
this.cachedChannel = null;
|
|
274
|
+
this.channelPromise = null;
|
|
233
275
|
}
|
|
234
276
|
resetStatusCache() {
|
|
235
277
|
this.cachedStatus = null;
|
|
278
|
+
this.cachedChannel = null;
|
|
279
|
+
this.channelPromise = null;
|
|
236
280
|
}
|
|
237
281
|
async fetchStatus() {
|
|
238
282
|
if (this.cachedStatus) return this.cachedStatus;
|
|
239
|
-
|
|
240
|
-
throw new SendNotInstalledError();
|
|
241
|
-
}
|
|
242
|
-
const provider = window.canton;
|
|
243
|
-
const status = await provider.request({ method: "status" });
|
|
283
|
+
const status = await this.channelRequest("status");
|
|
244
284
|
this.cachedStatus = status;
|
|
245
285
|
return status;
|
|
246
286
|
}
|
|
247
|
-
|
|
248
|
-
async rawRequest(args) {
|
|
249
|
-
if (typeof window === "undefined" || !window.canton) {
|
|
250
|
-
throw new SendNotInstalledError();
|
|
251
|
-
}
|
|
252
|
-
const provider = window.canton;
|
|
253
|
-
return provider.request(args);
|
|
254
|
-
}
|
|
255
|
-
/** Public dispatch — guards every call with a registry-driven detection check. */
|
|
256
|
-
async guardedRequest(args) {
|
|
257
|
-
const status = await this.fetchStatus();
|
|
258
|
-
if (!matchesProviderDetection(status, this.detection)) {
|
|
259
|
-
const observedId = status?.kernel?.id ?? "<unknown>";
|
|
260
|
-
throw new SendKernelMismatchError(observedId);
|
|
261
|
-
}
|
|
262
|
-
return this.rawRequest(args);
|
|
263
|
-
}
|
|
264
|
-
// ── Sigilry RPC methods (every one is guarded) ─────────────────────────
|
|
287
|
+
// ── Sigilry RPC methods (all over the announce target channel) ────────────
|
|
265
288
|
status() {
|
|
266
|
-
return this.
|
|
289
|
+
return this.channelRequest("status");
|
|
267
290
|
}
|
|
268
291
|
connect() {
|
|
269
|
-
return this.
|
|
292
|
+
return this.channelRequest("connect");
|
|
270
293
|
}
|
|
271
294
|
disconnect() {
|
|
272
|
-
return this.
|
|
295
|
+
return this.channelRequest("disconnect");
|
|
273
296
|
}
|
|
274
297
|
isConnected() {
|
|
275
|
-
return this.
|
|
298
|
+
return this.channelRequest("isConnected");
|
|
276
299
|
}
|
|
277
300
|
getActiveNetwork() {
|
|
278
|
-
return this.
|
|
301
|
+
return this.channelRequest("getActiveNetwork");
|
|
279
302
|
}
|
|
280
303
|
listAccounts() {
|
|
281
|
-
return this.
|
|
304
|
+
return this.channelRequest("listAccounts");
|
|
282
305
|
}
|
|
283
306
|
getPrimaryAccount() {
|
|
284
|
-
return this.
|
|
307
|
+
return this.channelRequest("getPrimaryAccount");
|
|
285
308
|
}
|
|
286
309
|
signMessage(message) {
|
|
287
|
-
return this.
|
|
310
|
+
return this.channelRequest("signMessage", { message });
|
|
288
311
|
}
|
|
289
312
|
prepareExecute(params) {
|
|
290
|
-
return this.
|
|
313
|
+
return this.channelRequest("prepareExecute", params);
|
|
291
314
|
}
|
|
292
315
|
prepareExecuteAndWait(params) {
|
|
293
|
-
return this.
|
|
316
|
+
return this.channelRequest("prepareExecuteAndWait", params);
|
|
294
317
|
}
|
|
295
318
|
ledgerApi(req) {
|
|
296
|
-
return this.
|
|
319
|
+
return this.channelRequest("ledgerApi", req);
|
|
297
320
|
}
|
|
298
321
|
// ── Events ─────────────────────────────────────────────────────────────
|
|
299
|
-
//
|
|
300
|
-
//
|
|
301
|
-
//
|
|
322
|
+
// Delegated to the channel provider's local event bus. By the time a dApp
|
|
323
|
+
// wires up a listener it has already gone through connect(), so the channel
|
|
324
|
+
// is cached. The official extension (sync) provider has no postMessage event
|
|
325
|
+
// push either, so this preserves the API/`events` capability without
|
|
326
|
+
// inventing a non-existent wire shape; it never throws.
|
|
302
327
|
on(event, listener) {
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
window.canton.on(event, listener);
|
|
328
|
+
const channel = this.cachedChannel;
|
|
329
|
+
if (!channel) return;
|
|
330
|
+
channel.provider.on(event, listener);
|
|
307
331
|
}
|
|
308
332
|
off(event, listener) {
|
|
309
|
-
|
|
310
|
-
if (
|
|
311
|
-
|
|
312
|
-
return;
|
|
313
|
-
}
|
|
314
|
-
if (typeof window.canton.removeListener === "function") {
|
|
315
|
-
window.canton.removeListener(event, listener);
|
|
316
|
-
}
|
|
333
|
+
const channel = this.cachedChannel;
|
|
334
|
+
if (!channel) return;
|
|
335
|
+
channel.provider.removeListener(event, listener);
|
|
317
336
|
}
|
|
318
337
|
};
|
|
319
338
|
|
|
@@ -365,7 +384,7 @@ var SendAdapter = class {
|
|
|
365
384
|
}
|
|
366
385
|
return {
|
|
367
386
|
installed: false,
|
|
368
|
-
reason:
|
|
387
|
+
reason: `Send Canton Wallet did not announce (canton:announceProvider). Visit ${SEND_INSTALL_URL} for installation instructions`
|
|
369
388
|
};
|
|
370
389
|
}
|
|
371
390
|
async connect(ctx, _opts) {
|