@meshconnect/uwc-core 1.2.3-snapshot.dca47c9 → 1.2.3-snapshot.efff07b

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.
@@ -4,6 +4,12 @@ import type { EventManager } from '../managers/event-manager';
4
4
  export interface ServiceOptions {
5
5
  signal?: AbortSignal;
6
6
  }
7
+ /** Sibling-namespace live-account re-read poll: absorbs the lag while a wallet
8
+ * re-derives a sibling namespace's address (e.g. MetaMask's Solana Snap) after
9
+ * an account switch on another namespace. Bounded so a genuinely-unchanged
10
+ * sibling gives up quickly. */
11
+ export declare const SIBLING_REFRESH_MAX_ATTEMPTS = 5;
12
+ export declare const SIBLING_REFRESH_DELAY_MS = 200;
7
13
  export declare class ConnectionService {
8
14
  private networks;
9
15
  private wallets;
@@ -29,6 +35,13 @@ export declare class ConnectionService {
29
35
  * each reading the shared activeConnector, and flood telemetry).
30
36
  */
31
37
  private inFlightAbort;
38
+ /**
39
+ * Monotonic token for the in-flight cross-namespace sibling refresh (see
40
+ * `refreshSiblingNamespaces`). A newer account switch, a teardown, or a
41
+ * disconnect bumps it so a still-polling older refresh aborts before it
42
+ * writes a now-stale sibling address into the session.
43
+ */
44
+ private siblingRefreshGeneration;
32
45
  constructor(networks: Network[], wallets: WalletMetadata[], sessionManager: SessionManager, connectors: Map<ConnectionMode, Connector>, usingIntegratedBrowser: boolean, eventManager: EventManager, walletResponseTimeoutMs: number);
33
46
  connect(connectionMode: ConnectionMode, walletId: string, networkId?: NetworkId, options?: ServiceOptions): Promise<void>;
34
47
  /** Wire the active connector's lifecycle stream onto the bus (or signal absence). */
@@ -73,6 +86,23 @@ export declare class ConnectionService {
73
86
  * disconnect signal.
74
87
  */
75
88
  private attachSecondaryAccountSync;
89
+ /**
90
+ * After a real account switch on `changedNamespace`, re-read the LIVE account
91
+ * of every OTHER connected namespace and fold any that changed into the
92
+ * session in ONE update. Sibling namespaces (e.g. a MetaMask Solana Snap
93
+ * address derived from the EVM account) change with the underlying account but
94
+ * emit no `accountsChanged`, and their live read can LAG the firing namespace's
95
+ * event while the wallet re-derives — so poll each sibling up to
96
+ * `SIBLING_REFRESH_MAX_ATTEMPTS` times, `SIBLING_REFRESH_DELAY_MS` apart,
97
+ * stopping a sibling the moment its live address differs from the stored one.
98
+ *
99
+ * Loop-safe: writes addresses DIRECTLY via the session manager (never
100
+ * re-dispatches a per-namespace accountsChanged), and only emits when at least
101
+ * one sibling actually changed — so refreshing B here cannot re-enter this for
102
+ * A and recurse. Generation-guarded so a newer switch / teardown / disconnect
103
+ * supersedes an older still-polling refresh before it writes.
104
+ */
105
+ private refreshSiblingNamespaces;
76
106
  private connectWithURIPoll;
77
107
  private getConnector;
78
108
  private findWallet;
@@ -1 +1 @@
1
- {"version":3,"file":"connection-service.d.ts","sourceRoot":"","sources":["../../src/services/connection-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAET,cAAc,EACd,cAAc,EACd,SAAS,EAMV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAK7D,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,qBAAa,iBAAiB;IAoB1B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,uBAAuB;IA1BjC,OAAO,CAAC,eAAe,CAAyB;IAChD,+EAA+E;IAC/E,OAAO,CAAC,iBAAiB,CAA0B;IACnD;;;;OAIG;IACH,OAAO,CAAC,6BAA6B,CAAwB;IAC7D;;;;;;OAMG;IACH,OAAO,CAAC,aAAa,CAA+B;gBAG1C,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,cAAc,EAAE,EACzB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,EAC1C,sBAAsB,EAAE,OAAO,EAC/B,YAAY,EAAE,YAAY,EAE1B,uBAAuB,EAAE,MAAM;IAGnC,OAAO,CACX,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,SAAS,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IA4JhB,qFAAqF;IACrF,OAAO,CAAC,eAAe;IAwDvB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAkD7B;;;;;;OAMG;IACH,iBAAiB,IAAI,IAAI;IAOzB;;;;;;;OAOG;IACH,iBAAiB,IAAI,IAAI;IAmCzB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,0BAA0B;YAsDpB,kBAAkB;IAgEhC,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,2BAA2B;IAiD7B,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BzD;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,gBAAgB;IASxB,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAiBtC,UAAU,IAAI,cAAc,EAAE;IAI9B,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAI9C,WAAW,IAAI,OAAO,EAAE;IAIxB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,wBAAwB;CAiBjC"}
1
+ {"version":3,"file":"connection-service.d.ts","sourceRoot":"","sources":["../../src/services/connection-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EAET,cAAc,EACd,cAAc,EACd,SAAS,EAMV,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAK7D,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED;;;gCAGgC;AAChC,eAAO,MAAM,4BAA4B,IAAI,CAAA;AAC7C,eAAO,MAAM,wBAAwB,MAAM,CAAA;AAE3C,qBAAa,iBAAiB;IA2B1B,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,UAAU;IAClB,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,YAAY;IAEpB,OAAO,CAAC,uBAAuB;IAjCjC,OAAO,CAAC,eAAe,CAAyB;IAChD,+EAA+E;IAC/E,OAAO,CAAC,iBAAiB,CAA0B;IACnD;;;;OAIG;IACH,OAAO,CAAC,6BAA6B,CAAwB;IAC7D;;;;;;OAMG;IACH,OAAO,CAAC,aAAa,CAA+B;IACpD;;;;;OAKG;IACH,OAAO,CAAC,wBAAwB,CAAI;gBAG1B,QAAQ,EAAE,OAAO,EAAE,EACnB,OAAO,EAAE,cAAc,EAAE,EACzB,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,EAC1C,sBAAsB,EAAE,OAAO,EAC/B,YAAY,EAAE,YAAY,EAE1B,uBAAuB,EAAE,MAAM;IAGnC,OAAO,CACX,cAAc,EAAE,cAAc,EAC9B,QAAQ,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,SAAS,EACrB,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,IAAI,CAAC;IA4JhB,qFAAqF;IACrF,OAAO,CAAC,eAAe;IAwDvB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IA0D7B;;;;;;OAMG;IACH,iBAAiB,IAAI,IAAI;IAYzB;;;;;;;OAOG;IACH,iBAAiB,IAAI,IAAI;IAmCzB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,0BAA0B;IAsDlC;;;;;;;;;;;;;;;OAeG;YACW,wBAAwB;YAkGxB,kBAAkB;IAgEhC,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,2BAA2B;IAiD7B,UAAU,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BzD;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,gBAAgB;IASxB,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAiBtC,UAAU,IAAI,cAAc,EAAE;IAI9B,aAAa,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI;IAI9C,WAAW,IAAI,OAAO,EAAE;IAIxB;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,wBAAwB;CAiBjC"}
@@ -2,6 +2,12 @@ import { NoCommonNetworkError } from '@meshconnect/uwc-types';
2
2
  import { raceAbort } from '../utils/abort';
3
3
  import { instrumentHandoff } from '../observability/instrument-handoff';
4
4
  import { attachLifecycle } from '../observability/lifecycle-bridge';
5
+ /** Sibling-namespace live-account re-read poll: absorbs the lag while a wallet
6
+ * re-derives a sibling namespace's address (e.g. MetaMask's Solana Snap) after
7
+ * an account switch on another namespace. Bounded so a genuinely-unchanged
8
+ * sibling gives up quickly. */
9
+ export const SIBLING_REFRESH_MAX_ATTEMPTS = 5;
10
+ export const SIBLING_REFRESH_DELAY_MS = 200;
5
11
  export class ConnectionService {
6
12
  networks;
7
13
  wallets;
@@ -27,6 +33,13 @@ export class ConnectionService {
27
33
  * each reading the shared activeConnector, and flood telemetry).
28
34
  */
29
35
  inFlightAbort = null;
36
+ /**
37
+ * Monotonic token for the in-flight cross-namespace sibling refresh (see
38
+ * `refreshSiblingNamespaces`). A newer account switch, a teardown, or a
39
+ * disconnect bumps it so a still-polling older refresh aborts before it
40
+ * writes a now-stale sibling address into the session.
41
+ */
42
+ siblingRefreshGeneration = 0;
30
43
  constructor(networks, wallets, sessionManager, connectors, usingIntegratedBrowser, eventManager,
31
44
  // Observational wallet-response deadline for the handoff timeout marker.
32
45
  walletResponseTimeoutMs) {
@@ -253,6 +266,13 @@ export class ConnectionService {
253
266
  this.eventManager.emit('sessionChanged', {
254
267
  session: this.sessionManager.getSession()
255
268
  });
269
+ // A single wallet account drives ALL its namespaces (e.g. MetaMask's Solana
270
+ // Snap derives its key from the selected EVM account). The wallet only fired
271
+ // an accountsChanged for THIS namespace; refresh the live account of every
272
+ // other connected namespace so the session doesn't serve a stale sibling
273
+ // address. Fire-and-forget: we're inside the wallet's synchronous event
274
+ // dispatch and must not await.
275
+ void this.refreshSiblingNamespaces(namespace);
256
276
  }
257
277
  /**
258
278
  * Remove the active provider-lifecycle subscription (EIP-1193 `.on` / wallet-
@@ -267,6 +287,11 @@ export class ConnectionService {
267
287
  for (const teardown of this.secondaryAccountSyncTeardowns)
268
288
  teardown();
269
289
  this.secondaryAccountSyncTeardowns = [];
290
+ // Supersede any in-flight sibling-namespace refresh (see
291
+ // `refreshSiblingNamespaces`) — a still-polling refresh must not write a
292
+ // now-stale address after teardown/disconnect. `finishDisconnect()` calls
293
+ // this too, so one bump here covers both paths.
294
+ this.siblingRefreshGeneration++;
270
295
  }
271
296
  /**
272
297
  * Re-evaluate the lifecycle source for the CURRENT session. Used after a
@@ -356,6 +381,101 @@ export class ConnectionService {
356
381
  }));
357
382
  }
358
383
  }
384
+ /**
385
+ * After a real account switch on `changedNamespace`, re-read the LIVE account
386
+ * of every OTHER connected namespace and fold any that changed into the
387
+ * session in ONE update. Sibling namespaces (e.g. a MetaMask Solana Snap
388
+ * address derived from the EVM account) change with the underlying account but
389
+ * emit no `accountsChanged`, and their live read can LAG the firing namespace's
390
+ * event while the wallet re-derives — so poll each sibling up to
391
+ * `SIBLING_REFRESH_MAX_ATTEMPTS` times, `SIBLING_REFRESH_DELAY_MS` apart,
392
+ * stopping a sibling the moment its live address differs from the stored one.
393
+ *
394
+ * Loop-safe: writes addresses DIRECTLY via the session manager (never
395
+ * re-dispatches a per-namespace accountsChanged), and only emits when at least
396
+ * one sibling actually changed — so refreshing B here cannot re-enter this for
397
+ * A and recurse. Generation-guarded so a newer switch / teardown / disconnect
398
+ * supersedes an older still-polling refresh before it writes.
399
+ */
400
+ async refreshSiblingNamespaces(changedNamespace) {
401
+ const connector = this.activeConnector;
402
+ if (!connector?.getLiveAccount)
403
+ return;
404
+ const gen = ++this.siblingRefreshGeneration;
405
+ const namespaceForNetworkId = (networkId) => this.networks.find(n => n.id === networkId)?.namespace;
406
+ // Sibling = every connected namespace except the one that just fired.
407
+ const initial = this.sessionManager.getSession();
408
+ const siblings = new Set();
409
+ for (const addr of initial.availableAddresses) {
410
+ const ns = namespaceForNetworkId(addr.networkId);
411
+ if (ns && ns !== changedNamespace)
412
+ siblings.add(ns);
413
+ }
414
+ if (siblings.size === 0)
415
+ return;
416
+ const equal = (ns, a, b) => ns === 'eip155' ? a.toLowerCase() === b.toLowerCase() : a === b;
417
+ const storedFor = (ns) => {
418
+ const s = this.sessionManager.getSession();
419
+ for (const addr of s.availableAddresses) {
420
+ if (namespaceForNetworkId(addr.networkId) === ns)
421
+ return addr.address;
422
+ }
423
+ return undefined;
424
+ };
425
+ const resolved = new Map();
426
+ const pending = new Set(siblings);
427
+ for (let attempt = 0; attempt < SIBLING_REFRESH_MAX_ATTEMPTS && pending.size > 0; attempt++) {
428
+ // Superseded (newer switch), disconnected, or connector swapped → abandon.
429
+ if (gen !== this.siblingRefreshGeneration ||
430
+ this.activeConnector !== connector)
431
+ return;
432
+ for (const ns of [...pending]) {
433
+ let live = null;
434
+ try {
435
+ live = await connector.getLiveAccount(ns);
436
+ }
437
+ catch {
438
+ live = null;
439
+ }
440
+ if (gen !== this.siblingRefreshGeneration ||
441
+ this.activeConnector !== connector)
442
+ return;
443
+ if (!live)
444
+ continue;
445
+ const stored = storedFor(ns);
446
+ if (stored != null && !equal(ns, stored, live)) {
447
+ resolved.set(ns, live);
448
+ pending.delete(ns);
449
+ }
450
+ // stored == live (not yet re-derived) → keep polling until the cap.
451
+ }
452
+ if (pending.size === 0)
453
+ break;
454
+ await new Promise(r => setTimeout(r, SIBLING_REFRESH_DELAY_MS));
455
+ }
456
+ if (resolved.size === 0)
457
+ return;
458
+ if (gen !== this.siblingRefreshGeneration ||
459
+ this.activeConnector !== connector)
460
+ return;
461
+ const session = this.sessionManager.getSession();
462
+ const availableAddresses = session.availableAddresses.map(addr => {
463
+ const ns = namespaceForNetworkId(addr.networkId);
464
+ const next = ns ? resolved.get(ns) : undefined;
465
+ return next ? { ...addr, address: next } : addr;
466
+ });
467
+ // If the ACTIVE network's namespace was among the refreshed siblings, move
468
+ // activeAddress too (e.g. a Solana-active session whose Solana address just
469
+ // followed an EVM switch).
470
+ const activeNs = session.activeNetwork?.namespace;
471
+ const activeAddress = activeNs && resolved.has(activeNs)
472
+ ? resolved.get(activeNs)
473
+ : session.activeAddress;
474
+ this.sessionManager.updateSession({ activeAddress, availableAddresses });
475
+ this.eventManager.emit('sessionChanged', {
476
+ session: this.sessionManager.getSession()
477
+ });
478
+ }
359
479
  async connectWithURIPoll(connector, network, provider, connectionMode, signal) {
360
480
  const connectPromise = connector.connect(network, provider);
361
481
  let pollingStopped = false;
@@ -1 +1 @@
1
- {"version":3,"file":"connection-service.js","sourceRoot":"","sources":["../../src/services/connection-service.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAG7D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AAMnE,MAAM,OAAO,iBAAiB;IAoBlB;IACA;IACA;IACA;IACA;IACA;IAEA;IA1BF,eAAe,GAAqB,IAAI,CAAA;IAChD,+EAA+E;IACvE,iBAAiB,CAA0B;IACnD;;;;OAIG;IACK,6BAA6B,GAAsB,EAAE,CAAA;IAC7D;;;;;;OAMG;IACK,aAAa,GAA2B,IAAI,CAAA;IAEpD,YACU,QAAmB,EACnB,OAAyB,EACzB,cAA8B,EAC9B,UAA0C,EAC1C,sBAA+B,EAC/B,YAA0B;IAClC,yEAAyE;IACjE,uBAA+B;QAP/B,aAAQ,GAAR,QAAQ,CAAW;QACnB,YAAO,GAAP,OAAO,CAAkB;QACzB,mBAAc,GAAd,cAAc,CAAgB;QAC9B,eAAU,GAAV,UAAU,CAAgC;QAC1C,2BAAsB,GAAtB,sBAAsB,CAAS;QAC/B,iBAAY,GAAZ,YAAY,CAAc;QAE1B,4BAAuB,GAAvB,uBAAuB,CAAQ;IACtC,CAAC;IAEJ,KAAK,CAAC,OAAO,CACX,cAA8B,EAC9B,QAAgB,EAChB,SAAqB,EACrB,OAAwB;QAExB,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QAEjC,4EAA4E;QAC5E,2EAA2E;QAC3E,6EAA6E;QAC7E,8CAA8C;QAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAA;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,2BAA2B,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QACrE,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,CAAA;QAEnD,sEAAsE;QACtE,4EAA4E;QAC5E,sEAAsE;QACtE,2EAA2E;QAC3E,sDAAsD;QACtD,IAAI,CAAC,aAAa,EAAE,KAAK,CACvB,IAAI,YAAY,CAAC,0CAA0C,EAAE,YAAY,CAAC,CAC3E,CAAA;QACD,MAAM,YAAY,GAAG,IAAI,eAAe,EAAE,CAAA;QAC1C,IAAI,CAAC,aAAa,GAAG,YAAY,CAAA;QACjC,MAAM,YAAY,GAAG,OAAO,EAAE,MAAM,CAAA;QACpC,IAAI,yBAAmD,CAAA;QACvD,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBACzB,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACzC,CAAC;iBAAM,CAAC;gBACN,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;gBACnE,YAAY,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;gBACrE,yBAAyB,GAAG,GAAG,EAAE,CAC/B,YAAY,CAAC,mBAAmB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAA;YAC5D,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAA;QAElC,0EAA0E;QAC1E,2EAA2E;QAC3E,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAA;QAElE,wDAAwD;QACxD,uEAAuE;QACvE,IAAI,CAAC,eAAe,GAAG,SAAS,CAAA;QAEhC,IAAI,MAAM,CAAA;QACV,IAAI,CAAC;YACH,4EAA4E;YAC5E,0EAA0E;YAC1E,0EAA0E;YAC1E,8DAA8D;YAC9D,MAAM,GAAG,MAAM,iBAAiB,CAC9B;gBACE,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,SAAS,EAAE,IAAI,CAAC,uBAAuB;gBACvC,MAAM;aACP,EACD;gBACE,SAAS,EAAE,SAAS;gBACpB,cAAc;gBACd,QAAQ;gBACR,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,OAAO,EAAE,OAAO,CAAC,EAAE;aACpB,EACD,KAAK,IAAI,EAAE;gBACT,wEAAwE;gBACxE,oEAAoE;gBACpE,oEAAoE;gBACpE,yEAAyE;gBACzE,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;oBAClC,OAAO,MAAM,SAAS,CACpB,SAAS,CAAC,OAAO,CACf,OAAO,EACP,QAEqC,CACtC,EACD,MAAM,CACP,CAAA;gBACH,CAAC;qBAAM,IACL,cAAc,KAAK,YAAY;oBAC/B,cAAc,KAAK,eAAe,EAClC,CAAC;oBACD,OAAO,MAAM,SAAS,CACpB,IAAI,CAAC,kBAAkB,CACrB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,cAAc,EACd,MAAM,CACP,EACD,MAAM,CACP,CAAA;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAA;gBACnE,CAAC;YACH,CAAC,CACF,CAAA;YACD,uEAAuE;YACvE,wEAAwE;YACxE,qEAAqE;YACrE,sEAAsE;YACtE,MAAM,CAAC,cAAc,EAAE,CAAA;QACzB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yEAAyE;YACzE,wDAAwD;YACxD,2EAA2E;YAC3E,0EAA0E;YAC1E,2EAA2E;YAC3E,uEAAuE;YACvE,4EAA4E;YAC5E,IAAI,IAAI,CAAC,aAAa,KAAK,YAAY,EAAE,CAAC;gBACxC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;gBAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;YAC3B,CAAC;YACD,yBAAyB,EAAE,EAAE,CAAA;YAC7B,MAAM,KAAK,CAAA;QACb,CAAC;QAED,wEAAwE;QACxE,0EAA0E;QAC1E,8EAA8E;QAC9E,IAAI,IAAI,CAAC,aAAa,KAAK,YAAY;YAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAA;QAClE,yBAAyB,EAAE,EAAE,CAAA;QAE7B,2EAA2E;QAC3E,MAAM,0BAA0B,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CACzE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CACjD,CAAA;QAED,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC;YAChC,cAAc;YACd,YAAY,EAAE,MAAM;YACpB,aAAa,EAAE,OAAO;YACtB,aAAa,EAAE,MAAM,CAAC,OAAO;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,IAAI;YACnC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC1C,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAC5C;YACD,kBAAkB,EAAE,0BAA0B;SAC/C,CAAC,CAAA;QAEF,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QAErD,6EAA6E;QAC7E,6EAA6E;QAC7E,iDAAiD;QACjD,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;QAClE,IAAI,CAAC,0BAA0B,CAC7B,cAAc,EACd,MAAM,CAAC,EAAE,EACT,OAAO,CAAC,SAAS,CAClB,CAAA;IACH,CAAC;IAED,qFAAqF;IAC7E,eAAe,CACrB,cAA8B,EAC9B,QAAgB,EAChB,SAAoB,EACpB,aAAoE;QAEpE,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAA;QACtC,IAAI,CAAC,iBAAiB,GAAG,eAAe,CAAC;YACvC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,uEAAuE;YACvE,4DAA4D;YAC5D,GAAG,CAAC,aAAa,IAAI,EAAE,aAAa,EAAE,CAAC;YACvC,0EAA0E;YAC1E,qEAAqE;YACrE,0DAA0D;YAC1D,SAAS,EAAE,SAAS,EAAE,gBAAgB;gBACpC,CAAC,CAAC,QAAQ,CAAC,EAAE,CACT,SAAS,CAAC,gBAAiB,CAAC,QAAQ,EAAE;oBACpC,cAAc;oBACd,SAAS;oBACT,QAAQ;iBACT,CAAC;gBACN,CAAC,CAAC,SAAS;YACb,iBAAiB,EAAE,SAAS,EAAE,iBAAiB;gBAC7C,CAAC,CAAC,QAAQ,CAAC,EAAE,CACT,SAAS,CAAC,iBAAkB,CAAC,QAAQ,EAAE;oBACrC,cAAc;oBACd,SAAS;oBACT,QAAQ;iBACT,CAAC;gBACN,CAAC,CAAC,SAAS;YACb,iBAAiB,EAAE,QAAQ,CAAC,EAAE,CAC5B,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC;YACjD,UAAU,EAAE,GAAG,EAAE;gBACf,MAAM,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;gBAC1C,OAAO;oBACL,cAAc,EAAE,CAAC,CAAC,cAAc,IAAI,cAAc;oBAClD,QAAQ,EAAE,CAAC,CAAC,YAAY,EAAE,EAAE,IAAI,QAAQ;oBACxC,SAAS,EAAE,CAAC,CAAC,aAAa,EAAE,SAAS,IAAI,SAAS;iBACnD,CAAA;YACH,CAAC;YACD,cAAc;YACd,QAAQ;YACR,SAAS;YACT,4EAA4E;YAC5E,6EAA6E;YAC7E,wEAAwE;YACxE,OAAO,EACJ,UAAsD;iBACpD,yBAAyB,KAAK,IAAI;gBACnC,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,QAAQ;SACf,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;OAMG;IACK,qBAAqB,CAC3B,QAAkB,EAClB,SAAoB;QAEpB,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,6DAA6D;YAC7D,sEAAsE;YACtE,gEAAgE;YAChE,mEAAmE;YACnE,sEAAsE;YACtE,uEAAuE;YACvE,gEAAgE;YAChE,oEAAoE;YACpE,kEAAkE;YAClE,sEAAsE;YACtE,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI;gBAAE,OAAM;YACzC,oEAAoE;YACpE,gEAAgE;YAChE,mEAAmE;YACnE,qEAAqE;YACrE,4DAA4D;YAC5D,mEAAmE;YACnE,sEAAsE;YACtE,gEAAgE;YAChE,gEAAgE;YAChE,qEAAqE;YACrE,sEAAsE;YACtE,+CAA+C;YAC/C,IAAI,CAAC,eAAe,EAAE,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;YACpD,IAAI,CAAC,gBAAgB,EAAE,CAAA;YACvB,OAAM;QACR,CAAC;QACD,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAA;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAChD,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAAC,CAAA;YAChE,OAAO,OAAO,EAAE,SAAS,KAAK,SAAS;gBACrC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE;gBAClC,CAAC,CAAC,IAAI,CAAA;QACV,CAAC,CAAC,CAAA;QACF,MAAM,aAAa,GACjB,OAAO,CAAC,aAAa,EAAE,SAAS,KAAK,SAAS;YAC5C,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,OAAO,CAAC,aAAa,CAAA;QAC3B,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,kBAAkB,EAAE,CAAC,CAAA;QACxE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE;YACvC,OAAO,EAAE,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE;SAC1C,CAAC,CAAA;IACJ,CAAC;IAED;;;;;;OAMG;IACH,iBAAiB;QACf,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAA;QAC1B,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAA;QAClC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,6BAA6B;YAAE,QAAQ,EAAE,CAAA;QACrE,IAAI,CAAC,6BAA6B,GAAG,EAAE,CAAA;IACzC,CAAC;IAED;;;;;;;OAOG;IACH,iBAAiB;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAChD,IACE,CAAC,IAAI,CAAC,eAAe;YACrB,CAAC,OAAO,CAAC,cAAc;YACvB,CAAC,OAAO,CAAC,YAAY;YACrB,CAAC,OAAO,CAAC,aAAa,EACtB,CAAC;YACD,OAAM;QACR,CAAC;QACD,IAAI,CAAC,eAAe,CAClB,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,YAAY,CAAC,EAAE,EACvB,OAAO,CAAC,aAAa,CAAC,SAAS;QAC/B,uEAAuE;QACvE,sEAAsE;QACtE,uEAAuE;QACvE,uBAAuB;QACvB;YACE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,EAAE;YACjC,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;YAChE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE;SACf,CACF,CAAA;QACD,mEAAmE;QACnE,mEAAmE;QACnE,+DAA+D;QAC/D,sBAAsB;QACtB,IAAI,CAAC,0BAA0B,CAC7B,OAAO,CAAC,cAAc,EACtB,OAAO,CAAC,YAAY,CAAC,EAAE,EACvB,OAAO,CAAC,aAAa,CAAC,SAAS,CAChC,CAAA;IACH,CAAC;IAED;;;;;;;;;;;;;OAaG;IACK,0BAA0B,CAChC,cAA8B,EAC9B,QAAgB,EAChB,eAA0B;QAE1B,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAA;QACtC,IAAI,CAAC,SAAS,EAAE,iBAAiB;YAAE,OAAM;QAEzC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAChD,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAa,CAAA;QAChD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;YAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAClC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,SAAS,CAC7B,EAAE,SAAS,CAAA;YACZ,IAAI,SAAS,IAAI,SAAS,KAAK,eAAe,EAAE,CAAC;gBAC/C,mBAAmB,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GACV,UAAsD;aACpD,yBAAyB,KAAK,IAAI;YACnC,CAAC,CAAE,QAAkB;YACrB,CAAC,CAAE,QAAkB,CAAA;QAEzB,KAAK,MAAM,SAAS,IAAI,mBAAmB,EAAE,CAAC;YAC5C,IAAI,CAAC,6BAA6B,CAAC,IAAI,CACrC,eAAe,CAAC;gBACd,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,SAAS,EAAE,SAAS;gBACpB,iBAAiB,EAAE,QAAQ,CAAC,EAAE,CAC5B,SAAS,CAAC,iBAAkB,CAAC,QAAQ,EAAE;oBACrC,cAAc;oBACd,SAAS;oBACT,QAAQ;iBACT,CAAC;gBACJ,iBAAiB,EAAE,QAAQ,CAAC,EAAE;oBAC5B,kEAAkE;oBAClE,6DAA6D;oBAC7D,0DAA0D;oBAC1D,wDAAwD;oBACxD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;wBAAE,OAAM;oBACjC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;gBACjD,CAAC;gBACD,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;gBAC3D,cAAc;gBACd,QAAQ;gBACR,SAAS;gBACT,OAAO;aACR,CAAC,CACH,CAAA;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,SAAoB,EACpB,OAAgB,EAChB,QAA2B,EAC3B,cAA8B,EAC9B,MAAoB;QAEpB,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;QAE3D,IAAI,cAAc,GAAG,KAAK,CAAA;QAC1B,IAAI,UAA8B,CAAA;QAElC,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;YAClC,mEAAmE;YACnE,uEAAuE;YACvE,qEAAqE;YACrE,mEAAmE;YACnE,wEAAwE;YACxE,cAAc;YACd,IAAI,GAAuB,CAAA;YAC3B,IAAI,CAAC;gBACH,GAAG,GAAG,SAAS,CAAC,gBAAgB,EAAE,EAAE,CAAA;YACtC,CAAC;YAAC,MAAM,CAAC;gBACP,GAAG,GAAG,SAAS,CAAA;YACjB,CAAC;YACD,IAAI,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE,CAAC;gBAC9B,UAAU,GAAG,GAAG,CAAA;gBAChB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,CAAA;YAClE,CAAC;QACH,CAAC,EAAE,GAAG,CAAC,CAAA;QAEP,mFAAmF;QACnF,MAAM,iBAAiB,GAAG,UAAU,CAClC,GAAG,EAAE;YACH,WAAW,EAAE,CAAA;QACf,CAAC,EACD,CAAC,GAAG,EAAE,GAAG,IAAI,CACd,CAAA;QAED,SAAS,WAAW;YAClB,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAM;YACR,CAAC;YAED,cAAc,GAAG,IAAI,CAAA;YACrB,aAAa,CAAC,UAAU,CAAC,CAAA;YACzB,YAAY,CAAC,iBAAiB,CAAC,CAAA;YAC/B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;QACnD,CAAC;QAED,4EAA4E;QAC5E,0EAA0E;QAC1E,uEAAuE;QACvE,2EAA2E;QAC3E,kBAAkB;QAClB,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QAE9D,IAAI,CAAC;YACH,OAAO,MAAM,cAAc,CAAA;QAC7B,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,cAA8B;QACjD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;QACrD,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,2CAA2C,cAAc,EAAE,CAC5D,CAAA;QACH,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,UAAU,CAAC,QAAgB;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAA;QACxD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,aAAa,CAAC,CAAA;QAC3D,CAAC;QACD,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,kBAAkB,CACxB,MAAsB,EACtB,cAA8B;QAE9B,IAAI,QAAuC,CAAA;QAE3C,IAAI,cAAc,KAAK,UAAU,EAAE,CAAC;YAClC,QAAQ,GAAG,IAAI,CAAC,sBAAsB;gBACpC,CAAC,CAAC,MAAM,CAAC,iCAAiC;gBAC1C,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAA;YAEpC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,IAAI,CAAC,sBAAsB;oBACzB,CAAC,CAAC,WAAW,MAAM,CAAC,EAAE,yDAAyD;oBAC/E,CAAC,CAAC,WAAW,MAAM,CAAC,EAAE,gDAAgD,CACzE,CAAA;YACH,CAAC;QACH,CAAC;aAAM,IAAI,cAAc,KAAK,YAAY,EAAE,CAAC;YAC3C,QAAQ,GAAG,MAAM,CAAC,kBAAkB,CAAA;YAEpC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,WAAW,MAAM,CAAC,EAAE,wCAAwC,CAC7D,CAAA;YACH,CAAC;YAED,QAAQ,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;QAC5D,CAAC;aAAM,IAAI,cAAc,KAAK,eAAe,EAAE,CAAC;YAC9C,QAAQ,GAAG,MAAM,CAAC,qBAAqB,CAAA;YAEvC,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,KAAK,CACb,WAAW,MAAM,CAAC,EAAE,0CAA0C,CAC/D,CAAA;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,gCAAgC,cAAc,EAAE,CAAC,CAAA;QACnE,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;IAEO,2BAA2B,CACjC,SAAgC,EAChC,QAA2B;QAE3B,IAAI,eAA0B,CAAA;QAE9B,IAAI,SAAS,EAAE,CAAC;YACd,mDAAmD;YACnD,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAA;YACjE,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CACb,WAAW,SAAS,oCAAoC,CACzD,CAAA;YACH,CAAC;YAED,gDAAgD;YAChD,MAAM,iBAAiB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YAC1E,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,WAAW,SAAS,iCAAiC,CAAC,CAAA;YACxE,CAAC;YAED,eAAe,GAAG,SAAS,CAAA;QAC7B,CAAC;aAAM,CAAC;YACN,qFAAqF;YACrF,MAAM,gBAAgB,GAAG,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAC9D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CACrC,CAAA;YACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtB,uEAAuE;gBACvE,wEAAwE;gBACxE,wEAAwE;gBACxE,MAAM,IAAI,oBAAoB,CAC5B,QAAQ,CAAC,mBAAmB,EAC5B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAC7B,CAAA;YACH,CAAC;YACD,eAAe,GAAG,gBAAgB,CAAA;QACpC,CAAC;QAED,qCAAqC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAA;QACjE,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CACb,WAAW,eAAe,mCAAmC,CAC9D,CAAA;QACH,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAwB;QACvC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,6EAA6E;QAC7E,8EAA8E;QAC9E,iFAAiF;QACjF,6EAA6E;QAC7E,0EAA0E;QAC1E,6EAA6E;QAC7E,IAAI,CAAC,aAAa,EAAE,KAAK,CACvB,IAAI,YAAY,CAAC,oCAAoC,EAAE,YAAY,CAAC,CACrE,CAAA;QACD,+EAA+E;QAC/E,wEAAwE;QACxE,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,IAAI,CAAC;YACH,IACE,IAAI,CAAC,eAAe;gBACpB,OAAO,IAAI,CAAC,eAAe,CAAC,UAAU,KAAK,UAAU,EACrD,CAAC;gBACD,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE,CAAA;YACzC,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACzB,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,gBAAgB;QACtB,IAAI,CAAC,iBAAiB,EAAE,CAAA;QACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC3B,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,CAAA;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,CAAA;QAChD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAA;QACjD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,gBAAgB;QACd,IACE,IAAI,CAAC,eAAe;YACpB,OAAO,IAAI,CAAC,eAAe,CAAC,gBAAgB,KAAK,UAAU,EAC3D,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAI,CAAC,eAAe,CAAC,gBAAgB,EAAE,CAAA;gBACnD,OAAO,GAAG,CAAA;YACZ,CAAC;YAAC,MAAM,CAAC;gBACP,oDAAoD;gBACpD,OAAO,SAAS,CAAA;YAClB,CAAC;QACH,CAAC;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,aAAa,CAAC,OAAyB;QACrC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;IACxB,CAAC;IAED,WAAW;QACT,OAAO,IAAI,CAAC,QAAQ,CAAA;IACtB,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,wBAAwB,CAC9B,MAAsB,EACtB,QAAkC;QAElC,IAAI,QAAQ,CAAC,iBAAiB;YAAE,OAAO,QAAQ,CAAA;QAE/C,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB;YAClD,CAAC,CAAC,MAAM,CAAC,iCAAiC;YAC1C,CAAC,CAAC,MAAM,CAAC,yBAAyB,CAAA;QACpC,MAAM,WAAW,GAAG,gBAAgB,EAAE,iBAAiB,EAAE,GAAG,EAAE,WAAW,CAAA;QAEzE,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,EAAE,GAAG,QAAQ,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAA;QACxD,CAAC;QAED,OAAO,QAAQ,CAAA;IACjB,CAAC;CACF"}
1
+ {"version":3,"file":"connection-service.js","sourceRoot":"","sources":["../../src/services/connection-service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meshconnect/uwc-core",
3
- "version": "1.2.3-snapshot.dca47c9",
3
+ "version": "1.2.3-snapshot.efff07b",
4
4
  "description": "Core functionality for Universal Wallet Connector",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -16,10 +16,10 @@
16
16
  "src"
17
17
  ],
18
18
  "dependencies": {
19
- "@meshconnect/uwc-ton-connector": "0.7.2-snapshot.dca47c9",
20
- "@meshconnect/uwc-wallet-connect-connector": "0.8.2-snapshot.dca47c9",
21
- "@meshconnect/uwc-types": "0.19.0-snapshot.dca47c9",
22
- "@meshconnect/uwc-injected-connector": "0.16.4-snapshot.dca47c9"
19
+ "@meshconnect/uwc-injected-connector": "0.16.4-snapshot.efff07b",
20
+ "@meshconnect/uwc-ton-connector": "0.7.2-snapshot.efff07b",
21
+ "@meshconnect/uwc-types": "0.19.0-snapshot.efff07b",
22
+ "@meshconnect/uwc-wallet-connect-connector": "0.8.2-snapshot.efff07b"
23
23
  },
24
24
  "devDependencies": {
25
25
  "typescript": "^5.9.3"
@@ -1,5 +1,9 @@
1
1
  import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'
2
- import { ConnectionService } from './connection-service'
2
+ import {
3
+ ConnectionService,
4
+ SIBLING_REFRESH_MAX_ATTEMPTS,
5
+ SIBLING_REFRESH_DELAY_MS
6
+ } from './connection-service'
3
7
  import { SessionManager } from '../managers/session-manager'
4
8
  import { EventManager } from '../managers/event-manager'
5
9
  import type {
@@ -1136,4 +1140,477 @@ describe('ConnectionService', () => {
1136
1140
  ).toBe('0xAFTER')
1137
1141
  })
1138
1142
  })
1143
+
1144
+ describe('cross-namespace account refresh on switch', () => {
1145
+ // Multi-namespace injected wallets (MetaMask/Trust/Phantom) derive every
1146
+ // namespace's address from ONE underlying account. The wallet fires
1147
+ // accountsChanged for a SINGLE namespace on a switch; the sibling
1148
+ // namespaces' addresses change too but emit no event of their own, so
1149
+ // `refreshSiblingNamespaces` re-reads each connected sibling's LIVE
1150
+ // account and folds any real change into the session. Session is seeded
1151
+ // SOLANA-active (the real-bug shape: an eip155 switch must still move the
1152
+ // active solana address).
1153
+ let accountSubs: Map<string, (accounts: string[]) => void>
1154
+
1155
+ beforeEach(() => {
1156
+ networks.push({
1157
+ id: 'solana:mainnet',
1158
+ internalId: 101,
1159
+ namespace: 'solana',
1160
+ name: 'Solana',
1161
+ logoUrl: '',
1162
+ nativeCurrency: { name: 'SOL', symbol: 'SOL', decimals: 9 },
1163
+ networkType: 'solana'
1164
+ } as never)
1165
+ wallets[0]!.extensionInjectedProvider = {
1166
+ supportedNetworkIds: ['solana:mainnet', 'eip155:1']
1167
+ } as never
1168
+ mockConnector.connect = vi.fn().mockResolvedValue({
1169
+ networkId: 'solana:mainnet',
1170
+ address: 'SoLAddr111',
1171
+ availableAddresses: [
1172
+ { address: 'SoLAddr111', networkId: 'solana:mainnet' },
1173
+ { address: '0x1234', networkId: 'eip155:1' }
1174
+ ]
1175
+ })
1176
+ accountSubs = new Map()
1177
+ mockConnector.onAccountsChanged = ((
1178
+ listener: (accounts: string[]) => void,
1179
+ context: { namespace: string }
1180
+ ) => {
1181
+ accountSubs.set(context.namespace, listener)
1182
+ return () => {}
1183
+ }) as never
1184
+ })
1185
+
1186
+ it('a Solana-active session follows an eip155 switch: the solana sibling is refreshed and activeAddress moves with it', async () => {
1187
+ const liveAccount = vi.fn(async (ns: string) =>
1188
+ ns === 'solana' ? 'SoLAddr_NEW' : null
1189
+ )
1190
+ ;(mockConnector as any).getLiveAccount = liveAccount
1191
+
1192
+ const sessions: unknown[] = []
1193
+ eventManager.on('sessionChanged', d => sessions.push(d))
1194
+
1195
+ await connectionService.connect('injected', 'metamask', 'solana:mainnet')
1196
+ sessions.length = 0 // drop the connect's own sessionChanged
1197
+
1198
+ accountSubs.get('eip155')!(['0xSWITCHED'])
1199
+
1200
+ await vi.waitFor(() => {
1201
+ expect(
1202
+ sessionManager
1203
+ .getSession()
1204
+ .availableAddresses.find(a => a.networkId === 'solana:mainnet')
1205
+ ?.address
1206
+ ).toBe('SoLAddr_NEW')
1207
+ })
1208
+
1209
+ const session = sessionManager.getSession()
1210
+ expect(session.activeAddress).toBe('SoLAddr_NEW')
1211
+ expect(session.availableAddresses).toEqual([
1212
+ { address: 'SoLAddr_NEW', networkId: 'solana:mainnet' },
1213
+ { address: '0xSWITCHED', networkId: 'eip155:1' }
1214
+ ])
1215
+ expect(sessions.length).toBeGreaterThan(0)
1216
+ })
1217
+
1218
+ it('polls a lagging sibling until its live address differs from the stored one', async () => {
1219
+ vi.useFakeTimers()
1220
+ try {
1221
+ let call = 0
1222
+ const liveAccount = vi.fn(async (ns: string) => {
1223
+ if (ns !== 'solana') return null
1224
+ call++
1225
+ // First read still reflects the OLD (stored) address — the wallet
1226
+ // hasn't finished re-deriving the sibling yet.
1227
+ return call === 1 ? 'SoLAddr111' : 'SoLAddr_NEW'
1228
+ })
1229
+ ;(mockConnector as any).getLiveAccount = liveAccount
1230
+
1231
+ await connectionService.connect(
1232
+ 'injected',
1233
+ 'metamask',
1234
+ 'solana:mainnet'
1235
+ )
1236
+
1237
+ accountSubs.get('eip155')!(['0xSWITCHED'])
1238
+
1239
+ await vi.advanceTimersByTimeAsync(SIBLING_REFRESH_DELAY_MS)
1240
+
1241
+ const session = sessionManager.getSession()
1242
+ expect(
1243
+ session.availableAddresses.find(a => a.networkId === 'solana:mainnet')
1244
+ ?.address
1245
+ ).toBe('SoLAddr_NEW')
1246
+ expect(session.activeAddress).toBe('SoLAddr_NEW')
1247
+ } finally {
1248
+ vi.useRealTimers()
1249
+ }
1250
+ })
1251
+
1252
+ it('gives up after the poll cap when the sibling never changes, without an extra update or emit', async () => {
1253
+ vi.useFakeTimers()
1254
+ try {
1255
+ const liveAccount = vi.fn(async (ns: string) =>
1256
+ ns === 'solana' ? 'SoLAddr111' : null
1257
+ )
1258
+ ;(mockConnector as any).getLiveAccount = liveAccount
1259
+
1260
+ const sessions: unknown[] = []
1261
+ eventManager.on('sessionChanged', d => sessions.push(d))
1262
+
1263
+ await connectionService.connect(
1264
+ 'injected',
1265
+ 'metamask',
1266
+ 'solana:mainnet'
1267
+ )
1268
+ sessions.length = 0 // drop the connect's own sessionChanged
1269
+
1270
+ accountSubs.get('eip155')!(['0xSWITCHED'])
1271
+ // The eip155 switch's own sessionChanged fires synchronously above.
1272
+ expect(sessions.length).toBe(1)
1273
+
1274
+ await vi.advanceTimersByTimeAsync(
1275
+ SIBLING_REFRESH_MAX_ATTEMPTS * SIBLING_REFRESH_DELAY_MS
1276
+ )
1277
+
1278
+ const session = sessionManager.getSession()
1279
+ expect(
1280
+ session.availableAddresses.find(a => a.networkId === 'solana:mainnet')
1281
+ ?.address
1282
+ ).toBe('SoLAddr111')
1283
+ expect(session.activeAddress).toBe('SoLAddr111')
1284
+ // No additional sessionChanged beyond the firing namespace's own one.
1285
+ expect(sessions.length).toBe(1)
1286
+ } finally {
1287
+ vi.useRealTimers()
1288
+ }
1289
+ })
1290
+
1291
+ it('an empty accounts list (disconnect) does not trigger a sibling refresh', async () => {
1292
+ const liveAccount = vi.fn(async () => 'SoLAddr_NEW')
1293
+ ;(mockConnector as any).getLiveAccount = liveAccount
1294
+ mockConnector.disconnect = vi.fn().mockResolvedValue(undefined)
1295
+
1296
+ await connectionService.connect('injected', 'metamask', 'solana:mainnet')
1297
+
1298
+ accountSubs.get('solana')!([]) // active namespace's own disconnect signal
1299
+
1300
+ expect(liveAccount).not.toHaveBeenCalled()
1301
+ const session = sessionManager.getSession()
1302
+ expect(session.activeAddress).toBeNull()
1303
+ expect(session.connectionMode).toBeNull()
1304
+ })
1305
+
1306
+ it('cancels an in-flight poll when a newer switch supersedes it — the later switch wins', async () => {
1307
+ vi.useFakeTimers()
1308
+ try {
1309
+ // Keyed by CALL ORDER, not by a single shared "current live value"
1310
+ // variable — a shared variable would let the superseded refresh's
1311
+ // later read silently converge with whatever the second refresh just
1312
+ // wrote, passing even with the generation guard deleted. Instead:
1313
+ // call #1 = refresh #1 (superseded), attempt 0 → equals the stored
1314
+ // address, so refresh #1 does NOT resolve yet and keeps polling.
1315
+ // call #2 = refresh #2 (superseding), attempt 0 → differs from the
1316
+ // stored address, so refresh #2 resolves immediately and writes
1317
+ // the correct value.
1318
+ // call #3 = refresh #1, attempt 1 — reached ONLY if refresh #1 is
1319
+ // allowed to keep going after being superseded (i.e. the
1320
+ // generation guard is missing). Returns a THIRD address that is
1321
+ // neither the original stored value nor refresh #2's correct
1322
+ // value, so if refresh #1 is ever allowed to write here, it
1323
+ // visibly clobbers the correct value with this stale one.
1324
+ let solanaCallCount = 0
1325
+ const liveAccount = vi.fn(async (ns: string) => {
1326
+ if (ns !== 'solana') return null
1327
+ solanaCallCount++
1328
+ if (solanaCallCount === 1) return 'SoLAddr111'
1329
+ if (solanaCallCount === 2) return 'SoLAddr_FROM_SECOND'
1330
+ return 'SoLAddr_STALE_FROM_FIRST'
1331
+ })
1332
+ ;(mockConnector as any).getLiveAccount = liveAccount
1333
+
1334
+ await connectionService.connect(
1335
+ 'injected',
1336
+ 'metamask',
1337
+ 'solana:mainnet'
1338
+ )
1339
+
1340
+ accountSubs.get('eip155')!(['0xSWITCHED1'])
1341
+ // Let the first refresh's attempt-0 read (call #1) resolve and enter
1342
+ // its poll wait.
1343
+ await vi.advanceTimersByTimeAsync(0)
1344
+
1345
+ // A newer switch fires before the first refresh's next attempt — it
1346
+ // supersedes the generation token. Its own attempt-0 read (call #2)
1347
+ // resolves synchronously below, since the stored address hasn't
1348
+ // moved yet.
1349
+ accountSubs.get('eip155')!(['0xSWITCHED2'])
1350
+
1351
+ // Drain everything: the first refresh's remaining attempts must bail
1352
+ // out on the generation check rather than issuing call #3 and writing
1353
+ // its stale value over the second refresh's correct one.
1354
+ await vi.advanceTimersByTimeAsync(
1355
+ SIBLING_REFRESH_MAX_ATTEMPTS * SIBLING_REFRESH_DELAY_MS
1356
+ )
1357
+
1358
+ const session = sessionManager.getSession()
1359
+ expect(
1360
+ session.availableAddresses.find(a => a.networkId === 'solana:mainnet')
1361
+ ?.address
1362
+ ).toBe('SoLAddr_FROM_SECOND')
1363
+ expect(session.activeAddress).toBe('SoLAddr_FROM_SECOND')
1364
+ // Never the superseded refresh's later, stale read (call #3) — this
1365
+ // is the write the generation guard exists to prevent.
1366
+ expect(session.availableAddresses.map(a => a.address)).not.toContain(
1367
+ 'SoLAddr_STALE_FROM_FIRST'
1368
+ )
1369
+ } finally {
1370
+ vi.useRealTimers()
1371
+ }
1372
+ })
1373
+
1374
+ it('is a no-op (no throw, no sibling change) when the connector has no getLiveAccount', async () => {
1375
+ // Backward compat: connectors that predate `getLiveAccount` (Task A)
1376
+ // must not break the switch path.
1377
+ expect((mockConnector as any).getLiveAccount).toBeUndefined()
1378
+
1379
+ await connectionService.connect('injected', 'metamask', 'solana:mainnet')
1380
+
1381
+ expect(() => accountSubs.get('eip155')!(['0xSWITCHED'])).not.toThrow()
1382
+
1383
+ const session = sessionManager.getSession()
1384
+ expect(
1385
+ session.availableAddresses.find(a => a.networkId === 'solana:mainnet')
1386
+ ?.address
1387
+ ).toBe('SoLAddr111')
1388
+ })
1389
+
1390
+ it('treats an eip155 sibling address as unchanged when it differs from stored only by case', async () => {
1391
+ vi.useFakeTimers()
1392
+ try {
1393
+ // Changed namespace is SOLANA here; eip155 is the sibling under test.
1394
+ const liveAccount = vi.fn(async (ns: string) =>
1395
+ ns === 'eip155' ? '0X1234' : null
1396
+ )
1397
+ ;(mockConnector as any).getLiveAccount = liveAccount
1398
+
1399
+ await connectionService.connect(
1400
+ 'injected',
1401
+ 'metamask',
1402
+ 'solana:mainnet'
1403
+ )
1404
+
1405
+ accountSubs.get('solana')!(['SoLAddr_NEW'])
1406
+
1407
+ await vi.advanceTimersByTimeAsync(
1408
+ SIBLING_REFRESH_MAX_ATTEMPTS * SIBLING_REFRESH_DELAY_MS
1409
+ )
1410
+
1411
+ const session = sessionManager.getSession()
1412
+ expect(
1413
+ session.availableAddresses.find(a => a.networkId === 'eip155:1')
1414
+ ?.address
1415
+ ).toBe('0x1234')
1416
+ } finally {
1417
+ vi.useRealTimers()
1418
+ }
1419
+ })
1420
+ })
1421
+
1422
+ describe('Solana account-change event + sibling-poll coexistence (Task 3.3)', () => {
1423
+ // 3.1/3.2 wire a REAL solana `onAccountsChanged` into core — active-
1424
+ // namespace path via `attachLifecycle`, secondary-namespace path via
1425
+ // `attachSecondaryAccountSync`. Separately, `refreshSiblingNamespaces`
1426
+ // polls every OTHER connected namespace's live account after a sibling's
1427
+ // switch. These tests confirm the two mechanisms coexist for a solana
1428
+ // session: no double `sessionChanged` emit, no re-entrant loop, no stale
1429
+ // clobber of a fresher value, and an empty solana event on a SECONDARY
1430
+ // namespace never ends the session.
1431
+ let accountSubs: Map<string, (accounts: string[]) => void>
1432
+
1433
+ beforeEach(() => {
1434
+ networks.push({
1435
+ id: 'solana:mainnet',
1436
+ internalId: 101,
1437
+ namespace: 'solana',
1438
+ name: 'Solana',
1439
+ logoUrl: '',
1440
+ nativeCurrency: { name: 'SOL', symbol: 'SOL', decimals: 9 },
1441
+ networkType: 'solana'
1442
+ } as never)
1443
+ wallets[0]!.extensionInjectedProvider = {
1444
+ supportedNetworkIds: ['solana:mainnet', 'eip155:1']
1445
+ } as never
1446
+ accountSubs = new Map()
1447
+ mockConnector.onAccountsChanged = ((
1448
+ listener: (accounts: string[]) => void,
1449
+ context: { namespace: string }
1450
+ ) => {
1451
+ accountSubs.set(context.namespace, listener)
1452
+ return () => {}
1453
+ }) as never
1454
+ })
1455
+
1456
+ it('a solana accountsChanged on a SOLANA-active session updates the address + activeAddress with exactly ONE sessionChanged (no double-emit)', async () => {
1457
+ mockConnector.connect = vi.fn().mockResolvedValue({
1458
+ networkId: 'solana:mainnet',
1459
+ address: 'SoLAddr111',
1460
+ availableAddresses: [
1461
+ { address: 'SoLAddr111', networkId: 'solana:mainnet' },
1462
+ { address: '0x1234', networkId: 'eip155:1' }
1463
+ ]
1464
+ })
1465
+ // No getLiveAccount on this connector: isolates the direct-event path
1466
+ // from the sibling-poll path for this assertion.
1467
+ expect((mockConnector as any).getLiveAccount).toBeUndefined()
1468
+
1469
+ await connectionService.connect('injected', 'metamask', 'solana:mainnet')
1470
+
1471
+ const sessions: unknown[] = []
1472
+ eventManager.on('sessionChanged', d => sessions.push(d))
1473
+
1474
+ accountSubs.get('solana')!(['SoLAddr_NEW'])
1475
+
1476
+ const session = sessionManager.getSession()
1477
+ expect(session.activeAddress).toBe('SoLAddr_NEW')
1478
+ expect(session.availableAddresses).toEqual([
1479
+ { address: 'SoLAddr_NEW', networkId: 'solana:mainnet' },
1480
+ { address: '0x1234', networkId: 'eip155:1' }
1481
+ ])
1482
+ expect(sessions.length).toBe(1)
1483
+ })
1484
+
1485
+ it('a solana accountsChanged on an EIP155-active session updates only the solana sibling entry, leaves activeAddress alone, and does not end the session', async () => {
1486
+ mockConnector.connect = vi.fn().mockResolvedValue({
1487
+ networkId: 'eip155:1',
1488
+ address: '0x1234',
1489
+ availableAddresses: [
1490
+ { address: 'SoLAddr111', networkId: 'solana:mainnet' },
1491
+ { address: '0x1234', networkId: 'eip155:1' }
1492
+ ]
1493
+ })
1494
+
1495
+ await connectionService.connect('injected', 'metamask', 'eip155:1')
1496
+
1497
+ accountSubs.get('solana')!(['SoLAddr_NEW'])
1498
+
1499
+ const session = sessionManager.getSession()
1500
+ expect(session.connectionMode).toBe('injected')
1501
+ expect(session.activeAddress).toBe('0x1234')
1502
+ expect(session.availableAddresses).toEqual([
1503
+ { address: 'SoLAddr_NEW', networkId: 'solana:mainnet' },
1504
+ { address: '0x1234', networkId: 'eip155:1' }
1505
+ ])
1506
+ })
1507
+
1508
+ it('an empty solana accountsChanged on the SECONDARY (non-active) namespace is a no-op — it does not end the session', async () => {
1509
+ const disconnectSpy = vi.fn().mockResolvedValue(undefined)
1510
+ mockConnector.disconnect = disconnectSpy
1511
+ mockConnector.connect = vi.fn().mockResolvedValue({
1512
+ networkId: 'eip155:1',
1513
+ address: '0x1234',
1514
+ availableAddresses: [
1515
+ { address: 'SoLAddr111', networkId: 'solana:mainnet' },
1516
+ { address: '0x1234', networkId: 'eip155:1' }
1517
+ ]
1518
+ })
1519
+
1520
+ await connectionService.connect('injected', 'metamask', 'eip155:1')
1521
+
1522
+ accountSubs.get('solana')!([])
1523
+
1524
+ const session = sessionManager.getSession()
1525
+ expect(session.connectionMode).toBe('injected')
1526
+ expect(session.activeAddress).toBe('0x1234')
1527
+ expect(session.availableAddresses).toEqual([
1528
+ { address: 'SoLAddr111', networkId: 'solana:mainnet' },
1529
+ { address: '0x1234', networkId: 'eip155:1' }
1530
+ ])
1531
+ expect(disconnectSpy).not.toHaveBeenCalled()
1532
+ })
1533
+
1534
+ it('a direct solana event and an eip155-triggered sibling poll converge on the same address without a stale clobber (generation guard)', async () => {
1535
+ vi.useFakeTimers()
1536
+ try {
1537
+ mockConnector.connect = vi.fn().mockResolvedValue({
1538
+ networkId: 'solana:mainnet',
1539
+ address: 'SoLAddr111',
1540
+ availableAddresses: [
1541
+ { address: 'SoLAddr111', networkId: 'solana:mainnet' },
1542
+ { address: '0x1234', networkId: 'eip155:1' }
1543
+ ]
1544
+ })
1545
+ let solanaLiveCalls = 0
1546
+ const liveAccount = vi.fn(async (ns: string) => {
1547
+ if (ns === 'solana') {
1548
+ solanaLiveCalls++
1549
+ // First read still reflects the OLD (stored) address — unchanged,
1550
+ // so the poll keeps going. A SECOND read is reached only if the
1551
+ // superseded refresh is wrongly allowed to continue; it returns a
1552
+ // value that is neither the original nor the direct event's
1553
+ // value, so any write from it is a visible clobber.
1554
+ return solanaLiveCalls === 1
1555
+ ? 'SoLAddr111'
1556
+ : 'SoLAddr_STALE_FROM_POLL'
1557
+ }
1558
+ // eip155 sibling (queried by the solana-event-triggered refresh):
1559
+ // never resolves — the direct event's own change already landed
1560
+ // through the non-polling path.
1561
+ return null
1562
+ })
1563
+ ;(mockConnector as any).getLiveAccount = liveAccount
1564
+
1565
+ const sessions: unknown[] = []
1566
+ eventManager.on('sessionChanged', d => sessions.push(d))
1567
+
1568
+ await connectionService.connect(
1569
+ 'injected',
1570
+ 'metamask',
1571
+ 'solana:mainnet'
1572
+ )
1573
+ sessions.length = 0 // drop the connect's own sessionChanged
1574
+
1575
+ // eip155 fires first: updates its own entry and kicks off a sibling
1576
+ // poll of solana (generation N).
1577
+ accountSubs.get('eip155')!(['0xSWITCHED'])
1578
+ await vi.advanceTimersByTimeAsync(0) // let attempt-0's read land (unchanged, keeps polling)
1579
+
1580
+ // A REAL solana accounts-change event lands next (the 3.1/3.2 direct
1581
+ // path) carrying the same new address the poll is chasing. It writes
1582
+ // directly and starts its OWN sibling refresh (generation N+1),
1583
+ // superseding the still-polling eip155-triggered one.
1584
+ accountSubs.get('solana')!(['SoLAddr_NEW'])
1585
+
1586
+ // Drain both: the superseded refresh must bail on the generation
1587
+ // check instead of issuing a second solana read and clobbering.
1588
+ await vi.advanceTimersByTimeAsync(
1589
+ SIBLING_REFRESH_MAX_ATTEMPTS * SIBLING_REFRESH_DELAY_MS
1590
+ )
1591
+
1592
+ const session = sessionManager.getSession()
1593
+ expect(
1594
+ session.availableAddresses.find(a => a.networkId === 'solana:mainnet')
1595
+ ?.address
1596
+ ).toBe('SoLAddr_NEW')
1597
+ expect(session.activeAddress).toBe('SoLAddr_NEW')
1598
+ expect(
1599
+ session.availableAddresses.find(a => a.networkId === 'eip155:1')
1600
+ ?.address
1601
+ ).toBe('0xSWITCHED')
1602
+ expect(session.availableAddresses.map(a => a.address)).not.toContain(
1603
+ 'SoLAddr_STALE_FROM_POLL'
1604
+ )
1605
+ // The superseded refresh never got a second read in.
1606
+ expect(solanaLiveCalls).toBe(1)
1607
+ // Exactly two emits: the eip155 event's own, and the solana event's
1608
+ // own. Neither sibling-refresh resolves a sibling, so neither adds an
1609
+ // extra emit — confirming no double-emit / no loop.
1610
+ expect(sessions.length).toBe(2)
1611
+ } finally {
1612
+ vi.useRealTimers()
1613
+ }
1614
+ })
1615
+ })
1139
1616
  })
@@ -22,6 +22,13 @@ export interface ServiceOptions {
22
22
  signal?: AbortSignal
23
23
  }
24
24
 
25
+ /** Sibling-namespace live-account re-read poll: absorbs the lag while a wallet
26
+ * re-derives a sibling namespace's address (e.g. MetaMask's Solana Snap) after
27
+ * an account switch on another namespace. Bounded so a genuinely-unchanged
28
+ * sibling gives up quickly. */
29
+ export const SIBLING_REFRESH_MAX_ATTEMPTS = 5
30
+ export const SIBLING_REFRESH_DELAY_MS = 200
31
+
25
32
  export class ConnectionService {
26
33
  private activeConnector: Connector | null = null
27
34
  /** Tears down the post-connect lifecycle subscription; set while connected. */
@@ -40,6 +47,13 @@ export class ConnectionService {
40
47
  * each reading the shared activeConnector, and flood telemetry).
41
48
  */
42
49
  private inFlightAbort: AbortController | null = null
50
+ /**
51
+ * Monotonic token for the in-flight cross-namespace sibling refresh (see
52
+ * `refreshSiblingNamespaces`). A newer account switch, a teardown, or a
53
+ * disconnect bumps it so a still-polling older refresh aborts before it
54
+ * writes a now-stale sibling address into the session.
55
+ */
56
+ private siblingRefreshGeneration = 0
43
57
 
44
58
  constructor(
45
59
  private networks: Network[],
@@ -325,6 +339,14 @@ export class ConnectionService {
325
339
  this.eventManager.emit('sessionChanged', {
326
340
  session: this.sessionManager.getSession()
327
341
  })
342
+
343
+ // A single wallet account drives ALL its namespaces (e.g. MetaMask's Solana
344
+ // Snap derives its key from the selected EVM account). The wallet only fired
345
+ // an accountsChanged for THIS namespace; refresh the live account of every
346
+ // other connected namespace so the session doesn't serve a stale sibling
347
+ // address. Fire-and-forget: we're inside the wallet's synchronous event
348
+ // dispatch and must not await.
349
+ void this.refreshSiblingNamespaces(namespace)
328
350
  }
329
351
 
330
352
  /**
@@ -339,6 +361,11 @@ export class ConnectionService {
339
361
  this.lifecycleTeardown = undefined
340
362
  for (const teardown of this.secondaryAccountSyncTeardowns) teardown()
341
363
  this.secondaryAccountSyncTeardowns = []
364
+ // Supersede any in-flight sibling-namespace refresh (see
365
+ // `refreshSiblingNamespaces`) — a still-polling refresh must not write a
366
+ // now-stale address after teardown/disconnect. `finishDisconnect()` calls
367
+ // this too, so one bump here covers both paths.
368
+ this.siblingRefreshGeneration++
342
369
  }
343
370
 
344
371
  /**
@@ -452,6 +479,120 @@ export class ConnectionService {
452
479
  }
453
480
  }
454
481
 
482
+ /**
483
+ * After a real account switch on `changedNamespace`, re-read the LIVE account
484
+ * of every OTHER connected namespace and fold any that changed into the
485
+ * session in ONE update. Sibling namespaces (e.g. a MetaMask Solana Snap
486
+ * address derived from the EVM account) change with the underlying account but
487
+ * emit no `accountsChanged`, and their live read can LAG the firing namespace's
488
+ * event while the wallet re-derives — so poll each sibling up to
489
+ * `SIBLING_REFRESH_MAX_ATTEMPTS` times, `SIBLING_REFRESH_DELAY_MS` apart,
490
+ * stopping a sibling the moment its live address differs from the stored one.
491
+ *
492
+ * Loop-safe: writes addresses DIRECTLY via the session manager (never
493
+ * re-dispatches a per-namespace accountsChanged), and only emits when at least
494
+ * one sibling actually changed — so refreshing B here cannot re-enter this for
495
+ * A and recurse. Generation-guarded so a newer switch / teardown / disconnect
496
+ * supersedes an older still-polling refresh before it writes.
497
+ */
498
+ private async refreshSiblingNamespaces(
499
+ changedNamespace: Namespace
500
+ ): Promise<void> {
501
+ const connector = this.activeConnector
502
+ if (!connector?.getLiveAccount) return
503
+ const gen = ++this.siblingRefreshGeneration
504
+
505
+ const namespaceForNetworkId = (
506
+ networkId: NetworkId
507
+ ): Namespace | undefined =>
508
+ this.networks.find(n => n.id === networkId)?.namespace
509
+
510
+ // Sibling = every connected namespace except the one that just fired.
511
+ const initial = this.sessionManager.getSession()
512
+ const siblings = new Set<Namespace>()
513
+ for (const addr of initial.availableAddresses) {
514
+ const ns = namespaceForNetworkId(addr.networkId)
515
+ if (ns && ns !== changedNamespace) siblings.add(ns)
516
+ }
517
+ if (siblings.size === 0) return
518
+
519
+ const equal = (ns: Namespace, a: string, b: string): boolean =>
520
+ ns === 'eip155' ? a.toLowerCase() === b.toLowerCase() : a === b
521
+
522
+ const storedFor = (ns: Namespace): string | undefined => {
523
+ const s = this.sessionManager.getSession()
524
+ for (const addr of s.availableAddresses) {
525
+ if (namespaceForNetworkId(addr.networkId) === ns) return addr.address
526
+ }
527
+ return undefined
528
+ }
529
+
530
+ const resolved = new Map<Namespace, string>()
531
+ const pending = new Set(siblings)
532
+
533
+ for (
534
+ let attempt = 0;
535
+ attempt < SIBLING_REFRESH_MAX_ATTEMPTS && pending.size > 0;
536
+ attempt++
537
+ ) {
538
+ // Superseded (newer switch), disconnected, or connector swapped → abandon.
539
+ if (
540
+ gen !== this.siblingRefreshGeneration ||
541
+ this.activeConnector !== connector
542
+ )
543
+ return
544
+ for (const ns of [...pending]) {
545
+ let live: string | null = null
546
+ try {
547
+ live = await connector.getLiveAccount!(ns)
548
+ } catch {
549
+ live = null
550
+ }
551
+ if (
552
+ gen !== this.siblingRefreshGeneration ||
553
+ this.activeConnector !== connector
554
+ )
555
+ return
556
+ if (!live) continue
557
+ const stored = storedFor(ns)
558
+ if (stored != null && !equal(ns, stored, live)) {
559
+ resolved.set(ns, live)
560
+ pending.delete(ns)
561
+ }
562
+ // stored == live (not yet re-derived) → keep polling until the cap.
563
+ }
564
+ if (pending.size === 0) break
565
+ await new Promise<void>(r => setTimeout(r, SIBLING_REFRESH_DELAY_MS))
566
+ }
567
+
568
+ if (resolved.size === 0) return
569
+ if (
570
+ gen !== this.siblingRefreshGeneration ||
571
+ this.activeConnector !== connector
572
+ )
573
+ return
574
+
575
+ const session = this.sessionManager.getSession()
576
+ const availableAddresses = session.availableAddresses.map(addr => {
577
+ const ns = namespaceForNetworkId(addr.networkId)
578
+ const next = ns ? resolved.get(ns) : undefined
579
+ return next ? { ...addr, address: next } : addr
580
+ })
581
+ // If the ACTIVE network's namespace was among the refreshed siblings, move
582
+ // activeAddress too (e.g. a Solana-active session whose Solana address just
583
+ // followed an EVM switch).
584
+ const activeNs = session.activeNetwork?.namespace
585
+ const activeAddress =
586
+ activeNs && resolved.has(activeNs)
587
+ ? resolved.get(activeNs)!
588
+ : session.activeAddress
589
+
590
+ this.sessionManager.updateSession({ activeAddress, availableAddresses })
591
+ this.eventManager.emit('sessionChanged', {
592
+ session: this.sessionManager.getSession()
593
+ })
594
+ }
595
+
455
596
  private async connectWithURIPoll(
456
597
  connector: Connector,
457
598
  network: Network,