@partylayer/sdk 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +43 -1
- package/dist/index.d.ts +43 -1
- package/dist/index.js +46 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +47 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -10
package/dist/index.d.mts
CHANGED
|
@@ -84,6 +84,19 @@ interface PartyLayerConfig {
|
|
|
84
84
|
channel?: 'stable' | 'beta';
|
|
85
85
|
/** Default network */
|
|
86
86
|
network: NetworkId;
|
|
87
|
+
/**
|
|
88
|
+
* Network-mismatch enforcement policy (default: `'guard'`).
|
|
89
|
+
*
|
|
90
|
+
* When a connected wallet's effective network differs from `network`:
|
|
91
|
+
* - `'off'` — detect + emit `session:networkMismatch` only; never block.
|
|
92
|
+
* - `'guard'` — (default) block wrong-network TRANSACTIONS (signMessage,
|
|
93
|
+
* signTransaction, submitTransaction, ledgerApi); connect still succeeds.
|
|
94
|
+
* - `'strict'` — also block CONNECT (throws `NetworkMismatchError`).
|
|
95
|
+
*
|
|
96
|
+
* BEHAVIOR CHANGE: prior to this, wrong-network transactions always
|
|
97
|
+
* proceeded. Set `'off'` to restore that.
|
|
98
|
+
*/
|
|
99
|
+
networkEnforcement?: 'off' | 'guard' | 'strict';
|
|
87
100
|
/**
|
|
88
101
|
* Wallet adapters to register (OPTIONAL)
|
|
89
102
|
*
|
|
@@ -232,6 +245,21 @@ interface SessionExpiredEvent {
|
|
|
232
245
|
type: 'session:expired';
|
|
233
246
|
sessionId: SessionId;
|
|
234
247
|
}
|
|
248
|
+
/**
|
|
249
|
+
* Network mismatch event — the connected wallet's effective network differs
|
|
250
|
+
* from the dApp's configured network. Emitted under ALL policies (informational);
|
|
251
|
+
* `enforced` is true when the active policy ('guard' | 'strict') will block.
|
|
252
|
+
*/
|
|
253
|
+
interface SessionNetworkMismatchEvent {
|
|
254
|
+
type: 'session:networkMismatch';
|
|
255
|
+
sessionId: SessionId;
|
|
256
|
+
/** dApp-configured (expected) network, CAIP-2 normalized. */
|
|
257
|
+
expected: string;
|
|
258
|
+
/** Wallet-reported (actual) network, CAIP-2 normalized. */
|
|
259
|
+
actual: string;
|
|
260
|
+
/** Whether the active policy will block (guard|strict) vs. detect-only (off). */
|
|
261
|
+
enforced: boolean;
|
|
262
|
+
}
|
|
235
263
|
/**
|
|
236
264
|
* Transaction status event
|
|
237
265
|
*/
|
|
@@ -252,7 +280,7 @@ interface ErrorEvent {
|
|
|
252
280
|
/**
|
|
253
281
|
* All event types
|
|
254
282
|
*/
|
|
255
|
-
type PartyLayerEvent = RegistryUpdatedEvent | RegistryStatusEvent | SessionConnectedEvent | SessionDisconnectedEvent | SessionExpiredEvent | TxStatusEvent | ErrorEvent;
|
|
283
|
+
type PartyLayerEvent = RegistryUpdatedEvent | RegistryStatusEvent | SessionConnectedEvent | SessionDisconnectedEvent | SessionExpiredEvent | SessionNetworkMismatchEvent | TxStatusEvent | ErrorEvent;
|
|
256
284
|
/**
|
|
257
285
|
* Event handler type
|
|
258
286
|
*/
|
|
@@ -303,6 +331,20 @@ declare class PartyLayerClient {
|
|
|
303
331
|
* List available wallets
|
|
304
332
|
*/
|
|
305
333
|
listWallets(filter?: WalletFilter): Promise<WalletInfo[]>;
|
|
334
|
+
/** Active network-enforcement policy (default 'guard'). */
|
|
335
|
+
private get enforcement();
|
|
336
|
+
/**
|
|
337
|
+
* Detect a confident network mismatch between the dApp's configured network
|
|
338
|
+
* and the session's (wallet-reported) network. Returns null when they match
|
|
339
|
+
* or the comparison isn't confident (conservative — never a false positive).
|
|
340
|
+
*/
|
|
341
|
+
private networkMismatch;
|
|
342
|
+
/**
|
|
343
|
+
* Guard a transaction-class operation: throw `NetworkMismatchError` when the
|
|
344
|
+
* session is on the wrong network AND the policy enforces it ('guard' |
|
|
345
|
+
* 'strict'). Also protects restored sessions and mid-session network switches.
|
|
346
|
+
*/
|
|
347
|
+
private assertNetworkOk;
|
|
306
348
|
/**
|
|
307
349
|
* Connect to a wallet
|
|
308
350
|
*/
|
package/dist/index.d.ts
CHANGED
|
@@ -84,6 +84,19 @@ interface PartyLayerConfig {
|
|
|
84
84
|
channel?: 'stable' | 'beta';
|
|
85
85
|
/** Default network */
|
|
86
86
|
network: NetworkId;
|
|
87
|
+
/**
|
|
88
|
+
* Network-mismatch enforcement policy (default: `'guard'`).
|
|
89
|
+
*
|
|
90
|
+
* When a connected wallet's effective network differs from `network`:
|
|
91
|
+
* - `'off'` — detect + emit `session:networkMismatch` only; never block.
|
|
92
|
+
* - `'guard'` — (default) block wrong-network TRANSACTIONS (signMessage,
|
|
93
|
+
* signTransaction, submitTransaction, ledgerApi); connect still succeeds.
|
|
94
|
+
* - `'strict'` — also block CONNECT (throws `NetworkMismatchError`).
|
|
95
|
+
*
|
|
96
|
+
* BEHAVIOR CHANGE: prior to this, wrong-network transactions always
|
|
97
|
+
* proceeded. Set `'off'` to restore that.
|
|
98
|
+
*/
|
|
99
|
+
networkEnforcement?: 'off' | 'guard' | 'strict';
|
|
87
100
|
/**
|
|
88
101
|
* Wallet adapters to register (OPTIONAL)
|
|
89
102
|
*
|
|
@@ -232,6 +245,21 @@ interface SessionExpiredEvent {
|
|
|
232
245
|
type: 'session:expired';
|
|
233
246
|
sessionId: SessionId;
|
|
234
247
|
}
|
|
248
|
+
/**
|
|
249
|
+
* Network mismatch event — the connected wallet's effective network differs
|
|
250
|
+
* from the dApp's configured network. Emitted under ALL policies (informational);
|
|
251
|
+
* `enforced` is true when the active policy ('guard' | 'strict') will block.
|
|
252
|
+
*/
|
|
253
|
+
interface SessionNetworkMismatchEvent {
|
|
254
|
+
type: 'session:networkMismatch';
|
|
255
|
+
sessionId: SessionId;
|
|
256
|
+
/** dApp-configured (expected) network, CAIP-2 normalized. */
|
|
257
|
+
expected: string;
|
|
258
|
+
/** Wallet-reported (actual) network, CAIP-2 normalized. */
|
|
259
|
+
actual: string;
|
|
260
|
+
/** Whether the active policy will block (guard|strict) vs. detect-only (off). */
|
|
261
|
+
enforced: boolean;
|
|
262
|
+
}
|
|
235
263
|
/**
|
|
236
264
|
* Transaction status event
|
|
237
265
|
*/
|
|
@@ -252,7 +280,7 @@ interface ErrorEvent {
|
|
|
252
280
|
/**
|
|
253
281
|
* All event types
|
|
254
282
|
*/
|
|
255
|
-
type PartyLayerEvent = RegistryUpdatedEvent | RegistryStatusEvent | SessionConnectedEvent | SessionDisconnectedEvent | SessionExpiredEvent | TxStatusEvent | ErrorEvent;
|
|
283
|
+
type PartyLayerEvent = RegistryUpdatedEvent | RegistryStatusEvent | SessionConnectedEvent | SessionDisconnectedEvent | SessionExpiredEvent | SessionNetworkMismatchEvent | TxStatusEvent | ErrorEvent;
|
|
256
284
|
/**
|
|
257
285
|
* Event handler type
|
|
258
286
|
*/
|
|
@@ -303,6 +331,20 @@ declare class PartyLayerClient {
|
|
|
303
331
|
* List available wallets
|
|
304
332
|
*/
|
|
305
333
|
listWallets(filter?: WalletFilter): Promise<WalletInfo[]>;
|
|
334
|
+
/** Active network-enforcement policy (default 'guard'). */
|
|
335
|
+
private get enforcement();
|
|
336
|
+
/**
|
|
337
|
+
* Detect a confident network mismatch between the dApp's configured network
|
|
338
|
+
* and the session's (wallet-reported) network. Returns null when they match
|
|
339
|
+
* or the comparison isn't confident (conservative — never a false positive).
|
|
340
|
+
*/
|
|
341
|
+
private networkMismatch;
|
|
342
|
+
/**
|
|
343
|
+
* Guard a transaction-class operation: throw `NetworkMismatchError` when the
|
|
344
|
+
* session is on the wrong network AND the policy enforces it ('guard' |
|
|
345
|
+
* 'strict'). Also protects restored sessions and mid-session network switches.
|
|
346
|
+
*/
|
|
347
|
+
private assertNetworkOk;
|
|
306
348
|
/**
|
|
307
349
|
* Connect to a wallet
|
|
308
350
|
*/
|
package/dist/index.js
CHANGED
|
@@ -489,6 +489,29 @@ var PartyLayerClient = class {
|
|
|
489
489
|
}
|
|
490
490
|
return registryWallets;
|
|
491
491
|
}
|
|
492
|
+
/** Active network-enforcement policy (default 'guard'). */
|
|
493
|
+
get enforcement() {
|
|
494
|
+
return this.config.networkEnforcement ?? "guard";
|
|
495
|
+
}
|
|
496
|
+
/**
|
|
497
|
+
* Detect a confident network mismatch between the dApp's configured network
|
|
498
|
+
* and the session's (wallet-reported) network. Returns null when they match
|
|
499
|
+
* or the comparison isn't confident (conservative — never a false positive).
|
|
500
|
+
*/
|
|
501
|
+
networkMismatch(session) {
|
|
502
|
+
return core.detectNetworkMismatch(this.config.network, session.network);
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Guard a transaction-class operation: throw `NetworkMismatchError` when the
|
|
506
|
+
* session is on the wrong network AND the policy enforces it ('guard' |
|
|
507
|
+
* 'strict'). Also protects restored sessions and mid-session network switches.
|
|
508
|
+
*/
|
|
509
|
+
assertNetworkOk(session) {
|
|
510
|
+
const mm = this.networkMismatch(session);
|
|
511
|
+
if (mm && this.enforcement !== "off") {
|
|
512
|
+
throw new core.NetworkMismatchError(mm.expected, mm.actual);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
492
515
|
/**
|
|
493
516
|
* Connect to a wallet
|
|
494
517
|
*/
|
|
@@ -582,13 +605,31 @@ var PartyLayerClient = class {
|
|
|
582
605
|
sessionId: core.toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`),
|
|
583
606
|
walletId: selectedWallet.walletId,
|
|
584
607
|
partyId: result.partyId,
|
|
585
|
-
network
|
|
608
|
+
// The wallet's reported network (adapters that read the live wallet —
|
|
609
|
+
// e.g. Console via getActiveNetwork — surface the actual network here;
|
|
610
|
+
// echo-only adapters report ctx.network === config.network). Used for
|
|
611
|
+
// mismatch detection; falls back to the configured network.
|
|
612
|
+
network: result.session.network ?? this.config.network,
|
|
586
613
|
createdAt: Date.now(),
|
|
587
614
|
expiresAt: result.session.expiresAt,
|
|
588
615
|
origin: this.origin,
|
|
589
616
|
capabilitiesSnapshot: result.capabilities,
|
|
590
617
|
metadata: result.session.metadata
|
|
591
618
|
};
|
|
619
|
+
const mismatch = this.networkMismatch(session);
|
|
620
|
+
if (mismatch) {
|
|
621
|
+
session.networkMismatch = mismatch;
|
|
622
|
+
this.emit("session:networkMismatch", {
|
|
623
|
+
type: "session:networkMismatch",
|
|
624
|
+
sessionId: session.sessionId,
|
|
625
|
+
expected: mismatch.expected,
|
|
626
|
+
actual: mismatch.actual,
|
|
627
|
+
enforced: this.enforcement !== "off"
|
|
628
|
+
});
|
|
629
|
+
if (this.enforcement === "strict") {
|
|
630
|
+
throw new core.NetworkMismatchError(mismatch.expected, mismatch.actual);
|
|
631
|
+
}
|
|
632
|
+
}
|
|
592
633
|
await this.persistSession(session);
|
|
593
634
|
this.activeSession = session;
|
|
594
635
|
this.updateRegistryStatus();
|
|
@@ -672,6 +713,7 @@ var PartyLayerClient = class {
|
|
|
672
713
|
);
|
|
673
714
|
}
|
|
674
715
|
try {
|
|
716
|
+
this.assertNetworkOk(session);
|
|
675
717
|
const ctx = this.createAdapterContext();
|
|
676
718
|
return await adapter.signMessage(ctx, session, params);
|
|
677
719
|
} catch (err) {
|
|
@@ -699,6 +741,7 @@ var PartyLayerClient = class {
|
|
|
699
741
|
);
|
|
700
742
|
}
|
|
701
743
|
try {
|
|
744
|
+
this.assertNetworkOk(session);
|
|
702
745
|
const ctx = this.createAdapterContext();
|
|
703
746
|
const result = await adapter.signTransaction(ctx, session, params);
|
|
704
747
|
this.emit("tx:status", {
|
|
@@ -734,6 +777,7 @@ var PartyLayerClient = class {
|
|
|
734
777
|
);
|
|
735
778
|
}
|
|
736
779
|
try {
|
|
780
|
+
this.assertNetworkOk(session);
|
|
737
781
|
const ctx = this.createAdapterContext();
|
|
738
782
|
const result = await adapter.submitTransaction(ctx, session, params);
|
|
739
783
|
this.emit("tx:status", {
|
|
@@ -769,6 +813,7 @@ var PartyLayerClient = class {
|
|
|
769
813
|
);
|
|
770
814
|
}
|
|
771
815
|
try {
|
|
816
|
+
this.assertNetworkOk(session);
|
|
772
817
|
const ctx = this.createAdapterContext();
|
|
773
818
|
return await adapter.ledgerApi(ctx, session, params);
|
|
774
819
|
} catch (err) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/adapters.ts","../src/builtin-adapters.ts","../src/metrics-telemetry.ts","../src/client.ts"],"names":["ConsoleAdapter","LoopAdapter","Cantor8Adapter","NightlyAdapter","SendAdapter","hashForPrivacy","createMetricsPayload","RegistryClient","mapUnknownErrorToPartyLayerError","METRICS","WalletNotFoundError","OriginNotAllowedError","capabilityGuard","installGuard","toSessionId","CapabilityNotSupportedError","createProviderBridge","errorMetricName"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Configuration types for PartyLayer SDK\n */\n\nimport type { NetworkId, WalletId, WalletAdapter } from '@partylayer/core';\nimport type {\n StorageAdapter,\n CryptoAdapter,\n TelemetryAdapter,\n LoggerAdapter,\n} from '@partylayer/core';\n\n/**\n * Default registry URL for PartyLayer\n * This points to the official registry endpoint.\n */\nexport const DEFAULT_REGISTRY_URL = 'https://registry.partylayer.xyz';\n\n/**\n * Telemetry configuration for opt-in metrics collection\n * \n * @since 0.3.0\n */\nexport interface TelemetryConfig {\n /** \n * Enable telemetry collection\n * @default false\n */\n enabled: boolean;\n \n /** \n * Metrics backend endpoint URL\n * If not provided, metrics are collected but not sent\n */\n endpoint?: string;\n \n /**\n * Sampling rate (0.0 to 1.0)\n * @default 1.0 (100% of events)\n */\n sampleRate?: number;\n \n /**\n * Application identifier (will be hashed for privacy)\n * Used to calculate Monthly Active dApps (MAD)\n */\n appId?: string;\n \n /**\n * Include hashed origin in metrics\n * @default false\n */\n includeOrigin?: boolean;\n \n /**\n * Number of events to buffer before sending\n * @default 10\n */\n batchSize?: number;\n \n /**\n * Interval to flush metrics in milliseconds\n * @default 30000 (30 seconds)\n */\n flushIntervalMs?: number;\n \n /**\n * Network to include in metrics\n * If not provided, uses the SDK's configured network\n */\n network?: NetworkId;\n}\n\n/**\n * Adapter class type (for instantiation)\n */\nexport type AdapterClass = new () => WalletAdapter;\n\n/**\n * PartyLayer configuration\n */\nexport interface PartyLayerConfig {\n /** \n * Registry URL (optional)\n * @default 'https://registry.partylayer.xyz/v1/wallets.json'\n */\n registryUrl?: string;\n /** Registry channel */\n channel?: 'stable' | 'beta';\n /** Default network */\n network: NetworkId;\n /** \n * Wallet adapters to register (OPTIONAL)\n * \n * By default, ALL built-in adapters are automatically registered:\n * - ConsoleAdapter (Console Wallet - browser extension)\n * - LoopAdapter (5N Loop - QR code / popup)\n * - Cantor8Adapter (Cantor8 - deep link transport)\n * \n * Note: BronAdapter requires OAuth config and is NOT included by default.\n * \n * Only provide this if you want to customize which adapters to use.\n * \n * @example\n * ```typescript\n * // Default: all adapters (recommended)\n * const client = createPartyLayer({\n * network: 'devnet',\n * app: { name: 'My dApp' },\n * // adapters not specified = all built-in adapters (Console, Loop, Cantor8)\n * });\n * \n * // Custom: only specific adapters\n * import { ConsoleAdapter } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [new ConsoleAdapter()], // Only Console Wallet\n * // ...\n * });\n * \n * // With Bron (enterprise wallet with OAuth)\n * import { BronAdapter, getBuiltinAdapters } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({ auth: {...}, api: {...} }),\n * ],\n * // ...\n * });\n * ```\n */\n adapters?: (WalletAdapter | AdapterClass)[];\n /** Storage adapter (default: browser localStorage-based encrypted) */\n storage?: StorageAdapter;\n /** Crypto adapter (default: WebCrypto) */\n crypto?: CryptoAdapter;\n /** Registry public keys for signature verification (ed25519) */\n registryPublicKeys?: string[];\n /** \n * Telemetry configuration or adapter\n * \n * Can be either:\n * - TelemetryConfig object for built-in metrics collection\n * - TelemetryAdapter instance for custom telemetry\n * \n * @default undefined (telemetry disabled)\n * @since 0.3.0 - Added TelemetryConfig support\n */\n telemetry?: TelemetryAdapter | TelemetryConfig;\n /** Logger adapter (optional) */\n logger?: LoggerAdapter;\n /** Application metadata */\n app: {\n /** Application name */\n name: string;\n /** Origin (for origin binding checks, defaults to window.location.origin) */\n origin?: string;\n };\n}\n\n/**\n * Connect options\n */\nexport interface ConnectOptions {\n /** Specific wallet ID to connect to */\n walletId?: WalletId;\n /** Prefer installed wallets */\n preferInstalled?: boolean;\n /** Allow only specific wallets */\n allowWallets?: WalletId[];\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Timeout in milliseconds */\n timeoutMs?: number;\n /**\n * Called with a pairing/display URI (e.g. a WalletConnect `wc:` URI) the\n * moment the adapter produces one, before approval. Used by the connect UI\n * to render a QR / deep-link. Adapters without such a URI never call it.\n */\n onDisplayUri?: (uri: string) => void;\n}\n\n/**\n * Wallet filter options\n */\nexport interface WalletFilter {\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Include experimental wallets */\n includeExperimental?: boolean;\n}\n","/**\n * Default adapter implementations\n */\n\nimport type {\n StorageAdapter,\n CryptoAdapter,\n LoggerAdapter,\n TelemetryAdapter,\n} from '@partylayer/core';\n\n/**\n * Default logger (console-based)\n */\nexport class DefaultLogger implements LoggerAdapter {\n debug(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.info) {\n console.info(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n error(message: string, error?: unknown, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.error) {\n console.error(`[PartyLayer] ${message}`, error, ...args);\n }\n }\n}\n\n/**\n * Default crypto adapter (Web Crypto API)\n */\nexport class DefaultCrypto implements CryptoAdapter {\n private async getKey(origin: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API not available');\n }\n\n const encoder = new TextEncoder();\n const data = encoder.encode(origin);\n const hash = await crypto.subtle.digest('SHA-256', data);\n return crypto.subtle.importKey(\n 'raw',\n hash.slice(0, 32),\n { name: 'AES-GCM' },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n async encrypt(data: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback to base64\n return btoa(data);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoder = new TextEncoder();\n const encoded = encoder.encode(data);\n\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n encoded\n );\n\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n return btoa(String.fromCharCode(...combined));\n } catch {\n return btoa(data);\n }\n }\n\n async decrypt(encrypted: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n return atob(encrypted);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const combined = Uint8Array.from(atob(encrypted), (c) => c.charCodeAt(0));\n\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n data\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch {\n return atob(encrypted);\n }\n }\n\n async generateKey(): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n return Math.random().toString(36).substring(2, 15);\n }\n\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n}\n\n/**\n * Default storage adapter (localStorage-based)\n */\nexport class DefaultStorage implements StorageAdapter {\n private prefix: string;\n\n constructor(prefix = 'partylayer_') {\n this.prefix = prefix;\n }\n\n async get(key: string): Promise<string | null> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(`${this.prefix}${key}`);\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.setItem(`${this.prefix}${key}`, value);\n } catch {\n // Ignore storage errors\n }\n }\n\n async remove(key: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(`${this.prefix}${key}`);\n } catch {\n // Ignore storage errors\n }\n }\n\n async clear(): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n const keys: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix)) {\n keys.push(key);\n }\n }\n\n for (const key of keys) {\n localStorage.removeItem(key);\n }\n } catch {\n // Ignore storage errors\n }\n }\n}\n\n/**\n * Default telemetry adapter (no-op)\n */\nexport class DefaultTelemetry implements TelemetryAdapter {\n track(_event: string, _properties?: Record<string, unknown>): void {\n // No-op\n }\n\n error(_error: Error, _properties?: Record<string, unknown>): void {\n // No-op\n }\n}\n","/**\n * Built-in wallet adapters\n *\n * These adapters are automatically registered when creating a PartyLayer client.\n * dApp developers don't need to install or configure these separately.\n */\n\nimport type { WalletAdapter } from '@partylayer/core';\nimport { ConsoleAdapter } from '@partylayer/adapter-console';\nimport { LoopAdapter } from '@partylayer/adapter-loop';\nimport { Cantor8Adapter } from '@partylayer/adapter-cantor8';\nimport { NightlyAdapter } from '@partylayer/adapter-nightly';\nimport { SendAdapter } from '@partylayer/adapter-send';\n\n// Note: BronAdapter requires OAuth config and is not included by default.\n// Import it separately: import { BronAdapter } from '@partylayer/adapter-bron';\n\n/**\n * Get all built-in adapters\n *\n * This function returns instances of all supported wallet adapters.\n * Called automatically by createPartyLayer() unless custom adapters are provided.\n *\n * Included adapters:\n * - ConsoleAdapter: Console Wallet browser extension + mobile (combined mode)\n * - LoopAdapter: 5N Loop mobile/web wallet\n * - Cantor8Adapter: Cantor8 wallet with deep link transport\n * - NightlyAdapter: Nightly multichain wallet with Canton support\n * - SendAdapter: Send Canton Wallet (passkey / WebAuthn-PRF, beta) — also\n * injects at `window.canton`; the adapter's kernel.id guard keeps it\n * and Console-spec wallets from claiming each other's provider.\n *\n * Note: ConsoleAdapter defaults to 'combined' mode which supports both browser\n * extension and mobile wallet connect (QR code / deep link). To restrict to\n * extension-only, pass { target: 'local' } to the constructor.\n *\n * Note: BronAdapter is NOT included by default because it requires OAuth configuration.\n * To use Bron, install @partylayer/adapter-bron and register it manually.\n */\nexport function getBuiltinAdapters(): WalletAdapter[] {\n return [\n new ConsoleAdapter(), // Console Wallet - extension + mobile (combined)\n new LoopAdapter(), // 5N Loop - QR code / popup\n new Cantor8Adapter(), // Cantor8 - deep link transport\n new NightlyAdapter(), // Nightly - multichain wallet (injected)\n new SendAdapter(), // Send - passkey-based, kernel.id-guarded window.canton\n ];\n}\n\n/**\n * Built-in adapter classes (for advanced usage)\n */\nexport { ConsoleAdapter, LoopAdapter, Cantor8Adapter, NightlyAdapter, SendAdapter };\n\n/**\n * Re-export Console adapter types for convenience\n */\nexport type { ConsoleAdapterConfig, ConsoleConnectionTarget } from '@partylayer/adapter-console';\n\n/**\n * Re-export BronAdapter for convenience (requires config)\n *\n * @example\n * ```typescript\n * import { BronAdapter } from '@partylayer/sdk';\n *\n * const client = createPartyLayer({\n * // ... config\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({\n * auth: { clientId: '...', redirectUri: '...', ... },\n * api: { baseUrl: '...', getAccessToken: async () => '...' },\n * }),\n * ],\n * });\n * ```\n */\nexport { BronAdapter } from '@partylayer/adapter-bron';\nexport type { BronAdapterConfig, BronAuthConfig, BronApiConfig } from '@partylayer/adapter-bron';\n","/**\n * Metrics Telemetry Adapter\n * \n * A privacy-safe telemetry adapter that collects metrics for\n * ecosystem health monitoring and usage reporting.\n * \n * Features:\n * - Opt-in by default (disabled unless explicitly enabled)\n * - Privacy-safe payloads (no PII, hashed identifiers)\n * - Batched sending to reduce network overhead\n * - Configurable sampling rate\n * - Automatic flush on interval or batch size\n * \n * @since 0.3.0\n */\n\nimport type { TelemetryAdapter } from '@partylayer/core';\nimport {\n createMetricsPayload,\n hashForPrivacy,\n} from '@partylayer/core';\nimport type { TelemetryConfig } from './config';\n\n/** SDK Version - should match package.json */\nconst SDK_VERSION = '0.3.0';\n\n/**\n * Internal metric event for buffering\n */\ninterface MetricEvent {\n type: 'increment' | 'gauge';\n metric: string;\n value: number;\n timestamp: number;\n}\n\n/**\n * Metrics Telemetry Adapter\n * \n * Implements TelemetryAdapter interface with metrics-specific functionality.\n */\nexport class MetricsTelemetryAdapter implements TelemetryAdapter {\n private config: TelemetryConfig;\n private metrics: Map<string, number> = new Map();\n private buffer: MetricEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private appIdHash: string | null = null;\n private originHash: string | null = null;\n private initialized = false;\n \n constructor(config: TelemetryConfig) {\n this.config = {\n enabled: config.enabled ?? false,\n endpoint: config.endpoint,\n sampleRate: config.sampleRate ?? 1.0,\n appId: config.appId,\n includeOrigin: config.includeOrigin ?? false,\n batchSize: config.batchSize ?? 10,\n flushIntervalMs: config.flushIntervalMs ?? 30000,\n network: config.network,\n };\n \n // Initialize async hashing\n this.initialize();\n }\n \n /**\n * Initialize async components (hashing)\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n \n if (this.config.appId) {\n this.appIdHash = await hashForPrivacy(this.config.appId);\n }\n \n if (this.config.includeOrigin && typeof window !== 'undefined') {\n this.originHash = await hashForPrivacy(window.location.origin);\n }\n \n // Start flush timer\n if (this.config.enabled && this.config.flushIntervalMs) {\n this.flushTimer = setInterval(() => {\n this.flush().catch(console.error);\n }, this.config.flushIntervalMs);\n }\n \n this.initialized = true;\n }\n \n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n \n /**\n * Track a named event (TelemetryAdapter interface)\n */\n track(event: string, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n // Convert event to increment - bypass the increment sampling since we already checked\n const current = this.metrics.get(`event_${event}`) ?? 0;\n this.metrics.set(`event_${event}`, current + 1);\n this.bufferEvent({ type: 'increment', metric: `event_${event}`, value: 1, timestamp: Date.now() });\n \n // Track any numeric properties as gauges\n if (properties) {\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value === 'number') {\n this.gauge(`${event}_${key}`, value);\n }\n }\n }\n }\n \n /**\n * Track an error (TelemetryAdapter interface)\n */\n error(error: Error, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Extract error code if available\n const code = (error as { code?: string }).code ?? 'UNKNOWN';\n this.increment(`error_${code}`);\n \n // Track properties\n if (properties) {\n this.track('error', properties);\n }\n }\n \n /**\n * Increment a metric counter\n */\n increment(metric: string, value: number = 1): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n const current = this.metrics.get(metric) ?? 0;\n this.metrics.set(metric, current + value);\n \n this.bufferEvent({\n type: 'increment',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Set a gauge metric value\n */\n gauge(metric: string, value: number): void {\n if (!this.config.enabled) return;\n \n this.metrics.set(metric, value);\n \n this.bufferEvent({\n type: 'gauge',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Buffer an event for batched sending\n */\n private bufferEvent(event: MetricEvent): void {\n this.buffer.push(event);\n \n // Flush if batch size reached\n if (this.config.batchSize && this.buffer.length >= this.config.batchSize) {\n this.flush().catch(console.error);\n }\n }\n \n /**\n * Flush buffered metrics to backend\n */\n async flush(): Promise<void> {\n if (!this.config.enabled) return;\n if (this.metrics.size === 0) return;\n if (!this.config.endpoint) {\n // No endpoint configured - just clear the buffer\n this.buffer = [];\n return;\n }\n \n // Wait for initialization\n if (!this.initialized) {\n await this.initialize();\n }\n \n try {\n const payload = createMetricsPayload({\n sdkVersion: SDK_VERSION,\n network: this.config.network ?? 'unknown',\n metrics: Object.fromEntries(this.metrics),\n appIdHash: this.appIdHash ?? undefined,\n originHash: this.originHash ?? undefined,\n });\n \n await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n \n // Clear buffer on success\n this.buffer = [];\n // Note: We don't clear metrics - they accumulate until next flush\n // This allows calculating rates (e.g., errors per session)\n } catch (error) {\n // Silent fail - don't break the app for telemetry failures\n console.debug('[PartyLayer Telemetry] Flush failed:', error);\n }\n }\n \n /**\n * Get current metrics snapshot (for testing/debugging)\n */\n getMetrics(): Record<string, number> {\n return Object.fromEntries(this.metrics);\n }\n \n /**\n * Reset all metrics (for testing)\n */\n reset(): void {\n this.metrics.clear();\n this.buffer = [];\n }\n \n /**\n * Destroy the adapter (cleanup timers)\n */\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n \n // Final flush\n this.flush().catch(console.error);\n }\n}\n\n/**\n * Check if a value is a TelemetryConfig object\n */\nexport function isTelemetryConfig(value: unknown): value is TelemetryConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'enabled' in value &&\n typeof (value as TelemetryConfig).enabled === 'boolean'\n );\n}\n\n/**\n * Create a TelemetryAdapter from config\n * \n * If config is already a TelemetryAdapter, returns it.\n * If config is a TelemetryConfig, creates a MetricsTelemetryAdapter.\n */\nexport function createTelemetryAdapter(\n config: TelemetryAdapter | TelemetryConfig | undefined\n): TelemetryAdapter | undefined {\n if (!config) return undefined;\n \n if (isTelemetryConfig(config)) {\n return new MetricsTelemetryAdapter(config);\n }\n \n return config;\n}\n","/**\n * PartyLayer Client - Public API Implementation\n * \n * This is the main public API for PartyLayer SDK.\n * All dApps should use this API exclusively.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\nimport type {\n WalletId,\n SessionId,\n CapabilityKey,\n WalletInfo,\n Session,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n WalletAdapter,\n AdapterContext,\n} from '@partylayer/core';\nimport {\n toSessionId,\n WalletNotFoundError,\n CapabilityNotSupportedError,\n mapUnknownErrorToPartyLayerError,\n capabilityGuard,\n installGuard,\n} from '@partylayer/core';\nimport { RegistryClient } from '@partylayer/registry-client';\nimport type { RegistryStatus } from '@partylayer/registry-client';\nimport { createProviderBridge } from '@partylayer/provider';\nimport {\n DEFAULT_REGISTRY_URL,\n type PartyLayerConfig,\n type ConnectOptions,\n type WalletFilter,\n} from './config';\nimport type {\n PartyLayerEvent,\n EventHandler,\n} from './events';\nimport {\n DefaultLogger,\n DefaultCrypto,\n DefaultStorage,\n DefaultTelemetry,\n} from './adapters';\nimport { getBuiltinAdapters } from './builtin-adapters';\nimport { createTelemetryAdapter } from './metrics-telemetry';\nimport { METRICS, errorMetricName } from '@partylayer/core';\nimport type {\n SignMessageParams,\n SignTransactionParams,\n SubmitTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\n\n/**\n * Storage key used for the active session.\n *\n * SDK tracks a single active session at a time, so persist/restore/remove\n * all target the same key. Prior to this fix, persist wrote to\n * `session_<sessionId>` while restore read from `active_session`, which\n * meant sessions never survived a page reload.\n */\nconst SESSION_STORAGE_KEY = 'active_session';\n\n/**\n * PartyLayer Client\n * \n * Main client interface for dApps to interact with Canton wallets.\n */\nexport class PartyLayerClient {\n private config: PartyLayerConfig;\n private adapters = new Map<WalletId, WalletAdapter>();\n private eventHandlers = new Map<string, Set<EventHandler>>();\n private activeSession: Session | null = null;\n public readonly registryClient: RegistryClient; // Expose for React hooks\n private logger: import('@partylayer/core').LoggerAdapter;\n private crypto: import('@partylayer/core').CryptoAdapter;\n private storage: import('@partylayer/core').StorageAdapter;\n private telemetry?: import('@partylayer/core').TelemetryAdapter;\n private origin: string;\n\n constructor(config: PartyLayerConfig) {\n this.config = config;\n\n // Determine origin\n if (config.app.origin) {\n this.origin = config.app.origin;\n } else if (typeof window !== 'undefined') {\n this.origin = window.location.origin;\n } else {\n this.origin = 'unknown';\n }\n\n // Initialize service adapters\n this.logger = config.logger || new DefaultLogger();\n this.crypto = config.crypto || new DefaultCrypto();\n this.storage = config.storage || new DefaultStorage();\n \n // Initialize telemetry - supports both TelemetryAdapter and TelemetryConfig\n const telemetryAdapter = createTelemetryAdapter(config.telemetry);\n this.telemetry = telemetryAdapter || new DefaultTelemetry();\n\n // Register wallet adapters\n // If no adapters provided, use all built-in adapters (Console, Loop, etc.)\n const adaptersToRegister = config.adapters ?? getBuiltinAdapters();\n \n for (const adapterOrClass of adaptersToRegister) {\n let adapter: import('@partylayer/core').WalletAdapter;\n \n // Check if it's a class (function) or instance (object)\n if (typeof adapterOrClass === 'function') {\n // It's a class - instantiate it\n adapter = new (adapterOrClass as new () => import('@partylayer/core').WalletAdapter)();\n } else {\n // It's already an instance\n adapter = adapterOrClass;\n }\n \n this.adapters.set(adapter.walletId, adapter);\n this.logger.debug('Registered wallet adapter', {\n walletId: adapter.walletId,\n name: adapter.name,\n capabilities: adapter.getCapabilities(),\n });\n }\n\n // Initialize registry client with signature verification\n this.registryClient = new RegistryClient({\n registryUrl: config.registryUrl || DEFAULT_REGISTRY_URL,\n channel: config.channel || 'stable',\n registryPublicKeys: config.registryPublicKeys,\n storage: this.storage,\n });\n\n // Emit initial registry status\n this.updateRegistryStatus();\n\n // Restore session on init\n this.restoreSession().catch((err) => {\n this.emit('error', {\n type: 'error',\n error: mapUnknownErrorToPartyLayerError(err, {\n phase: 'restore',\n }),\n });\n });\n }\n\n /**\n * Register a wallet adapter\n *\n * @internal\n * This is used internally by the SDK to register adapters.\n * In production, adapters would be auto-registered via registry.\n */\n registerAdapter(adapter: WalletAdapter): void {\n this.adapters.set(adapter.walletId, adapter);\n }\n\n /**\n * Look up a registered adapter by wallet id.\n *\n * Returns the adapter instance when one is registered for the given\n * `walletId`, or `undefined` otherwise. Intended for UI integrations\n * that need to call `adapter.detectInstalled()` directly to render a\n * per-wallet readiness indicator (instead of duplicating\n * transport-specific install detection logic in the picker). The\n * returned adapter is the same instance used internally for connect /\n * sign / submit flows; do not mutate it.\n *\n * Accepts both raw string ids and the branded `WalletId` form so\n * consumers can pass `walletInfo.walletId` or a string literal\n * interchangeably.\n */\n getAdapter(walletId: string | WalletId): WalletAdapter | undefined {\n return this.adapters.get(walletId as WalletId);\n }\n\n /**\n * List available wallets\n */\n async listWallets(filter?: WalletFilter): Promise<WalletInfo[]> {\n let registryWallets: WalletInfo[];\n\n try {\n // getWallets() already returns WalletInfo[]\n registryWallets = await this.registryClient.getWallets();\n\n // Update registry status after successful fetch\n this.updateRegistryStatus();\n } catch (err) {\n // Update registry status even on error (may have fallback info)\n this.updateRegistryStatus();\n\n this.logger.warn('Registry fetch failed, using registered adapters only', {\n error: err instanceof Error ? err.message : String(err),\n });\n\n registryWallets = [];\n }\n\n // Merge: include registered adapters that are NOT in the registry\n // (e.g. NightlyAdapter is builtin but may not have a registry entry yet)\n const registryIds = new Set(registryWallets.map((w) => String(w.walletId)));\n for (const [, adapter] of this.adapters) {\n if (registryIds.has(String(adapter.walletId))) continue;\n\n registryWallets.push({\n walletId: adapter.walletId,\n name: adapter.name,\n website: '',\n icons: {},\n capabilities: adapter.getCapabilities(),\n adapter: { packageName: 'builtin', versionRange: '*' },\n docs: [],\n networks: [this.config.network || 'devnet'],\n channel: 'stable',\n } as WalletInfo);\n }\n\n // Filter by capabilities\n if (filter?.requiredCapabilities) {\n return registryWallets.filter((walletInfo) =>\n filter.requiredCapabilities!.every((cap) =>\n walletInfo.capabilities.includes(cap as CapabilityKey)\n )\n );\n }\n\n // Filter experimental\n if (!filter?.includeExperimental) {\n return registryWallets.filter((walletInfo) => walletInfo.channel === 'stable');\n }\n\n return registryWallets;\n }\n\n /**\n * Connect to a wallet\n */\n async connect(options?: ConnectOptions): Promise<Session> {\n // Track connect attempt\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_ATTEMPTS);\n \n try {\n // Get available wallets\n const wallets = await this.listWallets({\n requiredCapabilities: options?.requiredCapabilities,\n includeExperimental: true,\n });\n\n // Filter by allowWallets\n let availableWallets = wallets;\n if (options?.allowWallets) {\n availableWallets = wallets.filter((w) =>\n options.allowWallets!.includes(w.walletId)\n );\n }\n\n // Select wallet\n let selectedWallet: WalletInfo;\n let isNativeWallet = false;\n if (options?.walletId) {\n const found = availableWallets.find(\n (w) => w.walletId === options.walletId\n );\n if (found) {\n selectedWallet = found;\n } else {\n // Fallback: check if a native CIP-0103 adapter is registered\n const nativeAdapter = this.adapters.get(options.walletId);\n if (nativeAdapter) {\n isNativeWallet = true;\n selectedWallet = {\n walletId: options.walletId,\n name: nativeAdapter.name,\n website: '',\n icons: {},\n capabilities: nativeAdapter.getCapabilities(),\n adapter: { packageName: 'native-cip0103', versionRange: '*' },\n docs: [],\n networks: [this.config.network],\n channel: 'stable' as const,\n metadata: { source: 'native-cip0103' },\n };\n } else {\n throw new WalletNotFoundError(String(options.walletId));\n }\n }\n } else if (availableWallets.length === 0) {\n throw new WalletNotFoundError('No wallets available');\n } else {\n selectedWallet = availableWallets[0];\n }\n\n // Get adapter\n const adapter = this.adapters.get(selectedWallet.walletId);\n if (!adapter) {\n throw new WalletNotFoundError(String(selectedWallet.walletId));\n }\n\n // Check origin allowlist (skip for native CIP-0103 wallets and\n // adapter-merged wallets that aren't in the registry)\n if (!isNativeWallet) {\n try {\n const walletEntry = await this.registryClient.getWalletEntry(String(selectedWallet.walletId));\n if (walletEntry.originAllowlist && walletEntry.originAllowlist.length > 0) {\n if (!walletEntry.originAllowlist.includes(this.origin)) {\n const { OriginNotAllowedError } = await import('@partylayer/core');\n throw new OriginNotAllowedError(\n this.origin,\n walletEntry.originAllowlist\n );\n }\n }\n } catch (e) {\n // Wallet not in registry (adapter-merged) — skip origin check\n if (!(e instanceof WalletNotFoundError)) {\n throw e;\n }\n }\n }\n\n // Check capabilities\n if (options?.requiredCapabilities) {\n capabilityGuard(adapter, options.requiredCapabilities as CapabilityKey[]);\n }\n\n // Check installation\n await installGuard(adapter);\n\n // Create adapter context\n const ctx = this.createAdapterContext();\n\n // Connect\n // Default timeout: 2 minutes for QR code/popup based wallets\n const timeoutMs = options?.timeoutMs || 120000;\n const connectPromise = adapter.connect(ctx, {\n timeoutMs,\n partyId: undefined,\n preferInstalled: options?.preferInstalled,\n onDisplayUri: options?.onDisplayUri,\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Connection timed out after ${timeoutMs}ms - user did not complete wallet connection`));\n }, timeoutMs);\n });\n\n const result = await Promise.race([connectPromise, timeoutPromise]);\n\n // Create session\n const session: Session = {\n sessionId: toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`),\n walletId: selectedWallet.walletId,\n partyId: result.partyId,\n network: this.config.network,\n createdAt: Date.now(),\n expiresAt: result.session.expiresAt,\n origin: this.origin,\n capabilitiesSnapshot: result.capabilities,\n metadata: result.session.metadata as Record<string, string> | undefined,\n };\n\n // Persist session\n await this.persistSession(session);\n\n // Set active session\n this.activeSession = session;\n\n // Update registry status (may have changed during fetch)\n this.updateRegistryStatus();\n\n // Track successful connection\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n this.telemetry?.increment?.(METRICS.SESSIONS_CREATED);\n\n // Emit event\n this.emit('session:connected', {\n type: 'session:connected',\n session,\n });\n\n return session;\n } catch (err) {\n const timeoutMs = options?.timeoutMs || 30000;\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect',\n walletId: options?.walletId ? String(options.walletId) : undefined,\n timeoutMs,\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n if (!this.activeSession) {\n return;\n }\n\n try {\n const adapter = this.adapters.get(this.activeSession.walletId);\n if (adapter) {\n const ctx = this.createAdapterContext();\n await adapter.disconnect(ctx, this.activeSession);\n }\n\n const sessionId = this.activeSession.sessionId;\n await this.removeSession(sessionId);\n\n this.activeSession = null;\n\n this.emit('session:disconnected', {\n type: 'session:disconnected',\n sessionId,\n });\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect', // Use connect as default phase\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Get active session\n */\n async getActiveSession(): Promise<Session | null> {\n if (this.activeSession) {\n // Check expiration\n if (this.activeSession.expiresAt && Date.now() >= this.activeSession.expiresAt) {\n await this.disconnect();\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: this.activeSession.sessionId,\n });\n return null;\n }\n return this.activeSession;\n }\n\n // Try to restore from storage\n return this.restoreSession();\n }\n\n /**\n * Sign a message\n */\n async signMessage(params: SignMessageParams): Promise<SignedMessage> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signMessage) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signMessage'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.signMessage(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signMessage',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Sign a transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<SignedTransaction> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.signTransaction(ctx, session, params);\n \n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'pending',\n raw: result.signedTx,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Submit a transaction\n */\n async submitTransaction(params: SubmitTransactionParams): Promise<TxReceipt> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.submitTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'submitTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.submitTransaction(ctx, session, params);\n\n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'submitted',\n raw: result,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'submitTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Proxy a JSON Ledger API request through the active wallet adapter\n */\n async ledgerApi(params: LedgerApiParams): Promise<LedgerApiResult> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.ledgerApi) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'ledgerApi'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.ledgerApi(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'ledgerApi',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Subscribe to events\n */\n on<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n this.off(event, handler);\n };\n }\n\n /**\n * Unsubscribe from events\n */\n off<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler);\n }\n }\n\n /**\n * Get a CIP-0103 Provider backed by this client.\n *\n * This bridge routes all request() calls through the existing\n * PartyLayerClient methods and maps events to CIP-0103 format.\n *\n * The bridge implements the full CIP-0103 specification:\n * - All 10 mandatory methods including `ledgerApi` (when adapter supports it)\n * - Full transaction lifecycle: pending -> signed -> executed/failed\n * - All CIP-0103 events: statusChanged, accountsChanged, txChanged, connected\n *\n * **Note:** Async wallets (userUrl pattern) are not supported through the\n * bridge. For async wallet support, use `PartyLayerProvider` directly.\n *\n * @returns CIP-0103 compliant Provider\n */\n asProvider(): import('@partylayer/core').CIP0103Provider {\n // Static import (top of file) — a runtime `require('@partylayer/provider')`\n // hits esbuild's `__require` shim in the ESM build and throws \"Dynamic\n // require not supported\" in browser bundles (dev + prod), crashing\n // PartyLayerKit on mount. `@partylayer/provider` does not import\n // `@partylayer/sdk`, so the static import introduces no cycle.\n return createProviderBridge(this);\n }\n\n /**\n * Destroy client and cleanup\n */\n destroy(): void {\n // Flush and destroy telemetry if it supports it\n if (this.telemetry && 'destroy' in this.telemetry && typeof this.telemetry.destroy === 'function') {\n (this.telemetry as { destroy: () => void }).destroy();\n } else if (this.telemetry?.flush) {\n this.telemetry.flush().catch(() => {});\n }\n \n this.eventHandlers.clear();\n this.activeSession = null;\n }\n\n /**\n * Create adapter context\n */\n private createAdapterContext(): AdapterContext {\n return {\n appName: this.config.app.name,\n origin: this.origin,\n network: this.config.network,\n logger: this.logger,\n telemetry: this.telemetry,\n registry: {\n getWallet: async (walletId: WalletId) => {\n return this.registryClient.getWallet(String(walletId));\n },\n },\n crypto: this.crypto,\n storage: this.storage,\n timeout: (ms: number) => {\n return new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Timeout')), ms);\n });\n },\n };\n }\n\n\n /**\n * Persist session to storage\n */\n private async persistSession(session: Session): Promise<void> {\n try {\n const data = JSON.stringify(session);\n const encrypted = await this.crypto.encrypt(data, this.origin);\n await this.storage.set(SESSION_STORAGE_KEY, encrypted);\n } catch (err) {\n this.logger.warn('Failed to persist session', err);\n }\n }\n\n /**\n * Remove session from storage.\n *\n * Accepts a sessionId for call-site symmetry, but since the SDK tracks one\n * active session we always remove the single SESSION_STORAGE_KEY.\n */\n private async removeSession(_sessionId: SessionId): Promise<void> {\n try {\n await this.storage.remove(SESSION_STORAGE_KEY);\n } catch (err) {\n this.logger.warn('Failed to remove session', err);\n }\n }\n\n /**\n * Restore session from storage\n */\n private async restoreSession(): Promise<Session | null> {\n // Track restore attempt\n this.telemetry?.increment?.(METRICS.RESTORE_ATTEMPTS);\n\n try {\n const encrypted = await this.storage.get(SESSION_STORAGE_KEY);\n if (!encrypted) {\n return null;\n }\n\n const decrypted = await this.crypto.decrypt(encrypted, this.origin);\n const session = JSON.parse(decrypted) as Session;\n\n // Check expiration\n if (session.expiresAt && Date.now() >= session.expiresAt) {\n await this.removeSession(session.sessionId);\n return null;\n }\n\n // Check origin\n if (session.origin !== this.origin) {\n return null;\n }\n\n // Try to restore with adapter\n const adapter = this.adapters.get(session.walletId);\n if (adapter?.restore) {\n const ctx = this.createAdapterContext();\n const restored = await adapter.restore(ctx, {\n ...session,\n encrypted,\n });\n\n if (restored) {\n this.activeSession = restored;\n // Persist restored session (may have updated metadata)\n await this.persistSession(restored);\n \n // Track successful restore\n this.telemetry?.increment?.(METRICS.SESSIONS_RESTORED);\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n \n // Emit session:connected event with reason=\"restore\"\n this.emit('session:connected', {\n type: 'session:connected',\n session: restored,\n });\n return restored;\n } else {\n // Restore failed - clear session\n await this.removeSession(session.sessionId);\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: session.sessionId,\n });\n return null;\n }\n }\n\n // If restore not supported, use stored session as-is\n // (Some adapters don't support restore but session metadata is still valid)\n this.activeSession = session;\n return session;\n } catch (err) {\n this.logger.warn('Failed to restore session', err);\n return null;\n }\n }\n\n /**\n * Update registry status and emit event\n */\n private updateRegistryStatus(): void {\n const status = this.registryClient.getStatus();\n if (status) {\n // Track registry metrics\n if (status.source === 'network') {\n this.telemetry?.increment?.(METRICS.REGISTRY_FETCH);\n } else if (status.source === 'cache') {\n this.telemetry?.increment?.(METRICS.REGISTRY_CACHE_HIT);\n }\n if (status.stale) {\n this.telemetry?.increment?.(METRICS.REGISTRY_STALE);\n }\n \n this.emit('registry:status', {\n type: 'registry:status',\n status: {\n source: status.source,\n verified: status.verified,\n channel: status.channel,\n sequence: status.sequence,\n stale: status.stale,\n fetchedAt: status.fetchedAt,\n etag: status.etag,\n error: status.error,\n },\n });\n }\n }\n\n /**\n * Get registry status\n */\n getRegistryStatus(): RegistryStatus | null {\n return this.registryClient.getStatus();\n }\n\n /**\n * Emit event to handlers\n */\n private emit<T extends PartyLayerEvent>(\n event: T['type'],\n payload: T\n ): void {\n // Track error metrics\n if (event === 'error' && 'error' in payload) {\n const error = payload.error as { code?: string };\n if (error.code) {\n this.telemetry?.increment?.(errorMetricName(error.code));\n }\n }\n \n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(payload);\n } catch (err) {\n this.logger.error('Error in event handler', err);\n }\n }\n }\n }\n}\n\n/**\n * Create PartyLayer client\n * \n * This is the main entry point for dApps.\n * \n * @example\n * ```typescript\n * const client = createPartyLayer({\n * registryUrl: 'https://registry.partylayer.xyz',\n * channel: 'stable',\n * network: 'devnet',\n * app: { name: 'My dApp' }\n * });\n * \n * const session = await client.connect();\n * ```\n */\nexport function createPartyLayer(\n config: PartyLayerConfig\n): PartyLayerClient {\n return new PartyLayerClient(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/adapters.ts","../src/builtin-adapters.ts","../src/metrics-telemetry.ts","../src/client.ts"],"names":["ConsoleAdapter","LoopAdapter","Cantor8Adapter","NightlyAdapter","SendAdapter","hashForPrivacy","createMetricsPayload","RegistryClient","mapUnknownErrorToPartyLayerError","detectNetworkMismatch","NetworkMismatchError","METRICS","WalletNotFoundError","OriginNotAllowedError","capabilityGuard","installGuard","toSessionId","CapabilityNotSupportedError","createProviderBridge","errorMetricName"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Configuration types for PartyLayer SDK\n */\n\nimport type { NetworkId, WalletId, WalletAdapter } from '@partylayer/core';\nimport type {\n StorageAdapter,\n CryptoAdapter,\n TelemetryAdapter,\n LoggerAdapter,\n} from '@partylayer/core';\n\n/**\n * Default registry URL for PartyLayer\n * This points to the official registry endpoint.\n */\nexport const DEFAULT_REGISTRY_URL = 'https://registry.partylayer.xyz';\n\n/**\n * Telemetry configuration for opt-in metrics collection\n * \n * @since 0.3.0\n */\nexport interface TelemetryConfig {\n /** \n * Enable telemetry collection\n * @default false\n */\n enabled: boolean;\n \n /** \n * Metrics backend endpoint URL\n * If not provided, metrics are collected but not sent\n */\n endpoint?: string;\n \n /**\n * Sampling rate (0.0 to 1.0)\n * @default 1.0 (100% of events)\n */\n sampleRate?: number;\n \n /**\n * Application identifier (will be hashed for privacy)\n * Used to calculate Monthly Active dApps (MAD)\n */\n appId?: string;\n \n /**\n * Include hashed origin in metrics\n * @default false\n */\n includeOrigin?: boolean;\n \n /**\n * Number of events to buffer before sending\n * @default 10\n */\n batchSize?: number;\n \n /**\n * Interval to flush metrics in milliseconds\n * @default 30000 (30 seconds)\n */\n flushIntervalMs?: number;\n \n /**\n * Network to include in metrics\n * If not provided, uses the SDK's configured network\n */\n network?: NetworkId;\n}\n\n/**\n * Adapter class type (for instantiation)\n */\nexport type AdapterClass = new () => WalletAdapter;\n\n/**\n * PartyLayer configuration\n */\nexport interface PartyLayerConfig {\n /** \n * Registry URL (optional)\n * @default 'https://registry.partylayer.xyz/v1/wallets.json'\n */\n registryUrl?: string;\n /** Registry channel */\n channel?: 'stable' | 'beta';\n /** Default network */\n network: NetworkId;\n /**\n * Network-mismatch enforcement policy (default: `'guard'`).\n *\n * When a connected wallet's effective network differs from `network`:\n * - `'off'` — detect + emit `session:networkMismatch` only; never block.\n * - `'guard'` — (default) block wrong-network TRANSACTIONS (signMessage,\n * signTransaction, submitTransaction, ledgerApi); connect still succeeds.\n * - `'strict'` — also block CONNECT (throws `NetworkMismatchError`).\n *\n * BEHAVIOR CHANGE: prior to this, wrong-network transactions always\n * proceeded. Set `'off'` to restore that.\n */\n networkEnforcement?: 'off' | 'guard' | 'strict';\n /** \n * Wallet adapters to register (OPTIONAL)\n * \n * By default, ALL built-in adapters are automatically registered:\n * - ConsoleAdapter (Console Wallet - browser extension)\n * - LoopAdapter (5N Loop - QR code / popup)\n * - Cantor8Adapter (Cantor8 - deep link transport)\n * \n * Note: BronAdapter requires OAuth config and is NOT included by default.\n * \n * Only provide this if you want to customize which adapters to use.\n * \n * @example\n * ```typescript\n * // Default: all adapters (recommended)\n * const client = createPartyLayer({\n * network: 'devnet',\n * app: { name: 'My dApp' },\n * // adapters not specified = all built-in adapters (Console, Loop, Cantor8)\n * });\n * \n * // Custom: only specific adapters\n * import { ConsoleAdapter } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [new ConsoleAdapter()], // Only Console Wallet\n * // ...\n * });\n * \n * // With Bron (enterprise wallet with OAuth)\n * import { BronAdapter, getBuiltinAdapters } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({ auth: {...}, api: {...} }),\n * ],\n * // ...\n * });\n * ```\n */\n adapters?: (WalletAdapter | AdapterClass)[];\n /** Storage adapter (default: browser localStorage-based encrypted) */\n storage?: StorageAdapter;\n /** Crypto adapter (default: WebCrypto) */\n crypto?: CryptoAdapter;\n /** Registry public keys for signature verification (ed25519) */\n registryPublicKeys?: string[];\n /** \n * Telemetry configuration or adapter\n * \n * Can be either:\n * - TelemetryConfig object for built-in metrics collection\n * - TelemetryAdapter instance for custom telemetry\n * \n * @default undefined (telemetry disabled)\n * @since 0.3.0 - Added TelemetryConfig support\n */\n telemetry?: TelemetryAdapter | TelemetryConfig;\n /** Logger adapter (optional) */\n logger?: LoggerAdapter;\n /** Application metadata */\n app: {\n /** Application name */\n name: string;\n /** Origin (for origin binding checks, defaults to window.location.origin) */\n origin?: string;\n };\n}\n\n/**\n * Connect options\n */\nexport interface ConnectOptions {\n /** Specific wallet ID to connect to */\n walletId?: WalletId;\n /** Prefer installed wallets */\n preferInstalled?: boolean;\n /** Allow only specific wallets */\n allowWallets?: WalletId[];\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Timeout in milliseconds */\n timeoutMs?: number;\n /**\n * Called with a pairing/display URI (e.g. a WalletConnect `wc:` URI) the\n * moment the adapter produces one, before approval. Used by the connect UI\n * to render a QR / deep-link. Adapters without such a URI never call it.\n */\n onDisplayUri?: (uri: string) => void;\n}\n\n/**\n * Wallet filter options\n */\nexport interface WalletFilter {\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Include experimental wallets */\n includeExperimental?: boolean;\n}\n","/**\n * Default adapter implementations\n */\n\nimport type {\n StorageAdapter,\n CryptoAdapter,\n LoggerAdapter,\n TelemetryAdapter,\n} from '@partylayer/core';\n\n/**\n * Default logger (console-based)\n */\nexport class DefaultLogger implements LoggerAdapter {\n debug(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.info) {\n console.info(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n error(message: string, error?: unknown, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.error) {\n console.error(`[PartyLayer] ${message}`, error, ...args);\n }\n }\n}\n\n/**\n * Default crypto adapter (Web Crypto API)\n */\nexport class DefaultCrypto implements CryptoAdapter {\n private async getKey(origin: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API not available');\n }\n\n const encoder = new TextEncoder();\n const data = encoder.encode(origin);\n const hash = await crypto.subtle.digest('SHA-256', data);\n return crypto.subtle.importKey(\n 'raw',\n hash.slice(0, 32),\n { name: 'AES-GCM' },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n async encrypt(data: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback to base64\n return btoa(data);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoder = new TextEncoder();\n const encoded = encoder.encode(data);\n\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n encoded\n );\n\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n return btoa(String.fromCharCode(...combined));\n } catch {\n return btoa(data);\n }\n }\n\n async decrypt(encrypted: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n return atob(encrypted);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const combined = Uint8Array.from(atob(encrypted), (c) => c.charCodeAt(0));\n\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n data\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch {\n return atob(encrypted);\n }\n }\n\n async generateKey(): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n return Math.random().toString(36).substring(2, 15);\n }\n\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n}\n\n/**\n * Default storage adapter (localStorage-based)\n */\nexport class DefaultStorage implements StorageAdapter {\n private prefix: string;\n\n constructor(prefix = 'partylayer_') {\n this.prefix = prefix;\n }\n\n async get(key: string): Promise<string | null> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(`${this.prefix}${key}`);\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.setItem(`${this.prefix}${key}`, value);\n } catch {\n // Ignore storage errors\n }\n }\n\n async remove(key: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(`${this.prefix}${key}`);\n } catch {\n // Ignore storage errors\n }\n }\n\n async clear(): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n const keys: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix)) {\n keys.push(key);\n }\n }\n\n for (const key of keys) {\n localStorage.removeItem(key);\n }\n } catch {\n // Ignore storage errors\n }\n }\n}\n\n/**\n * Default telemetry adapter (no-op)\n */\nexport class DefaultTelemetry implements TelemetryAdapter {\n track(_event: string, _properties?: Record<string, unknown>): void {\n // No-op\n }\n\n error(_error: Error, _properties?: Record<string, unknown>): void {\n // No-op\n }\n}\n","/**\n * Built-in wallet adapters\n *\n * These adapters are automatically registered when creating a PartyLayer client.\n * dApp developers don't need to install or configure these separately.\n */\n\nimport type { WalletAdapter } from '@partylayer/core';\nimport { ConsoleAdapter } from '@partylayer/adapter-console';\nimport { LoopAdapter } from '@partylayer/adapter-loop';\nimport { Cantor8Adapter } from '@partylayer/adapter-cantor8';\nimport { NightlyAdapter } from '@partylayer/adapter-nightly';\nimport { SendAdapter } from '@partylayer/adapter-send';\n\n// Note: BronAdapter requires OAuth config and is not included by default.\n// Import it separately: import { BronAdapter } from '@partylayer/adapter-bron';\n\n/**\n * Get all built-in adapters\n *\n * This function returns instances of all supported wallet adapters.\n * Called automatically by createPartyLayer() unless custom adapters are provided.\n *\n * Included adapters:\n * - ConsoleAdapter: Console Wallet browser extension + mobile (combined mode)\n * - LoopAdapter: 5N Loop mobile/web wallet\n * - Cantor8Adapter: Cantor8 wallet with deep link transport\n * - NightlyAdapter: Nightly multichain wallet with Canton support\n * - SendAdapter: Send Canton Wallet (passkey / WebAuthn-PRF, beta) — also\n * injects at `window.canton`; the adapter's kernel.id guard keeps it\n * and Console-spec wallets from claiming each other's provider.\n *\n * Note: ConsoleAdapter defaults to 'combined' mode which supports both browser\n * extension and mobile wallet connect (QR code / deep link). To restrict to\n * extension-only, pass { target: 'local' } to the constructor.\n *\n * Note: BronAdapter is NOT included by default because it requires OAuth configuration.\n * To use Bron, install @partylayer/adapter-bron and register it manually.\n */\nexport function getBuiltinAdapters(): WalletAdapter[] {\n return [\n new ConsoleAdapter(), // Console Wallet - extension + mobile (combined)\n new LoopAdapter(), // 5N Loop - QR code / popup\n new Cantor8Adapter(), // Cantor8 - deep link transport\n new NightlyAdapter(), // Nightly - multichain wallet (injected)\n new SendAdapter(), // Send - passkey-based, kernel.id-guarded window.canton\n ];\n}\n\n/**\n * Built-in adapter classes (for advanced usage)\n */\nexport { ConsoleAdapter, LoopAdapter, Cantor8Adapter, NightlyAdapter, SendAdapter };\n\n/**\n * Re-export Console adapter types for convenience\n */\nexport type { ConsoleAdapterConfig, ConsoleConnectionTarget } from '@partylayer/adapter-console';\n\n/**\n * Re-export BronAdapter for convenience (requires config)\n *\n * @example\n * ```typescript\n * import { BronAdapter } from '@partylayer/sdk';\n *\n * const client = createPartyLayer({\n * // ... config\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({\n * auth: { clientId: '...', redirectUri: '...', ... },\n * api: { baseUrl: '...', getAccessToken: async () => '...' },\n * }),\n * ],\n * });\n * ```\n */\nexport { BronAdapter } from '@partylayer/adapter-bron';\nexport type { BronAdapterConfig, BronAuthConfig, BronApiConfig } from '@partylayer/adapter-bron';\n","/**\n * Metrics Telemetry Adapter\n * \n * A privacy-safe telemetry adapter that collects metrics for\n * ecosystem health monitoring and usage reporting.\n * \n * Features:\n * - Opt-in by default (disabled unless explicitly enabled)\n * - Privacy-safe payloads (no PII, hashed identifiers)\n * - Batched sending to reduce network overhead\n * - Configurable sampling rate\n * - Automatic flush on interval or batch size\n * \n * @since 0.3.0\n */\n\nimport type { TelemetryAdapter } from '@partylayer/core';\nimport {\n createMetricsPayload,\n hashForPrivacy,\n} from '@partylayer/core';\nimport type { TelemetryConfig } from './config';\n\n/** SDK Version - should match package.json */\nconst SDK_VERSION = '0.3.0';\n\n/**\n * Internal metric event for buffering\n */\ninterface MetricEvent {\n type: 'increment' | 'gauge';\n metric: string;\n value: number;\n timestamp: number;\n}\n\n/**\n * Metrics Telemetry Adapter\n * \n * Implements TelemetryAdapter interface with metrics-specific functionality.\n */\nexport class MetricsTelemetryAdapter implements TelemetryAdapter {\n private config: TelemetryConfig;\n private metrics: Map<string, number> = new Map();\n private buffer: MetricEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private appIdHash: string | null = null;\n private originHash: string | null = null;\n private initialized = false;\n \n constructor(config: TelemetryConfig) {\n this.config = {\n enabled: config.enabled ?? false,\n endpoint: config.endpoint,\n sampleRate: config.sampleRate ?? 1.0,\n appId: config.appId,\n includeOrigin: config.includeOrigin ?? false,\n batchSize: config.batchSize ?? 10,\n flushIntervalMs: config.flushIntervalMs ?? 30000,\n network: config.network,\n };\n \n // Initialize async hashing\n this.initialize();\n }\n \n /**\n * Initialize async components (hashing)\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n \n if (this.config.appId) {\n this.appIdHash = await hashForPrivacy(this.config.appId);\n }\n \n if (this.config.includeOrigin && typeof window !== 'undefined') {\n this.originHash = await hashForPrivacy(window.location.origin);\n }\n \n // Start flush timer\n if (this.config.enabled && this.config.flushIntervalMs) {\n this.flushTimer = setInterval(() => {\n this.flush().catch(console.error);\n }, this.config.flushIntervalMs);\n }\n \n this.initialized = true;\n }\n \n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n \n /**\n * Track a named event (TelemetryAdapter interface)\n */\n track(event: string, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n // Convert event to increment - bypass the increment sampling since we already checked\n const current = this.metrics.get(`event_${event}`) ?? 0;\n this.metrics.set(`event_${event}`, current + 1);\n this.bufferEvent({ type: 'increment', metric: `event_${event}`, value: 1, timestamp: Date.now() });\n \n // Track any numeric properties as gauges\n if (properties) {\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value === 'number') {\n this.gauge(`${event}_${key}`, value);\n }\n }\n }\n }\n \n /**\n * Track an error (TelemetryAdapter interface)\n */\n error(error: Error, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Extract error code if available\n const code = (error as { code?: string }).code ?? 'UNKNOWN';\n this.increment(`error_${code}`);\n \n // Track properties\n if (properties) {\n this.track('error', properties);\n }\n }\n \n /**\n * Increment a metric counter\n */\n increment(metric: string, value: number = 1): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n const current = this.metrics.get(metric) ?? 0;\n this.metrics.set(metric, current + value);\n \n this.bufferEvent({\n type: 'increment',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Set a gauge metric value\n */\n gauge(metric: string, value: number): void {\n if (!this.config.enabled) return;\n \n this.metrics.set(metric, value);\n \n this.bufferEvent({\n type: 'gauge',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Buffer an event for batched sending\n */\n private bufferEvent(event: MetricEvent): void {\n this.buffer.push(event);\n \n // Flush if batch size reached\n if (this.config.batchSize && this.buffer.length >= this.config.batchSize) {\n this.flush().catch(console.error);\n }\n }\n \n /**\n * Flush buffered metrics to backend\n */\n async flush(): Promise<void> {\n if (!this.config.enabled) return;\n if (this.metrics.size === 0) return;\n if (!this.config.endpoint) {\n // No endpoint configured - just clear the buffer\n this.buffer = [];\n return;\n }\n \n // Wait for initialization\n if (!this.initialized) {\n await this.initialize();\n }\n \n try {\n const payload = createMetricsPayload({\n sdkVersion: SDK_VERSION,\n network: this.config.network ?? 'unknown',\n metrics: Object.fromEntries(this.metrics),\n appIdHash: this.appIdHash ?? undefined,\n originHash: this.originHash ?? undefined,\n });\n \n await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n \n // Clear buffer on success\n this.buffer = [];\n // Note: We don't clear metrics - they accumulate until next flush\n // This allows calculating rates (e.g., errors per session)\n } catch (error) {\n // Silent fail - don't break the app for telemetry failures\n console.debug('[PartyLayer Telemetry] Flush failed:', error);\n }\n }\n \n /**\n * Get current metrics snapshot (for testing/debugging)\n */\n getMetrics(): Record<string, number> {\n return Object.fromEntries(this.metrics);\n }\n \n /**\n * Reset all metrics (for testing)\n */\n reset(): void {\n this.metrics.clear();\n this.buffer = [];\n }\n \n /**\n * Destroy the adapter (cleanup timers)\n */\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n \n // Final flush\n this.flush().catch(console.error);\n }\n}\n\n/**\n * Check if a value is a TelemetryConfig object\n */\nexport function isTelemetryConfig(value: unknown): value is TelemetryConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'enabled' in value &&\n typeof (value as TelemetryConfig).enabled === 'boolean'\n );\n}\n\n/**\n * Create a TelemetryAdapter from config\n * \n * If config is already a TelemetryAdapter, returns it.\n * If config is a TelemetryConfig, creates a MetricsTelemetryAdapter.\n */\nexport function createTelemetryAdapter(\n config: TelemetryAdapter | TelemetryConfig | undefined\n): TelemetryAdapter | undefined {\n if (!config) return undefined;\n \n if (isTelemetryConfig(config)) {\n return new MetricsTelemetryAdapter(config);\n }\n \n return config;\n}\n","/**\n * PartyLayer Client - Public API Implementation\n * \n * This is the main public API for PartyLayer SDK.\n * All dApps should use this API exclusively.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\nimport type {\n WalletId,\n SessionId,\n CapabilityKey,\n WalletInfo,\n Session,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n WalletAdapter,\n AdapterContext,\n NetworkId,\n} from '@partylayer/core';\nimport {\n toSessionId,\n WalletNotFoundError,\n CapabilityNotSupportedError,\n NetworkMismatchError,\n detectNetworkMismatch,\n mapUnknownErrorToPartyLayerError,\n capabilityGuard,\n installGuard,\n} from '@partylayer/core';\nimport { RegistryClient } from '@partylayer/registry-client';\nimport type { RegistryStatus } from '@partylayer/registry-client';\nimport { createProviderBridge } from '@partylayer/provider';\nimport {\n DEFAULT_REGISTRY_URL,\n type PartyLayerConfig,\n type ConnectOptions,\n type WalletFilter,\n} from './config';\nimport type {\n PartyLayerEvent,\n EventHandler,\n} from './events';\nimport {\n DefaultLogger,\n DefaultCrypto,\n DefaultStorage,\n DefaultTelemetry,\n} from './adapters';\nimport { getBuiltinAdapters } from './builtin-adapters';\nimport { createTelemetryAdapter } from './metrics-telemetry';\nimport { METRICS, errorMetricName } from '@partylayer/core';\nimport type {\n SignMessageParams,\n SignTransactionParams,\n SubmitTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\n\n/**\n * Storage key used for the active session.\n *\n * SDK tracks a single active session at a time, so persist/restore/remove\n * all target the same key. Prior to this fix, persist wrote to\n * `session_<sessionId>` while restore read from `active_session`, which\n * meant sessions never survived a page reload.\n */\nconst SESSION_STORAGE_KEY = 'active_session';\n\n/**\n * PartyLayer Client\n * \n * Main client interface for dApps to interact with Canton wallets.\n */\nexport class PartyLayerClient {\n private config: PartyLayerConfig;\n private adapters = new Map<WalletId, WalletAdapter>();\n private eventHandlers = new Map<string, Set<EventHandler>>();\n private activeSession: Session | null = null;\n public readonly registryClient: RegistryClient; // Expose for React hooks\n private logger: import('@partylayer/core').LoggerAdapter;\n private crypto: import('@partylayer/core').CryptoAdapter;\n private storage: import('@partylayer/core').StorageAdapter;\n private telemetry?: import('@partylayer/core').TelemetryAdapter;\n private origin: string;\n\n constructor(config: PartyLayerConfig) {\n this.config = config;\n\n // Determine origin\n if (config.app.origin) {\n this.origin = config.app.origin;\n } else if (typeof window !== 'undefined') {\n this.origin = window.location.origin;\n } else {\n this.origin = 'unknown';\n }\n\n // Initialize service adapters\n this.logger = config.logger || new DefaultLogger();\n this.crypto = config.crypto || new DefaultCrypto();\n this.storage = config.storage || new DefaultStorage();\n \n // Initialize telemetry - supports both TelemetryAdapter and TelemetryConfig\n const telemetryAdapter = createTelemetryAdapter(config.telemetry);\n this.telemetry = telemetryAdapter || new DefaultTelemetry();\n\n // Register wallet adapters\n // If no adapters provided, use all built-in adapters (Console, Loop, etc.)\n const adaptersToRegister = config.adapters ?? getBuiltinAdapters();\n \n for (const adapterOrClass of adaptersToRegister) {\n let adapter: import('@partylayer/core').WalletAdapter;\n \n // Check if it's a class (function) or instance (object)\n if (typeof adapterOrClass === 'function') {\n // It's a class - instantiate it\n adapter = new (adapterOrClass as new () => import('@partylayer/core').WalletAdapter)();\n } else {\n // It's already an instance\n adapter = adapterOrClass;\n }\n \n this.adapters.set(adapter.walletId, adapter);\n this.logger.debug('Registered wallet adapter', {\n walletId: adapter.walletId,\n name: adapter.name,\n capabilities: adapter.getCapabilities(),\n });\n }\n\n // Initialize registry client with signature verification\n this.registryClient = new RegistryClient({\n registryUrl: config.registryUrl || DEFAULT_REGISTRY_URL,\n channel: config.channel || 'stable',\n registryPublicKeys: config.registryPublicKeys,\n storage: this.storage,\n });\n\n // Emit initial registry status\n this.updateRegistryStatus();\n\n // Restore session on init\n this.restoreSession().catch((err) => {\n this.emit('error', {\n type: 'error',\n error: mapUnknownErrorToPartyLayerError(err, {\n phase: 'restore',\n }),\n });\n });\n }\n\n /**\n * Register a wallet adapter\n *\n * @internal\n * This is used internally by the SDK to register adapters.\n * In production, adapters would be auto-registered via registry.\n */\n registerAdapter(adapter: WalletAdapter): void {\n this.adapters.set(adapter.walletId, adapter);\n }\n\n /**\n * Look up a registered adapter by wallet id.\n *\n * Returns the adapter instance when one is registered for the given\n * `walletId`, or `undefined` otherwise. Intended for UI integrations\n * that need to call `adapter.detectInstalled()` directly to render a\n * per-wallet readiness indicator (instead of duplicating\n * transport-specific install detection logic in the picker). The\n * returned adapter is the same instance used internally for connect /\n * sign / submit flows; do not mutate it.\n *\n * Accepts both raw string ids and the branded `WalletId` form so\n * consumers can pass `walletInfo.walletId` or a string literal\n * interchangeably.\n */\n getAdapter(walletId: string | WalletId): WalletAdapter | undefined {\n return this.adapters.get(walletId as WalletId);\n }\n\n /**\n * List available wallets\n */\n async listWallets(filter?: WalletFilter): Promise<WalletInfo[]> {\n let registryWallets: WalletInfo[];\n\n try {\n // getWallets() already returns WalletInfo[]\n registryWallets = await this.registryClient.getWallets();\n\n // Update registry status after successful fetch\n this.updateRegistryStatus();\n } catch (err) {\n // Update registry status even on error (may have fallback info)\n this.updateRegistryStatus();\n\n this.logger.warn('Registry fetch failed, using registered adapters only', {\n error: err instanceof Error ? err.message : String(err),\n });\n\n registryWallets = [];\n }\n\n // Merge: include registered adapters that are NOT in the registry\n // (e.g. NightlyAdapter is builtin but may not have a registry entry yet)\n const registryIds = new Set(registryWallets.map((w) => String(w.walletId)));\n for (const [, adapter] of this.adapters) {\n if (registryIds.has(String(adapter.walletId))) continue;\n\n registryWallets.push({\n walletId: adapter.walletId,\n name: adapter.name,\n website: '',\n icons: {},\n capabilities: adapter.getCapabilities(),\n adapter: { packageName: 'builtin', versionRange: '*' },\n docs: [],\n networks: [this.config.network || 'devnet'],\n channel: 'stable',\n } as WalletInfo);\n }\n\n // Filter by capabilities\n if (filter?.requiredCapabilities) {\n return registryWallets.filter((walletInfo) =>\n filter.requiredCapabilities!.every((cap) =>\n walletInfo.capabilities.includes(cap as CapabilityKey)\n )\n );\n }\n\n // Filter experimental\n if (!filter?.includeExperimental) {\n return registryWallets.filter((walletInfo) => walletInfo.channel === 'stable');\n }\n\n return registryWallets;\n }\n\n /** Active network-enforcement policy (default 'guard'). */\n private get enforcement(): 'off' | 'guard' | 'strict' {\n return this.config.networkEnforcement ?? 'guard';\n }\n\n /**\n * Detect a confident network mismatch between the dApp's configured network\n * and the session's (wallet-reported) network. Returns null when they match\n * or the comparison isn't confident (conservative — never a false positive).\n */\n private networkMismatch(session: Session): { expected: string; actual: string } | null {\n return detectNetworkMismatch(this.config.network, session.network);\n }\n\n /**\n * Guard a transaction-class operation: throw `NetworkMismatchError` when the\n * session is on the wrong network AND the policy enforces it ('guard' |\n * 'strict'). Also protects restored sessions and mid-session network switches.\n */\n private assertNetworkOk(session: Session): void {\n const mm = this.networkMismatch(session);\n if (mm && this.enforcement !== 'off') {\n throw new NetworkMismatchError(mm.expected, mm.actual);\n }\n }\n\n /**\n * Connect to a wallet\n */\n async connect(options?: ConnectOptions): Promise<Session> {\n // Track connect attempt\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_ATTEMPTS);\n \n try {\n // Get available wallets\n const wallets = await this.listWallets({\n requiredCapabilities: options?.requiredCapabilities,\n includeExperimental: true,\n });\n\n // Filter by allowWallets\n let availableWallets = wallets;\n if (options?.allowWallets) {\n availableWallets = wallets.filter((w) =>\n options.allowWallets!.includes(w.walletId)\n );\n }\n\n // Select wallet\n let selectedWallet: WalletInfo;\n let isNativeWallet = false;\n if (options?.walletId) {\n const found = availableWallets.find(\n (w) => w.walletId === options.walletId\n );\n if (found) {\n selectedWallet = found;\n } else {\n // Fallback: check if a native CIP-0103 adapter is registered\n const nativeAdapter = this.adapters.get(options.walletId);\n if (nativeAdapter) {\n isNativeWallet = true;\n selectedWallet = {\n walletId: options.walletId,\n name: nativeAdapter.name,\n website: '',\n icons: {},\n capabilities: nativeAdapter.getCapabilities(),\n adapter: { packageName: 'native-cip0103', versionRange: '*' },\n docs: [],\n networks: [this.config.network],\n channel: 'stable' as const,\n metadata: { source: 'native-cip0103' },\n };\n } else {\n throw new WalletNotFoundError(String(options.walletId));\n }\n }\n } else if (availableWallets.length === 0) {\n throw new WalletNotFoundError('No wallets available');\n } else {\n selectedWallet = availableWallets[0];\n }\n\n // Get adapter\n const adapter = this.adapters.get(selectedWallet.walletId);\n if (!adapter) {\n throw new WalletNotFoundError(String(selectedWallet.walletId));\n }\n\n // Check origin allowlist (skip for native CIP-0103 wallets and\n // adapter-merged wallets that aren't in the registry)\n if (!isNativeWallet) {\n try {\n const walletEntry = await this.registryClient.getWalletEntry(String(selectedWallet.walletId));\n if (walletEntry.originAllowlist && walletEntry.originAllowlist.length > 0) {\n if (!walletEntry.originAllowlist.includes(this.origin)) {\n const { OriginNotAllowedError } = await import('@partylayer/core');\n throw new OriginNotAllowedError(\n this.origin,\n walletEntry.originAllowlist\n );\n }\n }\n } catch (e) {\n // Wallet not in registry (adapter-merged) — skip origin check\n if (!(e instanceof WalletNotFoundError)) {\n throw e;\n }\n }\n }\n\n // Check capabilities\n if (options?.requiredCapabilities) {\n capabilityGuard(adapter, options.requiredCapabilities as CapabilityKey[]);\n }\n\n // Check installation\n await installGuard(adapter);\n\n // Create adapter context\n const ctx = this.createAdapterContext();\n\n // Connect\n // Default timeout: 2 minutes for QR code/popup based wallets\n const timeoutMs = options?.timeoutMs || 120000;\n const connectPromise = adapter.connect(ctx, {\n timeoutMs,\n partyId: undefined,\n preferInstalled: options?.preferInstalled,\n onDisplayUri: options?.onDisplayUri,\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Connection timed out after ${timeoutMs}ms - user did not complete wallet connection`));\n }, timeoutMs);\n });\n\n const result = await Promise.race([connectPromise, timeoutPromise]);\n\n // Create session\n const session: Session = {\n sessionId: toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`),\n walletId: selectedWallet.walletId,\n partyId: result.partyId,\n // The wallet's reported network (adapters that read the live wallet —\n // e.g. Console via getActiveNetwork — surface the actual network here;\n // echo-only adapters report ctx.network === config.network). Used for\n // mismatch detection; falls back to the configured network.\n network: (result.session.network ?? this.config.network) as NetworkId,\n createdAt: Date.now(),\n expiresAt: result.session.expiresAt,\n origin: this.origin,\n capabilitiesSnapshot: result.capabilities,\n metadata: result.session.metadata as Record<string, string> | undefined,\n };\n\n // Network-mismatch detection: the wallet connected on a different network\n // than the dApp is configured for. Always detected + flagged + emitted;\n // 'strict' blocks the connect, 'guard'/'off' let it proceed.\n const mismatch = this.networkMismatch(session);\n if (mismatch) {\n session.networkMismatch = mismatch;\n this.emit('session:networkMismatch', {\n type: 'session:networkMismatch',\n sessionId: session.sessionId,\n expected: mismatch.expected,\n actual: mismatch.actual,\n enforced: this.enforcement !== 'off',\n });\n if (this.enforcement === 'strict') {\n throw new NetworkMismatchError(mismatch.expected, mismatch.actual);\n }\n }\n\n // Persist session\n await this.persistSession(session);\n\n // Set active session\n this.activeSession = session;\n\n // Update registry status (may have changed during fetch)\n this.updateRegistryStatus();\n\n // Track successful connection\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n this.telemetry?.increment?.(METRICS.SESSIONS_CREATED);\n\n // Emit event\n this.emit('session:connected', {\n type: 'session:connected',\n session,\n });\n\n return session;\n } catch (err) {\n const timeoutMs = options?.timeoutMs || 30000;\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect',\n walletId: options?.walletId ? String(options.walletId) : undefined,\n timeoutMs,\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n if (!this.activeSession) {\n return;\n }\n\n try {\n const adapter = this.adapters.get(this.activeSession.walletId);\n if (adapter) {\n const ctx = this.createAdapterContext();\n await adapter.disconnect(ctx, this.activeSession);\n }\n\n const sessionId = this.activeSession.sessionId;\n await this.removeSession(sessionId);\n\n this.activeSession = null;\n\n this.emit('session:disconnected', {\n type: 'session:disconnected',\n sessionId,\n });\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect', // Use connect as default phase\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Get active session\n */\n async getActiveSession(): Promise<Session | null> {\n if (this.activeSession) {\n // Check expiration\n if (this.activeSession.expiresAt && Date.now() >= this.activeSession.expiresAt) {\n await this.disconnect();\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: this.activeSession.sessionId,\n });\n return null;\n }\n return this.activeSession;\n }\n\n // Try to restore from storage\n return this.restoreSession();\n }\n\n /**\n * Sign a message\n */\n async signMessage(params: SignMessageParams): Promise<SignedMessage> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signMessage) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signMessage'\n );\n }\n\n try {\n this.assertNetworkOk(session);\n const ctx = this.createAdapterContext();\n return await adapter.signMessage(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signMessage',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Sign a transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<SignedTransaction> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signTransaction'\n );\n }\n\n try {\n this.assertNetworkOk(session);\n const ctx = this.createAdapterContext();\n const result = await adapter.signTransaction(ctx, session, params);\n \n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'pending',\n raw: result.signedTx,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Submit a transaction\n */\n async submitTransaction(params: SubmitTransactionParams): Promise<TxReceipt> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.submitTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'submitTransaction'\n );\n }\n\n try {\n this.assertNetworkOk(session);\n const ctx = this.createAdapterContext();\n const result = await adapter.submitTransaction(ctx, session, params);\n\n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'submitted',\n raw: result,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'submitTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Proxy a JSON Ledger API request through the active wallet adapter\n */\n async ledgerApi(params: LedgerApiParams): Promise<LedgerApiResult> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.ledgerApi) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'ledgerApi'\n );\n }\n\n try {\n this.assertNetworkOk(session);\n const ctx = this.createAdapterContext();\n return await adapter.ledgerApi(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'ledgerApi',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Subscribe to events\n */\n on<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n this.off(event, handler);\n };\n }\n\n /**\n * Unsubscribe from events\n */\n off<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler);\n }\n }\n\n /**\n * Get a CIP-0103 Provider backed by this client.\n *\n * This bridge routes all request() calls through the existing\n * PartyLayerClient methods and maps events to CIP-0103 format.\n *\n * The bridge implements the full CIP-0103 specification:\n * - All 10 mandatory methods including `ledgerApi` (when adapter supports it)\n * - Full transaction lifecycle: pending -> signed -> executed/failed\n * - All CIP-0103 events: statusChanged, accountsChanged, txChanged, connected\n *\n * **Note:** Async wallets (userUrl pattern) are not supported through the\n * bridge. For async wallet support, use `PartyLayerProvider` directly.\n *\n * @returns CIP-0103 compliant Provider\n */\n asProvider(): import('@partylayer/core').CIP0103Provider {\n // Static import (top of file) — a runtime `require('@partylayer/provider')`\n // hits esbuild's `__require` shim in the ESM build and throws \"Dynamic\n // require not supported\" in browser bundles (dev + prod), crashing\n // PartyLayerKit on mount. `@partylayer/provider` does not import\n // `@partylayer/sdk`, so the static import introduces no cycle.\n return createProviderBridge(this);\n }\n\n /**\n * Destroy client and cleanup\n */\n destroy(): void {\n // Flush and destroy telemetry if it supports it\n if (this.telemetry && 'destroy' in this.telemetry && typeof this.telemetry.destroy === 'function') {\n (this.telemetry as { destroy: () => void }).destroy();\n } else if (this.telemetry?.flush) {\n this.telemetry.flush().catch(() => {});\n }\n \n this.eventHandlers.clear();\n this.activeSession = null;\n }\n\n /**\n * Create adapter context\n */\n private createAdapterContext(): AdapterContext {\n return {\n appName: this.config.app.name,\n origin: this.origin,\n network: this.config.network,\n logger: this.logger,\n telemetry: this.telemetry,\n registry: {\n getWallet: async (walletId: WalletId) => {\n return this.registryClient.getWallet(String(walletId));\n },\n },\n crypto: this.crypto,\n storage: this.storage,\n timeout: (ms: number) => {\n return new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Timeout')), ms);\n });\n },\n };\n }\n\n\n /**\n * Persist session to storage\n */\n private async persistSession(session: Session): Promise<void> {\n try {\n const data = JSON.stringify(session);\n const encrypted = await this.crypto.encrypt(data, this.origin);\n await this.storage.set(SESSION_STORAGE_KEY, encrypted);\n } catch (err) {\n this.logger.warn('Failed to persist session', err);\n }\n }\n\n /**\n * Remove session from storage.\n *\n * Accepts a sessionId for call-site symmetry, but since the SDK tracks one\n * active session we always remove the single SESSION_STORAGE_KEY.\n */\n private async removeSession(_sessionId: SessionId): Promise<void> {\n try {\n await this.storage.remove(SESSION_STORAGE_KEY);\n } catch (err) {\n this.logger.warn('Failed to remove session', err);\n }\n }\n\n /**\n * Restore session from storage\n */\n private async restoreSession(): Promise<Session | null> {\n // Track restore attempt\n this.telemetry?.increment?.(METRICS.RESTORE_ATTEMPTS);\n\n try {\n const encrypted = await this.storage.get(SESSION_STORAGE_KEY);\n if (!encrypted) {\n return null;\n }\n\n const decrypted = await this.crypto.decrypt(encrypted, this.origin);\n const session = JSON.parse(decrypted) as Session;\n\n // Check expiration\n if (session.expiresAt && Date.now() >= session.expiresAt) {\n await this.removeSession(session.sessionId);\n return null;\n }\n\n // Check origin\n if (session.origin !== this.origin) {\n return null;\n }\n\n // Try to restore with adapter\n const adapter = this.adapters.get(session.walletId);\n if (adapter?.restore) {\n const ctx = this.createAdapterContext();\n const restored = await adapter.restore(ctx, {\n ...session,\n encrypted,\n });\n\n if (restored) {\n this.activeSession = restored;\n // Persist restored session (may have updated metadata)\n await this.persistSession(restored);\n \n // Track successful restore\n this.telemetry?.increment?.(METRICS.SESSIONS_RESTORED);\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n \n // Emit session:connected event with reason=\"restore\"\n this.emit('session:connected', {\n type: 'session:connected',\n session: restored,\n });\n return restored;\n } else {\n // Restore failed - clear session\n await this.removeSession(session.sessionId);\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: session.sessionId,\n });\n return null;\n }\n }\n\n // If restore not supported, use stored session as-is\n // (Some adapters don't support restore but session metadata is still valid)\n this.activeSession = session;\n return session;\n } catch (err) {\n this.logger.warn('Failed to restore session', err);\n return null;\n }\n }\n\n /**\n * Update registry status and emit event\n */\n private updateRegistryStatus(): void {\n const status = this.registryClient.getStatus();\n if (status) {\n // Track registry metrics\n if (status.source === 'network') {\n this.telemetry?.increment?.(METRICS.REGISTRY_FETCH);\n } else if (status.source === 'cache') {\n this.telemetry?.increment?.(METRICS.REGISTRY_CACHE_HIT);\n }\n if (status.stale) {\n this.telemetry?.increment?.(METRICS.REGISTRY_STALE);\n }\n \n this.emit('registry:status', {\n type: 'registry:status',\n status: {\n source: status.source,\n verified: status.verified,\n channel: status.channel,\n sequence: status.sequence,\n stale: status.stale,\n fetchedAt: status.fetchedAt,\n etag: status.etag,\n error: status.error,\n },\n });\n }\n }\n\n /**\n * Get registry status\n */\n getRegistryStatus(): RegistryStatus | null {\n return this.registryClient.getStatus();\n }\n\n /**\n * Emit event to handlers\n */\n private emit<T extends PartyLayerEvent>(\n event: T['type'],\n payload: T\n ): void {\n // Track error metrics\n if (event === 'error' && 'error' in payload) {\n const error = payload.error as { code?: string };\n if (error.code) {\n this.telemetry?.increment?.(errorMetricName(error.code));\n }\n }\n \n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(payload);\n } catch (err) {\n this.logger.error('Error in event handler', err);\n }\n }\n }\n }\n}\n\n/**\n * Create PartyLayer client\n * \n * This is the main entry point for dApps.\n * \n * @example\n * ```typescript\n * const client = createPartyLayer({\n * registryUrl: 'https://registry.partylayer.xyz',\n * channel: 'stable',\n * network: 'devnet',\n * app: { name: 'My dApp' }\n * });\n * \n * const session = await client.connect();\n * ```\n */\nexport function createPartyLayer(\n config: PartyLayerConfig\n): PartyLayerClient {\n return new PartyLayerClient(config);\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { hashForPrivacy, createMetricsPayload, mapUnknownErrorToPartyLayerError, METRICS, WalletNotFoundError, capabilityGuard, installGuard, toSessionId, CapabilityNotSupportedError, errorMetricName } from '@partylayer/core';
|
|
1
|
+
import { hashForPrivacy, createMetricsPayload, mapUnknownErrorToPartyLayerError, detectNetworkMismatch, NetworkMismatchError, METRICS, WalletNotFoundError, capabilityGuard, installGuard, toSessionId, CapabilityNotSupportedError, errorMetricName } from '@partylayer/core';
|
|
2
2
|
export { PartyLayerError as CantonConnectError, CapabilityNotSupportedError, ENABLEMENT_METRICS, ERROR_METRICS, InternalError, METRICS, OriginNotAllowedError, PartyLayerError, REGISTRY_METRICS, RegistryFetchFailedError, RegistrySchemaInvalidError, RegistryVerificationFailedError, SessionExpiredError, TimeoutError, TransportError, UserRejectedError, WalletNotFoundError, WalletNotInstalledError, errorMetricName } from '@partylayer/core';
|
|
3
3
|
import { RegistryClient } from '@partylayer/registry-client';
|
|
4
4
|
export { deriveGenericWalletName, findMatchingWallet, findMatchingWalletInfo, isCip0103Native, matchesProviderDetection } from '@partylayer/registry-client';
|
|
@@ -495,6 +495,29 @@ var PartyLayerClient = class {
|
|
|
495
495
|
}
|
|
496
496
|
return registryWallets;
|
|
497
497
|
}
|
|
498
|
+
/** Active network-enforcement policy (default 'guard'). */
|
|
499
|
+
get enforcement() {
|
|
500
|
+
return this.config.networkEnforcement ?? "guard";
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Detect a confident network mismatch between the dApp's configured network
|
|
504
|
+
* and the session's (wallet-reported) network. Returns null when they match
|
|
505
|
+
* or the comparison isn't confident (conservative — never a false positive).
|
|
506
|
+
*/
|
|
507
|
+
networkMismatch(session) {
|
|
508
|
+
return detectNetworkMismatch(this.config.network, session.network);
|
|
509
|
+
}
|
|
510
|
+
/**
|
|
511
|
+
* Guard a transaction-class operation: throw `NetworkMismatchError` when the
|
|
512
|
+
* session is on the wrong network AND the policy enforces it ('guard' |
|
|
513
|
+
* 'strict'). Also protects restored sessions and mid-session network switches.
|
|
514
|
+
*/
|
|
515
|
+
assertNetworkOk(session) {
|
|
516
|
+
const mm = this.networkMismatch(session);
|
|
517
|
+
if (mm && this.enforcement !== "off") {
|
|
518
|
+
throw new NetworkMismatchError(mm.expected, mm.actual);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
498
521
|
/**
|
|
499
522
|
* Connect to a wallet
|
|
500
523
|
*/
|
|
@@ -588,13 +611,31 @@ var PartyLayerClient = class {
|
|
|
588
611
|
sessionId: toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`),
|
|
589
612
|
walletId: selectedWallet.walletId,
|
|
590
613
|
partyId: result.partyId,
|
|
591
|
-
network
|
|
614
|
+
// The wallet's reported network (adapters that read the live wallet —
|
|
615
|
+
// e.g. Console via getActiveNetwork — surface the actual network here;
|
|
616
|
+
// echo-only adapters report ctx.network === config.network). Used for
|
|
617
|
+
// mismatch detection; falls back to the configured network.
|
|
618
|
+
network: result.session.network ?? this.config.network,
|
|
592
619
|
createdAt: Date.now(),
|
|
593
620
|
expiresAt: result.session.expiresAt,
|
|
594
621
|
origin: this.origin,
|
|
595
622
|
capabilitiesSnapshot: result.capabilities,
|
|
596
623
|
metadata: result.session.metadata
|
|
597
624
|
};
|
|
625
|
+
const mismatch = this.networkMismatch(session);
|
|
626
|
+
if (mismatch) {
|
|
627
|
+
session.networkMismatch = mismatch;
|
|
628
|
+
this.emit("session:networkMismatch", {
|
|
629
|
+
type: "session:networkMismatch",
|
|
630
|
+
sessionId: session.sessionId,
|
|
631
|
+
expected: mismatch.expected,
|
|
632
|
+
actual: mismatch.actual,
|
|
633
|
+
enforced: this.enforcement !== "off"
|
|
634
|
+
});
|
|
635
|
+
if (this.enforcement === "strict") {
|
|
636
|
+
throw new NetworkMismatchError(mismatch.expected, mismatch.actual);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
598
639
|
await this.persistSession(session);
|
|
599
640
|
this.activeSession = session;
|
|
600
641
|
this.updateRegistryStatus();
|
|
@@ -678,6 +719,7 @@ var PartyLayerClient = class {
|
|
|
678
719
|
);
|
|
679
720
|
}
|
|
680
721
|
try {
|
|
722
|
+
this.assertNetworkOk(session);
|
|
681
723
|
const ctx = this.createAdapterContext();
|
|
682
724
|
return await adapter.signMessage(ctx, session, params);
|
|
683
725
|
} catch (err) {
|
|
@@ -705,6 +747,7 @@ var PartyLayerClient = class {
|
|
|
705
747
|
);
|
|
706
748
|
}
|
|
707
749
|
try {
|
|
750
|
+
this.assertNetworkOk(session);
|
|
708
751
|
const ctx = this.createAdapterContext();
|
|
709
752
|
const result = await adapter.signTransaction(ctx, session, params);
|
|
710
753
|
this.emit("tx:status", {
|
|
@@ -740,6 +783,7 @@ var PartyLayerClient = class {
|
|
|
740
783
|
);
|
|
741
784
|
}
|
|
742
785
|
try {
|
|
786
|
+
this.assertNetworkOk(session);
|
|
743
787
|
const ctx = this.createAdapterContext();
|
|
744
788
|
const result = await adapter.submitTransaction(ctx, session, params);
|
|
745
789
|
this.emit("tx:status", {
|
|
@@ -775,6 +819,7 @@ var PartyLayerClient = class {
|
|
|
775
819
|
);
|
|
776
820
|
}
|
|
777
821
|
try {
|
|
822
|
+
this.assertNetworkOk(session);
|
|
778
823
|
const ctx = this.createAdapterContext();
|
|
779
824
|
return await adapter.ledgerApi(ctx, session, params);
|
|
780
825
|
} catch (err) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/config.ts","../src/adapters.ts","../src/builtin-adapters.ts","../src/metrics-telemetry.ts","../src/client.ts"],"names":["OriginNotAllowedError"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Configuration types for PartyLayer SDK\n */\n\nimport type { NetworkId, WalletId, WalletAdapter } from '@partylayer/core';\nimport type {\n StorageAdapter,\n CryptoAdapter,\n TelemetryAdapter,\n LoggerAdapter,\n} from '@partylayer/core';\n\n/**\n * Default registry URL for PartyLayer\n * This points to the official registry endpoint.\n */\nexport const DEFAULT_REGISTRY_URL = 'https://registry.partylayer.xyz';\n\n/**\n * Telemetry configuration for opt-in metrics collection\n * \n * @since 0.3.0\n */\nexport interface TelemetryConfig {\n /** \n * Enable telemetry collection\n * @default false\n */\n enabled: boolean;\n \n /** \n * Metrics backend endpoint URL\n * If not provided, metrics are collected but not sent\n */\n endpoint?: string;\n \n /**\n * Sampling rate (0.0 to 1.0)\n * @default 1.0 (100% of events)\n */\n sampleRate?: number;\n \n /**\n * Application identifier (will be hashed for privacy)\n * Used to calculate Monthly Active dApps (MAD)\n */\n appId?: string;\n \n /**\n * Include hashed origin in metrics\n * @default false\n */\n includeOrigin?: boolean;\n \n /**\n * Number of events to buffer before sending\n * @default 10\n */\n batchSize?: number;\n \n /**\n * Interval to flush metrics in milliseconds\n * @default 30000 (30 seconds)\n */\n flushIntervalMs?: number;\n \n /**\n * Network to include in metrics\n * If not provided, uses the SDK's configured network\n */\n network?: NetworkId;\n}\n\n/**\n * Adapter class type (for instantiation)\n */\nexport type AdapterClass = new () => WalletAdapter;\n\n/**\n * PartyLayer configuration\n */\nexport interface PartyLayerConfig {\n /** \n * Registry URL (optional)\n * @default 'https://registry.partylayer.xyz/v1/wallets.json'\n */\n registryUrl?: string;\n /** Registry channel */\n channel?: 'stable' | 'beta';\n /** Default network */\n network: NetworkId;\n /** \n * Wallet adapters to register (OPTIONAL)\n * \n * By default, ALL built-in adapters are automatically registered:\n * - ConsoleAdapter (Console Wallet - browser extension)\n * - LoopAdapter (5N Loop - QR code / popup)\n * - Cantor8Adapter (Cantor8 - deep link transport)\n * \n * Note: BronAdapter requires OAuth config and is NOT included by default.\n * \n * Only provide this if you want to customize which adapters to use.\n * \n * @example\n * ```typescript\n * // Default: all adapters (recommended)\n * const client = createPartyLayer({\n * network: 'devnet',\n * app: { name: 'My dApp' },\n * // adapters not specified = all built-in adapters (Console, Loop, Cantor8)\n * });\n * \n * // Custom: only specific adapters\n * import { ConsoleAdapter } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [new ConsoleAdapter()], // Only Console Wallet\n * // ...\n * });\n * \n * // With Bron (enterprise wallet with OAuth)\n * import { BronAdapter, getBuiltinAdapters } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({ auth: {...}, api: {...} }),\n * ],\n * // ...\n * });\n * ```\n */\n adapters?: (WalletAdapter | AdapterClass)[];\n /** Storage adapter (default: browser localStorage-based encrypted) */\n storage?: StorageAdapter;\n /** Crypto adapter (default: WebCrypto) */\n crypto?: CryptoAdapter;\n /** Registry public keys for signature verification (ed25519) */\n registryPublicKeys?: string[];\n /** \n * Telemetry configuration or adapter\n * \n * Can be either:\n * - TelemetryConfig object for built-in metrics collection\n * - TelemetryAdapter instance for custom telemetry\n * \n * @default undefined (telemetry disabled)\n * @since 0.3.0 - Added TelemetryConfig support\n */\n telemetry?: TelemetryAdapter | TelemetryConfig;\n /** Logger adapter (optional) */\n logger?: LoggerAdapter;\n /** Application metadata */\n app: {\n /** Application name */\n name: string;\n /** Origin (for origin binding checks, defaults to window.location.origin) */\n origin?: string;\n };\n}\n\n/**\n * Connect options\n */\nexport interface ConnectOptions {\n /** Specific wallet ID to connect to */\n walletId?: WalletId;\n /** Prefer installed wallets */\n preferInstalled?: boolean;\n /** Allow only specific wallets */\n allowWallets?: WalletId[];\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Timeout in milliseconds */\n timeoutMs?: number;\n /**\n * Called with a pairing/display URI (e.g. a WalletConnect `wc:` URI) the\n * moment the adapter produces one, before approval. Used by the connect UI\n * to render a QR / deep-link. Adapters without such a URI never call it.\n */\n onDisplayUri?: (uri: string) => void;\n}\n\n/**\n * Wallet filter options\n */\nexport interface WalletFilter {\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Include experimental wallets */\n includeExperimental?: boolean;\n}\n","/**\n * Default adapter implementations\n */\n\nimport type {\n StorageAdapter,\n CryptoAdapter,\n LoggerAdapter,\n TelemetryAdapter,\n} from '@partylayer/core';\n\n/**\n * Default logger (console-based)\n */\nexport class DefaultLogger implements LoggerAdapter {\n debug(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.info) {\n console.info(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n error(message: string, error?: unknown, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.error) {\n console.error(`[PartyLayer] ${message}`, error, ...args);\n }\n }\n}\n\n/**\n * Default crypto adapter (Web Crypto API)\n */\nexport class DefaultCrypto implements CryptoAdapter {\n private async getKey(origin: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API not available');\n }\n\n const encoder = new TextEncoder();\n const data = encoder.encode(origin);\n const hash = await crypto.subtle.digest('SHA-256', data);\n return crypto.subtle.importKey(\n 'raw',\n hash.slice(0, 32),\n { name: 'AES-GCM' },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n async encrypt(data: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback to base64\n return btoa(data);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoder = new TextEncoder();\n const encoded = encoder.encode(data);\n\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n encoded\n );\n\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n return btoa(String.fromCharCode(...combined));\n } catch {\n return btoa(data);\n }\n }\n\n async decrypt(encrypted: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n return atob(encrypted);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const combined = Uint8Array.from(atob(encrypted), (c) => c.charCodeAt(0));\n\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n data\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch {\n return atob(encrypted);\n }\n }\n\n async generateKey(): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n return Math.random().toString(36).substring(2, 15);\n }\n\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n}\n\n/**\n * Default storage adapter (localStorage-based)\n */\nexport class DefaultStorage implements StorageAdapter {\n private prefix: string;\n\n constructor(prefix = 'partylayer_') {\n this.prefix = prefix;\n }\n\n async get(key: string): Promise<string | null> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(`${this.prefix}${key}`);\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.setItem(`${this.prefix}${key}`, value);\n } catch {\n // Ignore storage errors\n }\n }\n\n async remove(key: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(`${this.prefix}${key}`);\n } catch {\n // Ignore storage errors\n }\n }\n\n async clear(): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n const keys: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix)) {\n keys.push(key);\n }\n }\n\n for (const key of keys) {\n localStorage.removeItem(key);\n }\n } catch {\n // Ignore storage errors\n }\n }\n}\n\n/**\n * Default telemetry adapter (no-op)\n */\nexport class DefaultTelemetry implements TelemetryAdapter {\n track(_event: string, _properties?: Record<string, unknown>): void {\n // No-op\n }\n\n error(_error: Error, _properties?: Record<string, unknown>): void {\n // No-op\n }\n}\n","/**\n * Built-in wallet adapters\n *\n * These adapters are automatically registered when creating a PartyLayer client.\n * dApp developers don't need to install or configure these separately.\n */\n\nimport type { WalletAdapter } from '@partylayer/core';\nimport { ConsoleAdapter } from '@partylayer/adapter-console';\nimport { LoopAdapter } from '@partylayer/adapter-loop';\nimport { Cantor8Adapter } from '@partylayer/adapter-cantor8';\nimport { NightlyAdapter } from '@partylayer/adapter-nightly';\nimport { SendAdapter } from '@partylayer/adapter-send';\n\n// Note: BronAdapter requires OAuth config and is not included by default.\n// Import it separately: import { BronAdapter } from '@partylayer/adapter-bron';\n\n/**\n * Get all built-in adapters\n *\n * This function returns instances of all supported wallet adapters.\n * Called automatically by createPartyLayer() unless custom adapters are provided.\n *\n * Included adapters:\n * - ConsoleAdapter: Console Wallet browser extension + mobile (combined mode)\n * - LoopAdapter: 5N Loop mobile/web wallet\n * - Cantor8Adapter: Cantor8 wallet with deep link transport\n * - NightlyAdapter: Nightly multichain wallet with Canton support\n * - SendAdapter: Send Canton Wallet (passkey / WebAuthn-PRF, beta) — also\n * injects at `window.canton`; the adapter's kernel.id guard keeps it\n * and Console-spec wallets from claiming each other's provider.\n *\n * Note: ConsoleAdapter defaults to 'combined' mode which supports both browser\n * extension and mobile wallet connect (QR code / deep link). To restrict to\n * extension-only, pass { target: 'local' } to the constructor.\n *\n * Note: BronAdapter is NOT included by default because it requires OAuth configuration.\n * To use Bron, install @partylayer/adapter-bron and register it manually.\n */\nexport function getBuiltinAdapters(): WalletAdapter[] {\n return [\n new ConsoleAdapter(), // Console Wallet - extension + mobile (combined)\n new LoopAdapter(), // 5N Loop - QR code / popup\n new Cantor8Adapter(), // Cantor8 - deep link transport\n new NightlyAdapter(), // Nightly - multichain wallet (injected)\n new SendAdapter(), // Send - passkey-based, kernel.id-guarded window.canton\n ];\n}\n\n/**\n * Built-in adapter classes (for advanced usage)\n */\nexport { ConsoleAdapter, LoopAdapter, Cantor8Adapter, NightlyAdapter, SendAdapter };\n\n/**\n * Re-export Console adapter types for convenience\n */\nexport type { ConsoleAdapterConfig, ConsoleConnectionTarget } from '@partylayer/adapter-console';\n\n/**\n * Re-export BronAdapter for convenience (requires config)\n *\n * @example\n * ```typescript\n * import { BronAdapter } from '@partylayer/sdk';\n *\n * const client = createPartyLayer({\n * // ... config\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({\n * auth: { clientId: '...', redirectUri: '...', ... },\n * api: { baseUrl: '...', getAccessToken: async () => '...' },\n * }),\n * ],\n * });\n * ```\n */\nexport { BronAdapter } from '@partylayer/adapter-bron';\nexport type { BronAdapterConfig, BronAuthConfig, BronApiConfig } from '@partylayer/adapter-bron';\n","/**\n * Metrics Telemetry Adapter\n * \n * A privacy-safe telemetry adapter that collects metrics for\n * ecosystem health monitoring and usage reporting.\n * \n * Features:\n * - Opt-in by default (disabled unless explicitly enabled)\n * - Privacy-safe payloads (no PII, hashed identifiers)\n * - Batched sending to reduce network overhead\n * - Configurable sampling rate\n * - Automatic flush on interval or batch size\n * \n * @since 0.3.0\n */\n\nimport type { TelemetryAdapter } from '@partylayer/core';\nimport {\n createMetricsPayload,\n hashForPrivacy,\n} from '@partylayer/core';\nimport type { TelemetryConfig } from './config';\n\n/** SDK Version - should match package.json */\nconst SDK_VERSION = '0.3.0';\n\n/**\n * Internal metric event for buffering\n */\ninterface MetricEvent {\n type: 'increment' | 'gauge';\n metric: string;\n value: number;\n timestamp: number;\n}\n\n/**\n * Metrics Telemetry Adapter\n * \n * Implements TelemetryAdapter interface with metrics-specific functionality.\n */\nexport class MetricsTelemetryAdapter implements TelemetryAdapter {\n private config: TelemetryConfig;\n private metrics: Map<string, number> = new Map();\n private buffer: MetricEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private appIdHash: string | null = null;\n private originHash: string | null = null;\n private initialized = false;\n \n constructor(config: TelemetryConfig) {\n this.config = {\n enabled: config.enabled ?? false,\n endpoint: config.endpoint,\n sampleRate: config.sampleRate ?? 1.0,\n appId: config.appId,\n includeOrigin: config.includeOrigin ?? false,\n batchSize: config.batchSize ?? 10,\n flushIntervalMs: config.flushIntervalMs ?? 30000,\n network: config.network,\n };\n \n // Initialize async hashing\n this.initialize();\n }\n \n /**\n * Initialize async components (hashing)\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n \n if (this.config.appId) {\n this.appIdHash = await hashForPrivacy(this.config.appId);\n }\n \n if (this.config.includeOrigin && typeof window !== 'undefined') {\n this.originHash = await hashForPrivacy(window.location.origin);\n }\n \n // Start flush timer\n if (this.config.enabled && this.config.flushIntervalMs) {\n this.flushTimer = setInterval(() => {\n this.flush().catch(console.error);\n }, this.config.flushIntervalMs);\n }\n \n this.initialized = true;\n }\n \n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n \n /**\n * Track a named event (TelemetryAdapter interface)\n */\n track(event: string, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n // Convert event to increment - bypass the increment sampling since we already checked\n const current = this.metrics.get(`event_${event}`) ?? 0;\n this.metrics.set(`event_${event}`, current + 1);\n this.bufferEvent({ type: 'increment', metric: `event_${event}`, value: 1, timestamp: Date.now() });\n \n // Track any numeric properties as gauges\n if (properties) {\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value === 'number') {\n this.gauge(`${event}_${key}`, value);\n }\n }\n }\n }\n \n /**\n * Track an error (TelemetryAdapter interface)\n */\n error(error: Error, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Extract error code if available\n const code = (error as { code?: string }).code ?? 'UNKNOWN';\n this.increment(`error_${code}`);\n \n // Track properties\n if (properties) {\n this.track('error', properties);\n }\n }\n \n /**\n * Increment a metric counter\n */\n increment(metric: string, value: number = 1): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n const current = this.metrics.get(metric) ?? 0;\n this.metrics.set(metric, current + value);\n \n this.bufferEvent({\n type: 'increment',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Set a gauge metric value\n */\n gauge(metric: string, value: number): void {\n if (!this.config.enabled) return;\n \n this.metrics.set(metric, value);\n \n this.bufferEvent({\n type: 'gauge',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Buffer an event for batched sending\n */\n private bufferEvent(event: MetricEvent): void {\n this.buffer.push(event);\n \n // Flush if batch size reached\n if (this.config.batchSize && this.buffer.length >= this.config.batchSize) {\n this.flush().catch(console.error);\n }\n }\n \n /**\n * Flush buffered metrics to backend\n */\n async flush(): Promise<void> {\n if (!this.config.enabled) return;\n if (this.metrics.size === 0) return;\n if (!this.config.endpoint) {\n // No endpoint configured - just clear the buffer\n this.buffer = [];\n return;\n }\n \n // Wait for initialization\n if (!this.initialized) {\n await this.initialize();\n }\n \n try {\n const payload = createMetricsPayload({\n sdkVersion: SDK_VERSION,\n network: this.config.network ?? 'unknown',\n metrics: Object.fromEntries(this.metrics),\n appIdHash: this.appIdHash ?? undefined,\n originHash: this.originHash ?? undefined,\n });\n \n await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n \n // Clear buffer on success\n this.buffer = [];\n // Note: We don't clear metrics - they accumulate until next flush\n // This allows calculating rates (e.g., errors per session)\n } catch (error) {\n // Silent fail - don't break the app for telemetry failures\n console.debug('[PartyLayer Telemetry] Flush failed:', error);\n }\n }\n \n /**\n * Get current metrics snapshot (for testing/debugging)\n */\n getMetrics(): Record<string, number> {\n return Object.fromEntries(this.metrics);\n }\n \n /**\n * Reset all metrics (for testing)\n */\n reset(): void {\n this.metrics.clear();\n this.buffer = [];\n }\n \n /**\n * Destroy the adapter (cleanup timers)\n */\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n \n // Final flush\n this.flush().catch(console.error);\n }\n}\n\n/**\n * Check if a value is a TelemetryConfig object\n */\nexport function isTelemetryConfig(value: unknown): value is TelemetryConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'enabled' in value &&\n typeof (value as TelemetryConfig).enabled === 'boolean'\n );\n}\n\n/**\n * Create a TelemetryAdapter from config\n * \n * If config is already a TelemetryAdapter, returns it.\n * If config is a TelemetryConfig, creates a MetricsTelemetryAdapter.\n */\nexport function createTelemetryAdapter(\n config: TelemetryAdapter | TelemetryConfig | undefined\n): TelemetryAdapter | undefined {\n if (!config) return undefined;\n \n if (isTelemetryConfig(config)) {\n return new MetricsTelemetryAdapter(config);\n }\n \n return config;\n}\n","/**\n * PartyLayer Client - Public API Implementation\n * \n * This is the main public API for PartyLayer SDK.\n * All dApps should use this API exclusively.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\nimport type {\n WalletId,\n SessionId,\n CapabilityKey,\n WalletInfo,\n Session,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n WalletAdapter,\n AdapterContext,\n} from '@partylayer/core';\nimport {\n toSessionId,\n WalletNotFoundError,\n CapabilityNotSupportedError,\n mapUnknownErrorToPartyLayerError,\n capabilityGuard,\n installGuard,\n} from '@partylayer/core';\nimport { RegistryClient } from '@partylayer/registry-client';\nimport type { RegistryStatus } from '@partylayer/registry-client';\nimport { createProviderBridge } from '@partylayer/provider';\nimport {\n DEFAULT_REGISTRY_URL,\n type PartyLayerConfig,\n type ConnectOptions,\n type WalletFilter,\n} from './config';\nimport type {\n PartyLayerEvent,\n EventHandler,\n} from './events';\nimport {\n DefaultLogger,\n DefaultCrypto,\n DefaultStorage,\n DefaultTelemetry,\n} from './adapters';\nimport { getBuiltinAdapters } from './builtin-adapters';\nimport { createTelemetryAdapter } from './metrics-telemetry';\nimport { METRICS, errorMetricName } from '@partylayer/core';\nimport type {\n SignMessageParams,\n SignTransactionParams,\n SubmitTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\n\n/**\n * Storage key used for the active session.\n *\n * SDK tracks a single active session at a time, so persist/restore/remove\n * all target the same key. Prior to this fix, persist wrote to\n * `session_<sessionId>` while restore read from `active_session`, which\n * meant sessions never survived a page reload.\n */\nconst SESSION_STORAGE_KEY = 'active_session';\n\n/**\n * PartyLayer Client\n * \n * Main client interface for dApps to interact with Canton wallets.\n */\nexport class PartyLayerClient {\n private config: PartyLayerConfig;\n private adapters = new Map<WalletId, WalletAdapter>();\n private eventHandlers = new Map<string, Set<EventHandler>>();\n private activeSession: Session | null = null;\n public readonly registryClient: RegistryClient; // Expose for React hooks\n private logger: import('@partylayer/core').LoggerAdapter;\n private crypto: import('@partylayer/core').CryptoAdapter;\n private storage: import('@partylayer/core').StorageAdapter;\n private telemetry?: import('@partylayer/core').TelemetryAdapter;\n private origin: string;\n\n constructor(config: PartyLayerConfig) {\n this.config = config;\n\n // Determine origin\n if (config.app.origin) {\n this.origin = config.app.origin;\n } else if (typeof window !== 'undefined') {\n this.origin = window.location.origin;\n } else {\n this.origin = 'unknown';\n }\n\n // Initialize service adapters\n this.logger = config.logger || new DefaultLogger();\n this.crypto = config.crypto || new DefaultCrypto();\n this.storage = config.storage || new DefaultStorage();\n \n // Initialize telemetry - supports both TelemetryAdapter and TelemetryConfig\n const telemetryAdapter = createTelemetryAdapter(config.telemetry);\n this.telemetry = telemetryAdapter || new DefaultTelemetry();\n\n // Register wallet adapters\n // If no adapters provided, use all built-in adapters (Console, Loop, etc.)\n const adaptersToRegister = config.adapters ?? getBuiltinAdapters();\n \n for (const adapterOrClass of adaptersToRegister) {\n let adapter: import('@partylayer/core').WalletAdapter;\n \n // Check if it's a class (function) or instance (object)\n if (typeof adapterOrClass === 'function') {\n // It's a class - instantiate it\n adapter = new (adapterOrClass as new () => import('@partylayer/core').WalletAdapter)();\n } else {\n // It's already an instance\n adapter = adapterOrClass;\n }\n \n this.adapters.set(adapter.walletId, adapter);\n this.logger.debug('Registered wallet adapter', {\n walletId: adapter.walletId,\n name: adapter.name,\n capabilities: adapter.getCapabilities(),\n });\n }\n\n // Initialize registry client with signature verification\n this.registryClient = new RegistryClient({\n registryUrl: config.registryUrl || DEFAULT_REGISTRY_URL,\n channel: config.channel || 'stable',\n registryPublicKeys: config.registryPublicKeys,\n storage: this.storage,\n });\n\n // Emit initial registry status\n this.updateRegistryStatus();\n\n // Restore session on init\n this.restoreSession().catch((err) => {\n this.emit('error', {\n type: 'error',\n error: mapUnknownErrorToPartyLayerError(err, {\n phase: 'restore',\n }),\n });\n });\n }\n\n /**\n * Register a wallet adapter\n *\n * @internal\n * This is used internally by the SDK to register adapters.\n * In production, adapters would be auto-registered via registry.\n */\n registerAdapter(adapter: WalletAdapter): void {\n this.adapters.set(adapter.walletId, adapter);\n }\n\n /**\n * Look up a registered adapter by wallet id.\n *\n * Returns the adapter instance when one is registered for the given\n * `walletId`, or `undefined` otherwise. Intended for UI integrations\n * that need to call `adapter.detectInstalled()` directly to render a\n * per-wallet readiness indicator (instead of duplicating\n * transport-specific install detection logic in the picker). The\n * returned adapter is the same instance used internally for connect /\n * sign / submit flows; do not mutate it.\n *\n * Accepts both raw string ids and the branded `WalletId` form so\n * consumers can pass `walletInfo.walletId` or a string literal\n * interchangeably.\n */\n getAdapter(walletId: string | WalletId): WalletAdapter | undefined {\n return this.adapters.get(walletId as WalletId);\n }\n\n /**\n * List available wallets\n */\n async listWallets(filter?: WalletFilter): Promise<WalletInfo[]> {\n let registryWallets: WalletInfo[];\n\n try {\n // getWallets() already returns WalletInfo[]\n registryWallets = await this.registryClient.getWallets();\n\n // Update registry status after successful fetch\n this.updateRegistryStatus();\n } catch (err) {\n // Update registry status even on error (may have fallback info)\n this.updateRegistryStatus();\n\n this.logger.warn('Registry fetch failed, using registered adapters only', {\n error: err instanceof Error ? err.message : String(err),\n });\n\n registryWallets = [];\n }\n\n // Merge: include registered adapters that are NOT in the registry\n // (e.g. NightlyAdapter is builtin but may not have a registry entry yet)\n const registryIds = new Set(registryWallets.map((w) => String(w.walletId)));\n for (const [, adapter] of this.adapters) {\n if (registryIds.has(String(adapter.walletId))) continue;\n\n registryWallets.push({\n walletId: adapter.walletId,\n name: adapter.name,\n website: '',\n icons: {},\n capabilities: adapter.getCapabilities(),\n adapter: { packageName: 'builtin', versionRange: '*' },\n docs: [],\n networks: [this.config.network || 'devnet'],\n channel: 'stable',\n } as WalletInfo);\n }\n\n // Filter by capabilities\n if (filter?.requiredCapabilities) {\n return registryWallets.filter((walletInfo) =>\n filter.requiredCapabilities!.every((cap) =>\n walletInfo.capabilities.includes(cap as CapabilityKey)\n )\n );\n }\n\n // Filter experimental\n if (!filter?.includeExperimental) {\n return registryWallets.filter((walletInfo) => walletInfo.channel === 'stable');\n }\n\n return registryWallets;\n }\n\n /**\n * Connect to a wallet\n */\n async connect(options?: ConnectOptions): Promise<Session> {\n // Track connect attempt\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_ATTEMPTS);\n \n try {\n // Get available wallets\n const wallets = await this.listWallets({\n requiredCapabilities: options?.requiredCapabilities,\n includeExperimental: true,\n });\n\n // Filter by allowWallets\n let availableWallets = wallets;\n if (options?.allowWallets) {\n availableWallets = wallets.filter((w) =>\n options.allowWallets!.includes(w.walletId)\n );\n }\n\n // Select wallet\n let selectedWallet: WalletInfo;\n let isNativeWallet = false;\n if (options?.walletId) {\n const found = availableWallets.find(\n (w) => w.walletId === options.walletId\n );\n if (found) {\n selectedWallet = found;\n } else {\n // Fallback: check if a native CIP-0103 adapter is registered\n const nativeAdapter = this.adapters.get(options.walletId);\n if (nativeAdapter) {\n isNativeWallet = true;\n selectedWallet = {\n walletId: options.walletId,\n name: nativeAdapter.name,\n website: '',\n icons: {},\n capabilities: nativeAdapter.getCapabilities(),\n adapter: { packageName: 'native-cip0103', versionRange: '*' },\n docs: [],\n networks: [this.config.network],\n channel: 'stable' as const,\n metadata: { source: 'native-cip0103' },\n };\n } else {\n throw new WalletNotFoundError(String(options.walletId));\n }\n }\n } else if (availableWallets.length === 0) {\n throw new WalletNotFoundError('No wallets available');\n } else {\n selectedWallet = availableWallets[0];\n }\n\n // Get adapter\n const adapter = this.adapters.get(selectedWallet.walletId);\n if (!adapter) {\n throw new WalletNotFoundError(String(selectedWallet.walletId));\n }\n\n // Check origin allowlist (skip for native CIP-0103 wallets and\n // adapter-merged wallets that aren't in the registry)\n if (!isNativeWallet) {\n try {\n const walletEntry = await this.registryClient.getWalletEntry(String(selectedWallet.walletId));\n if (walletEntry.originAllowlist && walletEntry.originAllowlist.length > 0) {\n if (!walletEntry.originAllowlist.includes(this.origin)) {\n const { OriginNotAllowedError } = await import('@partylayer/core');\n throw new OriginNotAllowedError(\n this.origin,\n walletEntry.originAllowlist\n );\n }\n }\n } catch (e) {\n // Wallet not in registry (adapter-merged) — skip origin check\n if (!(e instanceof WalletNotFoundError)) {\n throw e;\n }\n }\n }\n\n // Check capabilities\n if (options?.requiredCapabilities) {\n capabilityGuard(adapter, options.requiredCapabilities as CapabilityKey[]);\n }\n\n // Check installation\n await installGuard(adapter);\n\n // Create adapter context\n const ctx = this.createAdapterContext();\n\n // Connect\n // Default timeout: 2 minutes for QR code/popup based wallets\n const timeoutMs = options?.timeoutMs || 120000;\n const connectPromise = adapter.connect(ctx, {\n timeoutMs,\n partyId: undefined,\n preferInstalled: options?.preferInstalled,\n onDisplayUri: options?.onDisplayUri,\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Connection timed out after ${timeoutMs}ms - user did not complete wallet connection`));\n }, timeoutMs);\n });\n\n const result = await Promise.race([connectPromise, timeoutPromise]);\n\n // Create session\n const session: Session = {\n sessionId: toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`),\n walletId: selectedWallet.walletId,\n partyId: result.partyId,\n network: this.config.network,\n createdAt: Date.now(),\n expiresAt: result.session.expiresAt,\n origin: this.origin,\n capabilitiesSnapshot: result.capabilities,\n metadata: result.session.metadata as Record<string, string> | undefined,\n };\n\n // Persist session\n await this.persistSession(session);\n\n // Set active session\n this.activeSession = session;\n\n // Update registry status (may have changed during fetch)\n this.updateRegistryStatus();\n\n // Track successful connection\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n this.telemetry?.increment?.(METRICS.SESSIONS_CREATED);\n\n // Emit event\n this.emit('session:connected', {\n type: 'session:connected',\n session,\n });\n\n return session;\n } catch (err) {\n const timeoutMs = options?.timeoutMs || 30000;\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect',\n walletId: options?.walletId ? String(options.walletId) : undefined,\n timeoutMs,\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n if (!this.activeSession) {\n return;\n }\n\n try {\n const adapter = this.adapters.get(this.activeSession.walletId);\n if (adapter) {\n const ctx = this.createAdapterContext();\n await adapter.disconnect(ctx, this.activeSession);\n }\n\n const sessionId = this.activeSession.sessionId;\n await this.removeSession(sessionId);\n\n this.activeSession = null;\n\n this.emit('session:disconnected', {\n type: 'session:disconnected',\n sessionId,\n });\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect', // Use connect as default phase\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Get active session\n */\n async getActiveSession(): Promise<Session | null> {\n if (this.activeSession) {\n // Check expiration\n if (this.activeSession.expiresAt && Date.now() >= this.activeSession.expiresAt) {\n await this.disconnect();\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: this.activeSession.sessionId,\n });\n return null;\n }\n return this.activeSession;\n }\n\n // Try to restore from storage\n return this.restoreSession();\n }\n\n /**\n * Sign a message\n */\n async signMessage(params: SignMessageParams): Promise<SignedMessage> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signMessage) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signMessage'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.signMessage(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signMessage',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Sign a transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<SignedTransaction> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.signTransaction(ctx, session, params);\n \n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'pending',\n raw: result.signedTx,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Submit a transaction\n */\n async submitTransaction(params: SubmitTransactionParams): Promise<TxReceipt> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.submitTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'submitTransaction'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n const result = await adapter.submitTransaction(ctx, session, params);\n\n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'submitted',\n raw: result,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'submitTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Proxy a JSON Ledger API request through the active wallet adapter\n */\n async ledgerApi(params: LedgerApiParams): Promise<LedgerApiResult> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.ledgerApi) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'ledgerApi'\n );\n }\n\n try {\n const ctx = this.createAdapterContext();\n return await adapter.ledgerApi(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'ledgerApi',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Subscribe to events\n */\n on<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n this.off(event, handler);\n };\n }\n\n /**\n * Unsubscribe from events\n */\n off<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler);\n }\n }\n\n /**\n * Get a CIP-0103 Provider backed by this client.\n *\n * This bridge routes all request() calls through the existing\n * PartyLayerClient methods and maps events to CIP-0103 format.\n *\n * The bridge implements the full CIP-0103 specification:\n * - All 10 mandatory methods including `ledgerApi` (when adapter supports it)\n * - Full transaction lifecycle: pending -> signed -> executed/failed\n * - All CIP-0103 events: statusChanged, accountsChanged, txChanged, connected\n *\n * **Note:** Async wallets (userUrl pattern) are not supported through the\n * bridge. For async wallet support, use `PartyLayerProvider` directly.\n *\n * @returns CIP-0103 compliant Provider\n */\n asProvider(): import('@partylayer/core').CIP0103Provider {\n // Static import (top of file) — a runtime `require('@partylayer/provider')`\n // hits esbuild's `__require` shim in the ESM build and throws \"Dynamic\n // require not supported\" in browser bundles (dev + prod), crashing\n // PartyLayerKit on mount. `@partylayer/provider` does not import\n // `@partylayer/sdk`, so the static import introduces no cycle.\n return createProviderBridge(this);\n }\n\n /**\n * Destroy client and cleanup\n */\n destroy(): void {\n // Flush and destroy telemetry if it supports it\n if (this.telemetry && 'destroy' in this.telemetry && typeof this.telemetry.destroy === 'function') {\n (this.telemetry as { destroy: () => void }).destroy();\n } else if (this.telemetry?.flush) {\n this.telemetry.flush().catch(() => {});\n }\n \n this.eventHandlers.clear();\n this.activeSession = null;\n }\n\n /**\n * Create adapter context\n */\n private createAdapterContext(): AdapterContext {\n return {\n appName: this.config.app.name,\n origin: this.origin,\n network: this.config.network,\n logger: this.logger,\n telemetry: this.telemetry,\n registry: {\n getWallet: async (walletId: WalletId) => {\n return this.registryClient.getWallet(String(walletId));\n },\n },\n crypto: this.crypto,\n storage: this.storage,\n timeout: (ms: number) => {\n return new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Timeout')), ms);\n });\n },\n };\n }\n\n\n /**\n * Persist session to storage\n */\n private async persistSession(session: Session): Promise<void> {\n try {\n const data = JSON.stringify(session);\n const encrypted = await this.crypto.encrypt(data, this.origin);\n await this.storage.set(SESSION_STORAGE_KEY, encrypted);\n } catch (err) {\n this.logger.warn('Failed to persist session', err);\n }\n }\n\n /**\n * Remove session from storage.\n *\n * Accepts a sessionId for call-site symmetry, but since the SDK tracks one\n * active session we always remove the single SESSION_STORAGE_KEY.\n */\n private async removeSession(_sessionId: SessionId): Promise<void> {\n try {\n await this.storage.remove(SESSION_STORAGE_KEY);\n } catch (err) {\n this.logger.warn('Failed to remove session', err);\n }\n }\n\n /**\n * Restore session from storage\n */\n private async restoreSession(): Promise<Session | null> {\n // Track restore attempt\n this.telemetry?.increment?.(METRICS.RESTORE_ATTEMPTS);\n\n try {\n const encrypted = await this.storage.get(SESSION_STORAGE_KEY);\n if (!encrypted) {\n return null;\n }\n\n const decrypted = await this.crypto.decrypt(encrypted, this.origin);\n const session = JSON.parse(decrypted) as Session;\n\n // Check expiration\n if (session.expiresAt && Date.now() >= session.expiresAt) {\n await this.removeSession(session.sessionId);\n return null;\n }\n\n // Check origin\n if (session.origin !== this.origin) {\n return null;\n }\n\n // Try to restore with adapter\n const adapter = this.adapters.get(session.walletId);\n if (adapter?.restore) {\n const ctx = this.createAdapterContext();\n const restored = await adapter.restore(ctx, {\n ...session,\n encrypted,\n });\n\n if (restored) {\n this.activeSession = restored;\n // Persist restored session (may have updated metadata)\n await this.persistSession(restored);\n \n // Track successful restore\n this.telemetry?.increment?.(METRICS.SESSIONS_RESTORED);\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n \n // Emit session:connected event with reason=\"restore\"\n this.emit('session:connected', {\n type: 'session:connected',\n session: restored,\n });\n return restored;\n } else {\n // Restore failed - clear session\n await this.removeSession(session.sessionId);\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: session.sessionId,\n });\n return null;\n }\n }\n\n // If restore not supported, use stored session as-is\n // (Some adapters don't support restore but session metadata is still valid)\n this.activeSession = session;\n return session;\n } catch (err) {\n this.logger.warn('Failed to restore session', err);\n return null;\n }\n }\n\n /**\n * Update registry status and emit event\n */\n private updateRegistryStatus(): void {\n const status = this.registryClient.getStatus();\n if (status) {\n // Track registry metrics\n if (status.source === 'network') {\n this.telemetry?.increment?.(METRICS.REGISTRY_FETCH);\n } else if (status.source === 'cache') {\n this.telemetry?.increment?.(METRICS.REGISTRY_CACHE_HIT);\n }\n if (status.stale) {\n this.telemetry?.increment?.(METRICS.REGISTRY_STALE);\n }\n \n this.emit('registry:status', {\n type: 'registry:status',\n status: {\n source: status.source,\n verified: status.verified,\n channel: status.channel,\n sequence: status.sequence,\n stale: status.stale,\n fetchedAt: status.fetchedAt,\n etag: status.etag,\n error: status.error,\n },\n });\n }\n }\n\n /**\n * Get registry status\n */\n getRegistryStatus(): RegistryStatus | null {\n return this.registryClient.getStatus();\n }\n\n /**\n * Emit event to handlers\n */\n private emit<T extends PartyLayerEvent>(\n event: T['type'],\n payload: T\n ): void {\n // Track error metrics\n if (event === 'error' && 'error' in payload) {\n const error = payload.error as { code?: string };\n if (error.code) {\n this.telemetry?.increment?.(errorMetricName(error.code));\n }\n }\n \n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(payload);\n } catch (err) {\n this.logger.error('Error in event handler', err);\n }\n }\n }\n }\n}\n\n/**\n * Create PartyLayer client\n * \n * This is the main entry point for dApps.\n * \n * @example\n * ```typescript\n * const client = createPartyLayer({\n * registryUrl: 'https://registry.partylayer.xyz',\n * channel: 'stable',\n * network: 'devnet',\n * app: { name: 'My dApp' }\n * });\n * \n * const session = await client.connect();\n * ```\n */\nexport function createPartyLayer(\n config: PartyLayerConfig\n): PartyLayerClient {\n return new PartyLayerClient(config);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/adapters.ts","../src/builtin-adapters.ts","../src/metrics-telemetry.ts","../src/client.ts"],"names":["OriginNotAllowedError"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Configuration types for PartyLayer SDK\n */\n\nimport type { NetworkId, WalletId, WalletAdapter } from '@partylayer/core';\nimport type {\n StorageAdapter,\n CryptoAdapter,\n TelemetryAdapter,\n LoggerAdapter,\n} from '@partylayer/core';\n\n/**\n * Default registry URL for PartyLayer\n * This points to the official registry endpoint.\n */\nexport const DEFAULT_REGISTRY_URL = 'https://registry.partylayer.xyz';\n\n/**\n * Telemetry configuration for opt-in metrics collection\n * \n * @since 0.3.0\n */\nexport interface TelemetryConfig {\n /** \n * Enable telemetry collection\n * @default false\n */\n enabled: boolean;\n \n /** \n * Metrics backend endpoint URL\n * If not provided, metrics are collected but not sent\n */\n endpoint?: string;\n \n /**\n * Sampling rate (0.0 to 1.0)\n * @default 1.0 (100% of events)\n */\n sampleRate?: number;\n \n /**\n * Application identifier (will be hashed for privacy)\n * Used to calculate Monthly Active dApps (MAD)\n */\n appId?: string;\n \n /**\n * Include hashed origin in metrics\n * @default false\n */\n includeOrigin?: boolean;\n \n /**\n * Number of events to buffer before sending\n * @default 10\n */\n batchSize?: number;\n \n /**\n * Interval to flush metrics in milliseconds\n * @default 30000 (30 seconds)\n */\n flushIntervalMs?: number;\n \n /**\n * Network to include in metrics\n * If not provided, uses the SDK's configured network\n */\n network?: NetworkId;\n}\n\n/**\n * Adapter class type (for instantiation)\n */\nexport type AdapterClass = new () => WalletAdapter;\n\n/**\n * PartyLayer configuration\n */\nexport interface PartyLayerConfig {\n /** \n * Registry URL (optional)\n * @default 'https://registry.partylayer.xyz/v1/wallets.json'\n */\n registryUrl?: string;\n /** Registry channel */\n channel?: 'stable' | 'beta';\n /** Default network */\n network: NetworkId;\n /**\n * Network-mismatch enforcement policy (default: `'guard'`).\n *\n * When a connected wallet's effective network differs from `network`:\n * - `'off'` — detect + emit `session:networkMismatch` only; never block.\n * - `'guard'` — (default) block wrong-network TRANSACTIONS (signMessage,\n * signTransaction, submitTransaction, ledgerApi); connect still succeeds.\n * - `'strict'` — also block CONNECT (throws `NetworkMismatchError`).\n *\n * BEHAVIOR CHANGE: prior to this, wrong-network transactions always\n * proceeded. Set `'off'` to restore that.\n */\n networkEnforcement?: 'off' | 'guard' | 'strict';\n /** \n * Wallet adapters to register (OPTIONAL)\n * \n * By default, ALL built-in adapters are automatically registered:\n * - ConsoleAdapter (Console Wallet - browser extension)\n * - LoopAdapter (5N Loop - QR code / popup)\n * - Cantor8Adapter (Cantor8 - deep link transport)\n * \n * Note: BronAdapter requires OAuth config and is NOT included by default.\n * \n * Only provide this if you want to customize which adapters to use.\n * \n * @example\n * ```typescript\n * // Default: all adapters (recommended)\n * const client = createPartyLayer({\n * network: 'devnet',\n * app: { name: 'My dApp' },\n * // adapters not specified = all built-in adapters (Console, Loop, Cantor8)\n * });\n * \n * // Custom: only specific adapters\n * import { ConsoleAdapter } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [new ConsoleAdapter()], // Only Console Wallet\n * // ...\n * });\n * \n * // With Bron (enterprise wallet with OAuth)\n * import { BronAdapter, getBuiltinAdapters } from '@partylayer/sdk';\n * const client = createPartyLayer({\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({ auth: {...}, api: {...} }),\n * ],\n * // ...\n * });\n * ```\n */\n adapters?: (WalletAdapter | AdapterClass)[];\n /** Storage adapter (default: browser localStorage-based encrypted) */\n storage?: StorageAdapter;\n /** Crypto adapter (default: WebCrypto) */\n crypto?: CryptoAdapter;\n /** Registry public keys for signature verification (ed25519) */\n registryPublicKeys?: string[];\n /** \n * Telemetry configuration or adapter\n * \n * Can be either:\n * - TelemetryConfig object for built-in metrics collection\n * - TelemetryAdapter instance for custom telemetry\n * \n * @default undefined (telemetry disabled)\n * @since 0.3.0 - Added TelemetryConfig support\n */\n telemetry?: TelemetryAdapter | TelemetryConfig;\n /** Logger adapter (optional) */\n logger?: LoggerAdapter;\n /** Application metadata */\n app: {\n /** Application name */\n name: string;\n /** Origin (for origin binding checks, defaults to window.location.origin) */\n origin?: string;\n };\n}\n\n/**\n * Connect options\n */\nexport interface ConnectOptions {\n /** Specific wallet ID to connect to */\n walletId?: WalletId;\n /** Prefer installed wallets */\n preferInstalled?: boolean;\n /** Allow only specific wallets */\n allowWallets?: WalletId[];\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Timeout in milliseconds */\n timeoutMs?: number;\n /**\n * Called with a pairing/display URI (e.g. a WalletConnect `wc:` URI) the\n * moment the adapter produces one, before approval. Used by the connect UI\n * to render a QR / deep-link. Adapters without such a URI never call it.\n */\n onDisplayUri?: (uri: string) => void;\n}\n\n/**\n * Wallet filter options\n */\nexport interface WalletFilter {\n /** Required capabilities */\n requiredCapabilities?: string[];\n /** Include experimental wallets */\n includeExperimental?: boolean;\n}\n","/**\n * Default adapter implementations\n */\n\nimport type {\n StorageAdapter,\n CryptoAdapter,\n LoggerAdapter,\n TelemetryAdapter,\n} from '@partylayer/core';\n\n/**\n * Default logger (console-based)\n */\nexport class DefaultLogger implements LoggerAdapter {\n debug(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.debug) {\n console.debug(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.info) {\n console.info(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.warn) {\n console.warn(`[PartyLayer] ${message}`, ...args);\n }\n }\n\n error(message: string, error?: unknown, ...args: unknown[]): void {\n if (typeof console !== 'undefined' && console.error) {\n console.error(`[PartyLayer] ${message}`, error, ...args);\n }\n }\n}\n\n/**\n * Default crypto adapter (Web Crypto API)\n */\nexport class DefaultCrypto implements CryptoAdapter {\n private async getKey(origin: string): Promise<CryptoKey> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n throw new Error('Web Crypto API not available');\n }\n\n const encoder = new TextEncoder();\n const data = encoder.encode(origin);\n const hash = await crypto.subtle.digest('SHA-256', data);\n return crypto.subtle.importKey(\n 'raw',\n hash.slice(0, 32),\n { name: 'AES-GCM' },\n false,\n ['encrypt', 'decrypt']\n );\n }\n\n async encrypt(data: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n // Fallback to base64\n return btoa(data);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const iv = crypto.getRandomValues(new Uint8Array(12));\n const encoder = new TextEncoder();\n const encoded = encoder.encode(data);\n\n const encrypted = await crypto.subtle.encrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n encoded\n );\n\n const combined = new Uint8Array(iv.length + encrypted.byteLength);\n combined.set(iv);\n combined.set(new Uint8Array(encrypted), iv.length);\n\n return btoa(String.fromCharCode(...combined));\n } catch {\n return btoa(data);\n }\n }\n\n async decrypt(encrypted: string, key: string): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.subtle) {\n return atob(encrypted);\n }\n\n try {\n const cryptoKey = await this.getKey(key);\n const combined = Uint8Array.from(atob(encrypted), (c) => c.charCodeAt(0));\n\n const iv = combined.slice(0, 12);\n const data = combined.slice(12);\n\n const decrypted = await crypto.subtle.decrypt(\n { name: 'AES-GCM', iv },\n cryptoKey,\n data\n );\n\n const decoder = new TextDecoder();\n return decoder.decode(decrypted);\n } catch {\n return atob(encrypted);\n }\n }\n\n async generateKey(): Promise<string> {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n return Math.random().toString(36).substring(2, 15);\n }\n\n const array = new Uint8Array(32);\n crypto.getRandomValues(array);\n return Array.from(array, (b) => b.toString(16).padStart(2, '0')).join('');\n }\n}\n\n/**\n * Default storage adapter (localStorage-based)\n */\nexport class DefaultStorage implements StorageAdapter {\n private prefix: string;\n\n constructor(prefix = 'partylayer_') {\n this.prefix = prefix;\n }\n\n async get(key: string): Promise<string | null> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return null;\n }\n\n try {\n return localStorage.getItem(`${this.prefix}${key}`);\n } catch {\n return null;\n }\n }\n\n async set(key: string, value: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.setItem(`${this.prefix}${key}`, value);\n } catch {\n // Ignore storage errors\n }\n }\n\n async remove(key: string): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n localStorage.removeItem(`${this.prefix}${key}`);\n } catch {\n // Ignore storage errors\n }\n }\n\n async clear(): Promise<void> {\n if (typeof window === 'undefined' || !window.localStorage) {\n return;\n }\n\n try {\n const keys: string[] = [];\n for (let i = 0; i < localStorage.length; i++) {\n const key = localStorage.key(i);\n if (key?.startsWith(this.prefix)) {\n keys.push(key);\n }\n }\n\n for (const key of keys) {\n localStorage.removeItem(key);\n }\n } catch {\n // Ignore storage errors\n }\n }\n}\n\n/**\n * Default telemetry adapter (no-op)\n */\nexport class DefaultTelemetry implements TelemetryAdapter {\n track(_event: string, _properties?: Record<string, unknown>): void {\n // No-op\n }\n\n error(_error: Error, _properties?: Record<string, unknown>): void {\n // No-op\n }\n}\n","/**\n * Built-in wallet adapters\n *\n * These adapters are automatically registered when creating a PartyLayer client.\n * dApp developers don't need to install or configure these separately.\n */\n\nimport type { WalletAdapter } from '@partylayer/core';\nimport { ConsoleAdapter } from '@partylayer/adapter-console';\nimport { LoopAdapter } from '@partylayer/adapter-loop';\nimport { Cantor8Adapter } from '@partylayer/adapter-cantor8';\nimport { NightlyAdapter } from '@partylayer/adapter-nightly';\nimport { SendAdapter } from '@partylayer/adapter-send';\n\n// Note: BronAdapter requires OAuth config and is not included by default.\n// Import it separately: import { BronAdapter } from '@partylayer/adapter-bron';\n\n/**\n * Get all built-in adapters\n *\n * This function returns instances of all supported wallet adapters.\n * Called automatically by createPartyLayer() unless custom adapters are provided.\n *\n * Included adapters:\n * - ConsoleAdapter: Console Wallet browser extension + mobile (combined mode)\n * - LoopAdapter: 5N Loop mobile/web wallet\n * - Cantor8Adapter: Cantor8 wallet with deep link transport\n * - NightlyAdapter: Nightly multichain wallet with Canton support\n * - SendAdapter: Send Canton Wallet (passkey / WebAuthn-PRF, beta) — also\n * injects at `window.canton`; the adapter's kernel.id guard keeps it\n * and Console-spec wallets from claiming each other's provider.\n *\n * Note: ConsoleAdapter defaults to 'combined' mode which supports both browser\n * extension and mobile wallet connect (QR code / deep link). To restrict to\n * extension-only, pass { target: 'local' } to the constructor.\n *\n * Note: BronAdapter is NOT included by default because it requires OAuth configuration.\n * To use Bron, install @partylayer/adapter-bron and register it manually.\n */\nexport function getBuiltinAdapters(): WalletAdapter[] {\n return [\n new ConsoleAdapter(), // Console Wallet - extension + mobile (combined)\n new LoopAdapter(), // 5N Loop - QR code / popup\n new Cantor8Adapter(), // Cantor8 - deep link transport\n new NightlyAdapter(), // Nightly - multichain wallet (injected)\n new SendAdapter(), // Send - passkey-based, kernel.id-guarded window.canton\n ];\n}\n\n/**\n * Built-in adapter classes (for advanced usage)\n */\nexport { ConsoleAdapter, LoopAdapter, Cantor8Adapter, NightlyAdapter, SendAdapter };\n\n/**\n * Re-export Console adapter types for convenience\n */\nexport type { ConsoleAdapterConfig, ConsoleConnectionTarget } from '@partylayer/adapter-console';\n\n/**\n * Re-export BronAdapter for convenience (requires config)\n *\n * @example\n * ```typescript\n * import { BronAdapter } from '@partylayer/sdk';\n *\n * const client = createPartyLayer({\n * // ... config\n * adapters: [\n * ...getBuiltinAdapters(),\n * new BronAdapter({\n * auth: { clientId: '...', redirectUri: '...', ... },\n * api: { baseUrl: '...', getAccessToken: async () => '...' },\n * }),\n * ],\n * });\n * ```\n */\nexport { BronAdapter } from '@partylayer/adapter-bron';\nexport type { BronAdapterConfig, BronAuthConfig, BronApiConfig } from '@partylayer/adapter-bron';\n","/**\n * Metrics Telemetry Adapter\n * \n * A privacy-safe telemetry adapter that collects metrics for\n * ecosystem health monitoring and usage reporting.\n * \n * Features:\n * - Opt-in by default (disabled unless explicitly enabled)\n * - Privacy-safe payloads (no PII, hashed identifiers)\n * - Batched sending to reduce network overhead\n * - Configurable sampling rate\n * - Automatic flush on interval or batch size\n * \n * @since 0.3.0\n */\n\nimport type { TelemetryAdapter } from '@partylayer/core';\nimport {\n createMetricsPayload,\n hashForPrivacy,\n} from '@partylayer/core';\nimport type { TelemetryConfig } from './config';\n\n/** SDK Version - should match package.json */\nconst SDK_VERSION = '0.3.0';\n\n/**\n * Internal metric event for buffering\n */\ninterface MetricEvent {\n type: 'increment' | 'gauge';\n metric: string;\n value: number;\n timestamp: number;\n}\n\n/**\n * Metrics Telemetry Adapter\n * \n * Implements TelemetryAdapter interface with metrics-specific functionality.\n */\nexport class MetricsTelemetryAdapter implements TelemetryAdapter {\n private config: TelemetryConfig;\n private metrics: Map<string, number> = new Map();\n private buffer: MetricEvent[] = [];\n private flushTimer: ReturnType<typeof setInterval> | null = null;\n private appIdHash: string | null = null;\n private originHash: string | null = null;\n private initialized = false;\n \n constructor(config: TelemetryConfig) {\n this.config = {\n enabled: config.enabled ?? false,\n endpoint: config.endpoint,\n sampleRate: config.sampleRate ?? 1.0,\n appId: config.appId,\n includeOrigin: config.includeOrigin ?? false,\n batchSize: config.batchSize ?? 10,\n flushIntervalMs: config.flushIntervalMs ?? 30000,\n network: config.network,\n };\n \n // Initialize async hashing\n this.initialize();\n }\n \n /**\n * Initialize async components (hashing)\n */\n private async initialize(): Promise<void> {\n if (this.initialized) return;\n \n if (this.config.appId) {\n this.appIdHash = await hashForPrivacy(this.config.appId);\n }\n \n if (this.config.includeOrigin && typeof window !== 'undefined') {\n this.originHash = await hashForPrivacy(window.location.origin);\n }\n \n // Start flush timer\n if (this.config.enabled && this.config.flushIntervalMs) {\n this.flushTimer = setInterval(() => {\n this.flush().catch(console.error);\n }, this.config.flushIntervalMs);\n }\n \n this.initialized = true;\n }\n \n /**\n * Check if telemetry is enabled\n */\n isEnabled(): boolean {\n return this.config.enabled;\n }\n \n /**\n * Track a named event (TelemetryAdapter interface)\n */\n track(event: string, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n // Convert event to increment - bypass the increment sampling since we already checked\n const current = this.metrics.get(`event_${event}`) ?? 0;\n this.metrics.set(`event_${event}`, current + 1);\n this.bufferEvent({ type: 'increment', metric: `event_${event}`, value: 1, timestamp: Date.now() });\n \n // Track any numeric properties as gauges\n if (properties) {\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value === 'number') {\n this.gauge(`${event}_${key}`, value);\n }\n }\n }\n }\n \n /**\n * Track an error (TelemetryAdapter interface)\n */\n error(error: Error, properties?: Record<string, unknown>): void {\n if (!this.config.enabled) return;\n \n // Extract error code if available\n const code = (error as { code?: string }).code ?? 'UNKNOWN';\n this.increment(`error_${code}`);\n \n // Track properties\n if (properties) {\n this.track('error', properties);\n }\n }\n \n /**\n * Increment a metric counter\n */\n increment(metric: string, value: number = 1): void {\n if (!this.config.enabled) return;\n \n // Apply sampling (sampleRate of 0 means no events, 1 means all events)\n const sampleRate = this.config.sampleRate ?? 1.0;\n if (sampleRate < 1.0 && Math.random() >= sampleRate) {\n return;\n }\n \n const current = this.metrics.get(metric) ?? 0;\n this.metrics.set(metric, current + value);\n \n this.bufferEvent({\n type: 'increment',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Set a gauge metric value\n */\n gauge(metric: string, value: number): void {\n if (!this.config.enabled) return;\n \n this.metrics.set(metric, value);\n \n this.bufferEvent({\n type: 'gauge',\n metric,\n value,\n timestamp: Date.now(),\n });\n }\n \n /**\n * Buffer an event for batched sending\n */\n private bufferEvent(event: MetricEvent): void {\n this.buffer.push(event);\n \n // Flush if batch size reached\n if (this.config.batchSize && this.buffer.length >= this.config.batchSize) {\n this.flush().catch(console.error);\n }\n }\n \n /**\n * Flush buffered metrics to backend\n */\n async flush(): Promise<void> {\n if (!this.config.enabled) return;\n if (this.metrics.size === 0) return;\n if (!this.config.endpoint) {\n // No endpoint configured - just clear the buffer\n this.buffer = [];\n return;\n }\n \n // Wait for initialization\n if (!this.initialized) {\n await this.initialize();\n }\n \n try {\n const payload = createMetricsPayload({\n sdkVersion: SDK_VERSION,\n network: this.config.network ?? 'unknown',\n metrics: Object.fromEntries(this.metrics),\n appIdHash: this.appIdHash ?? undefined,\n originHash: this.originHash ?? undefined,\n });\n \n await fetch(this.config.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(payload),\n });\n \n // Clear buffer on success\n this.buffer = [];\n // Note: We don't clear metrics - they accumulate until next flush\n // This allows calculating rates (e.g., errors per session)\n } catch (error) {\n // Silent fail - don't break the app for telemetry failures\n console.debug('[PartyLayer Telemetry] Flush failed:', error);\n }\n }\n \n /**\n * Get current metrics snapshot (for testing/debugging)\n */\n getMetrics(): Record<string, number> {\n return Object.fromEntries(this.metrics);\n }\n \n /**\n * Reset all metrics (for testing)\n */\n reset(): void {\n this.metrics.clear();\n this.buffer = [];\n }\n \n /**\n * Destroy the adapter (cleanup timers)\n */\n destroy(): void {\n if (this.flushTimer) {\n clearInterval(this.flushTimer);\n this.flushTimer = null;\n }\n \n // Final flush\n this.flush().catch(console.error);\n }\n}\n\n/**\n * Check if a value is a TelemetryConfig object\n */\nexport function isTelemetryConfig(value: unknown): value is TelemetryConfig {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'enabled' in value &&\n typeof (value as TelemetryConfig).enabled === 'boolean'\n );\n}\n\n/**\n * Create a TelemetryAdapter from config\n * \n * If config is already a TelemetryAdapter, returns it.\n * If config is a TelemetryConfig, creates a MetricsTelemetryAdapter.\n */\nexport function createTelemetryAdapter(\n config: TelemetryAdapter | TelemetryConfig | undefined\n): TelemetryAdapter | undefined {\n if (!config) return undefined;\n \n if (isTelemetryConfig(config)) {\n return new MetricsTelemetryAdapter(config);\n }\n \n return config;\n}\n","/**\n * PartyLayer Client - Public API Implementation\n * \n * This is the main public API for PartyLayer SDK.\n * All dApps should use this API exclusively.\n * \n * References:\n * - Wallet Integration Guide: https://docs.digitalasset.com/integrate/devnet/index.html\n * - Signing transactions from dApps: https://docs.digitalasset.com/integrate/devnet/signing-transactions-from-dapps/index.html\n * - OpenRPC dApp API spec: https://github.com/hyperledger-labs/splice-wallet-kernel/blob/main/api-specs/openrpc-dapp-api.json\n */\n\nimport type {\n WalletId,\n SessionId,\n CapabilityKey,\n WalletInfo,\n Session,\n SignedMessage,\n SignedTransaction,\n TxReceipt,\n WalletAdapter,\n AdapterContext,\n NetworkId,\n} from '@partylayer/core';\nimport {\n toSessionId,\n WalletNotFoundError,\n CapabilityNotSupportedError,\n NetworkMismatchError,\n detectNetworkMismatch,\n mapUnknownErrorToPartyLayerError,\n capabilityGuard,\n installGuard,\n} from '@partylayer/core';\nimport { RegistryClient } from '@partylayer/registry-client';\nimport type { RegistryStatus } from '@partylayer/registry-client';\nimport { createProviderBridge } from '@partylayer/provider';\nimport {\n DEFAULT_REGISTRY_URL,\n type PartyLayerConfig,\n type ConnectOptions,\n type WalletFilter,\n} from './config';\nimport type {\n PartyLayerEvent,\n EventHandler,\n} from './events';\nimport {\n DefaultLogger,\n DefaultCrypto,\n DefaultStorage,\n DefaultTelemetry,\n} from './adapters';\nimport { getBuiltinAdapters } from './builtin-adapters';\nimport { createTelemetryAdapter } from './metrics-telemetry';\nimport { METRICS, errorMetricName } from '@partylayer/core';\nimport type {\n SignMessageParams,\n SignTransactionParams,\n SubmitTransactionParams,\n LedgerApiParams,\n LedgerApiResult,\n} from '@partylayer/core';\n\n/**\n * Storage key used for the active session.\n *\n * SDK tracks a single active session at a time, so persist/restore/remove\n * all target the same key. Prior to this fix, persist wrote to\n * `session_<sessionId>` while restore read from `active_session`, which\n * meant sessions never survived a page reload.\n */\nconst SESSION_STORAGE_KEY = 'active_session';\n\n/**\n * PartyLayer Client\n * \n * Main client interface for dApps to interact with Canton wallets.\n */\nexport class PartyLayerClient {\n private config: PartyLayerConfig;\n private adapters = new Map<WalletId, WalletAdapter>();\n private eventHandlers = new Map<string, Set<EventHandler>>();\n private activeSession: Session | null = null;\n public readonly registryClient: RegistryClient; // Expose for React hooks\n private logger: import('@partylayer/core').LoggerAdapter;\n private crypto: import('@partylayer/core').CryptoAdapter;\n private storage: import('@partylayer/core').StorageAdapter;\n private telemetry?: import('@partylayer/core').TelemetryAdapter;\n private origin: string;\n\n constructor(config: PartyLayerConfig) {\n this.config = config;\n\n // Determine origin\n if (config.app.origin) {\n this.origin = config.app.origin;\n } else if (typeof window !== 'undefined') {\n this.origin = window.location.origin;\n } else {\n this.origin = 'unknown';\n }\n\n // Initialize service adapters\n this.logger = config.logger || new DefaultLogger();\n this.crypto = config.crypto || new DefaultCrypto();\n this.storage = config.storage || new DefaultStorage();\n \n // Initialize telemetry - supports both TelemetryAdapter and TelemetryConfig\n const telemetryAdapter = createTelemetryAdapter(config.telemetry);\n this.telemetry = telemetryAdapter || new DefaultTelemetry();\n\n // Register wallet adapters\n // If no adapters provided, use all built-in adapters (Console, Loop, etc.)\n const adaptersToRegister = config.adapters ?? getBuiltinAdapters();\n \n for (const adapterOrClass of adaptersToRegister) {\n let adapter: import('@partylayer/core').WalletAdapter;\n \n // Check if it's a class (function) or instance (object)\n if (typeof adapterOrClass === 'function') {\n // It's a class - instantiate it\n adapter = new (adapterOrClass as new () => import('@partylayer/core').WalletAdapter)();\n } else {\n // It's already an instance\n adapter = adapterOrClass;\n }\n \n this.adapters.set(adapter.walletId, adapter);\n this.logger.debug('Registered wallet adapter', {\n walletId: adapter.walletId,\n name: adapter.name,\n capabilities: adapter.getCapabilities(),\n });\n }\n\n // Initialize registry client with signature verification\n this.registryClient = new RegistryClient({\n registryUrl: config.registryUrl || DEFAULT_REGISTRY_URL,\n channel: config.channel || 'stable',\n registryPublicKeys: config.registryPublicKeys,\n storage: this.storage,\n });\n\n // Emit initial registry status\n this.updateRegistryStatus();\n\n // Restore session on init\n this.restoreSession().catch((err) => {\n this.emit('error', {\n type: 'error',\n error: mapUnknownErrorToPartyLayerError(err, {\n phase: 'restore',\n }),\n });\n });\n }\n\n /**\n * Register a wallet adapter\n *\n * @internal\n * This is used internally by the SDK to register adapters.\n * In production, adapters would be auto-registered via registry.\n */\n registerAdapter(adapter: WalletAdapter): void {\n this.adapters.set(adapter.walletId, adapter);\n }\n\n /**\n * Look up a registered adapter by wallet id.\n *\n * Returns the adapter instance when one is registered for the given\n * `walletId`, or `undefined` otherwise. Intended for UI integrations\n * that need to call `adapter.detectInstalled()` directly to render a\n * per-wallet readiness indicator (instead of duplicating\n * transport-specific install detection logic in the picker). The\n * returned adapter is the same instance used internally for connect /\n * sign / submit flows; do not mutate it.\n *\n * Accepts both raw string ids and the branded `WalletId` form so\n * consumers can pass `walletInfo.walletId` or a string literal\n * interchangeably.\n */\n getAdapter(walletId: string | WalletId): WalletAdapter | undefined {\n return this.adapters.get(walletId as WalletId);\n }\n\n /**\n * List available wallets\n */\n async listWallets(filter?: WalletFilter): Promise<WalletInfo[]> {\n let registryWallets: WalletInfo[];\n\n try {\n // getWallets() already returns WalletInfo[]\n registryWallets = await this.registryClient.getWallets();\n\n // Update registry status after successful fetch\n this.updateRegistryStatus();\n } catch (err) {\n // Update registry status even on error (may have fallback info)\n this.updateRegistryStatus();\n\n this.logger.warn('Registry fetch failed, using registered adapters only', {\n error: err instanceof Error ? err.message : String(err),\n });\n\n registryWallets = [];\n }\n\n // Merge: include registered adapters that are NOT in the registry\n // (e.g. NightlyAdapter is builtin but may not have a registry entry yet)\n const registryIds = new Set(registryWallets.map((w) => String(w.walletId)));\n for (const [, adapter] of this.adapters) {\n if (registryIds.has(String(adapter.walletId))) continue;\n\n registryWallets.push({\n walletId: adapter.walletId,\n name: adapter.name,\n website: '',\n icons: {},\n capabilities: adapter.getCapabilities(),\n adapter: { packageName: 'builtin', versionRange: '*' },\n docs: [],\n networks: [this.config.network || 'devnet'],\n channel: 'stable',\n } as WalletInfo);\n }\n\n // Filter by capabilities\n if (filter?.requiredCapabilities) {\n return registryWallets.filter((walletInfo) =>\n filter.requiredCapabilities!.every((cap) =>\n walletInfo.capabilities.includes(cap as CapabilityKey)\n )\n );\n }\n\n // Filter experimental\n if (!filter?.includeExperimental) {\n return registryWallets.filter((walletInfo) => walletInfo.channel === 'stable');\n }\n\n return registryWallets;\n }\n\n /** Active network-enforcement policy (default 'guard'). */\n private get enforcement(): 'off' | 'guard' | 'strict' {\n return this.config.networkEnforcement ?? 'guard';\n }\n\n /**\n * Detect a confident network mismatch between the dApp's configured network\n * and the session's (wallet-reported) network. Returns null when they match\n * or the comparison isn't confident (conservative — never a false positive).\n */\n private networkMismatch(session: Session): { expected: string; actual: string } | null {\n return detectNetworkMismatch(this.config.network, session.network);\n }\n\n /**\n * Guard a transaction-class operation: throw `NetworkMismatchError` when the\n * session is on the wrong network AND the policy enforces it ('guard' |\n * 'strict'). Also protects restored sessions and mid-session network switches.\n */\n private assertNetworkOk(session: Session): void {\n const mm = this.networkMismatch(session);\n if (mm && this.enforcement !== 'off') {\n throw new NetworkMismatchError(mm.expected, mm.actual);\n }\n }\n\n /**\n * Connect to a wallet\n */\n async connect(options?: ConnectOptions): Promise<Session> {\n // Track connect attempt\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_ATTEMPTS);\n \n try {\n // Get available wallets\n const wallets = await this.listWallets({\n requiredCapabilities: options?.requiredCapabilities,\n includeExperimental: true,\n });\n\n // Filter by allowWallets\n let availableWallets = wallets;\n if (options?.allowWallets) {\n availableWallets = wallets.filter((w) =>\n options.allowWallets!.includes(w.walletId)\n );\n }\n\n // Select wallet\n let selectedWallet: WalletInfo;\n let isNativeWallet = false;\n if (options?.walletId) {\n const found = availableWallets.find(\n (w) => w.walletId === options.walletId\n );\n if (found) {\n selectedWallet = found;\n } else {\n // Fallback: check if a native CIP-0103 adapter is registered\n const nativeAdapter = this.adapters.get(options.walletId);\n if (nativeAdapter) {\n isNativeWallet = true;\n selectedWallet = {\n walletId: options.walletId,\n name: nativeAdapter.name,\n website: '',\n icons: {},\n capabilities: nativeAdapter.getCapabilities(),\n adapter: { packageName: 'native-cip0103', versionRange: '*' },\n docs: [],\n networks: [this.config.network],\n channel: 'stable' as const,\n metadata: { source: 'native-cip0103' },\n };\n } else {\n throw new WalletNotFoundError(String(options.walletId));\n }\n }\n } else if (availableWallets.length === 0) {\n throw new WalletNotFoundError('No wallets available');\n } else {\n selectedWallet = availableWallets[0];\n }\n\n // Get adapter\n const adapter = this.adapters.get(selectedWallet.walletId);\n if (!adapter) {\n throw new WalletNotFoundError(String(selectedWallet.walletId));\n }\n\n // Check origin allowlist (skip for native CIP-0103 wallets and\n // adapter-merged wallets that aren't in the registry)\n if (!isNativeWallet) {\n try {\n const walletEntry = await this.registryClient.getWalletEntry(String(selectedWallet.walletId));\n if (walletEntry.originAllowlist && walletEntry.originAllowlist.length > 0) {\n if (!walletEntry.originAllowlist.includes(this.origin)) {\n const { OriginNotAllowedError } = await import('@partylayer/core');\n throw new OriginNotAllowedError(\n this.origin,\n walletEntry.originAllowlist\n );\n }\n }\n } catch (e) {\n // Wallet not in registry (adapter-merged) — skip origin check\n if (!(e instanceof WalletNotFoundError)) {\n throw e;\n }\n }\n }\n\n // Check capabilities\n if (options?.requiredCapabilities) {\n capabilityGuard(adapter, options.requiredCapabilities as CapabilityKey[]);\n }\n\n // Check installation\n await installGuard(adapter);\n\n // Create adapter context\n const ctx = this.createAdapterContext();\n\n // Connect\n // Default timeout: 2 minutes for QR code/popup based wallets\n const timeoutMs = options?.timeoutMs || 120000;\n const connectPromise = adapter.connect(ctx, {\n timeoutMs,\n partyId: undefined,\n preferInstalled: options?.preferInstalled,\n onDisplayUri: options?.onDisplayUri,\n });\n\n const timeoutPromise = new Promise<never>((_, reject) => {\n setTimeout(() => {\n reject(new Error(`Connection timed out after ${timeoutMs}ms - user did not complete wallet connection`));\n }, timeoutMs);\n });\n\n const result = await Promise.race([connectPromise, timeoutPromise]);\n\n // Create session\n const session: Session = {\n sessionId: toSessionId(`session_${Date.now()}_${Math.random().toString(36).substring(2, 15)}`),\n walletId: selectedWallet.walletId,\n partyId: result.partyId,\n // The wallet's reported network (adapters that read the live wallet —\n // e.g. Console via getActiveNetwork — surface the actual network here;\n // echo-only adapters report ctx.network === config.network). Used for\n // mismatch detection; falls back to the configured network.\n network: (result.session.network ?? this.config.network) as NetworkId,\n createdAt: Date.now(),\n expiresAt: result.session.expiresAt,\n origin: this.origin,\n capabilitiesSnapshot: result.capabilities,\n metadata: result.session.metadata as Record<string, string> | undefined,\n };\n\n // Network-mismatch detection: the wallet connected on a different network\n // than the dApp is configured for. Always detected + flagged + emitted;\n // 'strict' blocks the connect, 'guard'/'off' let it proceed.\n const mismatch = this.networkMismatch(session);\n if (mismatch) {\n session.networkMismatch = mismatch;\n this.emit('session:networkMismatch', {\n type: 'session:networkMismatch',\n sessionId: session.sessionId,\n expected: mismatch.expected,\n actual: mismatch.actual,\n enforced: this.enforcement !== 'off',\n });\n if (this.enforcement === 'strict') {\n throw new NetworkMismatchError(mismatch.expected, mismatch.actual);\n }\n }\n\n // Persist session\n await this.persistSession(session);\n\n // Set active session\n this.activeSession = session;\n\n // Update registry status (may have changed during fetch)\n this.updateRegistryStatus();\n\n // Track successful connection\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n this.telemetry?.increment?.(METRICS.SESSIONS_CREATED);\n\n // Emit event\n this.emit('session:connected', {\n type: 'session:connected',\n session,\n });\n\n return session;\n } catch (err) {\n const timeoutMs = options?.timeoutMs || 30000;\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect',\n walletId: options?.walletId ? String(options.walletId) : undefined,\n timeoutMs,\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Disconnect from wallet\n */\n async disconnect(): Promise<void> {\n if (!this.activeSession) {\n return;\n }\n\n try {\n const adapter = this.adapters.get(this.activeSession.walletId);\n if (adapter) {\n const ctx = this.createAdapterContext();\n await adapter.disconnect(ctx, this.activeSession);\n }\n\n const sessionId = this.activeSession.sessionId;\n await this.removeSession(sessionId);\n\n this.activeSession = null;\n\n this.emit('session:disconnected', {\n type: 'session:disconnected',\n sessionId,\n });\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'connect', // Use connect as default phase\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Get active session\n */\n async getActiveSession(): Promise<Session | null> {\n if (this.activeSession) {\n // Check expiration\n if (this.activeSession.expiresAt && Date.now() >= this.activeSession.expiresAt) {\n await this.disconnect();\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: this.activeSession.sessionId,\n });\n return null;\n }\n return this.activeSession;\n }\n\n // Try to restore from storage\n return this.restoreSession();\n }\n\n /**\n * Sign a message\n */\n async signMessage(params: SignMessageParams): Promise<SignedMessage> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signMessage) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signMessage'\n );\n }\n\n try {\n this.assertNetworkOk(session);\n const ctx = this.createAdapterContext();\n return await adapter.signMessage(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signMessage',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Sign a transaction\n */\n async signTransaction(params: SignTransactionParams): Promise<SignedTransaction> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.signTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'signTransaction'\n );\n }\n\n try {\n this.assertNetworkOk(session);\n const ctx = this.createAdapterContext();\n const result = await adapter.signTransaction(ctx, session, params);\n \n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'pending',\n raw: result.signedTx,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'signTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Submit a transaction\n */\n async submitTransaction(params: SubmitTransactionParams): Promise<TxReceipt> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.submitTransaction) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'submitTransaction'\n );\n }\n\n try {\n this.assertNetworkOk(session);\n const ctx = this.createAdapterContext();\n const result = await adapter.submitTransaction(ctx, session, params);\n\n // Emit transaction status\n this.emit('tx:status', {\n type: 'tx:status',\n sessionId: session.sessionId,\n txId: result.transactionHash,\n status: 'submitted',\n raw: result,\n });\n\n return result;\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'submitTransaction',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Proxy a JSON Ledger API request through the active wallet adapter\n */\n async ledgerApi(params: LedgerApiParams): Promise<LedgerApiResult> {\n const session = await this.getActiveSession();\n if (!session) {\n throw new Error('No active session');\n }\n\n const adapter = this.adapters.get(session.walletId);\n if (!adapter || !adapter.ledgerApi) {\n throw new CapabilityNotSupportedError(\n session.walletId,\n 'ledgerApi'\n );\n }\n\n try {\n this.assertNetworkOk(session);\n const ctx = this.createAdapterContext();\n return await adapter.ledgerApi(ctx, session, params);\n } catch (err) {\n const error = mapUnknownErrorToPartyLayerError(err, {\n phase: 'ledgerApi',\n walletId: String(session.walletId),\n });\n this.emit('error', { type: 'error', error });\n throw error;\n }\n }\n\n /**\n * Subscribe to events\n */\n on<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): () => void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set());\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler);\n\n // Return unsubscribe function\n return () => {\n this.off(event, handler);\n };\n }\n\n /**\n * Unsubscribe from events\n */\n off<T extends PartyLayerEvent>(\n event: T['type'],\n handler: EventHandler<T>\n ): void {\n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n handlers.delete(handler as EventHandler);\n }\n }\n\n /**\n * Get a CIP-0103 Provider backed by this client.\n *\n * This bridge routes all request() calls through the existing\n * PartyLayerClient methods and maps events to CIP-0103 format.\n *\n * The bridge implements the full CIP-0103 specification:\n * - All 10 mandatory methods including `ledgerApi` (when adapter supports it)\n * - Full transaction lifecycle: pending -> signed -> executed/failed\n * - All CIP-0103 events: statusChanged, accountsChanged, txChanged, connected\n *\n * **Note:** Async wallets (userUrl pattern) are not supported through the\n * bridge. For async wallet support, use `PartyLayerProvider` directly.\n *\n * @returns CIP-0103 compliant Provider\n */\n asProvider(): import('@partylayer/core').CIP0103Provider {\n // Static import (top of file) — a runtime `require('@partylayer/provider')`\n // hits esbuild's `__require` shim in the ESM build and throws \"Dynamic\n // require not supported\" in browser bundles (dev + prod), crashing\n // PartyLayerKit on mount. `@partylayer/provider` does not import\n // `@partylayer/sdk`, so the static import introduces no cycle.\n return createProviderBridge(this);\n }\n\n /**\n * Destroy client and cleanup\n */\n destroy(): void {\n // Flush and destroy telemetry if it supports it\n if (this.telemetry && 'destroy' in this.telemetry && typeof this.telemetry.destroy === 'function') {\n (this.telemetry as { destroy: () => void }).destroy();\n } else if (this.telemetry?.flush) {\n this.telemetry.flush().catch(() => {});\n }\n \n this.eventHandlers.clear();\n this.activeSession = null;\n }\n\n /**\n * Create adapter context\n */\n private createAdapterContext(): AdapterContext {\n return {\n appName: this.config.app.name,\n origin: this.origin,\n network: this.config.network,\n logger: this.logger,\n telemetry: this.telemetry,\n registry: {\n getWallet: async (walletId: WalletId) => {\n return this.registryClient.getWallet(String(walletId));\n },\n },\n crypto: this.crypto,\n storage: this.storage,\n timeout: (ms: number) => {\n return new Promise<never>((_, reject) => {\n setTimeout(() => reject(new Error('Timeout')), ms);\n });\n },\n };\n }\n\n\n /**\n * Persist session to storage\n */\n private async persistSession(session: Session): Promise<void> {\n try {\n const data = JSON.stringify(session);\n const encrypted = await this.crypto.encrypt(data, this.origin);\n await this.storage.set(SESSION_STORAGE_KEY, encrypted);\n } catch (err) {\n this.logger.warn('Failed to persist session', err);\n }\n }\n\n /**\n * Remove session from storage.\n *\n * Accepts a sessionId for call-site symmetry, but since the SDK tracks one\n * active session we always remove the single SESSION_STORAGE_KEY.\n */\n private async removeSession(_sessionId: SessionId): Promise<void> {\n try {\n await this.storage.remove(SESSION_STORAGE_KEY);\n } catch (err) {\n this.logger.warn('Failed to remove session', err);\n }\n }\n\n /**\n * Restore session from storage\n */\n private async restoreSession(): Promise<Session | null> {\n // Track restore attempt\n this.telemetry?.increment?.(METRICS.RESTORE_ATTEMPTS);\n\n try {\n const encrypted = await this.storage.get(SESSION_STORAGE_KEY);\n if (!encrypted) {\n return null;\n }\n\n const decrypted = await this.crypto.decrypt(encrypted, this.origin);\n const session = JSON.parse(decrypted) as Session;\n\n // Check expiration\n if (session.expiresAt && Date.now() >= session.expiresAt) {\n await this.removeSession(session.sessionId);\n return null;\n }\n\n // Check origin\n if (session.origin !== this.origin) {\n return null;\n }\n\n // Try to restore with adapter\n const adapter = this.adapters.get(session.walletId);\n if (adapter?.restore) {\n const ctx = this.createAdapterContext();\n const restored = await adapter.restore(ctx, {\n ...session,\n encrypted,\n });\n\n if (restored) {\n this.activeSession = restored;\n // Persist restored session (may have updated metadata)\n await this.persistSession(restored);\n \n // Track successful restore\n this.telemetry?.increment?.(METRICS.SESSIONS_RESTORED);\n this.telemetry?.increment?.(METRICS.WALLET_CONNECT_SUCCESS);\n \n // Emit session:connected event with reason=\"restore\"\n this.emit('session:connected', {\n type: 'session:connected',\n session: restored,\n });\n return restored;\n } else {\n // Restore failed - clear session\n await this.removeSession(session.sessionId);\n this.emit('session:expired', {\n type: 'session:expired',\n sessionId: session.sessionId,\n });\n return null;\n }\n }\n\n // If restore not supported, use stored session as-is\n // (Some adapters don't support restore but session metadata is still valid)\n this.activeSession = session;\n return session;\n } catch (err) {\n this.logger.warn('Failed to restore session', err);\n return null;\n }\n }\n\n /**\n * Update registry status and emit event\n */\n private updateRegistryStatus(): void {\n const status = this.registryClient.getStatus();\n if (status) {\n // Track registry metrics\n if (status.source === 'network') {\n this.telemetry?.increment?.(METRICS.REGISTRY_FETCH);\n } else if (status.source === 'cache') {\n this.telemetry?.increment?.(METRICS.REGISTRY_CACHE_HIT);\n }\n if (status.stale) {\n this.telemetry?.increment?.(METRICS.REGISTRY_STALE);\n }\n \n this.emit('registry:status', {\n type: 'registry:status',\n status: {\n source: status.source,\n verified: status.verified,\n channel: status.channel,\n sequence: status.sequence,\n stale: status.stale,\n fetchedAt: status.fetchedAt,\n etag: status.etag,\n error: status.error,\n },\n });\n }\n }\n\n /**\n * Get registry status\n */\n getRegistryStatus(): RegistryStatus | null {\n return this.registryClient.getStatus();\n }\n\n /**\n * Emit event to handlers\n */\n private emit<T extends PartyLayerEvent>(\n event: T['type'],\n payload: T\n ): void {\n // Track error metrics\n if (event === 'error' && 'error' in payload) {\n const error = payload.error as { code?: string };\n if (error.code) {\n this.telemetry?.increment?.(errorMetricName(error.code));\n }\n }\n \n const handlers = this.eventHandlers.get(event);\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(payload);\n } catch (err) {\n this.logger.error('Error in event handler', err);\n }\n }\n }\n }\n}\n\n/**\n * Create PartyLayer client\n * \n * This is the main entry point for dApps.\n * \n * @example\n * ```typescript\n * const client = createPartyLayer({\n * registryUrl: 'https://registry.partylayer.xyz',\n * channel: 'stable',\n * network: 'devnet',\n * app: { name: 'My dApp' }\n * });\n * \n * const session = await client.connect();\n * ```\n */\nexport function createPartyLayer(\n config: PartyLayerConfig\n): PartyLayerClient {\n return new PartyLayerClient(config);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@partylayer/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Main SDK for PartyLayer - Unified wallet integration for Canton Network",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -33,15 +33,15 @@
|
|
|
33
33
|
"url": "https://github.com/PartyLayer/PartyLayer/issues"
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
|
-
"@partylayer/
|
|
37
|
-
"@partylayer/
|
|
38
|
-
"@partylayer/
|
|
39
|
-
"@partylayer/adapter-
|
|
40
|
-
"@partylayer/adapter-
|
|
41
|
-
"@partylayer/
|
|
42
|
-
"@partylayer/
|
|
43
|
-
"@partylayer/adapter-
|
|
44
|
-
"@partylayer/adapter-
|
|
36
|
+
"@partylayer/core": "^0.5.0",
|
|
37
|
+
"@partylayer/registry-client": "^0.3.3",
|
|
38
|
+
"@partylayer/adapter-console": "^0.3.6",
|
|
39
|
+
"@partylayer/adapter-bron": "^0.2.12",
|
|
40
|
+
"@partylayer/adapter-nightly": "^0.2.11",
|
|
41
|
+
"@partylayer/provider": "^0.2.1",
|
|
42
|
+
"@partylayer/adapter-loop": "^0.3.9",
|
|
43
|
+
"@partylayer/adapter-cantor8": "^0.2.12",
|
|
44
|
+
"@partylayer/adapter-send": "^1.1.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
47
|
"@types/node": "^20.11.0",
|