@lydianpay/lydianconnect 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +25 -42
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -1
- package/dist/index.d.ts +6 -1
- package/dist/index.js +26 -43
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -357,8 +357,8 @@ function evmChainIds(req) {
|
|
|
357
357
|
return Number.isFinite(n) && n > 0 ? [n] : void 0;
|
|
358
358
|
}
|
|
359
359
|
|
|
360
|
-
// src/connectors/walletconnect/wallet-links.
|
|
361
|
-
var
|
|
360
|
+
// src/connectors/walletconnect/wallet-links.ts
|
|
361
|
+
var WALLET_LINKS = {
|
|
362
362
|
metamask: { "native": "metamask://", "scheme": "metamask://wc", "universal": "https://metamask.app.link/wc", "store": { "ios": "https://apps.apple.com/us/app/metamask/id1438144202", "android": "https://play.google.com/store/apps/details?id=io.metamask" } },
|
|
363
363
|
trust: { "native": "trust://", "scheme": "trust://wc", "universal": "https://link.trustwallet.com/wc", "store": { "ios": "https://apps.apple.com/app/apple-store/id1288339409", "android": "https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp" } },
|
|
364
364
|
rainbow: { "native": "rainbow://", "scheme": "rainbow://wc", "universal": "https://rnbwapp.com/wc", "store": { "ios": "https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8", "android": "https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc" } },
|
|
@@ -368,8 +368,8 @@ var GENERATED_WALLET_LINKS = {
|
|
|
368
368
|
blockchaincom: { "native": "blockchain-wallet://", "scheme": "blockchain-wallet://wc", "universal": "https://login.blockchain.com/app/wc", "store": { "ios": "https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309", "android": "https://play.google.com/store/apps/details?id=piuk.blockchain.android" } },
|
|
369
369
|
exodus: { "native": "exodus://", "scheme": "exodus://wc", "universal": "https://exodus.com/m/wc", "store": { "ios": "https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820", "android": "https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US" } },
|
|
370
370
|
phantom: { "store": { "ios": "https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977", "android": "https://play.google.com/store/apps/details?id=app.phantom&hl=en" } },
|
|
371
|
-
okx: { "native": "
|
|
372
|
-
cryptocom: { "native": "
|
|
371
|
+
okx: { "native": "okxwallet://main", "scheme": "okxwallet://main/wc", "store": { "ios": "https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470", "android": "https://play.google.com/store/apps/details?id=com.okinc.okex.gp" } },
|
|
372
|
+
cryptocom: { "native": "cryptowallet://", "scheme": "cryptowallet://wc", "store": { "ios": "https://apps.apple.com/US/app/id1512048310?mt=8", "android": "https://play.google.com/store/apps/details?id=com.defi.wallet" } },
|
|
373
373
|
argent: { "native": "argent://app/", "scheme": "argent://app/wc", "universal": "https://www.argent.xyz/app/wc", "store": { "ios": "https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926", "android": "https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1" } },
|
|
374
374
|
safepal: { "native": "safepalwallet://", "scheme": "safepalwallet://wc", "universal": "https://link.safepal.io/wc", "store": { "ios": "https://apps.apple.com/app/safepal-wallet/id1548297139", "android": "https://play.google.com/store/apps/details?id=io.safepal.wallet" } },
|
|
375
375
|
imtoken: { "native": "imtokenv2://", "scheme": "imtokenv2://wc", "store": { "ios": "https://apps.apple.com/us/app/imtoken2/id1384798940", "android": "https://play.google.com/store/apps/details?id=im.token.app" } },
|
|
@@ -385,7 +385,7 @@ var GENERATED_WALLET_LINKS = {
|
|
|
385
385
|
};
|
|
386
386
|
|
|
387
387
|
// src/connectors/walletconnect/registry.ts
|
|
388
|
-
var DEFAULT_WALLET_LINKS =
|
|
388
|
+
var DEFAULT_WALLET_LINKS = WALLET_LINKS;
|
|
389
389
|
|
|
390
390
|
// src/connectors/walletconnect/deeplink.ts
|
|
391
391
|
function isMobile() {
|
|
@@ -400,24 +400,20 @@ function buildLink(base, uri) {
|
|
|
400
400
|
}
|
|
401
401
|
function openWallet(link, uri) {
|
|
402
402
|
if (typeof document === "undefined") return;
|
|
403
|
-
if (link.
|
|
404
|
-
openHref(buildLink(link.
|
|
405
|
-
} else if (link.
|
|
406
|
-
openHref(buildLink(link.
|
|
403
|
+
if (link.scheme) {
|
|
404
|
+
openHref(buildLink(link.scheme, uri));
|
|
405
|
+
} else if (link.universal) {
|
|
406
|
+
openHref(buildLink(link.universal, uri));
|
|
407
407
|
}
|
|
408
408
|
}
|
|
409
409
|
function openWalletApp(link) {
|
|
410
410
|
if (typeof document === "undefined") return;
|
|
411
411
|
if (!link.native) return;
|
|
412
|
-
openHref(link.native
|
|
412
|
+
openHref(link.native);
|
|
413
413
|
}
|
|
414
414
|
function openHref(href, newContext) {
|
|
415
415
|
const a = document.createElement("a");
|
|
416
416
|
a.href = href;
|
|
417
|
-
if (newContext) {
|
|
418
|
-
a.target = "_blank";
|
|
419
|
-
a.rel = "noopener noreferrer";
|
|
420
|
-
}
|
|
421
417
|
a.style.display = "none";
|
|
422
418
|
document.body.appendChild(a);
|
|
423
419
|
a.click();
|
|
@@ -457,8 +453,6 @@ var WalletConnectConnector = class extends BaseConnector {
|
|
|
457
453
|
// claims any wallet not served by an SDK connector
|
|
458
454
|
this.client = null;
|
|
459
455
|
this.topics = /* @__PURE__ */ new Map();
|
|
460
|
-
this.warm = null;
|
|
461
|
-
this.warming = null;
|
|
462
456
|
this.links = { ...DEFAULT_WALLET_LINKS, ...options.walletLinks ?? {} };
|
|
463
457
|
}
|
|
464
458
|
isAvailable() {
|
|
@@ -499,45 +493,35 @@ var WalletConnectConnector = class extends BaseConnector {
|
|
|
499
493
|
this.load();
|
|
500
494
|
return client;
|
|
501
495
|
}
|
|
502
|
-
/** Pre-create a pairing so connect() can deep-link synchronously within the gesture. */
|
|
503
|
-
async warmup() {
|
|
504
|
-
if (this.warm) return;
|
|
505
|
-
if (this.warming) return this.warming;
|
|
506
|
-
this.warming = (async () => {
|
|
507
|
-
const client = await this.getClient();
|
|
508
|
-
const { topic, uri } = await client.core.pairing.create();
|
|
509
|
-
this.warm = { topic, uri };
|
|
510
|
-
this.warming = null;
|
|
511
|
-
})();
|
|
512
|
-
return this.warming;
|
|
513
|
-
}
|
|
514
496
|
async connect(req) {
|
|
515
497
|
const client = await this.getClient();
|
|
516
498
|
const reused = this.tryReuse(client, req);
|
|
517
499
|
if (reused) return reused;
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
if (!
|
|
522
|
-
this.emit({ type: "display_uri", walletId: req.walletId, uri
|
|
500
|
+
const { uri, approval } = await client.connect({
|
|
501
|
+
requiredNamespaces: { [req.namespace.name]: req.namespace.value }
|
|
502
|
+
});
|
|
503
|
+
if (!uri) throw new Error("WalletConnect did not return a pairing URI");
|
|
504
|
+
this.emit({ type: "display_uri", walletId: req.walletId, uri });
|
|
523
505
|
if (isMobile()) {
|
|
524
506
|
const link = this.links[req.walletId];
|
|
525
507
|
if (link) {
|
|
526
|
-
openWallet(link,
|
|
508
|
+
openWallet(link, uri);
|
|
527
509
|
void detectAppOpen(this.options.openTimeoutMs ?? 2e3).then((opened) => {
|
|
528
|
-
if (!opened)
|
|
510
|
+
if (!opened)
|
|
511
|
+
this.emit({
|
|
512
|
+
type: "wallet_open_failed",
|
|
513
|
+
walletId: req.walletId,
|
|
514
|
+
uri,
|
|
515
|
+
store: link.store
|
|
516
|
+
});
|
|
529
517
|
});
|
|
530
518
|
}
|
|
531
519
|
}
|
|
532
|
-
const
|
|
533
|
-
pairingTopic: warm.topic,
|
|
534
|
-
optionalNamespaces: { [req.namespace.name]: req.namespace.value }
|
|
535
|
-
});
|
|
520
|
+
const pairingTopic = utils.parseUri(uri).topic;
|
|
536
521
|
const session = await withSignal(approval(), req.signal, () => {
|
|
537
|
-
void client.core.pairing.disconnect({ topic:
|
|
522
|
+
void client.core.pairing.disconnect({ topic: pairingTopic }).catch(() => {
|
|
538
523
|
});
|
|
539
524
|
});
|
|
540
|
-
void this.warmup();
|
|
541
525
|
const connection = this.toConnection(client, req.walletId, session, req.namespace);
|
|
542
526
|
this.topics.set(req.walletId, session.topic);
|
|
543
527
|
this.persist();
|
|
@@ -567,7 +551,6 @@ var WalletConnectConnector = class extends BaseConnector {
|
|
|
567
551
|
}
|
|
568
552
|
this.topics.clear();
|
|
569
553
|
this.persist();
|
|
570
|
-
this.warm = null;
|
|
571
554
|
}
|
|
572
555
|
// --- helpers ---
|
|
573
556
|
tryReuse(client, req) {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/manager.ts","../src/core/namespace.ts","../src/core/connector.ts","../src/core/app.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/connector.ts","../src/connectors/walletconnect/wallet-links.generated.ts","../src/connectors/walletconnect/registry.ts","../src/connectors/walletconnect/deeplink.ts","../src/connectors/walletconnect/connector.ts","../src/core/lydian-connect.ts"],"names":["WALLET_ID","toCaip","SignClient","getSdkError"],"mappings":";;;;;;;;;;AAQO,IAAM,iBAAN,MAAqB;AAAA,EAS1B,YAAY,UAAA,EAAyB;AARrC,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAAuB;AAG9C,IAAA,IAAA,CAAQ,WAAA,uBAAkB,GAAA,EAAwB;AAClD,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAA+B;AACtD,IAAA,IAAA,CAAQ,SAA4B,EAAC;AACrC,IAAA,IAAA,CAAQ,OAAA,GAAU,KAAA;AAGhB,IAAA,MAAM,SAAA,GAAY,WAAW,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,SAAA,CAAU,WAAW,CAAC,CAAA;AACnE,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,+EAAA,EAAkF,UAAU,MAAM,CAAA;AAAA,OACpG;AAAA,IACF;AACA,IAAA,IAAA,CAAK,QAAA,GAAW,UAAU,CAAC,CAAA;AAC3B,IAAA,IAAA,CAAK,GAAA,GAAM,UAAA;AACX,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,KAAA,MAAW,MAAM,SAAA,CAAU,SAAA,OAAgB,QAAA,CAAS,GAAA,CAAI,IAAI,SAAS,CAAA;AAAA,IACvE;AAAA,EACF;AAAA;AAAA,EAGA,MAAM,IAAA,GAAsB;AAC1B,IAAA,IAAI,KAAK,OAAA,EAAS;AAClB,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,GAAA,EAAK;AAChC,MAAA,IAAA,CAAK,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,EAAA,CAAG,CAAC,UAAU,IAAA,CAAK,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA;AAAA,IAC9D;AAAA,EACF;AAAA;AAAA,EAGQ,QAAQ,QAAA,EAA6B;AAC3C,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,GAAA,CAAI,QAAQ,KAAK,IAAA,CAAK,QAAA;AAAA,EAC7C;AAAA,EAEA,MAAM,QAAQ,GAAA,EAA0C;AACtD,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,MAAM,KAAK,IAAA,EAAK;AACnC,IAAA,MAAM,UAAA,GAAa,MAAM,IAAA,CAAK,OAAA,CAAQ,IAAI,QAAQ,CAAA,CAAE,QAAQ,GAAG,CAAA;AAC/D,IAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,UAAU,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,SAAA,EAAW,UAAU,GAAA,CAAI,QAAA,EAAU,YAAY,CAAA;AACjE,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,GAAiC;AACrC,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,EAAS,MAAM,KAAK,IAAA,EAAK;AACnC,IAAA,MAAM,WAAyB,EAAC;AAChC,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,GAAA,EAAK;AAChC,MAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU,OAAA,GAAU,KAAA,CAAM,MAAM,EAAkB,CAAA;AACtE,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,IAAA,CAAK,QAAA,EAAU,IAAI,CAAA;AACxC,QAAA,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,MACpB;AAAA,IACF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,IAAI,QAAA,EAA0C;AAC5C,IAAA,OAAO,IAAA,CAAK,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA;AAAA,EACtC;AAAA,EAEA,MAAM,WAAW,QAAA,EAAkC;AACjD,IAAA,IAAI,QAAA,EAAU;AACZ,MAAA,MAAM,IAAA,CAAK,YAAY,GAAA,CAAI,QAAQ,GAAG,UAAA,EAAW,CAAE,MAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AACjE,MAAA,IAAA,CAAK,WAAA,CAAY,OAAO,QAAQ,CAAA;AAChC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,CAAC,GAAG,KAAK,WAAA,CAAY,MAAA,EAAQ,CAAA,CAAE,IAAI,CAAC,CAAA,KAAM,CAAA,CAAE,UAAA,EAAY,CAAC,CAAA;AAClF,IAAA,IAAA,CAAK,YAAY,KAAA,EAAM;AAAA,EACzB;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,KAAK,UAAA,EAAW;AACtB,IAAA,MAAM,OAAA,CAAQ,UAAA,CAAW,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,EAAO,CAAC,CAAA;AAAA,EACzD;AAAA,EAEA,GAAG,OAAA,EAAgD;AACjD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AACzB,IAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,OAAO,KAAA,EAAiC;AAC9C,IAAA,IAAI,MAAM,IAAA,KAAS,YAAA,OAAmB,WAAA,CAAY,MAAA,CAAO,MAAM,QAAQ,CAAA;AACvE,IAAA,IAAA,CAAK,KAAK,KAAK,CAAA;AAAA,EACjB;AAAA,EAEQ,KAAK,KAAA,EAAiC;AAC5C,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,EACpD;AACF,CAAA;;;AC9FA,IAAM,mBAAA,GAAsB;AAAA,EAC1B,qBAAA;AAAA,EACA,eAAA;AAAA,EACA,sBAAA;AAAA,EACA;AACF,CAAA;AACA,IAAM,kBAAA,GAAqB,CAAC,cAAA,EAAgB,iBAAiB,CAAA;AAStD,SAAS,eAAe,OAAA,EAAyC;AACtE,EAAA,MAAM,OAAO,OAAO,OAAA,KAAY,QAAA,GAAW,CAAA,OAAA,EAAU,OAAO,CAAA,CAAA,GAAK,OAAA;AACjE,EAAA,MAAM,CAAC,IAAA,EAAM,SAAS,CAAA,GAAI,IAAA,CAAK,MAAM,GAAG,CAAA;AACxC,EAAA,IAAI,IAAA,KAAS,QAAA,IAAY,CAAC,SAAA,IAAa,CAAC,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,IAAK,CAAA,EAAG;AACzF,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,sBAAsB,IAAI,CAAA,8FAAA;AAAA,KAC5B;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAC,IAAI,CAAA,EAAG,OAAA,EAAS,mBAAA,EAAqB,MAAA,EAAQ,kBAAA;AAAmB,GACpF;AACF;;;ACIO,IAAe,gBAAf,MAAkD;AAAA,EAAlD,WAAA,GAAA;AAEL,IAAA,IAAA,CAAS,YAA+B,EAAC;AAEzC,IAAA,IAAA,CAAQ,QAAA,uBAAe,GAAA,EAA+B;AAAA,EAAA;AAAA,EAKtD,MAAM,OAAA,GAAiC;AACrC,IAAA,OAAO,EAAC;AAAA,EACV;AAAA,EAEA,MAAM,KAAA,GAAuB;AAAA,EAE7B;AAAA,EAEA,GAAG,OAAA,EAAgD;AACjD,IAAA,IAAA,CAAK,QAAA,CAAS,IAAI,OAAO,CAAA;AACzB,IAAA,OAAO,MAAM,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEU,KAAK,KAAA,EAAiC;AAC9C,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAAA,EACpD;AACF,CAAA;;;AC7CO,SAAS,SAAA,GAAoB;AAClC,EAAA,OAAO,OAAO,MAAA,KAAW,WAAA,GAAc,MAAA,CAAO,SAAS,MAAA,GAAS,EAAA;AAClE;;;ACTA,IAAM,SAAA,GAAY,UAAA;AAEX,IAAM,iBAAA,GAAN,cAAgC,aAAA,CAAc;AAAA,EAQnD,YAAoB,GAAA,EAAgB;AAClC,IAAA,KAAA,EAAM;AADY,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AAPpB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,SAAA,GAAY,CAAC,SAAS,CAAA;AAE/B,IAAA,IAAA,CAAQ,GAAA,GAA8B,IAAA;AACtC,IAAA,IAAA,CAAQ,QAAA,GAAoC,IAAA;AAC5C,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AAAA,EAIzB;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,WAAA,GAAyC;AACrD,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAC/B,IAAA,MAAM,EAAE,WAAA,EAAY,GAAI,MAAM,OAAO,eAAe,CAAA;AACpD,IAAA,MAAM,YAAA,GAAmD;AAAA,MACvD,IAAA,EAAM,KAAK,GAAA,CAAI,OAAA;AAAA,MACf,KAAK,SAAA,EAAU;AAAA,MACf,GAAI,IAAA,CAAK,GAAA,CAAI,IAAA,GAAO,EAAE,SAAS,IAAA,CAAK,GAAA,CAAI,IAAA,EAAK,GAAI;AAAC,KACpD;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,EAAE,cAAc,CAAA;AAC5C,IAAA,MAAM,IAAI,IAAA,EAAK;AACf,IAAA,MAAM,QAAA,GAAW,IAAI,WAAA,EAAY;AACjC,IAAA,IAAI,CAAC,QAAA,EAAU,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAC9D,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,WAAW,QAAQ,CAAA;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,WAAW,QAAA,EAAkC;AACnD,IAAA,IAAI,KAAK,cAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAC,GAAA,KAAQ;AACnC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,MAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,CAAA;AAAA,IACvF,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,EAAA,CAAG,iBAAA,EAAmB,CAAC,QAAA,KAAa;AAC3C,MAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAK,QAAA,CAAS,CAAC,CAAA,GAA2B,MAAA;AAChF,MAAA,IAAI,OAAA,OAAc,IAAA,CAAK,EAAE,MAAM,iBAAA,EAAmB,QAAA,EAAU,SAAA,EAAW,OAAA,EAAS,CAAA;AAAA,gBACtE,IAAA,CAAK,EAAE,MAAM,YAAA,EAAc,QAAA,EAAU,WAAW,CAAA;AAAA,IAC5D,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,EAAA,CAAG,YAAA,EAAc,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,SAAA,EAAW,CAAC,CAAA;AAAA,EACxF;AAAA,EAEA,MAAM,QAAQ,GAAA,EAA0C;AACtD,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,WAAA,EAAY;AACxC,IAAA,MAAM,WAAW,MAAM,QAAA,CAAS,QAAkB,EAAE,MAAA,EAAQ,uBAAuB,CAAA;AACnF,IAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAC5D,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,GAAG,CAAA;AACpC,IAAA,MAAM,OAAA,GAAU,OAAO,MAAM,QAAA,CAAS,QAAgB,EAAE,MAAA,EAAQ,aAAA,EAAe,CAAC,CAAA;AAChF,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,OAAA,GAAiC;AACrC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,aAAY,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,QAAA,CAAS,OAAA,CAAkB,EAAE,MAAA,EAAQ,cAAA,EAAgB,CAAA,CAAE,KAAA,CAAM,MAAM,EAAE,CAAA;AAC5F,IAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,IAAA,MAAM,OAAA,GAAU,MAAA;AAAA,MACd,MAAM,QAAA,CAAS,OAAA,CAAgB,EAAE,MAAA,EAAQ,eAAe,CAAA,CAAE,KAAA,CAAM,MAAM,KAAK;AAAA,KAC7E;AACA,IAAA,OAAO,CAAC,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,KAAK,SAAA,EAAU;AAC1B,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAAA,EACxB;AAAA;AAAA,EAGA,MAAc,WAAA,CAAY,QAAA,EAA4B,GAAA,EAAoC;AACxF,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,SAAS,MAAA,CAAO,MAAA,CAAO,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,GAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,IAAK,aAAa,CAAA,EAAG;AACnD,IAAA,MAAM,OAAA,GAAU,QAAA;AAAA,MACb,MAAM,QAAA,CAAS,OAAA,CAAgB,EAAE,MAAA,EAAQ,aAAA,EAAe,CAAA,CAAE,KAAA,CAAM,MAAM,KAAK,CAAA,IAAM,KAAA;AAAA,MAClF;AAAA,KACF;AACA,IAAA,IAAI,YAAY,SAAA,EAAW;AAC3B,IAAA,MAAM,SACH,OAAA,CAAQ;AAAA,MACP,MAAA,EAAQ,4BAAA;AAAA,MACR,MAAA,EAAQ,CAAC,EAAE,OAAA,EAAS,CAAA,EAAA,EAAK,UAAU,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI;AAAA,KACpD,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAEb,CAAC,CAAA;AAAA,EACL;AAAA,EAEQ,YAAA,CAAa,QAAA,EAA4B,OAAA,EAAiB,OAAA,EAA6B;AAC7F,IAAA,OAAO;AAAA,MACL,QAAA,EAAU,SAAA;AAAA,MACV,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,OAAU,IAAA,KAChB,MAAM,QAAA,CAAS,OAAA,CAAW,EAAE,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,MAAA,EAAQ,IAAA,CAAK,QAAiB,CAAA;AAAA,MAClF,YAAY,MAAM;AAAA,MAAC,CAAA;AAAA;AAAA,MACnB,YAAY,YAAY;AACtB,QAAA,MAAM,IAAA,CAAK,KAAK,SAAA,EAAU;AAC1B,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,QAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,QAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAU,WAAW,CAAA;AAAA,MACvD;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAEA,SAAS,OAAO,UAAA,EAA+C;AAC7D,EAAA,IAAI,CAAC,YAAY,OAAO,UAAA;AACxB,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,SAAS,UAAA,EAAY,EAAE,CAAA,GAAI,MAAA,CAAO,UAAU,CAAA;AACtF,EAAA,OAAO,UAAU,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,MAAM,CAAC,CAAA,CAAA;AACjD;;;ACvHA,SAAS,GAAA,CAAO,QAAA,EAA4B,MAAA,EAAgB,MAAA,EAA8B;AACxF,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,EAAE,MAAA,EAAQ,QAAkC,CAAA;AACtE;AAEA,IAAMA,UAAAA,GAAY,UAAA;AAEX,IAAM,iBAAA,GAAN,cAAgC,aAAA,CAAc;AAAA,EAOnD,YAAoB,GAAA,EAAgB;AAClC,IAAA,KAAA,EAAM;AADY,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AANpB,IAAA,IAAA,CAAS,IAAA,GAAO,KAAA;AAChB,IAAA,IAAA,CAAS,SAAA,GAAY,CAACA,UAAS,CAAA;AAE/B,IAAA,IAAA,CAAQ,QAAA,GAAoC,IAAA;AAC5C,IAAA,IAAA,CAAQ,cAAA,GAAiB,KAAA;AAAA,EAIzB;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,YAAY,WAAA,EAAmD;AAC3E,IAAA,IAAI,IAAA,CAAK,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAC/B,IAAA,MAAM,EAAE,iBAAA,EAAkB,GAAI,MAAM,OAAO,sBAAsB,CAAA;AACjE,IAAA,MAAM,GAAA,GAAM,IAAI,iBAAA,CAAkB;AAAA,MAChC,OAAA,EAAS,KAAK,GAAA,CAAI,OAAA;AAAA,MAClB,UAAA,EAAY,KAAK,GAAA,CAAI,IAAA;AAAA,MACrB;AAAA;AAAA,KACD,CAAA;AACD,IAAA,MAAM,QAAA,GAAW,IAAI,gBAAA,EAAiB;AACtC,IAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAChB,IAAA,IAAA,CAAK,WAAW,QAAQ,CAAA;AACxB,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEQ,WAAW,QAAA,EAAkC;AACnD,IAAA,IAAI,KAAK,cAAA,EAAgB;AACzB,IAAA,IAAA,CAAK,cAAA,GAAiB,IAAA;AACtB,IAAA,QAAA,CAAS,EAAA,CAAG,cAAA,EAAgB,CAAC,GAAA,KAAQ;AACnC,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAUA,UAAAA,EAAW,OAAA,EAASC,OAAAA,CAAO,MAAA,CAAO,GAAG,CAAC,CAAA,EAAG,CAAA;AAAA,IACvF,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,EAAA,CAAG,iBAAA,EAAmB,CAAC,QAAA,KAAa;AAC3C,MAAA,MAAM,UAAU,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAK,QAAA,CAAS,CAAC,CAAA,GAA2B,MAAA;AAChF,MAAA,IAAI,OAAA,OAAc,IAAA,CAAK,EAAE,MAAM,iBAAA,EAAmB,QAAA,EAAUD,UAAAA,EAAW,OAAA,EAAS,CAAA;AAAA,gBACtE,IAAA,CAAK,EAAE,MAAM,YAAA,EAAc,QAAA,EAAUA,YAAW,CAAA;AAAA,IAC5D,CAAC,CAAA;AACD,IAAA,QAAA,CAAS,EAAA,CAAG,YAAA,EAAc,MAAM,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAUA,UAAAA,EAAW,CAAC,CAAA;AAAA,EACxF;AAAA,EAEA,MAAM,QAAQ,GAAA,EAA0C;AACtD,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,WAAA,CAAY,WAAA,CAAY,GAAG,CAAC,CAAA;AACxD,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAc,QAAA,EAAU,qBAAqB,CAAA;AACpE,IAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS,MAAM,IAAI,MAAM,qCAAqC,CAAA;AACnE,IAAA,MAAM,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU,GAAG,CAAA;AACpC,IAAA,MAAM,UAAUC,OAAAA,CAAO,MAAM,GAAA,CAAY,QAAA,EAAU,aAAa,CAAC,CAAA;AACjE,IAAA,OAAO,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,EACrD;AAAA,EAEA,MAAM,OAAA,GAAiC;AACrC,IAAA,MAAM,WAAW,MAAM,IAAA,CAAK,aAAY,CAAE,KAAA,CAAM,MAAM,IAAI,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAA,EAAU,OAAO,EAAC;AACvB,IAAA,MAAM,QAAA,GAAW,MAAM,GAAA,CAAc,QAAA,EAAU,cAAc,CAAA,CAAE,KAAA,CAAM,MAAM,EAAc,CAAA;AACzF,IAAA,MAAM,OAAA,GAAU,WAAW,CAAC,CAAA;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS,OAAO,EAAC;AACtB,IAAA,MAAM,OAAA,GAAUA,OAAAA,CAAO,MAAM,GAAA,CAAY,QAAA,EAAU,aAAa,CAAA,CAAE,KAAA,CAAM,MAAM,KAAK,CAAC,CAAA;AACpF,IAAA,OAAO,CAAC,IAAA,CAAK,YAAA,CAAa,QAAA,EAAU,OAAA,EAAS,OAAO,CAAC,CAAA;AAAA,EACvD;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,IAAA,CAAK,QAAA,EAAU,UAAA,EAAW,CAAE,MAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAChD,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AAAA,EACxB;AAAA,EAEA,MAAc,WAAA,CAAY,QAAA,EAA4B,GAAA,EAAoC;AACxF,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,IAAA,MAAM,SAAA,GAAY,SAAS,MAAA,CAAO,MAAA,CAAO,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,GAAA;AAC1D,IAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,SAAS,CAAA,IAAK,aAAa,CAAA,EAAG;AACnD,IAAA,MAAM,OAAA,GAAU,QAAA;AAAA,MACb,MAAM,IAAY,QAAA,EAAU,aAAa,EAAE,KAAA,CAAM,MAAM,KAAK,CAAA,IAAM,KAAA;AAAA,MACnE;AAAA,KACF;AACA,IAAA,IAAI,YAAY,SAAA,EAAW;AAC3B,IAAA,MAAM,GAAA,CAAI,QAAA,EAAU,4BAAA,EAA8B,CAAC,EAAE,OAAA,EAAS,CAAA,EAAA,EAAK,SAAA,CAAU,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,KAAA;AAAA,MAC9F,MAAM;AAAA,MAAC;AAAA,KACT;AAAA,EACF;AAAA,EAEQ,YAAA,CAAa,QAAA,EAA4B,OAAA,EAAiB,OAAA,EAA6B;AAC7F,IAAA,OAAO;AAAA,MACL,QAAA,EAAUD,UAAAA;AAAA,MACV,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,CAAI,IAAA,KACX,GAAA,CAAO,UAAU,IAAA,CAAK,MAAA,EAAQ,KAAK,MAAM,CAAA;AAAA,MAC3C,YAAY,MAAM;AAAA,MAAC,CAAA;AAAA;AAAA,MACnB,YAAY,YAAY;AACtB,QAAA,MAAM,QAAA,CAAS,UAAA,EAAW,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAC1C,QAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,QAAA,IAAA,CAAK,cAAA,GAAiB,KAAA;AACtB,QAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,YAAA,EAAc,QAAA,EAAUA,YAAW,CAAA;AAAA,MACvD;AAAA,KACF;AAAA,EACF;AACF,CAAA;AAEA,SAASC,QAAO,UAAA,EAA+C;AAC7D,EAAA,IAAI,CAAC,YAAY,OAAO,UAAA;AACxB,EAAA,MAAM,GAAA,GAAM,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA,GAAI,SAAS,UAAA,EAAY,EAAE,CAAA,GAAI,MAAA,CAAO,UAAU,CAAA;AACtF,EAAA,OAAO,UAAU,MAAA,CAAO,QAAA,CAAS,GAAG,CAAA,GAAI,MAAM,CAAC,CAAA,CAAA;AACjD;AAGA,SAAS,YAAY,GAAA,EAA2C;AAC9D,EAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,EAAA,MAAM,CAAA,GAAI,SAAS,MAAA,CAAO,MAAA,CAAO,MAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,GAAA;AAClD,EAAA,OAAO,MAAA,CAAO,SAAS,CAAC,CAAA,IAAK,IAAI,CAAA,GAAI,CAAC,CAAC,CAAA,GAAI,MAAA;AAC7C;;;AC1HO,IAAM,sBAAA,GAAqD;AAAA,EAChE,QAAA,EAAU,EAAC,QAAA,EAAS,aAAA,EAAc,UAAS,eAAA,EAAgB,WAAA,EAAY,8BAAA,EAA+B,OAAA,EAAQ,EAAC,KAAA,EAAM,qDAAA,EAAsD,SAAA,EAAU,6DAA2D,EAAC;AAAA,EACjP,KAAA,EAAO,EAAC,QAAA,EAAS,UAAA,EAAW,UAAS,YAAA,EAAa,WAAA,EAAY,iCAAA,EAAkC,OAAA,EAAQ,EAAC,KAAA,EAAM,qDAAA,EAAsD,SAAA,EAAU,4EAA0E,EAAC;AAAA,EAC1P,OAAA,EAAS,EAAC,QAAA,EAAS,YAAA,EAAa,UAAS,cAAA,EAAe,WAAA,EAAY,wBAAA,EAAyB,OAAA,EAAQ,EAAC,KAAA,EAAM,6EAAA,EAA8E,SAAA,EAAU,kIAAgI,EAAC;AAAA,EACrU,UAAU,EAAC,OAAA,EAAQ,EAAC,KAAA,EAAM,4EAA0E,EAAC;AAAA,EACrG,MAAA,EAAQ,EAAC,QAAA,EAAS,WAAA,EAAY,UAAS,aAAA,EAAc,WAAA,EAAY,gCAAA,EAAiC,OAAA,EAAQ,EAAC,KAAA,EAAM,yCAAA,EAA0C,SAAA,EAAU,+EAA6E,EAAC;AAAA,EACnP,WAAA,EAAa,EAAC,QAAA,EAAS,cAAA,EAAe,QAAA,EAAS,gBAAA,EAAiB,OAAA,EAAQ,EAAC,KAAA,EAAM,2DAAA,EAA4D,SAAA,EAAU,iEAAA,EAAiE,EAAC;AAAA,EACvN,aAAA,EAAe,EAAC,QAAA,EAAS,sBAAA,EAAuB,UAAS,wBAAA,EAAyB,WAAA,EAAY,qCAAA,EAAsC,OAAA,EAAQ,EAAC,KAAA,EAAM,qEAAA,EAAsE,SAAA,EAAU,yEAAuE,EAAC;AAAA,EAC3S,MAAA,EAAQ,EAAC,QAAA,EAAS,WAAA,EAAY,UAAS,aAAA,EAAc,WAAA,EAAY,yBAAA,EAA0B,OAAA,EAAQ,EAAC,KAAA,EAAM,yEAAA,EAA0E,SAAA,EAAU,mFAAiF,EAAC;AAAA,EAChR,OAAA,EAAS,EAAC,OAAA,EAAQ,EAAC,OAAM,kEAAA,EAAmE,SAAA,EAAU,mEAAiE,EAAC;AAAA,EACxK,GAAA,EAAK,EAAC,QAAA,EAAS,aAAA,EAAc,UAAS,gBAAA,EAAiB,WAAA,EAAY,2FAAA,EAA4F,OAAA,EAAQ,EAAC,KAAA,EAAM,uEAAA,EAAwE,SAAA,EAAU,mEAAiE,EAAC;AAAA,EAClU,SAAA,EAAW,EAAC,QAAA,EAAS,QAAA,EAAS,UAAS,UAAA,EAAW,WAAA,EAAY,uCAAA,EAAwC,OAAA,EAAQ,EAAC,KAAA,EAAM,iDAAA,EAAkD,SAAA,EAAU,iEAA+D,EAAC;AAAA,EACjP,MAAA,EAAQ,EAAC,QAAA,EAAS,eAAA,EAAgB,UAAS,iBAAA,EAAkB,WAAA,EAAY,+BAAA,EAAgC,OAAA,EAAQ,EAAC,KAAA,EAAM,iEAAA,EAAkE,SAAA,EAAU,kGAAgG,EAAC;AAAA,EACrS,OAAA,EAAS,EAAC,QAAA,EAAS,kBAAA,EAAmB,UAAS,oBAAA,EAAqB,WAAA,EAAY,4BAAA,EAA6B,OAAA,EAAQ,EAAC,KAAA,EAAM,wDAAA,EAAyD,SAAA,EAAU,mEAAiE,EAAC;AAAA,EACjQ,OAAA,EAAS,EAAC,QAAA,EAAS,cAAA,EAAe,QAAA,EAAS,gBAAA,EAAiB,OAAA,EAAQ,EAAC,KAAA,EAAM,qDAAA,EAAsD,SAAA,EAAU,4DAAA,EAA4D,EAAC;AAAA,EACxM,KAAA,EAAO,EAAC,QAAA,EAAS,gBAAA,EAAiB,UAAS,kBAAA,EAAmB,WAAA,EAAY,kCAAA,EAAmC,OAAA,EAAQ,EAAC,KAAA,EAAM,yDAAA,EAA0D,SAAA,EAAU,sEAAoE,EAAC;AAAA,EACrQ,MAAA,EAAQ,EAAC,QAAA,EAAS,WAAA,EAAY,UAAS,aAAA,EAAc,WAAA,EAAY,uBAAA,EAAwB,OAAA,EAAQ,EAAC,KAAA,EAAM,0DAAA,EAA2D,SAAA,EAAU,yFAAuF,EAAC;AAAA,EACrQ,OAAA,EAAS,EAAC,QAAA,EAAS,YAAA,EAAa,UAAS,cAAA,EAAe,WAAA,EAAY,sBAAA,EAAuB,OAAA,EAAQ,EAAC,KAAA,EAAM,mDAAA,EAAoD,SAAA,EAAU,qDAAmD,EAAC;AAAA,EAC5N,OAAA,EAAS,EAAC,QAAA,EAAS,oCAAA,EAAqC,UAAS,uCAAA,EAAwC,WAAA,EAAY,oDAAA,EAAqD,OAAA,EAAQ,EAAC,KAAA,EAAM,8DAAA,EAA+D,SAAA,EAAU,oEAAkE,EAAC;AAAA,EACrU,UAAA,EAAY,EAAC,QAAA,EAAS,eAAA,EAAgB,QAAA,EAAS,iBAAA,EAAkB,OAAA,EAAQ,EAAC,KAAA,EAAM,2CAAA,EAA4C,SAAA,EAAU,+DAAA,EAA+D,EAAC;AAAA,EACtM,MAAA,EAAQ,EAAC,QAAA,EAAS,iBAAA,EAAkB,QAAA,EAAS,mBAAA,EAAoB,OAAA,EAAQ,EAAC,KAAA,EAAM,0DAAA,EAA2D,SAAA,EAAU,+DAAA,EAA+D,EAAC;AAAA,EACrN,KAAA,EAAO,EAAC,QAAA,EAAS,YAAA,EAAa,UAAS,cAAA,EAAe,WAAA,EAAY,mBAAA,EAAoB,OAAA,EAAQ,EAAC,KAAA,EAAM,mEAAA,EAAoE,SAAA,EAAU,qEAAmE,EAAC;AAAA,EACvP,IAAA,EAAM,EAAC,QAAA,EAAS,eAAA,EAAgB,UAAS,iBAAA,EAAkB,WAAA,EAAY,+BAAA,EAAgC,OAAA,EAAQ,EAAC,KAAA,EAAM,wDAAA,EAAyD,SAAA,EAAU,wEAAsE,EAAC;AAAA,EAChQ,MAAA,EAAQ,EAAC,QAAA,EAAS,WAAA,EAAY,UAAS,aAAA,EAAc,WAAA,EAAY,4BAAA,EAA6B,OAAA,EAAQ,EAAC,KAAA,EAAM,yCAAA,EAA0C,SAAA,EAAU,2CAAyC;AAC5M,CAAA;;;AChBO,IAAM,oBAAA,GAAmD,sBAAA;;;ACXzD,SAAS,QAAA,GAAoB;AAClC,EAAA,IAAI,OAAO,SAAA,KAAc,WAAA,EAAa,OAAO,KAAA;AAC7C,EAAA,MAAM,EAAA,GAAK,UAAU,SAAA,IAAa,EAAA;AAClC,EAAA,MAAM,YAAA,GACH,SAAA,CAAuD,aAAA,EAAe,MAAA,IAAU,KAAA;AACnF,EAAA,OAAO,2BAAA,CAA4B,IAAA,CAAK,EAAE,CAAA,IAAK,YAAA;AACjD;AAEA,SAAS,SAAA,CAAU,MAAc,GAAA,EAAqB;AACpD,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,GAAA;AACvC,EAAA,OAAO,GAAG,IAAI,CAAA,EAAG,GAAG,CAAA,IAAA,EAAO,kBAAA,CAAmB,GAAG,CAAC,CAAA,CAAA;AACpD;AAOO,SAAS,UAAA,CAAW,MAAkB,GAAA,EAAmB;AAC9D,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,KAAK,SAAA,EAAW;AAClB,IAAA,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,SAAA,EAAW,GAAG,GAAG,IAAI,CAAA;AAAA,EAC/C,CAAA,MAAA,IAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,QAAA,CAAS,SAAA,CAAU,IAAA,CAAK,MAAA,EAAQ,GAAG,GAAG,KAAK,CAAA;AAAA,EAC7C;AACF;AAMO,SAAS,cAAc,IAAA,EAAwB;AACpD,EAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,EAAA,IAAI,CAAC,KAAK,MAAA,EAAQ;AAClB,EAAA,QAAA,CAAS,IAAA,CAAK,QAAQ,KAAK,CAAA;AAC7B;AAEA,SAAS,QAAA,CAAS,MAAc,UAAA,EAA2B;AACzD,EAAA,MAAM,CAAA,GAAI,QAAA,CAAS,aAAA,CAAc,GAAG,CAAA;AACpC,EAAA,CAAA,CAAE,IAAA,GAAO,IAAA;AACT,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,CAAA,CAAE,MAAA,GAAS,QAAA;AACX,IAAA,CAAA,CAAE,GAAA,GAAM,qBAAA;AAAA,EACV;AACA,EAAA,CAAA,CAAE,MAAM,OAAA,GAAU,MAAA;AAClB,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC3B,EAAA,CAAA,CAAE,KAAA,EAAM;AACR,EAAA,QAAA,CAAS,IAAA,CAAK,YAAY,CAAC,CAAA;AAC7B;AAGO,SAAS,cAAc,SAAA,EAAqC;AACjE,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,OAAA,CAAQ,QAAQ,KAAK,CAAA;AACjE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9B,IAAA,IAAI,IAAA,GAAO,KAAA;AACX,IAAA,MAAM,MAAA,GAAS,CAAC,MAAA,KAAoB;AAClC,MAAA,IAAI,IAAA,EAAM;AACV,MAAA,IAAA,GAAO,IAAA;AACP,MAAA,QAAA,CAAS,mBAAA,CAAoB,oBAAoB,YAAY,CAAA;AAC7D,MAAA,MAAA,CAAO,mBAAA,CAAoB,YAAY,UAAU,CAAA;AACjD,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,CAAA;AACA,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,IAAI,QAAA,CAAS,MAAA,EAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,IAClC,CAAA;AACA,IAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CAAO,IAAI,CAAA;AACpC,IAAA,QAAA,CAAS,gBAAA,CAAiB,oBAAoB,YAAY,CAAA;AAC1D,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,UAAU,CAAA;AAC9C,IAAA,MAAM,QAAQ,UAAA,CAAW,MAAM,MAAA,CAAO,KAAK,GAAG,SAAS,CAAA;AAAA,EACzD,CAAC,CAAA;AACH;;;AChEA,IAAM,WAAA,GAAc,yBAAA;AASb,IAAM,sBAAA,GAAN,cAAqC,aAAA,CAAc;AAAA,EAUxD,WAAA,CACU,KACA,OAAA,EACR;AACA,IAAA,KAAA,EAAM;AAHE,IAAA,IAAA,CAAA,GAAA,GAAA,GAAA;AACA,IAAA,IAAA,CAAA,OAAA,GAAA,OAAA;AAXV,IAAA,IAAA,CAAS,IAAA,GAAO,eAAA;AAChB,IAAA,IAAA,CAAS,YAA+B,EAAC;AAEzC;AAAA,IAAA,IAAA,CAAQ,MAAA,GAA4B,IAAA;AAEpC,IAAA,IAAA,CAAQ,MAAA,uBAAa,GAAA,EAAoB;AACzC,IAAA,IAAA,CAAQ,IAAA,GAA8C,IAAA;AACtD,IAAA,IAAA,CAAQ,OAAA,GAAgC,IAAA;AAOtC,IAAA,IAAA,CAAK,KAAA,GAAQ,EAAE,GAAG,oBAAA,EAAsB,GAAI,OAAA,CAAQ,WAAA,IAAe,EAAC,EAAG;AAAA,EACzE;AAAA,EAEA,WAAA,GAAuB;AACrB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAc,SAAA,GAAiC;AAC7C,IAAA,IAAI,IAAA,CAAK,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAA;AAC7B,IAAA,MAAM,MAAA,GAAS,MAAMC,2BAAA,CAAW,IAAA,CAAK;AAAA,MACnC,SAAA,EAAW,KAAK,OAAA,CAAQ,SAAA;AAAA,MACxB,QAAA,EAAU;AAAA,QACR,IAAA,EAAM,KAAK,GAAA,CAAI,OAAA;AAAA,QACf,WAAA,EAAa,IAAA,CAAK,GAAA,CAAI,WAAA,IAAe,KAAK,GAAA,CAAI,OAAA;AAAA,QAC9C,KAAK,SAAA,EAAU;AAAA,QACf,KAAA,EAAO,KAAK,GAAA,CAAI,IAAA,GAAO,CAAC,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,GAAI;AAAC,OAC5C;AAAA,MACA,QAAA,EAAU,KAAK,OAAA,CAAQ;AAAA,KACxB,CAAA;AAED,IAAA,MAAA,CAAO,EAAA,CAAG,gBAAA,EAAkB,CAAC,EAAE,OAAM,KAAM;AACzC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAC1C,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAC3B,MAAA,IAAA,CAAK,OAAA,EAAQ;AACb,MAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,UAAU,CAAA;AAAA,IAC5C,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,GAAG,eAAA,EAAiB,CAAC,EAAE,KAAA,EAAO,QAAO,KAAM;AAChD,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,cAAA,CAAe,KAAK,CAAA;AAC1C,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,MAAM,EAAE,IAAA,EAAM,IAAA,EAAK,GAAI,MAAA,CAAO,KAAA;AAC9B,MAAA,IAAI,SAAS,cAAA,EAAgB;AAC3B,QAAA,MAAM,OAAA,GACJ,OAAO,IAAA,KAAS,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,GAAO,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,CAAC,CAAA,CAAA;AAChF,QAAA,IAAA,CAAK,KAAK,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,SAAS,CAAA;AAAA,MACvD,CAAA,MAAA,IAAW,SAAS,iBAAA,IAAqB,KAAA,CAAM,QAAQ,IAAI,CAAA,IAAK,IAAA,CAAK,CAAC,CAAA,EAAG;AACvE,QAAA,MAAM,OAAA,GAAU,MAAA,CAAO,IAAA,CAAK,CAAC,CAAC,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,EAAI,IAAK,EAAA;AACpD,QAAA,IAAI,OAAA,OAAc,IAAA,CAAK,EAAE,MAAM,iBAAA,EAAmB,QAAA,EAAU,SAAS,CAAA;AAAA,MACvE;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,IAAA,EAAK;AACV,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA,EAGA,MAAc,MAAA,GAAwB;AACpC,IAAA,IAAI,KAAK,IAAA,EAAM;AACf,IAAA,IAAI,IAAA,CAAK,OAAA,EAAS,OAAO,IAAA,CAAK,OAAA;AAC9B,IAAA,IAAA,CAAK,WAAW,YAAY;AAC1B,MAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,MAAA,MAAM,EAAE,OAAO,GAAA,EAAI,GAAI,MAAM,MAAA,CAAO,IAAA,CAAK,QAAQ,MAAA,EAAO;AACxD,MAAA,IAAA,CAAK,IAAA,GAAO,EAAE,KAAA,EAAO,GAAA,EAAI;AACzB,MAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AAAA,IACjB,CAAA,GAAG;AACH,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,EACd;AAAA,EAEA,MAAM,QAAQ,GAAA,EAA0C;AACtD,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AAEpC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,QAAA,CAAS,MAAA,EAAQ,GAAG,CAAA;AACxC,IAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,EAAM,MAAM,KAAK,MAAA,EAAO;AAClC,IAAA,MAAM,OAAO,IAAA,CAAK,IAAA;AAClB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAI,CAAC,IAAA,EAAM,MAAM,IAAI,MAAM,wCAAwC,CAAA;AAEnE,IAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,aAAA,EAAe,QAAA,EAAU,IAAI,QAAA,EAAU,GAAA,EAAK,IAAA,CAAK,GAAA,EAAK,CAAA;AAExE,IAAA,IAAI,UAAS,EAAG;AACd,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,QAAQ,CAAA;AACpC,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,UAAA,CAAW,IAAA,EAAM,KAAK,GAAG,CAAA;AACzB,QAAA,KAAK,aAAA,CAAc,KAAK,OAAA,CAAQ,aAAA,IAAiB,GAAI,CAAA,CAAE,IAAA,CAAK,CAAC,MAAA,KAAW;AACtE,UAAA,IAAI,CAAC,MAAA,EAAQ,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,oBAAA,EAAsB,QAAA,EAAU,GAAA,CAAI,QAAA,EAAU,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,QAC9F,CAAC,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,MAAM,OAAO,OAAA,CAAQ;AAAA,MACxC,cAAc,IAAA,CAAK,KAAA;AAAA,MACnB,kBAAA,EAAoB,EAAE,CAAC,GAAA,CAAI,UAAU,IAAI,GAAG,GAAA,CAAI,SAAA,CAAU,KAAA;AAAM,KACjE,CAAA;AAED,IAAA,MAAM,UAAU,MAAM,UAAA,CAAW,UAAS,EAAG,GAAA,CAAI,QAAQ,MAAM;AAC7D,MAAA,KAAK,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,MAAC,CAAC,CAAA;AAAA,IAC3E,CAAC,CAAA;AAED,IAAA,KAAK,KAAK,MAAA,EAAO;AAEjB,IAAA,MAAM,UAAA,GAAa,KAAK,YAAA,CAAa,MAAA,EAAQ,IAAI,QAAA,EAAU,OAAA,EAAS,IAAI,SAAS,CAAA;AACjF,IAAA,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,QAAA,EAAU,QAAQ,KAAK,CAAA;AAC3C,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,OAAO,UAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,GAAiC;AACrC,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,CAAK,SAAA,EAAU;AACpC,IAAA,MAAM,MAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,CAAC,UAAU,KAAK,CAAA,IAAK,CAAC,GAAG,IAAA,CAAK,MAAM,CAAA,EAAG;AAChD,MAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAC9C,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAC3B,QAAA;AAAA,MACF;AACA,MAAA,MAAM,EAAA,GAAK,eAAe,OAAO,CAAA;AACjC,MAAA,IAAI,EAAA,MAAQ,IAAA,CAAK,IAAA,CAAK,aAAa,MAAA,EAAQ,QAAA,EAAU,OAAA,EAAS,EAAE,CAAC,CAAA;AAAA,IACnE;AACA,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,OAAO,GAAA;AAAA,EACT;AAAA,EAEA,MAAM,KAAA,GAAuB;AAC3B,IAAA,MAAM,SAAS,IAAA,CAAK,MAAA;AACpB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAM,OAAA,CAAQ,UAAA;AAAA,QACZ,OAAO,OAAA,CACJ,MAAA,GACA,GAAA,CAAI,CAAC,MAAM,MAAA,CAAO,UAAA,CAAW,EAAE,KAAA,EAAO,EAAE,KAAA,EAAO,MAAA,EAAQC,kBAAY,mBAAmB,CAAA,EAAG,CAAC;AAAA,OAC/F;AAAA,IACF;AACA,IAAA,IAAA,CAAK,OAAO,KAAA,EAAM;AAClB,IAAA,IAAA,CAAK,OAAA,EAAQ;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AAAA;AAAA,EAIQ,QAAA,CAAS,QAAoB,GAAA,EAAwC;AAC3E,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,CAAO,GAAA,CAAI,IAAI,QAAQ,CAAA;AAC1C,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,WAAA,CAAY,MAAA,EAAQ,KAAK,CAAA;AAC9C,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAA,CAAK,MAAA,CAAO,MAAA,CAAO,GAAA,CAAI,QAAQ,CAAA;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,UAAA,CAAW,GAAA,CAAI,UAAU,IAAI,CAAA;AAChD,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AAC7C,IAAA,IAAI,CAAC,MAAO,MAAA,IAAU,CAAC,GAAG,MAAA,EAAQ,QAAA,CAAS,MAAM,CAAA,EAAI,OAAO,IAAA;AAC5D,IAAA,OAAO,KAAK,YAAA,CAAa,MAAA,EAAQ,IAAI,QAAA,EAAU,OAAA,EAAS,IAAI,SAAS,CAAA;AAAA,EACvE;AAAA,EAEQ,YAAA,CACN,MAAA,EACA,QAAA,EACA,OAAA,EACA,SAAA,EACY;AACZ,IAAA,MAAM,EAAA,GAAK,OAAA,CAAQ,UAAA,CAAW,SAAA,CAAU,IAAI,CAAA;AAC5C,IAAA,MAAM,OAAA,GAAA,CACH,IAAI,QAAA,IAAY,IAAI,GAAA,CAAI,CAAC,MAAM,CAAA,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,KAAmB,CAAC,CAAC,CAAC,CAAA,IAAK,EAAA;AACpF,IAAA,MAAM,OAAA,GACJ,EAAA,EAAI,MAAA,GAAS,CAAC,CAAA,KACb,IAAI,QAAA,GAAW,CAAC,CAAA,GAAI,EAAA,CAAG,QAAA,CAAS,CAAC,EAAE,KAAA,CAAM,GAAG,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,GAAI,CAAA,EAAG,SAAA,CAAU,IAAI,CAAA,EAAA,CAAA,CAAA;AAC1F,IAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA;AACtB,IAAA,OAAO;AAAA,MACL,QAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA,EAAS,CAAI,IAAA,KACX,MAAA,CAAO,OAAA,CAAW;AAAA,QAChB,KAAA;AAAA,QACA,OAAA;AAAA,QACA,SAAS,EAAE,MAAA,EAAQ,KAAK,MAAA,EAAQ,MAAA,EAAQ,KAAK,MAAA;AAAgB,OAC9D,CAAA;AAAA,MACH,YAAY,MAAM;AAChB,QAAA,IAAI,CAAC,UAAS,EAAG;AACjB,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAA;AAChC,QAAA,IAAI,IAAA,gBAAoB,IAAI,CAAA;AAAA,MAC9B,CAAA;AAAA,MACA,YAAY,YAAY;AACtB,QAAA,MAAM,MAAA,CAAO,UAAA,CAAW,EAAE,KAAA,EAAO,MAAA,EAAQA,iBAAA,CAAY,mBAAmB,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAC3F,QAAA,IAAA,CAAK,MAAA,CAAO,OAAO,QAAQ,CAAA;AAC3B,QAAA,IAAA,CAAK,OAAA,EAAQ;AACb,QAAA,IAAA,CAAK,IAAA,CAAK,EAAE,IAAA,EAAM,YAAA,EAAc,UAAU,CAAA;AAAA,MAC5C;AAAA,KACF;AAAA,EACF;AAAA,EAEQ,WAAA,CAAY,QAAoB,KAAA,EAAgD;AACtF,IAAA,IAAI;AACF,MAAA,OAAO,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA;AAAA,IACjC,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,eAAe,KAAA,EAA8B;AACnD,IAAA,KAAA,MAAW,CAAC,UAAU,CAAC,CAAA,IAAK,KAAK,MAAA,EAAQ,IAAI,CAAA,KAAM,KAAA,EAAO,OAAO,QAAA;AACjE,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEQ,OAAA,GAAgB;AACtB,IAAA,IAAI;AACF,MAAA,YAAA,CAAa,OAAA,CAAQ,aAAa,IAAA,CAAK,SAAA,CAAU,CAAC,GAAG,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA;AAAA,IACpE,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAAA,EAEQ,IAAA,GAAa;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,GAAA,GAAM,YAAA,CAAa,OAAA,CAAQ,WAAW,CAAA;AAC5C,MAAA,IAAI,GAAA,OAAU,MAAA,GAAS,IAAI,IAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAA4B,CAAA;AAAA,IAC3E,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACF,CAAA;AAEA,SAAS,eAAe,OAAA,EAAoD;AAC1E,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,UAAU,EAAE,CAAC,CAAA;AAC9C,EAAA,IAAI,CAAC,MAAM,OAAO,IAAA;AAClB,EAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,UAAA,CAAW,IAAI,CAAA;AACjC,EAAA,IAAI,CAAC,GAAG,OAAO,IAAA;AACf,EAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,EAAE,MAAA,EAAQ,CAAA,CAAE,MAAA,EAAQ,OAAA,EAAS,CAAA,CAAE,OAAA,EAAS,MAAA,EAAQ,CAAA,CAAE,QAAO,EAAE;AACnF;AAEA,SAAS,UAAA,CACP,OAAA,EACA,MAAA,EACA,OAAA,EACY;AACZ,EAAA,IAAI,CAAC,QAAQ,OAAO,OAAA;AACpB,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAA,EAAQ;AACR,IAAA,OAAO,QAAQ,MAAA,CAAO,IAAI,YAAA,CAAa,SAAA,EAAW,YAAY,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,IAAI,OAAA,CAAW,CAAC,OAAA,EAAS,MAAA,KAAW;AACzC,IAAA,MAAM,eAAe,MAAM;AACzB,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA,CAAO,IAAI,YAAA,CAAa,SAAA,EAAW,YAAY,CAAC,CAAA;AAAA,IAClD,CAAA;AACA,IAAA,MAAA,CAAO,iBAAiB,OAAA,EAAS,YAAA,EAAc,EAAE,IAAA,EAAM,MAAM,CAAA;AAC7D,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN,CAAC,CAAA,KAAM;AACL,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAChD,QAAA,OAAA,CAAQ,CAAC,CAAA;AAAA,MACX,CAAA;AAAA,MACA,CAAC,CAAA,KAAM;AACL,QAAA,MAAA,CAAO,mBAAA,CAAoB,SAAS,YAAY,CAAA;AAChD,QAAA,MAAA,CAAO,CAAC,CAAA;AAAA,MACV;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;;;ACtQA,SAAS,iBAAiB,MAAA,EAA0C;AAClE,EAAA,MAAM,GAAA,GAAiB;AAAA,IACrB,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,aAAa,MAAA,CAAO;AAAA,GACtB;AACA,EAAA,OAAO;AAAA,IACL,IAAI,kBAAkB,GAAG,CAAA;AAAA,IACzB,IAAI,kBAAkB,GAAG,CAAA;AAAA,IACzB,IAAI,sBAAA,CAAuB,GAAA,EAAK,EAAE,SAAA,EAAW,MAAA,CAAO,wBAAwB;AAAA,GAC9E;AACF;AAOO,IAAM,gBAAN,MAAoB;AAAA,EAGzB,YAAY,MAAA,EAA6B;AACvC,IAAA,IAAA,CAAK,OAAA,GAAU,IAAI,cAAA,CAAe,gBAAA,CAAiB,MAAM,CAAC,CAAA;AAAA,EAC5D;AAAA,EAEA,IAAA,GAAsB;AACpB,IAAA,OAAO,IAAA,CAAK,QAAQ,IAAA,EAAK;AAAA,EAC3B;AAAA,EAEA,MAAM,QAAQ,KAAA,EAA0C;AACtD,IAAA,IAAI,KAAA,CAAM,OAAA,KAAY,MAAA,IAAa,KAAA,CAAM,YAAY,IAAA,EAAM;AACzD,MAAA,MAAM,IAAI,MAAM,6EAA6E,CAAA;AAAA,IAC/F;AACA,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,CAAQ;AAAA,MAC1B,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,SAAA,EAAW,cAAA,CAAe,KAAA,CAAM,OAAO,CAAA;AAAA,MACvC,QAAQ,KAAA,CAAM;AAAA,KACf,CAAA;AAAA,EACH;AAAA,EAEA,OAAA,GAAiC;AAC/B,IAAA,OAAO,IAAA,CAAK,QAAQ,OAAA,EAAQ;AAAA,EAC9B;AAAA,EAEA,WAAW,QAAA,EAAkC;AAC3C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,UAAA,CAAW,QAAQ,CAAA;AAAA,EACzC;AAAA,EAEA,KAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAK,QAAQ,KAAA,EAAM;AAAA,EAC5B;AAAA,EAEA,IAAI,QAAA,EAA0C;AAC5C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA;AAAA,EAClC;AAAA,EAEA,GAAG,OAAA,EAAgD;AACjD,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,EAAA,CAAG,OAAO,CAAA;AAAA,EAChC;AACF","file":"index.cjs","sourcesContent":["import type { Connector, ConnectRequest } from './connector';\nimport type { Connection, LydianConnectEvent, LydianConnectEventHandler } from './types';\n\n/**\n * Routing engine: takes a flat list of connectors, auto-detects the fallback\n * (the connector with no claimed walletIds), routes each walletId to its\n * connector, and forwards events. Internal — the host app uses `LydianConnect`.\n */\nexport class ConnectManager {\n private byWallet = new Map<string, Connector>();\n private fallback: Connector;\n private all: Connector[];\n private connections = new Map<string, Connection>();\n private handlers = new Set<LydianConnectEventHandler>();\n private unsubs: Array<() => void> = [];\n private started = false;\n\n constructor(connectors: Connector[]) {\n const fallbacks = connectors.filter((c) => c.walletIds.length === 0);\n if (fallbacks.length !== 1) {\n throw new Error(\n `LydianConnect requires exactly one fallback connector (empty walletIds); found ${fallbacks.length}`,\n );\n }\n this.fallback = fallbacks[0]!;\n this.all = connectors;\n for (const connector of connectors) {\n for (const id of connector.walletIds) this.byWallet.set(id, connector);\n }\n }\n\n /** Wire connector event forwarding, once. */\n async init(): Promise<void> {\n if (this.started) return;\n this.started = true;\n for (const connector of this.all) {\n this.unsubs.push(connector.on((event) => this.handle(event)));\n }\n }\n\n /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */\n private resolve(walletId: string): Connector {\n return this.byWallet.get(walletId) ?? this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connection = await this.resolve(req.walletId).connect(req);\n this.connections.set(req.walletId, connection);\n this.emit({ type: 'connect', walletId: req.walletId, connection });\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n if (!this.started) await this.init();\n const restored: Connection[] = [];\n for (const connector of this.all) {\n const conns = await connector.restore().catch(() => [] as Connection[]);\n for (const conn of conns) {\n this.connections.set(conn.walletId, conn);\n restored.push(conn);\n }\n }\n return restored;\n }\n\n get(walletId: string): Connection | undefined {\n return this.connections.get(walletId);\n }\n\n async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections.get(walletId)?.disconnect().catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled([...this.connections.values()].map((c) => c.disconnect()));\n this.connections.clear();\n }\n\n async reset(): Promise<void> {\n await this.disconnect();\n await Promise.allSettled(this.all.map((c) => c.reset()));\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n private handle(event: LydianConnectEvent): void {\n if (event.type === 'disconnect') this.connections.delete(event.walletId);\n this.emit(event);\n }\n\n private emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","import type { CaipNamespace } from './types';\n\n// Sensible defaults for an EVM payment flow. Internalized so the host app\n// never hand-builds a namespace — it only chooses a chain.\nconst DEFAULT_EVM_METHODS = [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n];\nconst DEFAULT_EVM_EVENTS = ['chainChanged', 'accountsChanged'];\n\n/**\n * Build a CAIP namespace from a chain id.\n * EVM-only for now: a number maps to `eip155:<n>`, and a CAIP-2 string must be\n * `eip155:<reference>`. Non-EVM namespaces (e.g. `solana:…`) would branch here\n * with their own methods/events when that support is added; until then we throw\n * rather than silently apply EVM defaults to a chain that can't use them.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n if (name !== 'eip155' || !reference || !/^\\d+$/.test(reference) || Number(reference) <= 0) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect is EVM-only for now — pass a positive number or an \"eip155:<id>\" string.`,\n );\n }\n return {\n name,\n value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS },\n };\n}\n","import type {\n CaipNamespace,\n Connection,\n ConnectorType,\n LydianConnectEvent,\n LydianConnectEventHandler,\n} from './types';\n\nexport interface ConnectRequest {\n walletId: string;\n namespace: CaipNamespace;\n /** Cancel a pending connection (replaces the host app's manual cancel plumbing). */\n signal?: AbortSignal;\n}\n\n/**\n * Internal contract every connector implements. The host app never sees this —\n * it only ever touches {@link LydianConnect} and the {@link Connection} handle.\n */\nexport interface Connector {\n readonly type: ConnectorType;\n /**\n * Wallet ids this connector natively serves. The WalletConnect fallback\n * returns an empty list and claims any wallet not served by another connector.\n */\n readonly walletIds: readonly string[];\n isAvailable(walletId: string): boolean | Promise<boolean>;\n connect(req: ConnectRequest): Promise<Connection>;\n /** Rebuild Connections for still-live sessions — the reconnect-on-reload case. */\n restore(): Promise<Connection[]>;\n /** Tear down everything this connector owns. */\n reset(): Promise<void>;\n on(handler: LydianConnectEventHandler): () => void;\n}\n\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\n\n async restore(): Promise<Connection[]> {\n return [];\n }\n\n async reset(): Promise<void> {\n /* no-op by default */\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n protected emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","/** Shared app identity passed to every connector; mapped to each SDK's own shape internally. */\nexport interface AppConfig {\n /** Display name shown in the wallet's connect prompt. */\n appName: string;\n /** Optional icon shown in the wallet's connect prompt. */\n icon?: string;\n /** Optional description; defaults to appName. */\n description?: string;\n}\n\n/**\n * The dapp URL, derived from the page origin at connect-time (always client-side).\n * Returns '' during SSR — connectors only read this when initializing their SDK,\n * which never happens on the server.\n */\nexport function deriveUrl(): string {\n return typeof window !== 'undefined' ? window.location.origin : '';\n}\n","import type { MetaMaskSDK as MetaMaskSDKType, MetaMaskSDKOptions } from '@metamask/sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\n\n/** The provider type MetaMaskSDK.getProvider() returns, without depending on a named export. */\ntype MetaMaskProvider = NonNullable<ReturnType<MetaMaskSDKType['getProvider']>>;\n\nconst WALLET_ID = 'metamask';\n\nexport class MetaMaskConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private sdk: MetaMaskSDKType | null = null;\n private provider: MetaMaskProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers desktop (extension) and mobile (deep-link) itself\n }\n\n private async getProvider(): Promise<MetaMaskProvider> {\n if (this.provider) return this.provider;\n const { MetaMaskSDK } = await import('@metamask/sdk'); // value import — code-split, loaded on demand\n const dappMetadata: MetaMaskSDKOptions['dappMetadata'] = {\n name: this.app.appName,\n url: deriveUrl(),\n ...(this.app.icon ? { iconUrl: this.app.icon } : {}),\n };\n const sdk = new MetaMaskSDK({ dappMetadata });\n await sdk.init();\n const provider = sdk.getProvider();\n if (!provider) throw new Error('MetaMask provider unavailable');\n this.sdk = sdk;\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: MetaMaskProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider();\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const account = accounts?.[0];\n if (!account) throw new Error('MetaMask returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await provider.request<string>({ method: 'eth_chainId' }));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider.request<string[]>({ method: 'eth_accounts' }).catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x1'),\n );\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n }\n\n /** Best-effort switch to the requested chain; leaves the wallet as-is if it's unknown to it. */\n private async ensureChain(provider: MetaMaskProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0]; // \"eip155:137\"\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await provider\n .request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${wantedNum.toString(16)}` }],\n })\n .catch(() => {\n /* chain not added to the wallet — the caller's chainChanged will reflect reality */\n });\n }\n\n private toConnection(provider: MetaMaskProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: async <T>(args: { method: string; params?: unknown }) =>\n (await provider.request<T>({ method: args.method, params: args.params as never })) as T,\n openWallet: () => {}, // MetaMask SDK foregrounds the wallet on request\n disconnect: async () => {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from '@coinbase/wallet-sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport type { AppConfig } from '../../core/app';\n\ntype CoinbaseProvider = NonNullable<ReturnType<CoinbaseWalletSDKType['makeWeb3Provider']>>;\ntype RequestArgs = Parameters<CoinbaseProvider['request']>[0];\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(provider: CoinbaseProvider, method: string, params?: unknown): Promise<T> {\n return provider.request({ method, params } as unknown as RequestArgs) as Promise<T>;\n}\n\nconst WALLET_ID = 'coinbase';\n\nexport class CoinbaseConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private provider: CoinbaseProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers extension + mobile deep-link itself\n }\n\n private async getProvider(appChainIds?: number[]): Promise<CoinbaseProvider> {\n if (this.provider) return this.provider;\n const { CoinbaseWalletSDK } = await import('@coinbase/wallet-sdk'); // lazy — code-split\n const sdk = new CoinbaseWalletSDK({\n appName: this.app.appName,\n appLogoUrl: this.app.icon,\n appChainIds, // one-time SDK-init hint; ensureChain enforces the actual chain per connect\n });\n const provider = sdk.makeWeb3Provider();\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: CoinbaseProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider(evmChainIds(req));\n const accounts = await rpc<string[]>(provider, 'eth_requestAccounts');\n const account = accounts?.[0];\n if (!account) throw new Error('Coinbase Wallet returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await rpc<string[]>(provider, 'eth_accounts').catch(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.provider?.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n }\n\n private async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n rpc<T>(provider, args.method, args.params),\n openWallet: () => {}, // Coinbase SDK foregrounds the wallet on request\n disconnect: async () => {\n await provider.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n\n/** The numeric EVM chain id the connect targets, for Coinbase's appChainIds hint. */\nfunction evmChainIds(req: ConnectRequest): number[] | undefined {\n const wanted = req.namespace.value.chains?.[0];\n const n = wanted ? Number(wanted.split(':')[1]) : NaN;\n return Number.isFinite(n) && n > 0 ? [n] : undefined;\n}\n","// AUTO-GENERATED by scripts/build-wallet-links.mjs — do not edit by hand.\n// Refresh: WC_PROJECT_ID=<projectId> node scripts/build-wallet-links.mjs\n// Source: WalletConnect explorer API (explorer-api.walletconnect.com/v3/wallets)\nimport type { WalletLink } from './registry';\n\nexport const GENERATED_WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okex://main\",\"scheme\":\"okex://main/wc\",\"universal\":\"https://www.okx.com/download?appendQuery=true&deeplink=okx://web3/wallet/walletConnect/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"dfw://\",\"scheme\":\"dfw://wc\",\"universal\":\"https://wallet.crypto.com/deeplink/wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\n};\n","import { GENERATED_WALLET_LINKS } from './wallet-links.generated';\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okex://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". */\n scheme?: string;\n /** Universal/applink incl. the `wc` path, preferred on mobile (OS falls back to the store). */\n universal?: string;\n /** App store links — used for the \"wallet not installed\" fallback. */\n store?: { ios?: string; android?: string };\n}\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = GENERATED_WALLET_LINKS;\n","import type { WalletLink } from './registry';\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const uaDataMobile =\n (navigator as { userAgentData?: { mobile?: boolean } }).userAgentData?.mobile ?? false;\n return /iPhone|iPad|iPod|Android/i.test(ua) || uaDataMobile;\n}\n\nfunction buildLink(base: string, uri: string): string {\n const sep = base.includes('?') ? '&' : '?';\n return `${base}${sep}uri=${encodeURIComponent(uri)}`;\n}\n\n/**\n * Fire from WITHIN a user gesture. Universal link first (OS shows the App Store\n * if the wallet isn't installed) opened in a throwaway context so the checkout\n * page is never replaced in history; custom scheme as the fallback.\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.universal) {\n openHref(buildLink(link.universal, uri), true);\n } else if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n }\n}\n\n/**\n * Bring the wallet app to the foreground (no WC URI) — for an approval the user\n * must return to the wallet for. Uses the bare `native` scheme; call within a gesture.\n */\nexport function openWalletApp(link: WalletLink): void {\n if (typeof document === 'undefined') return;\n if (!link.native) return;\n openHref(link.native, false);\n}\n\nfunction openHref(href: string, newContext: boolean): void {\n const a = document.createElement('a');\n a.href = href;\n if (newContext) {\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n }\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/** Resolves true if the page was backgrounded (wallet likely opened) within the window. */\nexport function detectAppOpen(timeoutMs: number): Promise<boolean> {\n if (typeof document === 'undefined') return Promise.resolve(false);\n return new Promise((resolve) => {\n let done = false;\n const finish = (opened: boolean) => {\n if (done) return;\n done = true;\n document.removeEventListener('visibilitychange', onVisibility);\n window.removeEventListener('pagehide', onPageHide);\n clearTimeout(timer);\n resolve(opened);\n };\n const onVisibility = () => {\n if (document.hidden) finish(true);\n };\n const onPageHide = () => finish(true);\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('pagehide', onPageHide);\n const timer = setTimeout(() => finish(false), timeoutMs);\n });\n}\n","import SignClient from '@walletconnect/sign-client';\nimport { getSdkError } from '@walletconnect/utils';\nimport type { SessionTypes } from '@walletconnect/types';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { CaipNamespace, Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\nimport { DEFAULT_WALLET_LINKS, type WalletLink } from './registry';\nimport { detectAppOpen, isMobile, openWallet, openWalletApp } from './deeplink';\n\nconst STORAGE_KEY = 'lydianconnect.wc.topics'; // walletId -> session topic\n\nexport interface WalletConnectOptions {\n projectId: string;\n relayUrl?: string;\n walletLinks?: Record<string, WalletLink>;\n openTimeoutMs?: number;\n}\n\nexport class WalletConnectConnector extends BaseConnector {\n readonly type = 'walletconnect' as const;\n readonly walletIds: readonly string[] = []; // claims any wallet not served by an SDK connector\n\n private client: SignClient | null = null;\n private links: Record<string, WalletLink>;\n private topics = new Map<string, string>();\n private warm: { topic: string; uri: string } | null = null;\n private warming: Promise<void> | null = null;\n\n constructor(\n private app: AppConfig,\n private options: WalletConnectOptions,\n ) {\n super();\n this.links = { ...DEFAULT_WALLET_LINKS, ...(options.walletLinks ?? {}) };\n }\n\n isAvailable(): boolean {\n return true;\n }\n\n private async getClient(): Promise<SignClient> {\n if (this.client) return this.client;\n const client = await SignClient.init({\n projectId: this.options.projectId,\n metadata: {\n name: this.app.appName,\n description: this.app.description ?? this.app.appName,\n url: deriveUrl(),\n icons: this.app.icon ? [this.app.icon] : [],\n },\n relayUrl: this.options.relayUrl,\n });\n\n client.on('session_delete', ({ topic }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n });\n\n client.on('session_event', ({ topic, params }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n const { name, data } = params.event;\n if (name === 'chainChanged') {\n const chainId =\n typeof data === 'string' && data.includes(':') ? data : `eip155:${String(data)}`;\n this.emit({ type: 'chainChanged', walletId, chainId });\n } else if (name === 'accountsChanged' && Array.isArray(data) && data[0]) {\n const account = String(data[0]).split(':').pop() ?? '';\n if (account) this.emit({ type: 'accountsChanged', walletId, account });\n }\n });\n\n this.client = client;\n this.load();\n return client;\n }\n\n /** Pre-create a pairing so connect() can deep-link synchronously within the gesture. */\n private async warmup(): Promise<void> {\n if (this.warm) return;\n if (this.warming) return this.warming;\n this.warming = (async () => {\n const client = await this.getClient();\n const { topic, uri } = await client.core.pairing.create();\n this.warm = { topic, uri };\n this.warming = null;\n })();\n return this.warming;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = this.tryReuse(client, req);\n if (reused) return reused;\n\n if (!this.warm) await this.warmup(); // cold path loses the gesture, but the QR/URI is still emitted\n const warm = this.warm;\n this.warm = null;\n if (!warm) throw new Error('Failed to create WalletConnect pairing');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri: warm.uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, warm.uri); // synchronous — preserves connect()'s click gesture\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened) this.emit({ type: 'wallet_open_failed', walletId: req.walletId, uri: warm.uri });\n });\n }\n }\n\n const { approval } = await client.connect({\n pairingTopic: warm.topic,\n optionalNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: warm.topic }).catch(() => {});\n });\n\n void this.warmup(); // re-arm for the next connection\n\n const connection = this.toConnection(client, req.walletId, session, req.namespace);\n this.topics.set(req.walletId, session.topic);\n this.persist();\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n const client = await this.getClient();\n const out: Connection[] = [];\n for (const [walletId, topic] of [...this.topics]) {\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(walletId);\n continue;\n }\n const ns = firstNamespace(session);\n if (ns) out.push(this.toConnection(client, walletId, session, ns));\n }\n this.persist();\n return out;\n }\n\n async reset(): Promise<void> {\n const client = this.client;\n if (client) {\n await Promise.allSettled(\n client.session\n .getAll()\n .map((s) => client.disconnect({ topic: s.topic, reason: getSdkError('USER_DISCONNECTED') })),\n );\n }\n this.topics.clear();\n this.persist();\n this.warm = null;\n }\n\n // --- helpers ---\n\n private tryReuse(client: SignClient, req: ConnectRequest): Connection | null {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\n return null;\n }\n const ns = session.namespaces[req.namespace.name];\n const wanted = req.namespace.value.chains?.[0];\n if (!ns || (wanted && !ns.chains?.includes(wanted))) return null;\n return this.toConnection(client, req.walletId, session, req.namespace);\n }\n\n private toConnection(\n client: SignClient,\n walletId: string,\n session: SessionTypes.Struct,\n namespace: CaipNamespace,\n ): Connection {\n const ns = session.namespaces[namespace.name];\n const account =\n (ns?.accounts ?? []).map((a) => a.split(':')[2]).find((a): a is string => !!a) ?? '';\n const chainId =\n ns?.chains?.[0] ??\n (ns?.accounts?.[0] ? ns.accounts[0].split(':').slice(0, 2).join(':') : `${namespace.name}:1`);\n const topic = session.topic;\n return {\n walletId,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n client.request<T>({\n topic,\n chainId,\n request: { method: args.method, params: args.params as never },\n }),\n openWallet: () => {\n if (!isMobile()) return;\n const link = this.links[walletId];\n if (link) openWalletApp(link);\n },\n disconnect: async () => {\n await client.disconnect({ topic, reason: getSdkError('USER_DISCONNECTED') }).catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n },\n };\n }\n\n private liveSession(client: SignClient, topic: string): SessionTypes.Struct | undefined {\n try {\n return client.session.get(topic);\n } catch {\n return undefined;\n }\n }\n\n private walletForTopic(topic: string): string | null {\n for (const [walletId, t] of this.topics) if (t === topic) return walletId;\n return null;\n }\n\n private persist(): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify([...this.topics]));\n } catch {\n /* SSR / no storage */\n }\n }\n\n private load(): void {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) this.topics = new Map(JSON.parse(raw) as Array<[string, string]>);\n } catch {\n /* SSR / no storage */\n }\n }\n}\n\nfunction firstNamespace(session: SessionTypes.Struct): CaipNamespace | null {\n const name = Object.keys(session.namespaces)[0];\n if (!name) return null;\n const v = session.namespaces[name];\n if (!v) return null;\n return { name, value: { chains: v.chains, methods: v.methods, events: v.events } };\n}\n\nfunction withSignal<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\n onAbort: () => void,\n): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) {\n onAbort();\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n return new Promise<T>((resolve, reject) => {\n const abortHandler = () => {\n onAbort();\n reject(new DOMException('Aborted', 'AbortError'));\n };\n signal.addEventListener('abort', abortHandler, { once: true });\n promise.then(\n (v) => {\n signal.removeEventListener('abort', abortHandler);\n resolve(v);\n },\n (e) => {\n signal.removeEventListener('abort', abortHandler);\n reject(e);\n },\n );\n });\n}\n","import { ConnectManager } from './manager';\nimport { buildNamespace } from './namespace';\nimport type { Connector } from './connector';\nimport type { AppConfig } from './app';\nimport type {\n ConnectInput,\n Connection,\n LydianConnectConfig,\n LydianConnectEventHandler,\n} from './types';\nimport { MetaMaskConnector } from '../connectors/metamask/connector';\nimport { CoinbaseConnector } from '../connectors/coinbase/connector';\nimport { WalletConnectConnector } from '../connectors/walletconnect/connector';\n\n/**\n * The library-owned connector set. Adding a new wallet SDK is a change HERE —\n * consumers get it on `npm update` with no code change. SDK code stays\n * code-split (lazy `import()` inside each connector), so registering a\n * connector adds ~nothing to the host app's initial bundle.\n */\nfunction createConnectors(config: LydianConnectConfig): Connector[] {\n const app: AppConfig = {\n appName: config.appName,\n icon: config.icon,\n description: config.description,\n };\n return [\n new MetaMaskConnector(app),\n new CoinbaseConnector(app),\n new WalletConnectConnector(app, { projectId: config.walletConnectProjectId }),\n ];\n}\n\n/**\n * The single surface the host app touches. Hand it a flat config; it owns the\n * connectors and routes each wallet to its native SDK (or the WalletConnect\n * fallback), returning a uniform {@link Connection} either way.\n */\nexport class LydianConnect {\n private manager: ConnectManager;\n\n constructor(config: LydianConnectConfig) {\n this.manager = new ConnectManager(createConnectors(config));\n }\n\n init(): Promise<void> {\n return this.manager.init();\n }\n\n async connect(input: ConnectInput): Promise<Connection> {\n if (input.chainId === undefined || input.chainId === null) {\n throw new Error('connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)');\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\n }\n\n restore(): Promise<Connection[]> {\n return this.manager.restore();\n }\n\n disconnect(walletId?: string): Promise<void> {\n return this.manager.disconnect(walletId);\n }\n\n reset(): Promise<void> {\n return this.manager.reset();\n }\n\n get(walletId: string): Connection | undefined {\n return this.manager.get(walletId);\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n return this.manager.on(handler);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/manager.ts","../src/core/namespace.ts","../src/core/connector.ts","../src/core/app.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/connector.ts","../src/connectors/walletconnect/wallet-links.ts","../src/connectors/walletconnect/registry.ts","../src/connectors/walletconnect/deeplink.ts","../src/connectors/walletconnect/connector.ts","../src/core/lydian-connect.ts"],"names":["WALLET_ID","toCaip","SignClient","parseUri","getSdkError"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { Connector, ConnectRequest } from './connector';\nimport type { Connection, LydianConnectEvent, LydianConnectEventHandler } from './types';\n\n/**\n * Routing engine: takes a flat list of connectors, auto-detects the fallback\n * (the connector with no claimed walletIds), routes each walletId to its\n * connector, and forwards events. Internal — the host app uses `LydianConnect`.\n */\nexport class ConnectManager {\n private byWallet = new Map<string, Connector>();\n private fallback: Connector;\n private all: Connector[];\n private connections = new Map<string, Connection>();\n private handlers = new Set<LydianConnectEventHandler>();\n private unsubs: Array<() => void> = [];\n private started = false;\n\n constructor(connectors: Connector[]) {\n const fallbacks = connectors.filter((c) => c.walletIds.length === 0);\n if (fallbacks.length !== 1) {\n throw new Error(\n `LydianConnect requires exactly one fallback connector (empty walletIds); found ${fallbacks.length}`,\n );\n }\n this.fallback = fallbacks[0]!;\n this.all = connectors;\n for (const connector of connectors) {\n for (const id of connector.walletIds) this.byWallet.set(id, connector);\n }\n }\n\n /** Wire connector event forwarding, once. */\n async init(): Promise<void> {\n if (this.started) return;\n this.started = true;\n for (const connector of this.all) {\n this.unsubs.push(connector.on((event) => this.handle(event)));\n }\n }\n\n /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */\n private resolve(walletId: string): Connector {\n return this.byWallet.get(walletId) ?? this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connection = await this.resolve(req.walletId).connect(req);\n this.connections.set(req.walletId, connection);\n this.emit({ type: 'connect', walletId: req.walletId, connection });\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n if (!this.started) await this.init();\n const restored: Connection[] = [];\n for (const connector of this.all) {\n const conns = await connector.restore().catch(() => [] as Connection[]);\n for (const conn of conns) {\n this.connections.set(conn.walletId, conn);\n restored.push(conn);\n }\n }\n return restored;\n }\n\n get(walletId: string): Connection | undefined {\n return this.connections.get(walletId);\n }\n\n async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections.get(walletId)?.disconnect().catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled([...this.connections.values()].map((c) => c.disconnect()));\n this.connections.clear();\n }\n\n async reset(): Promise<void> {\n await this.disconnect();\n await Promise.allSettled(this.all.map((c) => c.reset()));\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n private handle(event: LydianConnectEvent): void {\n if (event.type === 'disconnect') this.connections.delete(event.walletId);\n this.emit(event);\n }\n\n private emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","import type { CaipNamespace } from './types';\n\n// Sensible defaults for an EVM payment flow. Internalized so the host app\n// never hand-builds a namespace — it only chooses a chain.\nconst DEFAULT_EVM_METHODS = [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n];\nconst DEFAULT_EVM_EVENTS = ['chainChanged', 'accountsChanged'];\n\n/**\n * Build a CAIP namespace from a chain id.\n * EVM-only for now: a number maps to `eip155:<n>`, and a CAIP-2 string must be\n * `eip155:<reference>`. Non-EVM namespaces (e.g. `solana:…`) would branch here\n * with their own methods/events when that support is added; until then we throw\n * rather than silently apply EVM defaults to a chain that can't use them.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n if (name !== 'eip155' || !reference || !/^\\d+$/.test(reference) || Number(reference) <= 0) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect is EVM-only for now — pass a positive number or an \"eip155:<id>\" string.`,\n );\n }\n return {\n name,\n value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS },\n };\n}\n","import type {\n CaipNamespace,\n Connection,\n ConnectorType,\n LydianConnectEvent,\n LydianConnectEventHandler,\n} from './types';\n\nexport interface ConnectRequest {\n walletId: string;\n namespace: CaipNamespace;\n /** Cancel a pending connection (replaces the host app's manual cancel plumbing). */\n signal?: AbortSignal;\n}\n\n/**\n * Internal contract every connector implements. The host app never sees this —\n * it only ever touches {@link LydianConnect} and the {@link Connection} handle.\n */\nexport interface Connector {\n readonly type: ConnectorType;\n /**\n * Wallet ids this connector natively serves. The WalletConnect fallback\n * returns an empty list and claims any wallet not served by another connector.\n */\n readonly walletIds: readonly string[];\n isAvailable(walletId: string): boolean | Promise<boolean>;\n connect(req: ConnectRequest): Promise<Connection>;\n /** Rebuild Connections for still-live sessions — the reconnect-on-reload case. */\n restore(): Promise<Connection[]>;\n /** Tear down everything this connector owns. */\n reset(): Promise<void>;\n on(handler: LydianConnectEventHandler): () => void;\n}\n\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\n\n async restore(): Promise<Connection[]> {\n return [];\n }\n\n async reset(): Promise<void> {\n /* no-op by default */\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n protected emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","/** Shared app identity passed to every connector; mapped to each SDK's own shape internally. */\nexport interface AppConfig {\n /** Display name shown in the wallet's connect prompt. */\n appName: string;\n /** Optional icon shown in the wallet's connect prompt. */\n icon?: string;\n /** Optional description; defaults to appName. */\n description?: string;\n}\n\n/**\n * The dapp URL, derived from the page origin at connect-time (always client-side).\n * Returns '' during SSR — connectors only read this when initializing their SDK,\n * which never happens on the server.\n */\nexport function deriveUrl(): string {\n return typeof window !== 'undefined' ? window.location.origin : '';\n}\n","import type { MetaMaskSDK as MetaMaskSDKType, MetaMaskSDKOptions } from '@metamask/sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\n\n/** The provider type MetaMaskSDK.getProvider() returns, without depending on a named export. */\ntype MetaMaskProvider = NonNullable<ReturnType<MetaMaskSDKType['getProvider']>>;\n\nconst WALLET_ID = 'metamask';\n\nexport class MetaMaskConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private sdk: MetaMaskSDKType | null = null;\n private provider: MetaMaskProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers desktop (extension) and mobile (deep-link) itself\n }\n\n private async getProvider(): Promise<MetaMaskProvider> {\n if (this.provider) return this.provider;\n const { MetaMaskSDK } = await import('@metamask/sdk'); // value import — code-split, loaded on demand\n const dappMetadata: MetaMaskSDKOptions['dappMetadata'] = {\n name: this.app.appName,\n url: deriveUrl(),\n ...(this.app.icon ? { iconUrl: this.app.icon } : {}),\n };\n const sdk = new MetaMaskSDK({ dappMetadata });\n await sdk.init();\n const provider = sdk.getProvider();\n if (!provider) throw new Error('MetaMask provider unavailable');\n this.sdk = sdk;\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: MetaMaskProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider();\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const account = accounts?.[0];\n if (!account) throw new Error('MetaMask returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await provider.request<string>({ method: 'eth_chainId' }));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider.request<string[]>({ method: 'eth_accounts' }).catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x1'),\n );\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n }\n\n /** Best-effort switch to the requested chain; leaves the wallet as-is if it's unknown to it. */\n private async ensureChain(provider: MetaMaskProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0]; // \"eip155:137\"\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await provider\n .request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${wantedNum.toString(16)}` }],\n })\n .catch(() => {\n /* chain not added to the wallet — the caller's chainChanged will reflect reality */\n });\n }\n\n private toConnection(provider: MetaMaskProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: async <T>(args: { method: string; params?: unknown }) =>\n (await provider.request<T>({ method: args.method, params: args.params as never })) as T,\n openWallet: () => {}, // MetaMask SDK foregrounds the wallet on request\n disconnect: async () => {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from '@coinbase/wallet-sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport type { AppConfig } from '../../core/app';\n\ntype CoinbaseProvider = NonNullable<ReturnType<CoinbaseWalletSDKType['makeWeb3Provider']>>;\ntype RequestArgs = Parameters<CoinbaseProvider['request']>[0];\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(provider: CoinbaseProvider, method: string, params?: unknown): Promise<T> {\n return provider.request({ method, params } as unknown as RequestArgs) as Promise<T>;\n}\n\nconst WALLET_ID = 'coinbase';\n\nexport class CoinbaseConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private provider: CoinbaseProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers extension + mobile deep-link itself\n }\n\n private async getProvider(appChainIds?: number[]): Promise<CoinbaseProvider> {\n if (this.provider) return this.provider;\n const { CoinbaseWalletSDK } = await import('@coinbase/wallet-sdk'); // lazy — code-split\n const sdk = new CoinbaseWalletSDK({\n appName: this.app.appName,\n appLogoUrl: this.app.icon,\n appChainIds, // one-time SDK-init hint; ensureChain enforces the actual chain per connect\n });\n const provider = sdk.makeWeb3Provider();\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: CoinbaseProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider(evmChainIds(req));\n const accounts = await rpc<string[]>(provider, 'eth_requestAccounts');\n const account = accounts?.[0];\n if (!account) throw new Error('Coinbase Wallet returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await rpc<string[]>(provider, 'eth_accounts').catch(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.provider?.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n }\n\n private async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n rpc<T>(provider, args.method, args.params),\n openWallet: () => {}, // Coinbase SDK foregrounds the wallet on request\n disconnect: async () => {\n await provider.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n\n/** The numeric EVM chain id the connect targets, for Coinbase's appChainIds hint. */\nfunction evmChainIds(req: ConnectRequest): number[] | undefined {\n const wanted = req.namespace.value.chains?.[0];\n const n = wanted ? Number(wanted.split(':')[1]) : NaN;\n return Number.isFinite(n) && n > 0 ? [n] : undefined;\n}\n","// Wallet deep-link registry — hand-maintained.\n// Originally seeded from the WalletConnect explorer API; edit entries directly now.\n// Per entry: native = bare app scheme (foreground only); scheme = WC connect deep\n// link (we append `?uri=`); universal = fallback only; store = not-installed links.\nimport type { WalletLink } from './registry';\n\nexport const WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okxwallet://main\",\"scheme\":\"okxwallet://main/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"cryptowallet://\",\"scheme\":\"cryptowallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\n};\n","import { WALLET_LINKS } from './wallet-links';\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okxwallet://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". Preferred on mobile (same-tab). */\n scheme?: string;\n /** Universal/applink incl. the `wc` path. Fallback only — used when no `scheme` exists. */\n universal?: string;\n /** App store links — used for the \"wallet not installed\" fallback. */\n store?: { ios?: string; android?: string };\n}\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = WALLET_LINKS;\n","import type { WalletLink } from './registry';\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const uaDataMobile =\n (navigator as { userAgentData?: { mobile?: boolean } }).userAgentData?.mobile ?? false;\n return /iPhone|iPad|iPod|Android/i.test(ua) || uaDataMobile;\n}\n\nfunction buildLink(base: string, uri: string): string {\n const sep = base.includes('?') ? '&' : '?';\n return `${base}${sep}uri=${encodeURIComponent(uri)}`;\n}\n\n/**\n * Open the wallet for a WalletConnect pairing on mobile. Custom scheme first, in\n * the SAME TAB — that reliably foregrounds an installed app and, unlike a\n * _blank/popup navigation, is NOT suppressed once the click gesture has been lost\n * (which it has by the time connect() reaches here, after the async pairing setup).\n * Universal link is only a fallback for the rare wallet with no custom scheme.\n * The not-installed case is handled by the connector via detectAppOpen().\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n } else if (link.universal) {\n openHref(buildLink(link.universal, uri), false);\n }\n}\n\n/**\n * Bring the wallet app to the foreground (no WC URI) — for an approval the user\n * must return to the wallet for. Uses the bare `native` scheme; call within a gesture.\n */\nexport function openWalletApp(link: WalletLink): void {\n if (typeof document === 'undefined') return;\n if (!link.native) return;\n openHref(link.native, false);\n}\n\nfunction openHref(href: string, newContext: boolean): void {\n const a = document.createElement('a');\n a.href = href;\n if (newContext) {\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n }\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/** Resolves true if the page was backgrounded (wallet likely opened) within the window. */\nexport function detectAppOpen(timeoutMs: number): Promise<boolean> {\n if (typeof document === 'undefined') return Promise.resolve(false);\n return new Promise((resolve) => {\n let done = false;\n const finish = (opened: boolean) => {\n if (done) return;\n done = true;\n document.removeEventListener('visibilitychange', onVisibility);\n window.removeEventListener('pagehide', onPageHide);\n clearTimeout(timer);\n resolve(opened);\n };\n const onVisibility = () => {\n if (document.hidden) finish(true);\n };\n const onPageHide = () => finish(true);\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('pagehide', onPageHide);\n const timer = setTimeout(() => finish(false), timeoutMs);\n });\n}\n","import SignClient from '@walletconnect/sign-client';\nimport { getSdkError, parseUri } from '@walletconnect/utils';\nimport type { SessionTypes } from '@walletconnect/types';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { CaipNamespace, Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\nimport { DEFAULT_WALLET_LINKS, type WalletLink } from './registry';\nimport { detectAppOpen, isMobile, openWallet, openWalletApp } from './deeplink';\n\nconst STORAGE_KEY = 'lydianconnect.wc.topics'; // walletId -> session topic\n\nexport interface WalletConnectOptions {\n projectId: string;\n relayUrl?: string;\n walletLinks?: Record<string, WalletLink>;\n openTimeoutMs?: number;\n}\n\nexport class WalletConnectConnector extends BaseConnector {\n readonly type = 'walletconnect' as const;\n readonly walletIds: readonly string[] = []; // claims any wallet not served by an SDK connector\n\n private client: SignClient | null = null;\n private links: Record<string, WalletLink>;\n private topics = new Map<string, string>();\n\n constructor(\n private app: AppConfig,\n private options: WalletConnectOptions,\n ) {\n super();\n this.links = { ...DEFAULT_WALLET_LINKS, ...(options.walletLinks ?? {}) };\n }\n\n isAvailable(): boolean {\n return true;\n }\n\n private async getClient(): Promise<SignClient> {\n if (this.client) return this.client;\n const client = await SignClient.init({\n projectId: this.options.projectId,\n metadata: {\n name: this.app.appName,\n description: this.app.description ?? this.app.appName,\n url: deriveUrl(),\n icons: this.app.icon ? [this.app.icon] : [],\n },\n relayUrl: this.options.relayUrl,\n });\n\n client.on('session_delete', ({ topic }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n });\n\n client.on('session_event', ({ topic, params }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n const { name, data } = params.event;\n if (name === 'chainChanged') {\n const chainId =\n typeof data === 'string' && data.includes(':') ? data : `eip155:${String(data)}`;\n this.emit({ type: 'chainChanged', walletId, chainId });\n } else if (name === 'accountsChanged' && Array.isArray(data) && data[0]) {\n const account = String(data[0]).split(':').pop() ?? '';\n if (account) this.emit({ type: 'accountsChanged', walletId, account });\n }\n });\n\n this.client = client;\n this.load();\n return client;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = this.tryReuse(client, req);\n if (reused) return reused;\n\n const { uri, approval } = await client.connect({\n requiredNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n if (!uri) throw new Error('WalletConnect did not return a pairing URI');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, uri);\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened)\n this.emit({\n type: 'wallet_open_failed',\n walletId: req.walletId,\n uri,\n store: link.store,\n });\n });\n }\n }\n\n const pairingTopic = parseUri(uri).topic;\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: pairingTopic }).catch(() => {});\n });\n\n const connection = this.toConnection(client, req.walletId, session, req.namespace);\n this.topics.set(req.walletId, session.topic);\n this.persist();\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n const client = await this.getClient();\n const out: Connection[] = [];\n for (const [walletId, topic] of [...this.topics]) {\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(walletId);\n continue;\n }\n const ns = firstNamespace(session);\n if (ns) out.push(this.toConnection(client, walletId, session, ns));\n }\n this.persist();\n return out;\n }\n\n async reset(): Promise<void> {\n const client = this.client;\n if (client) {\n await Promise.allSettled(\n client.session\n .getAll()\n .map((s) => client.disconnect({ topic: s.topic, reason: getSdkError('USER_DISCONNECTED') })),\n );\n }\n this.topics.clear();\n this.persist();\n }\n\n // --- helpers ---\n\n private tryReuse(client: SignClient, req: ConnectRequest): Connection | null {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\n return null;\n }\n const ns = session.namespaces[req.namespace.name];\n const wanted = req.namespace.value.chains?.[0];\n if (!ns || (wanted && !ns.chains?.includes(wanted))) return null;\n return this.toConnection(client, req.walletId, session, req.namespace);\n }\n\n private toConnection(\n client: SignClient,\n walletId: string,\n session: SessionTypes.Struct,\n namespace: CaipNamespace,\n ): Connection {\n const ns = session.namespaces[namespace.name];\n const account =\n (ns?.accounts ?? []).map((a) => a.split(':')[2]).find((a): a is string => !!a) ?? '';\n const chainId =\n ns?.chains?.[0] ??\n (ns?.accounts?.[0] ? ns.accounts[0].split(':').slice(0, 2).join(':') : `${namespace.name}:1`);\n const topic = session.topic;\n return {\n walletId,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n client.request<T>({\n topic,\n chainId,\n request: { method: args.method, params: args.params as never },\n }),\n openWallet: () => {\n if (!isMobile()) return;\n const link = this.links[walletId];\n if (link) openWalletApp(link);\n },\n disconnect: async () => {\n await client.disconnect({ topic, reason: getSdkError('USER_DISCONNECTED') }).catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n },\n };\n }\n\n private liveSession(client: SignClient, topic: string): SessionTypes.Struct | undefined {\n try {\n return client.session.get(topic);\n } catch {\n return undefined;\n }\n }\n\n private walletForTopic(topic: string): string | null {\n for (const [walletId, t] of this.topics) if (t === topic) return walletId;\n return null;\n }\n\n private persist(): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify([...this.topics]));\n } catch {\n /* SSR / no storage */\n }\n }\n\n private load(): void {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) this.topics = new Map(JSON.parse(raw) as Array<[string, string]>);\n } catch {\n /* SSR / no storage */\n }\n }\n}\n\nfunction firstNamespace(session: SessionTypes.Struct): CaipNamespace | null {\n const name = Object.keys(session.namespaces)[0];\n if (!name) return null;\n const v = session.namespaces[name];\n if (!v) return null;\n return { name, value: { chains: v.chains, methods: v.methods, events: v.events } };\n}\n\nfunction withSignal<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\n onAbort: () => void,\n): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) {\n onAbort();\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n return new Promise<T>((resolve, reject) => {\n const abortHandler = () => {\n onAbort();\n reject(new DOMException('Aborted', 'AbortError'));\n };\n signal.addEventListener('abort', abortHandler, { once: true });\n promise.then(\n (v) => {\n signal.removeEventListener('abort', abortHandler);\n resolve(v);\n },\n (e) => {\n signal.removeEventListener('abort', abortHandler);\n reject(e);\n },\n );\n });\n}\n","import { ConnectManager } from './manager';\nimport { buildNamespace } from './namespace';\nimport type { Connector } from './connector';\nimport type { AppConfig } from './app';\nimport type {\n ConnectInput,\n Connection,\n LydianConnectConfig,\n LydianConnectEventHandler,\n} from './types';\nimport { MetaMaskConnector } from '../connectors/metamask/connector';\nimport { CoinbaseConnector } from '../connectors/coinbase/connector';\nimport { WalletConnectConnector } from '../connectors/walletconnect/connector';\n\n/**\n * The library-owned connector set. Adding a new wallet SDK is a change HERE —\n * consumers get it on `npm update` with no code change. SDK code stays\n * code-split (lazy `import()` inside each connector), so registering a\n * connector adds ~nothing to the host app's initial bundle.\n */\nfunction createConnectors(config: LydianConnectConfig): Connector[] {\n const app: AppConfig = {\n appName: config.appName,\n icon: config.icon,\n description: config.description,\n };\n return [\n new MetaMaskConnector(app),\n new CoinbaseConnector(app),\n new WalletConnectConnector(app, { projectId: config.walletConnectProjectId }),\n ];\n}\n\n/**\n * The single surface the host app touches. Hand it a flat config; it owns the\n * connectors and routes each wallet to its native SDK (or the WalletConnect\n * fallback), returning a uniform {@link Connection} either way.\n */\nexport class LydianConnect {\n private manager: ConnectManager;\n\n constructor(config: LydianConnectConfig) {\n this.manager = new ConnectManager(createConnectors(config));\n }\n\n init(): Promise<void> {\n return this.manager.init();\n }\n\n async connect(input: ConnectInput): Promise<Connection> {\n if (input.chainId === undefined || input.chainId === null) {\n throw new Error('connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)');\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\n }\n\n restore(): Promise<Connection[]> {\n return this.manager.restore();\n }\n\n disconnect(walletId?: string): Promise<void> {\n return this.manager.disconnect(walletId);\n }\n\n reset(): Promise<void> {\n return this.manager.reset();\n }\n\n get(walletId: string): Connection | undefined {\n return this.manager.get(walletId);\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n return this.manager.on(handler);\n }\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -80,11 +80,16 @@ type LydianConnectEvent =
|
|
|
80
80
|
walletId: string;
|
|
81
81
|
account: string;
|
|
82
82
|
}
|
|
83
|
-
/** Deep-link was fired but the page stayed visible — wallet likely not installed.
|
|
83
|
+
/** Deep-link was fired but the page stayed visible — wallet likely not installed.
|
|
84
|
+
* `store` carries the app-store links (when known) so the host can offer an install CTA. */
|
|
84
85
|
| {
|
|
85
86
|
type: 'wallet_open_failed';
|
|
86
87
|
walletId: string;
|
|
87
88
|
uri: string;
|
|
89
|
+
store?: {
|
|
90
|
+
ios?: string;
|
|
91
|
+
android?: string;
|
|
92
|
+
};
|
|
88
93
|
};
|
|
89
94
|
type LydianConnectEventHandler = (event: LydianConnectEvent) => void;
|
|
90
95
|
|
package/dist/index.d.ts
CHANGED
|
@@ -80,11 +80,16 @@ type LydianConnectEvent =
|
|
|
80
80
|
walletId: string;
|
|
81
81
|
account: string;
|
|
82
82
|
}
|
|
83
|
-
/** Deep-link was fired but the page stayed visible — wallet likely not installed.
|
|
83
|
+
/** Deep-link was fired but the page stayed visible — wallet likely not installed.
|
|
84
|
+
* `store` carries the app-store links (when known) so the host can offer an install CTA. */
|
|
84
85
|
| {
|
|
85
86
|
type: 'wallet_open_failed';
|
|
86
87
|
walletId: string;
|
|
87
88
|
uri: string;
|
|
89
|
+
store?: {
|
|
90
|
+
ios?: string;
|
|
91
|
+
android?: string;
|
|
92
|
+
};
|
|
88
93
|
};
|
|
89
94
|
type LydianConnectEventHandler = (event: LydianConnectEvent) => void;
|
|
90
95
|
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import SignClient from '@walletconnect/sign-client';
|
|
2
|
-
import { getSdkError } from '@walletconnect/utils';
|
|
2
|
+
import { parseUri, getSdkError } from '@walletconnect/utils';
|
|
3
3
|
|
|
4
4
|
// src/core/manager.ts
|
|
5
5
|
var ConnectManager = class {
|
|
@@ -351,8 +351,8 @@ function evmChainIds(req) {
|
|
|
351
351
|
return Number.isFinite(n) && n > 0 ? [n] : void 0;
|
|
352
352
|
}
|
|
353
353
|
|
|
354
|
-
// src/connectors/walletconnect/wallet-links.
|
|
355
|
-
var
|
|
354
|
+
// src/connectors/walletconnect/wallet-links.ts
|
|
355
|
+
var WALLET_LINKS = {
|
|
356
356
|
metamask: { "native": "metamask://", "scheme": "metamask://wc", "universal": "https://metamask.app.link/wc", "store": { "ios": "https://apps.apple.com/us/app/metamask/id1438144202", "android": "https://play.google.com/store/apps/details?id=io.metamask" } },
|
|
357
357
|
trust: { "native": "trust://", "scheme": "trust://wc", "universal": "https://link.trustwallet.com/wc", "store": { "ios": "https://apps.apple.com/app/apple-store/id1288339409", "android": "https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp" } },
|
|
358
358
|
rainbow: { "native": "rainbow://", "scheme": "rainbow://wc", "universal": "https://rnbwapp.com/wc", "store": { "ios": "https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8", "android": "https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc" } },
|
|
@@ -362,8 +362,8 @@ var GENERATED_WALLET_LINKS = {
|
|
|
362
362
|
blockchaincom: { "native": "blockchain-wallet://", "scheme": "blockchain-wallet://wc", "universal": "https://login.blockchain.com/app/wc", "store": { "ios": "https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309", "android": "https://play.google.com/store/apps/details?id=piuk.blockchain.android" } },
|
|
363
363
|
exodus: { "native": "exodus://", "scheme": "exodus://wc", "universal": "https://exodus.com/m/wc", "store": { "ios": "https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820", "android": "https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US" } },
|
|
364
364
|
phantom: { "store": { "ios": "https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977", "android": "https://play.google.com/store/apps/details?id=app.phantom&hl=en" } },
|
|
365
|
-
okx: { "native": "
|
|
366
|
-
cryptocom: { "native": "
|
|
365
|
+
okx: { "native": "okxwallet://main", "scheme": "okxwallet://main/wc", "store": { "ios": "https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470", "android": "https://play.google.com/store/apps/details?id=com.okinc.okex.gp" } },
|
|
366
|
+
cryptocom: { "native": "cryptowallet://", "scheme": "cryptowallet://wc", "store": { "ios": "https://apps.apple.com/US/app/id1512048310?mt=8", "android": "https://play.google.com/store/apps/details?id=com.defi.wallet" } },
|
|
367
367
|
argent: { "native": "argent://app/", "scheme": "argent://app/wc", "universal": "https://www.argent.xyz/app/wc", "store": { "ios": "https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926", "android": "https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1" } },
|
|
368
368
|
safepal: { "native": "safepalwallet://", "scheme": "safepalwallet://wc", "universal": "https://link.safepal.io/wc", "store": { "ios": "https://apps.apple.com/app/safepal-wallet/id1548297139", "android": "https://play.google.com/store/apps/details?id=io.safepal.wallet" } },
|
|
369
369
|
imtoken: { "native": "imtokenv2://", "scheme": "imtokenv2://wc", "store": { "ios": "https://apps.apple.com/us/app/imtoken2/id1384798940", "android": "https://play.google.com/store/apps/details?id=im.token.app" } },
|
|
@@ -379,7 +379,7 @@ var GENERATED_WALLET_LINKS = {
|
|
|
379
379
|
};
|
|
380
380
|
|
|
381
381
|
// src/connectors/walletconnect/registry.ts
|
|
382
|
-
var DEFAULT_WALLET_LINKS =
|
|
382
|
+
var DEFAULT_WALLET_LINKS = WALLET_LINKS;
|
|
383
383
|
|
|
384
384
|
// src/connectors/walletconnect/deeplink.ts
|
|
385
385
|
function isMobile() {
|
|
@@ -394,24 +394,20 @@ function buildLink(base, uri) {
|
|
|
394
394
|
}
|
|
395
395
|
function openWallet(link, uri) {
|
|
396
396
|
if (typeof document === "undefined") return;
|
|
397
|
-
if (link.
|
|
398
|
-
openHref(buildLink(link.
|
|
399
|
-
} else if (link.
|
|
400
|
-
openHref(buildLink(link.
|
|
397
|
+
if (link.scheme) {
|
|
398
|
+
openHref(buildLink(link.scheme, uri));
|
|
399
|
+
} else if (link.universal) {
|
|
400
|
+
openHref(buildLink(link.universal, uri));
|
|
401
401
|
}
|
|
402
402
|
}
|
|
403
403
|
function openWalletApp(link) {
|
|
404
404
|
if (typeof document === "undefined") return;
|
|
405
405
|
if (!link.native) return;
|
|
406
|
-
openHref(link.native
|
|
406
|
+
openHref(link.native);
|
|
407
407
|
}
|
|
408
408
|
function openHref(href, newContext) {
|
|
409
409
|
const a = document.createElement("a");
|
|
410
410
|
a.href = href;
|
|
411
|
-
if (newContext) {
|
|
412
|
-
a.target = "_blank";
|
|
413
|
-
a.rel = "noopener noreferrer";
|
|
414
|
-
}
|
|
415
411
|
a.style.display = "none";
|
|
416
412
|
document.body.appendChild(a);
|
|
417
413
|
a.click();
|
|
@@ -451,8 +447,6 @@ var WalletConnectConnector = class extends BaseConnector {
|
|
|
451
447
|
// claims any wallet not served by an SDK connector
|
|
452
448
|
this.client = null;
|
|
453
449
|
this.topics = /* @__PURE__ */ new Map();
|
|
454
|
-
this.warm = null;
|
|
455
|
-
this.warming = null;
|
|
456
450
|
this.links = { ...DEFAULT_WALLET_LINKS, ...options.walletLinks ?? {} };
|
|
457
451
|
}
|
|
458
452
|
isAvailable() {
|
|
@@ -493,45 +487,35 @@ var WalletConnectConnector = class extends BaseConnector {
|
|
|
493
487
|
this.load();
|
|
494
488
|
return client;
|
|
495
489
|
}
|
|
496
|
-
/** Pre-create a pairing so connect() can deep-link synchronously within the gesture. */
|
|
497
|
-
async warmup() {
|
|
498
|
-
if (this.warm) return;
|
|
499
|
-
if (this.warming) return this.warming;
|
|
500
|
-
this.warming = (async () => {
|
|
501
|
-
const client = await this.getClient();
|
|
502
|
-
const { topic, uri } = await client.core.pairing.create();
|
|
503
|
-
this.warm = { topic, uri };
|
|
504
|
-
this.warming = null;
|
|
505
|
-
})();
|
|
506
|
-
return this.warming;
|
|
507
|
-
}
|
|
508
490
|
async connect(req) {
|
|
509
491
|
const client = await this.getClient();
|
|
510
492
|
const reused = this.tryReuse(client, req);
|
|
511
493
|
if (reused) return reused;
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
if (!
|
|
516
|
-
this.emit({ type: "display_uri", walletId: req.walletId, uri
|
|
494
|
+
const { uri, approval } = await client.connect({
|
|
495
|
+
requiredNamespaces: { [req.namespace.name]: req.namespace.value }
|
|
496
|
+
});
|
|
497
|
+
if (!uri) throw new Error("WalletConnect did not return a pairing URI");
|
|
498
|
+
this.emit({ type: "display_uri", walletId: req.walletId, uri });
|
|
517
499
|
if (isMobile()) {
|
|
518
500
|
const link = this.links[req.walletId];
|
|
519
501
|
if (link) {
|
|
520
|
-
openWallet(link,
|
|
502
|
+
openWallet(link, uri);
|
|
521
503
|
void detectAppOpen(this.options.openTimeoutMs ?? 2e3).then((opened) => {
|
|
522
|
-
if (!opened)
|
|
504
|
+
if (!opened)
|
|
505
|
+
this.emit({
|
|
506
|
+
type: "wallet_open_failed",
|
|
507
|
+
walletId: req.walletId,
|
|
508
|
+
uri,
|
|
509
|
+
store: link.store
|
|
510
|
+
});
|
|
523
511
|
});
|
|
524
512
|
}
|
|
525
513
|
}
|
|
526
|
-
const
|
|
527
|
-
pairingTopic: warm.topic,
|
|
528
|
-
optionalNamespaces: { [req.namespace.name]: req.namespace.value }
|
|
529
|
-
});
|
|
514
|
+
const pairingTopic = parseUri(uri).topic;
|
|
530
515
|
const session = await withSignal(approval(), req.signal, () => {
|
|
531
|
-
void client.core.pairing.disconnect({ topic:
|
|
516
|
+
void client.core.pairing.disconnect({ topic: pairingTopic }).catch(() => {
|
|
532
517
|
});
|
|
533
518
|
});
|
|
534
|
-
void this.warmup();
|
|
535
519
|
const connection = this.toConnection(client, req.walletId, session, req.namespace);
|
|
536
520
|
this.topics.set(req.walletId, session.topic);
|
|
537
521
|
this.persist();
|
|
@@ -561,7 +545,6 @@ var WalletConnectConnector = class extends BaseConnector {
|
|
|
561
545
|
}
|
|
562
546
|
this.topics.clear();
|
|
563
547
|
this.persist();
|
|
564
|
-
this.warm = null;
|
|
565
548
|
}
|
|
566
549
|
// --- helpers ---
|
|
567
550
|
tryReuse(client, req) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/manager.ts","../src/core/namespace.ts","../src/core/connector.ts","../src/core/app.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/connector.ts","../src/connectors/walletconnect/wallet-links.generated.ts","../src/connectors/walletconnect/registry.ts","../src/connectors/walletconnect/deeplink.ts","../src/connectors/walletconnect/connector.ts","../src/core/lydian-connect.ts"],"names":["WALLET_ID","toCaip"],"mappings":"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","file":"index.js","sourcesContent":["import type { Connector, ConnectRequest } from './connector';\nimport type { Connection, LydianConnectEvent, LydianConnectEventHandler } from './types';\n\n/**\n * Routing engine: takes a flat list of connectors, auto-detects the fallback\n * (the connector with no claimed walletIds), routes each walletId to its\n * connector, and forwards events. Internal — the host app uses `LydianConnect`.\n */\nexport class ConnectManager {\n private byWallet = new Map<string, Connector>();\n private fallback: Connector;\n private all: Connector[];\n private connections = new Map<string, Connection>();\n private handlers = new Set<LydianConnectEventHandler>();\n private unsubs: Array<() => void> = [];\n private started = false;\n\n constructor(connectors: Connector[]) {\n const fallbacks = connectors.filter((c) => c.walletIds.length === 0);\n if (fallbacks.length !== 1) {\n throw new Error(\n `LydianConnect requires exactly one fallback connector (empty walletIds); found ${fallbacks.length}`,\n );\n }\n this.fallback = fallbacks[0]!;\n this.all = connectors;\n for (const connector of connectors) {\n for (const id of connector.walletIds) this.byWallet.set(id, connector);\n }\n }\n\n /** Wire connector event forwarding, once. */\n async init(): Promise<void> {\n if (this.started) return;\n this.started = true;\n for (const connector of this.all) {\n this.unsubs.push(connector.on((event) => this.handle(event)));\n }\n }\n\n /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */\n private resolve(walletId: string): Connector {\n return this.byWallet.get(walletId) ?? this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connection = await this.resolve(req.walletId).connect(req);\n this.connections.set(req.walletId, connection);\n this.emit({ type: 'connect', walletId: req.walletId, connection });\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n if (!this.started) await this.init();\n const restored: Connection[] = [];\n for (const connector of this.all) {\n const conns = await connector.restore().catch(() => [] as Connection[]);\n for (const conn of conns) {\n this.connections.set(conn.walletId, conn);\n restored.push(conn);\n }\n }\n return restored;\n }\n\n get(walletId: string): Connection | undefined {\n return this.connections.get(walletId);\n }\n\n async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections.get(walletId)?.disconnect().catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled([...this.connections.values()].map((c) => c.disconnect()));\n this.connections.clear();\n }\n\n async reset(): Promise<void> {\n await this.disconnect();\n await Promise.allSettled(this.all.map((c) => c.reset()));\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n private handle(event: LydianConnectEvent): void {\n if (event.type === 'disconnect') this.connections.delete(event.walletId);\n this.emit(event);\n }\n\n private emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","import type { CaipNamespace } from './types';\n\n// Sensible defaults for an EVM payment flow. Internalized so the host app\n// never hand-builds a namespace — it only chooses a chain.\nconst DEFAULT_EVM_METHODS = [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n];\nconst DEFAULT_EVM_EVENTS = ['chainChanged', 'accountsChanged'];\n\n/**\n * Build a CAIP namespace from a chain id.\n * EVM-only for now: a number maps to `eip155:<n>`, and a CAIP-2 string must be\n * `eip155:<reference>`. Non-EVM namespaces (e.g. `solana:…`) would branch here\n * with their own methods/events when that support is added; until then we throw\n * rather than silently apply EVM defaults to a chain that can't use them.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n if (name !== 'eip155' || !reference || !/^\\d+$/.test(reference) || Number(reference) <= 0) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect is EVM-only for now — pass a positive number or an \"eip155:<id>\" string.`,\n );\n }\n return {\n name,\n value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS },\n };\n}\n","import type {\n CaipNamespace,\n Connection,\n ConnectorType,\n LydianConnectEvent,\n LydianConnectEventHandler,\n} from './types';\n\nexport interface ConnectRequest {\n walletId: string;\n namespace: CaipNamespace;\n /** Cancel a pending connection (replaces the host app's manual cancel plumbing). */\n signal?: AbortSignal;\n}\n\n/**\n * Internal contract every connector implements. The host app never sees this —\n * it only ever touches {@link LydianConnect} and the {@link Connection} handle.\n */\nexport interface Connector {\n readonly type: ConnectorType;\n /**\n * Wallet ids this connector natively serves. The WalletConnect fallback\n * returns an empty list and claims any wallet not served by another connector.\n */\n readonly walletIds: readonly string[];\n isAvailable(walletId: string): boolean | Promise<boolean>;\n connect(req: ConnectRequest): Promise<Connection>;\n /** Rebuild Connections for still-live sessions — the reconnect-on-reload case. */\n restore(): Promise<Connection[]>;\n /** Tear down everything this connector owns. */\n reset(): Promise<void>;\n on(handler: LydianConnectEventHandler): () => void;\n}\n\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\n\n async restore(): Promise<Connection[]> {\n return [];\n }\n\n async reset(): Promise<void> {\n /* no-op by default */\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n protected emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","/** Shared app identity passed to every connector; mapped to each SDK's own shape internally. */\nexport interface AppConfig {\n /** Display name shown in the wallet's connect prompt. */\n appName: string;\n /** Optional icon shown in the wallet's connect prompt. */\n icon?: string;\n /** Optional description; defaults to appName. */\n description?: string;\n}\n\n/**\n * The dapp URL, derived from the page origin at connect-time (always client-side).\n * Returns '' during SSR — connectors only read this when initializing their SDK,\n * which never happens on the server.\n */\nexport function deriveUrl(): string {\n return typeof window !== 'undefined' ? window.location.origin : '';\n}\n","import type { MetaMaskSDK as MetaMaskSDKType, MetaMaskSDKOptions } from '@metamask/sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\n\n/** The provider type MetaMaskSDK.getProvider() returns, without depending on a named export. */\ntype MetaMaskProvider = NonNullable<ReturnType<MetaMaskSDKType['getProvider']>>;\n\nconst WALLET_ID = 'metamask';\n\nexport class MetaMaskConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private sdk: MetaMaskSDKType | null = null;\n private provider: MetaMaskProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers desktop (extension) and mobile (deep-link) itself\n }\n\n private async getProvider(): Promise<MetaMaskProvider> {\n if (this.provider) return this.provider;\n const { MetaMaskSDK } = await import('@metamask/sdk'); // value import — code-split, loaded on demand\n const dappMetadata: MetaMaskSDKOptions['dappMetadata'] = {\n name: this.app.appName,\n url: deriveUrl(),\n ...(this.app.icon ? { iconUrl: this.app.icon } : {}),\n };\n const sdk = new MetaMaskSDK({ dappMetadata });\n await sdk.init();\n const provider = sdk.getProvider();\n if (!provider) throw new Error('MetaMask provider unavailable');\n this.sdk = sdk;\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: MetaMaskProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider();\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const account = accounts?.[0];\n if (!account) throw new Error('MetaMask returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await provider.request<string>({ method: 'eth_chainId' }));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider.request<string[]>({ method: 'eth_accounts' }).catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x1'),\n );\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n }\n\n /** Best-effort switch to the requested chain; leaves the wallet as-is if it's unknown to it. */\n private async ensureChain(provider: MetaMaskProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0]; // \"eip155:137\"\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await provider\n .request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${wantedNum.toString(16)}` }],\n })\n .catch(() => {\n /* chain not added to the wallet — the caller's chainChanged will reflect reality */\n });\n }\n\n private toConnection(provider: MetaMaskProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: async <T>(args: { method: string; params?: unknown }) =>\n (await provider.request<T>({ method: args.method, params: args.params as never })) as T,\n openWallet: () => {}, // MetaMask SDK foregrounds the wallet on request\n disconnect: async () => {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from '@coinbase/wallet-sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport type { AppConfig } from '../../core/app';\n\ntype CoinbaseProvider = NonNullable<ReturnType<CoinbaseWalletSDKType['makeWeb3Provider']>>;\ntype RequestArgs = Parameters<CoinbaseProvider['request']>[0];\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(provider: CoinbaseProvider, method: string, params?: unknown): Promise<T> {\n return provider.request({ method, params } as unknown as RequestArgs) as Promise<T>;\n}\n\nconst WALLET_ID = 'coinbase';\n\nexport class CoinbaseConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private provider: CoinbaseProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers extension + mobile deep-link itself\n }\n\n private async getProvider(appChainIds?: number[]): Promise<CoinbaseProvider> {\n if (this.provider) return this.provider;\n const { CoinbaseWalletSDK } = await import('@coinbase/wallet-sdk'); // lazy — code-split\n const sdk = new CoinbaseWalletSDK({\n appName: this.app.appName,\n appLogoUrl: this.app.icon,\n appChainIds, // one-time SDK-init hint; ensureChain enforces the actual chain per connect\n });\n const provider = sdk.makeWeb3Provider();\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: CoinbaseProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider(evmChainIds(req));\n const accounts = await rpc<string[]>(provider, 'eth_requestAccounts');\n const account = accounts?.[0];\n if (!account) throw new Error('Coinbase Wallet returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await rpc<string[]>(provider, 'eth_accounts').catch(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.provider?.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n }\n\n private async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n rpc<T>(provider, args.method, args.params),\n openWallet: () => {}, // Coinbase SDK foregrounds the wallet on request\n disconnect: async () => {\n await provider.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n\n/** The numeric EVM chain id the connect targets, for Coinbase's appChainIds hint. */\nfunction evmChainIds(req: ConnectRequest): number[] | undefined {\n const wanted = req.namespace.value.chains?.[0];\n const n = wanted ? Number(wanted.split(':')[1]) : NaN;\n return Number.isFinite(n) && n > 0 ? [n] : undefined;\n}\n","// AUTO-GENERATED by scripts/build-wallet-links.mjs — do not edit by hand.\n// Refresh: WC_PROJECT_ID=<projectId> node scripts/build-wallet-links.mjs\n// Source: WalletConnect explorer API (explorer-api.walletconnect.com/v3/wallets)\nimport type { WalletLink } from './registry';\n\nexport const GENERATED_WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okex://main\",\"scheme\":\"okex://main/wc\",\"universal\":\"https://www.okx.com/download?appendQuery=true&deeplink=okx://web3/wallet/walletConnect/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"dfw://\",\"scheme\":\"dfw://wc\",\"universal\":\"https://wallet.crypto.com/deeplink/wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\n};\n","import { GENERATED_WALLET_LINKS } from './wallet-links.generated';\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okex://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". */\n scheme?: string;\n /** Universal/applink incl. the `wc` path, preferred on mobile (OS falls back to the store). */\n universal?: string;\n /** App store links — used for the \"wallet not installed\" fallback. */\n store?: { ios?: string; android?: string };\n}\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = GENERATED_WALLET_LINKS;\n","import type { WalletLink } from './registry';\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const uaDataMobile =\n (navigator as { userAgentData?: { mobile?: boolean } }).userAgentData?.mobile ?? false;\n return /iPhone|iPad|iPod|Android/i.test(ua) || uaDataMobile;\n}\n\nfunction buildLink(base: string, uri: string): string {\n const sep = base.includes('?') ? '&' : '?';\n return `${base}${sep}uri=${encodeURIComponent(uri)}`;\n}\n\n/**\n * Fire from WITHIN a user gesture. Universal link first (OS shows the App Store\n * if the wallet isn't installed) opened in a throwaway context so the checkout\n * page is never replaced in history; custom scheme as the fallback.\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.universal) {\n openHref(buildLink(link.universal, uri), true);\n } else if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n }\n}\n\n/**\n * Bring the wallet app to the foreground (no WC URI) — for an approval the user\n * must return to the wallet for. Uses the bare `native` scheme; call within a gesture.\n */\nexport function openWalletApp(link: WalletLink): void {\n if (typeof document === 'undefined') return;\n if (!link.native) return;\n openHref(link.native, false);\n}\n\nfunction openHref(href: string, newContext: boolean): void {\n const a = document.createElement('a');\n a.href = href;\n if (newContext) {\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n }\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/** Resolves true if the page was backgrounded (wallet likely opened) within the window. */\nexport function detectAppOpen(timeoutMs: number): Promise<boolean> {\n if (typeof document === 'undefined') return Promise.resolve(false);\n return new Promise((resolve) => {\n let done = false;\n const finish = (opened: boolean) => {\n if (done) return;\n done = true;\n document.removeEventListener('visibilitychange', onVisibility);\n window.removeEventListener('pagehide', onPageHide);\n clearTimeout(timer);\n resolve(opened);\n };\n const onVisibility = () => {\n if (document.hidden) finish(true);\n };\n const onPageHide = () => finish(true);\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('pagehide', onPageHide);\n const timer = setTimeout(() => finish(false), timeoutMs);\n });\n}\n","import SignClient from '@walletconnect/sign-client';\nimport { getSdkError } from '@walletconnect/utils';\nimport type { SessionTypes } from '@walletconnect/types';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { CaipNamespace, Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\nimport { DEFAULT_WALLET_LINKS, type WalletLink } from './registry';\nimport { detectAppOpen, isMobile, openWallet, openWalletApp } from './deeplink';\n\nconst STORAGE_KEY = 'lydianconnect.wc.topics'; // walletId -> session topic\n\nexport interface WalletConnectOptions {\n projectId: string;\n relayUrl?: string;\n walletLinks?: Record<string, WalletLink>;\n openTimeoutMs?: number;\n}\n\nexport class WalletConnectConnector extends BaseConnector {\n readonly type = 'walletconnect' as const;\n readonly walletIds: readonly string[] = []; // claims any wallet not served by an SDK connector\n\n private client: SignClient | null = null;\n private links: Record<string, WalletLink>;\n private topics = new Map<string, string>();\n private warm: { topic: string; uri: string } | null = null;\n private warming: Promise<void> | null = null;\n\n constructor(\n private app: AppConfig,\n private options: WalletConnectOptions,\n ) {\n super();\n this.links = { ...DEFAULT_WALLET_LINKS, ...(options.walletLinks ?? {}) };\n }\n\n isAvailable(): boolean {\n return true;\n }\n\n private async getClient(): Promise<SignClient> {\n if (this.client) return this.client;\n const client = await SignClient.init({\n projectId: this.options.projectId,\n metadata: {\n name: this.app.appName,\n description: this.app.description ?? this.app.appName,\n url: deriveUrl(),\n icons: this.app.icon ? [this.app.icon] : [],\n },\n relayUrl: this.options.relayUrl,\n });\n\n client.on('session_delete', ({ topic }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n });\n\n client.on('session_event', ({ topic, params }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n const { name, data } = params.event;\n if (name === 'chainChanged') {\n const chainId =\n typeof data === 'string' && data.includes(':') ? data : `eip155:${String(data)}`;\n this.emit({ type: 'chainChanged', walletId, chainId });\n } else if (name === 'accountsChanged' && Array.isArray(data) && data[0]) {\n const account = String(data[0]).split(':').pop() ?? '';\n if (account) this.emit({ type: 'accountsChanged', walletId, account });\n }\n });\n\n this.client = client;\n this.load();\n return client;\n }\n\n /** Pre-create a pairing so connect() can deep-link synchronously within the gesture. */\n private async warmup(): Promise<void> {\n if (this.warm) return;\n if (this.warming) return this.warming;\n this.warming = (async () => {\n const client = await this.getClient();\n const { topic, uri } = await client.core.pairing.create();\n this.warm = { topic, uri };\n this.warming = null;\n })();\n return this.warming;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = this.tryReuse(client, req);\n if (reused) return reused;\n\n if (!this.warm) await this.warmup(); // cold path loses the gesture, but the QR/URI is still emitted\n const warm = this.warm;\n this.warm = null;\n if (!warm) throw new Error('Failed to create WalletConnect pairing');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri: warm.uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, warm.uri); // synchronous — preserves connect()'s click gesture\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened) this.emit({ type: 'wallet_open_failed', walletId: req.walletId, uri: warm.uri });\n });\n }\n }\n\n const { approval } = await client.connect({\n pairingTopic: warm.topic,\n optionalNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: warm.topic }).catch(() => {});\n });\n\n void this.warmup(); // re-arm for the next connection\n\n const connection = this.toConnection(client, req.walletId, session, req.namespace);\n this.topics.set(req.walletId, session.topic);\n this.persist();\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n const client = await this.getClient();\n const out: Connection[] = [];\n for (const [walletId, topic] of [...this.topics]) {\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(walletId);\n continue;\n }\n const ns = firstNamespace(session);\n if (ns) out.push(this.toConnection(client, walletId, session, ns));\n }\n this.persist();\n return out;\n }\n\n async reset(): Promise<void> {\n const client = this.client;\n if (client) {\n await Promise.allSettled(\n client.session\n .getAll()\n .map((s) => client.disconnect({ topic: s.topic, reason: getSdkError('USER_DISCONNECTED') })),\n );\n }\n this.topics.clear();\n this.persist();\n this.warm = null;\n }\n\n // --- helpers ---\n\n private tryReuse(client: SignClient, req: ConnectRequest): Connection | null {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\n return null;\n }\n const ns = session.namespaces[req.namespace.name];\n const wanted = req.namespace.value.chains?.[0];\n if (!ns || (wanted && !ns.chains?.includes(wanted))) return null;\n return this.toConnection(client, req.walletId, session, req.namespace);\n }\n\n private toConnection(\n client: SignClient,\n walletId: string,\n session: SessionTypes.Struct,\n namespace: CaipNamespace,\n ): Connection {\n const ns = session.namespaces[namespace.name];\n const account =\n (ns?.accounts ?? []).map((a) => a.split(':')[2]).find((a): a is string => !!a) ?? '';\n const chainId =\n ns?.chains?.[0] ??\n (ns?.accounts?.[0] ? ns.accounts[0].split(':').slice(0, 2).join(':') : `${namespace.name}:1`);\n const topic = session.topic;\n return {\n walletId,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n client.request<T>({\n topic,\n chainId,\n request: { method: args.method, params: args.params as never },\n }),\n openWallet: () => {\n if (!isMobile()) return;\n const link = this.links[walletId];\n if (link) openWalletApp(link);\n },\n disconnect: async () => {\n await client.disconnect({ topic, reason: getSdkError('USER_DISCONNECTED') }).catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n },\n };\n }\n\n private liveSession(client: SignClient, topic: string): SessionTypes.Struct | undefined {\n try {\n return client.session.get(topic);\n } catch {\n return undefined;\n }\n }\n\n private walletForTopic(topic: string): string | null {\n for (const [walletId, t] of this.topics) if (t === topic) return walletId;\n return null;\n }\n\n private persist(): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify([...this.topics]));\n } catch {\n /* SSR / no storage */\n }\n }\n\n private load(): void {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) this.topics = new Map(JSON.parse(raw) as Array<[string, string]>);\n } catch {\n /* SSR / no storage */\n }\n }\n}\n\nfunction firstNamespace(session: SessionTypes.Struct): CaipNamespace | null {\n const name = Object.keys(session.namespaces)[0];\n if (!name) return null;\n const v = session.namespaces[name];\n if (!v) return null;\n return { name, value: { chains: v.chains, methods: v.methods, events: v.events } };\n}\n\nfunction withSignal<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\n onAbort: () => void,\n): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) {\n onAbort();\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n return new Promise<T>((resolve, reject) => {\n const abortHandler = () => {\n onAbort();\n reject(new DOMException('Aborted', 'AbortError'));\n };\n signal.addEventListener('abort', abortHandler, { once: true });\n promise.then(\n (v) => {\n signal.removeEventListener('abort', abortHandler);\n resolve(v);\n },\n (e) => {\n signal.removeEventListener('abort', abortHandler);\n reject(e);\n },\n );\n });\n}\n","import { ConnectManager } from './manager';\nimport { buildNamespace } from './namespace';\nimport type { Connector } from './connector';\nimport type { AppConfig } from './app';\nimport type {\n ConnectInput,\n Connection,\n LydianConnectConfig,\n LydianConnectEventHandler,\n} from './types';\nimport { MetaMaskConnector } from '../connectors/metamask/connector';\nimport { CoinbaseConnector } from '../connectors/coinbase/connector';\nimport { WalletConnectConnector } from '../connectors/walletconnect/connector';\n\n/**\n * The library-owned connector set. Adding a new wallet SDK is a change HERE —\n * consumers get it on `npm update` with no code change. SDK code stays\n * code-split (lazy `import()` inside each connector), so registering a\n * connector adds ~nothing to the host app's initial bundle.\n */\nfunction createConnectors(config: LydianConnectConfig): Connector[] {\n const app: AppConfig = {\n appName: config.appName,\n icon: config.icon,\n description: config.description,\n };\n return [\n new MetaMaskConnector(app),\n new CoinbaseConnector(app),\n new WalletConnectConnector(app, { projectId: config.walletConnectProjectId }),\n ];\n}\n\n/**\n * The single surface the host app touches. Hand it a flat config; it owns the\n * connectors and routes each wallet to its native SDK (or the WalletConnect\n * fallback), returning a uniform {@link Connection} either way.\n */\nexport class LydianConnect {\n private manager: ConnectManager;\n\n constructor(config: LydianConnectConfig) {\n this.manager = new ConnectManager(createConnectors(config));\n }\n\n init(): Promise<void> {\n return this.manager.init();\n }\n\n async connect(input: ConnectInput): Promise<Connection> {\n if (input.chainId === undefined || input.chainId === null) {\n throw new Error('connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)');\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\n }\n\n restore(): Promise<Connection[]> {\n return this.manager.restore();\n }\n\n disconnect(walletId?: string): Promise<void> {\n return this.manager.disconnect(walletId);\n }\n\n reset(): Promise<void> {\n return this.manager.reset();\n }\n\n get(walletId: string): Connection | undefined {\n return this.manager.get(walletId);\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n return this.manager.on(handler);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/manager.ts","../src/core/namespace.ts","../src/core/connector.ts","../src/core/app.ts","../src/connectors/metamask/connector.ts","../src/connectors/coinbase/connector.ts","../src/connectors/walletconnect/wallet-links.ts","../src/connectors/walletconnect/registry.ts","../src/connectors/walletconnect/deeplink.ts","../src/connectors/walletconnect/connector.ts","../src/core/lydian-connect.ts"],"names":["WALLET_ID","toCaip"],"mappings":"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","file":"index.js","sourcesContent":["import type { Connector, ConnectRequest } from './connector';\nimport type { Connection, LydianConnectEvent, LydianConnectEventHandler } from './types';\n\n/**\n * Routing engine: takes a flat list of connectors, auto-detects the fallback\n * (the connector with no claimed walletIds), routes each walletId to its\n * connector, and forwards events. Internal — the host app uses `LydianConnect`.\n */\nexport class ConnectManager {\n private byWallet = new Map<string, Connector>();\n private fallback: Connector;\n private all: Connector[];\n private connections = new Map<string, Connection>();\n private handlers = new Set<LydianConnectEventHandler>();\n private unsubs: Array<() => void> = [];\n private started = false;\n\n constructor(connectors: Connector[]) {\n const fallbacks = connectors.filter((c) => c.walletIds.length === 0);\n if (fallbacks.length !== 1) {\n throw new Error(\n `LydianConnect requires exactly one fallback connector (empty walletIds); found ${fallbacks.length}`,\n );\n }\n this.fallback = fallbacks[0]!;\n this.all = connectors;\n for (const connector of connectors) {\n for (const id of connector.walletIds) this.byWallet.set(id, connector);\n }\n }\n\n /** Wire connector event forwarding, once. */\n async init(): Promise<void> {\n if (this.started) return;\n this.started = true;\n for (const connector of this.all) {\n this.unsubs.push(connector.on((event) => this.handle(event)));\n }\n }\n\n /** SDK connector if one claims this walletId, else the fallback. The host app is oblivious. */\n private resolve(walletId: string): Connector {\n return this.byWallet.get(walletId) ?? this.fallback;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n if (!this.started) await this.init();\n const connection = await this.resolve(req.walletId).connect(req);\n this.connections.set(req.walletId, connection);\n this.emit({ type: 'connect', walletId: req.walletId, connection });\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n if (!this.started) await this.init();\n const restored: Connection[] = [];\n for (const connector of this.all) {\n const conns = await connector.restore().catch(() => [] as Connection[]);\n for (const conn of conns) {\n this.connections.set(conn.walletId, conn);\n restored.push(conn);\n }\n }\n return restored;\n }\n\n get(walletId: string): Connection | undefined {\n return this.connections.get(walletId);\n }\n\n async disconnect(walletId?: string): Promise<void> {\n if (walletId) {\n await this.connections.get(walletId)?.disconnect().catch(() => {});\n this.connections.delete(walletId);\n return;\n }\n await Promise.allSettled([...this.connections.values()].map((c) => c.disconnect()));\n this.connections.clear();\n }\n\n async reset(): Promise<void> {\n await this.disconnect();\n await Promise.allSettled(this.all.map((c) => c.reset()));\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n private handle(event: LydianConnectEvent): void {\n if (event.type === 'disconnect') this.connections.delete(event.walletId);\n this.emit(event);\n }\n\n private emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","import type { CaipNamespace } from './types';\n\n// Sensible defaults for an EVM payment flow. Internalized so the host app\n// never hand-builds a namespace — it only chooses a chain.\nconst DEFAULT_EVM_METHODS = [\n 'eth_sendTransaction',\n 'personal_sign',\n 'eth_signTypedData_v4',\n 'wallet_switchEthereumChain',\n];\nconst DEFAULT_EVM_EVENTS = ['chainChanged', 'accountsChanged'];\n\n/**\n * Build a CAIP namespace from a chain id.\n * EVM-only for now: a number maps to `eip155:<n>`, and a CAIP-2 string must be\n * `eip155:<reference>`. Non-EVM namespaces (e.g. `solana:…`) would branch here\n * with their own methods/events when that support is added; until then we throw\n * rather than silently apply EVM defaults to a chain that can't use them.\n */\nexport function buildNamespace(chainId: number | string): CaipNamespace {\n const caip = typeof chainId === 'number' ? `eip155:${chainId}` : chainId;\n const [name, reference] = caip.split(':');\n if (name !== 'eip155' || !reference || !/^\\d+$/.test(reference) || Number(reference) <= 0) {\n throw new Error(\n `Unsupported chain \"${caip}\". lydianconnect is EVM-only for now — pass a positive number or an \"eip155:<id>\" string.`,\n );\n }\n return {\n name,\n value: { chains: [caip], methods: DEFAULT_EVM_METHODS, events: DEFAULT_EVM_EVENTS },\n };\n}\n","import type {\n CaipNamespace,\n Connection,\n ConnectorType,\n LydianConnectEvent,\n LydianConnectEventHandler,\n} from './types';\n\nexport interface ConnectRequest {\n walletId: string;\n namespace: CaipNamespace;\n /** Cancel a pending connection (replaces the host app's manual cancel plumbing). */\n signal?: AbortSignal;\n}\n\n/**\n * Internal contract every connector implements. The host app never sees this —\n * it only ever touches {@link LydianConnect} and the {@link Connection} handle.\n */\nexport interface Connector {\n readonly type: ConnectorType;\n /**\n * Wallet ids this connector natively serves. The WalletConnect fallback\n * returns an empty list and claims any wallet not served by another connector.\n */\n readonly walletIds: readonly string[];\n isAvailable(walletId: string): boolean | Promise<boolean>;\n connect(req: ConnectRequest): Promise<Connection>;\n /** Rebuild Connections for still-live sessions — the reconnect-on-reload case. */\n restore(): Promise<Connection[]>;\n /** Tear down everything this connector owns. */\n reset(): Promise<void>;\n on(handler: LydianConnectEventHandler): () => void;\n}\n\nexport abstract class BaseConnector implements Connector {\n abstract readonly type: ConnectorType;\n readonly walletIds: readonly string[] = [];\n\n private handlers = new Set<LydianConnectEventHandler>();\n\n abstract isAvailable(walletId: string): boolean | Promise<boolean>;\n abstract connect(req: ConnectRequest): Promise<Connection>;\n\n async restore(): Promise<Connection[]> {\n return [];\n }\n\n async reset(): Promise<void> {\n /* no-op by default */\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n this.handlers.add(handler);\n return () => this.handlers.delete(handler);\n }\n\n protected emit(event: LydianConnectEvent): void {\n for (const handler of this.handlers) handler(event);\n }\n}\n","/** Shared app identity passed to every connector; mapped to each SDK's own shape internally. */\nexport interface AppConfig {\n /** Display name shown in the wallet's connect prompt. */\n appName: string;\n /** Optional icon shown in the wallet's connect prompt. */\n icon?: string;\n /** Optional description; defaults to appName. */\n description?: string;\n}\n\n/**\n * The dapp URL, derived from the page origin at connect-time (always client-side).\n * Returns '' during SSR — connectors only read this when initializing their SDK,\n * which never happens on the server.\n */\nexport function deriveUrl(): string {\n return typeof window !== 'undefined' ? window.location.origin : '';\n}\n","import type { MetaMaskSDK as MetaMaskSDKType, MetaMaskSDKOptions } from '@metamask/sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\n\n/** The provider type MetaMaskSDK.getProvider() returns, without depending on a named export. */\ntype MetaMaskProvider = NonNullable<ReturnType<MetaMaskSDKType['getProvider']>>;\n\nconst WALLET_ID = 'metamask';\n\nexport class MetaMaskConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private sdk: MetaMaskSDKType | null = null;\n private provider: MetaMaskProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers desktop (extension) and mobile (deep-link) itself\n }\n\n private async getProvider(): Promise<MetaMaskProvider> {\n if (this.provider) return this.provider;\n const { MetaMaskSDK } = await import('@metamask/sdk'); // value import — code-split, loaded on demand\n const dappMetadata: MetaMaskSDKOptions['dappMetadata'] = {\n name: this.app.appName,\n url: deriveUrl(),\n ...(this.app.icon ? { iconUrl: this.app.icon } : {}),\n };\n const sdk = new MetaMaskSDK({ dappMetadata });\n await sdk.init();\n const provider = sdk.getProvider();\n if (!provider) throw new Error('MetaMask provider unavailable');\n this.sdk = sdk;\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: MetaMaskProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider();\n const accounts = await provider.request<string[]>({ method: 'eth_requestAccounts' });\n const account = accounts?.[0];\n if (!account) throw new Error('MetaMask returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await provider.request<string>({ method: 'eth_chainId' }));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await provider.request<string[]>({ method: 'eth_accounts' }).catch(() => []);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(\n await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x1'),\n );\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n }\n\n /** Best-effort switch to the requested chain; leaves the wallet as-is if it's unknown to it. */\n private async ensureChain(provider: MetaMaskProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0]; // \"eip155:137\"\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await provider.request<string>({ method: 'eth_chainId' }).catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await provider\n .request({\n method: 'wallet_switchEthereumChain',\n params: [{ chainId: `0x${wantedNum.toString(16)}` }],\n })\n .catch(() => {\n /* chain not added to the wallet — the caller's chainChanged will reflect reality */\n });\n }\n\n private toConnection(provider: MetaMaskProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: async <T>(args: { method: string; params?: unknown }) =>\n (await provider.request<T>({ method: args.method, params: args.params as never })) as T,\n openWallet: () => {}, // MetaMask SDK foregrounds the wallet on request\n disconnect: async () => {\n await this.sdk?.terminate();\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n","import type { CoinbaseWalletSDK as CoinbaseWalletSDKType } from '@coinbase/wallet-sdk';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { Connection } from '../../core/types';\nimport type { AppConfig } from '../../core/app';\n\ntype CoinbaseProvider = NonNullable<ReturnType<CoinbaseWalletSDKType['makeWeb3Provider']>>;\ntype RequestArgs = Parameters<CoinbaseProvider['request']>[0];\n\n/** Coinbase v4's provider.request is non-generic and returns unknown; wrap + cast. */\nfunction rpc<T>(provider: CoinbaseProvider, method: string, params?: unknown): Promise<T> {\n return provider.request({ method, params } as unknown as RequestArgs) as Promise<T>;\n}\n\nconst WALLET_ID = 'coinbase';\n\nexport class CoinbaseConnector extends BaseConnector {\n readonly type = 'sdk' as const;\n readonly walletIds = [WALLET_ID] as const;\n\n private provider: CoinbaseProvider | null = null;\n private listenersBound = false;\n\n constructor(private app: AppConfig) {\n super();\n }\n\n isAvailable(): boolean {\n return true; // SDK covers extension + mobile deep-link itself\n }\n\n private async getProvider(appChainIds?: number[]): Promise<CoinbaseProvider> {\n if (this.provider) return this.provider;\n const { CoinbaseWalletSDK } = await import('@coinbase/wallet-sdk'); // lazy — code-split\n const sdk = new CoinbaseWalletSDK({\n appName: this.app.appName,\n appLogoUrl: this.app.icon,\n appChainIds, // one-time SDK-init hint; ensureChain enforces the actual chain per connect\n });\n const provider = sdk.makeWeb3Provider();\n this.provider = provider;\n this.bindEvents(provider);\n return provider;\n }\n\n private bindEvents(provider: CoinbaseProvider): void {\n if (this.listenersBound) return;\n this.listenersBound = true;\n provider.on('chainChanged', (hex) => {\n this.emit({ type: 'chainChanged', walletId: WALLET_ID, chainId: toCaip(String(hex)) });\n });\n provider.on('accountsChanged', (accounts) => {\n const account = Array.isArray(accounts) ? (accounts[0] as string | undefined) : undefined;\n if (account) this.emit({ type: 'accountsChanged', walletId: WALLET_ID, account });\n else this.emit({ type: 'disconnect', walletId: WALLET_ID });\n });\n provider.on('disconnect', () => this.emit({ type: 'disconnect', walletId: WALLET_ID }));\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const provider = await this.getProvider(evmChainIds(req));\n const accounts = await rpc<string[]>(provider, 'eth_requestAccounts');\n const account = accounts?.[0];\n if (!account) throw new Error('Coinbase Wallet returned no account');\n await this.ensureChain(provider, req);\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId'));\n return this.toConnection(provider, account, chainId);\n }\n\n async restore(): Promise<Connection[]> {\n const provider = await this.getProvider().catch(() => null);\n if (!provider) return [];\n const accounts = await rpc<string[]>(provider, 'eth_accounts').catch(() => [] as string[]);\n const account = accounts?.[0];\n if (!account) return [];\n const chainId = toCaip(await rpc<string>(provider, 'eth_chainId').catch(() => '0x1'));\n return [this.toConnection(provider, account, chainId)];\n }\n\n async reset(): Promise<void> {\n await this.provider?.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n }\n\n private async ensureChain(provider: CoinbaseProvider, req: ConnectRequest): Promise<void> {\n const wanted = req.namespace.value.chains?.[0];\n const wantedNum = wanted ? Number(wanted.split(':')[1]) : NaN;\n if (!Number.isFinite(wantedNum) || wantedNum <= 0) return;\n const current = parseInt(\n (await rpc<string>(provider, 'eth_chainId').catch(() => '0x0')) ?? '0x0',\n 16,\n );\n if (current === wantedNum) return;\n await rpc(provider, 'wallet_switchEthereumChain', [{ chainId: `0x${wantedNum.toString(16)}` }]).catch(\n () => {},\n );\n }\n\n private toConnection(provider: CoinbaseProvider, account: string, chainId: string): Connection {\n return {\n walletId: WALLET_ID,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n rpc<T>(provider, args.method, args.params),\n openWallet: () => {}, // Coinbase SDK foregrounds the wallet on request\n disconnect: async () => {\n await provider.disconnect().catch(() => {});\n this.provider = null;\n this.listenersBound = false;\n this.emit({ type: 'disconnect', walletId: WALLET_ID });\n },\n };\n }\n}\n\nfunction toCaip(hexChainId: string | null | undefined): string {\n if (!hexChainId) return 'eip155:1';\n const num = hexChainId.startsWith('0x') ? parseInt(hexChainId, 16) : Number(hexChainId);\n return `eip155:${Number.isFinite(num) ? num : 1}`;\n}\n\n/** The numeric EVM chain id the connect targets, for Coinbase's appChainIds hint. */\nfunction evmChainIds(req: ConnectRequest): number[] | undefined {\n const wanted = req.namespace.value.chains?.[0];\n const n = wanted ? Number(wanted.split(':')[1]) : NaN;\n return Number.isFinite(n) && n > 0 ? [n] : undefined;\n}\n","// Wallet deep-link registry — hand-maintained.\n// Originally seeded from the WalletConnect explorer API; edit entries directly now.\n// Per entry: native = bare app scheme (foreground only); scheme = WC connect deep\n// link (we append `?uri=`); universal = fallback only; store = not-installed links.\nimport type { WalletLink } from './registry';\n\nexport const WALLET_LINKS: Record<string, WalletLink> = {\n metamask: {\"native\":\"metamask://\",\"scheme\":\"metamask://wc\",\"universal\":\"https://metamask.app.link/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/metamask/id1438144202\",\"android\":\"https://play.google.com/store/apps/details?id=io.metamask\"}},\n trust: {\"native\":\"trust://\",\"scheme\":\"trust://wc\",\"universal\":\"https://link.trustwallet.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1288339409\",\"android\":\"https://play.google.com/store/apps/details?id=com.wallet.crypto.trustapp\"}},\n rainbow: {\"native\":\"rainbow://\",\"scheme\":\"rainbow://wc\",\"universal\":\"https://rnbwapp.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/apple-store/id1457119021?pt=119997837&ct=wc&mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=me.rainbow&referrer=utm_source%3Dwc%26utm_medium%3Dconnector%26utm_campaign%3Dwc\"}},\n coinbase: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/base-formerly-coinbase-wallet/id1278383455\"}},\n zerion: {\"native\":\"zerion://\",\"scheme\":\"zerion://wc\",\"universal\":\"https://wallet.zerion.io/wc/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/id1456732565\",\"android\":\"https://play.google.com/store/apps/details?id=io.zerion.android&hl=en&gl=US\"}},\n tokenpocket: {\"native\":\"tpoutside://\",\"scheme\":\"tpoutside://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/tp-wallet/id6444625622?l=en\",\"android\":\"https://play.google.com/store/apps/details?id=vip.mytokenpocket\"}},\n blockchaincom: {\"native\":\"blockchain-wallet://\",\"scheme\":\"blockchain-wallet://wc\",\"universal\":\"https://login.blockchain.com/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/blockchain-bitcoin-wallet/id493253309\",\"android\":\"https://play.google.com/store/apps/details?id=piuk.blockchain.android\"}},\n exodus: {\"native\":\"exodus://\",\"scheme\":\"exodus://wc\",\"universal\":\"https://exodus.com/m/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/exodus-crypto-bitcoin-wallet/id1414384820\",\"android\":\"https://play.google.com/store/apps/details?id=exodusmovement.exodus&hl=en&gl=US\"}},\n phantom: {\"store\":{\"ios\":\"https://apps.apple.com/us/app/phantom-crypto-wallet/id1598432977\",\"android\":\"https://play.google.com/store/apps/details?id=app.phantom&hl=en\"}},\n okx: {\"native\":\"okxwallet://main\",\"scheme\":\"okxwallet://main/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/okx-buy-bitcoin-eth-crypto/id1327268470\",\"android\":\"https://play.google.com/store/apps/details?id=com.okinc.okex.gp\"}},\n cryptocom: {\"native\":\"cryptowallet://\",\"scheme\":\"cryptowallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/US/app/id1512048310?mt=8\",\"android\":\"https://play.google.com/store/apps/details?id=com.defi.wallet\"}},\n argent: {\"native\":\"argent://app/\",\"scheme\":\"argent://app/wc\",\"universal\":\"https://www.argent.xyz/app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/argent-defi-in-a-tap/id1358741926\",\"android\":\"https://play.google.com/store/apps/details?id=im.argent.contractwalletclient&hl=en&gl=US&pli=1\"}},\n safepal: {\"native\":\"safepalwallet://\",\"scheme\":\"safepalwallet://wc\",\"universal\":\"https://link.safepal.io/wc\",\"store\":{\"ios\":\"https://apps.apple.com/app/safepal-wallet/id1548297139\",\"android\":\"https://play.google.com/store/apps/details?id=io.safepal.wallet\"}},\n imtoken: {\"native\":\"imtokenv2://\",\"scheme\":\"imtokenv2://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/imtoken2/id1384798940\",\"android\":\"https://play.google.com/store/apps/details?id=im.token.app\"}},\n ronin: {\"native\":\"roninwallet://\",\"scheme\":\"roninwallet://wc\",\"universal\":\"https://wallet.roninchain.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/ronin-wallet/id1592675001\",\"android\":\"https://play.google.com/store/apps/details?id=com.skymavis.genesis\"}},\n coin98: {\"native\":\"coin98://\",\"scheme\":\"coin98://wc\",\"universal\":\"https://coin98.com/wc\",\"store\":{\"ios\":\"https://apps.apple.com/vn/app/coin98-wallet/id1561969966\",\"android\":\"https://play.google.com/store/apps/details?id=coin98.crypto.finance.media&hl=vi&gl=US\"}},\n bitkeep: {\"native\":\"bitkeep://\",\"scheme\":\"bitkeep://wc\",\"universal\":\"https://bkapp.vip/wc\",\"store\":{\"ios\":\"https://web3.bitget.com/en/wallet-download?type=0\",\"android\":\"https://web3.bitget.com/en/wallet-download?type=0\"}},\n \"1inch\": {\"native\":\"oneinch://open/nobodywilleveruseit\",\"scheme\":\"oneinch://open/nobodywilleveruseit/wc\",\"universal\":\"https://wallet.1inch.io/app/nobodywilleveruseit/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/1inch-defi-wallet/id1546049391\",\"android\":\"https://play.google.com/store/apps/details?id=io.oneinch.android\"}},\n ledgerlive: {\"native\":\"ledgerlive://\",\"scheme\":\"ledgerlive://wc\",\"store\":{\"ios\":\"https://itunes.apple.com/app/id1361671700\",\"android\":\"https://play.google.com/store/apps/details?id=com.ledger.live\"}},\n atomic: {\"native\":\"atomicwallet://\",\"scheme\":\"atomicwallet://wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/atomic-wallet/id1478257827\",\"android\":\"https://play.google.com/store/apps/details?id=io.atomicwallet\"}},\n alpha: {\"native\":\"awallet://\",\"scheme\":\"awallet://wc\",\"universal\":\"https://aw.app/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/alphawallet-eth-wallet/id1358230430\",\"android\":\"https://play.google.com/store/apps/details?id=io.stormbird.wallet\"}},\n math: {\"native\":\"mathwallet://\",\"scheme\":\"mathwallet://wc\",\"universal\":\"https://www.mathwallet.org/wc\",\"store\":{\"ios\":\"https://apps.apple.com/us/app/mathwallet5/id1582612388\",\"android\":\"https://play.google.com/store/apps/details?id=com.mathwallet.android\"}},\n bitpay: {\"native\":\"bitpay://\",\"scheme\":\"bitpay://wc\",\"universal\":\"https://link.bitpay.com/wc\",\"store\":{\"ios\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\",\"android\":\"https://bitpay.onelink.me/Cenw/ejjaw7bs\"}},\n};\n","import { WALLET_LINKS } from './wallet-links';\n\nexport interface WalletLink {\n /** App scheme used to foreground the wallet — without the `wc` suffix; may include a path (e.g. \"okxwallet://main\"). */\n native?: string;\n /** Custom scheme deep link incl. the `wc` path; we append `?uri=`. e.g. \"metamask://wc\". Preferred on mobile (same-tab). */\n scheme?: string;\n /** Universal/applink incl. the `wc` path. Fallback only — used when no `scheme` exists. */\n universal?: string;\n /** App store links — used for the \"wallet not installed\" fallback. */\n store?: { ios?: string; android?: string };\n}\n\nexport const DEFAULT_WALLET_LINKS: Record<string, WalletLink> = WALLET_LINKS;\n","import type { WalletLink } from './registry';\n\nexport function isMobile(): boolean {\n if (typeof navigator === 'undefined') return false;\n const ua = navigator.userAgent || '';\n const uaDataMobile =\n (navigator as { userAgentData?: { mobile?: boolean } }).userAgentData?.mobile ?? false;\n return /iPhone|iPad|iPod|Android/i.test(ua) || uaDataMobile;\n}\n\nfunction buildLink(base: string, uri: string): string {\n const sep = base.includes('?') ? '&' : '?';\n return `${base}${sep}uri=${encodeURIComponent(uri)}`;\n}\n\n/**\n * Open the wallet for a WalletConnect pairing on mobile. Custom scheme first, in\n * the SAME TAB — that reliably foregrounds an installed app and, unlike a\n * _blank/popup navigation, is NOT suppressed once the click gesture has been lost\n * (which it has by the time connect() reaches here, after the async pairing setup).\n * Universal link is only a fallback for the rare wallet with no custom scheme.\n * The not-installed case is handled by the connector via detectAppOpen().\n */\nexport function openWallet(link: WalletLink, uri: string): void {\n if (typeof document === 'undefined') return;\n if (link.scheme) {\n openHref(buildLink(link.scheme, uri), false);\n } else if (link.universal) {\n openHref(buildLink(link.universal, uri), false);\n }\n}\n\n/**\n * Bring the wallet app to the foreground (no WC URI) — for an approval the user\n * must return to the wallet for. Uses the bare `native` scheme; call within a gesture.\n */\nexport function openWalletApp(link: WalletLink): void {\n if (typeof document === 'undefined') return;\n if (!link.native) return;\n openHref(link.native, false);\n}\n\nfunction openHref(href: string, newContext: boolean): void {\n const a = document.createElement('a');\n a.href = href;\n if (newContext) {\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n }\n a.style.display = 'none';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n}\n\n/** Resolves true if the page was backgrounded (wallet likely opened) within the window. */\nexport function detectAppOpen(timeoutMs: number): Promise<boolean> {\n if (typeof document === 'undefined') return Promise.resolve(false);\n return new Promise((resolve) => {\n let done = false;\n const finish = (opened: boolean) => {\n if (done) return;\n done = true;\n document.removeEventListener('visibilitychange', onVisibility);\n window.removeEventListener('pagehide', onPageHide);\n clearTimeout(timer);\n resolve(opened);\n };\n const onVisibility = () => {\n if (document.hidden) finish(true);\n };\n const onPageHide = () => finish(true);\n document.addEventListener('visibilitychange', onVisibility);\n window.addEventListener('pagehide', onPageHide);\n const timer = setTimeout(() => finish(false), timeoutMs);\n });\n}\n","import SignClient from '@walletconnect/sign-client';\nimport { getSdkError, parseUri } from '@walletconnect/utils';\nimport type { SessionTypes } from '@walletconnect/types';\nimport { BaseConnector, type ConnectRequest } from '../../core/connector';\nimport type { CaipNamespace, Connection } from '../../core/types';\nimport { type AppConfig, deriveUrl } from '../../core/app';\nimport { DEFAULT_WALLET_LINKS, type WalletLink } from './registry';\nimport { detectAppOpen, isMobile, openWallet, openWalletApp } from './deeplink';\n\nconst STORAGE_KEY = 'lydianconnect.wc.topics'; // walletId -> session topic\n\nexport interface WalletConnectOptions {\n projectId: string;\n relayUrl?: string;\n walletLinks?: Record<string, WalletLink>;\n openTimeoutMs?: number;\n}\n\nexport class WalletConnectConnector extends BaseConnector {\n readonly type = 'walletconnect' as const;\n readonly walletIds: readonly string[] = []; // claims any wallet not served by an SDK connector\n\n private client: SignClient | null = null;\n private links: Record<string, WalletLink>;\n private topics = new Map<string, string>();\n\n constructor(\n private app: AppConfig,\n private options: WalletConnectOptions,\n ) {\n super();\n this.links = { ...DEFAULT_WALLET_LINKS, ...(options.walletLinks ?? {}) };\n }\n\n isAvailable(): boolean {\n return true;\n }\n\n private async getClient(): Promise<SignClient> {\n if (this.client) return this.client;\n const client = await SignClient.init({\n projectId: this.options.projectId,\n metadata: {\n name: this.app.appName,\n description: this.app.description ?? this.app.appName,\n url: deriveUrl(),\n icons: this.app.icon ? [this.app.icon] : [],\n },\n relayUrl: this.options.relayUrl,\n });\n\n client.on('session_delete', ({ topic }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n });\n\n client.on('session_event', ({ topic, params }) => {\n const walletId = this.walletForTopic(topic);\n if (!walletId) return;\n const { name, data } = params.event;\n if (name === 'chainChanged') {\n const chainId =\n typeof data === 'string' && data.includes(':') ? data : `eip155:${String(data)}`;\n this.emit({ type: 'chainChanged', walletId, chainId });\n } else if (name === 'accountsChanged' && Array.isArray(data) && data[0]) {\n const account = String(data[0]).split(':').pop() ?? '';\n if (account) this.emit({ type: 'accountsChanged', walletId, account });\n }\n });\n\n this.client = client;\n this.load();\n return client;\n }\n\n async connect(req: ConnectRequest): Promise<Connection> {\n const client = await this.getClient();\n\n const reused = this.tryReuse(client, req);\n if (reused) return reused;\n\n const { uri, approval } = await client.connect({\n requiredNamespaces: { [req.namespace.name]: req.namespace.value },\n });\n if (!uri) throw new Error('WalletConnect did not return a pairing URI');\n\n this.emit({ type: 'display_uri', walletId: req.walletId, uri });\n\n if (isMobile()) {\n const link = this.links[req.walletId];\n if (link) {\n openWallet(link, uri);\n void detectAppOpen(this.options.openTimeoutMs ?? 2000).then((opened) => {\n if (!opened)\n this.emit({\n type: 'wallet_open_failed',\n walletId: req.walletId,\n uri,\n store: link.store,\n });\n });\n }\n }\n\n const pairingTopic = parseUri(uri).topic;\n const session = await withSignal(approval(), req.signal, () => {\n void client.core.pairing.disconnect({ topic: pairingTopic }).catch(() => {});\n });\n\n const connection = this.toConnection(client, req.walletId, session, req.namespace);\n this.topics.set(req.walletId, session.topic);\n this.persist();\n return connection;\n }\n\n async restore(): Promise<Connection[]> {\n const client = await this.getClient();\n const out: Connection[] = [];\n for (const [walletId, topic] of [...this.topics]) {\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(walletId);\n continue;\n }\n const ns = firstNamespace(session);\n if (ns) out.push(this.toConnection(client, walletId, session, ns));\n }\n this.persist();\n return out;\n }\n\n async reset(): Promise<void> {\n const client = this.client;\n if (client) {\n await Promise.allSettled(\n client.session\n .getAll()\n .map((s) => client.disconnect({ topic: s.topic, reason: getSdkError('USER_DISCONNECTED') })),\n );\n }\n this.topics.clear();\n this.persist();\n }\n\n // --- helpers ---\n\n private tryReuse(client: SignClient, req: ConnectRequest): Connection | null {\n const topic = this.topics.get(req.walletId);\n if (!topic) return null;\n const session = this.liveSession(client, topic);\n if (!session) {\n this.topics.delete(req.walletId);\n return null;\n }\n const ns = session.namespaces[req.namespace.name];\n const wanted = req.namespace.value.chains?.[0];\n if (!ns || (wanted && !ns.chains?.includes(wanted))) return null;\n return this.toConnection(client, req.walletId, session, req.namespace);\n }\n\n private toConnection(\n client: SignClient,\n walletId: string,\n session: SessionTypes.Struct,\n namespace: CaipNamespace,\n ): Connection {\n const ns = session.namespaces[namespace.name];\n const account =\n (ns?.accounts ?? []).map((a) => a.split(':')[2]).find((a): a is string => !!a) ?? '';\n const chainId =\n ns?.chains?.[0] ??\n (ns?.accounts?.[0] ? ns.accounts[0].split(':').slice(0, 2).join(':') : `${namespace.name}:1`);\n const topic = session.topic;\n return {\n walletId,\n account,\n chainId,\n request: <T>(args: { method: string; params?: unknown }) =>\n client.request<T>({\n topic,\n chainId,\n request: { method: args.method, params: args.params as never },\n }),\n openWallet: () => {\n if (!isMobile()) return;\n const link = this.links[walletId];\n if (link) openWalletApp(link);\n },\n disconnect: async () => {\n await client.disconnect({ topic, reason: getSdkError('USER_DISCONNECTED') }).catch(() => {});\n this.topics.delete(walletId);\n this.persist();\n this.emit({ type: 'disconnect', walletId });\n },\n };\n }\n\n private liveSession(client: SignClient, topic: string): SessionTypes.Struct | undefined {\n try {\n return client.session.get(topic);\n } catch {\n return undefined;\n }\n }\n\n private walletForTopic(topic: string): string | null {\n for (const [walletId, t] of this.topics) if (t === topic) return walletId;\n return null;\n }\n\n private persist(): void {\n try {\n localStorage.setItem(STORAGE_KEY, JSON.stringify([...this.topics]));\n } catch {\n /* SSR / no storage */\n }\n }\n\n private load(): void {\n try {\n const raw = localStorage.getItem(STORAGE_KEY);\n if (raw) this.topics = new Map(JSON.parse(raw) as Array<[string, string]>);\n } catch {\n /* SSR / no storage */\n }\n }\n}\n\nfunction firstNamespace(session: SessionTypes.Struct): CaipNamespace | null {\n const name = Object.keys(session.namespaces)[0];\n if (!name) return null;\n const v = session.namespaces[name];\n if (!v) return null;\n return { name, value: { chains: v.chains, methods: v.methods, events: v.events } };\n}\n\nfunction withSignal<T>(\n promise: Promise<T>,\n signal: AbortSignal | undefined,\n onAbort: () => void,\n): Promise<T> {\n if (!signal) return promise;\n if (signal.aborted) {\n onAbort();\n return Promise.reject(new DOMException('Aborted', 'AbortError'));\n }\n return new Promise<T>((resolve, reject) => {\n const abortHandler = () => {\n onAbort();\n reject(new DOMException('Aborted', 'AbortError'));\n };\n signal.addEventListener('abort', abortHandler, { once: true });\n promise.then(\n (v) => {\n signal.removeEventListener('abort', abortHandler);\n resolve(v);\n },\n (e) => {\n signal.removeEventListener('abort', abortHandler);\n reject(e);\n },\n );\n });\n}\n","import { ConnectManager } from './manager';\nimport { buildNamespace } from './namespace';\nimport type { Connector } from './connector';\nimport type { AppConfig } from './app';\nimport type {\n ConnectInput,\n Connection,\n LydianConnectConfig,\n LydianConnectEventHandler,\n} from './types';\nimport { MetaMaskConnector } from '../connectors/metamask/connector';\nimport { CoinbaseConnector } from '../connectors/coinbase/connector';\nimport { WalletConnectConnector } from '../connectors/walletconnect/connector';\n\n/**\n * The library-owned connector set. Adding a new wallet SDK is a change HERE —\n * consumers get it on `npm update` with no code change. SDK code stays\n * code-split (lazy `import()` inside each connector), so registering a\n * connector adds ~nothing to the host app's initial bundle.\n */\nfunction createConnectors(config: LydianConnectConfig): Connector[] {\n const app: AppConfig = {\n appName: config.appName,\n icon: config.icon,\n description: config.description,\n };\n return [\n new MetaMaskConnector(app),\n new CoinbaseConnector(app),\n new WalletConnectConnector(app, { projectId: config.walletConnectProjectId }),\n ];\n}\n\n/**\n * The single surface the host app touches. Hand it a flat config; it owns the\n * connectors and routes each wallet to its native SDK (or the WalletConnect\n * fallback), returning a uniform {@link Connection} either way.\n */\nexport class LydianConnect {\n private manager: ConnectManager;\n\n constructor(config: LydianConnectConfig) {\n this.manager = new ConnectManager(createConnectors(config));\n }\n\n init(): Promise<void> {\n return this.manager.init();\n }\n\n async connect(input: ConnectInput): Promise<Connection> {\n if (input.chainId === undefined || input.chainId === null) {\n throw new Error('connect() requires a chainId (a number like 137 or an \"eip155:<id>\" string)');\n }\n return this.manager.connect({\n walletId: input.walletId,\n namespace: buildNamespace(input.chainId),\n signal: input.signal,\n });\n }\n\n restore(): Promise<Connection[]> {\n return this.manager.restore();\n }\n\n disconnect(walletId?: string): Promise<void> {\n return this.manager.disconnect(walletId);\n }\n\n reset(): Promise<void> {\n return this.manager.reset();\n }\n\n get(walletId: string): Connection | undefined {\n return this.manager.get(walletId);\n }\n\n on(handler: LydianConnectEventHandler): () => void {\n return this.manager.on(handler);\n }\n}\n"]}
|
package/package.json
CHANGED