@partylayer/adapter-send 1.0.0 → 1.0.2
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.d.mts +3 -8
- package/dist/index.d.ts +3 -8
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +9 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -10
- package/LICENSE +0 -21
package/dist/index.d.mts
CHANGED
|
@@ -417,14 +417,9 @@ declare function templateIdHint(payload: unknown): string;
|
|
|
417
417
|
declare function safePreview(value: unknown, maxLen?: number): string;
|
|
418
418
|
|
|
419
419
|
/**
|
|
420
|
-
*
|
|
421
|
-
*
|
|
422
|
-
*
|
|
423
|
-
* consumers still import this constant), but it is **not** the primary
|
|
424
|
-
* detection signal anymore. Detection is registry-driven via
|
|
425
|
-
* `SEND_BUILTIN_DETECTION` below; the kernel.id is one of three matchers
|
|
426
|
-
* (the URL-domain matchers carry stable identity, including for
|
|
427
|
-
* developer-mode builds whose kernel.id varies per install).
|
|
420
|
+
* @deprecated Use SEND_PRODUCTION_EXTENSION_ID or SEND_KNOWN_EXTENSION_IDS.
|
|
421
|
+
* Retained for backward source-compatibility with consumers that import
|
|
422
|
+
* the old name. Will be removed in a future major.
|
|
428
423
|
*/
|
|
429
424
|
declare const SEND_KERNEL_ID = "ldmohiccoioolenadmogclhoklmanpgi";
|
|
430
425
|
/**
|
package/dist/index.d.ts
CHANGED
|
@@ -417,14 +417,9 @@ declare function templateIdHint(payload: unknown): string;
|
|
|
417
417
|
declare function safePreview(value: unknown, maxLen?: number): string;
|
|
418
418
|
|
|
419
419
|
/**
|
|
420
|
-
*
|
|
421
|
-
*
|
|
422
|
-
*
|
|
423
|
-
* consumers still import this constant), but it is **not** the primary
|
|
424
|
-
* detection signal anymore. Detection is registry-driven via
|
|
425
|
-
* `SEND_BUILTIN_DETECTION` below; the kernel.id is one of three matchers
|
|
426
|
-
* (the URL-domain matchers carry stable identity, including for
|
|
427
|
-
* developer-mode builds whose kernel.id varies per install).
|
|
420
|
+
* @deprecated Use SEND_PRODUCTION_EXTENSION_ID or SEND_KNOWN_EXTENSION_IDS.
|
|
421
|
+
* Retained for backward source-compatibility with consumers that import
|
|
422
|
+
* the old name. Will be removed in a future major.
|
|
428
423
|
*/
|
|
429
424
|
declare const SEND_KERNEL_ID = "ldmohiccoioolenadmogclhoklmanpgi";
|
|
430
425
|
/**
|
package/dist/index.js
CHANGED
|
@@ -5,13 +5,20 @@ var core = require('@partylayer/core');
|
|
|
5
5
|
// src/send-adapter.ts
|
|
6
6
|
|
|
7
7
|
// src/constants.ts
|
|
8
|
-
var
|
|
8
|
+
var SEND_PRODUCTION_EXTENSION_ID = "lpnfhpbpmlobjlgkdmnjieeihjmihhjd";
|
|
9
|
+
var SEND_LEGACY_EXTENSION_ID = "ldmohiccoioolenadmogclhoklmanpgi";
|
|
10
|
+
var SEND_KNOWN_EXTENSION_IDS = [
|
|
11
|
+
SEND_PRODUCTION_EXTENSION_ID,
|
|
12
|
+
SEND_LEGACY_EXTENSION_ID
|
|
13
|
+
];
|
|
14
|
+
var SEND_KERNEL_ID = SEND_LEGACY_EXTENSION_ID;
|
|
9
15
|
var SEND_BUILTIN_DETECTION = {
|
|
10
16
|
transport: "window.canton",
|
|
11
17
|
matchers: [
|
|
18
|
+
{ field: "provider.id", match: "exact", values: [...SEND_KNOWN_EXTENSION_IDS] },
|
|
12
19
|
{ field: "kernel.url", match: "domain", value: "cantonwallet.com" },
|
|
13
20
|
{ field: "kernel.userUrl", match: "domain", value: "cantonwallet.com" },
|
|
14
|
-
{ field: "kernel.id", match: "exact", values: [
|
|
21
|
+
{ field: "kernel.id", match: "exact", values: [...SEND_KNOWN_EXTENSION_IDS] }
|
|
15
22
|
]
|
|
16
23
|
};
|
|
17
24
|
var SEND_SUPPORTED_NETWORKS = ["canton:mainnet"];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/send-provider.ts","../src/send-adapter.ts"],"names":["WalletNotInstalledError","PartyLayerError","UserRejectedError","CapabilityNotSupportedError","TransportError","mapUnknownErrorToPartyLayerError","matchesProviderDetection","WALLET_ID","toWalletId","toPartyId","toSignature","toTransactionHash"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProviderDetection } from '@partylayer/core';\n\n/**\n * Chrome Web Store extension ID for Send Canton Wallet.\n *\n * Kept as a public export for diagnostics and back-compat (downstream\n * consumers still import this constant), but it is **not** the primary\n * detection signal anymore. Detection is registry-driven via\n * `SEND_BUILTIN_DETECTION` below; the kernel.id is one of three matchers\n * (the URL-domain matchers carry stable identity, including for\n * developer-mode builds whose kernel.id varies per install).\n */\nexport const SEND_KERNEL_ID = 'ldmohiccoioolenadmogclhoklmanpgi';\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 * 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: 'kernel.url', match: 'domain', value: 'cantonwallet.com' },\n { field: 'kernel.userUrl', match: 'domain', value: 'cantonwallet.com' },\n { field: 'kernel.id', match: 'exact', values: [SEND_KERNEL_ID] },\n ],\n};\n\n/**\n * Network IDs Send currently supports. Send is mainnet-only as of v0.2.0.\n * Listed in Canton long-form so it stays distinguishable from PartyLayer's\n * generic 'mainnet' alias.\n */\nexport const SEND_SUPPORTED_NETWORKS = ['canton:mainnet'] as const;\n\nexport const SEND_INSTALL_URL = 'https://sigilry.org';\n\nexport const SEND_HOMEPAGE = 'https://cantonwallet.com';\n\nexport const SEND_DOCS_URL = 'https://sigilry.org';\n\n/**\n * Send signs every transaction via the WebAuthn PRF extension (passkey).\n * Surfaced through session metadata so dApps can adapt copy (\"approve in\n * Touch ID / Face ID prompt\") rather than show a generic \"open extension\"\n * hint.\n */\nexport const SEND_SIGNING_METHOD = 'webauthn-prf' as const;\n","/**\n * Send-specific error helpers.\n *\n * PartyLayer's `ErrorCode` union (in `@partylayer/core/errors.ts`) is the\n * canonical taxonomy. We do NOT introduce new codes here — instead, the\n * Send-specific error classes subclass the closest existing PartyLayer\n * error and carry the diagnostic detail (kernel id, RPC code) in\n * `details`. That way existing telemetry pipelines and `code`-based\n * branches in dApp code continue to work without modification.\n */\n\nimport {\n CapabilityNotSupportedError,\n PartyLayerError,\n TransportError,\n UserRejectedError,\n WalletNotInstalledError,\n mapUnknownErrorToPartyLayerError,\n type ErrorMappingContext,\n} from '@partylayer/core';\n\nimport { SEND_INSTALL_URL, SEND_KERNEL_ID } from './constants';\n\n/** JSON-RPC 2.0 + EIP-1193 error codes Sigilry surfaces. */\nexport const SendRpcErrorCode = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n USER_REJECTED: 4001,\n UNAUTHORIZED: 4100,\n UNSUPPORTED_METHOD: 4200,\n DISCONNECTED: 4900,\n CHAIN_DISCONNECTED: 4901,\n INVALID_INPUT: -32000,\n RESOURCE_NOT_FOUND: -32001,\n RESOURCE_UNAVAILABLE: -32002,\n TRANSACTION_REJECTED: -32003,\n METHOD_NOT_SUPPORTED: -32004,\n LIMIT_EXCEEDED: -32005,\n} as const;\n\nconst WALLET_ID = 'send';\n\n/**\n * Send isn't installed — `window.canton` is unavailable entirely.\n *\n * Subclasses `WalletNotInstalledError` so existing capability gates and\n * UI (\"install Send\") light up automatically. Carries the install URL in\n * `details` for one-click prompts.\n */\nexport class SendNotInstalledError extends WalletNotInstalledError {\n constructor(reason?: string) {\n super(\n WALLET_ID,\n reason ?? `Send Canton Wallet is not detected. Visit ${SEND_INSTALL_URL} for installation instructions`,\n );\n this.name = 'SendNotInstalledError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n installUrl: SEND_INSTALL_URL,\n };\n }\n}\n\n/**\n * `window.canton` is present but `kernel.id` does not match Send.\n *\n * Treated as \"Send not installed\" from the SDK's perspective so that\n * other adapters get a chance to claim the active provider — but the\n * runtime kernel id is preserved in `details` for diagnostics.\n *\n * The wording avoids the keywords \"rejected\"/\"denied\"/\"cancelled\" so\n * `mapUnknownErrorToPartyLayerError` won't silently rewrite this as a\n * `UserRejectedError` when re-thrown through error mapping.\n */\nexport class SendKernelMismatchError extends WalletNotInstalledError {\n constructor(actualKernelId: string) {\n super(\n WALLET_ID,\n `Another Canton wallet is active at window.canton (kernel.id=\"${actualKernelId}\", expected \"${SEND_KERNEL_ID}\"). The Send adapter will yield to the matching adapter.`,\n );\n this.name = 'SendKernelMismatchError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n actualKernelId,\n expectedKernelId: SEND_KERNEL_ID,\n };\n }\n}\n\n/**\n * Send's authentication backend (auth.cantonwallet.com) timed out or was\n * otherwise unreachable. This is an external, intermittent issue on\n * Send's side — not a PartyLayer issue, not a wallet-not-installed\n * issue, and not a user rejection. Surfaced as a typed error so the UI\n * can offer a \"Try again\" affordance + link to Send's status page.\n *\n * Subclasses `WalletNotInstalledError` to reuse the existing core error\n * code (`'WALLET_NOT_INSTALLED'`) without expanding the canonical\n * `ErrorCode` union — but the class identity (`name`) plus\n * `details.cause = 'send-auth-timeout'` give consumers enough signal to\n * route the retry UX without a code-level change.\n */\nexport class SendAuthTimeoutError extends WalletNotInstalledError {\n constructor(originalMessage?: string) {\n super(\n WALLET_ID,\n originalMessage ??\n 'Send authentication timed out. Please try again. ' +\n 'If the problem persists, see https://cantonwallet.com',\n );\n this.name = 'SendAuthTimeoutError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n cause: 'send-auth-timeout',\n retry: true,\n helpUrl: 'https://cantonwallet.com',\n ...(originalMessage ? { originalMessage } : {}),\n };\n }\n}\n\n/**\n * Recognise Send-side authentication-timeout signatures in arbitrary\n * error payloads. Covers the wording variants the Send wallet surfaces\n * today (the wallet UI itself uses both \"Authentication timed out\" and\n * \"Cannot reach authentication server\"; the underlying domain\n * `auth.cantonwallet.com` shows up in stack traces / fetch errors when\n * the network is at fault).\n */\nexport function detectSendAuthTimeout(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const raw = (err as { message?: unknown }).message;\n if (typeof raw !== 'string' || raw.length === 0) return false;\n const msg = raw.toLowerCase();\n return (\n msg.includes('authentication timed out') ||\n msg.includes('cannot reach authentication server') ||\n msg.includes('auth.cantonwallet.com')\n );\n}\n\ninterface SendRpcErrorLike {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport function isSendRpcError(err: unknown): err is SendRpcErrorLike {\n if (!err || typeof err !== 'object') return false;\n const candidate = err as { code?: unknown; message?: unknown };\n return typeof candidate.code === 'number' && typeof candidate.message === 'string';\n}\n\n/**\n * Translate a Sigilry RPC error to the closest PartyLayer error class.\n *\n * Falls back to `mapUnknownErrorToPartyLayerError` when the error doesn't\n * carry a recognisable JSON-RPC `code`. Note that `mapUnknownErrorToPartyLayerError`\n * itself rewrites messages containing \"rejected\"/\"denied\"/\"cancelled\" into\n * `UserRejectedError`, so we explicitly route the 4001 code first to make\n * the user-rejection path stable across wording changes in the wallet.\n */\nexport function mapSigilryError(\n err: unknown,\n context: ErrorMappingContext,\n): PartyLayerError {\n if (err instanceof PartyLayerError) return err;\n\n // Send-side auth-timeout takes priority over the generic RPC-code path\n // because the wallet sometimes wraps the timeout into a generic message\n // without a structured error code. Surfacing it as a typed error lets\n // the modal render a retry affordance.\n if (detectSendAuthTimeout(err)) {\n const original = err instanceof Error ? err.message : undefined;\n return new SendAuthTimeoutError(original);\n }\n\n if (isSendRpcError(err)) {\n const code = err.code;\n const message = err.message;\n\n if (code === SendRpcErrorCode.USER_REJECTED) {\n return new UserRejectedError(context.phase, {\n walletId: context.walletId,\n transport: context.transport,\n rpcCode: code,\n originalMessage: message,\n });\n }\n\n if (\n code === SendRpcErrorCode.UNSUPPORTED_METHOD ||\n code === SendRpcErrorCode.METHOD_NOT_FOUND ||\n code === SendRpcErrorCode.METHOD_NOT_SUPPORTED\n ) {\n return new CapabilityNotSupportedError(WALLET_ID, context.phase);\n }\n\n if (\n code === SendRpcErrorCode.DISCONNECTED ||\n code === SendRpcErrorCode.CHAIN_DISCONNECTED ||\n code === SendRpcErrorCode.UNAUTHORIZED\n ) {\n return new TransportError(message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n rpcCode: code,\n });\n }\n\n return new TransportError(message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n rpcCode: code,\n });\n }\n\n return mapUnknownErrorToPartyLayerError(err, context);\n}\n\n/**\n * Build a hint string when the developer passes a short-form Canton\n * template ID OR the legacy pre-Token-Standard `Amulet_Transfer` choice.\n *\n * Mirrors `loop-adapter.templateIdHint` so Send produces the same\n * actionable error text for the same payload bug class. Returns an empty\n * string when no problem is detected — callers can append this to a base\n * error message unconditionally.\n */\nexport function templateIdHint(payload: unknown): string {\n if (!payload || typeof payload !== 'object') return '';\n const commands = (payload as { commands?: unknown }).commands;\n if (!Array.isArray(commands)) return '';\n\n try {\n for (const cmd of commands as Array<Record<string, unknown>>) {\n const exercise = (cmd?.ExerciseCommand ?? cmd?.exerciseCommand ?? cmd?.exercise) as\n | Record<string, unknown>\n | undefined;\n const create = (cmd?.CreateCommand ?? cmd?.createCommand ?? cmd?.create) as\n | Record<string, unknown>\n | undefined;\n const raw = (exercise?.templateId ?? create?.templateId) as string | undefined;\n const choice = exercise?.choice as string | undefined;\n\n if (\n choice === 'Amulet_Transfer' &&\n typeof raw === 'string' &&\n raw.includes('Splice.Amulet:Amulet')\n ) {\n return (\n \" The command exercises 'Amulet_Transfer' directly on the Amulet template — that's the \" +\n 'legacy (pre-CIP-56) path Canton no longer accepts. Use the Token Standard flow: exercise ' +\n \"'TransferFactory_Transfer' by interface on a TransferFactory contract \" +\n \"(interfaceId '#splice-api-token-transfer-instruction-v1:Splice.Api.Token.TransferInstructionV1:TransferFactory'). \" +\n 'See https://partylayer.xyz/docs/token-transfers for the canonical flow.'\n );\n }\n\n if (typeof raw === 'string' && raw.length > 0 && !raw.startsWith('#')) {\n return (\n ` The command uses templateId=\"${raw}\" which is the short Canton form; Send requires ` +\n \"the fully-qualified Daml form (e.g. '#splice-amulet:Splice.Amulet:Amulet').\"\n );\n }\n }\n } catch {\n // best-effort; never throw from a hint helper\n }\n return '';\n}\n\n/**\n * Bound preview of an arbitrary value for inclusion in error messages.\n * Keeps logs small when a payload is large or contains binary blobs.\n */\nexport function safePreview(value: unknown, maxLen = 200): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n try {\n const s = JSON.stringify(value);\n if (typeof s !== 'string') return String(value);\n return s.length > maxLen ? s.slice(0, maxLen) + '...' : s;\n } catch {\n return String(value);\n }\n}\n","/**\n * Typed wrapper around the `window.canton` provider exposed by Send.\n *\n * Detection is **registry-driven** via `matchesProviderDetection`. The\n * adapter accepts an optional `ProviderDetection` rule set at construction\n * (sourced from the registry's `providerDetection` field for the Send\n * entry); when omitted, it falls back to `SEND_BUILTIN_DETECTION` which\n * mirrors the canonical registry rule. Every public RPC method goes\n * through `guardedRequest`, which checks the live `status` response\n * against those rules before forwarding the call. The result: if a\n * non-Send wallet is sitting at `window.canton`, every Send call resolves\n * to a `SendKernelMismatchError` (treated by the SDK as \"Send is not\n * installed\"), and Send only ever acts on its own provider.\n */\n\nimport { matchesProviderDetection, type ProviderDetection } from '@partylayer/core';\n\nimport { SEND_BUILTIN_DETECTION } from './constants';\nimport { SendKernelMismatchError, SendNotInstalledError } from './errors';\nimport type {\n SendAccount,\n SendCantonProvider,\n SendEventListener,\n SendEventName,\n SendLedgerApiRequest,\n SendLedgerApiResult,\n SendNetwork,\n SendPrepareExecuteAndWaitResult,\n SendPrepareSubmissionRequest,\n SendRpcMethod,\n SendRpcRequest,\n SendRpcResult,\n SendStatusResponse,\n} from './types';\n\nexport class SendProvider {\n private readonly detection: ProviderDetection;\n private cachedStatus: SendStatusResponse | null = null;\n\n /**\n * @param detection Optional. Used to match the running `window.canton`\n * provider against Send's identity. When omitted, falls back to\n * `SEND_BUILTIN_DETECTION` (canonical registry rule mirror).\n */\n constructor(detection?: ProviderDetection) {\n this.detection = detection ?? SEND_BUILTIN_DETECTION;\n }\n\n /**\n * True when `window.canton` is present AND its self-reported status\n * matches Send's detection rules. Performs an actual `status` round-trip\n * on first call and caches the response for subsequent ones.\n */\n async isInstalled(): Promise<boolean> {\n if (typeof window === 'undefined' || !window.canton) return false;\n try {\n const status = await this.fetchStatus();\n return matchesProviderDetection(status, this.detection);\n } catch {\n return false;\n }\n }\n\n /**\n * Synchronous best-effort presence check. Used for fast picker rendering\n * before any async status introspection. May report `true` for a\n * non-Send provider — callers must follow up with `isInstalled()` (or\n * any guarded request) before assuming Send is wired in.\n */\n isPotentiallyAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.canton;\n }\n\n /**\n * Read the cached `kernel.id` from the running provider, fetching status\n * on demand. Diagnostic helper kept public for back-compat — detection\n * itself no longer hinges on this single field.\n */\n async getKernelId(): Promise<string> {\n const status = await this.fetchStatus();\n const id = status?.kernel?.id;\n if (typeof id !== 'string' || id.length === 0) {\n throw new SendNotInstalledError(\n 'window.canton.status() did not return a kernel.id — provider is malformed.',\n );\n }\n return id;\n }\n\n /**\n * Read the latest cached status object. Resolves the underlying RPC on\n * demand if no cached value is present.\n */\n async getStatus(): Promise<SendStatusResponse> {\n return this.fetchStatus();\n }\n\n /**\n * Reset the cached status (e.g. after the user uninstalls and reinstalls\n * the extension, or you suspect kernel identity changed mid-session).\n * Kept under both names to avoid breaking existing test imports.\n */\n resetKernelCache(): void {\n this.cachedStatus = null;\n }\n resetStatusCache(): void {\n this.cachedStatus = null;\n }\n\n private async fetchStatus(): Promise<SendStatusResponse> {\n if (this.cachedStatus) return this.cachedStatus;\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n const provider = window.canton as SendCantonProvider;\n const status = (await provider.request({ method: 'status' })) as SendStatusResponse;\n this.cachedStatus = status;\n return status;\n }\n\n /** Internal — bypasses the detection guard. */\n private async rawRequest(args: { method: SendRpcMethod; params?: unknown }): Promise<unknown> {\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n const provider = window.canton as SendCantonProvider;\n return provider.request(args as SendRpcRequest<SendRpcMethod>);\n }\n\n /** Public dispatch — guards every call with a registry-driven detection check. */\n private async guardedRequest<M extends SendRpcMethod>(\n args: SendRpcRequest<M>,\n ): Promise<SendRpcResult<M>> {\n const status = await this.fetchStatus();\n if (!matchesProviderDetection(status, this.detection)) {\n const observedId = status?.kernel?.id ?? '<unknown>';\n throw new SendKernelMismatchError(observedId);\n }\n return this.rawRequest(args) as Promise<SendRpcResult<M>>;\n }\n\n // ── Sigilry RPC methods (every one is guarded) ─────────────────────────\n\n status(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'status' });\n }\n\n connect(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'connect' });\n }\n\n disconnect(): Promise<null> {\n return this.guardedRequest({ method: 'disconnect' });\n }\n\n isConnected(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'isConnected' });\n }\n\n getActiveNetwork(): Promise<SendNetwork> {\n return this.guardedRequest({ method: 'getActiveNetwork' });\n }\n\n listAccounts(): Promise<SendAccount[]> {\n return this.guardedRequest({ method: 'listAccounts' });\n }\n\n getPrimaryAccount(): Promise<SendAccount> {\n return this.guardedRequest({ method: 'getPrimaryAccount' });\n }\n\n signMessage(message: string): Promise<{ signature: string }> {\n return this.guardedRequest({ method: 'signMessage', params: { message } });\n }\n\n prepareExecute(params: SendPrepareSubmissionRequest): Promise<null> {\n return this.guardedRequest({ method: 'prepareExecute', params });\n }\n\n prepareExecuteAndWait(\n params: SendPrepareSubmissionRequest,\n ): Promise<SendPrepareExecuteAndWaitResult> {\n return this.guardedRequest({ method: 'prepareExecuteAndWait', params });\n }\n\n ledgerApi(req: SendLedgerApiRequest): Promise<SendLedgerApiResult> {\n return this.guardedRequest({ method: 'ledgerApi', params: req });\n }\n\n // ── Events ─────────────────────────────────────────────────────────────\n // No kernel guard here on purpose — by the time the dApp wires up an\n // event listener it has already gone through `connect()` (which IS\n // guarded), so we trust the binding.\n\n on(event: SendEventName, listener: SendEventListener): void {\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n window.canton.on(event, listener);\n }\n\n off(event: SendEventName, listener: SendEventListener): void {\n if (typeof window === 'undefined' || !window.canton) return;\n if (typeof window.canton.off === 'function') {\n window.canton.off(event, listener);\n return;\n }\n if (typeof window.canton.removeListener === 'function') {\n window.canton.removeListener(event, listener);\n }\n }\n}\n","/**\n * Send Canton Wallet adapter.\n *\n * Send is a passkey-based Canton wallet that exposes the splice-wallet-kernel\n * OpenRPC protocol at `window.canton`. Because the bare `window.canton` slot is shared with\n * other splice-spec wallets (e.g. Console-class), the adapter funnels\n * every request through `SendProvider.guardedRequest`, which verifies\n * the running provider's `kernel.id` matches Send's Chrome extension\n * ID before forwarding the call.\n *\n * Capability summary: connect / disconnect / restore / signMessage /\n * submitTransaction / ledgerApi / events / injected. `signTransaction`\n * is intentionally NOT declared — Send (like Loop and Nightly) fuses\n * sign-and-submit through `prepareExecute*`, so a standalone sign step\n * would only mislead callers.\n */\n\nimport {\n CapabilityNotSupportedError,\n TransportError,\n toPartyId,\n toSignature,\n toTransactionHash,\n toWalletId,\n type ProviderDetection,\n type AdapterConnectResult,\n type AdapterContext,\n type AdapterDetectResult,\n type AdapterEventName,\n type CapabilityKey,\n type LedgerApiParams,\n type LedgerApiResult,\n type PartyId,\n type PersistedSession,\n type Session,\n type SignMessageParams,\n type SignTransactionParams,\n type SignedMessage,\n type SignedTransaction,\n type SubmitTransactionParams,\n type TxReceipt,\n type WalletAdapter,\n} from '@partylayer/core';\n\nimport {\n SEND_INSTALL_URL,\n SEND_SIGNING_METHOD,\n} from './constants';\nimport {\n SendNotInstalledError,\n isSendRpcError,\n mapSigilryError,\n safePreview,\n templateIdHint,\n} from './errors';\nimport { SendProvider } from './send-provider';\nimport type {\n SendAccount,\n SendEventListener,\n SendPrepareSubmissionRequest,\n SendStatusResponse,\n SendTxChangedEvent,\n} from './types';\n\nconst WALLET_ID = 'send';\n\nconst SEND_CAPABILITIES: CapabilityKey[] = [\n 'connect',\n 'disconnect',\n 'restore',\n 'signMessage',\n 'submitTransaction',\n 'ledgerApi',\n 'events',\n 'injected',\n];\n\nexport class SendAdapter implements WalletAdapter {\n readonly walletId = toWalletId(WALLET_ID);\n readonly name = 'Send';\n\n private readonly provider: SendProvider;\n\n /**\n * @param options.detection Optional. When supplied, the adapter uses\n * these matcher rules to decide whether the running `window.canton`\n * belongs to Send. Inject this from the registry entry's\n * `providerDetection` field for canonical behaviour. Omitting it\n * falls back to the built-in pattern that mirrors the canonical\n * registry rule (parity is verified by tests).\n * @param options.provider Optional. Pre-built provider instance, used\n * primarily by tests; takes precedence over `options.detection`.\n */\n constructor(options?: { detection?: ProviderDetection; provider?: SendProvider }) {\n this.provider = options?.provider ?? new SendProvider(options?.detection);\n }\n\n getCapabilities(): CapabilityKey[] {\n return SEND_CAPABILITIES;\n }\n\n async detectInstalled(): Promise<AdapterDetectResult> {\n if (typeof window === 'undefined') {\n return { installed: false, reason: 'Browser environment required' };\n }\n if (!this.provider.isPotentiallyAvailable()) {\n return {\n installed: false,\n reason: `Send Canton Wallet not detected. Visit ${SEND_INSTALL_URL} for installation instructions`,\n };\n }\n const installed = await this.provider.isInstalled();\n if (installed) {\n return { installed: true, reason: 'Send Canton Wallet detected' };\n }\n return {\n installed: false,\n reason:\n 'window.canton is present but its kernel.id does not match Send. Another Canton wallet is active.',\n };\n }\n\n async connect(\n ctx: AdapterContext,\n _opts?: { timeoutMs?: number; partyId?: PartyId; preferInstalled?: boolean },\n ): Promise<AdapterConnectResult> {\n try {\n if (!this.provider.isPotentiallyAvailable()) {\n throw new SendNotInstalledError();\n }\n\n ctx.logger.debug('Connecting to Send Canton Wallet', {\n appName: ctx.appName,\n network: ctx.network,\n });\n\n const status = await this.provider.connect();\n const account = await this.provider.getPrimaryAccount();\n const partyId = toPartyId(account.partyId);\n\n ctx.logger.info('Connected to Send Canton Wallet', {\n partyId: account.partyId,\n signingProviderId: account.signingProviderId,\n kernelId: status.kernel?.id,\n });\n\n return {\n partyId,\n session: {\n walletId: this.walletId,\n network: ctx.network,\n createdAt: Date.now(),\n metadata: buildSessionMetadata(status, account),\n },\n capabilities: this.getCapabilities(),\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'connect',\n transport: 'injected',\n details: { origin: ctx.origin, network: ctx.network },\n });\n }\n }\n\n async disconnect(ctx: AdapterContext, _session: Session): Promise<void> {\n try {\n await this.provider.disconnect();\n } catch (err) {\n ctx.logger.warn('Error during Send wallet disconnect', err);\n }\n }\n\n async restore(ctx: AdapterContext, persisted: PersistedSession): Promise<Session | null> {\n try {\n if (typeof window === 'undefined') return null;\n if (!this.provider.isPotentiallyAvailable()) return null;\n if (persisted.expiresAt && Date.now() >= persisted.expiresAt) return null;\n\n // status() is a silent introspection call — no popup, no passkey\n // prompt — so we can use it as a \"still authorised?\" probe on page\n // reload. If the kernel.id has shifted (user installed another\n // wallet) the guarded request will throw `SendKernelMismatchError`\n // and we'll return null below.\n const status = await this.provider.status();\n if (!status.isConnected) return null;\n\n const account = await this.provider.getPrimaryAccount();\n if (account.partyId !== persisted.partyId) {\n ctx.logger.debug(\n 'Send primary account changed since session was persisted; treating as expired',\n {\n persistedPartyId: persisted.partyId,\n currentPartyId: account.partyId,\n },\n );\n return null;\n }\n\n ctx.logger.debug('Restored Send Canton Wallet session', {\n partyId: account.partyId,\n kernelId: status.kernel?.id,\n });\n\n return {\n ...persisted,\n walletId: this.walletId,\n metadata: {\n ...(persisted.metadata ?? {}),\n ...buildSessionMetadata(status, account),\n },\n };\n } catch (err) {\n ctx.logger.warn('Failed to restore Send wallet session', err);\n return null;\n }\n }\n\n async signMessage(\n ctx: AdapterContext,\n session: Session,\n params: SignMessageParams,\n ): Promise<SignedMessage> {\n try {\n if (typeof params.message !== 'string' || params.message.length === 0) {\n throw new Error('signMessage requires a non-empty string `message`');\n }\n\n ctx.logger.debug('Signing message with Send Canton Wallet', {\n sessionId: session.sessionId,\n messageLength: params.message.length,\n });\n\n const { signature } = await this.provider.signMessage(params.message);\n return {\n signature: toSignature(signature),\n partyId: session.partyId,\n message: params.message,\n nonce: params.nonce,\n domain: params.domain,\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'signMessage',\n transport: 'injected',\n details: { sessionId: session.sessionId },\n });\n }\n }\n\n async signTransaction(\n _ctx: AdapterContext,\n _session: Session,\n _params: SignTransactionParams,\n ): Promise<SignedTransaction> {\n throw new CapabilityNotSupportedError(\n this.walletId,\n 'signTransaction — Send fuses sign-and-submit through prepareExecuteAndWait. Use submitTransaction instead.',\n );\n }\n\n async submitTransaction(\n ctx: AdapterContext,\n session: Session,\n params: SubmitTransactionParams,\n ): Promise<TxReceipt> {\n const payload = params.signedTx as SendPrepareSubmissionRequest;\n try {\n if (!payload || typeof payload !== 'object') {\n throw new Error(\n 'submitTransaction requires a SendPrepareSubmissionRequest as `signedTx` ' +\n `(received ${safePreview(payload)})`,\n );\n }\n if (!payload.commands || typeof payload.commands !== 'object') {\n throw new Error(\n \"submitTransaction signedTx is missing the required 'commands' field \" +\n `(received ${safePreview(payload)})`,\n );\n }\n\n ctx.logger.debug('Submitting transaction via Send Canton Wallet', {\n sessionId: session.sessionId,\n commandId: payload.commandId,\n });\n\n const { tx } = await this.provider.prepareExecuteAndWait(payload);\n\n if (!tx || typeof tx !== 'object' || !tx.payload?.updateId) {\n throw new Error(\n 'Send returned an unexpected shape from prepareExecuteAndWait. ' +\n `Expected { tx: { commandId, status:'executed', payload: { updateId, completionOffset } } } ` +\n `but received ${safePreview(tx)}.`,\n );\n }\n\n return {\n transactionHash: toTransactionHash(tx.payload.updateId),\n submittedAt: Date.now(),\n commandId: tx.commandId,\n updateId: tx.payload.updateId,\n };\n } catch (err) {\n const baseHint = templateIdHint(payload);\n // For structured Sigilry RPC errors (e.g. user pressed cancel in\n // the passkey popup → code 4001) we want the canonical mapping\n // (`UserRejectedError`). For everything else, if we have a payload\n // hint, attach it directly via TransportError so the keyword-based\n // fallback in `mapUnknownErrorToPartyLayerError` doesn't replace\n // the message with a generic `User rejected …` string and lose\n // the actionable text.\n if (baseHint && !isSendRpcError(err)) {\n const baseMessage = err instanceof Error ? err.message : String(err);\n throw new TransportError(\n baseMessage + baseHint,\n err instanceof Error ? err : undefined,\n {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n sessionId: session.sessionId,\n commandId: payload?.commandId,\n },\n );\n }\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n details: { sessionId: session.sessionId, commandId: payload?.commandId },\n });\n }\n }\n\n async ledgerApi(\n ctx: AdapterContext,\n session: Session,\n params: LedgerApiParams,\n ): Promise<LedgerApiResult> {\n try {\n ctx.logger.debug('Proxying ledger API request via Send Canton Wallet', {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n });\n\n const result = await this.provider.ledgerApi({\n requestMethod: params.requestMethod,\n resource: params.resource,\n body: params.body,\n });\n\n // Send's contract is `{ response: string }` — preserve raw to match\n // PartyLayer's `LedgerApiResult` exactly. Defensive fallback if a\n // future wallet build returns a parsed object.\n if (result && typeof result.response === 'string') {\n return { response: result.response };\n }\n return { response: JSON.stringify(result ?? null) };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'ledgerApi',\n transport: 'injected',\n details: {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n },\n });\n }\n }\n\n /**\n * Subscribe to PartyLayer adapter events. Currently bridges only\n * `txStatus` from Send's native `txChanged` event. Other PartyLayer\n * adapter events (`connect` / `disconnect` / `sessionExpired` / `error`)\n * are emitted by the SDK itself, not the wallet, so we no-op them.\n */\n on(event: AdapterEventName, handler: (payload: unknown) => void): () => void {\n if (event !== 'txStatus') {\n return () => {\n /* nothing to unsubscribe */\n };\n }\n const listener: SendEventListener = (...args) => {\n const tx = args[0] as SendTxChangedEvent | undefined;\n if (!tx) return;\n handler({\n status: mapTxStatus(tx.status),\n commandId: tx.commandId,\n raw: tx,\n });\n };\n try {\n this.provider.on('txChanged', listener);\n } catch {\n return () => {\n /* provider unavailable — nothing to unsubscribe */\n };\n }\n return () => this.provider.off('txChanged', listener);\n }\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Translate Sigilry `txChanged` statuses into PartyLayer's\n * `TransactionStatus` taxonomy. Kept separate so tests can pin the mapping.\n */\nfunction mapTxStatus(\n status: SendTxChangedEvent['status'],\n): 'pending' | 'submitted' | 'committed' | 'failed' {\n switch (status) {\n case 'pending':\n return 'pending';\n case 'signed':\n return 'submitted';\n case 'executed':\n return 'committed';\n case 'failed':\n default:\n return 'failed';\n }\n}\n\n/**\n * Pack diagnostic + restore-relevant fields into the Session metadata\n * record. PartyLayer types `Session.metadata` as `Record<string, string>`,\n * so every value must be a string — we omit anything that's missing\n * rather than writing the literal string `\"undefined\"`.\n */\nfunction buildSessionMetadata(\n status: SendStatusResponse,\n account: SendAccount,\n): Record<string, string> {\n const meta: Record<string, string> = {\n kernelId: status.kernel?.id ?? '',\n signingProviderId: account.signingProviderId,\n signingMethod: SEND_SIGNING_METHOD,\n publicKey: account.publicKey,\n namespace: account.namespace,\n networkId: account.networkId,\n hint: account.hint,\n };\n if (status.network?.ledgerApi?.baseUrl) {\n meta.ledgerApiBaseUrl = status.network.ledgerApi.baseUrl;\n }\n if (status.session?.userId) {\n meta.userId = status.session.userId;\n }\n // accessToken is intentionally omitted — the SDK's encrypted-storage\n // layer is for it; adapter-level metadata is plain Record<string,string>.\n return meta;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/send-provider.ts","../src/send-adapter.ts"],"names":["WalletNotInstalledError","PartyLayerError","UserRejectedError","CapabilityNotSupportedError","TransportError","mapUnknownErrorToPartyLayerError","matchesProviderDetection","WALLET_ID","toWalletId","toPartyId","toSignature","toTransactionHash"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProviderDetection } from '@partylayer/core';\n\n/**\n * Send Canton Wallet extension IDs.\n *\n * Send's runtime-injected CIP-103 provider reports its identity at\n * `window.canton.request({ method: 'status' }).provider.id`. The value\n * observed in production differs from the public Chrome Web Store\n * listing ID, so both are listed here. New IDs (e.g., from rebrands or\n * separate distribution channels) can be appended to this list without\n * code changes elsewhere.\n */\nexport const SEND_PRODUCTION_EXTENSION_ID = 'lpnfhpbpmlobjlgkdmnjieeihjmihhjd';\nexport const SEND_LEGACY_EXTENSION_ID = 'ldmohiccoioolenadmogclhoklmanpgi';\n\nexport const SEND_KNOWN_EXTENSION_IDS = [\n SEND_PRODUCTION_EXTENSION_ID,\n SEND_LEGACY_EXTENSION_ID,\n] as const;\n\n/**\n * @deprecated Use SEND_PRODUCTION_EXTENSION_ID or SEND_KNOWN_EXTENSION_IDS.\n * Retained for backward source-compatibility with consumers that import\n * the old name. Will be removed in a future major.\n */\nexport const SEND_KERNEL_ID = SEND_LEGACY_EXTENSION_ID;\n\n/**\n * Built-in fallback detection patterns, mirroring the canonical Send\n * registry entry's `providerDetection`. Used when no registry entry is\n * injected at adapter construction time so adapter-only installs (no\n * registry fetch yet, or registry fetch failed) still recognise Send.\n *\n * Matchers are ordered: `provider.id` first (current production injection\n * shape — Send's status response has `{ connection, provider }`, not a\n * `kernel` field), then `kernel.*` fields (defensive — supports future\n * Send releases that may add a kernel field, and any non-Send wallet\n * that exposes kernel-shaped provider metadata at cantonwallet.com).\n *\n * If Send's identity signals change in the future, update both this\n * constant AND the registry entry — the registry is canonical, this is\n * the defensive mirror. The parity is verified by a test in\n * `send-adapter.test.ts`.\n */\nexport const SEND_BUILTIN_DETECTION: ProviderDetection = {\n transport: 'window.canton',\n matchers: [\n { field: 'provider.id', match: 'exact', values: [...SEND_KNOWN_EXTENSION_IDS] },\n { field: 'kernel.url', match: 'domain', value: 'cantonwallet.com' },\n { field: 'kernel.userUrl', match: 'domain', value: 'cantonwallet.com' },\n { field: 'kernel.id', match: 'exact', values: [...SEND_KNOWN_EXTENSION_IDS] },\n ],\n};\n\n/**\n * Network IDs Send currently supports. Send is mainnet-only as of v0.2.0.\n * Listed in Canton long-form so it stays distinguishable from PartyLayer's\n * generic 'mainnet' alias.\n */\nexport const SEND_SUPPORTED_NETWORKS = ['canton:mainnet'] as const;\n\nexport const SEND_INSTALL_URL = 'https://sigilry.org';\n\nexport const SEND_HOMEPAGE = 'https://cantonwallet.com';\n\nexport const SEND_DOCS_URL = 'https://sigilry.org';\n\n/**\n * Send signs every transaction via the WebAuthn PRF extension (passkey).\n * Surfaced through session metadata so dApps can adapt copy (\"approve in\n * Touch ID / Face ID prompt\") rather than show a generic \"open extension\"\n * hint.\n */\nexport const SEND_SIGNING_METHOD = 'webauthn-prf' as const;\n","/**\n * Send-specific error helpers.\n *\n * PartyLayer's `ErrorCode` union (in `@partylayer/core/errors.ts`) is the\n * canonical taxonomy. We do NOT introduce new codes here — instead, the\n * Send-specific error classes subclass the closest existing PartyLayer\n * error and carry the diagnostic detail (kernel id, RPC code) in\n * `details`. That way existing telemetry pipelines and `code`-based\n * branches in dApp code continue to work without modification.\n */\n\nimport {\n CapabilityNotSupportedError,\n PartyLayerError,\n TransportError,\n UserRejectedError,\n WalletNotInstalledError,\n mapUnknownErrorToPartyLayerError,\n type ErrorMappingContext,\n} from '@partylayer/core';\n\nimport { SEND_INSTALL_URL, SEND_KERNEL_ID } from './constants';\n\n/** JSON-RPC 2.0 + EIP-1193 error codes Sigilry surfaces. */\nexport const SendRpcErrorCode = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n USER_REJECTED: 4001,\n UNAUTHORIZED: 4100,\n UNSUPPORTED_METHOD: 4200,\n DISCONNECTED: 4900,\n CHAIN_DISCONNECTED: 4901,\n INVALID_INPUT: -32000,\n RESOURCE_NOT_FOUND: -32001,\n RESOURCE_UNAVAILABLE: -32002,\n TRANSACTION_REJECTED: -32003,\n METHOD_NOT_SUPPORTED: -32004,\n LIMIT_EXCEEDED: -32005,\n} as const;\n\nconst WALLET_ID = 'send';\n\n/**\n * Send isn't installed — `window.canton` is unavailable entirely.\n *\n * Subclasses `WalletNotInstalledError` so existing capability gates and\n * UI (\"install Send\") light up automatically. Carries the install URL in\n * `details` for one-click prompts.\n */\nexport class SendNotInstalledError extends WalletNotInstalledError {\n constructor(reason?: string) {\n super(\n WALLET_ID,\n reason ?? `Send Canton Wallet is not detected. Visit ${SEND_INSTALL_URL} for installation instructions`,\n );\n this.name = 'SendNotInstalledError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n installUrl: SEND_INSTALL_URL,\n };\n }\n}\n\n/**\n * `window.canton` is present but `kernel.id` does not match Send.\n *\n * Treated as \"Send not installed\" from the SDK's perspective so that\n * other adapters get a chance to claim the active provider — but the\n * runtime kernel id is preserved in `details` for diagnostics.\n *\n * The wording avoids the keywords \"rejected\"/\"denied\"/\"cancelled\" so\n * `mapUnknownErrorToPartyLayerError` won't silently rewrite this as a\n * `UserRejectedError` when re-thrown through error mapping.\n */\nexport class SendKernelMismatchError extends WalletNotInstalledError {\n constructor(actualKernelId: string) {\n super(\n WALLET_ID,\n `Another Canton wallet is active at window.canton (kernel.id=\"${actualKernelId}\", expected \"${SEND_KERNEL_ID}\"). The Send adapter will yield to the matching adapter.`,\n );\n this.name = 'SendKernelMismatchError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n actualKernelId,\n expectedKernelId: SEND_KERNEL_ID,\n };\n }\n}\n\n/**\n * Send's authentication backend (auth.cantonwallet.com) timed out or was\n * otherwise unreachable. This is an external, intermittent issue on\n * Send's side — not a PartyLayer issue, not a wallet-not-installed\n * issue, and not a user rejection. Surfaced as a typed error so the UI\n * can offer a \"Try again\" affordance + link to Send's status page.\n *\n * Subclasses `WalletNotInstalledError` to reuse the existing core error\n * code (`'WALLET_NOT_INSTALLED'`) without expanding the canonical\n * `ErrorCode` union — but the class identity (`name`) plus\n * `details.cause = 'send-auth-timeout'` give consumers enough signal to\n * route the retry UX without a code-level change.\n */\nexport class SendAuthTimeoutError extends WalletNotInstalledError {\n constructor(originalMessage?: string) {\n super(\n WALLET_ID,\n originalMessage ??\n 'Send authentication timed out. Please try again. ' +\n 'If the problem persists, see https://cantonwallet.com',\n );\n this.name = 'SendAuthTimeoutError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n cause: 'send-auth-timeout',\n retry: true,\n helpUrl: 'https://cantonwallet.com',\n ...(originalMessage ? { originalMessage } : {}),\n };\n }\n}\n\n/**\n * Recognise Send-side authentication-timeout signatures in arbitrary\n * error payloads. Covers the wording variants the Send wallet surfaces\n * today (the wallet UI itself uses both \"Authentication timed out\" and\n * \"Cannot reach authentication server\"; the underlying domain\n * `auth.cantonwallet.com` shows up in stack traces / fetch errors when\n * the network is at fault).\n */\nexport function detectSendAuthTimeout(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const raw = (err as { message?: unknown }).message;\n if (typeof raw !== 'string' || raw.length === 0) return false;\n const msg = raw.toLowerCase();\n return (\n msg.includes('authentication timed out') ||\n msg.includes('cannot reach authentication server') ||\n msg.includes('auth.cantonwallet.com')\n );\n}\n\ninterface SendRpcErrorLike {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport function isSendRpcError(err: unknown): err is SendRpcErrorLike {\n if (!err || typeof err !== 'object') return false;\n const candidate = err as { code?: unknown; message?: unknown };\n return typeof candidate.code === 'number' && typeof candidate.message === 'string';\n}\n\n/**\n * Translate a Sigilry RPC error to the closest PartyLayer error class.\n *\n * Falls back to `mapUnknownErrorToPartyLayerError` when the error doesn't\n * carry a recognisable JSON-RPC `code`. Note that `mapUnknownErrorToPartyLayerError`\n * itself rewrites messages containing \"rejected\"/\"denied\"/\"cancelled\" into\n * `UserRejectedError`, so we explicitly route the 4001 code first to make\n * the user-rejection path stable across wording changes in the wallet.\n */\nexport function mapSigilryError(\n err: unknown,\n context: ErrorMappingContext,\n): PartyLayerError {\n if (err instanceof PartyLayerError) return err;\n\n // Send-side auth-timeout takes priority over the generic RPC-code path\n // because the wallet sometimes wraps the timeout into a generic message\n // without a structured error code. Surfacing it as a typed error lets\n // the modal render a retry affordance.\n if (detectSendAuthTimeout(err)) {\n const original = err instanceof Error ? err.message : undefined;\n return new SendAuthTimeoutError(original);\n }\n\n if (isSendRpcError(err)) {\n const code = err.code;\n const message = err.message;\n\n if (code === SendRpcErrorCode.USER_REJECTED) {\n return new UserRejectedError(context.phase, {\n walletId: context.walletId,\n transport: context.transport,\n rpcCode: code,\n originalMessage: message,\n });\n }\n\n if (\n code === SendRpcErrorCode.UNSUPPORTED_METHOD ||\n code === SendRpcErrorCode.METHOD_NOT_FOUND ||\n code === SendRpcErrorCode.METHOD_NOT_SUPPORTED\n ) {\n return new CapabilityNotSupportedError(WALLET_ID, context.phase);\n }\n\n if (\n code === SendRpcErrorCode.DISCONNECTED ||\n code === SendRpcErrorCode.CHAIN_DISCONNECTED ||\n code === SendRpcErrorCode.UNAUTHORIZED\n ) {\n return new TransportError(message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n rpcCode: code,\n });\n }\n\n return new TransportError(message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n rpcCode: code,\n });\n }\n\n return mapUnknownErrorToPartyLayerError(err, context);\n}\n\n/**\n * Build a hint string when the developer passes a short-form Canton\n * template ID OR the legacy pre-Token-Standard `Amulet_Transfer` choice.\n *\n * Mirrors `loop-adapter.templateIdHint` so Send produces the same\n * actionable error text for the same payload bug class. Returns an empty\n * string when no problem is detected — callers can append this to a base\n * error message unconditionally.\n */\nexport function templateIdHint(payload: unknown): string {\n if (!payload || typeof payload !== 'object') return '';\n const commands = (payload as { commands?: unknown }).commands;\n if (!Array.isArray(commands)) return '';\n\n try {\n for (const cmd of commands as Array<Record<string, unknown>>) {\n const exercise = (cmd?.ExerciseCommand ?? cmd?.exerciseCommand ?? cmd?.exercise) as\n | Record<string, unknown>\n | undefined;\n const create = (cmd?.CreateCommand ?? cmd?.createCommand ?? cmd?.create) as\n | Record<string, unknown>\n | undefined;\n const raw = (exercise?.templateId ?? create?.templateId) as string | undefined;\n const choice = exercise?.choice as string | undefined;\n\n if (\n choice === 'Amulet_Transfer' &&\n typeof raw === 'string' &&\n raw.includes('Splice.Amulet:Amulet')\n ) {\n return (\n \" The command exercises 'Amulet_Transfer' directly on the Amulet template — that's the \" +\n 'legacy (pre-CIP-56) path Canton no longer accepts. Use the Token Standard flow: exercise ' +\n \"'TransferFactory_Transfer' by interface on a TransferFactory contract \" +\n \"(interfaceId '#splice-api-token-transfer-instruction-v1:Splice.Api.Token.TransferInstructionV1:TransferFactory'). \" +\n 'See https://partylayer.xyz/docs/token-transfers for the canonical flow.'\n );\n }\n\n if (typeof raw === 'string' && raw.length > 0 && !raw.startsWith('#')) {\n return (\n ` The command uses templateId=\"${raw}\" which is the short Canton form; Send requires ` +\n \"the fully-qualified Daml form (e.g. '#splice-amulet:Splice.Amulet:Amulet').\"\n );\n }\n }\n } catch {\n // best-effort; never throw from a hint helper\n }\n return '';\n}\n\n/**\n * Bound preview of an arbitrary value for inclusion in error messages.\n * Keeps logs small when a payload is large or contains binary blobs.\n */\nexport function safePreview(value: unknown, maxLen = 200): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n try {\n const s = JSON.stringify(value);\n if (typeof s !== 'string') return String(value);\n return s.length > maxLen ? s.slice(0, maxLen) + '...' : s;\n } catch {\n return String(value);\n }\n}\n","/**\n * Typed wrapper around the `window.canton` provider exposed by Send.\n *\n * Detection is **registry-driven** via `matchesProviderDetection`. The\n * adapter accepts an optional `ProviderDetection` rule set at construction\n * (sourced from the registry's `providerDetection` field for the Send\n * entry); when omitted, it falls back to `SEND_BUILTIN_DETECTION` which\n * mirrors the canonical registry rule. Every public RPC method goes\n * through `guardedRequest`, which checks the live `status` response\n * against those rules before forwarding the call. The result: if a\n * non-Send wallet is sitting at `window.canton`, every Send call resolves\n * to a `SendKernelMismatchError` (treated by the SDK as \"Send is not\n * installed\"), and Send only ever acts on its own provider.\n */\n\nimport { matchesProviderDetection, type ProviderDetection } from '@partylayer/core';\n\nimport { SEND_BUILTIN_DETECTION } from './constants';\nimport { SendKernelMismatchError, SendNotInstalledError } from './errors';\nimport type {\n SendAccount,\n SendCantonProvider,\n SendEventListener,\n SendEventName,\n SendLedgerApiRequest,\n SendLedgerApiResult,\n SendNetwork,\n SendPrepareExecuteAndWaitResult,\n SendPrepareSubmissionRequest,\n SendRpcMethod,\n SendRpcRequest,\n SendRpcResult,\n SendStatusResponse,\n} from './types';\n\nexport class SendProvider {\n private readonly detection: ProviderDetection;\n private cachedStatus: SendStatusResponse | null = null;\n\n /**\n * @param detection Optional. Used to match the running `window.canton`\n * provider against Send's identity. When omitted, falls back to\n * `SEND_BUILTIN_DETECTION` (canonical registry rule mirror).\n */\n constructor(detection?: ProviderDetection) {\n this.detection = detection ?? SEND_BUILTIN_DETECTION;\n }\n\n /**\n * True when `window.canton` is present AND its self-reported status\n * matches Send's detection rules. Performs an actual `status` round-trip\n * on first call and caches the response for subsequent ones.\n */\n async isInstalled(): Promise<boolean> {\n if (typeof window === 'undefined' || !window.canton) return false;\n try {\n const status = await this.fetchStatus();\n return matchesProviderDetection(status, this.detection);\n } catch {\n return false;\n }\n }\n\n /**\n * Synchronous best-effort presence check. Used for fast picker rendering\n * before any async status introspection. May report `true` for a\n * non-Send provider — callers must follow up with `isInstalled()` (or\n * any guarded request) before assuming Send is wired in.\n */\n isPotentiallyAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.canton;\n }\n\n /**\n * Read the cached `kernel.id` from the running provider, fetching status\n * on demand. Diagnostic helper kept public for back-compat — detection\n * itself no longer hinges on this single field.\n */\n async getKernelId(): Promise<string> {\n const status = await this.fetchStatus();\n const id = status?.kernel?.id;\n if (typeof id !== 'string' || id.length === 0) {\n throw new SendNotInstalledError(\n 'window.canton.status() did not return a kernel.id — provider is malformed.',\n );\n }\n return id;\n }\n\n /**\n * Read the latest cached status object. Resolves the underlying RPC on\n * demand if no cached value is present.\n */\n async getStatus(): Promise<SendStatusResponse> {\n return this.fetchStatus();\n }\n\n /**\n * Reset the cached status (e.g. after the user uninstalls and reinstalls\n * the extension, or you suspect kernel identity changed mid-session).\n * Kept under both names to avoid breaking existing test imports.\n */\n resetKernelCache(): void {\n this.cachedStatus = null;\n }\n resetStatusCache(): void {\n this.cachedStatus = null;\n }\n\n private async fetchStatus(): Promise<SendStatusResponse> {\n if (this.cachedStatus) return this.cachedStatus;\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n const provider = window.canton as SendCantonProvider;\n const status = (await provider.request({ method: 'status' })) as SendStatusResponse;\n this.cachedStatus = status;\n return status;\n }\n\n /** Internal — bypasses the detection guard. */\n private async rawRequest(args: { method: SendRpcMethod; params?: unknown }): Promise<unknown> {\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n const provider = window.canton as SendCantonProvider;\n return provider.request(args as SendRpcRequest<SendRpcMethod>);\n }\n\n /** Public dispatch — guards every call with a registry-driven detection check. */\n private async guardedRequest<M extends SendRpcMethod>(\n args: SendRpcRequest<M>,\n ): Promise<SendRpcResult<M>> {\n const status = await this.fetchStatus();\n if (!matchesProviderDetection(status, this.detection)) {\n const observedId = status?.kernel?.id ?? '<unknown>';\n throw new SendKernelMismatchError(observedId);\n }\n return this.rawRequest(args) as Promise<SendRpcResult<M>>;\n }\n\n // ── Sigilry RPC methods (every one is guarded) ─────────────────────────\n\n status(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'status' });\n }\n\n connect(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'connect' });\n }\n\n disconnect(): Promise<null> {\n return this.guardedRequest({ method: 'disconnect' });\n }\n\n isConnected(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'isConnected' });\n }\n\n getActiveNetwork(): Promise<SendNetwork> {\n return this.guardedRequest({ method: 'getActiveNetwork' });\n }\n\n listAccounts(): Promise<SendAccount[]> {\n return this.guardedRequest({ method: 'listAccounts' });\n }\n\n getPrimaryAccount(): Promise<SendAccount> {\n return this.guardedRequest({ method: 'getPrimaryAccount' });\n }\n\n signMessage(message: string): Promise<{ signature: string }> {\n return this.guardedRequest({ method: 'signMessage', params: { message } });\n }\n\n prepareExecute(params: SendPrepareSubmissionRequest): Promise<null> {\n return this.guardedRequest({ method: 'prepareExecute', params });\n }\n\n prepareExecuteAndWait(\n params: SendPrepareSubmissionRequest,\n ): Promise<SendPrepareExecuteAndWaitResult> {\n return this.guardedRequest({ method: 'prepareExecuteAndWait', params });\n }\n\n ledgerApi(req: SendLedgerApiRequest): Promise<SendLedgerApiResult> {\n return this.guardedRequest({ method: 'ledgerApi', params: req });\n }\n\n // ── Events ─────────────────────────────────────────────────────────────\n // No kernel guard here on purpose — by the time the dApp wires up an\n // event listener it has already gone through `connect()` (which IS\n // guarded), so we trust the binding.\n\n on(event: SendEventName, listener: SendEventListener): void {\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n window.canton.on(event, listener);\n }\n\n off(event: SendEventName, listener: SendEventListener): void {\n if (typeof window === 'undefined' || !window.canton) return;\n if (typeof window.canton.off === 'function') {\n window.canton.off(event, listener);\n return;\n }\n if (typeof window.canton.removeListener === 'function') {\n window.canton.removeListener(event, listener);\n }\n }\n}\n","/**\n * Send Canton Wallet adapter.\n *\n * Send is a passkey-based Canton wallet that exposes the splice-wallet-kernel\n * OpenRPC protocol at `window.canton`. Because the bare `window.canton` slot is shared with\n * other splice-spec wallets (e.g. Console-class), the adapter funnels\n * every request through `SendProvider.guardedRequest`, which verifies\n * the running provider's `kernel.id` matches Send's Chrome extension\n * ID before forwarding the call.\n *\n * Capability summary: connect / disconnect / restore / signMessage /\n * submitTransaction / ledgerApi / events / injected. `signTransaction`\n * is intentionally NOT declared — Send (like Loop and Nightly) fuses\n * sign-and-submit through `prepareExecute*`, so a standalone sign step\n * would only mislead callers.\n */\n\nimport {\n CapabilityNotSupportedError,\n TransportError,\n toPartyId,\n toSignature,\n toTransactionHash,\n toWalletId,\n type ProviderDetection,\n type AdapterConnectResult,\n type AdapterContext,\n type AdapterDetectResult,\n type AdapterEventName,\n type CapabilityKey,\n type LedgerApiParams,\n type LedgerApiResult,\n type PartyId,\n type PersistedSession,\n type Session,\n type SignMessageParams,\n type SignTransactionParams,\n type SignedMessage,\n type SignedTransaction,\n type SubmitTransactionParams,\n type TxReceipt,\n type WalletAdapter,\n} from '@partylayer/core';\n\nimport {\n SEND_INSTALL_URL,\n SEND_SIGNING_METHOD,\n} from './constants';\nimport {\n SendNotInstalledError,\n isSendRpcError,\n mapSigilryError,\n safePreview,\n templateIdHint,\n} from './errors';\nimport { SendProvider } from './send-provider';\nimport type {\n SendAccount,\n SendEventListener,\n SendPrepareSubmissionRequest,\n SendStatusResponse,\n SendTxChangedEvent,\n} from './types';\n\nconst WALLET_ID = 'send';\n\nconst SEND_CAPABILITIES: CapabilityKey[] = [\n 'connect',\n 'disconnect',\n 'restore',\n 'signMessage',\n 'submitTransaction',\n 'ledgerApi',\n 'events',\n 'injected',\n];\n\nexport class SendAdapter implements WalletAdapter {\n readonly walletId = toWalletId(WALLET_ID);\n readonly name = 'Send';\n\n private readonly provider: SendProvider;\n\n /**\n * @param options.detection Optional. When supplied, the adapter uses\n * these matcher rules to decide whether the running `window.canton`\n * belongs to Send. Inject this from the registry entry's\n * `providerDetection` field for canonical behaviour. Omitting it\n * falls back to the built-in pattern that mirrors the canonical\n * registry rule (parity is verified by tests).\n * @param options.provider Optional. Pre-built provider instance, used\n * primarily by tests; takes precedence over `options.detection`.\n */\n constructor(options?: { detection?: ProviderDetection; provider?: SendProvider }) {\n this.provider = options?.provider ?? new SendProvider(options?.detection);\n }\n\n getCapabilities(): CapabilityKey[] {\n return SEND_CAPABILITIES;\n }\n\n async detectInstalled(): Promise<AdapterDetectResult> {\n if (typeof window === 'undefined') {\n return { installed: false, reason: 'Browser environment required' };\n }\n if (!this.provider.isPotentiallyAvailable()) {\n return {\n installed: false,\n reason: `Send Canton Wallet not detected. Visit ${SEND_INSTALL_URL} for installation instructions`,\n };\n }\n const installed = await this.provider.isInstalled();\n if (installed) {\n return { installed: true, reason: 'Send Canton Wallet detected' };\n }\n return {\n installed: false,\n reason:\n 'window.canton is present but its kernel.id does not match Send. Another Canton wallet is active.',\n };\n }\n\n async connect(\n ctx: AdapterContext,\n _opts?: { timeoutMs?: number; partyId?: PartyId; preferInstalled?: boolean },\n ): Promise<AdapterConnectResult> {\n try {\n if (!this.provider.isPotentiallyAvailable()) {\n throw new SendNotInstalledError();\n }\n\n ctx.logger.debug('Connecting to Send Canton Wallet', {\n appName: ctx.appName,\n network: ctx.network,\n });\n\n const status = await this.provider.connect();\n const account = await this.provider.getPrimaryAccount();\n const partyId = toPartyId(account.partyId);\n\n ctx.logger.info('Connected to Send Canton Wallet', {\n partyId: account.partyId,\n signingProviderId: account.signingProviderId,\n kernelId: status.kernel?.id,\n });\n\n return {\n partyId,\n session: {\n walletId: this.walletId,\n network: ctx.network,\n createdAt: Date.now(),\n metadata: buildSessionMetadata(status, account),\n },\n capabilities: this.getCapabilities(),\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'connect',\n transport: 'injected',\n details: { origin: ctx.origin, network: ctx.network },\n });\n }\n }\n\n async disconnect(ctx: AdapterContext, _session: Session): Promise<void> {\n try {\n await this.provider.disconnect();\n } catch (err) {\n ctx.logger.warn('Error during Send wallet disconnect', err);\n }\n }\n\n async restore(ctx: AdapterContext, persisted: PersistedSession): Promise<Session | null> {\n try {\n if (typeof window === 'undefined') return null;\n if (!this.provider.isPotentiallyAvailable()) return null;\n if (persisted.expiresAt && Date.now() >= persisted.expiresAt) return null;\n\n // status() is a silent introspection call — no popup, no passkey\n // prompt — so we can use it as a \"still authorised?\" probe on page\n // reload. If the kernel.id has shifted (user installed another\n // wallet) the guarded request will throw `SendKernelMismatchError`\n // and we'll return null below.\n const status = await this.provider.status();\n if (!status.isConnected) return null;\n\n const account = await this.provider.getPrimaryAccount();\n if (account.partyId !== persisted.partyId) {\n ctx.logger.debug(\n 'Send primary account changed since session was persisted; treating as expired',\n {\n persistedPartyId: persisted.partyId,\n currentPartyId: account.partyId,\n },\n );\n return null;\n }\n\n ctx.logger.debug('Restored Send Canton Wallet session', {\n partyId: account.partyId,\n kernelId: status.kernel?.id,\n });\n\n return {\n ...persisted,\n walletId: this.walletId,\n metadata: {\n ...(persisted.metadata ?? {}),\n ...buildSessionMetadata(status, account),\n },\n };\n } catch (err) {\n ctx.logger.warn('Failed to restore Send wallet session', err);\n return null;\n }\n }\n\n async signMessage(\n ctx: AdapterContext,\n session: Session,\n params: SignMessageParams,\n ): Promise<SignedMessage> {\n try {\n if (typeof params.message !== 'string' || params.message.length === 0) {\n throw new Error('signMessage requires a non-empty string `message`');\n }\n\n ctx.logger.debug('Signing message with Send Canton Wallet', {\n sessionId: session.sessionId,\n messageLength: params.message.length,\n });\n\n const { signature } = await this.provider.signMessage(params.message);\n return {\n signature: toSignature(signature),\n partyId: session.partyId,\n message: params.message,\n nonce: params.nonce,\n domain: params.domain,\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'signMessage',\n transport: 'injected',\n details: { sessionId: session.sessionId },\n });\n }\n }\n\n async signTransaction(\n _ctx: AdapterContext,\n _session: Session,\n _params: SignTransactionParams,\n ): Promise<SignedTransaction> {\n throw new CapabilityNotSupportedError(\n this.walletId,\n 'signTransaction — Send fuses sign-and-submit through prepareExecuteAndWait. Use submitTransaction instead.',\n );\n }\n\n async submitTransaction(\n ctx: AdapterContext,\n session: Session,\n params: SubmitTransactionParams,\n ): Promise<TxReceipt> {\n const payload = params.signedTx as SendPrepareSubmissionRequest;\n try {\n if (!payload || typeof payload !== 'object') {\n throw new Error(\n 'submitTransaction requires a SendPrepareSubmissionRequest as `signedTx` ' +\n `(received ${safePreview(payload)})`,\n );\n }\n if (!payload.commands || typeof payload.commands !== 'object') {\n throw new Error(\n \"submitTransaction signedTx is missing the required 'commands' field \" +\n `(received ${safePreview(payload)})`,\n );\n }\n\n ctx.logger.debug('Submitting transaction via Send Canton Wallet', {\n sessionId: session.sessionId,\n commandId: payload.commandId,\n });\n\n const { tx } = await this.provider.prepareExecuteAndWait(payload);\n\n if (!tx || typeof tx !== 'object' || !tx.payload?.updateId) {\n throw new Error(\n 'Send returned an unexpected shape from prepareExecuteAndWait. ' +\n `Expected { tx: { commandId, status:'executed', payload: { updateId, completionOffset } } } ` +\n `but received ${safePreview(tx)}.`,\n );\n }\n\n return {\n transactionHash: toTransactionHash(tx.payload.updateId),\n submittedAt: Date.now(),\n commandId: tx.commandId,\n updateId: tx.payload.updateId,\n };\n } catch (err) {\n const baseHint = templateIdHint(payload);\n // For structured Sigilry RPC errors (e.g. user pressed cancel in\n // the passkey popup → code 4001) we want the canonical mapping\n // (`UserRejectedError`). For everything else, if we have a payload\n // hint, attach it directly via TransportError so the keyword-based\n // fallback in `mapUnknownErrorToPartyLayerError` doesn't replace\n // the message with a generic `User rejected …` string and lose\n // the actionable text.\n if (baseHint && !isSendRpcError(err)) {\n const baseMessage = err instanceof Error ? err.message : String(err);\n throw new TransportError(\n baseMessage + baseHint,\n err instanceof Error ? err : undefined,\n {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n sessionId: session.sessionId,\n commandId: payload?.commandId,\n },\n );\n }\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n details: { sessionId: session.sessionId, commandId: payload?.commandId },\n });\n }\n }\n\n async ledgerApi(\n ctx: AdapterContext,\n session: Session,\n params: LedgerApiParams,\n ): Promise<LedgerApiResult> {\n try {\n ctx.logger.debug('Proxying ledger API request via Send Canton Wallet', {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n });\n\n const result = await this.provider.ledgerApi({\n requestMethod: params.requestMethod,\n resource: params.resource,\n body: params.body,\n });\n\n // Send's contract is `{ response: string }` — preserve raw to match\n // PartyLayer's `LedgerApiResult` exactly. Defensive fallback if a\n // future wallet build returns a parsed object.\n if (result && typeof result.response === 'string') {\n return { response: result.response };\n }\n return { response: JSON.stringify(result ?? null) };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'ledgerApi',\n transport: 'injected',\n details: {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n },\n });\n }\n }\n\n /**\n * Subscribe to PartyLayer adapter events. Currently bridges only\n * `txStatus` from Send's native `txChanged` event. Other PartyLayer\n * adapter events (`connect` / `disconnect` / `sessionExpired` / `error`)\n * are emitted by the SDK itself, not the wallet, so we no-op them.\n */\n on(event: AdapterEventName, handler: (payload: unknown) => void): () => void {\n if (event !== 'txStatus') {\n return () => {\n /* nothing to unsubscribe */\n };\n }\n const listener: SendEventListener = (...args) => {\n const tx = args[0] as SendTxChangedEvent | undefined;\n if (!tx) return;\n handler({\n status: mapTxStatus(tx.status),\n commandId: tx.commandId,\n raw: tx,\n });\n };\n try {\n this.provider.on('txChanged', listener);\n } catch {\n return () => {\n /* provider unavailable — nothing to unsubscribe */\n };\n }\n return () => this.provider.off('txChanged', listener);\n }\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Translate Sigilry `txChanged` statuses into PartyLayer's\n * `TransactionStatus` taxonomy. Kept separate so tests can pin the mapping.\n */\nfunction mapTxStatus(\n status: SendTxChangedEvent['status'],\n): 'pending' | 'submitted' | 'committed' | 'failed' {\n switch (status) {\n case 'pending':\n return 'pending';\n case 'signed':\n return 'submitted';\n case 'executed':\n return 'committed';\n case 'failed':\n default:\n return 'failed';\n }\n}\n\n/**\n * Pack diagnostic + restore-relevant fields into the Session metadata\n * record. PartyLayer types `Session.metadata` as `Record<string, string>`,\n * so every value must be a string — we omit anything that's missing\n * rather than writing the literal string `\"undefined\"`.\n */\nfunction buildSessionMetadata(\n status: SendStatusResponse,\n account: SendAccount,\n): Record<string, string> {\n const meta: Record<string, string> = {\n kernelId: status.kernel?.id ?? '',\n signingProviderId: account.signingProviderId,\n signingMethod: SEND_SIGNING_METHOD,\n publicKey: account.publicKey,\n namespace: account.namespace,\n networkId: account.networkId,\n hint: account.hint,\n };\n if (status.network?.ledgerApi?.baseUrl) {\n meta.ledgerApiBaseUrl = status.network.ledgerApi.baseUrl;\n }\n if (status.session?.userId) {\n meta.userId = status.session.userId;\n }\n // accessToken is intentionally omitted — the SDK's encrypted-storage\n // layer is for it; adapter-level metadata is plain Record<string,string>.\n return meta;\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -3,13 +3,20 @@ import { WalletNotInstalledError, PartyLayerError, UserRejectedError, Capability
|
|
|
3
3
|
// src/send-adapter.ts
|
|
4
4
|
|
|
5
5
|
// src/constants.ts
|
|
6
|
-
var
|
|
6
|
+
var SEND_PRODUCTION_EXTENSION_ID = "lpnfhpbpmlobjlgkdmnjieeihjmihhjd";
|
|
7
|
+
var SEND_LEGACY_EXTENSION_ID = "ldmohiccoioolenadmogclhoklmanpgi";
|
|
8
|
+
var SEND_KNOWN_EXTENSION_IDS = [
|
|
9
|
+
SEND_PRODUCTION_EXTENSION_ID,
|
|
10
|
+
SEND_LEGACY_EXTENSION_ID
|
|
11
|
+
];
|
|
12
|
+
var SEND_KERNEL_ID = SEND_LEGACY_EXTENSION_ID;
|
|
7
13
|
var SEND_BUILTIN_DETECTION = {
|
|
8
14
|
transport: "window.canton",
|
|
9
15
|
matchers: [
|
|
16
|
+
{ field: "provider.id", match: "exact", values: [...SEND_KNOWN_EXTENSION_IDS] },
|
|
10
17
|
{ field: "kernel.url", match: "domain", value: "cantonwallet.com" },
|
|
11
18
|
{ field: "kernel.userUrl", match: "domain", value: "cantonwallet.com" },
|
|
12
|
-
{ field: "kernel.id", match: "exact", values: [
|
|
19
|
+
{ field: "kernel.id", match: "exact", values: [...SEND_KNOWN_EXTENSION_IDS] }
|
|
13
20
|
]
|
|
14
21
|
};
|
|
15
22
|
var SEND_SUPPORTED_NETWORKS = ["canton:mainnet"];
|
package/dist/index.mjs.map
CHANGED
|
@@ -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 * Chrome Web Store extension ID for Send Canton Wallet.\n *\n * Kept as a public export for diagnostics and back-compat (downstream\n * consumers still import this constant), but it is **not** the primary\n * detection signal anymore. Detection is registry-driven via\n * `SEND_BUILTIN_DETECTION` below; the kernel.id is one of three matchers\n * (the URL-domain matchers carry stable identity, including for\n * developer-mode builds whose kernel.id varies per install).\n */\nexport const SEND_KERNEL_ID = 'ldmohiccoioolenadmogclhoklmanpgi';\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 * 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: 'kernel.url', match: 'domain', value: 'cantonwallet.com' },\n { field: 'kernel.userUrl', match: 'domain', value: 'cantonwallet.com' },\n { field: 'kernel.id', match: 'exact', values: [SEND_KERNEL_ID] },\n ],\n};\n\n/**\n * Network IDs Send currently supports. Send is mainnet-only as of v0.2.0.\n * Listed in Canton long-form so it stays distinguishable from PartyLayer's\n * generic 'mainnet' alias.\n */\nexport const SEND_SUPPORTED_NETWORKS = ['canton:mainnet'] as const;\n\nexport const SEND_INSTALL_URL = 'https://sigilry.org';\n\nexport const SEND_HOMEPAGE = 'https://cantonwallet.com';\n\nexport const SEND_DOCS_URL = 'https://sigilry.org';\n\n/**\n * Send signs every transaction via the WebAuthn PRF extension (passkey).\n * Surfaced through session metadata so dApps can adapt copy (\"approve in\n * Touch ID / Face ID prompt\") rather than show a generic \"open extension\"\n * hint.\n */\nexport const SEND_SIGNING_METHOD = 'webauthn-prf' as const;\n","/**\n * Send-specific error helpers.\n *\n * PartyLayer's `ErrorCode` union (in `@partylayer/core/errors.ts`) is the\n * canonical taxonomy. We do NOT introduce new codes here — instead, the\n * Send-specific error classes subclass the closest existing PartyLayer\n * error and carry the diagnostic detail (kernel id, RPC code) in\n * `details`. That way existing telemetry pipelines and `code`-based\n * branches in dApp code continue to work without modification.\n */\n\nimport {\n CapabilityNotSupportedError,\n PartyLayerError,\n TransportError,\n UserRejectedError,\n WalletNotInstalledError,\n mapUnknownErrorToPartyLayerError,\n type ErrorMappingContext,\n} from '@partylayer/core';\n\nimport { SEND_INSTALL_URL, SEND_KERNEL_ID } from './constants';\n\n/** JSON-RPC 2.0 + EIP-1193 error codes Sigilry surfaces. */\nexport const SendRpcErrorCode = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n USER_REJECTED: 4001,\n UNAUTHORIZED: 4100,\n UNSUPPORTED_METHOD: 4200,\n DISCONNECTED: 4900,\n CHAIN_DISCONNECTED: 4901,\n INVALID_INPUT: -32000,\n RESOURCE_NOT_FOUND: -32001,\n RESOURCE_UNAVAILABLE: -32002,\n TRANSACTION_REJECTED: -32003,\n METHOD_NOT_SUPPORTED: -32004,\n LIMIT_EXCEEDED: -32005,\n} as const;\n\nconst WALLET_ID = 'send';\n\n/**\n * Send isn't installed — `window.canton` is unavailable entirely.\n *\n * Subclasses `WalletNotInstalledError` so existing capability gates and\n * UI (\"install Send\") light up automatically. Carries the install URL in\n * `details` for one-click prompts.\n */\nexport class SendNotInstalledError extends WalletNotInstalledError {\n constructor(reason?: string) {\n super(\n WALLET_ID,\n reason ?? `Send Canton Wallet is not detected. Visit ${SEND_INSTALL_URL} for installation instructions`,\n );\n this.name = 'SendNotInstalledError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n installUrl: SEND_INSTALL_URL,\n };\n }\n}\n\n/**\n * `window.canton` is present but `kernel.id` does not match Send.\n *\n * Treated as \"Send not installed\" from the SDK's perspective so that\n * other adapters get a chance to claim the active provider — but the\n * runtime kernel id is preserved in `details` for diagnostics.\n *\n * The wording avoids the keywords \"rejected\"/\"denied\"/\"cancelled\" so\n * `mapUnknownErrorToPartyLayerError` won't silently rewrite this as a\n * `UserRejectedError` when re-thrown through error mapping.\n */\nexport class SendKernelMismatchError extends WalletNotInstalledError {\n constructor(actualKernelId: string) {\n super(\n WALLET_ID,\n `Another Canton wallet is active at window.canton (kernel.id=\"${actualKernelId}\", expected \"${SEND_KERNEL_ID}\"). The Send adapter will yield to the matching adapter.`,\n );\n this.name = 'SendKernelMismatchError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n actualKernelId,\n expectedKernelId: SEND_KERNEL_ID,\n };\n }\n}\n\n/**\n * Send's authentication backend (auth.cantonwallet.com) timed out or was\n * otherwise unreachable. This is an external, intermittent issue on\n * Send's side — not a PartyLayer issue, not a wallet-not-installed\n * issue, and not a user rejection. Surfaced as a typed error so the UI\n * can offer a \"Try again\" affordance + link to Send's status page.\n *\n * Subclasses `WalletNotInstalledError` to reuse the existing core error\n * code (`'WALLET_NOT_INSTALLED'`) without expanding the canonical\n * `ErrorCode` union — but the class identity (`name`) plus\n * `details.cause = 'send-auth-timeout'` give consumers enough signal to\n * route the retry UX without a code-level change.\n */\nexport class SendAuthTimeoutError extends WalletNotInstalledError {\n constructor(originalMessage?: string) {\n super(\n WALLET_ID,\n originalMessage ??\n 'Send authentication timed out. Please try again. ' +\n 'If the problem persists, see https://cantonwallet.com',\n );\n this.name = 'SendAuthTimeoutError';\n (this as { details?: Record<string, unknown> }).details = {\n ...((this as { details?: Record<string, unknown> }).details ?? {}),\n cause: 'send-auth-timeout',\n retry: true,\n helpUrl: 'https://cantonwallet.com',\n ...(originalMessage ? { originalMessage } : {}),\n };\n }\n}\n\n/**\n * Recognise Send-side authentication-timeout signatures in arbitrary\n * error payloads. Covers the wording variants the Send wallet surfaces\n * today (the wallet UI itself uses both \"Authentication timed out\" and\n * \"Cannot reach authentication server\"; the underlying domain\n * `auth.cantonwallet.com` shows up in stack traces / fetch errors when\n * the network is at fault).\n */\nexport function detectSendAuthTimeout(err: unknown): boolean {\n if (!err || typeof err !== 'object') return false;\n const raw = (err as { message?: unknown }).message;\n if (typeof raw !== 'string' || raw.length === 0) return false;\n const msg = raw.toLowerCase();\n return (\n msg.includes('authentication timed out') ||\n msg.includes('cannot reach authentication server') ||\n msg.includes('auth.cantonwallet.com')\n );\n}\n\ninterface SendRpcErrorLike {\n code: number;\n message: string;\n data?: unknown;\n}\n\nexport function isSendRpcError(err: unknown): err is SendRpcErrorLike {\n if (!err || typeof err !== 'object') return false;\n const candidate = err as { code?: unknown; message?: unknown };\n return typeof candidate.code === 'number' && typeof candidate.message === 'string';\n}\n\n/**\n * Translate a Sigilry RPC error to the closest PartyLayer error class.\n *\n * Falls back to `mapUnknownErrorToPartyLayerError` when the error doesn't\n * carry a recognisable JSON-RPC `code`. Note that `mapUnknownErrorToPartyLayerError`\n * itself rewrites messages containing \"rejected\"/\"denied\"/\"cancelled\" into\n * `UserRejectedError`, so we explicitly route the 4001 code first to make\n * the user-rejection path stable across wording changes in the wallet.\n */\nexport function mapSigilryError(\n err: unknown,\n context: ErrorMappingContext,\n): PartyLayerError {\n if (err instanceof PartyLayerError) return err;\n\n // Send-side auth-timeout takes priority over the generic RPC-code path\n // because the wallet sometimes wraps the timeout into a generic message\n // without a structured error code. Surfacing it as a typed error lets\n // the modal render a retry affordance.\n if (detectSendAuthTimeout(err)) {\n const original = err instanceof Error ? err.message : undefined;\n return new SendAuthTimeoutError(original);\n }\n\n if (isSendRpcError(err)) {\n const code = err.code;\n const message = err.message;\n\n if (code === SendRpcErrorCode.USER_REJECTED) {\n return new UserRejectedError(context.phase, {\n walletId: context.walletId,\n transport: context.transport,\n rpcCode: code,\n originalMessage: message,\n });\n }\n\n if (\n code === SendRpcErrorCode.UNSUPPORTED_METHOD ||\n code === SendRpcErrorCode.METHOD_NOT_FOUND ||\n code === SendRpcErrorCode.METHOD_NOT_SUPPORTED\n ) {\n return new CapabilityNotSupportedError(WALLET_ID, context.phase);\n }\n\n if (\n code === SendRpcErrorCode.DISCONNECTED ||\n code === SendRpcErrorCode.CHAIN_DISCONNECTED ||\n code === SendRpcErrorCode.UNAUTHORIZED\n ) {\n return new TransportError(message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n rpcCode: code,\n });\n }\n\n return new TransportError(message, err, {\n walletId: context.walletId,\n phase: context.phase,\n transport: context.transport,\n rpcCode: code,\n });\n }\n\n return mapUnknownErrorToPartyLayerError(err, context);\n}\n\n/**\n * Build a hint string when the developer passes a short-form Canton\n * template ID OR the legacy pre-Token-Standard `Amulet_Transfer` choice.\n *\n * Mirrors `loop-adapter.templateIdHint` so Send produces the same\n * actionable error text for the same payload bug class. Returns an empty\n * string when no problem is detected — callers can append this to a base\n * error message unconditionally.\n */\nexport function templateIdHint(payload: unknown): string {\n if (!payload || typeof payload !== 'object') return '';\n const commands = (payload as { commands?: unknown }).commands;\n if (!Array.isArray(commands)) return '';\n\n try {\n for (const cmd of commands as Array<Record<string, unknown>>) {\n const exercise = (cmd?.ExerciseCommand ?? cmd?.exerciseCommand ?? cmd?.exercise) as\n | Record<string, unknown>\n | undefined;\n const create = (cmd?.CreateCommand ?? cmd?.createCommand ?? cmd?.create) as\n | Record<string, unknown>\n | undefined;\n const raw = (exercise?.templateId ?? create?.templateId) as string | undefined;\n const choice = exercise?.choice as string | undefined;\n\n if (\n choice === 'Amulet_Transfer' &&\n typeof raw === 'string' &&\n raw.includes('Splice.Amulet:Amulet')\n ) {\n return (\n \" The command exercises 'Amulet_Transfer' directly on the Amulet template — that's the \" +\n 'legacy (pre-CIP-56) path Canton no longer accepts. Use the Token Standard flow: exercise ' +\n \"'TransferFactory_Transfer' by interface on a TransferFactory contract \" +\n \"(interfaceId '#splice-api-token-transfer-instruction-v1:Splice.Api.Token.TransferInstructionV1:TransferFactory'). \" +\n 'See https://partylayer.xyz/docs/token-transfers for the canonical flow.'\n );\n }\n\n if (typeof raw === 'string' && raw.length > 0 && !raw.startsWith('#')) {\n return (\n ` The command uses templateId=\"${raw}\" which is the short Canton form; Send requires ` +\n \"the fully-qualified Daml form (e.g. '#splice-amulet:Splice.Amulet:Amulet').\"\n );\n }\n }\n } catch {\n // best-effort; never throw from a hint helper\n }\n return '';\n}\n\n/**\n * Bound preview of an arbitrary value for inclusion in error messages.\n * Keeps logs small when a payload is large or contains binary blobs.\n */\nexport function safePreview(value: unknown, maxLen = 200): string {\n if (value === undefined) return 'undefined';\n if (value === null) return 'null';\n try {\n const s = JSON.stringify(value);\n if (typeof s !== 'string') return String(value);\n return s.length > maxLen ? s.slice(0, maxLen) + '...' : s;\n } catch {\n return String(value);\n }\n}\n","/**\n * Typed wrapper around the `window.canton` provider exposed by Send.\n *\n * Detection is **registry-driven** via `matchesProviderDetection`. The\n * adapter accepts an optional `ProviderDetection` rule set at construction\n * (sourced from the registry's `providerDetection` field for the Send\n * entry); when omitted, it falls back to `SEND_BUILTIN_DETECTION` which\n * mirrors the canonical registry rule. Every public RPC method goes\n * through `guardedRequest`, which checks the live `status` response\n * against those rules before forwarding the call. The result: if a\n * non-Send wallet is sitting at `window.canton`, every Send call resolves\n * to a `SendKernelMismatchError` (treated by the SDK as \"Send is not\n * installed\"), and Send only ever acts on its own provider.\n */\n\nimport { matchesProviderDetection, type ProviderDetection } from '@partylayer/core';\n\nimport { SEND_BUILTIN_DETECTION } from './constants';\nimport { SendKernelMismatchError, SendNotInstalledError } from './errors';\nimport type {\n SendAccount,\n SendCantonProvider,\n SendEventListener,\n SendEventName,\n SendLedgerApiRequest,\n SendLedgerApiResult,\n SendNetwork,\n SendPrepareExecuteAndWaitResult,\n SendPrepareSubmissionRequest,\n SendRpcMethod,\n SendRpcRequest,\n SendRpcResult,\n SendStatusResponse,\n} from './types';\n\nexport class SendProvider {\n private readonly detection: ProviderDetection;\n private cachedStatus: SendStatusResponse | null = null;\n\n /**\n * @param detection Optional. Used to match the running `window.canton`\n * provider against Send's identity. When omitted, falls back to\n * `SEND_BUILTIN_DETECTION` (canonical registry rule mirror).\n */\n constructor(detection?: ProviderDetection) {\n this.detection = detection ?? SEND_BUILTIN_DETECTION;\n }\n\n /**\n * True when `window.canton` is present AND its self-reported status\n * matches Send's detection rules. Performs an actual `status` round-trip\n * on first call and caches the response for subsequent ones.\n */\n async isInstalled(): Promise<boolean> {\n if (typeof window === 'undefined' || !window.canton) return false;\n try {\n const status = await this.fetchStatus();\n return matchesProviderDetection(status, this.detection);\n } catch {\n return false;\n }\n }\n\n /**\n * Synchronous best-effort presence check. Used for fast picker rendering\n * before any async status introspection. May report `true` for a\n * non-Send provider — callers must follow up with `isInstalled()` (or\n * any guarded request) before assuming Send is wired in.\n */\n isPotentiallyAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.canton;\n }\n\n /**\n * Read the cached `kernel.id` from the running provider, fetching status\n * on demand. Diagnostic helper kept public for back-compat — detection\n * itself no longer hinges on this single field.\n */\n async getKernelId(): Promise<string> {\n const status = await this.fetchStatus();\n const id = status?.kernel?.id;\n if (typeof id !== 'string' || id.length === 0) {\n throw new SendNotInstalledError(\n 'window.canton.status() did not return a kernel.id — provider is malformed.',\n );\n }\n return id;\n }\n\n /**\n * Read the latest cached status object. Resolves the underlying RPC on\n * demand if no cached value is present.\n */\n async getStatus(): Promise<SendStatusResponse> {\n return this.fetchStatus();\n }\n\n /**\n * Reset the cached status (e.g. after the user uninstalls and reinstalls\n * the extension, or you suspect kernel identity changed mid-session).\n * Kept under both names to avoid breaking existing test imports.\n */\n resetKernelCache(): void {\n this.cachedStatus = null;\n }\n resetStatusCache(): void {\n this.cachedStatus = null;\n }\n\n private async fetchStatus(): Promise<SendStatusResponse> {\n if (this.cachedStatus) return this.cachedStatus;\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n const provider = window.canton as SendCantonProvider;\n const status = (await provider.request({ method: 'status' })) as SendStatusResponse;\n this.cachedStatus = status;\n return status;\n }\n\n /** Internal — bypasses the detection guard. */\n private async rawRequest(args: { method: SendRpcMethod; params?: unknown }): Promise<unknown> {\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n const provider = window.canton as SendCantonProvider;\n return provider.request(args as SendRpcRequest<SendRpcMethod>);\n }\n\n /** Public dispatch — guards every call with a registry-driven detection check. */\n private async guardedRequest<M extends SendRpcMethod>(\n args: SendRpcRequest<M>,\n ): Promise<SendRpcResult<M>> {\n const status = await this.fetchStatus();\n if (!matchesProviderDetection(status, this.detection)) {\n const observedId = status?.kernel?.id ?? '<unknown>';\n throw new SendKernelMismatchError(observedId);\n }\n return this.rawRequest(args) as Promise<SendRpcResult<M>>;\n }\n\n // ── Sigilry RPC methods (every one is guarded) ─────────────────────────\n\n status(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'status' });\n }\n\n connect(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'connect' });\n }\n\n disconnect(): Promise<null> {\n return this.guardedRequest({ method: 'disconnect' });\n }\n\n isConnected(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'isConnected' });\n }\n\n getActiveNetwork(): Promise<SendNetwork> {\n return this.guardedRequest({ method: 'getActiveNetwork' });\n }\n\n listAccounts(): Promise<SendAccount[]> {\n return this.guardedRequest({ method: 'listAccounts' });\n }\n\n getPrimaryAccount(): Promise<SendAccount> {\n return this.guardedRequest({ method: 'getPrimaryAccount' });\n }\n\n signMessage(message: string): Promise<{ signature: string }> {\n return this.guardedRequest({ method: 'signMessage', params: { message } });\n }\n\n prepareExecute(params: SendPrepareSubmissionRequest): Promise<null> {\n return this.guardedRequest({ method: 'prepareExecute', params });\n }\n\n prepareExecuteAndWait(\n params: SendPrepareSubmissionRequest,\n ): Promise<SendPrepareExecuteAndWaitResult> {\n return this.guardedRequest({ method: 'prepareExecuteAndWait', params });\n }\n\n ledgerApi(req: SendLedgerApiRequest): Promise<SendLedgerApiResult> {\n return this.guardedRequest({ method: 'ledgerApi', params: req });\n }\n\n // ── Events ─────────────────────────────────────────────────────────────\n // No kernel guard here on purpose — by the time the dApp wires up an\n // event listener it has already gone through `connect()` (which IS\n // guarded), so we trust the binding.\n\n on(event: SendEventName, listener: SendEventListener): void {\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n window.canton.on(event, listener);\n }\n\n off(event: SendEventName, listener: SendEventListener): void {\n if (typeof window === 'undefined' || !window.canton) return;\n if (typeof window.canton.off === 'function') {\n window.canton.off(event, listener);\n return;\n }\n if (typeof window.canton.removeListener === 'function') {\n window.canton.removeListener(event, listener);\n }\n }\n}\n","/**\n * Send Canton Wallet adapter.\n *\n * Send is a passkey-based Canton wallet that exposes the splice-wallet-kernel\n * OpenRPC protocol at `window.canton`. Because the bare `window.canton` slot is shared with\n * other splice-spec wallets (e.g. Console-class), the adapter funnels\n * every request through `SendProvider.guardedRequest`, which verifies\n * the running provider's `kernel.id` matches Send's Chrome extension\n * ID before forwarding the call.\n *\n * Capability summary: connect / disconnect / restore / signMessage /\n * submitTransaction / ledgerApi / events / injected. `signTransaction`\n * is intentionally NOT declared — Send (like Loop and Nightly) fuses\n * sign-and-submit through `prepareExecute*`, so a standalone sign step\n * would only mislead callers.\n */\n\nimport {\n CapabilityNotSupportedError,\n TransportError,\n toPartyId,\n toSignature,\n toTransactionHash,\n toWalletId,\n type ProviderDetection,\n type AdapterConnectResult,\n type AdapterContext,\n type AdapterDetectResult,\n type AdapterEventName,\n type CapabilityKey,\n type LedgerApiParams,\n type LedgerApiResult,\n type PartyId,\n type PersistedSession,\n type Session,\n type SignMessageParams,\n type SignTransactionParams,\n type SignedMessage,\n type SignedTransaction,\n type SubmitTransactionParams,\n type TxReceipt,\n type WalletAdapter,\n} from '@partylayer/core';\n\nimport {\n SEND_INSTALL_URL,\n SEND_SIGNING_METHOD,\n} from './constants';\nimport {\n SendNotInstalledError,\n isSendRpcError,\n mapSigilryError,\n safePreview,\n templateIdHint,\n} from './errors';\nimport { SendProvider } from './send-provider';\nimport type {\n SendAccount,\n SendEventListener,\n SendPrepareSubmissionRequest,\n SendStatusResponse,\n SendTxChangedEvent,\n} from './types';\n\nconst WALLET_ID = 'send';\n\nconst SEND_CAPABILITIES: CapabilityKey[] = [\n 'connect',\n 'disconnect',\n 'restore',\n 'signMessage',\n 'submitTransaction',\n 'ledgerApi',\n 'events',\n 'injected',\n];\n\nexport class SendAdapter implements WalletAdapter {\n readonly walletId = toWalletId(WALLET_ID);\n readonly name = 'Send';\n\n private readonly provider: SendProvider;\n\n /**\n * @param options.detection Optional. When supplied, the adapter uses\n * these matcher rules to decide whether the running `window.canton`\n * belongs to Send. Inject this from the registry entry's\n * `providerDetection` field for canonical behaviour. Omitting it\n * falls back to the built-in pattern that mirrors the canonical\n * registry rule (parity is verified by tests).\n * @param options.provider Optional. Pre-built provider instance, used\n * primarily by tests; takes precedence over `options.detection`.\n */\n constructor(options?: { detection?: ProviderDetection; provider?: SendProvider }) {\n this.provider = options?.provider ?? new SendProvider(options?.detection);\n }\n\n getCapabilities(): CapabilityKey[] {\n return SEND_CAPABILITIES;\n }\n\n async detectInstalled(): Promise<AdapterDetectResult> {\n if (typeof window === 'undefined') {\n return { installed: false, reason: 'Browser environment required' };\n }\n if (!this.provider.isPotentiallyAvailable()) {\n return {\n installed: false,\n reason: `Send Canton Wallet not detected. Visit ${SEND_INSTALL_URL} for installation instructions`,\n };\n }\n const installed = await this.provider.isInstalled();\n if (installed) {\n return { installed: true, reason: 'Send Canton Wallet detected' };\n }\n return {\n installed: false,\n reason:\n 'window.canton is present but its kernel.id does not match Send. Another Canton wallet is active.',\n };\n }\n\n async connect(\n ctx: AdapterContext,\n _opts?: { timeoutMs?: number; partyId?: PartyId; preferInstalled?: boolean },\n ): Promise<AdapterConnectResult> {\n try {\n if (!this.provider.isPotentiallyAvailable()) {\n throw new SendNotInstalledError();\n }\n\n ctx.logger.debug('Connecting to Send Canton Wallet', {\n appName: ctx.appName,\n network: ctx.network,\n });\n\n const status = await this.provider.connect();\n const account = await this.provider.getPrimaryAccount();\n const partyId = toPartyId(account.partyId);\n\n ctx.logger.info('Connected to Send Canton Wallet', {\n partyId: account.partyId,\n signingProviderId: account.signingProviderId,\n kernelId: status.kernel?.id,\n });\n\n return {\n partyId,\n session: {\n walletId: this.walletId,\n network: ctx.network,\n createdAt: Date.now(),\n metadata: buildSessionMetadata(status, account),\n },\n capabilities: this.getCapabilities(),\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'connect',\n transport: 'injected',\n details: { origin: ctx.origin, network: ctx.network },\n });\n }\n }\n\n async disconnect(ctx: AdapterContext, _session: Session): Promise<void> {\n try {\n await this.provider.disconnect();\n } catch (err) {\n ctx.logger.warn('Error during Send wallet disconnect', err);\n }\n }\n\n async restore(ctx: AdapterContext, persisted: PersistedSession): Promise<Session | null> {\n try {\n if (typeof window === 'undefined') return null;\n if (!this.provider.isPotentiallyAvailable()) return null;\n if (persisted.expiresAt && Date.now() >= persisted.expiresAt) return null;\n\n // status() is a silent introspection call — no popup, no passkey\n // prompt — so we can use it as a \"still authorised?\" probe on page\n // reload. If the kernel.id has shifted (user installed another\n // wallet) the guarded request will throw `SendKernelMismatchError`\n // and we'll return null below.\n const status = await this.provider.status();\n if (!status.isConnected) return null;\n\n const account = await this.provider.getPrimaryAccount();\n if (account.partyId !== persisted.partyId) {\n ctx.logger.debug(\n 'Send primary account changed since session was persisted; treating as expired',\n {\n persistedPartyId: persisted.partyId,\n currentPartyId: account.partyId,\n },\n );\n return null;\n }\n\n ctx.logger.debug('Restored Send Canton Wallet session', {\n partyId: account.partyId,\n kernelId: status.kernel?.id,\n });\n\n return {\n ...persisted,\n walletId: this.walletId,\n metadata: {\n ...(persisted.metadata ?? {}),\n ...buildSessionMetadata(status, account),\n },\n };\n } catch (err) {\n ctx.logger.warn('Failed to restore Send wallet session', err);\n return null;\n }\n }\n\n async signMessage(\n ctx: AdapterContext,\n session: Session,\n params: SignMessageParams,\n ): Promise<SignedMessage> {\n try {\n if (typeof params.message !== 'string' || params.message.length === 0) {\n throw new Error('signMessage requires a non-empty string `message`');\n }\n\n ctx.logger.debug('Signing message with Send Canton Wallet', {\n sessionId: session.sessionId,\n messageLength: params.message.length,\n });\n\n const { signature } = await this.provider.signMessage(params.message);\n return {\n signature: toSignature(signature),\n partyId: session.partyId,\n message: params.message,\n nonce: params.nonce,\n domain: params.domain,\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'signMessage',\n transport: 'injected',\n details: { sessionId: session.sessionId },\n });\n }\n }\n\n async signTransaction(\n _ctx: AdapterContext,\n _session: Session,\n _params: SignTransactionParams,\n ): Promise<SignedTransaction> {\n throw new CapabilityNotSupportedError(\n this.walletId,\n 'signTransaction — Send fuses sign-and-submit through prepareExecuteAndWait. Use submitTransaction instead.',\n );\n }\n\n async submitTransaction(\n ctx: AdapterContext,\n session: Session,\n params: SubmitTransactionParams,\n ): Promise<TxReceipt> {\n const payload = params.signedTx as SendPrepareSubmissionRequest;\n try {\n if (!payload || typeof payload !== 'object') {\n throw new Error(\n 'submitTransaction requires a SendPrepareSubmissionRequest as `signedTx` ' +\n `(received ${safePreview(payload)})`,\n );\n }\n if (!payload.commands || typeof payload.commands !== 'object') {\n throw new Error(\n \"submitTransaction signedTx is missing the required 'commands' field \" +\n `(received ${safePreview(payload)})`,\n );\n }\n\n ctx.logger.debug('Submitting transaction via Send Canton Wallet', {\n sessionId: session.sessionId,\n commandId: payload.commandId,\n });\n\n const { tx } = await this.provider.prepareExecuteAndWait(payload);\n\n if (!tx || typeof tx !== 'object' || !tx.payload?.updateId) {\n throw new Error(\n 'Send returned an unexpected shape from prepareExecuteAndWait. ' +\n `Expected { tx: { commandId, status:'executed', payload: { updateId, completionOffset } } } ` +\n `but received ${safePreview(tx)}.`,\n );\n }\n\n return {\n transactionHash: toTransactionHash(tx.payload.updateId),\n submittedAt: Date.now(),\n commandId: tx.commandId,\n updateId: tx.payload.updateId,\n };\n } catch (err) {\n const baseHint = templateIdHint(payload);\n // For structured Sigilry RPC errors (e.g. user pressed cancel in\n // the passkey popup → code 4001) we want the canonical mapping\n // (`UserRejectedError`). For everything else, if we have a payload\n // hint, attach it directly via TransportError so the keyword-based\n // fallback in `mapUnknownErrorToPartyLayerError` doesn't replace\n // the message with a generic `User rejected …` string and lose\n // the actionable text.\n if (baseHint && !isSendRpcError(err)) {\n const baseMessage = err instanceof Error ? err.message : String(err);\n throw new TransportError(\n baseMessage + baseHint,\n err instanceof Error ? err : undefined,\n {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n sessionId: session.sessionId,\n commandId: payload?.commandId,\n },\n );\n }\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n details: { sessionId: session.sessionId, commandId: payload?.commandId },\n });\n }\n }\n\n async ledgerApi(\n ctx: AdapterContext,\n session: Session,\n params: LedgerApiParams,\n ): Promise<LedgerApiResult> {\n try {\n ctx.logger.debug('Proxying ledger API request via Send Canton Wallet', {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n });\n\n const result = await this.provider.ledgerApi({\n requestMethod: params.requestMethod,\n resource: params.resource,\n body: params.body,\n });\n\n // Send's contract is `{ response: string }` — preserve raw to match\n // PartyLayer's `LedgerApiResult` exactly. Defensive fallback if a\n // future wallet build returns a parsed object.\n if (result && typeof result.response === 'string') {\n return { response: result.response };\n }\n return { response: JSON.stringify(result ?? null) };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'ledgerApi',\n transport: 'injected',\n details: {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n },\n });\n }\n }\n\n /**\n * Subscribe to PartyLayer adapter events. Currently bridges only\n * `txStatus` from Send's native `txChanged` event. Other PartyLayer\n * adapter events (`connect` / `disconnect` / `sessionExpired` / `error`)\n * are emitted by the SDK itself, not the wallet, so we no-op them.\n */\n on(event: AdapterEventName, handler: (payload: unknown) => void): () => void {\n if (event !== 'txStatus') {\n return () => {\n /* nothing to unsubscribe */\n };\n }\n const listener: SendEventListener = (...args) => {\n const tx = args[0] as SendTxChangedEvent | undefined;\n if (!tx) return;\n handler({\n status: mapTxStatus(tx.status),\n commandId: tx.commandId,\n raw: tx,\n });\n };\n try {\n this.provider.on('txChanged', listener);\n } catch {\n return () => {\n /* provider unavailable — nothing to unsubscribe */\n };\n }\n return () => this.provider.off('txChanged', listener);\n }\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Translate Sigilry `txChanged` statuses into PartyLayer's\n * `TransactionStatus` taxonomy. Kept separate so tests can pin the mapping.\n */\nfunction mapTxStatus(\n status: SendTxChangedEvent['status'],\n): 'pending' | 'submitted' | 'committed' | 'failed' {\n switch (status) {\n case 'pending':\n return 'pending';\n case 'signed':\n return 'submitted';\n case 'executed':\n return 'committed';\n case 'failed':\n default:\n return 'failed';\n }\n}\n\n/**\n * Pack diagnostic + restore-relevant fields into the Session metadata\n * record. PartyLayer types `Session.metadata` as `Record<string, string>`,\n * so every value must be a string — we omit anything that's missing\n * rather than writing the literal string `\"undefined\"`.\n */\nfunction buildSessionMetadata(\n status: SendStatusResponse,\n account: SendAccount,\n): Record<string, string> {\n const meta: Record<string, string> = {\n kernelId: status.kernel?.id ?? '',\n signingProviderId: account.signingProviderId,\n signingMethod: SEND_SIGNING_METHOD,\n publicKey: account.publicKey,\n namespace: account.namespace,\n networkId: account.networkId,\n hint: account.hint,\n };\n if (status.network?.ledgerApi?.baseUrl) {\n meta.ledgerApiBaseUrl = status.network.ledgerApi.baseUrl;\n }\n if (status.session?.userId) {\n meta.userId = status.session.userId;\n }\n // accessToken is intentionally omitted — the SDK's encrypted-storage\n // layer is for it; adapter-level metadata is plain Record<string,string>.\n return meta;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/send-provider.ts","../src/send-adapter.ts"],"names":["WALLET_ID","CapabilityNotSupportedError","TransportError"],"mappings":";;;;;AAYO,IAAM,4BAAA,GAA+B,kCAAA;AACrC,IAAM,wBAAA,GAA2B,kCAAA;AAEjC,IAAM,wBAAA,GAA2B;AAAA,EACtC,4BAAA;AAAA,EACA;AACF,CAAA;AAOO,IAAM,cAAA,GAAiB;AAmBvB,IAAM,sBAAA,GAA4C;AAAA,EACvD,SAAA,EAAW,eAAA;AAAA,EACX,QAAA,EAAU;AAAA,IACR,EAAE,OAAO,aAAA,EAAe,KAAA,EAAO,SAAS,MAAA,EAAQ,CAAC,GAAG,wBAAwB,CAAA,EAAE;AAAA,IAC9E,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,QAAA,EAAU,OAAO,kBAAA,EAAmB;AAAA,IAClE,EAAE,KAAA,EAAO,gBAAA,EAAkB,KAAA,EAAO,QAAA,EAAU,OAAO,kBAAA,EAAmB;AAAA,IACtE,EAAE,OAAO,WAAA,EAAa,KAAA,EAAO,SAAS,MAAA,EAAQ,CAAC,GAAG,wBAAwB,CAAA;AAAE;AAEhF,CAAA;AAOO,IAAM,uBAAA,GAA0B,CAAC,gBAAgB;AAEjD,IAAM,gBAAA,GAAmB;AAEzB,IAAM,aAAA,GAAgB;AAEtB,IAAM,aAAA,GAAgB;AAQtB,IAAM,mBAAA,GAAsB;ACjD5B,IAAM,gBAAA,GAAmB;AAAA,EAC9B,WAAA,EAAa,MAAA;AAAA,EACb,eAAA,EAAiB,MAAA;AAAA,EACjB,gBAAA,EAAkB,MAAA;AAAA,EAClB,cAAA,EAAgB,MAAA;AAAA,EAChB,cAAA,EAAgB,MAAA;AAAA,EAChB,aAAA,EAAe,IAAA;AAAA,EACf,YAAA,EAAc,IAAA;AAAA,EACd,kBAAA,EAAoB,IAAA;AAAA,EACpB,YAAA,EAAc,IAAA;AAAA,EACd,kBAAA,EAAoB,IAAA;AAAA,EACpB,aAAA,EAAe,KAAA;AAAA,EACf,kBAAA,EAAoB,MAAA;AAAA,EACpB,oBAAA,EAAsB,MAAA;AAAA,EACtB,oBAAA,EAAsB,MAAA;AAAA,EACtB,oBAAA,EAAsB,MAAA;AAAA,EACtB,cAAA,EAAgB;AAClB;AAEA,IAAM,SAAA,GAAY,MAAA;AASX,IAAM,qBAAA,GAAN,cAAoC,uBAAA,CAAwB;AAAA,EACjE,YAAY,MAAA,EAAiB;AAC3B,IAAA,KAAA;AAAA,MACE,SAAA;AAAA,MACA,MAAA,IAAU,6CAA6C,gBAAgB,CAAA,8BAAA;AAAA,KACzE;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,uBAAA;AACZ,IAAC,KAA+C,OAAA,GAAU;AAAA,MACxD,GAAK,IAAA,CAA+C,OAAA,IAAW,EAAC;AAAA,MAChE,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AACF;AAaO,IAAM,uBAAA,GAAN,cAAsC,uBAAA,CAAwB;AAAA,EACnE,YAAY,cAAA,EAAwB;AAClC,IAAA,KAAA;AAAA,MACE,SAAA;AAAA,MACA,CAAA,6DAAA,EAAgE,cAAc,CAAA,aAAA,EAAgB,cAAc,CAAA,wDAAA;AAAA,KAC9G;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,yBAAA;AACZ,IAAC,KAA+C,OAAA,GAAU;AAAA,MACxD,GAAK,IAAA,CAA+C,OAAA,IAAW,EAAC;AAAA,MAChE,cAAA;AAAA,MACA,gBAAA,EAAkB;AAAA,KACpB;AAAA,EACF;AACF;AAeO,IAAM,oBAAA,GAAN,cAAmC,uBAAA,CAAwB;AAAA,EAChE,YAAY,eAAA,EAA0B;AACpC,IAAA,KAAA;AAAA,MACE,SAAA;AAAA,MACA,eAAA,IACE;AAAA,KAEJ;AACA,IAAA,IAAA,CAAK,IAAA,GAAO,sBAAA;AACZ,IAAC,KAA+C,OAAA,GAAU;AAAA,MACxD,GAAK,IAAA,CAA+C,OAAA,IAAW,EAAC;AAAA,MAChE,KAAA,EAAO,mBAAA;AAAA,MACP,KAAA,EAAO,IAAA;AAAA,MACP,OAAA,EAAS,0BAAA;AAAA,MACT,GAAI,eAAA,GAAkB,EAAE,eAAA,KAAoB;AAAC,KAC/C;AAAA,EACF;AACF;AAUO,SAAS,sBAAsB,GAAA,EAAuB;AAC3D,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,MAAM,MAAO,GAAA,CAA8B,OAAA;AAC3C,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,MAAA,KAAW,GAAG,OAAO,KAAA;AACxD,EAAA,MAAM,GAAA,GAAM,IAAI,WAAA,EAAY;AAC5B,EAAA,OACE,GAAA,CAAI,QAAA,CAAS,0BAA0B,CAAA,IACvC,GAAA,CAAI,SAAS,oCAAoC,CAAA,IACjD,GAAA,CAAI,QAAA,CAAS,uBAAuB,CAAA;AAExC;AAQO,SAAS,eAAe,GAAA,EAAuC;AACpE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,KAAA;AAC5C,EAAA,MAAM,SAAA,GAAY,GAAA;AAClB,EAAA,OAAO,OAAO,SAAA,CAAU,IAAA,KAAS,QAAA,IAAY,OAAO,UAAU,OAAA,KAAY,QAAA;AAC5E;AAWO,SAAS,eAAA,CACd,KACA,OAAA,EACiB;AACjB,EAAA,IAAI,GAAA,YAAe,iBAAiB,OAAO,GAAA;AAM3C,EAAA,IAAI,qBAAA,CAAsB,GAAG,CAAA,EAAG;AAC9B,IAAA,MAAM,QAAA,GAAW,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,MAAA;AACtD,IAAA,OAAO,IAAI,qBAAqB,QAAQ,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,cAAA,CAAe,GAAG,CAAA,EAAG;AACvB,IAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,IAAA,MAAM,UAAU,GAAA,CAAI,OAAA;AAEpB,IAAA,IAAI,IAAA,KAAS,iBAAiB,aAAA,EAAe;AAC3C,MAAA,OAAO,IAAI,iBAAA,CAAkB,OAAA,CAAQ,KAAA,EAAO;AAAA,QAC1C,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,OAAA,EAAS,IAAA;AAAA,QACT,eAAA,EAAiB;AAAA,OAClB,CAAA;AAAA,IACH;AAEA,IAAA,IACE,IAAA,KAAS,iBAAiB,kBAAA,IAC1B,IAAA,KAAS,iBAAiB,gBAAA,IAC1B,IAAA,KAAS,iBAAiB,oBAAA,EAC1B;AACA,MAAA,OAAO,IAAI,2BAAA,CAA4B,SAAA,EAAW,OAAA,CAAQ,KAAK,CAAA;AAAA,IACjE;AAEA,IAAA,IACE,IAAA,KAAS,iBAAiB,YAAA,IAC1B,IAAA,KAAS,iBAAiB,kBAAA,IAC1B,IAAA,KAAS,iBAAiB,YAAA,EAC1B;AACA,MAAA,OAAO,IAAI,cAAA,CAAe,OAAA,EAAS,GAAA,EAAK;AAAA,QACtC,UAAU,OAAA,CAAQ,QAAA;AAAA,QAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,QACf,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,OAAA,EAAS;AAAA,OACV,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAI,cAAA,CAAe,OAAA,EAAS,GAAA,EAAK;AAAA,MACtC,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,gCAAA,CAAiC,KAAK,OAAO,CAAA;AACtD;AAWO,SAAS,eAAe,OAAA,EAA0B;AACvD,EAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,UAAU,OAAO,EAAA;AACpD,EAAA,MAAM,WAAY,OAAA,CAAmC,QAAA;AACrD,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,GAAG,OAAO,EAAA;AAErC,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,OAAO,QAAA,EAA4C;AAC5D,MAAA,MAAM,QAAA,GAAY,GAAA,EAAK,eAAA,IAAmB,GAAA,EAAK,mBAAmB,GAAA,EAAK,QAAA;AAGvE,MAAA,MAAM,MAAA,GAAU,GAAA,EAAK,aAAA,IAAiB,GAAA,EAAK,iBAAiB,GAAA,EAAK,MAAA;AAGjE,MAAA,MAAM,GAAA,GAAO,QAAA,EAAU,UAAA,IAAc,MAAA,EAAQ,UAAA;AAC7C,MAAA,MAAM,SAAS,QAAA,EAAU,MAAA;AAEzB,MAAA,IACE,MAAA,KAAW,qBACX,OAAO,GAAA,KAAQ,YACf,GAAA,CAAI,QAAA,CAAS,sBAAsB,CAAA,EACnC;AACA,QAAA,OACE,qbAAA;AAAA,MAMJ;AAEA,MAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,IAAY,GAAA,CAAI,MAAA,GAAS,KAAK,CAAC,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,EAAG;AACrE,QAAA,OACE,iCAAiC,GAAG,CAAA,2HAAA,CAAA;AAAA,MAGxC;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AACA,EAAA,OAAO,EAAA;AACT;AAMO,SAAS,WAAA,CAAY,KAAA,EAAgB,MAAA,GAAS,GAAA,EAAa;AAChE,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,WAAA;AAChC,EAAA,IAAI,KAAA,KAAU,MAAM,OAAO,MAAA;AAC3B,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAC9B,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,OAAO,KAAK,CAAA;AAC9C,IAAA,OAAO,CAAA,CAAE,SAAS,MAAA,GAAS,CAAA,CAAE,MAAM,CAAA,EAAG,MAAM,IAAI,KAAA,GAAQ,CAAA;AAAA,EAC1D,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AACF;AChQO,IAAM,eAAN,MAAmB;AAAA,EACP,SAAA;AAAA,EACT,YAAA,GAA0C,IAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlD,YAAY,SAAA,EAA+B;AACzC,IAAA,IAAA,CAAK,YAAY,SAAA,IAAa,sBAAA;AAAA,EAChC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAA,GAAgC;AACpC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,MAAA,CAAO,QAAQ,OAAO,KAAA;AAC5D,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,EAAY;AACtC,MAAA,OAAO,wBAAA,CAAyB,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA;AAAA,IACxD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,sBAAA,GAAkC;AAChC,IAAA,OAAO,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,CAAC,MAAA,CAAO,MAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,WAAA,GAA+B;AACnC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,EAAY;AACtC,IAAA,MAAM,EAAA,GAAK,QAAQ,MAAA,EAAQ,EAAA;AAC3B,IAAA,IAAI,OAAO,EAAA,KAAO,QAAA,IAAY,EAAA,CAAG,WAAW,CAAA,EAAG;AAC7C,MAAA,MAAM,IAAI,qBAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AACA,IAAA,OAAO,EAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,SAAA,GAAyC;AAC7C,IAAA,OAAO,KAAK,WAAA,EAAY;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,gBAAA,GAAyB;AACvB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAAA,EACA,gBAAA,GAAyB;AACvB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAAA,EACtB;AAAA,EAEA,MAAc,WAAA,GAA2C;AACvD,IAAA,IAAI,IAAA,CAAK,YAAA,EAAc,OAAO,IAAA,CAAK,YAAA;AACnC,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACnD,MAAA,MAAM,IAAI,qBAAA,EAAsB;AAAA,IAClC;AACA,IAAA,MAAM,WAAW,MAAA,CAAO,MAAA;AACxB,IAAA,MAAM,SAAU,MAAM,QAAA,CAAS,QAAQ,EAAE,MAAA,EAAQ,UAAU,CAAA;AAC3D,IAAA,IAAA,CAAK,YAAA,GAAe,MAAA;AACpB,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,WAAW,IAAA,EAAqE;AAC5F,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACnD,MAAA,MAAM,IAAI,qBAAA,EAAsB;AAAA,IAClC;AACA,IAAA,MAAM,WAAW,MAAA,CAAO,MAAA;AACxB,IAAA,OAAO,QAAA,CAAS,QAAQ,IAAqC,CAAA;AAAA,EAC/D;AAAA;AAAA,EAGA,MAAc,eACZ,IAAA,EAC2B;AAC3B,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,WAAA,EAAY;AACtC,IAAA,IAAI,CAAC,wBAAA,CAAyB,MAAA,EAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AACrD,MAAA,MAAM,UAAA,GAAa,MAAA,EAAQ,MAAA,EAAQ,EAAA,IAAM,WAAA;AACzC,MAAA,MAAM,IAAI,wBAAwB,UAAU,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,IAAA,CAAK,WAAW,IAAI,CAAA;AAAA,EAC7B;AAAA;AAAA,EAIA,MAAA,GAAsC;AACpC,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,EACjD;AAAA,EAEA,OAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,EAAE,MAAA,EAAQ,WAAW,CAAA;AAAA,EAClD;AAAA,EAEA,UAAA,GAA4B;AAC1B,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,EAAE,MAAA,EAAQ,cAAc,CAAA;AAAA,EACrD;AAAA,EAEA,WAAA,GAA2C;AACzC,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,EAAE,MAAA,EAAQ,eAAe,CAAA;AAAA,EACtD;AAAA,EAEA,gBAAA,GAAyC;AACvC,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,EAAE,MAAA,EAAQ,oBAAoB,CAAA;AAAA,EAC3D;AAAA,EAEA,YAAA,GAAuC;AACrC,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,EAAE,MAAA,EAAQ,gBAAgB,CAAA;AAAA,EACvD;AAAA,EAEA,iBAAA,GAA0C;AACxC,IAAA,OAAO,IAAA,CAAK,cAAA,CAAe,EAAE,MAAA,EAAQ,qBAAqB,CAAA;AAAA,EAC5D;AAAA,EAEA,YAAY,OAAA,EAAiD;AAC3D,IAAA,OAAO,IAAA,CAAK,eAAe,EAAE,MAAA,EAAQ,eAAe,MAAA,EAAQ,EAAE,OAAA,EAAQ,EAAG,CAAA;AAAA,EAC3E;AAAA,EAEA,eAAe,MAAA,EAAqD;AAClE,IAAA,OAAO,KAAK,cAAA,CAAe,EAAE,MAAA,EAAQ,gBAAA,EAAkB,QAAQ,CAAA;AAAA,EACjE;AAAA,EAEA,sBACE,MAAA,EAC0C;AAC1C,IAAA,OAAO,KAAK,cAAA,CAAe,EAAE,MAAA,EAAQ,uBAAA,EAAyB,QAAQ,CAAA;AAAA,EACxE;AAAA,EAEA,UAAU,GAAA,EAAyD;AACjE,IAAA,OAAO,KAAK,cAAA,CAAe,EAAE,QAAQ,WAAA,EAAa,MAAA,EAAQ,KAAK,CAAA;AAAA,EACjE;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,EAAA,CAAG,OAAsB,QAAA,EAAmC;AAC1D,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACnD,MAAA,MAAM,IAAI,qBAAA,EAAsB;AAAA,IAClC;AACA,IAAA,MAAA,CAAO,MAAA,CAAO,EAAA,CAAG,KAAA,EAAO,QAAQ,CAAA;AAAA,EAClC;AAAA,EAEA,GAAA,CAAI,OAAsB,QAAA,EAAmC;AAC3D,IAAA,IAAI,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,OAAO,MAAA,EAAQ;AACrD,IAAA,IAAI,OAAO,MAAA,CAAO,MAAA,CAAO,GAAA,KAAQ,UAAA,EAAY;AAC3C,MAAA,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AACjC,MAAA;AAAA,IACF;AACA,IAAA,IAAI,OAAO,MAAA,CAAO,MAAA,CAAO,cAAA,KAAmB,UAAA,EAAY;AACtD,MAAA,MAAA,CAAO,MAAA,CAAO,cAAA,CAAe,KAAA,EAAO,QAAQ,CAAA;AAAA,IAC9C;AAAA,EACF;AACF;;;ACnJA,IAAMA,UAAAA,GAAY,MAAA;AAElB,IAAM,iBAAA,GAAqC;AAAA,EACzC,SAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,aAAA;AAAA,EACA,mBAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,cAAN,MAA2C;AAAA,EACvC,QAAA,GAAW,WAAWA,UAAS,CAAA;AAAA,EAC/B,IAAA,GAAO,MAAA;AAAA,EAEC,QAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYjB,YAAY,OAAA,EAAsE;AAChF,IAAA,IAAA,CAAK,WAAW,OAAA,EAAS,QAAA,IAAY,IAAI,YAAA,CAAa,SAAS,SAAS,CAAA;AAAA,EAC1E;AAAA,EAEA,eAAA,GAAmC;AACjC,IAAA,OAAO,iBAAA;AAAA,EACT;AAAA,EAEA,MAAM,eAAA,GAAgD;AACpD,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAO,EAAE,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,8BAAA,EAA+B;AAAA,IACpE;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,sBAAA,EAAuB,EAAG;AAC3C,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,KAAA;AAAA,QACX,MAAA,EAAQ,0CAA0C,gBAAgB,CAAA,8BAAA;AAAA,OACpE;AAAA,IACF;AACA,IAAA,MAAM,SAAA,GAAY,MAAM,IAAA,CAAK,QAAA,CAAS,WAAA,EAAY;AAClD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAO,EAAE,SAAA,EAAW,IAAA,EAAM,MAAA,EAAQ,6BAAA,EAA8B;AAAA,IAClE;AACA,IAAA,OAAO;AAAA,MACL,SAAA,EAAW,KAAA;AAAA,MACX,MAAA,EACE;AAAA,KACJ;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CACJ,GAAA,EACA,KAAA,EAC+B;AAC/B,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,sBAAA,EAAuB,EAAG;AAC3C,QAAA,MAAM,IAAI,qBAAA,EAAsB;AAAA,MAClC;AAEA,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,kCAAA,EAAoC;AAAA,QACnD,SAAS,GAAA,CAAI,OAAA;AAAA,QACb,SAAS,GAAA,CAAI;AAAA,OACd,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,OAAA,EAAQ;AAC3C,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,iBAAA,EAAkB;AACtD,MAAA,MAAM,OAAA,GAAU,SAAA,CAAU,OAAA,CAAQ,OAAO,CAAA;AAEzC,MAAA,GAAA,CAAI,MAAA,CAAO,KAAK,iCAAA,EAAmC;AAAA,QACjD,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,QAC3B,QAAA,EAAU,OAAO,MAAA,EAAQ;AAAA,OAC1B,CAAA;AAED,MAAA,OAAO;AAAA,QACL,OAAA;AAAA,QACA,OAAA,EAAS;AAAA,UACP,UAAU,IAAA,CAAK,QAAA;AAAA,UACf,SAAS,GAAA,CAAI,OAAA;AAAA,UACb,SAAA,EAAW,KAAK,GAAA,EAAI;AAAA,UACpB,QAAA,EAAU,oBAAA,CAAqB,MAAA,EAAQ,OAAO;AAAA,SAChD;AAAA,QACA,YAAA,EAAc,KAAK,eAAA;AAAgB,OACrC;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,gBAAgB,GAAA,EAAK;AAAA,QACzB,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,KAAA,EAAO,SAAA;AAAA,QACP,SAAA,EAAW,UAAA;AAAA,QACX,SAAS,EAAE,MAAA,EAAQ,IAAI,MAAA,EAAQ,OAAA,EAAS,IAAI,OAAA;AAAQ,OACrD,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CAAW,GAAA,EAAqB,QAAA,EAAkC;AACtE,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,CAAK,SAAS,UAAA,EAAW;AAAA,IACjC,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,qCAAA,EAAuC,GAAG,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,MAAM,OAAA,CAAQ,GAAA,EAAqB,SAAA,EAAsD;AACvF,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,MAAA,KAAW,WAAA,EAAa,OAAO,IAAA;AAC1C,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,sBAAA,IAA0B,OAAO,IAAA;AACpD,MAAA,IAAI,UAAU,SAAA,IAAa,IAAA,CAAK,KAAI,IAAK,SAAA,CAAU,WAAW,OAAO,IAAA;AAOrE,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,EAAO;AAC1C,MAAA,IAAI,CAAC,MAAA,CAAO,WAAA,EAAa,OAAO,IAAA;AAEhC,MAAA,MAAM,OAAA,GAAU,MAAM,IAAA,CAAK,QAAA,CAAS,iBAAA,EAAkB;AACtD,MAAA,IAAI,OAAA,CAAQ,OAAA,KAAY,SAAA,CAAU,OAAA,EAAS;AACzC,QAAA,GAAA,CAAI,MAAA,CAAO,KAAA;AAAA,UACT,+EAAA;AAAA,UACA;AAAA,YACE,kBAAkB,SAAA,CAAU,OAAA;AAAA,YAC5B,gBAAgB,OAAA,CAAQ;AAAA;AAC1B,SACF;AACA,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,qCAAA,EAAuC;AAAA,QACtD,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,QAAA,EAAU,OAAO,MAAA,EAAQ;AAAA,OAC1B,CAAA;AAED,MAAA,OAAO;AAAA,QACL,GAAG,SAAA;AAAA,QACH,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,QAAA,EAAU;AAAA,UACR,GAAI,SAAA,CAAU,QAAA,IAAY,EAAC;AAAA,UAC3B,GAAG,oBAAA,CAAqB,MAAA,EAAQ,OAAO;AAAA;AACzC,OACF;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,GAAA,CAAI,MAAA,CAAO,IAAA,CAAK,uCAAA,EAAyC,GAAG,CAAA;AAC5D,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEA,MAAM,WAAA,CACJ,GAAA,EACA,OAAA,EACA,MAAA,EACwB;AACxB,IAAA,IAAI;AACF,MAAA,IAAI,OAAO,MAAA,CAAO,OAAA,KAAY,YAAY,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,EAAG;AACrE,QAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,MACrE;AAEA,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,yCAAA,EAA2C;AAAA,QAC1D,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,aAAA,EAAe,OAAO,OAAA,CAAQ;AAAA,OAC/B,CAAA;AAED,MAAA,MAAM,EAAE,WAAU,GAAI,MAAM,KAAK,QAAA,CAAS,WAAA,CAAY,OAAO,OAAO,CAAA;AACpE,MAAA,OAAO;AAAA,QACL,SAAA,EAAW,YAAY,SAAS,CAAA;AAAA,QAChC,SAAS,OAAA,CAAQ,OAAA;AAAA,QACjB,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,QAAQ,MAAA,CAAO;AAAA,OACjB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,gBAAgB,GAAA,EAAK;AAAA,QACzB,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,KAAA,EAAO,aAAA;AAAA,QACP,SAAA,EAAW,UAAA;AAAA,QACX,OAAA,EAAS,EAAE,SAAA,EAAW,OAAA,CAAQ,SAAA;AAAU,OACzC,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,eAAA,CACJ,IAAA,EACA,QAAA,EACA,OAAA,EAC4B;AAC5B,IAAA,MAAM,IAAIC,2BAAAA;AAAA,MACR,IAAA,CAAK,QAAA;AAAA,MACL;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,iBAAA,CACJ,GAAA,EACA,OAAA,EACA,MAAA,EACoB;AACpB,IAAA,MAAM,UAAU,MAAA,CAAO,QAAA;AACvB,IAAA,IAAI;AACF,MAAA,IAAI,CAAC,OAAA,IAAW,OAAO,OAAA,KAAY,QAAA,EAAU;AAC3C,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,oFAAA,EACe,WAAA,CAAY,OAAO,CAAC,CAAA,CAAA;AAAA,SACrC;AAAA,MACF;AACA,MAAA,IAAI,CAAC,OAAA,CAAQ,QAAA,IAAY,OAAO,OAAA,CAAQ,aAAa,QAAA,EAAU;AAC7D,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,8EAAA,EACe,WAAA,CAAY,OAAO,CAAC,CAAA,CAAA;AAAA,SACrC;AAAA,MACF;AAEA,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,+CAAA,EAAiD;AAAA,QAChE,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,WAAW,OAAA,CAAQ;AAAA,OACpB,CAAA;AAED,MAAA,MAAM,EAAE,EAAA,EAAG,GAAI,MAAM,IAAA,CAAK,QAAA,CAAS,sBAAsB,OAAO,CAAA;AAEhE,MAAA,IAAI,CAAC,MAAM,OAAO,EAAA,KAAO,YAAY,CAAC,EAAA,CAAG,SAAS,QAAA,EAAU;AAC1D,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,sKAAA,EAEkB,WAAA,CAAY,EAAE,CAAC,CAAA,CAAA;AAAA,SACnC;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,eAAA,EAAiB,iBAAA,CAAkB,EAAA,CAAG,OAAA,CAAQ,QAAQ,CAAA;AAAA,QACtD,WAAA,EAAa,KAAK,GAAA,EAAI;AAAA,QACtB,WAAW,EAAA,CAAG,SAAA;AAAA,QACd,QAAA,EAAU,GAAG,OAAA,CAAQ;AAAA,OACvB;AAAA,IACF,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,QAAA,GAAW,eAAe,OAAO,CAAA;AAQvC,MAAA,IAAI,QAAA,IAAY,CAAC,cAAA,CAAe,GAAG,CAAA,EAAG;AACpC,QAAA,MAAM,cAAc,GAAA,YAAe,KAAA,GAAQ,GAAA,CAAI,OAAA,GAAU,OAAO,GAAG,CAAA;AACnE,QAAA,MAAM,IAAIC,cAAAA;AAAA,UACR,WAAA,GAAc,QAAA;AAAA,UACd,GAAA,YAAe,QAAQ,GAAA,GAAM,MAAA;AAAA,UAC7B;AAAA,YACE,UAAU,IAAA,CAAK,QAAA;AAAA,YACf,KAAA,EAAO,mBAAA;AAAA,YACP,SAAA,EAAW,UAAA;AAAA,YACX,WAAW,OAAA,CAAQ,SAAA;AAAA,YACnB,WAAW,OAAA,EAAS;AAAA;AACtB,SACF;AAAA,MACF;AACA,MAAA,MAAM,gBAAgB,GAAA,EAAK;AAAA,QACzB,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,KAAA,EAAO,mBAAA;AAAA,QACP,SAAA,EAAW,UAAA;AAAA,QACX,SAAS,EAAE,SAAA,EAAW,QAAQ,SAAA,EAAW,SAAA,EAAW,SAAS,SAAA;AAAU,OACxE,CAAA;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CACJ,GAAA,EACA,OAAA,EACA,MAAA,EAC0B;AAC1B,IAAA,IAAI;AACF,MAAA,GAAA,CAAI,MAAA,CAAO,MAAM,oDAAA,EAAsD;AAAA,QACrE,WAAW,OAAA,CAAQ,SAAA;AAAA,QACnB,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,UAAU,MAAA,CAAO;AAAA,OAClB,CAAA;AAED,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,QAAA,CAAS,SAAA,CAAU;AAAA,QAC3C,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,MAAM,MAAA,CAAO;AAAA,OACd,CAAA;AAKD,MAAA,IAAI,MAAA,IAAU,OAAO,MAAA,CAAO,QAAA,KAAa,QAAA,EAAU;AACjD,QAAA,OAAO,EAAE,QAAA,EAAU,MAAA,CAAO,QAAA,EAAS;AAAA,MACrC;AACA,MAAA,OAAO,EAAE,QAAA,EAAU,IAAA,CAAK,SAAA,CAAU,MAAA,IAAU,IAAI,CAAA,EAAE;AAAA,IACpD,SAAS,GAAA,EAAK;AACZ,MAAA,MAAM,gBAAgB,GAAA,EAAK;AAAA,QACzB,UAAU,IAAA,CAAK,QAAA;AAAA,QACf,KAAA,EAAO,WAAA;AAAA,QACP,SAAA,EAAW,UAAA;AAAA,QACX,OAAA,EAAS;AAAA,UACP,WAAW,OAAA,CAAQ,SAAA;AAAA,UACnB,eAAe,MAAA,CAAO,aAAA;AAAA,UACtB,UAAU,MAAA,CAAO;AAAA;AACnB,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,EAAA,CAAG,OAAyB,OAAA,EAAiD;AAC3E,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,OAAO,MAAM;AAAA,MAEb,CAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAA,GAA8B,IAAI,IAAA,KAAS;AAC/C,MAAA,MAAM,EAAA,GAAK,KAAK,CAAC,CAAA;AACjB,MAAA,IAAI,CAAC,EAAA,EAAI;AACT,MAAA,OAAA,CAAQ;AAAA,QACN,MAAA,EAAQ,WAAA,CAAY,EAAA,CAAG,MAAM,CAAA;AAAA,QAC7B,WAAW,EAAA,CAAG,SAAA;AAAA,QACd,GAAA,EAAK;AAAA,OACN,CAAA;AAAA,IACH,CAAA;AACA,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,QAAA,CAAS,EAAA,CAAG,WAAA,EAAa,QAAQ,CAAA;AAAA,IACxC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAM;AAAA,MAEb,CAAA;AAAA,IACF;AACA,IAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,aAAa,QAAQ,CAAA;AAAA,EACtD;AACF;AAQA,SAAS,YACP,MAAA,EACkD;AAClD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,SAAA;AACH,MAAA,OAAO,SAAA;AAAA,IACT,KAAK,QAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,WAAA;AAAA,IACT,KAAK,QAAA;AAAA,IACL;AACE,MAAA,OAAO,QAAA;AAAA;AAEb;AAQA,SAAS,oBAAA,CACP,QACA,OAAA,EACwB;AACxB,EAAA,MAAM,IAAA,GAA+B;AAAA,IACnC,QAAA,EAAU,MAAA,CAAO,MAAA,EAAQ,EAAA,IAAM,EAAA;AAAA,IAC/B,mBAAmB,OAAA,CAAQ,iBAAA;AAAA,IAC3B,aAAA,EAAe,mBAAA;AAAA,IACf,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,WAAW,OAAA,CAAQ,SAAA;AAAA,IACnB,MAAM,OAAA,CAAQ;AAAA,GAChB;AACA,EAAA,IAAI,MAAA,CAAO,OAAA,EAAS,SAAA,EAAW,OAAA,EAAS;AACtC,IAAA,IAAA,CAAK,gBAAA,GAAmB,MAAA,CAAO,OAAA,CAAQ,SAAA,CAAU,OAAA;AAAA,EACnD;AACA,EAAA,IAAI,MAAA,CAAO,SAAS,MAAA,EAAQ;AAC1B,IAAA,IAAA,CAAK,MAAA,GAAS,OAAO,OAAA,CAAQ,MAAA;AAAA,EAC/B;AAGA,EAAA,OAAO,IAAA;AACT","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 `window.canton` provider exposed by Send.\n *\n * Detection is **registry-driven** via `matchesProviderDetection`. The\n * adapter accepts an optional `ProviderDetection` rule set at construction\n * (sourced from the registry's `providerDetection` field for the Send\n * entry); when omitted, it falls back to `SEND_BUILTIN_DETECTION` which\n * mirrors the canonical registry rule. Every public RPC method goes\n * through `guardedRequest`, which checks the live `status` response\n * against those rules before forwarding the call. The result: if a\n * non-Send wallet is sitting at `window.canton`, every Send call resolves\n * to a `SendKernelMismatchError` (treated by the SDK as \"Send is not\n * installed\"), and Send only ever acts on its own provider.\n */\n\nimport { matchesProviderDetection, type ProviderDetection } from '@partylayer/core';\n\nimport { SEND_BUILTIN_DETECTION } from './constants';\nimport { SendKernelMismatchError, SendNotInstalledError } from './errors';\nimport type {\n SendAccount,\n SendCantonProvider,\n SendEventListener,\n SendEventName,\n SendLedgerApiRequest,\n SendLedgerApiResult,\n SendNetwork,\n SendPrepareExecuteAndWaitResult,\n SendPrepareSubmissionRequest,\n SendRpcMethod,\n SendRpcRequest,\n SendRpcResult,\n SendStatusResponse,\n} from './types';\n\nexport class SendProvider {\n private readonly detection: ProviderDetection;\n private cachedStatus: SendStatusResponse | null = null;\n\n /**\n * @param detection Optional. Used to match the running `window.canton`\n * provider against Send's identity. When omitted, falls back to\n * `SEND_BUILTIN_DETECTION` (canonical registry rule mirror).\n */\n constructor(detection?: ProviderDetection) {\n this.detection = detection ?? SEND_BUILTIN_DETECTION;\n }\n\n /**\n * True when `window.canton` is present AND its self-reported status\n * matches Send's detection rules. Performs an actual `status` round-trip\n * on first call and caches the response for subsequent ones.\n */\n async isInstalled(): Promise<boolean> {\n if (typeof window === 'undefined' || !window.canton) return false;\n try {\n const status = await this.fetchStatus();\n return matchesProviderDetection(status, this.detection);\n } catch {\n return false;\n }\n }\n\n /**\n * Synchronous best-effort presence check. Used for fast picker rendering\n * before any async status introspection. May report `true` for a\n * non-Send provider — callers must follow up with `isInstalled()` (or\n * any guarded request) before assuming Send is wired in.\n */\n isPotentiallyAvailable(): boolean {\n return typeof window !== 'undefined' && !!window.canton;\n }\n\n /**\n * Read the cached `kernel.id` from the running provider, fetching status\n * on demand. Diagnostic helper kept public for back-compat — detection\n * itself no longer hinges on this single field.\n */\n async getKernelId(): Promise<string> {\n const status = await this.fetchStatus();\n const id = status?.kernel?.id;\n if (typeof id !== 'string' || id.length === 0) {\n throw new SendNotInstalledError(\n 'window.canton.status() did not return a kernel.id — provider is malformed.',\n );\n }\n return id;\n }\n\n /**\n * Read the latest cached status object. Resolves the underlying RPC on\n * demand if no cached value is present.\n */\n async getStatus(): Promise<SendStatusResponse> {\n return this.fetchStatus();\n }\n\n /**\n * Reset the cached status (e.g. after the user uninstalls and reinstalls\n * the extension, or you suspect kernel identity changed mid-session).\n * Kept under both names to avoid breaking existing test imports.\n */\n resetKernelCache(): void {\n this.cachedStatus = null;\n }\n resetStatusCache(): void {\n this.cachedStatus = null;\n }\n\n private async fetchStatus(): Promise<SendStatusResponse> {\n if (this.cachedStatus) return this.cachedStatus;\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n const provider = window.canton as SendCantonProvider;\n const status = (await provider.request({ method: 'status' })) as SendStatusResponse;\n this.cachedStatus = status;\n return status;\n }\n\n /** Internal — bypasses the detection guard. */\n private async rawRequest(args: { method: SendRpcMethod; params?: unknown }): Promise<unknown> {\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n const provider = window.canton as SendCantonProvider;\n return provider.request(args as SendRpcRequest<SendRpcMethod>);\n }\n\n /** Public dispatch — guards every call with a registry-driven detection check. */\n private async guardedRequest<M extends SendRpcMethod>(\n args: SendRpcRequest<M>,\n ): Promise<SendRpcResult<M>> {\n const status = await this.fetchStatus();\n if (!matchesProviderDetection(status, this.detection)) {\n const observedId = status?.kernel?.id ?? '<unknown>';\n throw new SendKernelMismatchError(observedId);\n }\n return this.rawRequest(args) as Promise<SendRpcResult<M>>;\n }\n\n // ── Sigilry RPC methods (every one is guarded) ─────────────────────────\n\n status(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'status' });\n }\n\n connect(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'connect' });\n }\n\n disconnect(): Promise<null> {\n return this.guardedRequest({ method: 'disconnect' });\n }\n\n isConnected(): Promise<SendStatusResponse> {\n return this.guardedRequest({ method: 'isConnected' });\n }\n\n getActiveNetwork(): Promise<SendNetwork> {\n return this.guardedRequest({ method: 'getActiveNetwork' });\n }\n\n listAccounts(): Promise<SendAccount[]> {\n return this.guardedRequest({ method: 'listAccounts' });\n }\n\n getPrimaryAccount(): Promise<SendAccount> {\n return this.guardedRequest({ method: 'getPrimaryAccount' });\n }\n\n signMessage(message: string): Promise<{ signature: string }> {\n return this.guardedRequest({ method: 'signMessage', params: { message } });\n }\n\n prepareExecute(params: SendPrepareSubmissionRequest): Promise<null> {\n return this.guardedRequest({ method: 'prepareExecute', params });\n }\n\n prepareExecuteAndWait(\n params: SendPrepareSubmissionRequest,\n ): Promise<SendPrepareExecuteAndWaitResult> {\n return this.guardedRequest({ method: 'prepareExecuteAndWait', params });\n }\n\n ledgerApi(req: SendLedgerApiRequest): Promise<SendLedgerApiResult> {\n return this.guardedRequest({ method: 'ledgerApi', params: req });\n }\n\n // ── Events ─────────────────────────────────────────────────────────────\n // No kernel guard here on purpose — by the time the dApp wires up an\n // event listener it has already gone through `connect()` (which IS\n // guarded), so we trust the binding.\n\n on(event: SendEventName, listener: SendEventListener): void {\n if (typeof window === 'undefined' || !window.canton) {\n throw new SendNotInstalledError();\n }\n window.canton.on(event, listener);\n }\n\n off(event: SendEventName, listener: SendEventListener): void {\n if (typeof window === 'undefined' || !window.canton) return;\n if (typeof window.canton.off === 'function') {\n window.canton.off(event, listener);\n return;\n }\n if (typeof window.canton.removeListener === 'function') {\n window.canton.removeListener(event, listener);\n }\n }\n}\n","/**\n * Send Canton Wallet adapter.\n *\n * Send is a passkey-based Canton wallet that exposes the splice-wallet-kernel\n * OpenRPC protocol at `window.canton`. Because the bare `window.canton` slot is shared with\n * other splice-spec wallets (e.g. Console-class), the adapter funnels\n * every request through `SendProvider.guardedRequest`, which verifies\n * the running provider's `kernel.id` matches Send's Chrome extension\n * ID before forwarding the call.\n *\n * Capability summary: connect / disconnect / restore / signMessage /\n * submitTransaction / ledgerApi / events / injected. `signTransaction`\n * is intentionally NOT declared — Send (like Loop and Nightly) fuses\n * sign-and-submit through `prepareExecute*`, so a standalone sign step\n * would only mislead callers.\n */\n\nimport {\n CapabilityNotSupportedError,\n TransportError,\n toPartyId,\n toSignature,\n toTransactionHash,\n toWalletId,\n type ProviderDetection,\n type AdapterConnectResult,\n type AdapterContext,\n type AdapterDetectResult,\n type AdapterEventName,\n type CapabilityKey,\n type LedgerApiParams,\n type LedgerApiResult,\n type PartyId,\n type PersistedSession,\n type Session,\n type SignMessageParams,\n type SignTransactionParams,\n type SignedMessage,\n type SignedTransaction,\n type SubmitTransactionParams,\n type TxReceipt,\n type WalletAdapter,\n} from '@partylayer/core';\n\nimport {\n SEND_INSTALL_URL,\n SEND_SIGNING_METHOD,\n} from './constants';\nimport {\n SendNotInstalledError,\n isSendRpcError,\n mapSigilryError,\n safePreview,\n templateIdHint,\n} from './errors';\nimport { SendProvider } from './send-provider';\nimport type {\n SendAccount,\n SendEventListener,\n SendPrepareSubmissionRequest,\n SendStatusResponse,\n SendTxChangedEvent,\n} from './types';\n\nconst WALLET_ID = 'send';\n\nconst SEND_CAPABILITIES: CapabilityKey[] = [\n 'connect',\n 'disconnect',\n 'restore',\n 'signMessage',\n 'submitTransaction',\n 'ledgerApi',\n 'events',\n 'injected',\n];\n\nexport class SendAdapter implements WalletAdapter {\n readonly walletId = toWalletId(WALLET_ID);\n readonly name = 'Send';\n\n private readonly provider: SendProvider;\n\n /**\n * @param options.detection Optional. When supplied, the adapter uses\n * these matcher rules to decide whether the running `window.canton`\n * belongs to Send. Inject this from the registry entry's\n * `providerDetection` field for canonical behaviour. Omitting it\n * falls back to the built-in pattern that mirrors the canonical\n * registry rule (parity is verified by tests).\n * @param options.provider Optional. Pre-built provider instance, used\n * primarily by tests; takes precedence over `options.detection`.\n */\n constructor(options?: { detection?: ProviderDetection; provider?: SendProvider }) {\n this.provider = options?.provider ?? new SendProvider(options?.detection);\n }\n\n getCapabilities(): CapabilityKey[] {\n return SEND_CAPABILITIES;\n }\n\n async detectInstalled(): Promise<AdapterDetectResult> {\n if (typeof window === 'undefined') {\n return { installed: false, reason: 'Browser environment required' };\n }\n if (!this.provider.isPotentiallyAvailable()) {\n return {\n installed: false,\n reason: `Send Canton Wallet not detected. Visit ${SEND_INSTALL_URL} for installation instructions`,\n };\n }\n const installed = await this.provider.isInstalled();\n if (installed) {\n return { installed: true, reason: 'Send Canton Wallet detected' };\n }\n return {\n installed: false,\n reason:\n 'window.canton is present but its kernel.id does not match Send. Another Canton wallet is active.',\n };\n }\n\n async connect(\n ctx: AdapterContext,\n _opts?: { timeoutMs?: number; partyId?: PartyId; preferInstalled?: boolean },\n ): Promise<AdapterConnectResult> {\n try {\n if (!this.provider.isPotentiallyAvailable()) {\n throw new SendNotInstalledError();\n }\n\n ctx.logger.debug('Connecting to Send Canton Wallet', {\n appName: ctx.appName,\n network: ctx.network,\n });\n\n const status = await this.provider.connect();\n const account = await this.provider.getPrimaryAccount();\n const partyId = toPartyId(account.partyId);\n\n ctx.logger.info('Connected to Send Canton Wallet', {\n partyId: account.partyId,\n signingProviderId: account.signingProviderId,\n kernelId: status.kernel?.id,\n });\n\n return {\n partyId,\n session: {\n walletId: this.walletId,\n network: ctx.network,\n createdAt: Date.now(),\n metadata: buildSessionMetadata(status, account),\n },\n capabilities: this.getCapabilities(),\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'connect',\n transport: 'injected',\n details: { origin: ctx.origin, network: ctx.network },\n });\n }\n }\n\n async disconnect(ctx: AdapterContext, _session: Session): Promise<void> {\n try {\n await this.provider.disconnect();\n } catch (err) {\n ctx.logger.warn('Error during Send wallet disconnect', err);\n }\n }\n\n async restore(ctx: AdapterContext, persisted: PersistedSession): Promise<Session | null> {\n try {\n if (typeof window === 'undefined') return null;\n if (!this.provider.isPotentiallyAvailable()) return null;\n if (persisted.expiresAt && Date.now() >= persisted.expiresAt) return null;\n\n // status() is a silent introspection call — no popup, no passkey\n // prompt — so we can use it as a \"still authorised?\" probe on page\n // reload. If the kernel.id has shifted (user installed another\n // wallet) the guarded request will throw `SendKernelMismatchError`\n // and we'll return null below.\n const status = await this.provider.status();\n if (!status.isConnected) return null;\n\n const account = await this.provider.getPrimaryAccount();\n if (account.partyId !== persisted.partyId) {\n ctx.logger.debug(\n 'Send primary account changed since session was persisted; treating as expired',\n {\n persistedPartyId: persisted.partyId,\n currentPartyId: account.partyId,\n },\n );\n return null;\n }\n\n ctx.logger.debug('Restored Send Canton Wallet session', {\n partyId: account.partyId,\n kernelId: status.kernel?.id,\n });\n\n return {\n ...persisted,\n walletId: this.walletId,\n metadata: {\n ...(persisted.metadata ?? {}),\n ...buildSessionMetadata(status, account),\n },\n };\n } catch (err) {\n ctx.logger.warn('Failed to restore Send wallet session', err);\n return null;\n }\n }\n\n async signMessage(\n ctx: AdapterContext,\n session: Session,\n params: SignMessageParams,\n ): Promise<SignedMessage> {\n try {\n if (typeof params.message !== 'string' || params.message.length === 0) {\n throw new Error('signMessage requires a non-empty string `message`');\n }\n\n ctx.logger.debug('Signing message with Send Canton Wallet', {\n sessionId: session.sessionId,\n messageLength: params.message.length,\n });\n\n const { signature } = await this.provider.signMessage(params.message);\n return {\n signature: toSignature(signature),\n partyId: session.partyId,\n message: params.message,\n nonce: params.nonce,\n domain: params.domain,\n };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'signMessage',\n transport: 'injected',\n details: { sessionId: session.sessionId },\n });\n }\n }\n\n async signTransaction(\n _ctx: AdapterContext,\n _session: Session,\n _params: SignTransactionParams,\n ): Promise<SignedTransaction> {\n throw new CapabilityNotSupportedError(\n this.walletId,\n 'signTransaction — Send fuses sign-and-submit through prepareExecuteAndWait. Use submitTransaction instead.',\n );\n }\n\n async submitTransaction(\n ctx: AdapterContext,\n session: Session,\n params: SubmitTransactionParams,\n ): Promise<TxReceipt> {\n const payload = params.signedTx as SendPrepareSubmissionRequest;\n try {\n if (!payload || typeof payload !== 'object') {\n throw new Error(\n 'submitTransaction requires a SendPrepareSubmissionRequest as `signedTx` ' +\n `(received ${safePreview(payload)})`,\n );\n }\n if (!payload.commands || typeof payload.commands !== 'object') {\n throw new Error(\n \"submitTransaction signedTx is missing the required 'commands' field \" +\n `(received ${safePreview(payload)})`,\n );\n }\n\n ctx.logger.debug('Submitting transaction via Send Canton Wallet', {\n sessionId: session.sessionId,\n commandId: payload.commandId,\n });\n\n const { tx } = await this.provider.prepareExecuteAndWait(payload);\n\n if (!tx || typeof tx !== 'object' || !tx.payload?.updateId) {\n throw new Error(\n 'Send returned an unexpected shape from prepareExecuteAndWait. ' +\n `Expected { tx: { commandId, status:'executed', payload: { updateId, completionOffset } } } ` +\n `but received ${safePreview(tx)}.`,\n );\n }\n\n return {\n transactionHash: toTransactionHash(tx.payload.updateId),\n submittedAt: Date.now(),\n commandId: tx.commandId,\n updateId: tx.payload.updateId,\n };\n } catch (err) {\n const baseHint = templateIdHint(payload);\n // For structured Sigilry RPC errors (e.g. user pressed cancel in\n // the passkey popup → code 4001) we want the canonical mapping\n // (`UserRejectedError`). For everything else, if we have a payload\n // hint, attach it directly via TransportError so the keyword-based\n // fallback in `mapUnknownErrorToPartyLayerError` doesn't replace\n // the message with a generic `User rejected …` string and lose\n // the actionable text.\n if (baseHint && !isSendRpcError(err)) {\n const baseMessage = err instanceof Error ? err.message : String(err);\n throw new TransportError(\n baseMessage + baseHint,\n err instanceof Error ? err : undefined,\n {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n sessionId: session.sessionId,\n commandId: payload?.commandId,\n },\n );\n }\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'submitTransaction',\n transport: 'injected',\n details: { sessionId: session.sessionId, commandId: payload?.commandId },\n });\n }\n }\n\n async ledgerApi(\n ctx: AdapterContext,\n session: Session,\n params: LedgerApiParams,\n ): Promise<LedgerApiResult> {\n try {\n ctx.logger.debug('Proxying ledger API request via Send Canton Wallet', {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n });\n\n const result = await this.provider.ledgerApi({\n requestMethod: params.requestMethod,\n resource: params.resource,\n body: params.body,\n });\n\n // Send's contract is `{ response: string }` — preserve raw to match\n // PartyLayer's `LedgerApiResult` exactly. Defensive fallback if a\n // future wallet build returns a parsed object.\n if (result && typeof result.response === 'string') {\n return { response: result.response };\n }\n return { response: JSON.stringify(result ?? null) };\n } catch (err) {\n throw mapSigilryError(err, {\n walletId: this.walletId,\n phase: 'ledgerApi',\n transport: 'injected',\n details: {\n sessionId: session.sessionId,\n requestMethod: params.requestMethod,\n resource: params.resource,\n },\n });\n }\n }\n\n /**\n * Subscribe to PartyLayer adapter events. Currently bridges only\n * `txStatus` from Send's native `txChanged` event. Other PartyLayer\n * adapter events (`connect` / `disconnect` / `sessionExpired` / `error`)\n * are emitted by the SDK itself, not the wallet, so we no-op them.\n */\n on(event: AdapterEventName, handler: (payload: unknown) => void): () => void {\n if (event !== 'txStatus') {\n return () => {\n /* nothing to unsubscribe */\n };\n }\n const listener: SendEventListener = (...args) => {\n const tx = args[0] as SendTxChangedEvent | undefined;\n if (!tx) return;\n handler({\n status: mapTxStatus(tx.status),\n commandId: tx.commandId,\n raw: tx,\n });\n };\n try {\n this.provider.on('txChanged', listener);\n } catch {\n return () => {\n /* provider unavailable — nothing to unsubscribe */\n };\n }\n return () => this.provider.off('txChanged', listener);\n }\n}\n\n// ── helpers ────────────────────────────────────────────────────────────────\n\n/**\n * Translate Sigilry `txChanged` statuses into PartyLayer's\n * `TransactionStatus` taxonomy. Kept separate so tests can pin the mapping.\n */\nfunction mapTxStatus(\n status: SendTxChangedEvent['status'],\n): 'pending' | 'submitted' | 'committed' | 'failed' {\n switch (status) {\n case 'pending':\n return 'pending';\n case 'signed':\n return 'submitted';\n case 'executed':\n return 'committed';\n case 'failed':\n default:\n return 'failed';\n }\n}\n\n/**\n * Pack diagnostic + restore-relevant fields into the Session metadata\n * record. PartyLayer types `Session.metadata` as `Record<string, string>`,\n * so every value must be a string — we omit anything that's missing\n * rather than writing the literal string `\"undefined\"`.\n */\nfunction buildSessionMetadata(\n status: SendStatusResponse,\n account: SendAccount,\n): Record<string, string> {\n const meta: Record<string, string> = {\n kernelId: status.kernel?.id ?? '',\n signingProviderId: account.signingProviderId,\n signingMethod: SEND_SIGNING_METHOD,\n publicKey: account.publicKey,\n namespace: account.namespace,\n networkId: account.networkId,\n hint: account.hint,\n };\n if (status.network?.ledgerApi?.baseUrl) {\n meta.ledgerApiBaseUrl = status.network.ledgerApi.baseUrl;\n }\n if (status.session?.userId) {\n meta.userId = status.session.userId;\n }\n // accessToken is intentionally omitted — the SDK's encrypted-storage\n // layer is for it; adapter-level metadata is plain Record<string,string>.\n return meta;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@partylayer/adapter-send",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
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",
|
|
@@ -15,6 +15,13 @@
|
|
|
15
15
|
"files": [
|
|
16
16
|
"dist"
|
|
17
17
|
],
|
|
18
|
+
"scripts": {
|
|
19
|
+
"build": "tsup",
|
|
20
|
+
"clean": "rm -rf dist",
|
|
21
|
+
"lint": "eslint src --ext .ts",
|
|
22
|
+
"typecheck": "tsc --noEmit",
|
|
23
|
+
"test": "vitest run --passWithNoTests"
|
|
24
|
+
},
|
|
18
25
|
"keywords": [
|
|
19
26
|
"partylayer",
|
|
20
27
|
"canton",
|
|
@@ -38,18 +45,11 @@
|
|
|
38
45
|
"url": "https://github.com/PartyLayer/PartyLayer/issues"
|
|
39
46
|
},
|
|
40
47
|
"dependencies": {
|
|
41
|
-
"@partylayer/core": "
|
|
48
|
+
"@partylayer/core": "workspace:^"
|
|
42
49
|
},
|
|
43
50
|
"devDependencies": {
|
|
44
51
|
"@types/node": "^20.11.0",
|
|
45
52
|
"typescript": "^5.3.3",
|
|
46
53
|
"vitest": "^1.2.0"
|
|
47
|
-
},
|
|
48
|
-
"scripts": {
|
|
49
|
-
"build": "tsup",
|
|
50
|
-
"clean": "rm -rf dist",
|
|
51
|
-
"lint": "eslint src --ext .ts",
|
|
52
|
-
"typecheck": "tsc --noEmit",
|
|
53
|
-
"test": "vitest run --passWithNoTests"
|
|
54
54
|
}
|
|
55
|
-
}
|
|
55
|
+
}
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2026 PartyLayer
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|