@partylayer/adapter-send 1.0.4 → 1.1.0

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/dist/index.js CHANGED
@@ -410,7 +410,10 @@ var SendAdapter = class {
410
410
  partyId,
411
411
  session: {
412
412
  walletId: this.walletId,
413
- network: ctx.network,
413
+ // The wallet's EFFECTIVE network (so the client can detect a
414
+ // mismatch with the dApp's configured network). Prefer what the
415
+ // wallet reports; fall back to ctx.network only when absent.
416
+ network: status.network?.networkId ?? account.networkId ?? ctx.network,
414
417
  createdAt: Date.now(),
415
418
  metadata: buildSessionMetadata(status, account)
416
419
  },
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","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"]}
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 // The wallet's EFFECTIVE network (so the client can detect a\n // mismatch with the dApp's configured network). Prefer what the\n // wallet reports; fall back to ctx.network only when absent.\n network: status.network?.networkId ?? account.networkId ?? 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
@@ -408,7 +408,10 @@ var SendAdapter = class {
408
408
  partyId,
409
409
  session: {
410
410
  walletId: this.walletId,
411
- network: ctx.network,
411
+ // The wallet's EFFECTIVE network (so the client can detect a
412
+ // mismatch with the dApp's configured network). Prefer what the
413
+ // wallet reports; fall back to ctx.network only when absent.
414
+ network: status.network?.networkId ?? account.networkId ?? ctx.network,
412
415
  createdAt: Date.now(),
413
416
  metadata: buildSessionMetadata(status, account)
414
417
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/send-provider.ts","../src/send-adapter.ts"],"names":["WALLET_ID","CapabilityNotSupportedError","TransportError"],"mappings":"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","file":"index.mjs","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"]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/send-provider.ts","../src/send-adapter.ts"],"names":["WALLET_ID","CapabilityNotSupportedError","TransportError"],"mappings":"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","file":"index.mjs","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 // The wallet's EFFECTIVE network (so the client can detect a\n // mismatch with the dApp's configured network). Prefer what the\n // wallet reports; fall back to ctx.network only when absent.\n network: status.network?.networkId ?? account.networkId ?? 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@partylayer/adapter-send",
3
- "version": "1.0.4",
3
+ "version": "1.1.0",
4
4
  "description": "Send Canton Wallet adapter for PartyLayer (CIP-0103, passkey-based via Sigilry)",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
@@ -38,8 +38,8 @@
38
38
  "url": "https://github.com/PartyLayer/PartyLayer/issues"
39
39
  },
40
40
  "dependencies": {
41
- "@partylayer/core": "^0.4.0",
42
- "@partylayer/provider": "^0.2.0"
41
+ "@partylayer/core": "^0.5.0",
42
+ "@partylayer/provider": "^0.2.1"
43
43
  },
44
44
  "devDependencies": {
45
45
  "@types/node": "^20.11.0",